| Stock-Based Compensation (Tables)
 | 12 Months Ended | 
| Dec. 31, 2020 | 
|---|
| Share-based Payment Arrangement [Abstract] |  | 
| Schedule of Stock-Based Compensation Expense | Stock-based compensation expense consisted of the following:  
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
|  |  | Year Ended December 31, |  
| (in thousands) |  | 2020 |  | 2019 |  | 2018 |  
| Cost of sales |  | $ | 303 |  |  | $ | 278 |  |  | $ | 250 |  |  
| SG&A expense |  | 17,475 |  |  | 17,554 |  |  | 14,041 |  |  
| Pre-tax stock-based compensation expense |  | 17,778 |  |  | 17,832 |  |  | 14,291 |  |  
| Income tax benefits |  | (4,015) |  |  | (4,009) |  |  | (3,218) |  |  
| Total stock-based compensation expense, net of tax |  | $ | 13,763 |  |  | $ | 13,823 |  |  | $ | 11,073 |  |  | 
| Schedule of Weighted Average Assumptions | 
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
|  |  | Year Ended December 31, |  
|  |  | 2020 |  | 2019 |  | 2018 |  
| Expected option term |  | 4.39 years |  | 4.50 years |  | 4.50 years |  
| Expected stock price volatility |  | 21.19% |  | 27.14% |  | 28.39% |  
| Risk-free interest rate |  | 1.14% |  | 2.49% |  | 2.47% |  
| Expected annual dividend yield |  | 1.13% |  | 1.03% |  | 1.15% |  
| Weighted average grant date fair value per share |  | $14.67 |  | $22.51 |  | $18.86 |  | 
| Summary of Stock Option Activity | The following table summarizes stock option activity under the Plan: 
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
|  |  | Number of Shares
 |  | Weighted Average
 Exercise
 Price
 |  | Weighted Average Remaining Contractual Life |  | 
Aggregate Intrinsic Value (1) 
 (in thousands) |  
| Options outstanding at January 1, 2018 |  | 1,769,887 |  |  | $ | 44.22 |  |  | 6.69 |  | $ | 48,962 |  |  
| Granted |  | 402,010 |  |  | 76.48 |  |  |  |  |  |  
| Cancelled |  | (67,440) |  |  | 60.75 |  |  |  |  |  |  
| Exercised |  | (499,836) |  |  | 36.98 |  |  |  |  |  |  
| Options outstanding at December 31, 2018 |  | 1,604,621 |  |  | 53.86 |  |  | 6.95 |  | 48,703 |  |  
| Granted |  | 395,653 |  |  | 93.98 |  |  |  |  |  |  
| Cancelled |  | (68,275) |  |  | 74.10 |  |  |  |  |  |  
| Exercised |  | (452,325) |  |  | 43.76 |  |  |  |  |  |  
| Options outstanding at December 31, 2019 |  | 1,479,674 |  |  | 66.74 |  |  | 7.11 |  | 49,930 |  |  
| Granted |  | 660,071 |  |  | 87.25 |  |  |  |  |  |  
| Cancelled |  | (78,163) |  |  | 83.76 |  |  |  |  |  |  
| Exercised |  | (142,419) |  |  | 48.58 |  |  |  |  |  |  
| Options outstanding at December 31, 2020 |  | 1,919,163 |  |  | $ | 74.45 |  |  | 7.19 |  | $ | 29,489 |  |  
| Options vested and expected to vest at December 31, 2020 |  | 1,839,590 |  |  | $ | 73.88 |  |  | 7.12 |  | $ | 29,185 |  |  
| Options exercisable at December 31, 2020 |  | 806,320 |  |  | $ | 60.31 |  |  | 5.53 |  | $ | 22,620 |  |  | 
| Schedule Of Weighted Average Assumptions for Restricted Stock Units | The weighted average assumptions for restricted stock units granted and resulting fair value are as follows: 
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
|  |  | Year Ended December 31, |  
|  |  | 2020 |  | 2019 |  | 2018 |  
| Vesting period |  | 3.79 years |  | 3.76 years |  | 3.77 years |  
| Expected annual dividend yield |  | 1.18% |  | 0.97% |  | 1.15% |  
| Weighted average grant date fair value per restricted stock unit granted |  | $78.90 |  | $94.58 |  | $73.74 |  | 
| Summary of Restricted Stock Unit Activity | The following table summarizes the restricted stock unit activity under the Plan: 
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
|  |  | 
Number of 
 Shares |  | 
Weighted Average 
 
Grant Date Fair Value Per Share 
 |  
| Restricted stock units outstanding at January 1, 2018 |  | 449,475 |  |  | $ | 52.07 |  |  
| Granted |  | 197,299 |  |  | 73.74 |  |  
| 
Vested(1)
 |  | (155,847) |  |  | 50.97 |  |  
| Forfeited |  | (66,926) |  |  | 53.19 |  |  
| Restricted stock units outstanding at December 31, 2018 |  | 424,001 |  |  | 62.38 |  |  
| Granted |  | 177,618 |  |  | 94.58 |  |  
| 
Vested(1)
 |  | (163,195) |  |  | 60.45 |  |  
| Forfeited |  | (33,320) |  |  | 72.35 |  |  
| Restricted stock units outstanding at December 31, 2019 |  | 405,104 |  |  | 76.45 |  |  
| Granted |  | 216,318 |  |  | 78.90 |  |  
| 
Vested(1)
 |  | (160,229) |  |  | 68.72 |  |  
| Forfeited |  | (35,918) |  |  | 79.36 |  |  
| Restricted stock units outstanding at December 31, 2020 |  | 425,275 |  |  | $ | 80.37 |  |  |