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 | |