for klondike to actually be a game, rather than just a card pusher, we need a few more abstractions; for me to like it, we also need some features like automatic snap-to-location.

given a click, we get a card and a location. we need to use one of these to figure out what the card can do. given the games we're thinking of, generally a card on a given pile can move to other piles. single card moves are always the top card; multi-card moves are always the top n cards.

klondike:

unseen deck
this deck is all cards face down; after dealing out the hand, all cards are placed here. Cards can only move from here to the play deck, three at a time (though some variants allow one at a time.)
play deck
cards that arrive here are flipped face up. only the top card may be played. It can be placed on top of any other card which has a value one higher and an opposite color (either suit).
play up piles
these piles begin empty; an ace can be placed on any empty square; any other card can only be placed on a card which has a value one lower and the exact same suit.
play down piles
these piles are dealt originally. If the top card is face down, it may be turned face up. If a pile is empty, it may have a king placed on it. Any top card can be moved either to a play up pile or onto another top card which has a value one lower and is of opposite color. Any group of the top n cards can be moved on top of any other card as long as the nth card has a value one lower and is of opposite color of the card the pile is landing on.

Algorithmically (let's come up with the notation as we go...)

unseen deck
click: if empty, flip play pile; else move three to play pile.
play deck
card: faceup; click: top moveable;
play up piles
card: if (suit == top suit) and (card - 1 == top card) accept; click:
play down piles
card: if (color != top color) and (card + 1 == top card) accept; click: flipped moveable;

current todo: