CONSOLIDATED STATEMENTS OF STOCKHOLDERS' EQUITY - USD ($) shares in Thousands, $ in Thousands | Common Stock | Retained Earnings | Accumulated Other Comprehensive Loss | Total |
Beginning balance at Dec. 31, 2022 | $ 675,174 | $ 480,773 | $ (11,550) | $ 1,144,397 |
Beginning balance (in shares) at Dec. 31, 2022 | 57,306 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 20,703 | | 20,703 |
Other comprehensive income (loss) | | | 621 | 621 |
Stock-based compensation expense | $ 3,498 | | | 3,498 |
Options exercised | $ 3,726 | | | 3,726 |
Options exercised (in shares) | 123 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 302 | | | 302 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 4 | | | |
Shares issued from time-vested restricted stock units (in shares) | 61 | | | |
Shares surrendered in exchange for payment of payroll tax liabilities | $ (1,592) | | | (1,592) |
Shares surrendered in exchange for payment of payroll tax liabilities (in shares) | (22) | | | |
Ending balance at Mar. 31, 2023 | $ 681,108 | 501,476 | (10,929) | 1,171,655 |
Ending balance (in shares) at Mar. 31, 2023 | 57,472 | | | |
Beginning balance at Dec. 31, 2022 | $ 675,174 | 480,773 | (11,550) | 1,144,397 |
Beginning balance (in shares) at Dec. 31, 2022 | 57,306 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | | | 66,782 |
Other comprehensive income (loss) | | | | (1,301) |
Shares surrendered in exchange for exercise of stock options | | | | (5,809) |
Ending balance at Sep. 30, 2023 | $ 695,181 | 547,555 | (12,851) | 1,229,885 |
Ending balance (in shares) at Sep. 30, 2023 | 57,746 | | | |
Beginning balance at Mar. 31, 2023 | $ 681,108 | 501,476 | (10,929) | 1,171,655 |
Beginning balance (in shares) at Mar. 31, 2023 | 57,472 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 20,245 | | 20,245 |
Other comprehensive income (loss) | | | 1,385 | 1,385 |
Stock-based compensation expense | $ 4,980 | | | 4,980 |
Options exercised | $ 5,154 | | | 5,154 |
Options exercised (in shares) | 128 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 281 | | | 281 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 4 | | | |
Shares issued from time-vested restricted stock units (in shares) | 30 | | | |
Ending balance at Jun. 30, 2023 | $ 691,523 | 521,721 | (9,544) | 1,203,700 |
Ending balance (in shares) at Jun. 30, 2023 | 57,634 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 25,834 | | 25,834 |
Other comprehensive income (loss) | | | (3,307) | (3,307) |
Stock-based compensation expense | $ 5,206 | | | 5,206 |
Options exercised | $ 7,555 | | | 7,555 |
Options exercised (in shares) | 247 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 237 | | | 237 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 4 | | | |
Shares surrendered in exchange for payment of payroll tax liabilities | $ (3,531) | | | (3,531) |
Shares surrendered in exchange for payment of payroll tax liabilities (in shares) | (53) | | | |
Shares surrendered in exchange for exercise of stock options | $ (5,809) | | | (5,809) |
Shares surrendered in exchange for exercise of stock options (in shares) | (86) | | | |
Ending balance at Sep. 30, 2023 | $ 695,181 | 547,555 | (12,851) | 1,229,885 |
Ending balance (in shares) at Sep. 30, 2023 | 57,746 | | | |
Beginning balance at Dec. 31, 2023 | $ 638,150 | 575,184 | (11,334) | $ 1,202,000 |
Beginning balance (in shares) at Dec. 31, 2023 | 57,858 | | | 57,858 |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 28,240 | | $ 28,240 |
Other comprehensive income (loss) | | | (1,122) | (1,122) |
Stock-based compensation expense | $ 4,934 | | | 4,934 |
Options exercised | $ 7,394 | | | 7,394 |
Options exercised (in shares) | 213 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 336 | | | 336 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 5 | | | |
Shares issued from time-vested restricted stock units (in shares) | 47 | | | |
Shares surrendered in exchange for payment of payroll tax liabilities | $ (1,592) | | | (1,592) |
Shares surrendered in exchange for payment of payroll tax liabilities (in shares) | (21) | | | |
Ending balance at Mar. 31, 2024 | $ 649,222 | 603,424 | (12,456) | 1,240,190 |
Ending balance (in shares) at Mar. 31, 2024 | 58,102 | | | |
Beginning balance at Dec. 31, 2023 | $ 638,150 | 575,184 | (11,334) | $ 1,202,000 |
Beginning balance (in shares) at Dec. 31, 2023 | 57,858 | | | 57,858 |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | | | $ 92,410 |
Other comprehensive income (loss) | | | | (2,061) |
Ending balance at Sep. 30, 2024 | $ 669,207 | 667,594 | (13,395) | $ 1,323,406 |
Ending balance (in shares) at Sep. 30, 2024 | 58,274 | | | 58,274 |
Beginning balance at Mar. 31, 2024 | $ 649,222 | 603,424 | (12,456) | $ 1,240,190 |
Beginning balance (in shares) at Mar. 31, 2024 | 58,102 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 35,726 | | 35,726 |
Other comprehensive income (loss) | | | (2,973) | (2,973) |
Stock-based compensation expense | $ 6,301 | | | 6,301 |
Options exercised | $ 2,913 | | | 2,913 |
Options exercised (in shares) | 66 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 288 | | | 288 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 4 | | | |
Shares issued from time-vested restricted stock units (in shares) | 20 | | | |
Ending balance at Jun. 30, 2024 | $ 658,724 | 639,150 | (15,429) | 1,282,445 |
Ending balance (in shares) at Jun. 30, 2024 | 58,192 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 28,444 | | 28,444 |
Other comprehensive income (loss) | | | 2,034 | 2,034 |
Stock-based compensation expense | $ 5,990 | | | 5,990 |
Options exercised | $ 4,247 | | | 4,247 |
Options exercised (in shares) | 80 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 246 | | | 246 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 2 | | | |
Ending balance at Sep. 30, 2024 | $ 669,207 | $ 667,594 | $ (13,395) | $ 1,323,406 |
Ending balance (in shares) at Sep. 30, 2024 | 58,274 | | | 58,274 |