{
    "steps": [
      {
        "id": "commercial_data",
        "title": "1. Commercial Data",
        "order": 0,
        "group_ids": ["general_info", "technical_family"]
      },
      {
        "id": "general_technical",
        "title": "2. General Technical Input",
        "order": 1,
        "group_ids": ["technical_unit_basic"]
      },
      {
        "id": "structural_configuration",
        "title": "3. Structural Configuration",
        "order": 2,
        "group_ids": ["structural_config"]
      },
      {
        "id": "component_type",
        "title": "4. Component Type Selection",
        "order": 3,
        "group_ids": ["component_type_selection"]
      },
      {
        "id": "component_engineering",
        "title": "5. Component-Level Engineering",
        "order": 4,
        "group_ids": ["component_details", "wc_operating_conditions", "wc_geometry", "wc_circuits", "wc_connections", "wc_materials_coating", "water_coil_group", "wc_results_codes", "wc_additional_notes", "dx_operating_conditions", "dx_refrigerant_data", "dx_geometry", "dx_circuits_and_expansion", "dx_connections", "dx_materials_coating", "dx_coil_group", "dx_results_codes", "dx_additional_notes", "filter_airflow", "filter_configuration", "filter_stage_1", "filter_stage_2", "filter_stage_3", "filter_pressure_summary", "filter_construction", "filter_results_and_code", "filter_group", "filter_additional_notes", "fan_airflow_duty", "fan_selection", "fan_motor_and_drive", "fan_sound_data", "fan_construction", "fan_results_and_code", "fan_group", "fan_additional_notes"]
      }
    ],
    "groups": [
      {
        "id": "general_info",
        "title": "General Information",
        "description": "Basic project and order information",
        "order": 0,
        "fields": [
          {
            "id": "customer_name",
            "name": "customer_name",
            "label": "Customer",
            "type": "text",
            "required": true,
            "order": 1
          },
          {
            "id": "project_name",
            "name": "project_name",
            "label": "Project name",
            "type": "text",
            "required": true,
            "order": 2
          },
          {
            "id": "consulting_engineer",
            "name": "consulting_engineer",
            "label": "Consulting engineer",
            "type": "text",
            "required": false,
            "order": 3
          },
          {
            "id": "order_number",
            "name": "order_number",
            "label": "Order No",
            "type": "text",
            "required": false,
            "order": 4
          },
          {
            "id": "order_row_no",
            "name": "order_row_no",
            "label": "Order row No",
            "type": "text",
            "required": false,
            "order": 5
          },
          {
            "id": "marketing_no",
            "name": "marketing_no",
            "label": "Marketing No",
            "type": "text",
            "required": false,
            "order": 6
          },
          {
            "id": "project_no",
            "name": "project_no",
            "label": "Project No",
            "type": "text",
            "required": true,
            "order": 7
          }
        ]
      },
      {
        "id": "technical_family",
        "title": "AHU Model Family Selection",
        "description": "Select the technical family",
        "order": 1,
        "fields": [
          {
            "id": "family",
            "name": "family",
            "label": "Family",
            "type": "radio_cards",
            "options": ["EOP", "PRTG", "EOP-VRF", "PRTG-VRF", "EW", "EWB", "ED", "EB"],
            "required": true,
            "placeholder": "Select family",
            "help_text": "Select the technical family",
            "itemsPerRow": 4,
            "order": 1
          }
        ]
      },
      {
        "id": "technical_unit_basic",
        "title": "General Technical Input",
        "description": "Basic unit technical information",
        "order": 0,
        "fields": [
          {
            "id": "unit_model",
            "name": "unit_model",
            "label": "Unit Model",
            "type": "text",
            "required": true,
            "placeholder": "Enter AHU / unit model code",
            "help_text": "Model code of the air handling unit",
            "order": 1
          },
          {
            "id": "ahu_orientation",
            "name": "ahu_orientation",
            "label": "Unit Orientation",
            "type": "select",
            "options": ["vertical", "horizontal"],
            "required": true,
            "placeholder": "Select orientation",
            "help_text": "Vertical or horizontal air handling unit",
            "order": 2
          },
          {
            "id": "airflow_cfm",
            "name": "airflow_cfm",
            "label": "Air Flow (CFM)",
            "type": "number",
            "required": true,
            "order": 3
          }
        ]
      },
      {
        "id": "structural_config",
        "title": "Structural Configuration Input",
        "description": "Panels, insulation, casing structure",
        "order": 0,
        "fields": [
          {
            "id": "panel_material",
            "name": "panel_material",
            "label": "Panel Material",
            "type": "text",
            "required": false,
            "order": 1
          },
          {
            "id": "insulation_density",
            "name": "insulation_density",
            "label": "Insulation Density (kg/m3)",
            "type": "number",
            "required": false,
            "order": 2
          },
          {
            "id": "coating_color",
            "name": "coating_color",
            "label": "Paint (RAL)",
            "type": "text",
            "required": false,
            "order": 3
          }
        ]
      },
      {
        "id": "component_type_selection",
        "title": "Component Type",
        "description": "Select the type of component to specify",
        "order": 1,
        "fields": [
          {
            "id": "component_type",
            "name": "component_type",
            "label": "Component Type",
            "type": "radio_cards",
            "options": ["water_coil", "dx_coil", "filter_section", "fan_section"],
            "required": true,
            "placeholder": "Select component type",
            "help_text": "Choose the type of component you want to specify",
            "order": 1
          }
        ]
      },
      {
        "id": "component_details",
        "title": "Component Details",
        "description": "Component identification and design information",
        "order": 2,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "not_equals",
            "value": ""
          }
        },
        "fields": [
          {
            "id": "component_index",
            "name": "component_index",
            "label": "Component Index",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 1",
            "help_text": "Index of the component if multiple components are in the unit",
            "order": 1,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "in",
                "value": ["water_coil", "dx_coil"]
              }
            }
          },
          {
            "id": "section_index",
            "name": "section_index",
            "label": "Section Index",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 1",
            "help_text": "Index of the section if multiple sections exist",
            "order": 1,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "in",
                "value": ["filter_section", "fan_section"]
              }
            }
          },
          {
            "id": "component_quantity",
            "name": "component_quantity",
            "label": "Number of Identical Components",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 1",
            "help_text": "How many identical components of this configuration are installed",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "in",
                "value": ["water_coil", "dx_coil"]
              }
            }
          },
          {
            "id": "filter_quantity",
            "name": "filter_quantity",
            "label": "Number of Identical Sections",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 1",
            "help_text": "How many identical filter sections of this configuration are installed",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "filter_section"
              }
            }
          },
          {
            "id": "fan_quantity",
            "name": "fan_quantity",
            "label": "Number of Identical Fans",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 1",
            "help_text": "How many identical fans of this configuration are installed",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          },
          {
            "id": "flow_side",
            "name": "flow_side",
            "label": "Airflow Side",
            "type": "select",
            "options": ["supply", "return", "exhaust", "recirculation"],
            "required": true,
            "placeholder": "Select airflow side",
            "help_text": "Which airflow stream this fan is serving",
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          },
          {
            "id": "designer_name",
            "name": "designer_name",
            "label": "Designed By",
            "type": "text",
            "required": true,
            "placeholder": "Enter designer name",
            "help_text": "Engineer responsible for component design",
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "in",
                "value": ["water_coil", "dx_coil", "fan_section"]
              }
            }
          },
          {
            "id": "reviewer_name",
            "name": "reviewer_name",
            "label": "Reviewed By",
            "type": "text",
            "required": false,
            "placeholder": "Enter reviewer name",
            "help_text": "Engineer who reviewed/approved the design (optional)",
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "in",
                "value": ["water_coil", "dx_coil", "fan_section"]
              }
            }
          }
        ]
      },
      {
        "id": "wc_operating_conditions",
        "title": "Operating Conditions",
        "description": "Water and air conditions as used in the Coil sheet",
        "order": 3,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_water_flow_m3h",
            "name": "water_flow_m3h",
            "label": "Water Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 4.5",
            "help_text": "Design water flow rate through the coil (as in Excel design row)",
            "order": 1
          },
          {
            "id": "wc_inlet_water_temp_c",
            "name": "inlet_water_temp_c",
            "label": "Inlet Water Temp (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 7",
            "help_text": "Entering water temperature",
            "order": 2
          },
          {
            "id": "wc_outlet_water_temp_c",
            "name": "outlet_water_temp_c",
            "label": "Outlet Water Temp (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 12",
            "help_text": "Leaving water temperature",
            "order": 3
          },
          {
            "id": "wc_delta_t_water",
            "name": "delta_t_water",
            "label": "Water ΔT (°C)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated water ΔT = inlet − outlet",
            "order": 4,
            "readonly": true,
            "formula": "inlet_water_temp_c - outlet_water_temp_c"
          },
          {
            "id": "wc_inlet_air_temp_c",
            "name": "inlet_air_temp_c",
            "label": "Inlet Air Temp (°C)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 27",
            "help_text": "Entering air temperature (DB/WB depending on Excel logic)",
            "order": 5
          },
          {
            "id": "wc_outlet_air_temp_c",
            "name": "outlet_air_temp_c",
            "label": "Outlet Air Temp (°C)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 14",
            "help_text": "Leaving air temperature",
            "order": 6
          },
          {
            "id": "wc_design_air_flow_m3h",
            "name": "design_air_flow_m3h",
            "label": "Air Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 3200",
            "help_text": "Design air volume flow rate across the coil",
            "order": 7
          },
          {
            "id": "wc_face_area_m2",
            "name": "face_area_m2",
            "label": "Coil Face Area (m²)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as (face_width_mm / 1000) × (face_height_mm / 1000)",
            "order": 8,
            "readonly": true,
            "formula": "(face_width_mm / 1000) * (face_height_mm / 1000)"
          },
          {
            "id": "wc_air_face_velocity_ms",
            "name": "air_face_velocity_ms",
            "label": "Air Face Velocity (m/s)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as (design_air_flow_m3h / 3600) ÷ face_area_m2",
            "order": 9,
            "readonly": true,
            "formula": "(design_air_flow_m3h / 3600) / face_area_m2"
          },
          {
            "id": "wc_water_flow_kgh",
            "name": "water_flow_kgh",
            "label": "Water Flow (kg/h)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as water_flow_m3h × 1000",
            "order": 10,
            "readonly": true,
            "formula": "water_flow_m3h * 1000"
          },
          {
            "id": "wc_capacity_kw",
            "name": "capacity_kw",
            "label": "Capacity (kW)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Approximate capacity: (water_flow_kgh × 1.163 × delta_t_water) ÷ 3600",
            "order": 11,
            "readonly": true,
            "formula": "(water_flow_kgh * 1.163 * delta_t_water) / 3600"
          },
          {
            "id": "wc_max_working_pressure_bar",
            "name": "max_working_pressure_bar",
            "label": "Max Working Pressure (bar)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 16",
            "help_text": "Maximum allowable working pressure for the coil",
            "order": 12
          }
        ]
      },
      {
        "id": "wc_geometry",
        "title": "Geometry & Tube Layout",
        "description": "Physical dimensions and tube bundle layout",
        "order": 3,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_face_width_mm",
            "name": "face_width_mm",
            "label": "Face Width (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 800",
            "help_text": "Coil face width (Excel: width dimension)",
            "order": 1
          },
          {
            "id": "wc_face_height_mm",
            "name": "face_height_mm",
            "label": "Face Height (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 400",
            "help_text": "Coil face height (Excel: height dimension)",
            "order": 2
          },
          {
            "id": "wc_rows",
            "name": "rows",
            "label": "Number of Rows",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 4",
            "help_text": "Number of tube rows (R) in the coil",
            "order": 3
          },
          {
            "id": "wc_tubes_per_row",
            "name": "tubes_per_row",
            "label": "Tubes per Row",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 12",
            "help_text": "Number of tubes across one row",
            "order": 4
          },
          {
            "id": "wc_total_tube_count",
            "name": "total_tube_count",
            "label": "Total Tube Count",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as rows × tubes_per_row",
            "order": 5,
            "readonly": true,
            "formula": "rows * tubes_per_row"
          },
          {
            "id": "wc_fin_per_inch",
            "name": "fin_per_inch",
            "label": "Fins per Inch (FPI)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 10",
            "help_text": "Fin density (fins per inch)",
            "order": 6
          },
          {
            "id": "wc_tube_outer_diameter_mm",
            "name": "tube_outer_diameter_mm",
            "label": "Tube Outer Diameter (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 15.9",
            "help_text": "Tube OD in millimetres",
            "order": 7
          },
          {
            "id": "wc_tube_pitch_transversal_mm",
            "name": "tube_pitch_transversal_mm",
            "label": "Tube Pitch – Transversal (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 38",
            "help_text": "Centre-to-centre transversal pitch",
            "order": 8
          },
          {
            "id": "wc_tube_pitch_longitudinal_mm",
            "name": "tube_pitch_longitudinal_mm",
            "label": "Tube Pitch – Longitudinal (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 33",
            "help_text": "Centre-to-centre longitudinal pitch",
            "order": 9
          },
          {
            "id": "wc_coil_depth_mm",
            "name": "coil_depth_mm",
            "label": "Coil Depth (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 200",
            "help_text": "Overall depth of the coil including rows and fin pack",
            "order": 10
          }
        ]
      },
      {
        "id": "wc_circuits",
        "title": "Circuits & Tube Distribution",
        "description": "Number of circuits and tube-per-circuit distribution logic",
        "order": 5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "water_flow_m3h",
            "name": "water_flow_m3h",
            "label": "Water Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 4.5",
            "help_text": "Design water flow rate through the coil",
            "order": 1
          },
          {
            "id": "inlet_water_temp_c",
            "name": "inlet_water_temp_c",
            "label": "Inlet Water Temp (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 7",
            "help_text": "Entering water temperature",
            "order": 2
          },
          {
            "id": "outlet_water_temp_c",
            "name": "outlet_water_temp_c",
            "label": "Outlet Water Temp (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 12",
            "help_text": "Leaving water temperature",
            "order": 3
          },
          {
            "id": "delta_t_water",
            "name": "delta_t_water",
            "label": "Water ΔT (°C)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as inlet_water_temp_c − outlet_water_temp_c",
            "order": 4,
            "readonly": true,
            "formula": "inlet_water_temp_c - outlet_water_temp_c"
          },
          {
            "id": "inlet_air_temp_c",
            "name": "inlet_air_temp_c",
            "label": "Inlet Air Temp (°C)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 27",
            "help_text": "Entering air temperature (optional)",
            "order": 5
          },
          {
            "id": "outlet_air_temp_c",
            "name": "outlet_air_temp_c",
            "label": "Outlet Air Temp (°C)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 14",
            "help_text": "Leaving air temperature (optional)",
            "order": 6
          },
          {
            "id": "design_air_flow_m3h",
            "name": "design_air_flow_m3h",
            "label": "Air Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 3200",
            "help_text": "Design air volume flow rate",
            "order": 7
          },
          {
            "id": "air_face_velocity_ms",
            "name": "air_face_velocity_ms",
            "label": "Air Face Velocity (m/s)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as (design_air_flow_m3h / 3600) ÷ coil_face_area_m2",
            "order": 8,
            "readonly": true,
            "formula": "(design_air_flow_m3h / 3600) / coil_face_area_m2"
          },
          {
            "id": "max_working_pressure_bar",
            "name": "max_working_pressure_bar",
            "label": "Max Working Pressure (bar)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 16",
            "help_text": "Maximum allowable working pressure",
            "order": 9
          }
        ]
      },
      {
        "id": "wc_circuits",
        "title": "Circuits & Tube Distribution",
        "description": "Number of circuits and tube-per-circuit distribution logic",
        "order": 5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_num_circuits",
            "name": "num_circuits",
            "label": "Number of Circuits",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 8",
            "help_text": "Number of water circuits in the coil (Excel N9 equivalent)",
            "order": 1
          },
          {
            "id": "wc_avg_tubes_per_circuit",
            "name": "avg_tubes_per_circuit",
            "label": "Average Tubes per Circuit",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Average tubes/circuit: total_tube_count ÷ num_circuits",
            "order": 2,
            "readonly": true,
            "formula": "total_tube_count / num_circuits"
          },
          {
            "id": "wc_low_tubes_per_circuit",
            "name": "low_tubes_per_circuit",
            "label": "Low Tubes per Circuit",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Floor(avg_tubes_per_circuit)",
            "order": 3,
            "readonly": true,
            "formula": "floor(avg_tubes_per_circuit)"
          },
          {
            "id": "wc_high_tubes_per_circuit",
            "name": "high_tubes_per_circuit",
            "label": "High Tubes per Circuit",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Ceil(avg_tubes_per_circuit)",
            "order": 4,
            "readonly": true,
            "formula": "ceil(avg_tubes_per_circuit)"
          },
          {
            "id": "wc_circuits_high",
            "name": "circuits_high",
            "label": "Circuits with High Tube Count",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Number of circuits with high_tubes_per_circuit",
            "order": 5,
            "readonly": true,
            "formula": "(total_tube_count - low_tubes_per_circuit * num_circuits) / (high_tubes_per_circuit - low_tubes_per_circuit)"
          },
          {
            "id": "wc_circuits_low",
            "name": "circuits_low",
            "label": "Circuits with Low Tube Count",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Remaining circuits with low_tubes_per_circuit",
            "order": 6,
            "readonly": true,
            "formula": "num_circuits - circuits_high"
          }
        ]
      },
      {
        "id": "wc_connections",
        "title": "Connections & Headers",
        "description": "Connection type, side, size and height",
        "order": 5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_connection_type",
            "name": "connection_type",
            "label": "Connection Type",
            "type": "select",
            "options": ["threaded", "welded", "flanged"],
            "required": true,
            "placeholder": "Select connection type",
            "help_text": "Threaded ports, welded stubs or flanged connections",
            "order": 1
          },
          {
            "id": "wc_connection_side",
            "name": "connection_side",
            "label": "Connection Side",
            "type": "select",
            "options": ["left", "right"],
            "required": true,
            "placeholder": "Select side",
            "help_text": "Side of the unit where headers and connections are located",
            "order": 2
          },
          {
            "id": "wc_connection_vertical_position_mm",
            "name": "connection_vertical_position_mm",
            "label": "Connection Height (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 150",
            "help_text": "Vertical position of the connections, depends on AHU orientation",
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "ahu_orientation",
                "operator": "equals",
                "value": "vertical"
              }
            }
          },
          {
            "id": "wc_recommended_connection_diameter_inch",
            "name": "recommended_connection_diameter_inch",
            "label": "Recommended Connection Diameter (inch)",
            "type": "text",
            "required": false,
            "placeholder": "",
            "help_text": "Recommended connection size based on water_flow_m3h",
            "order": 4,
            "readonly": true,
            "formula": "if water_flow_m3h <= 2 then '3/4\"' else if water_flow_m3h <= 4 then '1\"' else if water_flow_m3h <= 8 then '1 1/4\"' else if water_flow_m3h <= 14 then '1 1/2\"' else '2\"'"
          }
        ]
      },
      {
        "id": "wc_materials_coating",
        "title": "Materials & Coating",
        "description": "Tube, fin, frame and coating configuration as per Excel options and VLOOKUP tables",
        "order": 6,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_tube_material",
            "name": "tube_material",
            "label": "Tube Material",
            "type": "select",
            "options": ["copper", "stainless_steel"],
            "required": true,
            "placeholder": "Select tube material",
            "help_text": "Base tube material (Excel: copper / SS)",
            "order": 1
          },
          {
            "id": "wc_tube_inner_surface",
            "name": "tube_inner_surface",
            "label": "Tube Inner Surface",
            "type": "select",
            "options": ["smooth", "rifled"],
            "required": true,
            "placeholder": "Select inner surface type",
            "help_text": "Smooth or rifled tubes as per options in the sheet",
            "order": 2
          },
          {
            "id": "wc_fin_material",
            "name": "fin_material",
            "label": "Fin Material",
            "type": "select",
            "options": ["aluminum", "hydrophilic_aluminum", "marine_aluminum"],
            "required": true,
            "placeholder": "Select fin material",
            "help_text": "Plain aluminium, hydrophilic-coated, or marine-grade fins",
            "order": 3
          },
          {
            "id": "wc_fin_thickness_mm",
            "name": "fin_thickness_mm",
            "label": "Fin Thickness (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 0.2",
            "help_text": "Fin thickness (Excel table for fin thickness)",
            "order": 4
          },
          {
            "id": "wc_frame_material",
            "name": "frame_material",
            "label": "Frame Material",
            "type": "select",
            "options": [
              "galvanized_steel_1_25",
              "galvanized_steel_2_0",
              "stainless_steel_1_5"
            ],
            "required": true,
            "placeholder": "Select frame material",
            "help_text": "Frame material and thickness (Excel frame options)",
            "order": 5
          },
          {
            "id": "wc_coil_coating",
            "name": "coil_coating",
            "label": "Coil Coating",
            "type": "select",
            "options": [
              "none",
              "hydrophilic",
              "hydrophilic_heating_only",
              "marine_aluminum",
              "blygold"
            ],
            "required": true,
            "placeholder": "Select coating type",
            "help_text": "Coating options as per Excel (hydrophilic, Blygold, etc.)",
            "order": 6
          }
        ]
      },
      {
        "id": "water_coil_group",
        "title": "Water Coil Configuration",
        "description": "Specification for water coils",
        "order": 6.5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_pipe_outlet_length",
            "name": "wc_pipe_outlet_length",
            "label": "Pipe Outlet Length",
            "type": "number",
            "required": false,
            "order": 1,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "water_coil"
              }
            }
          },
          {
            "id": "wc_pipe_outlet_height",
            "name": "wc_pipe_outlet_height",
            "label": "Pipe Outlet Height",
            "type": "number",
            "required": false,
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "water_coil"
              }
            }
          },
          {
            "id": "wc_coating",
            "name": "wc_coating",
            "label": "Coil Coating",
            "type": "select",
            "options": ["Without coating", "Hydrophilic coating", "Nano coating"],
            "required": false,
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "water_coil"
              }
            }
          },
          {
            "id": "wc_tubes",
            "name": "wc_tubes",
            "label": "Copper Tubes",
            "type": "text",
            "required": false,
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "water_coil"
              }
            }
          },
          {
            "id": "wc_fins",
            "name": "wc_fins",
            "label": "Coil Fins",
            "type": "text",
            "required": false,
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "water_coil"
              }
            }
          },
          {
            "id": "wc_water_flow",
            "name": "wc_water_flow",
            "label": "Water Flow (GPM)",
            "type": "number",
            "required": false,
            "order": 6,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "water_coil"
              }
            }
          }
        ]
      },
      {
        "id": "wc_results_codes",
        "title": "Codes & Calculated Results",
        "description": "Generated catalogue/coils codes and important calculated outputs",
        "order": 7,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_coil_code",
            "name": "coil_code",
            "label": "Coil Code",
            "type": "text",
            "required": false,
            "placeholder": "",
            "help_text": "Generated coil identification code based on geometry and circuits",
            "order": 1,
            "readonly": true,
            "formula": "\"WC-\" + face_width_mm + \"x\" + face_height_mm + \"-\" + rows + \"R-\" + fin_per_inch + \"FPI-\" + tube_outer_diameter_mm + \"mm-\" + num_circuits + \"C\""
          },
          {
            "id": "wc_short_description",
            "name": "short_description",
            "label": "Short Description",
            "type": "text",
            "required": false,
            "placeholder": "",
            "help_text": "Short text summary for the PDF header (can be derived or edited)",
            "order": 2
          }
        ]
      },
      {
        "id": "wc_additional_notes",
        "title": "Additional Notes",
        "description": "Free text notes and remarks that will appear in the PDF",
        "order": 8,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "water_coil"
          }
        },
        "fields": [
          {
            "id": "wc_notes",
            "name": "notes",
            "label": "Additional Notes",
            "type": "textarea",
            "required": false,
            "placeholder": "Enter any additional notes or special requirements",
            "help_text": "Any remarks or specific instructions related to this coil",
            "order": 1
          }
        ]
      },
      {
        "id": "dx_operating_conditions",
        "title": "Operating Conditions",
        "description": "Airflow and design conditions for the DX coil",
        "order": 2,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_design_air_flow_m3h",
            "name": "design_air_flow_m3h",
            "label": "Air Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 3200",
            "help_text": "Design air volume flow rate across the coil",
            "order": 1
          },
          {
            "id": "dx_inlet_air_db_c",
            "name": "inlet_air_db_c",
            "label": "Inlet Air DB (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 27",
            "help_text": "Entering air dry-bulb temperature",
            "order": 2
          },
          {
            "id": "dx_inlet_air_wb_c",
            "name": "inlet_air_wb_c",
            "label": "Inlet Air WB (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 19",
            "help_text": "Entering air wet-bulb temperature",
            "order": 3
          },
          {
            "id": "dx_outlet_air_db_c",
            "name": "outlet_air_db_c",
            "label": "Outlet Air DB (°C)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 14",
            "help_text": "Leaving air dry-bulb temperature",
            "order": 4
          },
          {
            "id": "dx_outlet_air_wb_c",
            "name": "outlet_air_wb_c",
            "label": "Outlet Air WB (°C)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Leaving air wet-bulb temperature (if calculated/known)",
            "order": 5
          },
          {
            "id": "dx_total_capacity_kw",
            "name": "total_capacity_kw",
            "label": "Total Capacity (kW)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 25",
            "help_text": "Total cooling capacity (sensible + latent), from selection or compressor data",
            "order": 6
          },
          {
            "id": "dx_sensible_capacity_kw",
            "name": "sensible_capacity_kw",
            "label": "Sensible Capacity (kW)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Sensible cooling capacity only",
            "order": 7
          },
          {
            "id": "dx_latent_capacity_kw",
            "name": "latent_capacity_kw",
            "label": "Latent Capacity (kW)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Latent cooling capacity (moisture removal)",
            "order": 8,
            "readonly": true,
            "formula": "total_capacity_kw - sensible_capacity_kw"
          }
        ]
      },
      {
        "id": "dx_refrigerant_data",
        "title": "Refrigerant & Cycle Data",
        "description": "Refrigerant type, operating temperatures and pressures",
        "order": 3,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_refrigerant_type",
            "name": "refrigerant_type",
            "label": "Refrigerant",
            "type": "select",
            "options": ["R410A", "R32", "R407C", "R134a", "R454B", "R1234ze", "Custom"],
            "required": true,
            "placeholder": "Select refrigerant",
            "help_text": "Refrigerant type as used in the DX coil",
            "order": 1
          },
          {
            "id": "dx_refrigerant_custom",
            "name": "refrigerant_custom",
            "label": "Custom Refrigerant Name",
            "type": "text",
            "required": false,
            "placeholder": "Enter custom refrigerant name",
            "help_text": "Only used when refrigerant_type = Custom",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "refrigerant_type",
                "operator": "equals",
                "value": "Custom"
              }
            }
          },
          {
            "id": "dx_evap_temp_c",
            "name": "evap_temp_c",
            "label": "Evaporating Temp (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 5",
            "help_text": "Saturated evaporating temperature at the DX coil",
            "order": 3
          },
          {
            "id": "dx_cond_temp_c",
            "name": "cond_temp_c",
            "label": "Condensing Temp (°C)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 45",
            "help_text": "Saturated condensing temperature at condenser",
            "order": 4
          },
          {
            "id": "dx_superheat_k",
            "name": "superheat_k",
            "label": "Superheat (K)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 5",
            "help_text": "Superheat at evaporator outlet",
            "order": 5
          },
          {
            "id": "dx_subcooling_k",
            "name": "subcooling_k",
            "label": "Subcooling (K)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 5",
            "help_text": "Subcooling at condenser outlet",
            "order": 6
          },
          {
            "id": "dx_suction_pressure_bar",
            "name": "suction_pressure_bar",
            "label": "Suction Pressure (bar)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Suction pressure at evaporator outlet (can be calculated from evap_temp)",
            "order": 7
          },
          {
            "id": "dx_discharge_pressure_bar",
            "name": "discharge_pressure_bar",
            "label": "Discharge Pressure (bar)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Discharge pressure at compressor outlet (can be calculated from cond_temp)",
            "order": 8
          }
        ]
      },
      {
        "id": "dx_geometry",
        "title": "Geometry & Tube Layout",
        "description": "DX coil dimensions and tube arrangement",
        "order": 4,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_face_width_mm",
            "name": "face_width_mm",
            "label": "Face Width (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 800",
            "help_text": "Coil face width",
            "order": 1
          },
          {
            "id": "dx_face_height_mm",
            "name": "face_height_mm",
            "label": "Face Height (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 400",
            "help_text": "Coil face height",
            "order": 2
          },
          {
            "id": "dx_rows",
            "name": "rows",
            "label": "Number of Rows",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 4",
            "help_text": "Number of tube rows",
            "order": 3
          },
          {
            "id": "dx_tubes_per_row",
            "name": "tubes_per_row",
            "label": "Tubes per Row",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 12",
            "help_text": "Number of tubes per row",
            "order": 4
          },
          {
            "id": "dx_total_tube_count",
            "name": "total_tube_count",
            "label": "Total Tube Count",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as rows × tubes_per_row",
            "order": 5,
            "readonly": true,
            "formula": "rows * tubes_per_row"
          },
          {
            "id": "dx_fin_per_inch",
            "name": "fin_per_inch",
            "label": "Fins per Inch (FPI)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 10",
            "help_text": "Fin density",
            "order": 6
          },
          {
            "id": "dx_tube_outer_diameter_mm",
            "name": "tube_outer_diameter_mm",
            "label": "Tube Outer Diameter (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 9.52",
            "help_text": "Tube OD",
            "order": 7
          },
          {
            "id": "dx_tube_pitch_transversal_mm",
            "name": "tube_pitch_transversal_mm",
            "label": "Tube Pitch – Transversal (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 25",
            "help_text": "Transversal pitch",
            "order": 8
          },
          {
            "id": "dx_tube_pitch_longitudinal_mm",
            "name": "tube_pitch_longitudinal_mm",
            "label": "Tube Pitch – Longitudinal (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 21.65",
            "help_text": "Longitudinal pitch",
            "order": 9
          },
          {
            "id": "dx_coil_depth_mm",
            "name": "coil_depth_mm",
            "label": "Coil Depth (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 200",
            "help_text": "Overall depth of the DX coil",
            "order": 10
          },
          {
            "id": "dx_face_area_m2",
            "name": "face_area_m2",
            "label": "Coil Face Area (m²)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as (face_width_mm / 1000) × (face_height_mm / 1000)",
            "order": 11,
            "readonly": true,
            "formula": "(face_width_mm / 1000) * (face_height_mm / 1000)"
          },
          {
            "id": "dx_air_face_velocity_ms",
            "name": "air_face_velocity_ms",
            "label": "Air Face Velocity (m/s)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as (design_air_flow_m3h / 3600) ÷ face_area_m2",
            "order": 12,
            "readonly": true,
            "formula": "(design_air_flow_m3h / 3600) / face_area_m2"
          }
        ]
      },
      {
        "id": "dx_circuits_and_expansion",
        "title": "Circuits & Expansion Device",
        "description": "Number of circuits, distribution and expansion device type",
        "order": 5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_num_circuits",
            "name": "num_circuits",
            "label": "Number of Circuits",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 4",
            "help_text": "Number of refrigerant circuits in the DX coil",
            "order": 1
          },
          {
            "id": "dx_expansion_device_type",
            "name": "expansion_device_type",
            "label": "Expansion Device",
            "type": "select",
            "options": ["TXV", "EEV", "Capillary", "Electronic Distribution", "Other"],
            "required": true,
            "placeholder": "Select expansion device",
            "help_text": "Type of expansion device feeding the DX coil",
            "order": 2
          },
          {
            "id": "dx_expansion_device_notes",
            "name": "expansion_device_notes",
            "label": "Expansion Device Notes",
            "type": "textarea",
            "required": false,
            "placeholder": "Enter any details about expansion device",
            "help_text": "Manufacturer, model, or any special requirements",
            "order": 3
          }
        ]
      },
      {
        "id": "dx_connections",
        "title": "Connections",
        "description": "Liquid and suction line connections, side and orientation",
        "order": 6,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_connection_side",
            "name": "connection_side",
            "label": "Connection Side",
            "type": "select",
            "options": ["left", "right"],
            "required": true,
            "placeholder": "Select side",
            "help_text": "Side of the unit where DX connections are located",
            "order": 1
          },
          {
            "id": "dx_liquid_line_diameter_inch",
            "name": "liquid_line_diameter_inch",
            "label": "Liquid Line Diameter (inch)",
            "type": "text",
            "required": true,
            "placeholder": "e.g. 3/8\"",
            "help_text": "Liquid line connection size",
            "order": 2
          },
          {
            "id": "dx_suction_line_diameter_inch",
            "name": "suction_line_diameter_inch",
            "label": "Suction Line Diameter (inch)",
            "type": "text",
            "required": true,
            "placeholder": "e.g. 7/8\"",
            "help_text": "Suction line connection size",
            "order": 3
          },
          {
            "id": "dx_connection_type",
            "name": "connection_type",
            "label": "Connection Type",
            "type": "select",
            "options": ["brazed", "flared", "flanged"],
            "required": true,
            "placeholder": "Select connection type",
            "help_text": "Type of pipe connection for DX lines",
            "order": 4
          },
          {
            "id": "dx_connection_vertical_position_mm",
            "name": "connection_vertical_position_mm",
            "label": "Connection Height (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 150",
            "help_text": "Vertical position of the DX connections from reference level",
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "ahu_orientation",
                "operator": "equals",
                "value": "vertical"
              }
            }
          }
        ]
      },
      {
        "id": "dx_materials_coating",
        "title": "Materials & Coating",
        "description": "Tube, fin, frame and coating for DX coil",
        "order": 7,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_tube_material",
            "name": "tube_material",
            "label": "Tube Material",
            "type": "select",
            "options": ["copper", "stainless_steel"],
            "required": true,
            "placeholder": "Select tube material",
            "help_text": "Base tube material for the DX coil",
            "order": 1
          },
          {
            "id": "dx_tube_inner_surface",
            "name": "tube_inner_surface",
            "label": "Tube Inner Surface",
            "type": "select",
            "options": ["smooth", "rifled"],
            "required": true,
            "placeholder": "Select inner surface type",
            "help_text": "Smooth or rifled tubes",
            "order": 2
          },
          {
            "id": "dx_fin_material",
            "name": "fin_material",
            "label": "Fin Material",
            "type": "select",
            "options": ["aluminum", "hydrophilic_aluminum", "marine_aluminum"],
            "required": true,
            "placeholder": "Select fin material",
            "help_text": "Plain aluminium, hydrophilic-coated, or marine-grade fins",
            "order": 3
          },
          {
            "id": "dx_fin_thickness_mm",
            "name": "fin_thickness_mm",
            "label": "Fin Thickness (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 0.2",
            "help_text": "Fin thickness",
            "order": 4
          },
          {
            "id": "dx_frame_material",
            "name": "frame_material",
            "label": "Frame Material",
            "type": "select",
            "options": [
              "galvanized_steel_1_25",
              "galvanized_steel_2_0",
              "stainless_steel_1_5"
            ],
            "required": true,
            "placeholder": "Select frame material",
            "help_text": "Frame material and thickness",
            "order": 5
          },
          {
            "id": "dx_coil_coating",
            "name": "coil_coating",
            "label": "Coil Coating",
            "type": "select",
            "options": [
              "none",
              "hydrophilic",
              "hydrophilic_heating_only",
              "marine_aluminum",
              "blygold"
            ],
            "required": true,
            "placeholder": "Select coating type",
            "help_text": "Coating options for DX coil fins/tubes",
            "order": 6
          }
        ]
      },
      {
        "id": "dx_coil_group",
        "title": "DX Coil Configuration",
        "description": "Specification for DX coils",
        "order": 7.5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_evap_temp",
            "name": "dx_evap_temp",
            "label": "Evaporation Temperature",
            "type": "number",
            "required": false,
            "order": 1,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "dx_coil"
              }
            }
          },
          {
            "id": "dx_cond_temp",
            "name": "dx_cond_temp",
            "label": "Condensing Temperature",
            "type": "number",
            "required": false,
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "dx_coil"
              }
            }
          },
          {
            "id": "dx_distributor_tube_dia",
            "name": "dx_distributor_tube_dia",
            "label": "Distributor Tube Diameter",
            "type": "text",
            "required": false,
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "dx_coil"
              }
            }
          },
          {
            "id": "dx_spiders_qty",
            "name": "dx_spiders_qty",
            "label": "Quantity of Spiders",
            "type": "number",
            "required": false,
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "dx_coil"
              }
            }
          },
          {
            "id": "dx_capacity",
            "name": "dx_capacity",
            "label": "Capacity (BTU/h)",
            "type": "number",
            "required": false,
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "dx_coil"
              }
            }
          }
        ]
      },
      {
        "id": "dx_results_codes",
        "title": "Codes & Results",
        "description": "DX coil code and main calculated results to show in PDF",
        "order": 8,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_coil_code",
            "name": "coil_code",
            "label": "DX Coil Code",
            "type": "text",
            "required": false,
            "placeholder": "",
            "help_text": "Generated DX coil identification code (derived from geometry, rows, FPI, refrigerant, etc.)",
            "order": 1,
            "readonly": true,
            "formula": "\"DX-\" + face_width_mm + \"x\" + face_height_mm + \"-\" + rows + \"R-\" + fin_per_inch + \"FPI-\" + refrigerant_type"
          },
          {
            "id": "dx_summary_text",
            "name": "summary_text",
            "label": "Summary Text",
            "type": "textarea",
            "required": false,
            "placeholder": "Optional short summary for the PDF",
            "help_text": "Short summary sentence describing the DX coil configuration",
            "order": 2
          }
        ]
      },
      {
        "id": "dx_additional_notes",
        "title": "Additional Notes",
        "description": "Free text notes and remarks that will appear in the PDF",
        "order": 9,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "dx_coil"
          }
        },
        "fields": [
          {
            "id": "dx_notes",
            "name": "notes",
            "label": "Additional Notes",
            "type": "textarea",
            "required": false,
            "placeholder": "Enter any additional notes or special requirements",
            "help_text": "Any remarks or specific instructions related to this DX coil",
            "order": 1
          }
        ]
      },
      {
        "id": "filter_airflow",
        "title": "Airflow & Face Area",
        "description": "Design airflow and face area, used for velocity and pressure drop calculations",
        "order": 2,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_design_air_flow_m3h",
            "name": "design_air_flow_m3h",
            "label": "Air Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 3200",
            "help_text": "Design air volume flow rate through the filter section",
            "order": 1
          },
          {
            "id": "filter_face_width_mm",
            "name": "face_width_mm",
            "label": "Face Width (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 800",
            "help_text": "Filter section face width (inside clear width)",
            "order": 2
          },
          {
            "id": "filter_face_height_mm",
            "name": "face_height_mm",
            "label": "Face Height (mm)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 400",
            "help_text": "Filter section face height (inside clear height)",
            "order": 3
          },
          {
            "id": "filter_face_area_m2",
            "name": "face_area_m2",
            "label": "Face Area (m²)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated face area: (face_width_mm / 1000) × (face_height_mm / 1000)",
            "order": 4,
            "readonly": true,
            "formula": "(face_width_mm / 1000) * (face_height_mm / 1000)"
          },
          {
            "id": "filter_air_face_velocity_ms",
            "name": "air_face_velocity_ms",
            "label": "Air Face Velocity (m/s)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated as (design_air_flow_m3h / 3600) ÷ face_area_m2",
            "order": 5,
            "readonly": true,
            "formula": "(design_air_flow_m3h / 3600) / face_area_m2"
          }
        ]
      },
      {
        "id": "filter_configuration",
        "title": "Filter Configuration",
        "description": "Number of stages and overall configuration of the filter section",
        "order": 3,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_stage_count",
            "name": "stage_count",
            "label": "Number of Filter Stages",
            "type": "select",
            "options": [1, 2, 3],
            "required": true,
            "placeholder": "Select number of stages",
            "help_text": "Number of filter stages (e.g. pre + fine + HEPA)",
            "order": 1
          },
          {
            "id": "filter_bypass_dampers",
            "name": "bypass_dampers",
            "label": "Bypass Dampers Included",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Check if the section includes bypass dampers around filter bank",
            "order": 2
          },
          {
            "id": "filter_pressure_taps",
            "name": "pressure_taps",
            "label": "Differential Pressure Taps",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Check if differential pressure measurement points are included",
            "order": 3
          },
          {
            "id": "filter_dp_gauge_type",
            "name": "dp_gauge_type",
            "label": "DP Gauge Type",
            "type": "select",
            "options": ["none", "manometer", "magnetic_gauge", "pressure_sensor"],
            "required": false,
            "placeholder": "Select differential pressure gauge type",
            "help_text": "Type of differential pressure gauge installed on the filter section",
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "pressure_taps",
                "operator": "equals",
                "value": true
              }
            }
          }
        ]
      },
      {
        "id": "filter_stage_1",
        "title": "Stage 1 – Pre-Filter",
        "description": "First stage (typically coarse or pre-filter)",
        "order": 4,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_stage1_enabled",
            "name": "stage1_enabled",
            "label": "Enable Stage 1",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Uncheck only if this stage is not used",
            "order": 1
          },
          {
            "id": "filter_stage1_type",
            "name": "stage1_type",
            "label": "Stage 1 Filter Type",
            "type": "select",
            "options": ["panel", "pleated", "bag", "metal_mesh", "carbon", "other"],
            "required": true,
            "placeholder": "Select filter type",
            "help_text": "Type of filter used as first stage",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "stage1_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage1_standard",
            "name": "stage1_standard",
            "label": "Stage 1 Classification Standard",
            "type": "select",
            "options": ["ISO 16890", "EN 779", "ASHRAE 52.2", "other"],
            "required": false,
            "placeholder": "Select standard",
            "help_text": "Standard according to which the filter is classified",
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "stage1_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage1_class",
            "name": "stage1_class",
            "label": "Stage 1 Filter Class",
            "type": "select",
            "options": [
              "Coarse 60 %",
              "Coarse 80 %",
              "ePM10 50 %",
              "ePM10 70 %",
              "M5",
              "M6",
              "G4",
              "Custom"
            ],
            "required": true,
            "placeholder": "Select filter class",
            "help_text": "Filter class (ISO/EN-779 equivalents)",
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "stage1_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage1_custom_class",
            "name": "stage1_custom_class",
            "label": "Custom Class Description",
            "type": "text",
            "required": false,
            "placeholder": "Enter custom filter class",
            "help_text": "Only used when filter class = Custom",
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "stage1_class",
                "operator": "equals",
                "value": "Custom"
              }
            }
          },
          {
            "id": "filter_stage1_depth_mm",
            "name": "stage1_depth_mm",
            "label": "Stage 1 Filter Depth (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 48",
            "help_text": "Depth/thickness of the filter element",
            "order": 6,
            "conditions": {
              "show_if": {
                "field": "stage1_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage1_initial_dp_pa",
            "name": "stage1_initial_dp_pa",
            "label": "Stage 1 Initial ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 50",
            "help_text": "Initial pressure drop at nominal airflow",
            "order": 7,
            "conditions": {
              "show_if": {
                "field": "stage1_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage1_final_dp_pa",
            "name": "stage1_final_dp_pa",
            "label": "Stage 1 Final ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 150",
            "help_text": "Final (recommended replacement) pressure drop",
            "order": 8,
            "conditions": {
              "show_if": {
                "field": "stage1_enabled",
                "operator": "equals",
                "value": true
              }
            }
          }
        ]
      },
      {
        "id": "filter_stage_2",
        "title": "Stage 2 – Fine Filter",
        "description": "Second stage of filtration (typically fine filter)",
        "order": 5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_stage2_enabled",
            "name": "stage2_enabled",
            "label": "Enable Stage 2",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Automatically on when stage_count ≥ 2",
            "order": 1
          },
          {
            "id": "filter_stage2_type",
            "name": "stage2_type",
            "label": "Stage 2 Filter Type",
            "type": "select",
            "options": ["bag", "compact", "cassette", "carbon", "other"],
            "required": true,
            "placeholder": "Select filter type",
            "help_text": "Type of filter used as second stage",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "stage2_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage2_standard",
            "name": "stage2_standard",
            "label": "Stage 2 Classification Standard",
            "type": "select",
            "options": ["ISO 16890", "EN 779", "ASHRAE 52.2", "other"],
            "required": false,
            "placeholder": "Select standard",
            "help_text": "Standard according to which the filter is classified",
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "stage2_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage2_class",
            "name": "stage2_class",
            "label": "Stage 2 Filter Class",
            "type": "select",
            "options": [
              "ePM2.5 65 %",
              "ePM2.5 80 %",
              "ePM1 50 %",
              "ePM1 70 %",
              "F7",
              "F8",
              "F9",
              "Custom"
            ],
            "required": true,
            "placeholder": "Select filter class",
            "help_text": "Fine filter class (ISO/EN-779 equivalents)",
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "stage2_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage2_custom_class",
            "name": "stage2_custom_class",
            "label": "Custom Class Description",
            "type": "text",
            "required": false,
            "placeholder": "Enter custom filter class",
            "help_text": "Only used when filter class = Custom",
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "stage2_class",
                "operator": "equals",
                "value": "Custom"
              }
            }
          },
          {
            "id": "filter_stage2_depth_mm",
            "name": "stage2_depth_mm",
            "label": "Stage 2 Filter Depth (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 292",
            "help_text": "Depth/thickness of the filter element or bag length",
            "order": 6,
            "conditions": {
              "show_if": {
                "field": "stage2_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage2_initial_dp_pa",
            "name": "stage2_initial_dp_pa",
            "label": "Stage 2 Initial ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 80",
            "help_text": "Initial pressure drop at nominal airflow",
            "order": 7,
            "conditions": {
              "show_if": {
                "field": "stage2_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage2_final_dp_pa",
            "name": "stage2_final_dp_pa",
            "label": "Stage 2 Final ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 200",
            "help_text": "Final (recommended replacement) pressure drop",
            "order": 8,
            "conditions": {
              "show_if": {
                "field": "stage2_enabled",
                "operator": "equals",
                "value": true
              }
            }
          }
        ]
      },
      {
        "id": "filter_stage_3",
        "title": "Stage 3 – HEPA / Special Filter",
        "description": "Third stage of filtration, typically HEPA/ULPA or special-purpose filter",
        "order": 6,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_stage3_enabled",
            "name": "stage3_enabled",
            "label": "Enable Stage 3",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Automatically on when stage_count = 3",
            "order": 1
          },
          {
            "id": "filter_stage3_type",
            "name": "stage3_type",
            "label": "Stage 3 Filter Type",
            "type": "select",
            "options": ["HEPA", "ULPA", "carbon", "chemical", "other"],
            "required": true,
            "placeholder": "Select filter type",
            "help_text": "Type of third-stage filter (e.g. HEPA H13/H14)",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "stage3_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage3_standard",
            "name": "stage3_standard",
            "label": "Stage 3 Classification Standard",
            "type": "select",
            "options": ["EN 1822", "ISO 29463", "other"],
            "required": false,
            "placeholder": "Select standard",
            "help_text": "Standard for HEPA/ULPA classification",
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "stage3_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage3_class",
            "name": "stage3_class",
            "label": "Stage 3 Filter Class",
            "type": "select",
            "options": [
              "H13",
              "H14",
              "U15",
              "U16",
              "Custom"
            ],
            "required": true,
            "placeholder": "Select filter class",
            "help_text": "HEPA/ULPA filter class",
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "stage3_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage3_custom_class",
            "name": "stage3_custom_class",
            "label": "Custom Class Description",
            "type": "text",
            "required": false,
            "placeholder": "Enter custom filter class",
            "help_text": "Only used when filter class = Custom",
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "stage3_class",
                "operator": "equals",
                "value": "Custom"
              }
            }
          },
          {
            "id": "filter_stage3_depth_mm",
            "name": "stage3_depth_mm",
            "label": "Stage 3 Filter Depth (mm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 292",
            "help_text": "Depth/thickness of the HEPA/ULPA cassette",
            "order": 6,
            "conditions": {
              "show_if": {
                "field": "stage3_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage3_initial_dp_pa",
            "name": "stage3_initial_dp_pa",
            "label": "Stage 3 Initial ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 200",
            "help_text": "Initial pressure drop at nominal airflow",
            "order": 7,
            "conditions": {
              "show_if": {
                "field": "stage3_enabled",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "filter_stage3_final_dp_pa",
            "name": "stage3_final_dp_pa",
            "label": "Stage 3 Final ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 450",
            "help_text": "Final (recommended replacement) pressure drop",
            "order": 8,
            "conditions": {
              "show_if": {
                "field": "stage3_enabled",
                "operator": "equals",
                "value": true
              }
            }
          }
        ]
      },
      {
        "id": "filter_pressure_summary",
        "title": "Pressure Drop Summary",
        "description": "Summary of total initial and final pressure drop across the filter section",
        "order": 7,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_total_initial_dp_pa",
            "name": "total_initial_dp_pa",
            "label": "Total Initial ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Sum of initial pressure drops of all enabled stages",
            "order": 1,
            "readonly": true,
            "formula": "(stage1_enabled ? stage1_initial_dp_pa : 0) + (stage2_enabled ? stage2_initial_dp_pa : 0) + (stage3_enabled ? stage3_initial_dp_pa : 0)"
          },
          {
            "id": "filter_total_final_dp_pa",
            "name": "total_final_dp_pa",
            "label": "Total Final ΔP (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Sum of final pressure drops of all enabled stages",
            "order": 2,
            "readonly": true,
            "formula": "(stage1_enabled ? stage1_final_dp_pa : 0) + (stage2_enabled ? stage2_final_dp_pa : 0) + (stage3_enabled ? stage3_final_dp_pa : 0)"
          }
        ]
      },
      {
        "id": "filter_construction",
        "title": "Construction & Frame",
        "description": "Mechanical construction details of the filter section",
        "order": 8,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_section_material",
            "name": "section_material",
            "label": "Section Material",
            "type": "select",
            "options": [
              "galvanized_steel_1_0",
              "galvanized_steel_1_25",
              "galvanized_steel_1_5",
              "stainless_steel_1_5",
              "aluminum"
            ],
            "required": true,
            "placeholder": "Select material",
            "help_text": "Material of the filter section casing",
            "order": 1
          },
          {
            "id": "filter_access_side",
            "name": "access_side",
            "label": "Filter Access Side",
            "type": "select",
            "options": ["left", "right", "top", "bottom"],
            "required": true,
            "placeholder": "Select access side",
            "help_text": "Which side the filters are accessed from",
            "order": 2
          },
          {
            "id": "filter_access_type",
            "name": "access_type",
            "label": "Access Type",
            "type": "select",
            "options": ["hinged_door", "removable_panel", "slide_out_frame"],
            "required": true,
            "placeholder": "Select access type",
            "help_text": "Door or panel type for filter replacement",
            "order": 3
          },
          {
            "id": "filter_gasket_type",
            "name": "gasket_type",
            "label": "Gasket Type",
            "type": "select",
            "options": ["EPDM", "neoprene", "silicone", "none"],
            "required": false,
            "placeholder": "Select gasket type",
            "help_text": "Type of gasket for sealing filter frames/doors",
            "order": 4
          }
        ]
      },
      {
        "id": "filter_results_and_code",
        "title": "Filter Section Code & Summary",
        "description": "Generated code and short description for the PDF",
        "order": 9,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_section_code",
            "name": "section_code",
            "label": "Filter Section Code",
            "type": "text",
            "required": false,
            "placeholder": "",
            "help_text": "Generated identification code for the filter section",
            "order": 1,
            "readonly": true,
            "formula": "\"FS-\" + face_width_mm + \"x\" + face_height_mm + \"-\" + stage_count + \"ST\""
          },
          {
            "id": "filter_summary_text",
            "name": "summary_text",
            "label": "Summary Text",
            "type": "textarea",
            "required": false,
            "placeholder": "Optional short summary for the PDF",
            "help_text": "Short sentence describing the filter section configuration (stages, classes, ΔP)",
            "order": 2
          }
        ]
      },
      {
        "id": "filter_group",
        "title": "Filter Configuration",
        "description": "Filter stages and details",
        "order": 10.5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "flt_s1_type",
            "name": "flt_s1_type",
            "label": "Stage 1 Type",
            "type": "text",
            "required": false,
            "order": 1,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "filter_section"
              }
            }
          },
          {
            "id": "flt_s1_eff",
            "name": "flt_s1_eff",
            "label": "Stage 1 Efficiency",
            "type": "text",
            "required": false,
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "filter_section"
              }
            }
          },
          {
            "id": "flt_s1_size",
            "name": "flt_s1_size",
            "label": "Stage 1 Size",
            "type": "text",
            "required": false,
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "filter_section"
              }
            }
          },
          {
            "id": "flt_s2_type",
            "name": "flt_s2_type",
            "label": "Stage 2 Type",
            "type": "text",
            "required": false,
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "filter_section"
              }
            }
          },
          {
            "id": "flt_quantity",
            "name": "flt_quantity",
            "label": "Quantity",
            "type": "number",
            "required": false,
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "filter_section"
              }
            }
          }
        ]
      },
      {
        "id": "filter_additional_notes",
        "title": "Additional Notes",
        "description": "Free text notes/remarks to appear in the PDF",
        "order": 10,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "filter_section"
          }
        },
        "fields": [
          {
            "id": "filter_notes",
            "name": "notes",
            "label": "Additional Notes",
            "type": "textarea",
            "required": false,
            "placeholder": "Enter any additional notes or special requirements",
            "help_text": "Any remarks or specific instructions related to this filter section",
            "order": 1
          }
        ]
      },
      {
        "id": "fan_airflow_duty",
        "title": "Airflow Duty & Conditions",
        "description": "Design airflow, total pressure and temperature for fan selection",
        "order": 2,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_air_flow_m3h",
            "name": "air_flow_m3h",
            "label": "Air Flow (m³/h)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 5000",
            "help_text": "Design air volume flow rate through the fan",
            "order": 1
          },
          {
            "id": "fan_static_pressure_pa",
            "name": "static_pressure_pa",
            "label": "External Static Pressure (Pa)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 400",
            "help_text": "Required external static pressure to be overcome by the fan",
            "order": 2
          },
          {
            "id": "fan_internal_losses_pa",
            "name": "internal_losses_pa",
            "label": "Internal Losses (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 100",
            "help_text": "Internal losses within the AHU/fan section (dampers, casing, etc.)",
            "order": 3
          },
          {
            "id": "fan_total_pressure_pa",
            "name": "total_pressure_pa",
            "label": "Total Pressure Rise (Pa)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Total pressure rise: static_pressure_pa + internal_losses_pa",
            "order": 4,
            "readonly": true,
            "formula": "static_pressure_pa + internal_losses_pa"
          },
          {
            "id": "fan_air_temp_inlet_c",
            "name": "air_temp_inlet_c",
            "label": "Inlet Air Temp (°C)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 20",
            "help_text": "Air temperature at the fan inlet",
            "order": 5
          },
          {
            "id": "fan_air_density_kgm3",
            "name": "air_density_kgm3",
            "label": "Air Density (kg/m³)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 1.2",
            "help_text": "Air density used for selection (if not calculated)",
            "order": 6
          },
          {
            "id": "fan_air_flow_ms",
            "name": "air_flow_ms",
            "label": "Volumetric Flow (m³/s)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Air_flow_m3h converted to m³/s",
            "order": 7,
            "readonly": true,
            "formula": "air_flow_m3h / 3600"
          }
        ]
      },
      {
        "id": "fan_selection",
        "title": "Fan Selection",
        "description": "Fan type, arrangement and performance point",
        "order": 3,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_type",
            "name": "fan_type",
            "label": "Fan Type",
            "type": "select",
            "options": [
              "plug_fan",
              "centrifugal_forward_curved",
              "centrifugal_backward_curved",
              "axial",
              "EC_plug_fan",
              "fan_wall_array"
            ],
            "required": true,
            "placeholder": "Select fan type",
            "help_text": "Type of fan used in this section",
            "order": 1
          },
          {
            "id": "fan_arrangement",
            "name": "fan_arrangement",
            "label": "Fan Arrangement",
            "type": "select",
            "options": [
              "single_fan",
              "dual_fans",
              "fan_wall_2x2",
              "fan_wall_3x2",
              "fan_wall_custom"
            ],
            "required": true,
            "placeholder": "Select arrangement",
            "help_text": "Single, twin or fan wall configuration",
            "order": 2
          },
          {
            "id": "fan_model_code",
            "name": "fan_model_code",
            "label": "Fan Model / Size",
            "type": "text",
            "required": false,
            "placeholder": "Enter fan model or size",
            "help_text": "Manufacturer code or size of the fan (e.g. 400-4-25)",
            "order": 3
          },
          {
            "id": "fan_speed_rpm",
            "name": "speed_rpm",
            "label": "Fan Speed (rpm)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 1450",
            "help_text": "Nominal fan rotational speed",
            "order": 4
          },
          {
            "id": "fan_efficiency_static_pct",
            "name": "efficiency_static_pct",
            "label": "Static Efficiency (%)",
            "type": "number",
            "required": false,
            "placeholder": "e.g. 70",
            "help_text": "Static efficiency at the operating point",
            "order": 5
          },
          {
            "id": "fan_efficiency_total_pct",
            "name": "efficiency_total_pct",
            "label": "Total Efficiency (%)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Total efficiency at the operating point (if given)",
            "order": 6
          },
          {
            "id": "fan_shaft_power_kw",
            "name": "shaft_power_kw",
            "label": "Fan Shaft Power (kW)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Calculated power at fan shaft (before motor/drive losses)",
            "order": 7,
            "readonly": true,
            "formula": "((air_flow_ms * total_pressure_pa) / 1000) / (efficiency_static_pct / 100)"
          }
        ]
      },
      {
        "id": "fan_motor_and_drive",
        "title": "Motor & Drive",
        "description": "Motor, drive and installed power details",
        "order": 4,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_motor_type",
            "name": "motor_type",
            "label": "Motor Type",
            "type": "select",
            "options": ["standard_AC", "EC_motor", "PM_motor"],
            "required": true,
            "placeholder": "Select motor type",
            "help_text": "Standard AC motor with VSD, EC motor, or permanent magnet motor",
            "order": 1
          },
          {
            "id": "fan_motor_efficiency_class",
            "name": "motor_efficiency_class",
            "label": "Motor Efficiency Class",
            "type": "select",
            "options": ["IE1", "IE2", "IE3", "IE4", "IE5"],
            "required": false,
            "placeholder": "Select motor IE class",
            "help_text": "Efficiency classification of the motor",
            "order": 2
          },
          {
            "id": "fan_motor_power_kw",
            "name": "motor_power_kw",
            "label": "Motor Rated Power (kW)",
            "type": "number",
            "required": true,
            "placeholder": "e.g. 5.5",
            "help_text": "Nameplate power rating of the motor",
            "order": 3
          },
          {
            "id": "fan_motor_voltage_v",
            "name": "motor_voltage_v",
            "label": "Motor Voltage (V)",
            "type": "select",
            "options": ["230", "400", "460", "575", "other"],
            "required": true,
            "placeholder": "Select voltage",
            "help_text": "Supply voltage of the fan motor",
            "order": 4
          },
          {
            "id": "fan_motor_frequency_hz",
            "name": "motor_frequency_hz",
            "label": "Motor Frequency (Hz)",
            "type": "select",
            "options": ["50", "60"],
            "required": true,
            "placeholder": "Select frequency",
            "help_text": "Supply frequency",
            "order": 5
          },
          {
            "id": "fan_drive_type",
            "name": "drive_type",
            "label": "Drive Type",
            "type": "select",
            "options": ["direct_drive", "belt_drive", "coupling"],
            "required": true,
            "placeholder": "Select drive type",
            "help_text": "Direct drive, belt drive, or coupling",
            "order": 6
          },
          {
            "id": "fan_belt_type",
            "name": "belt_type",
            "label": "Belt Type",
            "type": "text",
            "required": false,
            "placeholder": "e.g. SPA belt, 2x",
            "help_text": "If belt-driven, specify belt type and number of belts",
            "order": 7,
            "conditions": {
              "show_if": {
                "field": "drive_type",
                "operator": "equals",
                "value": "belt_drive"
              }
            }
          },
          {
            "id": "fan_installed_power_kw",
            "name": "installed_power_kw",
            "label": "Installed Power (kW)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "Installed power including safety margin",
            "order": 8,
            "readonly": true,
            "formula": "motor_power_kw"
          }
        ]
      },
      {
        "id": "fan_sound_data",
        "title": "Sound Data",
        "description": "Sound power levels and breakout/through levels if available",
        "order": 5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_sound_data_available",
            "name": "sound_data_available",
            "label": "Sound Data Available",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Check if octave band sound data is available",
            "order": 1
          },
          {
            "id": "fan_LwA_outlet_dB",
            "name": "LwA_outlet_dB",
            "label": "Outlet Sound Power LwA (dB)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "A-weighted sound power level at outlet",
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "sound_data_available",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "fan_LwA_inlet_dB",
            "name": "LwA_inlet_dB",
            "label": "Inlet Sound Power LwA (dB)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "A-weighted sound power level at inlet",
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "sound_data_available",
                "operator": "equals",
                "value": true
              }
            }
          },
          {
            "id": "fan_LwA_casing_dB",
            "name": "LwA_casing_dB",
            "label": "Casing Sound Power LwA (dB)",
            "type": "number",
            "required": false,
            "placeholder": "",
            "help_text": "A-weighted sound power level radiated through casing",
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "sound_data_available",
                "operator": "equals",
                "value": true
              }
            }
          }
        ]
      },
      {
        "id": "fan_construction",
        "title": "Construction & Arrangement",
        "description": "Mechanical construction details of the fan section",
        "order": 6,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_section_material",
            "name": "section_material",
            "label": "Section Material",
            "type": "select",
            "options": [
              "galvanized_steel_1_0",
              "galvanized_steel_1_25",
              "galvanized_steel_1_5",
              "stainless_steel_1_5",
              "aluminum"
            ],
            "required": true,
            "placeholder": "Select material",
            "help_text": "Material of the fan section casing",
            "order": 1
          },
          {
            "id": "fan_orientation",
            "name": "fan_orientation",
            "label": "Fan Orientation",
            "type": "select",
            "options": ["horizontal", "vertical"],
            "required": true,
            "placeholder": "Select orientation",
            "help_text": "Orientation of the fan shaft/impeller",
            "order": 2
          },
          {
            "id": "fan_access_side",
            "name": "access_side",
            "label": "Access Side",
            "type": "select",
            "options": ["left", "right", "top", "bottom", "front", "rear"],
            "required": true,
            "placeholder": "Select access side",
            "help_text": "Side from which the fan/motor is accessed",
            "order": 3
          },
          {
            "id": "fan_vibration_isolators",
            "name": "vibration_isolators",
            "label": "Vibration Isolators",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Check if spring or rubber vibration isolators are included",
            "order": 4
          },
          {
            "id": "fan_baseframe_included",
            "name": "baseframe_included",
            "label": "Baseframe Included",
            "type": "checkbox_single",
            "required": false,
            "placeholder": "",
            "help_text": "Check if common baseframe for fan and motor is included",
            "order": 5
          }
        ]
      },
      {
        "id": "fan_results_and_code",
        "title": "Fan Section Code & Summary",
        "description": "Generated code and summary text for the PDF",
        "order": 7,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_section_code",
            "name": "section_code",
            "label": "Fan Section Code",
            "type": "text",
            "required": false,
            "placeholder": "",
            "help_text": "Generated identification code for the fan section",
            "order": 1,
            "readonly": true,
            "formula": "\"FN-\" + flow_side + \"-\" + air_flow_m3h + \"m3h-\" + round(total_pressure_pa)"
          },
          {
            "id": "fan_summary_text",
            "name": "summary_text",
            "label": "Summary Text",
            "type": "textarea",
            "required": false,
            "placeholder": "Optional short summary for the PDF",
            "help_text": "Short sentence describing the fan selection (airflow, pressure, type, motor)",
            "order": 2
          }
        ]
      },
      {
        "id": "fan_group",
        "title": "Fan Section",
        "description": "Fan and Motor details",
        "order": 7.5,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_manufacturer",
            "name": "fan_manufacturer",
            "label": "Manufacturer",
            "type": "text",
            "required": false,
            "order": 1,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          },
          {
            "id": "fan_motor_power",
            "name": "fan_motor_power",
            "label": "Motor Power (kW)",
            "type": "number",
            "required": false,
            "order": 2,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          },
          {
            "id": "fan_rpm",
            "name": "fan_rpm",
            "label": "Blower RPM",
            "type": "number",
            "required": false,
            "order": 3,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          },
          {
            "id": "fan_static_pressure",
            "name": "fan_static_pressure",
            "label": "Static Pressure",
            "type": "number",
            "required": false,
            "order": 4,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          },
          {
            "id": "fan_quantity",
            "name": "fan_quantity",
            "label": "Blowers Quantity",
            "type": "number",
            "required": false,
            "order": 5,
            "conditions": {
              "show_if": {
                "field": "component_type",
                "operator": "equals",
                "value": "fan_section"
              }
            }
          }
        ]
      },
      {
        "id": "fan_additional_notes",
        "title": "Additional Notes",
        "description": "Free text notes/remarks to appear in the PDF",
        "order": 8,
        "conditions": {
          "show_if": {
            "field": "component_type",
            "operator": "equals",
            "value": "fan_section"
          }
        },
        "fields": [
          {
            "id": "fan_notes",
            "name": "notes",
            "label": "Additional Notes",
            "type": "textarea",
            "required": false,
            "placeholder": "Enter any additional notes or special requirements",
            "help_text": "Any remarks or specific instructions related to this fan section",
            "order": 1
          }
        ]
      }
    ]
  }
  