v3.26.1
Revenue from Contracts with Customers - Narrative (Details) - USD ($)
$ / shares in Units, $ in Thousands
3 Months Ended 6 Months Ended
Jun. 30, 2026
Jun. 30, 2025
Jun. 30, 2026
Jun. 30, 2025
Dec. 31, 2025
Revenue from Contract with Customer [Abstract]          
Unexecuted change orders $ 36,000   $ 36,000   $ 69,900
Loss provision 2,119   2,119   1,965
Claim position 38,300   38,300   25,800
Remaining outstanding billings on large project 31,300   31,300    
Net increase in revenues from performance obligations satisfied in prior periods 75,700 $ 49,100 115,200 $ 73,600  
Positive net impact on net income from previous performance obligations $ 56,100 $ 35,900 $ 85,400 $ 53,800  
Positive net impact on diluted earnings per share from previous performance obligations (in dollars per share) $ 1.09 $ 0.70 $ 1.67 $ 1.05  
Increase in gross profit $ 47,000 $ 19,600 $ 72,300 $ 36,600  
Increase in net income $ 34,800 $ 14,400 $ 53,500 $ 26,800  
Increase in diluted earnings per share (in dollars per share) $ 0.68 $ 0.28 $ 1.05 $ 0.52  
Contract with customer, liability, revenue recognized $ 42,900 $ 34,800 $ 269,000 $ 177,600  
Remaining performance obligation $ 3,950,000   $ 3,950,000   $ 2,800,000