v3.26.1
Revenue from Contracts with Customers - Narrative (Details) - USD ($)
$ / shares in Units, $ in Thousands
3 Months Ended
Mar. 31, 2026
Mar. 31, 2025
Dec. 31, 2025
Revenue from Contract with Customer [Abstract]      
Unexecuted change orders $ 44,800   $ 69,900
Loss provision 1,593   1,965
Claim position 38,300   25,800
Remaining outstanding billings on large project 31,300    
Net increase in revenues from performance obligations satisfied in prior periods 55,900 $ 38,100  
Positive net impact on net income from previous performance obligations $ 41,500 $ 27,800  
Positive net impact on diluted earnings per share from previous performance obligations (in dollars per share) $ 0.81 $ 0.54  
Increase in gross profit $ 17,600 $ 16,800  
Increase in net income $ 13,100 $ 12,200  
Increase in diluted earnings per share (in dollars per share) $ 0.26 $ 0.24  
Contract with customer, liability, revenue recognized $ 226,100 $ 142,800  
Remaining performance obligation $ 3,090,000   $ 2,800,000