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, 2021 | $ 641,533 | $ 406,257 | $ (7,991) | $ 1,039,799 |
Beginning balance (in shares) at Dec. 31, 2021 | 56,570 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 10,545 | | 10,545 |
Other comprehensive income (loss) | | | 1,338 | 1,338 |
Stock-based compensation expense | $ 4,212 | | | 4,212 |
Options exercised | $ 1,320 | | | 1,320 |
Options exercised (in shares) | 52 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 320 | | | 320 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 5 | | | |
Shares issued from time-vested restricted stock units (in shares) | 44 | | | |
Shares surrendered in exchange for payment of payroll tax liabilities | $ (1,015) | | | (1,015) |
Shares surrendered in exchange for payment of payroll tax liabilities (in shares) | (16) | | | |
Ending balance at Mar. 31, 2022 | $ 646,370 | 416,802 | (6,653) | 1,056,519 |
Ending balance (in shares) at Mar. 31, 2022 | 56,655 | | | |
Beginning balance at Dec. 31, 2021 | $ 641,533 | 406,257 | (7,991) | 1,039,799 |
Beginning balance (in shares) at Dec. 31, 2021 | 56,570 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | | | 41,115 |
Other comprehensive income (loss) | | | | (8,738) |
Shares surrendered in exchange for exercise of stock options | | | | (898) |
Ending balance at Sep. 30, 2022 | $ 658,198 | 447,372 | (16,729) | 1,088,841 |
Ending balance (in shares) at Sep. 30, 2022 | 56,918 | | | |
Beginning balance at Mar. 31, 2022 | $ 646,370 | 416,802 | (6,653) | 1,056,519 |
Beginning balance (in shares) at Mar. 31, 2022 | 56,655 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 15,298 | | 15,298 |
Other comprehensive income (loss) | | | (4,066) | (4,066) |
Stock-based compensation expense | $ 3,952 | | | 3,952 |
Options exercised | $ 1,303 | | | 1,303 |
Options exercised (in shares) | 58 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 301 | | | 301 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 6 | | | |
Shares issued from time-vested restricted stock units (in shares) | 26 | | | |
Ending balance at Jun. 30, 2022 | $ 651,926 | 432,100 | (10,719) | 1,073,307 |
Ending balance (in shares) at Jun. 30, 2022 | 56,745 | | | |
Increase (Decrease) in Stockholders' Equity [Roll Forward] | | | | |
Net income | | 15,272 | | 15,272 |
Other comprehensive income (loss) | | | (6,010) | (6,010) |
Stock-based compensation expense | $ 3,893 | | | 3,893 |
Options exercised | $ 4,141 | | | 4,141 |
Options exercised (in shares) | 201 | | | |
Issuance of common stock under Employee Stock Purchase Plan | $ 246 | | | 246 |
Issuance of common stock under Employee Stock Purchase Plan (in shares) | 5 | | | |
Shares surrendered in exchange for payment of payroll tax liabilities | $ (1,110) | | | (1,110) |
Shares surrendered in exchange for payment of payroll tax liabilities (in shares) | (18) | | | |
Shares surrendered in exchange for exercise of stock options | $ (898) | | | (898) |
Shares surrendered in exchange for exercise of stock options (in shares) | (15) | | | |
Ending balance at Sep. 30, 2022 | $ 658,198 | 447,372 | (16,729) | 1,088,841 |
Ending balance (in shares) at Sep. 30, 2022 | 56,918 | | | |
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 | | | 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 | | | 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 | | | 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 | | | 57,746 |