Commit Graph

582 Commits

Author SHA1 Message Date
chihlasm
e96c94efbd feat: add branching columns to ai_sessions, ai_session_steps, file_uploads
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 08:27:17 +00:00
chihlasm
c9798514a9 feat: add SessionResolutionOutput model and register all 4 branching models
Introduces the session_resolution_outputs table for the three resolve
deliverables (psa_ticket_notes, knowledge_base, client_summary) with
UNIQUE(session_id, output_type) for safe upsert on regeneration.
Also registers SessionBranch, ForkPoint, SessionHandoff, and
SessionResolutionOutput in models/__init__.py so Alembic and the app
pick them up automatically.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 08:23:48 +00:00
chihlasm
c72bf99dbd feat: add SessionHandoff model for conversational branching
Introduces the session_handoffs table as a unified park/escalate event
log with intent, snapshot, AI assessment, artifacts, and PSA push
tracking — replacing ad-hoc escalation_package writes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 08:23:42 +00:00
chihlasm
df8e589992 feat: add ForkPoint model for conversational branching
Introduces the fork_points table to capture decision points where a
FlowPilot session diverges into multiple diagnostic branches, storing
the trigger step, fork reason, and available options as JSONB.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 08:23:38 +00:00
chihlasm
9d037dc2c2 feat: add SessionBranch model for conversational branching
Introduces the session_branches table to represent diagnostic hypothesis
paths within a FlowPilot session, supporting parent/child branch
relationships, status lifecycle, and per-branch conversation history.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 08:23:34 +00:00
chihlasm
58c2a80d8a docs: add Conversational Branching implementation plan
27-task plan covering 6 phases: data foundation (4 models, migration),
branch engine (BranchManager, prompt builder, API), handoff system
(park/escalate with dual-write), resolution outputs (3-output generator),
AI description pipeline, and frontend (BranchMap, ForkCard, HandoffModal,
ResolutionOutputPanel, SessionQueuePage).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 08:15:19 +00:00
chihlasm
3309b6d1ce docs: fix 12 review issues in branching design spec
Critical fixes:
- _call_ai signature: return keys now match params (system_base, rag_context)
- Cross-branch context goes in rag_context (not system_base) to preserve caching
- HandoffManager builds own branch-aware snapshot (not reusing non-branch-aware fn)
- Added Integration Surface section: unified_chat_service + flowpilot_engine
  must check is_branching to avoid data divergence

Major fixes:
- active_branch_id: plain UUID, no FK (avoids circular FK)
- Resolution outputs: upsert on regeneration, not unique violation
- AI description pipeline: error handling + cost safeguards documented
- create_fork: pre-generates branch UUIDs for single-transaction insert

Minor fixes:
- status_changed_by FK target specified (users.id)
- Token budget: attachment descriptions inside cross-branch cap (4K combined)
- BranchAwarePromptBuilder: caller responsibility documented
- Removability: dual-write escalation_package shape divergence noted

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 07:46:39 +00:00
chihlasm
a9b2aadb9e docs: add Conversational Branching design spec
Full design for branching troubleshooting workspace — extends existing
infrastructure without replacing it. Additive tables, nullable columns,
dual-write backward compat. Removable if feature is pulled.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 07:41:25 +00:00
chihlasm
ff985fb755 refactor: replace cyan accent with ember orange across entire frontend
Swap accent color from cyan (#22d3ee) to ember orange (#f97316) site-wide.
Cyan caused contrast issues and felt generic — orange brings warmth and
urgency fitting for a troubleshooting tool.

Changes:
- CSS variables: accent, accent-hover, accent-dim, accent-text, primary, ring
- Warning color shifted from amber (#fbbf24) to yellow (#eab308) for
  semantic separation from orange accent
- Brand SVGs: logo gradient updated to orange
- 50+ component files: all hardcoded cyan hex values, Tailwind cyan-*
  classes, and rgba(34,211,238,...) glow values replaced
- landing.css: all 45+ cyan references + 5 old border color fixes
- DESIGN-SYSTEM.md bumped to v5 with decisions log
- CLAUDE.md: all color references synced to charcoal palette + orange accent
- PWA theme-color meta tag updated to match sidebar (#10121a)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 07:37:44 +00:00
chihlasm
13860ced33 docs: add lessons 94-98 to CLAUDE.md from image upload session
- 94: Frontend chat uses unified_chat_service (not assistant_chat)
- 95: Image upload → AI vision pipeline end-to-end flow
- 96: bg-accent is cyan — never use for code/kbd elements
- 97: Railway Object Storage bucket is provisioned
- 98: lazyWithRetry pattern for stale chunk errors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 06:03:03 +00:00
chihlasm
ba8dbefcd2 fix: improve inline code contrast in AI chat responses
bg-white/[0.08] was too subtle — text was unreadable against the dark
background. Bump to bg-white/[0.12] with a subtle border and
text-foreground for proper contrast.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 05:50:33 +00:00
chihlasm
c5bf0ad00e fix: replace bg-accent with neutral backgrounds on code/kbd elements
bg-accent maps to bright cyan (#22d3ee) in Tailwind v4 — wrong for
code elements and keyboard shortcut badges. This was a recurring issue
across the app where every backticked term glowed cyan.

- Code blocks: bg-accent → bg-code (#14161e)
- Inline code: bg-accent → bg-white/[0.08] (subtle neutral tint)
- Kbd badges: bg-accent → bg-white/[0.08]
- AI chat markdown: same fixes in MarkdownContent.tsx

Cyan remains reserved for interactive elements (buttons, active nav,
links) per the design system.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 05:45:58 +00:00
chihlasm
8e7f13d2f8 refactor: remove dead assistant_chat system, consolidate image helpers
The old /assistant/chats/* CRUD endpoints and assistant_chat_service
chat functions were unused — the frontend exclusively uses
/ai-sessions/{id}/chat (unified_chat_service) for all chat operations.

Removed:
- Chat CRUD endpoints (create, list, get, send, delete, conclude)
- assistant_chat_service: create_chat, send_message,
  generate_conclusion_summary, CONCLUSION_SYSTEM_PROMPT
- Frontend: assistantChatApi chat methods, dead types
  (AssistantChat, AssistantChatMessage, ConcludeChatRequest, etc.)

Kept:
- /assistant/retention endpoints (used by ChatRetentionSettingsPage)
- Shared AI infrastructure (_call_ai, _call_anthropic_cached,
  ASSISTANT_SYSTEM_PROMPT, _auto_title) — imported by unified_chat_service

Moved:
- fetch_upload_images + resize_image_for_vision → storage_service.py
  (shared location, not tied to dead endpoint)

Also added "Image Analysis" section to system prompt so Claude knows
to describe attached screenshots.

-650 lines of dead code removed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 05:28:06 +00:00
chihlasm
36ca830481 fix: wire image uploads into correct chat endpoint (unified_chat_service)
The frontend calls /ai-sessions/{id}/chat (unified_chat_service), not
/assistant/chats/{id}/messages (assistant_chat_service). The previous
commit wired images into the wrong backend. This fixes it:

- ai_session.py schema: add upload_ids to ChatMessageRequest
- ai_sessions.py endpoint: fetch images via _fetch_upload_images
- unified_chat_service: accept and forward images to _call_ai

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 05:02:34 +00:00
chihlasm
1c0f912cf6 perf: resize images server-side before sending to Claude vision
- Resize to 1568px max (Claude's efficient ceiling) via Pillow
- Convert PNG screenshots to JPEG q85 (~5MB → ~200KB typical)
- Cap at 3 images per message (~4,800 token budget max)
- Graceful fallback if Pillow unavailable (Claude auto-resizes)
- Add Pillow + libjpeg/zlib deps to requirements + Dockerfile

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 04:46:02 +00:00
chihlasm
3b682069d3 feat: wire image uploads into AI assistant chat (vision support)
- Backend: ChatMessageRequest accepts upload_ids, endpoint fetches
  images from S3, base64-encodes them, passes to Claude as multimodal
  content blocks (vision API)
- Backend: add download_file() to storage_service for fetching from S3
- Frontend: handleSend collects completed upload IDs from pendingUploads
  and includes them in the sendChatMessage API call
- Frontend: prefill handler passes upload IDs from dashboard nav state
- Enables paste-screenshot → AI-sees-it flow end-to-end

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 04:39:54 +00:00
chihlasm
48f2b3faaf fix: stale chunk auto-reload + image paste upload UX
- Add lazyWithRetry wrapper for all lazy-loaded routes to auto-reload
  on stale chunk errors after deploys (prevents ErrorBoundary flash)
- Show toast notification when image paste/upload fails due to storage
  not configured (503), instead of silent tiny error thumbnails
- Remove failed uploads from thumbnail strip on 503 (was showing
  confusing retry icon)
- Pass completed upload IDs in navigation state from dashboard input
- Suppress Sentry dialog for chunk load errors (deploy artifacts)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 04:21:41 +00:00
chihlasm
65eb630254 chore: migrate dev env to Traefik reverse proxy with HTTPS
Replace direct port exposure with Traefik labels for dev.resolutionflow.com
routing. Adds basic auth on frontend, TLS via Let's Encrypt, and updates
Vite allowedHosts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 02:13:47 +00:00
f397f5b002 Revert "fix(qa): ISSUE-001 — feedback panel bleeds on mobile due to Tailwind v4 translate"
This reverts commit fbf30f9c73.
2026-03-23 21:28:04 +00:00
fbf30f9c73 fix(qa): ISSUE-001 — feedback panel bleeds on mobile due to Tailwind v4 translate
Tailwind v4's translate-x-full uses the CSS `translate` property instead of
`transform: translateX()`. This caused the feedback panel to remain visually
visible on the right edge of the viewport. Switch to inline transform style
for reliable cross-browser behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 21:25:01 +00:00
96418c1c03 chore: add .gstack to gitignore, update dev env IP in docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 21:12:01 +00:00
5c78a4051a docs: update dev environment config and documentation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 20:51:39 +00:00
b414502062 feat: unified sessions — merge assistant chat into ai_sessions table
Add session_type ('guided'|'chat') and title columns to ai_sessions,
enabling both FlowPilot guided sessions and assistant chat sessions to
live in a single table. This is the foundation for a unified session
history and consistent UX across both interaction modes.

Backend:
- Migration 066: session_type + title columns
- unified_chat_service: chat sessions on ai_sessions with same AI/RAG
- POST /ai-sessions supports session_type='chat' creation
- POST /ai-sessions/{id}/chat for chat messages
- DELETE /ai-sessions/{id} for session deletion
- session_type filter on GET /ai-sessions

Frontend:
- AssistantChatPage rewired to aiSessionsApi (no more assistantChatApi)
- /assistant/:sessionId route for deep-linking
- Session history: type filter pills (All/Guided/Chat), type icons
- Dashboard: both types shown with correct routing and icons
- Fixed glass-border → border-default in dashboard components

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 17:29:25 +00:00
72678e7f26 feat: rich input for assistant chat — paste, drag-drop, attach, logs
Upgraded AssistantChatPage input from basic textarea to ChatGPT-style:
- Paste images (Ctrl+V) with thumbnail previews
- Drag-and-drop files with drop zone overlay
- Attach button for images, logs, docs, PDFs
- Expandable "Paste Logs" section for raw error output
- Conclude session button moved into toolbar row
- Auto-growing textarea
- Replaced all glass-border dividers with border-border/border-default

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 13:28:19 +00:00
73c529d6f3 feat: beta feedback widget — frictionless in-session feedback
Full-stack beta feedback system:

Backend:
- BetaFeedback model with reaction, category, text, page context
- POST /feedback/beta (any auth user), GET /feedback/beta (admin, filtered)
- Alembic migration 065 with indexes on user_id, reaction, created_at

Frontend:
- Persistent "Feedback" tab on right edge of all authenticated pages
- Slide-out panel: quick reaction (👍😐👎), category pills, optional text
- Auto-captures page URL and FlowPilot session ID
- Hidden on mobile (<640px), closes on Escape/outside click
- Shows "Thanks!" confirmation then auto-closes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 13:12:06 +00:00
03a1f104d2 docs: add lessons 92-93 — tsc -b strictness, header action bar pattern
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:55:31 +00:00
483653f5fc fix: remove unused props from FlowPilotSession after action bar removal
canResolve, canEscalate, onResolve, onEscalate, onPause, onAbandon are
now handled at the page level in FlowPilotSessionPage header. Remove
from component interface to fix TS6133 build errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:45:20 +00:00
0ec59276c7 refactor: move FlowPilot actions to header bar, fix dividers
- Moved Resolve/Escalate/Share Update buttons from fixed bottom bar into
  the session header. Desktop: inline buttons + overflow menu (Pause/Close).
  Mobile: single overflow menu with all actions.
- Removed FlowPilotActionBar from bottom — message input is now the only
  fixed element at bottom, giving more breathing room.
- Replaced jarring white dividers (var(--glass-border)) with subtle
  border-border (#2e3240) throughout FlowPilot session.
- Restyled status badge from button-looking element to dot + text indicator
  with semantic colors (green=resolved, amber=escalated).
- Reduced content padding from pb-32 to pb-24.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:41:28 +00:00
b118e158d4 feat: rich message bar in FlowPilot — paste, drag-drop, attach, logs
Upgraded FlowPilotMessageBar from basic textarea to ChatGPT-style input:
- Paste images (Ctrl+V) with thumbnail preview
- Drag-and-drop files with drop zone overlay
- Attach button (images, logs, docs, PDFs)
- Expandable "Paste Logs" section for raw error output
- Auto-growing textarea with focus ring
- Adjusted bottom offset for slimmer action bar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:25:37 +00:00
e205c44448 fix: FlowPilot action bar single-row layout on mobile
Action bar was flex-col on mobile, creating two rows that covered the
message input. Now a single horizontal row on all screen sizes — Resolve
and Escalate always show labels, secondary actions (Pause, Close, Update)
show icon-only on mobile.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:09:05 +00:00
701ae7c7e7 fix: assistant chat mobile layout — sidebar hidden, slide-out toggle
Chat sidebar was rendering side-by-side on mobile causing squished layout.
Now hidden on mobile with a "Chats" toggle button + "+ New" in a compact
header bar. Sidebar slides out as an overlay on mobile, auto-closes on
chat selection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 09:34:45 +00:00
778a172f4e fix: resolve TypeScript build errors in StatusUpdateModal and FlowPilotSessionPage
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 06:43:54 +00:00
7eaeb660dd fix: dashboard and omnibar route to /assistant chat, not /pilot guided flow
Aligns with copilot-first GTM direction — the dashboard chat input and
CommandPalette "Troubleshoot with FlowPilot" now launch the conversational
AI chat (/assistant), not the structured diagnostic flow (/pilot). Guided
flows remain accessible from the sidebar "Flows" section.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 06:36:51 +00:00
fab25456a5 feat: mid-session status updates — ticket notes, client updates, email drafts
Engineers can now generate AI-powered status updates during active FlowPilot
sessions and after resolve/escalate. Three audiences (Ticket Notes, Client
Update, Email Draft) with Quick/Detailed length options. Copy to clipboard
with one click. Client names auto-inserted from intake/PSA context.

Backend: new endpoint POST /ai-sessions/{id}/status-update with audience-aware
system prompts. Frontend: StatusUpdateModal with 2-step selection flow,
Share Update button in action bar, Share Resolution/Escalation on completed
sessions. Also updates Solutions Library spec with Community tier design.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 06:26:32 +00:00
0d78410dea fix: mobile landing page text overflow clipping
Reduce section/card padding on mobile, allow mock node and chat text to
wrap, and add flex-wrap to the brand equation so nothing overflows the
viewport edge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 06:08:35 +00:00
a40c9b561e docs: update CLAUDE.md and CURRENT-STATE.md for copilot-first redesign
- Update phase to GTM Validation, reflect copilot-first dashboard
- Add charcoal palette, sidebar restructure, Solutions Library rename
- Update recently completed, in progress, and what's next sections
- Add lessons 88-91 (charcoal palette, QuickLaunch removal, copilot-first, amber button)
- Fix outdated references (Slate & Ice → Charcoal, Step Library → Solutions Library)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 05:21:41 +00:00
8ca36316c4 refactor: merge QuickLaunch into CommandPalette, amber New Session button
- Remove QuickLaunch (lightning bolt) from TopBar — redundant with CommandPalette
- Delete QuickLaunch.tsx (dead code, no remaining imports)
- Add "New Project" to CommandPalette quick actions
- Change sidebar "New Session" button from cyan to amber-400

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 05:06:44 +00:00
961a95c20f fix: fully remove maintenance flow references from TreeLibraryPage
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:48:23 +00:00
6b449c4f69 fix: remove unused imports breaking Railway build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:41:44 +00:00
4b0097a9e2 fix: hero copy "Fix tickets" → "Resolve tickets"
Matches MSP terminology and the product name (ResolutionFlow).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:37:32 +00:00
20d60bf83d refactor: landing page copy — copilot-first messaging
Rewrite landing page to lead with speed + auto-documentation:
- Hero: "Fix tickets faster. Notes write themselves."
- App preview: shows FlowPilot chat conversation, not decision tree editor
- How It Works: Describe → Troubleshoot Together → Resolve & Document
- Features: FlowPilot copilot first, "Zero Empty Ticket Notes", team knowledge
- CTA: "Never write ticket notes again"
- Sidebar preview updated to match new nav (FlowPilot, History, Flows, Scripts)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:32:01 +00:00
ceb1423b6a fix: command palette section labels amber + item hover borders
Section labels now use amber (#fbbf24) mono font matching sidebar
drawer style. Items show border highlight on hover/selection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:22:55 +00:00
0a4185a00d fix: command palette hover contrast + FlowPilot routing
- Hover state uses bg-card-hover + text-foreground for readable contrast
- FlowPilot item navigates to /pilot (copilot) instead of /assistant
- Rename "Ask FlowPilot AI" → "Troubleshoot with FlowPilot"
- Update placeholder to hint at troubleshooting capability

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:20:23 +00:00
99e53f5d70 refactor: rename Step Library → Solutions Library site-wide
User-facing text updated across page title, sidebar, command palette,
quick launch, quick actions, post-step modal, empty state, and
procedural editor. File paths/component names unchanged — those
will be renamed when the full Solutions Library feature ships.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:09:19 +00:00
590d1ad1cb refactor: onboarding, mobile nav, remove maintenance flows
- Onboarding steps guide toward copilot usage, not flow building
- Mobile nav updated to match sidebar (Session History, Guided Flows)
- Remove Step Library from mobile nav
- Remove Maintenance from flow type filter tabs
- Remove Maintenance badge from all tree views (grid, list, table)
- Remove Maintenance create option from CreateFlowDropdown
- Add copilot-first dashboard plan and solutions library spec docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 04:00:52 +00:00
ee606643d5 refactor: simplify sidebar for copilot-first navigation
- Add "New Session" button at top of rail and pinned mode
- Replace Work → History, Know → Flows, add Scripts as own icon
- Remove Help/Guides/Feedback from sidebar rail
- Remove Maintenance from flow sub-items
- Remove Step Library from pinned Knowledge section
- Remove FlowPilot Analytics and Rocket icon
- Rename "Active Sessions" → "Session History"
- Rename "Flows" → "Guided Flows" in pinned mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 03:58:14 +00:00
36be22e407 feat: copilot-first dashboard — chat-style input with file support
Redesign dashboard as copilot-first experience:
- Large auto-growing textarea with paste/drag-drop file support
- Attach button for native file picker (images, logs, docs)
- Paste Logs expandable textarea for raw error output
- Suggestion chips for common issues (VPN, Outlook, lockout, etc.)
- Remove Guided/Chat toggle — copilot is always the default
- Collapsible Dashboard section for stats/KB/team summary
- Centered layout with "What are you troubleshooting?" hero

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 03:56:37 +00:00
6e01a4d04b fix: fade-in animation no longer blocks hover transforms
The fadeIn keyframe included transform: translateY(0) with
fill-mode: forwards, which permanently overrode hover translateY
transitions. Replaced with opacity-only animation so card bounce
hover works correctly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 23:11:17 +00:00
40044a6a9c fix: add cursor pointer to all buttons and interactive cards
Buttons and [role="button"] elements now show pointer cursor globally.
card-interactive utility also sets cursor: pointer explicitly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 23:07:07 +00:00
25241e5351 feat: spring bounce hover animation on dashboard cards
card-interactive utility now bounces on hover (translateY(-4px) with
cubic-bezier(0.34, 1.56, 0.64, 1) spring easing). Applies to stat
cards, session items, and onboarding checklist. Knowledge Base and
Team Summary inner items also bounce individually.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 23:03:12 +00:00