free events with optional donations
You can do this with Webform CiviCRM module! I whipped up some screenshots for you to show you how. Participant Fee is entirely by Donation in this case. I registered twice: once leaving the Participant Fee at $0 and once deciding to donate $40 (in which case the user gets prompted to enter credit card details; in the $0 of course they don't).