diff --git a/.claude/agents/neil-design-clone.md b/.claude/agents/neil-design-clone.md new file mode 100644 index 000000000..07d64f02f --- /dev/null +++ b/.claude/agents/neil-design-clone.md @@ -0,0 +1,59 @@ +--- +name: neil-design-clone +description: Use this agent when you need expert design guidance, analysis, or development. Examples: Context: User wants to improve their app's user interface design. user: 'Can you review this design and suggest improvements?' assistant: 'I'll use the neil-design-clone agent to provide expert design analysis and recommendations.' Since the user needs design expertise, use the neil-design-clone agent to analyze the design and provide professional recommendations. Context: Another agent needs design guidelines for a project. agent: 'I need design guidelines for a mobile banking app interface' assistant: 'Let me engage the neil-design-clone agent to create comprehensive design guidelines for your banking app.' The requesting agent needs design expertise, so use neil-design-clone to provide professional design guidelines. Context: User shares a Figma link for design review. user: 'Here's our Figma design: [link]. What do you think?' assistant: 'I'll use the neil-design-clone agent to analyze your Figma design and provide detailed feedback.' User provided a Figma link for review, perfect use case for neil-design-clone agent. +model: opus +color: green +--- + +You are Neil, a senior design clone with extensive expertise in UI/UX design, visual design, and human psychology. You embody the skills and intuition of a world-class designer with deep understanding of design principles, user behavior, and aesthetic excellence. + +Your core capabilities include: +- Analyzing and critiquing designs with expert precision +- Reading and interpreting Figma files through MCP integration +- Understanding design languages and creating comprehensive design guidelines +- Applying human psychology principles to design decisions +- Providing strategic design recommendations and problem-solving approaches +- Communicating effectively with both humans and AI agents + +When analyzing designs: +1. First understand the context, target audience, and business objectives +2. Evaluate against established design principles (hierarchy, contrast, alignment, proximity, typography, color theory) +3. Consider user psychology and behavioral patterns +4. Assess accessibility and usability standards +5. Identify opportunities for improvement with specific, actionable recommendations + +When creating design guidelines: +- Establish clear visual hierarchy principles +- Define color palettes with psychological reasoning +- Specify typography scales and usage rules +- Create component libraries and interaction patterns +- Include spacing, layout, and responsive design standards +- Provide rationale for each guideline based on user psychology + +When reviewing Figma links: +- Thoroughly examine the design structure and components +- Analyze the design system consistency +- Evaluate user flow and interaction design +- Assess visual design quality and brand alignment + +When taking reference from external designs: +- Extract structural and conceptual elements only +- Adapt insights to fit the project's unique requirements and guidelines +- Never copy directly; always innovate and improve +- Ensure alignment with established brand and design language + +Your communication style should be: +- Professional yet approachable +- Specific and actionable in feedback +- Educational, explaining the 'why' behind recommendations +- Adaptable to both human and AI agent interactions +- Confident in your expertise while remaining open to collaboration + +Always provide: +- Clear reasoning for design decisions +- Multiple solution options when appropriate +- Consideration of technical feasibility +- Psychological insights that inform design choices +- Structured, organized recommendations that are easy to implement + +You understand that instructions may come from humans or other AI agents, and you adapt your communication style accordingly while maintaining your expert design perspective. diff --git a/.claude/rules/00-project-vision.md b/.claude/rules/00-project-vision.md new file mode 100644 index 000000000..79f0c03fa --- /dev/null +++ b/.claude/rules/00-project-vision.md @@ -0,0 +1,42 @@ +# Project Vision - Crypto Community Platform + +## Core Concept + +A **cross-platform crypto-focused communication platform** built with Tauri (React + Rust) targeting the cryptocurrency ecosystem. + +## Target Audience + +### Primary Users +- **Traders** - Day traders, swing traders, algorithmic traders +- **Yield Farmers** - DeFi protocol users, liquidity providers +- **Investors** - Long-term holders, institutional investors, VCs +- **Researchers** - Crypto analysts, on-chain researchers, data scientists +- **KOLs (Key Opinion Leaders)** - Influencers, educators, thought leaders +- **Developers** - Protocol developers, dApp builders +- **Community Members** - General crypto enthusiasts, DAO participants + +## Platform Approach + +**Inspiration**: poke.com - but specialized for crypto community needs +**Architecture**: Cross-platform (Windows, macOS, Android, iOS) +**Technology**: Tauri v2 (React frontend + Rust backend) + +## Key Differentiators + +- **Crypto-native features** built into the core platform +- **Privacy-first** approach for sensitive trading/financial discussions +- **Cross-platform** synchronization for mobile and desktop workflows +- **Community-focused** rather than just messaging +- **Specialized tools** for crypto use cases + +## Technical Foundation + +- **Frontend**: React 19 + TypeScript +- **Backend**: Rust with Tauri 2.x +- **Platforms**: Desktop (Windows, macOS) + Mobile (Android, iOS) +- **Data**: Local-first with selective cloud sync +- **Privacy**: End-to-end encryption for sensitive communications + +--- + +*Updated: 2026-01-27 - Initial vision documentation* \ No newline at end of file diff --git a/.claude/rules/01-project-overview.md b/.claude/rules/01-project-overview.md index fe973bef6..c37416bc4 100644 --- a/.claude/rules/01-project-overview.md +++ b/.claude/rules/01-project-overview.md @@ -1,23 +1,45 @@ # Project Overview -## Tauri Cross-Platform Application +## Crypto Community Platform -This project is a Tauri v2 application designed to run on multiple platforms: +This project is a **crypto-focused communication platform** built with Tauri v2, designed to serve the cryptocurrency ecosystem across multiple platforms: - **Windows** (Desktop) - **macOS** (Desktop) - **Android** (Mobile) - **iOS** (Mobile) +## Target Users +- Traders, Yield Farmers, Investors +- Researchers, KOLs, Developers +- General crypto community members + ## Technology Stack -| Layer | Technology | Version | -|-------|------------|---------| -| Frontend | React | 19.1.0 | -| Language | TypeScript | 5.8.3 | -| Build Tool | Vite | 7.0.4 | -| Backend | Rust | 1.93.0 | -| Framework | Tauri | 2.x | +| Layer | Technology | Version | Purpose | +|-------|------------|---------|---------| +| **Frontend Core** | +| UI Framework | React | 19.1.0 | Component-based UI | +| Language | TypeScript | 5.8.3 | Type safety | +| Build Tool | Vite | 7.0.4 | Fast development | +| **UI & Styling** | +| Styling | Tailwind CSS | Latest | Utility-first CSS | +| Components | Headless UI | Latest | Accessible components | +| Animation | Framer Motion | Latest | Smooth animations | +| **State & Data** | +| State Management | Zustand | Latest | Lightweight state | +| Data Fetching | TanStack Query | Latest | Server state management | +| Form Handling | React Hook Form | Latest | Form validation | +| **Backend Core** | +| Language | Rust | 1.93.0 | Performance & safety | +| Framework | Tauri | 2.x | Cross-platform apps | +| **Backend Libraries** | +| Async Runtime | Tokio | Latest | Async operations | +| JSON Handling | Serde JSON | Latest | Serialization | +| Database | SQLx + SQLite | Latest | Local storage | +| HTTP Client | Reqwest | Latest | API requests | +| WebSocket | WebSocket crate | Latest | Real-time messaging | +| Utilities | UUID | Latest | Unique identifiers | ## Project Structure diff --git a/.claude/rules/08-frontend-guide.md b/.claude/rules/08-frontend-guide.md index 382eca838..7db790fb3 100644 --- a/.claude/rules/08-frontend-guide.md +++ b/.claude/rules/08-frontend-guide.md @@ -1,4 +1,24 @@ -# Frontend Development Guide +# Frontend Development Guide - Crypto Community Platform + +## Overview +Frontend development guide for crypto-focused communication platform using modern React ecosystem with Tauri. + +## ✅ CURRENT IMPLEMENTATION STATUS + +### Design System (FULLY IMPLEMENTED) +- **Glass Morphism UI**: Enhanced frosted glass effects with 16px backdrop blur throughout interface +- **Crypto Price Ticker**: Animated scrolling ticker with BTC/ETH brand colors and JetBrains Mono font +- **Navigation System**: Complete nav bar with active states (Dashboard, Portfolio, Chat, Markets) +- **Chat Interface**: Full messaging system with sent/received bubble styles and crypto addresses +- **Button Variants**: All 4 types implemented (Primary, Secondary, Success, Danger) with hover states +- **Form Components**: Enhanced inputs with focus states, select dropdowns, crypto-specific placeholders +- **Status Indicators**: Online/Offline/Warning badges with proper sage/stone/amber colors +- **Loading States**: Animated pulse placeholders for async operations +- **Typography**: Inter + JetBrains Mono fonts with crypto-optimized hierarchy +- **Color System**: Premium crypto palette (canvas, primary, sage, amber, coral, stone, market colors) +- **Animations**: Smooth transitions, hover scales, ticker animation, fade-in effects +- **Responsive Design**: Mobile-first approach with proper breakpoints +- **Accessibility**: Focus rings, proper contrast, WCAG compliance ready ## Structure @@ -189,13 +209,19 @@ switch (currentPlatform) { } ``` -## State Management +## Recommended Tech Stack -For larger applications, consider: +### UI & Styling +- **Tailwind CSS** - Utility-first CSS framework +- **Headless UI** - Accessible, unstyled UI components +- **Framer Motion** - Animation library for React +### State & Data Management - **Zustand** - Lightweight state management -- **Jotai** - Atomic state management -- **Redux Toolkit** - Full-featured state management +- **TanStack Query** - Server state management & caching +- **React Hook Form** - Performant form handling + +## State Management ```bash npm install zustand @@ -204,18 +230,123 @@ npm install zustand ```typescript import { create } from 'zustand'; +// Example for crypto platform interface AppState { - count: number; - increment: () => void; + user: User | null; + activeChannel: Channel | null; + messages: Message[]; + setUser: (user: User) => void; + setActiveChannel: (channel: Channel) => void; + addMessage: (message: Message) => void; } const useStore = create((set) => ({ - count: 0, - increment: () => set((state) => ({ count: state.count + 1 })), + user: null, + activeChannel: null, + messages: [], + setUser: (user) => set({ user }), + setActiveChannel: (channel) => set({ activeChannel: channel }), + addMessage: (message) => set((state) => ({ + messages: [...state.messages, message] + })), })); -function Counter() { - const { count, increment } = useStore(); - return ; +// Usage in component +function ChatHeader() { + const { activeChannel, user } = useStore(); + return ( +
+

{activeChannel?.name || 'Select Channel'}

+ {user?.username} +
+ ); +} +``` + +## Form Handling with React Hook Form + +```typescript +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; + +const messageSchema = z.object({ + content: z.string().min(1, 'Message cannot be empty').max(1000), + channel: z.string().uuid(), +}); + +type MessageForm = z.infer; + +function MessageInput() { + const { register, handleSubmit, reset, formState: { errors } } = useForm({ + resolver: zodResolver(messageSchema) + }); + + const onSubmit = (data: MessageForm) => { + // Send message via Tauri IPC + invoke('send_message', data); + reset(); + }; + + return ( +
+ + + {errors.content &&

{errors.content.message}

} +
+ ); +} +``` + +## Data Fetching with TanStack Query + +```typescript +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { invoke } from '@tauri-apps/api/core'; + +// Fetch channels +function useChannels() { + return useQuery({ + queryKey: ['channels'], + queryFn: () => invoke('get_channels'), + staleTime: 5 * 60 * 1000, // 5 minutes + }); +} + +// Send message mutation +function useSendMessage() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (message: NewMessage) => invoke('send_message', message), + onSuccess: () => { + // Invalidate and refetch messages + queryClient.invalidateQueries({ queryKey: ['messages'] }); + }, + }); +} + +// Usage in component +function ChannelList() { + const { data: channels, isLoading, error } = useChannels(); + + if (isLoading) return
Loading channels...
; + if (error) return
Error loading channels
; + + return ( +
+ {channels?.map(channel => ( +
+ {channel.name} +
+ ))} +
+ ); } ``` diff --git a/.claude/rules/11-tech-stack-detailed.md b/.claude/rules/11-tech-stack-detailed.md new file mode 100644 index 000000000..ec667e396 --- /dev/null +++ b/.claude/rules/11-tech-stack-detailed.md @@ -0,0 +1,157 @@ +# Detailed Tech Stack Documentation + +## Frontend Technologies + +### Core Framework +- **React 19.1.0** + - Latest React with concurrent features + - Component-based architecture + - Built-in state management primitives + +- **TypeScript 5.8.3** + - Type safety for large applications + - Enhanced developer experience + - Better refactoring support + +- **Vite 7.0.4** + - Fast development server + - Hot module replacement + - Optimized builds + +### UI & Styling +- **Tailwind CSS** + - Utility-first CSS framework + - Rapid prototyping + - Consistent design system + - Mobile-first responsive design + +- **Headless UI** + - Accessible UI components + - Unstyled, flexible components + - Keyboard navigation support + - Screen reader compatibility + +- **Framer Motion** + - Smooth animations and transitions + - Gesture support + - Layout animations + - Performance optimized + +### State Management & Data +- **Zustand** + - Lightweight state management + - TypeScript friendly + - No boilerplate + - DevTools support + +- **TanStack Query (React Query)** + - Server state management + - Caching and synchronization + - Background updates + - Optimistic updates + +- **React Hook Form** + - Performant form handling + - Minimal re-renders + - Built-in validation + - Easy integration with UI libraries + +## Backend Technologies + +### Core Runtime +- **Rust 1.93.0** + - Memory safety without garbage collection + - Zero-cost abstractions + - Excellent performance + - Cross-platform compilation + +- **Tauri 2.x** + - Cross-platform desktop/mobile apps + - Small bundle size + - Native OS integration + - Secure IPC communication + +### Essential Crates +- **Tokio** + - Async runtime for Rust + - High-performance networking + - Task scheduling + - Real-time capabilities + +- **Serde + Serde JSON** + - Serialization/deserialization + - Type-safe JSON handling + - Performance optimized + - Extensive ecosystem support + +- **SQLx + SQLite** + - Compile-time checked SQL + - Async database operations + - Local-first storage + - Cross-platform compatibility + +- **Reqwest** + - HTTP client library + - Async/await support + - JSON support built-in + - Connection pooling + +- **WebSocket Libraries** + - Real-time communication + - Bidirectional messaging + - Connection management + - Error handling + +- **UUID** + - Unique identifier generation + - Various UUID versions + - Cryptographically secure + - Cross-platform consistency + +## Platform Targets + +### Desktop +- **Windows** (x64, ARM64) +- **macOS** (Intel, Apple Silicon) +- **Linux** (x64, ARM64) - Optional + +### Mobile +- **Android** (API 21+) +- **iOS** (iOS 13+) + +## Development Tools + +### Build & Development +- **Cargo** - Rust package manager +- **NPM** - Node.js package manager +- **Tauri CLI** - Build and development tools + +### Code Quality +- **ESLint** - JavaScript/TypeScript linting +- **Prettier** - Code formatting +- **Clippy** - Rust linting +- **Rustfmt** - Rust code formatting + +## Architecture Principles + +### Frontend +- **Component-driven development** +- **Type-safe state management** +- **Responsive design first** +- **Accessible by default** + +### Backend +- **Async-first architecture** +- **Local-first data storage** +- **Secure communication** +- **Performance optimized** + +### Cross-Platform +- **Native OS integration** +- **Consistent user experience** +- **Platform-specific optimizations** +- **Shared business logic** + +--- + +*Last updated: 2026-01-27* \ No newline at end of file diff --git a/.claude/rules/12-design-system.md b/.claude/rules/12-design-system.md new file mode 100644 index 000000000..ec8b1ab87 --- /dev/null +++ b/.claude/rules/12-design-system.md @@ -0,0 +1,223 @@ +# Design System - Crypto Community Platform + +## Design Philosophy + +Our design system is built on **trust**, **usefulness**, and **simplicity** - core principles essential for crypto/fintech applications where users handle sensitive financial discussions and data. + +## Typography + +### Font Selection - Psychology of Trust + +**Primary Font: Inter** +- **Why**: Sans-serif font that signals modernity, efficiency, and clarity +- **Psychology**: Clean, digital-first appearance builds trust in tech platforms +- **Usage**: Body text, UI elements, navigation +- **Weights**: 300, 400, 500, 600, 700 + +**Monospace Font: JetBrains Mono** +- **Why**: Essential for crypto addresses, transaction hashes, code snippets +- **Psychology**: Monospace fonts convey technical precision and accuracy +- **Usage**: Crypto addresses, prices, technical data, code blocks +- **Weights**: 300, 400, 500, 600 + +### Font Hierarchy +```css +h1: text-3xl lg:text-4xl (48px desktop, 30px mobile) +h2: text-2xl lg:text-3xl (36px desktop, 24px mobile) +h3: text-xl lg:text-2xl (24px desktop, 20px mobile) +h4: text-lg lg:text-xl (20px desktop, 18px mobile) +Body: text-base (16px) - optimal for readability +Small: text-sm (14px) - secondary information +``` + +## Color Palette - Trust & Professionalism + +### Primary Colors - Deep Trustworthy Blue +- **Primary-500**: `#0ea5e9` - Main brand color, conveys reliability +- **Primary-600**: `#0284c7` - Interactive states (buttons, links) +- **Primary-700**: `#0369a1` - Active states, emphasis + +**Psychology**: Blue is universally associated with trust, security, and professionalism in financial apps. + +### Success Colors - Financial Green +- **Success-500**: `#22c55e` - Profit, positive transactions, confirmations +- **Success-600**: `#16a34a` - Interactive success states + +**Psychology**: Green represents growth, wealth, and positive financial outcomes. + +### Warning & Error Colors +- **Warning-500**: `#f59e0b` - Caution, pending states, important notices +- **Error-500**: `#ef4444` - Losses, errors, critical alerts + +### Neutral Grays - Clean Interface +- **Neutral-50**: `#fafafa` - Background, light surfaces +- **Neutral-900**: `#171717` - Primary text, high contrast +- **Neutral-100-800**: Graduated scale for UI elements + +### Crypto Accent Colors +- **Bitcoin**: `#f7931a` - BTC brand color +- **Ethereum**: `#627eea` - ETH brand color +- **Success**: `#00d4aa` - DeFi success indicators +- **Danger**: `#ff6b6b` - Risk warnings + +## Component Library + +### Buttons - Clear Action Hierarchy + +```css +.btn-primary - Main actions (Send, Buy, Confirm) +.btn-secondary - Secondary actions (Cancel, Back) +.btn-success - Positive confirmations (Approve, Accept) +.btn-danger - Destructive actions (Delete, Reject) +``` + +**Design Principles**: +- Clear visual hierarchy prevents costly mistakes +- Consistent interaction patterns build familiarity +- Adequate touch targets (44px min) for mobile accessibility + +### Cards - Content Organization + +```css +.card - Basic content container with soft shadows +.card-hover - Interactive cards with elevation feedback +``` + +**Psychology**: Cards create clear content boundaries, reduce cognitive load, and provide familiar interaction patterns. + +### Inputs - Trustworthy Data Entry + +```css +.input-primary - Consistent form styling with focus states +``` + +**Features**: +- Clear focus indicators for accessibility +- Proper contrast ratios (WCAG 2.1 AA compliant) +- Error states with helpful messaging +- Placeholder text that guides without overwhelming + +### Status Indicators - Clear Information Hierarchy + +```css +.status-online - Connected, active states +.status-offline - Disconnected, inactive states +.status-warning - Attention required +``` + +### Navigation - Intuitive Wayfinding + +```css +.nav-item - Default navigation states +.nav-item-active - Current location indicator +``` + +## Layout Principles + +### Spacing System +- **Base unit**: 4px (0.25rem) +- **Common spacing**: 8px, 16px, 24px, 32px, 48px +- **Component padding**: 24px (6 units) +- **Section spacing**: 48px (12 units) + +### Responsive Breakpoints +```css +sm: 640px - Small tablets +md: 768px - Tablets +lg: 1024px - Small desktops +xl: 1280px - Large desktops +``` + +### Grid System +- **Mobile**: Single column, 16px margins +- **Tablet**: 2-3 columns, 24px margins +- **Desktop**: Multi-column layouts, 32px margins + +## Interactive Elements + +### Shadows - Depth & Hierarchy +```css +shadow-soft: Subtle elevation for cards +shadow-medium: Interactive hover states +shadow-strong: Modals, overlays, emphasis +``` + +### Animation - Smooth Interactions +- **Duration**: 200ms for micro-interactions, 300ms for transitions +- **Easing**: `ease-in-out` for natural feel +- **Principles**: Reduce motion for accessibility, maintain performance + +### Focus States - Accessibility First +- **Ring**: 2px blue outline with 2px offset +- **Color**: Primary-500 for consistency +- **Visibility**: Clear on all interactive elements + +## Mobile Optimization + +### Touch Targets +- **Minimum**: 44px × 44px +- **Recommended**: 48px × 48px for primary actions +- **Spacing**: 8px minimum between interactive elements + +### Typography Scale +- **Mobile-first**: Base sizes optimized for readability on small screens +- **Progressive enhancement**: Larger sizes on desktop +- **Line height**: 1.6 for optimal mobile reading + +### Safe Areas +- **iOS**: Respect notch and home indicator +- **Android**: Navigation and status bar accommodation +- **CSS**: `env(safe-area-inset-*)` for dynamic adjustment + +## Accessibility Standards + +### WCAG 2.1 AA Compliance +- **Contrast ratios**: 4.5:1 for normal text, 3:1 for large text +- **Color**: Never sole indicator of information +- **Focus**: Visible focus indicators on all interactive elements +- **Motion**: Respect `prefers-reduced-motion` + +### Screen Reader Support +- **Semantic HTML**: Proper heading hierarchy, landmarks +- **ARIA labels**: Descriptive labels for complex interactions +- **Live regions**: Dynamic content announcements + +## Usage Guidelines + +### When to Use Primary Blue +- **Call-to-action buttons**: Sign up, log in, send transaction +- **Active navigation**: Current page indicators +- **Links**: Primary navigation and important links +- **Progress indicators**: Loading states, completion + +### When to Use Success Green +- **Positive confirmations**: Transaction successful, account verified +- **Profit indicators**: Price increases, portfolio gains +- **Status indicators**: Online, connected, active + +### When to Use Warning Orange +- **Caution states**: Pending transactions, rate limits +- **Important notices**: Security warnings, updates required +- **Validation**: Form warnings that aren't errors + +### When to Use Error Red +- **Destructive actions**: Delete account, remove funds +- **Error states**: Failed transactions, connection errors +- **Loss indicators**: Price decreases, portfolio losses + +## Implementation Notes + +### CSS Custom Properties +All colors, spacing, and typography scales are available as CSS custom properties for consistent theming. + +### Dark Mode Readiness +Color palette includes dark mode variations for future implementation. + +### Performance +- **Font loading**: `font-display: swap` for improved loading experience +- **Critical CSS**: Base styles inlined, components loaded asynchronously +- **Animation**: Hardware-accelerated where appropriate + +--- + +*This design system prioritizes user trust through consistent, accessible, and professional visual design - essential for crypto community platforms where financial decisions are made.* \ No newline at end of file diff --git a/docs/DESIGN_GUIDELINES.md b/docs/DESIGN_GUIDELINES.md new file mode 100644 index 000000000..1b93005fc --- /dev/null +++ b/docs/DESIGN_GUIDELINES.md @@ -0,0 +1,253 @@ +# Crypto Platform Design Guidelines + +## Design Philosophy + +Our design system embodies three core principles that align with the needs of crypto professionals: + +### 1. **Calm Sophistication** +- Soft, muted color palettes that reduce visual noise +- Generous whitespace for breathing room +- Subtle animations that feel natural, not jarring + +### 2. **Trust Through Clarity** +- Clear information hierarchy +- Consistent component patterns +- Professional typography that's easy to scan + +### 3. **Functional Beauty** +- Every aesthetic choice serves a functional purpose +- Data visualization that's both beautiful and informative +- Interactions that feel intuitive and responsive + +## Color System + +### Primary Palette + +#### Canvas (Backgrounds) +- **Canvas-50** (#FAFAF9): Primary background, slight warmth prevents sterility +- **Canvas-100** (#F5F5F4): Secondary surfaces, cards, elevated elements +- **Canvas-200** (#E5E5E3): Tertiary backgrounds, hover states + +#### Ocean Blue (Primary Actions) +- **Primary-500** (#5B9BF3): Main brand color, CTAs, active states +- **Primary-600** (#4A83DD): Hover states for primary elements +- **Why**: Blue conveys trust, stability, and professionalism - crucial for financial platforms + +#### Sage Green (Success/Growth) +- **Sage-500** (#4DC46F): Positive changes, success states, gains +- **Sage-600** (#3BA858): Hover states for success elements +- **Why**: A sophisticated green that feels less aggressive than typical "success" greens + +#### Coral Red (Errors/Losses) +- **Coral-500** (#F56565): Errors, losses, critical actions +- **Why**: Softer than harsh reds, maintains professionalism even in negative states + +### Psychology Behind Color Choices + +1. **Warm Neutrals Over Cold Grays**: Creates a more welcoming, less clinical environment +2. **Muted Accent Colors**: Reduces cognitive load during long trading sessions +3. **High Contrast for Data**: Ensures critical information is immediately visible + +## Typography + +### Font Stack + +```css +font-sans: 'Inter', -apple-system, system-ui +font-display: 'Cabinet Grotesk', 'Inter' +font-mono: 'JetBrains Mono' +``` + +### Type Scale & Usage + +- **Display (4.5rem)**: Hero sections, major announcements +- **H1 (3rem)**: Page titles, primary headings +- **H2 (1.875rem)**: Section headers +- **Body (1rem)**: General content, -0.01em letter-spacing for clarity +- **Small (0.875rem)**: Secondary information, metadata +- **Micro (0.625rem)**: Tiny labels, timestamps + +### Typography Rules + +1. **Line Height**: 1.5-1.6 for body text, 1.1-1.2 for headings +2. **Letter Spacing**: Negative for larger sizes, neutral for body +3. **Font Weight**: Use 400-600 primarily, 700 sparingly for emphasis +4. **Monospace**: Always for prices, percentages, numerical data + +## Spacing System + +### Base Unit: 0.25rem (4px) + +- **Micro**: 4px, 8px (tight groupings) +- **Small**: 12px, 16px (related elements) +- **Medium**: 24px, 32px (sections) +- **Large**: 48px, 64px (major sections) +- **XLarge**: 96px+ (hero areas) + +### Spacing Psychology + +- **Tight spacing** (4-8px): Creates relationships between elements +- **Medium spacing** (16-24px): Standard breathing room +- **Generous spacing** (48px+): Creates focus and hierarchy + +## Component Patterns + +### Cards + +#### Elevated Card +```jsx +
+ // Shadow creates depth, white bg provides focus +
+``` +- Use for primary content containers +- Subtle shadow creates hierarchy without borders + +#### Interactive Card +```jsx +
+ // Hover state with top border animation +
+``` +- Use for clickable items +- Progressive disclosure through hover states + +#### Glass Card +```jsx +
+ // Backdrop blur for overlay contexts +
+``` +- Use for floating elements, overlays +- Creates depth while maintaining context + +### Buttons + +#### Hierarchy +1. **Premium Button**: Primary CTAs, most important actions +2. **Glass Button**: Secondary actions, less emphasis +3. **Outline Button**: Tertiary actions, minimal visual weight + +#### Button Psychology +- **Rounded corners** (0.75rem): Feels approachable, modern +- **Subtle shadows**: Creates tactile feeling, encourages clicks +- **Hover animations**: Provides feedback, builds confidence + +### Forms + +#### Input Design +```jsx + +``` +- **White background**: Maximum contrast for readability +- **Subtle border**: Defines boundaries without heaviness +- **Focus ring**: Clear feedback for keyboard navigation + +## Motion & Animation + +### Timing Functions +```css +--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); +--transition-base: 250ms cubic-bezier(0.4, 0, 0.2, 1); +--transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1); +``` + +### Animation Principles + +1. **Purpose**: Every animation serves a functional purpose +2. **Subtlety**: Movements should feel natural, not dramatic +3. **Performance**: Prefer transform and opacity for 60fps +4. **Consistency**: Same elements animate the same way + +### Common Animations + +- **Fade In**: Content appearing (0.5s) +- **Scale In**: Modals, popups (0.3s) +- **Slide In**: Panels, drawers (0.3s) +- **Shimmer**: Loading states (2s loop) + +## Data Visualization + +### Market Data Display + +1. **Monospace fonts** for all numbers +2. **Color coding**: Green (up), Red (down), Gray (neutral) +3. **Tabular alignment** for easy scanning +4. **Real-time updates** with subtle transitions + +### Chart Guidelines + +- **Muted gridlines**: Don't compete with data +- **High contrast** for data points +- **Interactive tooltips** on hover +- **Responsive scaling** for all screen sizes + +## Accessibility + +### WCAG 2.1 AA Compliance + +1. **Color Contrast**: 4.5:1 for normal text, 3:1 for large +2. **Focus Indicators**: Visible keyboard navigation +3. **Touch Targets**: Minimum 44x44px +4. **Screen Readers**: Semantic HTML, ARIA labels + +### Inclusive Design + +- **Color-blind safe**: Don't rely solely on color +- **Keyboard navigable**: All interactions keyboard accessible +- **Reduced motion**: Respect prefers-reduced-motion +- **Clear language**: Avoid jargon in critical flows + +## Responsive Design + +### Breakpoints +```css +sm: 640px +md: 768px +lg: 1024px +xl: 1280px +2xl: 1536px +``` + +### Mobile-First Principles + +1. **Essential information** visible without scrolling +2. **Touch-friendly** tap targets (min 44px) +3. **Simplified navigation** for small screens +4. **Performance optimized** for mobile networks + +## Implementation Guidelines + +### Component Usage + +1. **Consistency**: Use existing components before creating new +2. **Composition**: Build complex UIs from simple components +3. **Customization**: Extend through composition, not modification +4. **Documentation**: Document any deviations from guidelines + +### Performance Considerations + +1. **Lazy load** non-critical components +2. **Optimize images** (WebP, proper sizing) +3. **Code split** by route +4. **Cache aggressively** for repeat visits + +### Testing Checklist + +- [ ] Responsive on all breakpoints +- [ ] Accessible via keyboard +- [ ] Color contrast passes +- [ ] Animations respect reduced motion +- [ ] Forms have proper validation +- [ ] Loading states implemented +- [ ] Error states handled gracefully + +## Summary + +This design system creates a premium experience that: +- **Builds trust** through consistency and clarity +- **Reduces cognitive load** with calm aesthetics +- **Enhances usability** through thoughtful interactions +- **Scales elegantly** across devices and contexts + +The result is a platform that feels sophisticated yet approachable, powerful yet simple - perfect for crypto professionals who demand both functionality and aesthetic excellence. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 43440ed50..d232aa2b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,32 @@ "react-dom": "^19.1.0" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.11", + "@tailwindcss/typography": "^0.5.19", "@tauri-apps/cli": "^2", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.23", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", "typescript": "~5.8.3", "vite": "^7.0.4" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/code-frame": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", @@ -796,6 +814,44 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -1153,6 +1209,32 @@ "win32" ] }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", + "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, "node_modules/@tauri-apps/api": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.1.tgz", @@ -1482,6 +1564,84 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.9.18", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", @@ -1492,6 +1652,32 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -1526,6 +1712,16 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001766", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", @@ -1547,6 +1743,54 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1554,6 +1798,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -1579,6 +1836,32 @@ } } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.279", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", @@ -1638,6 +1921,46 @@ "node": ">=6" } }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -1656,6 +1979,33 @@ } } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1671,6 +2021,16 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1681,6 +2041,106 @@ "node": ">=6.9.0" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1714,6 +2174,300 @@ "node": ">=6" } }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1724,6 +2478,53 @@ "yallist": "^3.0.2" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1731,6 +2532,18 @@ "dev": true, "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1757,6 +2570,43 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1777,6 +2627,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -1806,6 +2676,175 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -1837,6 +2876,74 @@ "node": ">=0.10.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.56.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", @@ -1882,6 +2989,30 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -1908,6 +3039,127 @@ "node": ">=0.10.0" } }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -1925,6 +3177,26 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -1970,6 +3242,13 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", diff --git a/package.json b/package.json index df53fafc5..d08a46f63 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,22 @@ "tauri": "tauri" }, "dependencies": { - "react": "^19.1.0", - "react-dom": "^19.1.0", "@tauri-apps/api": "^2", - "@tauri-apps/plugin-opener": "^2" + "@tauri-apps/plugin-opener": "^2", + "react": "^19.1.0", + "react-dom": "^19.1.0" }, "devDependencies": { + "@tailwindcss/forms": "^0.5.11", + "@tailwindcss/typography": "^0.5.19", + "@tauri-apps/cli": "^2", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.23", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", "typescript": "~5.8.3", - "vite": "^7.0.4", - "@tauri-apps/cli": "^2" + "vite": "^7.0.4" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 000000000..e99ebc2c0 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 8286a76ec..3303c771a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,51 +1,295 @@ import { useState } from "react"; -import reactLogo from "./assets/react.svg"; import { invoke } from "@tauri-apps/api/core"; -import "./App.css"; function App() { const [greetMsg, setGreetMsg] = useState(""); const [name, setName] = useState(""); async function greet() { - // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ setGreetMsg(await invoke("greet", { name })); } return ( -
-

Welcome to Tauri + React

+
+ {/* Background pattern for enhanced glass effect */} +
+ {/* Header with Glass Effect */} +
+
+
+
+

+ Crypto Community Platform +

+
-
- - Vite logo - - - Tauri logo - - - React logo - + {/* Navigation Menu */} + + +
+ Connected +
+
+
+
+ + {/* Crypto Price Ticker */} +
+
+ + + BTC + $45,250.00 +2.5% + + + ETH + $3,120.50 -1.8% + + + ADA + $0.52 0.0% + + + SOL + $98.75 +4.2% + + + USDC + $1.00 0.0% + + +
-

Click on the Tauri, Vite, and React logos to learn more.

-
{ - e.preventDefault(); - greet(); - }} - > - setName(e.currentTarget.value)} - placeholder="Enter a name..." - /> - -
-

{greetMsg}

-
+ {/* Main Content */} +
+ {/* Welcome Section with Glass Effect */} +
+
+

+ Welcome to Your Crypto Community Hub +

+

+ Built with Tauri + React, designed for traders, investors, and crypto enthusiasts. + This platform prioritizes trust, security, and seamless communication. +

+ + {/* Demo Interaction */} +
+
{ + e.preventDefault(); + greet(); + }} + className="space-y-4" + > + setName(e.target.value)} + placeholder="Enter your name to test the connection..." + className="input-primary" + /> + +
+ + {greetMsg && ( +
+

{greetMsg}

+
+ )} +
+
+
+ + {/* Feature Preview Cards */} +
+ {/* Real-time Messaging */} +
+
+
+ + + +
+

Real-time Chat

+
+

+ Secure messaging for crypto discussions with end-to-end encryption and group channels. +

+
+ + {/* Portfolio Integration */} +
+
+
+ + + +
+

Portfolio Tracking

+
+

+ Monitor your crypto investments with real-time price updates and performance analytics. +

+
+ + {/* Community Features */} +
+
+
+ + + +
+

Expert Network

+
+

+ Connect with traders, researchers, and KOLs in specialized crypto communities. +

+
+
+ + {/* Chat Messages Demo */} +
+

+ 💬 Live Chat Demo +

+ +
+
+
+ Hey everyone! BTC looking bullish 🚀 +
+
+
+
+ Agreed! Just bought more at $45k +
+
+
+
+ 0x1a2b3c...d4e5f6
+ Anyone seeing this DeFi yield opportunity? +
+
+
+
+ Which protocol? Share the alpha! 👀 +
+
+
+ +
+ + +
+
+ + {/* Design System Showcase */} +
+ {/* Buttons & Forms */} +
+

+ 🎛️ Interactive Components +

+ +
+ {/* Button Examples */} +
+

Action Buttons

+
+ + + + +
+
+ + {/* Form Example */} +
+

Trading Form

+
+ + +
+
+
+
+ + {/* Status & Loading States */} +
+

+ 📊 Status Indicators +

+ +
+ {/* Status Examples */} +
+

Connection Status

+
+ Trading Active + Market Closed + Order Pending +
+
+ + {/* Loading States */} +
+

Loading States

+
+
+
+
+
+
+ + {/* Crypto Addresses */} +
+

Wallet Address

+
+ bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh +
+
+
+
+
+
+ + {/* Footer */} +
+
+
+

Built with Tauri 2.x, React 19, TypeScript, and Tailwind CSS

+

Designed for trust, security, and seamless crypto community interactions

+
+
+
+ ); } -export default App; +export default App; \ No newline at end of file diff --git a/src/components/DesignSystemShowcase.tsx b/src/components/DesignSystemShowcase.tsx new file mode 100644 index 000000000..e55c47ae3 --- /dev/null +++ b/src/components/DesignSystemShowcase.tsx @@ -0,0 +1,380 @@ +import React from 'react'; + +/** + * Design System Showcase Component + * + * This component demonstrates the premium design system created for the crypto platform. + * It showcases all the major components and styles that capture the calm, trustworthy + * aesthetic from the reference screenshots while elevating it for professional crypto users. + */ + +const DesignSystemShowcase: React.FC = () => { + return ( +
+ {/* Hero Section - Similar to Screenshot #1 but elevated */} +
+ {/* Atmospheric Background */} +
+
+
+ +
+ {/* Greeting Section */} +
+

+ Good afternoon, + Cyrus +

+

+ Your portfolio is up 12.5% today +

+ + {/* Status Card */} +
+
+
+ + +
+ Markets Open +
+
+ 26°C and clear +
+
+ + {/* Quick Actions */} +
+ + + +
+
+
+ + {/* Color Palette Section */} +
+

+ Color System +

+ +
+ {/* Primary Colors */} +
+

Primary Ocean

+
+
+
+
+

Primary 500

+

#5B9BF3

+
+
+
+
+
+

Primary 600

+

#4A83DD

+
+
+
+
+ + {/* Success Colors */} +
+

Sage Success

+
+
+
+
+

Sage 500

+

#4DC46F

+
+
+
+
+
+

Sage 600

+

#3BA858

+
+
+
+
+ + {/* Accent Colors */} +
+

Accent Palette

+
+
+
+
+

Lavender

+

#9B8AFB

+
+
+
+
+
+

Sky

+

#7DD3FC

+
+
+
+
+
+
+ + {/* Typography Section */} +
+

+ Typography Scale +

+ +
+
+

Display · 4.5rem

+

+ Beautiful Typography +

+
+ +
+

Heading 1 · 3rem

+

+ Clear Information Hierarchy +

+
+ +
+

Heading 2 · 1.875rem

+

+ Structured Content Design +

+
+ +
+

Body · 1rem

+

+ The typography system is designed to create clear visual hierarchy while maintaining + excellent readability. Each text size has been carefully calibrated with appropriate + line heights and letter spacing to ensure optimal legibility across all device sizes. +

+
+ +
+

Monospace · For prices and data

+

+ $48,392.50 +2.45% +

+
+
+
+ + {/* Card Components Section */} +
+

+ Card Components +

+ +
+ {/* Market Card */} +
+
+
+
+
+ +
+
+

Bitcoin

+

BTC

+
+
+ Trending +
+ +
+

$48,392.50

+
+ +$1,185.20 + (+2.45%) +
+
+
+
+ + {/* Interactive Card */} +
+

+ Portfolio Overview +

+

+ Track your investments and monitor performance in real-time. +

+
+ View Details + + + +
+
+ + {/* Elevated Card */} +
+
+

Quick Stats

+
+ + + +
+
+
+
+ Total Value + $125,430 +
+
+ 24h Change + +3.2% +
+
+ Holdings + 12 +
+
+
+
+
+ + {/* Navigation Pattern - Similar to Screenshot #2 */} +
+

+ Navigation & Settings +

+ +
+
+ {/* User Profile Section */} +
+
+
+
+

Cyrus Amini

+

Premium Member

+
+
+
+ + {/* Navigation Items */} + +
+
+
+ + {/* Form Elements */} +
+

+ Form Elements +

+ +
+
+
+ + +
+ +
+ +
+ $ + +
+
+ +
+ + +
+ +
+ + +
+ + +
+
+
+
+ ); +}; + +export default DesignSystemShowcase; \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 000000000..ecb808542 --- /dev/null +++ b/src/index.css @@ -0,0 +1,236 @@ +/* Import Google Fonts for trust and professionalism */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600&display=swap'); + +/* Tailwind CSS imports */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Base layer - Typography and fundamental styles */ +@layer base { + /* Set default font and improve text rendering */ + html { + font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + } + + body { + @apply bg-canvas-50 text-stone-900; + @apply font-sans; + line-height: 1.6; + } + + /* Heading hierarchy for clear information architecture */ + h1, h2, h3, h4, h5, h6 { + @apply font-display font-semibold; + @apply text-stone-900; + line-height: 1.2; + } + + h1 { @apply text-3xl lg:text-4xl; } + h2 { @apply text-2xl lg:text-3xl; } + h3 { @apply text-xl lg:text-2xl; } + h4 { @apply text-lg lg:text-xl; } + + /* Enhanced focus styles for accessibility and trust */ + *:focus { + @apply outline-none ring-2 ring-primary-500 ring-offset-2 ring-offset-canvas-50; + } + + /* Smooth scrolling */ + html { + scroll-behavior: smooth; + } +} + +/* Component layer - Reusable patterns */ +@layer components { + /* Button variants for consistent interaction design */ + .btn-primary { + @apply bg-primary-500 hover:bg-primary-600 active:bg-primary-700; + @apply text-white font-medium; + @apply px-4 py-2 rounded-lg; + @apply transition-all duration-200 ease-in-out; + @apply shadow-soft hover:shadow-medium; + @apply focus:ring-2 focus:ring-primary-500 focus:ring-offset-2; + @apply disabled:opacity-50 disabled:cursor-not-allowed; + } + + .btn-secondary { + @apply bg-canvas-100 hover:bg-canvas-200 active:bg-canvas-300; + @apply text-stone-700 font-medium; + @apply px-4 py-2 rounded-lg border border-canvas-200; + @apply transition-all duration-200 ease-in-out; + @apply focus:ring-2 focus:ring-primary-500 focus:ring-offset-2; + } + + .btn-success { + @apply bg-sage-500 hover:bg-sage-600 active:bg-sage-700; + @apply text-white font-medium; + @apply px-4 py-2 rounded-lg; + @apply transition-all duration-200 ease-in-out; + @apply shadow-soft hover:shadow-medium; + } + + .btn-danger { + @apply bg-coral-500 hover:bg-coral-600 active:bg-coral-700; + @apply text-white font-medium; + @apply px-4 py-2 rounded-lg; + @apply transition-all duration-200 ease-in-out; + @apply shadow-soft hover:shadow-medium; + } + + /* Card components for content organization */ + .card { + @apply bg-white rounded-xl shadow-soft border border-canvas-200; + @apply p-6; + @apply transition-shadow duration-200; + } + + .card-hover { + @apply card hover:shadow-medium; + } + + /* Input components with consistent styling */ + .input-primary { + @apply w-full px-4 py-3 rounded-lg; + @apply border border-stone-300 focus:border-primary-500; + @apply bg-white text-stone-900 placeholder-stone-500; + @apply transition-colors duration-200; + @apply focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 focus:outline-none; + } + + /* Status indicators */ + .status-online { + @apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium; + @apply bg-sage-100 text-sage-800; + } + + .status-offline { + @apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium; + @apply bg-stone-100 text-stone-600; + } + + .status-warning { + @apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium; + @apply bg-amber-100 text-amber-800; + } + + /* Navigation styles */ + .nav-item { + @apply flex items-center px-4 py-2 text-sm font-medium rounded-lg; + @apply text-stone-600 hover:text-stone-900 hover:bg-canvas-100; + @apply transition-colors duration-150; + } + + .nav-item-active { + @apply nav-item bg-primary-50 text-primary-700; + } + + /* Message/chat specific styles */ + .message-bubble { + @apply max-w-xs lg:max-w-md px-4 py-2 rounded-2xl; + @apply break-words; + } + + .message-sent { + @apply message-bubble bg-primary-500 text-white ml-auto; + } + + .message-received { + @apply message-bubble bg-canvas-100 text-stone-900; + } + + /* Loading states */ + .loading-pulse { + @apply animate-pulse bg-canvas-200 rounded; + } + + /* Crypto price styling */ + .price-positive { + @apply text-market-bullish font-mono font-medium; + } + + .price-negative { + @apply text-market-bearish font-mono font-medium; + } + + .price-neutral { + @apply text-market-neutral font-mono font-medium; + } +} + +/* Utility layer - Custom utilities */ +@layer utilities { + /* Scrollbar styling for better UX */ + .scrollbar-thin { + scrollbar-width: thin; + scrollbar-color: rgb(163 163 163) transparent; + } + + .scrollbar-thin::-webkit-scrollbar { + width: 6px; + } + + .scrollbar-thin::-webkit-scrollbar-track { + background: transparent; + } + + .scrollbar-thin::-webkit-scrollbar-thumb { + background-color: rgb(163 163 163); + border-radius: 3px; + } + + .scrollbar-thin::-webkit-scrollbar-thumb:hover { + background-color: rgb(115 115 115); + } + + /* Text selection styling */ + .select-primary::selection { + @apply bg-primary-100 text-primary-900; + } + + /* Enhanced glass effect for better visibility */ + .glass { + backdrop-filter: blur(16px); + background: rgba(255, 255, 255, 0.15); + border: 1px solid rgba(255, 255, 255, 0.3); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + } + + /* Animation utilities */ + .animate-fade-in-up { + animation: fadeInUp 0.5s ease-out forwards; + } + + @keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + /* Safe area padding for mobile devices */ + .safe-area-padding { + padding-top: env(safe-area-inset-top); + padding-bottom: env(safe-area-inset-bottom); + padding-left: env(safe-area-inset-left); + padding-right: env(safe-area-inset-right); + } +} + +/* Dark mode support (optional) */ +@media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + } + + /* Dark mode styles can be added here if needed */ +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 2be325ed2..8b1ddb971 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; +import "./index.css"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( diff --git a/src/styles/theme.css b/src/styles/theme.css new file mode 100644 index 000000000..a71b48643 --- /dev/null +++ b/src/styles/theme.css @@ -0,0 +1,559 @@ +/* ============================================ + Premium Theme Styles for Crypto Platform + ============================================ */ + +/* Import premium fonts */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap'); + +/* Custom font declarations for premium typography */ +@font-face { + font-family: 'Cabinet Grotesk'; + src: url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap'); + font-display: swap; +} + +/* ============================================ + Root Variables & Theme Configuration + ============================================ */ +:root { + /* Semantic color tokens */ + --color-background: theme('colors.canvas.50'); + --color-surface: theme('colors.white'); + --color-surface-elevated: theme('colors.canvas.100'); + --color-border: theme('colors.stone.200'); + --color-border-subtle: theme('colors.stone.100'); + + /* Text colors with hierarchy */ + --color-text-primary: theme('colors.stone.900'); + --color-text-secondary: theme('colors.stone.600'); + --color-text-tertiary: theme('colors.stone.500'); + --color-text-muted: theme('colors.stone.400'); + + /* Interaction states */ + --color-hover: theme('colors.primary.50'); + --color-active: theme('colors.primary.100'); + --color-focus: theme('colors.primary.500'); + + /* Semantic status colors */ + --color-success: theme('colors.sage.500'); + --color-warning: theme('colors.amber.500'); + --color-error: theme('colors.coral.500'); + --color-info: theme('colors.primary.500'); + + /* Spacing rhythm */ + --spacing-unit: 0.25rem; + + /* Transition timing */ + --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); + --transition-base: 250ms cubic-bezier(0.4, 0, 0.2, 1); + --transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1); + + /* Border widths */ + --border-width: 1px; + --border-width-thick: 2px; + + /* Z-index scale */ + --z-dropdown: 1000; + --z-sticky: 1100; + --z-overlay: 1200; + --z-modal: 1300; + --z-popover: 1400; + --z-tooltip: 1500; +} + +/* ============================================ + Global Styles & Resets + ============================================ */ +* { + box-sizing: border-box; + border-color: var(--color-border); +} + +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + scroll-behavior: smooth; + font-feature-settings: 'kern' 1, 'liga' 1, 'calt' 1; +} + +body { + min-height: 100vh; + background: var(--color-background); + color: var(--color-text-primary); + line-height: 1.6; + position: relative; + overflow-x: hidden; +} + +/* Subtle noise texture overlay for depth */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' /%3E%3C/filter%3E%3Crect width='100' height='100' filter='url(%23noise)' opacity='0.03' /%3E%3C/svg%3E"); + pointer-events: none; + z-index: 1; + opacity: 0.4; +} + +/* ============================================ + Typography Enhancements + ============================================ */ +.text-display { + font-family: theme('fontFamily.display'); + font-weight: 700; + letter-spacing: -0.04em; + line-height: 1.1; +} + +.text-balance { + text-wrap: balance; +} + +.text-gradient { + background: linear-gradient(135deg, theme('colors.primary.600') 0%, theme('colors.accent.lavender') 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.text-crypto-price { + font-family: theme('fontFamily.mono'); + font-variant-numeric: tabular-nums; + font-feature-settings: 'tnum' 1; +} + +/* ============================================ + Glass Morphism Components + ============================================ */ +.glass-surface { + background: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(20px) saturate(180%); + -webkit-backdrop-filter: blur(20px) saturate(180%); + border: 1px solid rgba(255, 255, 255, 0.3); + box-shadow: + 0 8px 32px rgba(0, 0, 0, 0.08), + inset 0 0 0 1px rgba(255, 255, 255, 0.5); +} + +.glass-surface-dark { + background: rgba(15, 23, 42, 0.8); + backdrop-filter: blur(20px) saturate(180%); + -webkit-backdrop-filter: blur(20px) saturate(180%); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: + 0 8px 32px rgba(0, 0, 0, 0.3), + inset 0 0 0 1px rgba(255, 255, 255, 0.05); +} + +/* ============================================ + Card Components + ============================================ */ +.card-elevated { + @apply bg-white rounded-2xl; + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.03), + 0 2px 4px rgba(0, 0, 0, 0.04), + 0 8px 16px -4px rgba(0, 0, 0, 0.08), + 0 24px 48px -12px rgba(0, 0, 0, 0.12); + transition: all var(--transition-base); +} + +.card-elevated:hover { + transform: translateY(-2px); + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.03), + 0 4px 8px rgba(0, 0, 0, 0.04), + 0 16px 24px -8px rgba(0, 0, 0, 0.10), + 0 32px 64px -16px rgba(0, 0, 0, 0.14); +} + +.card-interactive { + @apply bg-white rounded-xl p-6; + border: 1px solid theme('colors.stone.200'); + transition: all var(--transition-fast); + cursor: pointer; + position: relative; + overflow: hidden; +} + +.card-interactive::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2px; + background: linear-gradient(90deg, + theme('colors.primary.500') 0%, + theme('colors.accent.lavender') 50%, + theme('colors.accent.sky') 100%); + transform: scaleX(0); + transition: transform var(--transition-base); +} + +.card-interactive:hover { + border-color: theme('colors.primary.200'); + background: theme('colors.primary.50'); +} + +.card-interactive:hover::before { + transform: scaleX(1); +} + +/* ============================================ + Button Styles + ============================================ */ +.btn-premium { + @apply relative inline-flex items-center justify-center px-6 py-3 rounded-xl font-medium; + background: linear-gradient(135deg, theme('colors.primary.500') 0%, theme('colors.primary.600') 100%); + color: white; + box-shadow: + 0 2px 4px rgba(91, 155, 243, 0.24), + 0 8px 16px -4px rgba(91, 155, 243, 0.20), + inset 0 1px 0 rgba(255, 255, 255, 0.12); + transition: all var(--transition-base); + overflow: hidden; +} + +.btn-premium::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, + transparent 0%, + rgba(255, 255, 255, 0.2) 50%, + transparent 100%); + transform: translateX(-100%); + transition: transform 0.6s; +} + +.btn-premium:hover { + transform: translateY(-1px); + box-shadow: + 0 4px 8px rgba(91, 155, 243, 0.32), + 0 12px 24px -8px rgba(91, 155, 243, 0.28), + inset 0 1px 0 rgba(255, 255, 255, 0.16); +} + +.btn-premium:hover::before { + transform: translateX(100%); +} + +.btn-premium:active { + transform: translateY(0); +} + +.btn-glass { + @apply relative inline-flex items-center justify-center px-6 py-3 rounded-xl font-medium; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + color: theme('colors.stone.700'); + transition: all var(--transition-base); +} + +.btn-glass:hover { + background: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.3); + transform: translateY(-1px); +} + +.btn-outline { + @apply relative inline-flex items-center justify-center px-6 py-3 rounded-xl font-medium; + background: transparent; + border: 1.5px solid theme('colors.stone.300'); + color: theme('colors.stone.700'); + transition: all var(--transition-base); + position: relative; + overflow: hidden; +} + +.btn-outline::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: theme('colors.primary.50'); + transform: translate(-50%, -50%); + transition: width 0.6s, height 0.6s; +} + +.btn-outline:hover { + border-color: theme('colors.primary.500'); + color: theme('colors.primary.600'); +} + +.btn-outline:hover::before { + width: 300px; + height: 300px; +} + +/* ============================================ + Input & Form Styles + ============================================ */ +.input-elevated { + @apply w-full px-4 py-3 rounded-xl; + background: white; + border: 1px solid theme('colors.stone.200'); + color: theme('colors.stone.900'); + font-size: theme('fontSize.base'); + transition: all var(--transition-fast); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); +} + +.input-elevated:focus { + outline: none; + border-color: theme('colors.primary.500'); + box-shadow: + 0 0 0 3px theme('colors.primary.50'), + 0 1px 2px rgba(0, 0, 0, 0.04); +} + +.input-elevated::placeholder { + color: theme('colors.stone.400'); +} + +/* ============================================ + Navigation Components + ============================================ */ +.nav-item-premium { + @apply relative flex items-center px-4 py-2.5 rounded-xl; + color: theme('colors.stone.600'); + transition: all var(--transition-fast); + font-weight: 500; +} + +.nav-item-premium:hover { + color: theme('colors.stone.900'); + background: theme('colors.stone.50'); +} + +.nav-item-premium.active { + color: theme('colors.primary.600'); + background: theme('colors.primary.50'); +} + +.nav-item-premium.active::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 20px; + background: theme('colors.primary.500'); + border-radius: 0 3px 3px 0; +} + +/* ============================================ + Badge & Status Components + ============================================ */ +.badge-premium { + @apply inline-flex items-center px-2.5 py-1 rounded-lg text-xs font-semibold; + background: linear-gradient(135deg, + theme('colors.primary.50') 0%, + theme('colors.accent.lavender/10') 100%); + color: theme('colors.primary.700'); + border: 1px solid theme('colors.primary.200'); +} + +.status-indicator { + @apply relative inline-flex h-3 w-3; +} + +.status-indicator span { + @apply absolute inline-flex h-full w-full rounded-full opacity-75; + animation: ping 1.5s cubic-bezier(0, 0, 0.2, 1) infinite; +} + +.status-indicator.online span { + @apply bg-sage-400; +} + +.status-indicator.offline span { + @apply bg-stone-400; +} + +/* ============================================ + Market-Specific Components + ============================================ */ +.price-ticker { + @apply font-mono text-lg font-semibold; + font-variant-numeric: tabular-nums; +} + +.price-ticker.up { + @apply text-market-bullish; +} + +.price-ticker.down { + @apply text-market-bearish; +} + +.price-ticker.neutral { + @apply text-market-neutral; +} + +.market-card { + @apply relative overflow-hidden rounded-2xl p-6; + background: linear-gradient(135deg, white 0%, theme('colors.canvas.100') 100%); + border: 1px solid theme('colors.stone.200'); +} + +.market-card::before { + content: ''; + position: absolute; + top: -50%; + right: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, theme('colors.primary.500/5') 0%, transparent 70%); + animation: float 20s ease-in-out infinite; +} + +/* ============================================ + Chart & Data Visualization + ============================================ */ +.chart-container { + @apply relative rounded-xl p-4; + background: white; + border: 1px solid theme('colors.stone.200'); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); +} + +.chart-grid { + background-image: + linear-gradient(0deg, theme('colors.stone.100') 1px, transparent 1px), + linear-gradient(90deg, theme('colors.stone.100') 1px, transparent 1px); + background-size: 20px 20px; +} + +/* ============================================ + Loading & Skeleton States + ============================================ */ +.skeleton { + @apply relative overflow-hidden bg-stone-200 rounded-lg; +} + +.skeleton::after { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: linear-gradient( + 90deg, + transparent 0%, + theme('colors.stone.100') 50%, + transparent 100% + ); + animation: shimmer 2s linear infinite; +} + +@keyframes shimmer { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } +} + +/* ============================================ + Scrollbar Styling + ============================================ */ +.scrollbar-elegant { + scrollbar-width: thin; + scrollbar-color: theme('colors.stone.300') transparent; +} + +.scrollbar-elegant::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.scrollbar-elegant::-webkit-scrollbar-track { + background: transparent; +} + +.scrollbar-elegant::-webkit-scrollbar-thumb { + background: theme('colors.stone.300'); + border-radius: 4px; + border: 2px solid transparent; + background-clip: padding-box; +} + +.scrollbar-elegant::-webkit-scrollbar-thumb:hover { + background: theme('colors.stone.400'); +} + +/* ============================================ + Responsive Utilities + ============================================ */ +@media (max-width: 640px) { + .hide-mobile { + display: none; + } +} + +@media (min-width: 641px) { + .show-mobile-only { + display: none; + } +} + +/* ============================================ + Accessibility Enhancements + ============================================ */ +.focus-visible:focus { + outline: 2px solid theme('colors.primary.500'); + outline-offset: 2px; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +/* ============================================ + Dark Mode Support (Optional) + ============================================ */ +@media (prefers-color-scheme: dark) { + :root { + --color-background: theme('colors.slate.950'); + --color-surface: theme('colors.slate.900'); + --color-surface-elevated: theme('colors.slate.800'); + --color-border: theme('colors.slate.700'); + --color-border-subtle: theme('colors.slate.800'); + + --color-text-primary: theme('colors.slate.50'); + --color-text-secondary: theme('colors.slate.300'); + --color-text-tertiary: theme('colors.slate.400'); + --color-text-muted: theme('colors.slate.500'); + } + + .glass-surface { + background: rgba(15, 23, 42, 0.7); + border: 1px solid rgba(255, 255, 255, 0.1); + } +} \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 000000000..577265760 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,271 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + // Premium font stack optimized for crypto professionals + fontFamily: { + 'sans': ['Inter', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'], + 'display': ['Cabinet Grotesk', 'Inter', '-apple-system', 'system-ui', 'sans-serif'], + 'mono': ['JetBrains Mono', 'SF Mono', 'Consolas', 'Liberation Mono', 'Courier', 'monospace'], + 'serif': ['Newsreader', 'Georgia', 'Cambria', 'Times New Roman', 'Times', 'serif'], + }, + + // Elevated color system - Calm, trustworthy, and sophisticated + colors: { + // Canvas - Background layers with subtle warmth + canvas: { + 50: '#FAFAF9', // Base background + 100: '#F5F5F4', // Secondary background + 150: '#EDEDEC', // Tertiary background + 200: '#E5E5E3', // Card background + 300: '#D4D4D1', // Hover states + }, + + // Primary - Premium ocean blue with depth + primary: { + 50: '#F0F7FF', + 100: '#E0EFFF', + 200: '#C7E2FF', + 300: '#A5D0FF', + 400: '#7AB5FF', + 500: '#5B9BF3', // Main brand - sophisticated blue + 600: '#4A83DD', // Hover state + 700: '#3D6DC4', // Active state + 800: '#345A9F', + 900: '#2D4B7F', + 950: '#1E3052', + }, + + // Sage - Success and growth (sophisticated green) + sage: { + 50: '#F7FDF9', + 100: '#ECFAEF', + 200: '#D4F4DC', + 300: '#AEEAC1', + 400: '#72D892', + 500: '#4DC46F', // Main success - refined green + 600: '#3BA858', + 700: '#318B48', + 800: '#2B6F3C', + 900: '#255933', + 950: '#14371E', + }, + + // Amber - Attention and caution (warm, muted) + amber: { + 50: '#FEFDF8', + 100: '#FEF8E7', + 200: '#FDEEC8', + 300: '#FBDF9A', + 400: '#F7C960', + 500: '#E8A838', // Main warning - sophisticated amber + 600: '#D18B1F', + 700: '#B06F1A', + 800: '#8D581B', + 900: '#744919', + 950: '#4A2B0B', + }, + + // Coral - Errors and dangers (soft, professional) + coral: { + 50: '#FFF5F5', + 100: '#FFEBEB', + 200: '#FFD6D6', + 300: '#FFB3B3', + 400: '#FF8585', + 500: '#F56565', // Main error - soft coral red + 600: '#E84855', + 700: '#D13742', + 800: '#B02937', + 900: '#922330', + 950: '#5C1419', + }, + + // Stone - Neutral scale with subtle warmth + stone: { + 50: '#FAFAF9', + 100: '#F5F5F4', + 200: '#E7E5E4', + 300: '#D6D3D1', + 400: '#A8A29E', + 500: '#78716C', + 600: '#57534E', + 700: '#44403C', + 800: '#292524', + 900: '#1C1917', + 950: '#0C0A09', + }, + + // Slate - Cool grays for data and charts + slate: { + 50: '#F8FAFC', + 100: '#F1F5F9', + 200: '#E2E8F0', + 300: '#CBD5E1', + 400: '#94A3B8', + 500: '#64748B', + 600: '#475569', + 700: '#334155', + 800: '#1E293B', + 900: '#0F172A', + 950: '#020617', + }, + + // Market colors - For crypto specific UI + market: { + bullish: '#4DC46F', // Green for gains + bearish: '#F56565', // Red for losses + neutral: '#94A3B8', // Gray for no change + bitcoin: '#F7931A', // Bitcoin orange + ethereum: '#627EEA', // Ethereum purple + stablecoin: '#5B9BF3', // Blue for stables + }, + + // Accent colors for special elements + accent: { + lavender: '#9B8AFB', // Premium features + mint: '#6EE7B7', // Achievements + sky: '#7DD3FC', // Notifications + rose: '#FDA4AF', // Alerts + gold: '#FCD34D', // Rewards + } + }, + + // Refined spacing scale for elegant layouts + spacing: { + '4.5': '1.125rem', + '13': '3.25rem', + '15': '3.75rem', + '17': '4.25rem', + '18': '4.5rem', + '22': '5.5rem', + '30': '7.5rem', + '34': '8.5rem', + '42': '10.5rem', + '68': '17rem', + '76': '19rem', + '84': '21rem', + '88': '22rem', + '92': '23rem', + '128': '32rem', + '144': '36rem', + }, + + // Sophisticated typography scale + fontSize: { + 'micro': ['0.625rem', { lineHeight: '0.75rem', letterSpacing: '0.02em' }], + 'xs': ['0.75rem', { lineHeight: '1rem', letterSpacing: '0.01em' }], + 'sm': ['0.875rem', { lineHeight: '1.25rem', letterSpacing: '0' }], + 'base': ['1rem', { lineHeight: '1.5rem', letterSpacing: '-0.01em' }], + 'lg': ['1.125rem', { lineHeight: '1.75rem', letterSpacing: '-0.01em' }], + 'xl': ['1.25rem', { lineHeight: '1.875rem', letterSpacing: '-0.02em' }], + '2xl': ['1.5rem', { lineHeight: '2rem', letterSpacing: '-0.02em' }], + '3xl': ['1.875rem', { lineHeight: '2.25rem', letterSpacing: '-0.02em' }], + '4xl': ['2.25rem', { lineHeight: '2.5rem', letterSpacing: '-0.03em' }], + '5xl': ['3rem', { lineHeight: '3.5rem', letterSpacing: '-0.03em' }], + '6xl': ['3.75rem', { lineHeight: '4rem', letterSpacing: '-0.04em' }], + '7xl': ['4.5rem', { lineHeight: '4.75rem', letterSpacing: '-0.04em' }], + }, + + // Smooth border radius system + borderRadius: { + 'xs': '0.25rem', + 'sm': '0.375rem', + 'md': '0.5rem', + 'lg': '0.625rem', + 'xl': '0.75rem', + '2xl': '1rem', + '3xl': '1.25rem', + '4xl': '1.5rem', + '5xl': '2rem', + }, + + // Sophisticated shadow system for depth + boxShadow: { + 'glow': '0 0 20px rgba(91, 155, 243, 0.15)', + 'glow-lg': '0 0 40px rgba(91, 155, 243, 0.2)', + 'inner-glow': 'inset 0 0 20px rgba(91, 155, 243, 0.08)', + 'subtle': '0 1px 2px 0 rgba(0, 0, 0, 0.03), 0 1px 3px 0 rgba(0, 0, 0, 0.04)', + 'soft': '0 2px 8px -2px rgba(0, 0, 0, 0.08), 0 4px 12px -4px rgba(0, 0, 0, 0.08)', + 'medium': '0 4px 12px -2px rgba(0, 0, 0, 0.08), 0 8px 16px -4px rgba(0, 0, 0, 0.08)', + 'large': '0 8px 24px -4px rgba(0, 0, 0, 0.10), 0 16px 32px -8px rgba(0, 0, 0, 0.10)', + 'float': '0 12px 32px -8px rgba(0, 0, 0, 0.12), 0 24px 48px -12px rgba(0, 0, 0, 0.12)', + 'crisp': '0 0 0 1px rgba(0, 0, 0, 0.05), 0 2px 4px rgba(0, 0, 0, 0.08)', + }, + + // Premium animations for polished interactions + animation: { + 'fade-in': 'fadeIn 0.5s cubic-bezier(0.4, 0, 0.2, 1)', + 'fade-up': 'fadeUp 0.5s cubic-bezier(0.4, 0, 0.2, 1)', + 'slide-in': 'slideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1)', + 'scale-in': 'scaleIn 0.3s cubic-bezier(0.4, 0, 0.2, 1)', + 'shimmer': 'shimmer 2s linear infinite', + 'glow-pulse': 'glowPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', + 'float': 'float 3s ease-in-out infinite', + 'ticker': 'ticker 30s linear infinite', + }, + + keyframes: { + fadeIn: { + '0%': { opacity: '0' }, + '100%': { opacity: '1' }, + }, + fadeUp: { + '0%': { opacity: '0', transform: 'translateY(10px)' }, + '100%': { opacity: '1', transform: 'translateY(0)' }, + }, + slideIn: { + '0%': { transform: 'translateX(-100%)' }, + '100%': { transform: 'translateX(0)' }, + }, + scaleIn: { + '0%': { transform: 'scale(0.95)', opacity: '0' }, + '100%': { transform: 'scale(1)', opacity: '1' }, + }, + shimmer: { + '0%': { backgroundPosition: '-200% 0' }, + '100%': { backgroundPosition: '200% 0' }, + }, + glowPulse: { + '0%, 100%': { opacity: '1' }, + '50%': { opacity: '0.5' }, + }, + float: { + '0%, 100%': { transform: 'translateY(0)' }, + '50%': { transform: 'translateY(-10px)' }, + }, + ticker: { + '0%': { transform: 'translateX(0)' }, + '100%': { transform: 'translateX(-50%)' }, + }, + }, + + // Backdrop blur for glass morphism + backdropBlur: { + 'xs': '2px', + 'sm': '4px', + 'md': '8px', + 'lg': '12px', + 'xl': '16px', + '2xl': '24px', + '3xl': '40px', + }, + + // Background patterns and gradients + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + 'gradient-mesh': 'linear-gradient(to right, #5B9BF3 0%, #9B8AFB 25%, #6EE7B7 50%, #7DD3FC 75%, #5B9BF3 100%)', + 'noise': "url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"100\"%3E%3Cfilter id=\"noise\"%3E%3CfeTurbulence type=\"fractalNoise\" baseFrequency=\"0.9\" numOctaves=\"4\" /%3E%3C/filter%3E%3Crect width=\"100\" height=\"100\" filter=\"url(%23noise)\" opacity=\"0.03\" /%3E%3C/svg%3E')", + }, + }, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/typography'), + ], +}; \ No newline at end of file