Replace single vote button with up/down voting system:
- Users can upvote OR downvote (not both)
- Clicking same vote removes it, different vote changes it
- Items sorted by score (upvotes - downvotes) by default
- Score displayed with color coding (green/red/muted)
Also adds PDF/CSV export with jspdf and onSuccess callback
for add dialog refresh.
- Add parentId column to wishlist_comments for reply threading
- Create wishlist_comment_votes table for up/down voting
- Add deleteComment action (owner-only, cascades to replies)
- Add toggleCommentVote action with toggle behavior
- Update getItemWithComments to return nested CommentWithMeta
- Create CommentItem component with voting UI and reply support
- One level of reply depth enforced (can't reply to replies)
- add D1 database with drizzle ORM for wishlist data
- create wishlist items, votes, and comments tables
- implement server actions for CRUD, voting, comments
- add wishlist page with auth protection
- create components: stats, filters, item cards, add dialog, detail drawer
- add optimistic updates for voting
- update sidebar navigation with Infrastructure Wishlist link
- configure middleware to use WORKOS_REDIRECT_URI env var for local dev