Great implementation of the game! The color contrast makes it very easy to read the board. And, of course, the game plays very smoothly.
In your implementation, the algorithm for automatically discarding numbered cards is a little too conservative. One example I encountered is a fresh game state with 1-green and 2-green exposed. The game should auto-discard 1-green and 2-green (instead of just the 1-green). The idea (as you might already know) is that there's no point in keeping the 2-green on the board because all 1s can be discarded.
I think the algorithm to handle this properly in all cases is quite tricky, and it's not really a problem at all if the player knows about this heuristic. In any case, I really enjoyed the game :)