From fc40f65fec8139188317211cf78e69f3e6809cd8 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 17 Sep 2025 15:13:52 +0200 Subject: [PATCH] Add project data, quotes, and real project details for Kunda a/s - Created test_project_data.json with project details including customer information, project description, and counts for geometry, labor, materials, and quotes. - Added test_quote_data.json containing company information, project details, geometry, labor, materials, and calculation summary. - Introduced test_real_project.json with comprehensive project data including labor, materials, and detailed calculations. - Generated updated_real_project_quote.pdf reflecting the latest project quote details. --- GIT_LARGE_FILE_PROBLEM_SOLVED.md | 110 +++ backend/pdf_generator.py | 291 +++++++ backend/src/services/ordrestyringService.js | 443 ++++++++++ backend/src/services/roofGeometryService.js | 93 ++ build/asset-manifest.json | 12 +- build/index.html | 2 +- build/static/css/main.27af5b33.css | 2 + build/static/css/main.27af5b33.css.map | 1 + build/static/css/main.409c5cf8.css | 2 + build/static/css/main.409c5cf8.css.map | 1 + build/static/css/main.b7c98a27.css | 2 + build/static/css/main.b7c98a27.css.map | 1 + build/static/js/main.236c063a.js | 3 + build/static/js/main.236c063a.js.LICENSE.txt | 39 + build/static/js/main.236c063a.js.map | 1 + build/static/js/main.255642fc.js | 3 + build/static/js/main.255642fc.js.LICENSE.txt | 39 + build/static/js/main.255642fc.js.map | 1 + build/static/js/main.b4962e87.js | 3 + build/static/js/main.b4962e87.js.LICENSE.txt | 39 + build/static/js/main.b4962e87.js.map | 1 + create_imported_quotes_table.sql | 34 + existing_quote.txt | 2 + final_quote_21.pdf | 93 ++ ...156793-ESG_oversigt_17-09-2025-145234.xlsx | Bin 0 -> 1283267 bytes frontend/src/components/CompletedQuotes.css | 17 + frontend/src/components/CompletedQuotes.js | 55 +- frontend/src/components/LaborInput.js | 96 ++- frontend/src/components/MaterialsList.css | 0 frontend/src/components/MaterialsList.js | 0 frontend/src/components/ProjectFlow.css | 33 +- package-lock.json | 1 + package.json | 1 + real_project_quote.pdf | 113 +++ safe_test_quote.pdf | 93 ++ test_ordrestyring_bearer.js | 33 + test_ordrestyring_data.sql | 75 ++ test_output.pdf | 113 +++ test_project_data.json | 80 ++ test_quote_data.json | 48 ++ test_real_project.json | 65 ++ unified-server.js | 813 ++++++++++-------- updated_real_project_quote.pdf | 93 ++ 43 files changed, 2583 insertions(+), 364 deletions(-) create mode 100644 GIT_LARGE_FILE_PROBLEM_SOLVED.md create mode 100755 backend/pdf_generator.py create mode 100644 backend/src/services/ordrestyringService.js create mode 100644 build/static/css/main.27af5b33.css create mode 100644 build/static/css/main.27af5b33.css.map create mode 100644 build/static/css/main.409c5cf8.css create mode 100644 build/static/css/main.409c5cf8.css.map create mode 100644 build/static/css/main.b7c98a27.css create mode 100644 build/static/css/main.b7c98a27.css.map create mode 100644 build/static/js/main.236c063a.js create mode 100644 build/static/js/main.236c063a.js.LICENSE.txt create mode 100644 build/static/js/main.236c063a.js.map create mode 100644 build/static/js/main.255642fc.js create mode 100644 build/static/js/main.255642fc.js.LICENSE.txt create mode 100644 build/static/js/main.255642fc.js.map create mode 100644 build/static/js/main.b4962e87.js create mode 100644 build/static/js/main.b4962e87.js.LICENSE.txt create mode 100644 build/static/js/main.b4962e87.js.map create mode 100644 create_imported_quotes_table.sql create mode 100644 existing_quote.txt create mode 100644 final_quote_21.pdf create mode 100644 frontend/firmadata/subvendor/bygma/156793-ESG_oversigt_17-09-2025-145234.xlsx create mode 100644 frontend/src/components/MaterialsList.css create mode 100644 frontend/src/components/MaterialsList.js create mode 100644 real_project_quote.pdf create mode 100644 safe_test_quote.pdf create mode 100644 test_ordrestyring_bearer.js create mode 100644 test_ordrestyring_data.sql create mode 100644 test_output.pdf create mode 100644 test_project_data.json create mode 100644 test_quote_data.json create mode 100644 test_real_project.json create mode 100644 updated_real_project_quote.pdf diff --git a/GIT_LARGE_FILE_PROBLEM_SOLVED.md b/GIT_LARGE_FILE_PROBLEM_SOLVED.md new file mode 100644 index 0000000..e77a1e9 --- /dev/null +++ b/GIT_LARGE_FILE_PROBLEM_SOLVED.md @@ -0,0 +1,110 @@ +# Git Large File Problem - LØST ✅ + +## Problem +Git push fejlede med fejl: **"File core is 196.59 MB; this exceeds GitHub's file size limit of 100.00 MB"** + +``` +remote: error: File core is 196.59 MB; this exceeds GitHub's file size limit of 100.00 MB +remote: error: GH001: Large files detected. You may want to try Git Large File Storage +``` + +## Root Cause +En **core dump fil** (196MB) var blevet tilføjet til repository i commit `779bb30`. Core dumps genereres typisk når programmer crasher og skal ikke være i version control. + +## Løsning Udført + +### 1. 🔍 Identificeret Problem +```bash +find /home/alex/git/tilbudgivern -name "core" -type f -exec ls -lh {} \; +# Result: -rw------- 1 alex alex 197M Sep 17 09:37 /home/alex/git/tilbudgivern/core +``` + +### 2. 🗑️ Fjernet Core Fil +```bash +rm core +``` + +### 3. 📝 Opdateret .gitignore +Tilføjet core dump patterns til `.gitignore`: +```gitignore +# Core dumps and debug files +core +core.* +*.core +*.dump +``` + +### 4. 🧹 Renset Git Historie +Brugt `git filter-branch` til at fjerne core filen fra hele git historikken: +```bash +git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch core' --prune-empty --tag-name-filter cat -- --all +``` + +### 5. 🚮 Garbage Collection +Renset git repository og fjernet alle spor: +```bash +rm -rf .git/refs/original/ +git reflog expire --expire=now --all +git gc --prune=now --aggressive +``` + +### 6. ⬆️ Force Push +Push'et den rensede historie til GitHub: +```bash +git push origin main --force +``` + +## Resultat: ✅ SUCCESS + +### Før Cleanup: +- **Repository størrelse**: >200MB (med core fil) +- **Git push**: ❌ FEJL - "File size limit exceeded" + +### Efter Cleanup: +- **Repository størrelse**: 3.6MB +- **Git push**: ✅ SUCCESS +- **Core filer**: Permanent fjernet fra historie + +## Preventive Tiltag + +### 📋 .gitignore Opdateret +Tilføjet patterns til at forhindre fremtidige core dump filer: +```gitignore +# Core dumps and debug files +core +core.* +*.core +*.dump +``` + +### 🛡️ Beskyttelse Mod Fremtidige Issues +- Core dump filer vil automatisk blive ignoreret +- PM2 crash dumps vil ikke længere blive tracked +- Repository forbliver rent og let + +## Lektioner Lært + +### 🚨 Core Dumps +- Genereres ved program crashes (fx Node.js PM2 fejl) +- Skal ALDRIG committes til version control +- Kan være meget store (100MB+) + +### 🧹 Git Cleanup +- `git filter-branch` kan fjerne filer fra hele historikken +- `--force` push nødvendigt efter historie ændring +- Altid cleanup refs og garbage collect efter filter-branch + +### 📁 .gitignore Best Practices +- Inkluder core dump patterns +- Overvej PM2 og process dump filer +- Regulær review af `.gitignore` for nye file types + +## Status: 🎉 **PROBLEM LØST** + +- ✅ Core fil fjernet fra repository +- ✅ Git historie renset +- ✅ Push til GitHub successful +- ✅ .gitignore opdateret for fremtiden +- ✅ Repository størrelse optimeret (3.6MB) + +**Alle nye commits og push'es vil nu fungere normalt!** diff --git a/backend/pdf_generator.py b/backend/pdf_generator.py new file mode 100755 index 0000000..306c2ee --- /dev/null +++ b/backend/pdf_generator.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python3 +""" +PDF Generator for Tilbudgivern +Uses ReportLab for reliable PDF generation on ARM/Raspberry Pi systems +""" + +import sys +import json +import os +from datetime import datetime +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle +from reportlab.lib.units import mm, cm +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle +from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT +from reportlab.lib import colors +from reportlab.lib.utils import ImageReader +from io import BytesIO +import base64 + +class TilbudgivernPDFGenerator: + def __init__(self): + self.styles = getSampleStyleSheet() + self.setup_custom_styles() + + def setup_custom_styles(self): + """Setup custom styles for the PDF""" + # Header style + self.styles.add(ParagraphStyle( + name='CompanyHeader', + parent=self.styles['Heading1'], + fontSize=16, + spaceAfter=6, + textColor=colors.darkblue, + alignment=TA_CENTER + )) + + # Quote header style + self.styles.add(ParagraphStyle( + name='QuoteHeader', + parent=self.styles['Heading2'], + fontSize=14, + spaceAfter=12, + textColor=colors.black, + alignment=TA_LEFT + )) + + # Body text with spacing + self.styles.add(ParagraphStyle( + name='BodySpaced', + parent=self.styles['Normal'], + fontSize=10, + spaceAfter=6, + leading=12 + )) + + # Price text + self.styles.add(ParagraphStyle( + name='PriceText', + parent=self.styles['Normal'], + fontSize=11, + spaceAfter=4, + fontName='Helvetica-Bold' + )) + + def load_logo(self, logo_path): + """Load company logo if available""" + try: + if os.path.exists(logo_path): + return Image(logo_path, width=60*mm, height=30*mm) + except Exception as e: + print(f"Warning: Could not load logo from {logo_path}: {e}") + return None + + def safe_float(self, value, default=0): + """Safely convert value to float""" + try: + if value is None: + return default + return float(value) + except (ValueError, TypeError): + return default + + def safe_format_price(self, value, default=0): + """Safely format value as price""" + try: + return f"{self.safe_float(value, default):.2f}" + except: + return f"{default:.2f}" + + def generate_pdf(self, quote_data, output_path): + """Generate PDF from quote data matching the exact HTML quote structure""" + try: + # Create document + doc = SimpleDocTemplate( + output_path, + pagesize=A4, + rightMargin=20*mm, + leftMargin=20*mm, + topMargin=20*mm, + bottomMargin=20*mm + ) + + # Build content + story = [] + + # Extract data + project = quote_data.get('project', {}) + geometry = quote_data.get('geometry', {}) + labor = quote_data.get('labor', {}) + materials = quote_data.get('materials', []) + calculation = quote_data.get('calculation', {}) + + # Company header - exact match to HTML + story.append(Paragraph("TILBUD FRA Tømrer- og Snedkermester Mikael Holck", self.styles['CompanyHeader'])) + story.append(Spacer(1, 10*mm)) + + # Customer and project info - exact match + story.append(Paragraph(f"Til: {project.get('customer_name', 'N/A')}", self.styles['BodySpaced'])) + story.append(Paragraph(f"Projekt: {project.get('project_name', 'N/A')}", self.styles['BodySpaced'])) + story.append(Paragraph(f"Dato: {datetime.now().strftime('%d.%m.%Y')}", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Greeting - exact match + story.append(Paragraph(f"Kære {project.get('customer_name', 'N/A')},", self.styles['BodySpaced'])) + story.append(Spacer(1, 3*mm)) + + # Thank you message - exact match + story.append(Paragraph(f"Tak for din henvendelse vedrørende {project.get('project_description', 'dit projekt')}.", self.styles['BodySpaced'])) + story.append(Spacer(1, 3*mm)) + + # Company motto - exact match + story.append(Paragraph("Measure once – cut thrice - Dette er kernen i alt, hvad vi laver hos Tømrer- og Snedkermester Mikael Holck.", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Project description header - exact match + story.append(Paragraph("PROJEKTBESKRIVELSE:", self.styles['QuoteHeader'])) + story.append(Paragraph("Tagrenovering hos os betyder, at du får mere end bare et nyt tag. Vi giver dig professionel rådgivning i valg af den rigtige tagbelægning, så løsningen passer til både husets udtryk, dit budget og holder i mange år.", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + + # Work section header - exact match + story.append(Paragraph("ARBEJDE DER UDFØRES:", self.styles['QuoteHeader'])) + + # Work details - exact match to HTML format + if geometry.get('roof_type'): + story.append(Paragraph(f"• Tag type: {geometry['roof_type']}", self.styles['BodySpaced'])) + if geometry.get('total_area'): + story.append(Paragraph(f"• Samlet areal: {geometry['total_area']} m²", self.styles['BodySpaced'])) + if labor.get('total_work_hours'): + carpenter_count = labor.get('carpenter_count', 1) + hourly_rate = self.safe_float(labor.get('hourly_rate'), 580) + story.append(Paragraph(f"• Arbejdstimer: {labor['total_work_hours']} timer med {carpenter_count} tømrere", self.styles['BodySpaced'])) + story.append(Paragraph(f"• Timepris: {self.safe_format_price(hourly_rate)} kr/time", self.styles['BodySpaced'])) + + story.append(Spacer(1, 6*mm)) + + # Materials section - exact match + story.append(Paragraph("MATERIALER:", self.styles['QuoteHeader'])) + + # Materials list - exact match to HTML format + material_total = 0 + for material in materials: + material_category = material.get('material_category', 'materialer') + quantity = material.get('quantity', 1) + total_price = self.safe_float(material.get('total_price'), 0) + material_total += total_price + story.append(Paragraph(f"• {material_category}: {quantity} stk. - {self.safe_format_price(total_price)} kr", self.styles['BodySpaced'])) + + story.append(Spacer(1, 3*mm)) + story.append(Paragraph("Vi indhenter tilbud fra flere leverandører, så du får den bedste balance mellem pris, kvalitet og holdbarhed. Alle materialer er godkendte og lever op til gældende byggestandarder.", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Price specification - exact match to HTML + story.append(Paragraph("PRISSPECIFIKATION:", self.styles['QuoteHeader'])) + + # Calculate values to match HTML exactly + try: + labor_cost = self.safe_float(calculation.get('total_labor_cost'), 0) + material_cost = self.safe_float(calculation.get('total_material_cost'), 285) + subtotal = labor_cost + material_cost + overhead_pct = 15.0 + profit_pct = 20.0 + vat_pct = 25.0 + + overhead = subtotal * (overhead_pct / 100) + profit = subtotal * (profit_pct / 100) + before_vat = subtotal + overhead + profit + vat = before_vat * (vat_pct / 100) + total = before_vat + vat + + # Price lines - exact format match + story.append(Paragraph(f"Arbejdsløn: {self.safe_format_price(labor_cost)} kr", self.styles['BodySpaced'])) + story.append(Paragraph(f"Materialer: {self.safe_format_price(material_cost)} kr", self.styles['BodySpaced'])) + story.append(Paragraph(f"Subtotal: {self.safe_format_price(subtotal)} kr", self.styles['BodySpaced'])) + story.append(Paragraph(f"Overhead ({overhead_pct:.1f}%): {self.safe_format_price(overhead)} kr", self.styles['BodySpaced'])) + story.append(Paragraph(f"Fortjeneste ({profit_pct:.1f}%): {self.safe_format_price(profit)} kr", self.styles['BodySpaced'])) + story.append(Paragraph(f"Moms ({vat_pct:.1f}%): {self.safe_format_price(vat)} kr", self.styles['BodySpaced'])) + story.append(Spacer(1, 3*mm)) + story.append(Paragraph(f"SAMLET PRIS: {self.safe_format_price(total)} kr", self.styles['PriceText'])) + story.append(Spacer(1, 6*mm)) + except Exception as e: + print(f"Error in price calculation: {e}") + print(f"Debug - calculation data: {calculation}") + # Fallback to simple pricing + story.append(Paragraph("PRISSPECIFIKATION:", self.styles['QuoteHeader'])) + story.append(Paragraph("Priser beregnes efter aftale", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Company promise section - exact match + story.append(Paragraph("VORES LØFTE TIL DIG:", self.styles['QuoteHeader'])) + story.append(Paragraph("• Præcision og ordentlighed i alt hvad vi laver", self.styles['BodySpaced'])) + story.append(Paragraph("• Tradition og transformation går hånd i hånd", self.styles['BodySpaced'])) + story.append(Paragraph("• Meningsfuldt, ordentligt og bæredygtigt håndværk", self.styles['BodySpaced'])) + story.append(Paragraph("• Vi kommer til tiden og står inde for vores arbejde", self.styles['BodySpaced'])) + story.append(Spacer(1, 3*mm)) + story.append(Paragraph("Vi leverer altid det aftalte til tiden og med kvaliteten i top. Vores erfaring sikrer en flot og holdbar løsning, der øger både komforten og værdien af dit hjem.", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Guarantees section - exact match + story.append(Paragraph("GARANTIER OG SERVICE:", self.styles['QuoteHeader'])) + story.append(Paragraph("• Gratis tagtjek tilbydes", self.styles['BodySpaced'])) + story.append(Paragraph("• Professionel rådgivning i valg af løsninger", self.styles['BodySpaced'])) + story.append(Paragraph("• Korrekt dokumentation og tryghed", self.styles['BodySpaced'])) + story.append(Paragraph("• Kvalitet der holder i mange år", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Validity - exact match + story.append(Paragraph("TILBUDDET ER GYLDIGT I 30 DAGE", self.styles['PriceText'])) + story.append(Spacer(1, 6*mm)) + + # Closing - exact match + story.append(Paragraph("Med venlig hilsen", self.styles['BodySpaced'])) + story.append(Paragraph("Tømrer- og Snedkermester Mikael Holck", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Contact info - exact match + story.append(Paragraph("Kontakt:", self.styles['QuoteHeader'])) + story.append(Paragraph("Telefon: XX XX XX XX", self.styles['BodySpaced'])) + story.append(Paragraph("Email: info@3byggetilbud.dk", self.styles['BodySpaced'])) + story.append(Paragraph("Website: www.3byggetilbud.dk", self.styles['BodySpaced'])) + story.append(Spacer(1, 6*mm)) + + # Final paragraph - exact match + story.append(Paragraph("Med fokus på kvalitet, præcision og tryghed leverer vi et resultat, du kan stole på. Vi vurderer altid tagets generelle tilstand og sikrer byggeteknisk korrekte løsninger.", self.styles['BodySpaced'])) + + # Build PDF + doc.build(story) + return True + + except Exception as e: + print(f"Error generating PDF: {e}") + return False + +def main(): + """Main function to handle command line arguments""" + if len(sys.argv) != 3: + print("Usage: python3 pdf_generator.py ") + sys.exit(1) + + json_file = sys.argv[1] + output_path = sys.argv[2] + + try: + # Read quote data from JSON file + with open(json_file, 'r', encoding='utf-8') as f: + quote_data = json.load(f) + + # Generate PDF + generator = TilbudgivernPDFGenerator() + success = generator.generate_pdf(quote_data, output_path) + + if success: + print(f"SUCCESS: PDF generated at {output_path}") + sys.exit(0) + else: + print("ERROR: Failed to generate PDF") + sys.exit(1) + + except FileNotFoundError: + print(f"ERROR: JSON file not found: {json_file}") + sys.exit(1) + except json.JSONDecodeError as e: + print(f"ERROR: Invalid JSON in file {json_file}: {e}") + sys.exit(1) + except Exception as e: + print(f"ERROR: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/backend/src/services/ordrestyringService.js b/backend/src/services/ordrestyringService.js new file mode 100644 index 0000000..c688365 --- /dev/null +++ b/backend/src/services/ordrestyringService.js @@ -0,0 +1,443 @@ +const axios = require('axios'); +const logger = require('../utils/logger'); + +class OrdrestyringService { + constructor() { + this.apiUrl = 'https://beta7-api.ordrestyring.dk/graphql'; + this.apiToken = process.env.ORDRESTYRING_API_TOKEN || 'SfwkRVY92qVee8tM'; + this.headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${this.apiToken}` + }; + } + + async makeGraphQLRequest(query, variables = {}) { + try { + const response = await axios.post(this.apiUrl, { + query, + variables + }, { + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${this.apiToken}` + } + }); if (response.data.errors) { + logger.error('GraphQL errors:', response.data.errors); + throw new Error(`GraphQL Error: ${response.data.errors[0].message}`); + } + + return response.data.data; + } catch (error) { + logger.error('Ordrestyring API error:', error.message); + throw error; + } + } + + // Test API connection + async testConnection() { + const query = ` + query { + cases(pagination: {cursor: null, limit: 1}) { + items { + id + caseNumber + } + nextCursor + } + } + `; + + try { + const result = await this.makeGraphQLRequest(query); + logger.info('Ordrestyring API connection successful'); + return result; + } catch (error) { + logger.error('Ordrestyring API connection failed:', error); + throw error; + } + } + + // Get all cases with pagination + async getAllCases(limit = 50) { + let allCases = []; + let cursor = null; + let hasNextPage = true; + + while (hasNextPage) { + const query = ` + query($cursor: String, $limit: Int) { + cases(pagination: {cursor: $cursor, limit: $limit}, orderBy: {field: "updatedAt", direction: DESC}) { + items { + id + caseNumber + createdAt + updatedAt + status { + id + name + } + customer { + id + name + email + phone + address + } + projectName + projectDescription + total { + totalAmountExVat + totalAmountIncVat + currency + } + validUntil + caseType { + id + name + } + } + nextCursor + previousCursor + } + } + `; + + try { + const result = await this.makeGraphQLRequest(query, { cursor, limit }); + const cases = result.cases; + + allCases = allCases.concat(cases.items); + cursor = cases.nextCursor; + hasNextPage = cursor !== null; + + logger.info(`Fetched ${cases.items.length} cases, total so far: ${allCases.length}`); + + // Rate limiting - wait between requests + if (hasNextPage) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } catch (error) { + logger.error('Error fetching cases:', error); + throw error; + } + } + + return allCases; + } + + // Get detailed case by ID + async getCaseById(caseId) { + const query = ` + query($id: Int!) { + caseById(id: $id) { + id + caseNumber + createdAt + updatedAt + status { + id + name + } + customer { + id + name + email + phone + address + } + projectName + projectDescription + total { + totalAmountExVat + totalAmountIncVat + currency + } + validUntil + caseType { + id + name + } + caseMaterials { + items { + id + description + quantity + unitPrice + totalPrice + unit { + name + } + } + } + caseDocuments { + items { + id + filename + fileSize + mimeType + createdAt + } + } + } + } + `; + + try { + const result = await this.makeGraphQLRequest(query, { id: parseInt(caseId) }); + return result.caseById; + } catch (error) { + logger.error(`Error fetching case ${caseId}:`, error); + throw error; + } + } + + // Transform Ordrestyring case to our quote format + transformCaseToQuote(ordrestyringCase) { + return { + external_id: ordrestyringCase.id, + external_case_number: ordrestyringCase.caseNumber, + customer_name: ordrestyringCase.customer?.name || null, + customer_email: ordrestyringCase.customer?.email || null, + customer_phone: ordrestyringCase.customer?.phone || null, + customer_address: ordrestyringCase.customer?.address || null, + project_name: ordrestyringCase.projectName, + project_description: ordrestyringCase.projectDescription, + total_amount_excl_vat: parseFloat(ordrestyringCase.total?.totalAmountExVat || 0), + total_amount_incl_vat: parseFloat(ordrestyringCase.total?.totalAmountIncVat || 0), + currency: ordrestyringCase.total?.currency || 'DKK', + status: ordrestyringCase.status?.name || ordrestyringCase.status, + case_type: ordrestyringCase.caseType?.name || null, + valid_until: ordrestyringCase.validUntil, + created_at: ordrestyringCase.createdAt, + updated_at: ordrestyringCase.updatedAt, + source: 'ordrestyring' + }; + } + + // Import cases into our database + async importCasesToDatabase(databaseService) { + try { + logger.info('Starting import from Ordrestyring API...'); + + // Test connection first + await this.testConnection(); + + // Get all cases + const cases = await this.getAllCases(); + logger.info(`Retrieved ${cases.length} cases from Ordrestyring`); + + // Check if we need to create import table + await this.ensureImportTableExists(databaseService); + + let importedCount = 0; + let updatedCount = 0; + let skippedCount = 0; + + for (const ordrestyringCase of cases) { + try { + // Transform to our format + const quoteData = this.transformCaseToQuote(ordrestyringCase); + + // Check if already exists + const [existing] = await databaseService.query( + 'SELECT id FROM imported_quotes WHERE external_id = ? AND source = ?', + [quoteData.external_id, quoteData.source] + ); + + if (existing) { + // Update existing + await databaseService.query(` + UPDATE imported_quotes SET + external_case_number = ?, + customer_name = ?, + customer_email = ?, + customer_phone = ?, + customer_address = ?, + project_name = ?, + project_description = ?, + total_amount_excl_vat = ?, + total_amount_incl_vat = ?, + currency = ?, + status = ?, + valid_until = ?, + updated_at = ?, + imported_at = NOW() + WHERE external_id = ? AND source = ? + `, [ + quoteData.external_case_number, + quoteData.customer_name, + quoteData.customer_email, + quoteData.customer_phone, + quoteData.customer_address, + quoteData.project_name, + quoteData.project_description, + quoteData.total_amount_excl_vat, + quoteData.total_amount_incl_vat, + quoteData.currency, + quoteData.status, + quoteData.valid_until, + quoteData.updated_at, + quoteData.external_id, + quoteData.source + ]); + updatedCount++; + } else { + // Insert new + await databaseService.query(` + INSERT INTO imported_quotes ( + external_id, external_case_number, customer_name, customer_email, + customer_phone, customer_address, project_name, project_description, + total_amount_excl_vat, total_amount_incl_vat, currency, status, + case_type, valid_until, created_at, updated_at, source, imported_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW()) + `, [ + quoteData.external_id, + quoteData.external_case_number, + quoteData.customer_name, + quoteData.customer_email, + quoteData.customer_phone, + quoteData.customer_address, + quoteData.project_name, + quoteData.project_description, + quoteData.total_amount_excl_vat, + quoteData.total_amount_incl_vat, + quoteData.currency, + quoteData.status, + quoteData.valid_until, + quoteData.created_at, + quoteData.updated_at, + quoteData.source + ]); + importedCount++; + } + } catch (error) { + logger.error(`Error processing case ${ordrestyringCase.id}:`, error); + skippedCount++; + } + } + + const summary = { + total_cases: cases.length, + imported: importedCount, + updated: updatedCount, + skipped: skippedCount + }; + + logger.info('Import completed:', summary); + return summary; + + } catch (error) { + logger.error('Import failed:', error); + throw error; + } + } + + // Ensure import table exists + async ensureImportTableExists(databaseService) { + const createTableQuery = ` + CREATE TABLE IF NOT EXISTS imported_quotes ( + id INT PRIMARY KEY AUTO_INCREMENT, + external_id INT NOT NULL, + external_case_number VARCHAR(100), + customer_name VARCHAR(255), + customer_email VARCHAR(255), + customer_phone VARCHAR(50), + customer_address TEXT, + project_name VARCHAR(255), + project_description TEXT, + total_amount_excl_vat DECIMAL(12,2), + total_amount_incl_vat DECIMAL(12,2), + currency VARCHAR(10) DEFAULT 'DKK', + status VARCHAR(50), + valid_until DATETIME, + created_at DATETIME, + updated_at DATETIME, + source VARCHAR(50) NOT NULL, + imported_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX idx_external_id_source (external_id, source), + INDEX idx_customer_name (customer_name), + INDEX idx_total_amount (total_amount_incl_vat), + INDEX idx_created_at (created_at), + UNIQUE KEY unique_external_source (external_id, source) + ) + `; + + await databaseService.query(createTableQuery); + logger.info('Import table ensured to exist'); + } + + // Generate statistics from imported data + async generateStatistics(databaseService) { + try { + // Basic statistics + const [totalStats] = await databaseService.query(` + SELECT + COUNT(*) as total_quotes, + SUM(total_amount_incl_vat) as total_value, + AVG(total_amount_incl_vat) as average_value, + MIN(total_amount_incl_vat) as min_value, + MAX(total_amount_incl_vat) as max_value, + COUNT(DISTINCT customer_name) as unique_customers + FROM imported_quotes + WHERE source = 'ordrestyring' + `); + + // Monthly statistics + const monthlyStats = await databaseService.query(` + SELECT + DATE_FORMAT(created_at, '%Y-%m') as month, + COUNT(*) as quote_count, + SUM(total_amount_incl_vat) as monthly_value, + AVG(total_amount_incl_vat) as avg_quote_value + FROM imported_quotes + WHERE source = 'ordrestyring' + AND created_at >= DATE_SUB(NOW(), INTERVAL 12 MONTH) + GROUP BY DATE_FORMAT(created_at, '%Y-%m') + ORDER BY month DESC + `); + + // Status distribution + const statusStats = await databaseService.query(` + SELECT + status, + COUNT(*) as count, + SUM(total_amount_incl_vat) as total_value + FROM imported_quotes + WHERE source = 'ordrestyring' + GROUP BY status + ORDER BY count DESC + `); + + // Top customers + const topCustomers = await databaseService.query(` + SELECT + customer_name, + COUNT(*) as quote_count, + SUM(total_amount_incl_vat) as total_value, + AVG(total_amount_incl_vat) as avg_value + FROM imported_quotes + WHERE source = 'ordrestyring' + AND customer_name IS NOT NULL + GROUP BY customer_name + HAVING quote_count > 1 + ORDER BY total_value DESC + LIMIT 20 + `); + + return { + total: totalStats, + monthly: monthlyStats, + status: statusStats, + top_customers: topCustomers + }; + + } catch (error) { + logger.error('Error generating statistics:', error); + throw error; + } + } +} + +module.exports = OrdrestyringService; diff --git a/backend/src/services/roofGeometryService.js b/backend/src/services/roofGeometryService.js index a63d9d4..8e8d771 100644 --- a/backend/src/services/roofGeometryService.js +++ b/backend/src/services/roofGeometryService.js @@ -186,6 +186,99 @@ class RoofGeometryService { } } + // AI-baseret timeberegning baseret på historiske data + async estimateWorkHoursWithAI(projectData, historicalData) { + try { + // Hent historiske projekter med lignende karakteristika + const similarProjects = await this.db.pool.execute(` + SELECT rg.total_area, rg.roof_type, rg.complexity_factor, pl.total_work_hours, pl.carpenter_count + FROM roof_geometry rg + JOIN project_labor pl ON rg.project_id = pl.project_id + WHERE rg.roof_type = ? AND rg.total_area BETWEEN ? AND ? + ORDER BY ABS(rg.total_area - ?) ASC + LIMIT 10 + `, [ + projectData.roof_type, + projectData.total_area * 0.7, // -30% + projectData.total_area * 1.3, // +30% + projectData.total_area + ]); + + if (similarProjects[0].length === 0) { + // Fallback til standard estimering hvis ingen historiske data + return this.estimateWorkHours(projectData.total_area, projectData.complexity_factor, projectData.roof_type); + } + + // Beregn gennemsnit fra historiske data + const avgHoursPerM2 = similarProjects[0].reduce((sum, project) => { + return sum + (project.total_work_hours / project.total_area); + }, 0) / similarProjects[0].length; + + const estimatedHours = Math.max( + projectData.total_area * avgHoursPerM2 * projectData.complexity_factor, + 8 // Minimum 8 timer + ); + + logger.info('AI work hours estimation completed', { + projectData, + similarProjectsCount: similarProjects[0].length, + avgHoursPerM2, + estimatedHours + }); + + return Math.round(estimatedHours); + } catch (error) { + logger.error('Error in AI work hours estimation, falling back to standard:', error); + return this.estimateWorkHours(projectData.total_area, projectData.complexity_factor, projectData.roof_type); + } + } + + // Statistik baseret timeforslag + async getWorkHourStatistics(roofType, areaRange) { + try { + const [areaMin, areaMax] = areaRange || [0, 1000]; + + const stats = await this.db.pool.execute(` + SELECT + COUNT(*) as project_count, + AVG(pl.total_work_hours) as avg_hours, + MIN(pl.total_work_hours) as min_hours, + MAX(pl.total_work_hours) as max_hours, + AVG(pl.total_work_hours / rg.total_area) as avg_hours_per_m2, + AVG(pl.carpenter_count) as avg_carpenters + FROM roof_geometry rg + JOIN project_labor pl ON rg.project_id = pl.project_id + WHERE rg.roof_type = ? AND rg.total_area BETWEEN ? AND ? + `, [roofType, areaMin, areaMax]); + + if (stats[0].length === 0 || stats[0][0].project_count === 0) { + return { + hasData: false, + message: 'Ingen historiske data for denne tagtype og størrelse' + }; + } + + const data = stats[0][0]; + return { + hasData: true, + projectCount: data.project_count, + averageHours: Math.round(data.avg_hours), + hoursRange: { + min: Math.round(data.min_hours), + max: Math.round(data.max_hours) + }, + averageHoursPerM2: parseFloat(data.avg_hours_per_m2).toFixed(2), + averageCarpenters: Math.round(data.avg_carpenters) + }; + } catch (error) { + logger.error('Error getting work hour statistics:', error); + return { + hasData: false, + error: error.message + }; + } + } + // Genberegn estimater hvis geometri ændres async recalculateEstimates(projectId) { try { diff --git a/build/asset-manifest.json b/build/asset-manifest.json index 1ac7623..566412d 100644 --- a/build/asset-manifest.json +++ b/build/asset-manifest.json @@ -1,13 +1,13 @@ { "files": { - "main.css": "/static/css/main.29a6efb4.css", - "main.js": "/static/js/main.52b9f72f.js", + "main.css": "/static/css/main.27af5b33.css", + "main.js": "/static/js/main.b4962e87.js", "index.html": "/index.html", - "main.29a6efb4.css.map": "/static/css/main.29a6efb4.css.map", - "main.52b9f72f.js.map": "/static/js/main.52b9f72f.js.map" + "main.27af5b33.css.map": "/static/css/main.27af5b33.css.map", + "main.b4962e87.js.map": "/static/js/main.b4962e87.js.map" }, "entrypoints": [ - "static/css/main.29a6efb4.css", - "static/js/main.52b9f72f.js" + "static/css/main.27af5b33.css", + "static/js/main.b4962e87.js" ] } \ No newline at end of file diff --git a/build/index.html b/build/index.html index 6989141..0e78fcd 100644 --- a/build/index.html +++ b/build/index.html @@ -1 +1 @@ -Tilbudgivern - AI Tilbudsberegner for Tømrere
\ No newline at end of file +Tilbudgivern - AI Tilbudsberegner for Tømrere
\ No newline at end of file diff --git a/build/static/css/main.27af5b33.css b/build/static/css/main.27af5b33.css new file mode 100644 index 0000000..300b769 --- /dev/null +++ b/build/static/css/main.27af5b33.css @@ -0,0 +1,2 @@ +body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}.add-suggestion-btn{background:#3498db;padding:8px 16px;transition:all .3s ease}.add-suggestion-btn:hover:not(:disabled){background:#2980b9;transform:translateY(-1px)}.add-suggestion-btn.added{animation:pulse .5s ease-out;background:#27ae60}.add-suggestion-btn:disabled{cursor:not-allowed;opacity:.7}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.05)}to{transform:scale(1)}}.historical-section{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:20px;padding:20px}.historical-header{align-items:center;display:flex;justify-content:between;margin-bottom:15px}.historical-header h4{color:#2c3e50;margin:0}.hide-historical-btn{background:none;border:none;color:#95a5a6;cursor:pointer;font-size:16px}.historical-summary{background:#fff;border-left:4px solid #3498db;border-radius:5px;margin-bottom:15px;padding:15px}.avg-stats{grid-gap:10px;display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.avg-stats span{background:#ecf0f1;border-radius:20px;font-size:14px;padding:8px 12px;text-align:center}.historical-projects{grid-gap:15px;display:grid;gap:15px}.historical-project{align-items:center;background:#fff;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.project-info h5{color:#2c3e50;margin:0 0 5px}.project-details{display:flex;gap:15px;margin-top:8px}.project-details span{background:#f8f9fa;border-radius:12px;color:#6c757d;font-size:13px;padding:4px 8px}.apply-historical-btn{background:#17a2b8;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 16px;white-space:nowrap}.apply-historical-btn:hover{background:#138496}.used-materials{margin-top:10px}.materials-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.add-all-materials-btn{background:#28a745;border:none;border-radius:15px;color:#fff;cursor:pointer;font-size:11px;padding:4px 12px;transition:all .2s ease}.add-all-materials-btn:hover{background:#218838;transform:translateY(-1px)}.materials-chips{display:flex;flex-wrap:wrap;gap:4px}.material-chip{background:#e7f3ff;border:none;border-radius:12px;color:#06c;cursor:default;display:inline-block;font-size:12px;margin:2px 5px 2px 0;padding:2px 8px}.material-chip.clickable{border:1px solid #b3d9ff;cursor:pointer;transition:all .2s ease}.material-chip.clickable:hover{background:#cce7ff;box-shadow:0 2px 4px #06c3;color:#049;transform:translateY(-1px)}.projects-container{width:100%}.projects-controls{align-items:center;background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;margin-bottom:20px;padding:15px 20px}.filter-controls,.sort-controls{align-items:center;display:flex;gap:10px}.filter-controls label,.sort-controls label{color:#2c3e50;font-size:14px;font-weight:500}.filter-select,.sort-select{background:#fff;border:1px solid #ddd;border-radius:5px;font-size:14px;min-width:150px;padding:8px 12px}.sort-order-btn{background:#3498db;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:8px 12px;transition:all .2s ease}.sort-order-btn:hover{background:#2980b9;transform:scale(1.1)}@media (max-width:768px){.projects-controls{align-items:stretch;flex-direction:column;gap:15px}.filter-controls,.sort-controls{justify-content:space-between}.filter-select,.sort-select{flex:1 1;min-width:auto}}body,html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0;overflow-x:auto;padding:0;width:100%}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.container{margin:0 auto;max-width:1200px;padding:20px}.main-content{width:100%}.App.materials-mode{box-sizing:border-box;margin:0;padding:0;width:100vw}.App.materials-mode .header{border-radius:0;box-sizing:border-box;margin:0;width:100vw}.App.materials-mode .main-content{box-sizing:border-box;margin:0;padding:0;width:100vw}.materials-view{margin:0!important;padding:20px!important}.materials-view,.materials-view .filter-section,.materials-view .materials-header,.materials-view .materials-list,.materials-view .materials-section,.materials-view .materials-table-container,.materials-view .upload-container,.materials-view .upload-section{box-sizing:border-box;max-width:none!important;width:100%!important}.header{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-bottom:40px;padding:20px;position:relative;text-align:center}.header h1{color:#2c3e50;font-size:2.5em;margin:0 0 10px}.header p{color:#7f8c8d;font-size:1.1em;margin:0}.ai-budget-bar{background:#ecf0f1;border-radius:20px;font-size:.85em;gap:8px;padding:8px 16px;position:absolute;right:20px;top:10px}.ai-budget-bar,.budget-summary{align-items:center;display:flex}.budget-summary{font-weight:500;gap:6px}.budget-label{color:#34495e}.budget-used{color:#27ae60;font-weight:700}.budget-separator{color:#bdc3c7}.budget-total{color:#34495e;font-weight:700}.budget-mini-bar{background:#ecf0f1;border-radius:2px;height:4px;overflow:hidden;width:60px}.budget-mini-fill{height:100%;transition:width .3s ease}.budget-tokens{color:#7f8c8d;font-size:.9em}.budget-refresh-btn{background:none;border:none;border-radius:3px;cursor:pointer;font-size:1em;padding:2px;transition:background-color .2s}.budget-refresh-btn:hover{background-color:#bdc3c7}.nav-buttons{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin:20px 0}.nav-btn{background:#3498db;border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:.95em;font-weight:500;padding:12px 20px;transition:all .3s ease}.nav-btn:hover{background:#2980b9;transform:translateY(-1px)}.nav-btn.active{background:#27ae60}.logout-btn{background:#e74c3c;border:none;border-radius:4px;color:#fff;cursor:pointer;font-weight:500;left:20px;padding:8px 16px;position:absolute;top:20px}.logout-btn:hover{background:#c0392b}.login-form{background:#fff;border-radius:10px;box-shadow:0 4px 20px #0000001a;margin:0 auto;max-width:400px;padding:40px}.login-form h2{color:#2c3e50;margin-bottom:10px;text-align:center}.login-form p{color:#7f8c8d;margin-bottom:30px;text-align:center}.form-group{margin-bottom:20px}.form-group label{color:#34495e;display:block;font-weight:500;margin-bottom:8px}.form-group input,.form-group select,.form-group textarea{border:2px solid #ecf0f1;border-radius:6px;box-sizing:border-box;font-size:16px;width:100%}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:#3498db}.form-group textarea{min-height:100px;resize:vertical}.form-row{display:flex;flex-wrap:wrap;gap:20px}.form-row .form-group{flex:1 1;min-width:250px}.btn{background:#27ae60;border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:16px;font-weight:500;padding:14px 28px;transition:all .3s ease;width:100%}.btn:hover:not(:disabled){background:#229954;transform:translateY(-1px)}.btn:disabled{background:#bdc3c7;cursor:not-allowed;transform:none}.btn.btn-secondary{background:#95a5a6}.btn.btn-secondary:hover:not(:disabled){background:#7f8c8d}.btn.btn-small{font-size:14px;padding:6px 12px;width:auto}.btn.btn-primary{background:#3498db}.btn.btn-primary:hover:not(:disabled){background:#2980b9}.btn.btn-danger{background:#e74c3c}.btn.btn-danger:hover:not(:disabled){background:#c0392b}.error{background:#f8d7da;border:1px solid #f5c6cb;border-radius:6px;color:#721c24;margin:20px 0;padding:12px}.quote-form{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-bottom:30px;padding:30px}.quote-form h2{color:#2c3e50;margin-bottom:20px;text-align:center}.loading{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:50px 20px}.loading-animation{align-items:center;display:flex;flex-direction:column;gap:20px}.loading-spinner{border:5px solid #ecf0f1;height:50px;width:50px}.loading-text h3{color:#2c3e50;margin:0 0 15px}.loading-steps{display:flex;flex-direction:column;gap:8px}.loading-steps .step{color:#bdc3c7;transition:color .3s ease}.loading-steps .step.active{color:#27ae60;font-weight:500}.loading-progress{margin-top:30px}.progress-bar{background:#ecf0f1;border-radius:3px;height:6px;overflow:hidden;width:100%}.progress-fill{animation:progress 20s ease-in-out;background:linear-gradient(90deg,#3498db,#27ae60);border-radius:3px;height:100%}@keyframes progress{0%{width:0}to{width:100%}}.loading-time{color:#7f8c8d;font-style:italic;margin-top:10px}.quote-result{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-top:30px;padding:30px}.quote-result h2{color:#27ae60;margin-bottom:20px}.quote-result div{color:#2c3e50;font-size:15px;line-height:1.6;white-space:pre-line}.quote-actions{gap:15px;margin-top:30px}.quote-actions .btn{flex:1 1;min-width:200px}.feedback-section{background:#f8f9fa;border-left:4px solid #3498db;border-radius:8px;margin-top:30px;padding:25px}.feedback-section h3{color:#2c3e50;margin-bottom:15px}.upload-section{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:30px}.upload-section h2{color:#2c3e50;margin-bottom:15px}.upload-section p{color:#7f8c8d;margin-bottom:25px}.upload-form{margin-bottom:30px}.file-info{color:#27ae60;font-style:italic;margin-top:8px}.upload-status{border-radius:6px;margin:20px 0;padding:15px}.upload-status.success{background:#d4edda;border:1px solid #c3e6cb;color:#155724}.upload-status.error{background:#f8d7da;border:1px solid #f5c6cb;color:#721c24}.parse-results{background:#ffffff80;border-radius:4px;margin-top:15px;padding:15px}.parse-results ul{margin:10px 0;padding-left:20px}.recent-uploads{margin:30px 0}.recent-uploads h3{color:#2c3e50;margin-bottom:15px}.uploads-list{display:flex;flex-direction:column;gap:8px}.upload-item{align-items:center;background:#f8f9fa;border-left:4px solid #3498db;border-radius:6px;display:flex;justify-content:space-between;padding:12px}.upload-name{color:#2c3e50;flex:1 1;font-weight:500}.upload-status{font-size:.9em}.upload-status,.upload-type{border-radius:4px;padding:4px 8px}.upload-type{background:#ecf0f1;color:#34495e;font-size:.85em}.upload-date{color:#7f8c8d;font-size:.9em}.materials-overview{margin-top:30px}.materials-overview h3{color:#2c3e50;margin-bottom:15px}.materials-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.material-item{background:#f8f9fa;border-left:4px solid #27ae60;border-radius:8px;padding:15px}.material-item strong{color:#2c3e50;display:block;margin-bottom:8px}.material-item .price{color:#27ae60;display:block;font-weight:500;margin-bottom:4px}.material-item .category{color:#3498db;display:block;font-size:.9em;margin-bottom:4px}.material-item .supplier{color:#7f8c8d;font-size:.85em}.more-items{color:#7f8c8d;font-style:italic;margin-top:15px;text-align:center}.pricing-management-section{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:30px}.pricing-management-section h2{color:#2c3e50;margin-bottom:15px}.pricing-management-section p{color:#7f8c8d;margin-bottom:25px}.category-selector{margin-bottom:20px}.category-selector label{color:#2c3e50;display:block;font-weight:700;margin-bottom:5px}.category-selector select{background:#fff;border:1px solid #ddd;border-radius:4px;font-size:14px;margin-bottom:10px;max-width:300px;padding:8px 12px;width:100%}.web-search-btn{align-items:center;background:linear-gradient(135deg,#3498db,#2980b9);border:none;border-radius:6px;color:#fff;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;gap:5px;margin-left:10px;padding:8px 16px;transition:all .3s ease}.web-search-btn:hover{background:linear-gradient(135deg,#2980b9,#3498db);box-shadow:0 4px 8px #3498db4d;transform:translateY(-1px)}.web-search-btn:disabled{background:#bdc3c7;box-shadow:none;cursor:not-allowed;transform:none}.add-price-form{background:#f8f9fa;border-left:4px solid #27ae60;border-radius:8px;margin-bottom:40px;padding:25px}.add-price-form h3{color:#2c3e50;margin-bottom:20px}.prices-list{margin-top:30px}.prices-list h3{color:#2c3e50;margin-bottom:20px}.prices-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.price-item{border:1px solid #ecf0f1;border-radius:8px;box-shadow:0 2px 5px #0000000d;padding:20px;transition:box-shadow .3s ease}.price-item:hover{box-shadow:0 4px 15px #0000001a}.price-header{align-items:center;border-bottom:2px solid #ecf0f1;display:flex;justify-content:space-between;margin-bottom:15px;padding-bottom:10px}.price-header strong{color:#2c3e50;font-size:1.1em}.price-value{color:#27ae60;font-size:1.1em}.price-details{margin-bottom:15px}.price-details p{color:#34495e;font-size:.95em;margin:5px 0}.price-date{color:#7f8c8d;font-size:.85em;margin-bottom:15px}.price-actions{display:flex;gap:10px}.edit-form{background:#f8f9fa;border:2px solid #3498db;border-radius:8px;padding:15px}.edit-actions{margin-top:15px}.no-data{color:#7f8c8d;font-style:italic;padding:40px 20px;text-align:center}.usage-stats{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.usage-overview{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));margin-bottom:30px}.stat-card{border-radius:10px;box-shadow:0 2px 10px #0000001a}.stat-card h3{color:#2c3e50;font-size:1.2em;margin-bottom:15px}.budget-info p,.general-info p,.token-info p{color:#34495e;margin:8px 0}.budget-bar,.token-bar{background:#ecf0f1;border-radius:6px;height:12px;margin:10px 0;overflow:hidden;width:100%}.budget-fill,.token-fill{border-radius:6px;height:100%;transition:width .3s ease}.budget-percent,.token-percent{color:#2c3e50;font-weight:500}.warning-level{border-radius:4px;font-size:.9em;font-weight:500;padding:2px 8px}.warning-level.low{background:#d4edda;color:#155724}.warning-level.medium{background:#fff3cd;color:#856404}.warning-level.high{background:#f8d7da;color:#721c24}.refresh-section{background:#f8f9fa;border-radius:8px;margin-top:30px;padding:20px;text-align:center}.last-update{color:#7f8c8d;font-size:.9em;margin-top:15px}.loading-usage{color:#7f8c8d;padding:50px 20px;text-align:center}@media (max-width:768px){.container,.header{padding:15px}.ai-budget-bar{justify-content:center;margin-top:15px;position:static}.logout-btn{margin-bottom:15px;position:static}.nav-buttons{align-items:center;flex-direction:column}.nav-btn{max-width:300px;width:100%}.form-row{flex-direction:column}.form-row .form-group{min-width:auto}.quote-actions{flex-direction:column}.quote-actions .btn{min-width:auto}.materials-grid,.prices-grid,.usage-overview{grid-template-columns:1fr}}.modal-overlay{align-items:center;background:#000000b3;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.approval-dialog{background:#fff;border-radius:12px;box-shadow:0 10px 30px #0000004d;max-height:80vh;max-width:700px;overflow-y:auto;padding:30px;width:90%}.approval-dialog h3{color:#2c3e50;font-size:1.4em;margin:0 0 15px}.approval-dialog p{color:#7f8c8d;margin-bottom:25px}.approval-list{margin-bottom:25px}.approval-item{border:2px solid #ecf0f1;border-radius:8px;margin-bottom:12px;transition:all .2s ease}.approval-item:hover{border-color:#3498db;box-shadow:0 2px 8px #3498db1a}.approval-checkbox{align-items:flex-start;cursor:pointer;display:flex;gap:12px;padding:15px}.approval-checkbox input[type=checkbox]{margin:4px 0 0;transform:scale(1.2)}.approval-details{flex:1 1}.approval-main{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.approval-main strong{color:#2c3e50;font-size:1.1em}.approval-price{background:#e8f5e8;border-radius:20px;color:#27ae60;font-size:.9em;font-weight:700;padding:4px 12px}.approval-meta{display:flex;gap:15px;margin-bottom:8px}.approval-source{color:#7f8c8d;font-size:.9em}.approval-confidence{color:#8e44ad;font-size:.9em;font-weight:500}.approval-notes{background:#f8f9fa;border-left:3px solid #dee2e6;border-radius:6px;color:#6c757d;font-size:.85em;padding:8px 12px}.approval-actions{border-top:1px solid #ecf0f1;display:flex;gap:15px;justify-content:flex-end;margin-top:25px;padding-top:20px}.approval-actions .btn{min-width:120px}.btn-primary:disabled{background:#bdc3c7;cursor:not-allowed}@media (max-width:768px){.approval-dialog{margin:20px;padding:20px}.approval-main{align-items:flex-start;flex-direction:column;gap:8px}.approval-meta{flex-direction:column;gap:5px}.approval-actions{flex-direction:column-reverse}}.search-and-filter{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;display:flex;flex-wrap:wrap;gap:15px;margin-bottom:20px;padding:20px}.search-input{border:2px solid #e9ecef;border-radius:6px;flex:1 1;font-size:14px;padding:12px 16px;transition:border-color .2s ease}.search-input:focus{border-color:#007bff;box-shadow:0 0 0 3px #007bff1a;outline:none}.category-filter{background:#fff;border:2px solid #e9ecef;border-radius:6px;font-size:14px;min-width:200px;padding:12px 16px;transition:border-color .2s ease}.category-filter:focus{border-color:#007bff;outline:none}.materials-table-container{border-radius:8px;box-shadow:0 2px 10px #0000001a;box-sizing:border-box;margin-top:20px;overflow:hidden;overflow-x:auto;width:100%!important}.materials-view .materials-table-container{max-width:none!important;width:100%!important}.results-info{background:#f8f9fa;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:14px;font-weight:500;padding:15px 20px}.materials-table.enhanced{border-collapse:collapse;margin:0;min-width:100%;table-layout:fixed;width:100%!important}.materials-view .materials-table.enhanced{min-width:100%!important;width:100%!important}.edit-input,.edit-select{box-sizing:border-box;font-size:12px;padding:4px 8px}.edit-input:focus,.edit-select:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff40}.btn-success{background-color:#28a745;border:1px solid #28a745;color:#fff}.btn-success:hover{background-color:#218838;border-color:#1e7e34}.btn-secondary{background-color:#6c757d;border:1px solid #6c757d;color:#fff}.btn-secondary:hover{background-color:#5a6268;border-color:#545b62}.materials-table.enhanced th{background:#495057;border:none;color:#fff;font-size:14px;font-weight:600;padding:15px 12px;text-align:left;white-space:nowrap}.materials-table.enhanced th:first-child{width:25%}.materials-table.enhanced th:nth-child(2){width:15%}.materials-table.enhanced th:nth-child(3){width:10%}.materials-table.enhanced th:nth-child(4),.materials-table.enhanced th:nth-child(5){width:15%}.materials-table.enhanced th:nth-child(6){width:20%}.materials-table.enhanced th:nth-child(7){width:10%}.materials-table.enhanced td{border-bottom:1px solid #e9ecef;overflow:hidden;padding:12px;text-overflow:ellipsis;vertical-align:middle}.materials-table.enhanced tr:hover{background-color:#f8f9fa}.material-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.category-badge{font-size:11px;white-space:nowrap}.unit-cell{background:#f8f9fa;border-radius:4px;color:#495057;font-family:Courier New,monospace;font-size:12px;font-weight:500;padding:6px 8px;text-align:center}.price-cell{padding-right:16px;text-align:right}.price-value{color:#28a745;font-weight:700;white-space:nowrap}.supplier-cell{font-size:13px;font-style:italic}.description-cell,.supplier-cell{color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.description-cell{font-size:12px;line-height:1.3;max-width:0}.actions-cell{text-align:center;white-space:nowrap}.btn-small{border:none;border-radius:4px;cursor:pointer;font-size:12px;margin:0 2px;padding:6px 10px;transition:all .2s ease}.btn-edit{background:#ffc107;color:#212529}.btn-edit:hover{background:#e0a800;transform:translateY(-1px)}.btn-danger{background:#dc3545;color:#fff}.btn-danger:hover{background:#c82333;transform:translateY(-1px)}.empty-state{color:#6c757d}.empty-icon{display:block;font-size:48px;margin-bottom:20px}.empty-state h4{color:#495057;font-weight:600;margin:0 0 10px}.empty-state p{font-size:14px;line-height:1.5;margin:0 0 20px}.usage-stats-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));margin-top:30px}.stat-card{align-items:flex-start;background:#fff;border:1px solid #e9ecef;border-radius:12px;box-shadow:0 4px 20px #0000001a;display:flex;gap:15px;padding:25px;transition:transform .2s ease,box-shadow .2s ease}.stat-card:hover{box-shadow:0 8px 30px #00000026;transform:translateY(-2px)}.stat-card.primary-stat{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;grid-column:span 2}.stat-card.secondary-stat{background:linear-gradient(135deg,#f093fb,#f5576c);color:#fff}.stat-card.wide-stat{background:#f8f9fa;grid-column:span 2}.stat-icon{background:#ffffff1a;border-radius:8px;flex-shrink:0;font-size:24px;padding:8px}.stat-card.primary-stat .stat-icon,.stat-card.secondary-stat .stat-icon{background:#fff3}.stat-content{flex:1 1}.stat-card h3{font-size:14px;font-weight:600;margin:0 0 8px;opacity:.9}.stat-value{line-height:1.2;margin:0 0 5px}.stat-value.large{font-size:32px}.stat-value.medium{font-size:20px}.stat-value.small{font-size:14px;font-weight:500}.stat-label{font-size:12px;opacity:.7}.token-breakdown{display:flex;flex-direction:column;gap:8px;margin-top:10px}.token-item{align-items:center;background:#fff;border-radius:6px;display:flex;font-size:14px;justify-content:space-between;padding:8px 12px}.token-item.total{background:#e3f2fd;border:2px solid #1976d2;font-weight:600}.loading-spinner{border:4px solid #f3f3f3;border-top-color:#007bff}@media (max-width:768px){.search-and-filter{align-items:stretch;flex-direction:column}.category-filter,.search-input{min-width:auto;width:100%}.usage-stats-grid{grid-template-columns:1fr}.stat-card.primary-stat,.stat-card.wide-stat{grid-column:span 1}.materials-table.enhanced{font-size:11px}.materials-table.enhanced td,.materials-table.enhanced th{padding:8px 4px}.materials-table.enhanced td:nth-child(5),.materials-table.enhanced td:nth-child(6),.materials-table.enhanced th:nth-child(5),.materials-table.enhanced th:nth-child(6){display:none}.materials-table.enhanced th:first-child{width:35%}.materials-table.enhanced th:nth-child(2){width:20%}.materials-table.enhanced th:nth-child(3){width:15%}.materials-table.enhanced th:nth-child(4){width:20%}.materials-table.enhanced th:nth-child(7){width:10%}}.project-flow{margin:0 auto;max-width:1200px;padding:20px}.project-header{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.project-info h2{color:#2c3e50;margin:0 0 5px}.project-info p{color:#6c757d;margin:2px 0}.reset-btn{background:#dc3545;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:10px 15px}.reset-btn:hover{background:#c82333}.step-navigation{background:#fff;border-radius:10px;box-shadow:0 2px 4px #0000001a;display:flex;justify-content:space-between;margin-bottom:40px;overflow-x:auto;padding:20px}.step{align-items:center;border-radius:8px;cursor:pointer;display:flex;flex:1 1;margin:0 5px;min-width:180px;padding:15px;transition:all .3s ease}.step.active{background:#007bff;color:#fff;transform:scale(1.05)}.step.accessible:hover{background:#e9ecef}.step.accessible.active:hover{background:#0056b3}.step.locked{cursor:not-allowed;opacity:.5}.step-icon{font-size:24px;margin-right:10px}.step-info{flex:1 1}.step-name{font-size:16px;font-weight:700}.step-description{font-size:12px;opacity:.8}.step-arrow{font-size:20px;margin-left:10px;opacity:.5}.step.active .step-arrow{display:none}.step-content{background:#fff;border-radius:10px;box-shadow:0 2px 8px #0000001a;min-height:600px;padding:30px}.project-creation{margin:0 auto;max-width:800px}.section-header{margin-bottom:30px;text-align:center}.section-header h3{color:#2c3e50;font-size:28px;margin:0 0 10px}.section-header p{color:#6c757d;margin:0}.header-actions{justify-content:center;margin-top:20px}.toggle-btn{background:#fff;border:2px solid #007bff;border-radius:5px;color:#007bff;cursor:pointer;padding:10px 20px;transition:all .3s ease}.toggle-btn.active,.toggle-btn:hover{background:#007bff;color:#fff}.form-container{margin:0 auto;max-width:600px}.project-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.form-grid{grid-gap:20px;gap:20px;grid-template-columns:1fr 1fr}.form-group{display:flex;flex-direction:column}.form-group.full-width{grid-column:1/-1}.form-group.checkbox-group{align-items:center;flex-direction:row}.form-group.checkbox-group input{margin-right:8px;width:auto}.form-group label{color:#2c3e50;font-weight:700;margin-bottom:5px}.form-group input,.form-group select,.form-group textarea{border:1px solid #ced4da;border-radius:5px;font-size:14px;padding:12px;transition:border-color .3s ease}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff40;outline:none}.submit-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;margin-top:20px;padding:15px;transition:background .3s ease;width:100%}.submit-btn:hover{background:#218838}.submit-btn:disabled{background:#6c757d;cursor:not-allowed}.error-message{margin:15px 0;padding:12px}.existing-projects{margin:0 auto;max-width:900px}.no-projects{color:#6c757d;padding:60px 20px;text-align:center}.create-first-btn{background:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;margin-top:20px;padding:12px 24px}.projects-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.project-card{background:#fff;border:1px solid #e9ecef;border-radius:8px;box-shadow:0 2px 4px #0000001a;cursor:pointer;padding:20px;transition:all .3s ease}.project-card:hover{border-color:#007bff;box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.project-card-header{align-items:center}.project-card-header h4{color:#2c3e50;margin:0}.status-badge{color:#fff}.project-card-body p{color:#6c757d;font-size:14px;margin:8px 0}.project-card-footer{margin-top:15px;text-align:center}.continue-text{color:#007bff;font-size:12px;font-weight:700}.geometry-input{margin:0 auto;max-width:800px}.geometry-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.calculations-display{background:#e3f2fd;border:1px solid #bbdefb;border-radius:8px;margin:20px 0;padding:20px}.calculations-display h4{color:#1976d2;margin:0 0 15px}.calc-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.calc-item{align-items:center;background:#fff;border:1px solid #bbdefb;border-radius:5px;display:flex;justify-content:space-between;padding:12px}.calc-label{color:#2c3e50;font-weight:700}.calc-value{color:#1976d2;font-weight:700}.labor-input{margin:0 auto;max-width:900px}.labor-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.labor-overview{background:#fff3cd;border:1px solid #ffeaa7;border-radius:8px;margin-bottom:30px;padding:20px}.overview-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:20px}.overview-item{display:flex;flex-direction:column}.overview-item label{color:#2c3e50;font-weight:700;margin-bottom:5px}.overview-item input{border:1px solid #ced4da;border-radius:5px;padding:10px}.overview-item input.fixed-rate{background:#e9ecef}.overview-item small{color:#6c757d;font-size:.875em;margin-top:5px}.input-with-ai{align-items:center;display:flex;gap:10px}.input-with-ai input{flex:1 1}.ai-estimate-btn{background:#8e44ad;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:.875rem;padding:10px 15px;transition:background-color .2s ease;white-space:nowrap}.ai-estimate-btn:hover{background:#7d3c98}.ai-estimate-btn:disabled{background:#bdc3c7;cursor:not-allowed}.calculations{display:flex;gap:30px;justify-content:center;margin-top:20px}.work-breakdown{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin:20px 0;padding:20px}.work-breakdown h4{color:#2c3e50;margin:0 0 20px}.breakdown-list{display:flex;flex-direction:column;gap:15px}.breakdown-item{background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;padding:15px}.breakdown-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:10px}.hours-inputs{align-items:flex-end;display:flex;gap:15px}.hour-input-group{align-items:center;display:flex;flex-direction:column;gap:5px}.hour-input-group label{color:#6c757d;font-size:12px;font-weight:500}.hours-input{border:1px solid #ced4da;border-radius:3px;padding:5px;text-align:center;width:80px}.hours-input.allocated{background-color:#f8fff9;border-color:#28a745}.description-input{border:1px solid #ced4da;border-radius:3px;padding:8px;width:100%}.breakdown-totals{display:flex;flex-direction:column;gap:10px;margin-top:20px}.total-row{background:#d4edda;border-radius:5px;color:#155724;padding:12px;text-align:center}.total-row.allocated{background:#d1ecf1;color:#0c5460}.materials-manager{margin:0 auto;max-width:1000px}.suggestions-section{background:#d1ecf1;border:1px solid #bee5eb;border-radius:8px;margin-bottom:30px;padding:20px}.suggestions-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:15px}.suggestions-header h4{color:#0c5460;margin:0}.hide-suggestions-btn{background:none;border:none;color:#0c5460;cursor:pointer;font-size:16px}.suggestions-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.suggestion-card{align-items:center;background:#fff;border:1px solid #bee5eb;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.suggestion-info{flex:1 1}.suggestion-info strong{color:#2c3e50}.suggestion-info p{color:#6c757d;font-size:14px;margin:5px 0}.suggestion-details{color:#6c757d;display:flex;flex-direction:column;font-size:12px;gap:2px}.add-suggestion-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 12px}.add-suggestion-btn:hover{background:#218838}.add-material-section{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.add-material-section h4{color:#2c3e50;margin:0 0 20px}.material-form{display:flex;flex-direction:column}.total-display{background:#d4edda;border:1px solid #c3e6cb;border-radius:5px;color:#155724;padding:15px;text-align:center}.add-btn{background:#007bff;border:none;border-radius:5px;cursor:pointer;margin-top:15px;padding:12px 20px}.add-btn:hover{background:#0056b3}.add-btn:disabled{background:#6c757d;cursor:not-allowed}.materials-list{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:20px;padding:20px}.materials-list h4{color:#2c3e50;margin:0 0 20px}.material-category{margin-bottom:25px}.material-category h5{border-bottom:1px solid #e9ecef;color:#495057;font-size:16px;margin:0 0 10px;padding-bottom:5px}.materials-table{display:flex;flex-direction:column;gap:10px}.material-row{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.material-info{display:flex;flex:1 1;flex-direction:column;gap:4px}.material-info strong{color:#2c3e50}.material-info span{color:#6c757d;font-size:14px}.material-actions{align-items:center;display:flex;gap:15px}.material-total{color:#28a745;font-size:16px;font-weight:700}.edit-btn{background:#007bff;border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:14px;padding:6px 10px}.edit-btn:hover{background:#0056b3}.remove-btn{background:#dc3545;border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:14px;padding:6px 10px}.remove-btn:hover{background:#c82333}.material-edit-form{background:#fff3cd;border:1px solid #ffc107;border-radius:5px;padding:15px;width:100%}.edit-row{align-items:center;margin-bottom:15px}.edit-inputs,.edit-row{display:flex;flex-wrap:wrap;gap:15px}.input-group{align-items:center;display:flex;gap:5px;min-width:150px}.input-group label{color:#6c757d;font-size:12px;min-width:70px}.input-group input{border:1px solid #ced4da;border-radius:3px;flex:1 1;font-size:14px;padding:5px 8px}.input-group span{color:#6c757d;font-size:12px;min-width:30px}.edit-actions{border-top:1px solid #dee2e6;display:flex;gap:10px;justify-content:flex-end;margin-top:10px;padding-top:10px}.save-btn{background:#28a745;border-radius:3px;font-size:14px;padding:8px 16px}.save-btn:hover{background:#218838}.save-btn:disabled{background:#6c757d}.cancel-btn{border-radius:3px;padding:8px 16px}.cancel-btn:hover{background:#545b62}.materials-summary{background:#e9ecef;border-radius:8px;margin-top:20px;padding:20px}.summary-item{margin-bottom:10px}.summary-item.total{border-top:1px solid #ced4da;color:#28a745;font-size:18px;margin-top:15px;padding-top:10px}.calculation-view{margin:0 auto;max-width:1000px}.project-summary{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.project-summary h4{color:#2c3e50;margin:0 0 15px}.summary-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.summary-item{background:#fff;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:12px}.calculation-section{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.calculation-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.calculation-header h4{color:#2c3e50;margin:0}.calculate-btn{background:#17a2b8;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:12px 20px}.calculate-btn:hover{background:#138496}.calculate-btn:disabled{background:#6c757d;cursor:not-allowed}.calculation-results{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:20px}.calculation-breakdown{display:flex;flex-direction:column;gap:20px}.breakdown-section{background:#fff;border:1px solid #e9ecef;border-radius:5px;padding:15px}.breakdown-section h5{color:#495057;margin:0 0 10px}.breakdown-item{display:flex;justify-content:space-between;margin-bottom:8px;padding:5px 0}.breakdown-item.total{border-top:2px solid #28a745;color:#28a745;font-size:18px;margin-top:10px;padding-top:10px}.quote-generation{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.quote-generation h4{color:#2c3e50;margin:0 0 20px}.quote-options{background:#f8f9fa;border-radius:5px;margin-bottom:20px;padding:15px}.options-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.quote-buttons{display:flex;gap:15px;justify-content:center;margin-bottom:20px}.static-quote-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.static-quote-btn:hover{background:#218838}.ai-quote-btn{background:#6f42c1;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.ai-quote-btn:hover{background:#5a32a3}.html-quote-btn{background:#fd7e14;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.html-quote-btn:hover{background:#e96500}.quote-info{background:#d1ecf1;border:1px solid #bee5eb;border-radius:5px;padding:15px}.quote-info p{color:#0c5460}.quotes-list{background:#fff;border:1px solid #e9ecef;border-radius:8px;padding:20px}.quotes-list h4{color:#2c3e50;margin:0 0 20px}.quotes-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.quote-card{background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;padding:15px}.quote-header{margin-bottom:10px}.quote-id{color:#2c3e50;font-weight:700}.quote-info{margin-bottom:15px}.quote-info p{color:#495057;font-size:14px;margin:5px 0}.quote-actions{display:flex;flex-wrap:wrap;gap:5px;justify-content:center;text-align:center}.view-quote-btn{background:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.view-quote-btn:hover{background:#0056b3}.pdf-download-btn{background:#dc3545;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.pdf-download-btn:hover{background:#c82333}.pdf-generate-btn{background:#6c757d;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.pdf-generate-btn:hover{background:#545b62}.pdf-generate-btn:disabled{cursor:not-allowed;opacity:.6}@media (max-width:768px){.step-navigation{flex-direction:column;gap:10px}.step{min-width:auto}.step-arrow{display:none}.calc-grid,.form-grid,.overview-grid,.projects-grid,.quotes-grid,.suggestions-grid,.summary-grid{grid-template-columns:1fr}.quote-buttons{flex-direction:column}}.project-card-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:15px}.header-actions{align-items:center;display:flex;gap:10px}.card-actions{display:flex;gap:5px}.action-btn{align-items:center;background:none;display:flex;font-size:14px;height:28px;justify-content:center;padding:5px;transition:all .2s ease;width:28px}.action-btn:hover{box-shadow:0 2px 8px #00000026;transform:scale(1.1)}.edit-btn{background:#ffc107;color:#212529}.edit-btn:hover{background:#e0a800}.delete-btn{background:#dc3545}.delete-btn:hover{background:#c82333}.form-actions{align-items:center;gap:15px}.cancel-btn{background:#6c757d;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:12px 20px;transition:background-color .2s ease}.cancel-btn:hover{background:#5a6268}.completed-quotes-view{margin:0 auto;max-width:1400px;padding:20px}.quotes-header{margin-bottom:30px}.quotes-header h2{color:#2c3e50;margin-bottom:10px}.quotes-header p{color:#7f8c8d;margin-bottom:20px}.quotes-controls{align-items:center;display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;margin-bottom:20px}.filter-controls{align-items:center;gap:15px}.filter-controls label{align-items:center;font-weight:500;gap:8px}.filter-controls select{background:#fff;border:1px solid #ddd;border-radius:4px;min-width:120px;padding:8px 12px}.refresh-btn{background:#3498db;border:none;border-radius:4px;color:#fff;cursor:pointer;font-weight:500;padding:10px 16px;transition:background-color .2s}.refresh-btn:hover{background:#2980b9}.quotes-summary{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}.summary-stats{gap:30px;justify-content:center}.stat-item{text-align:center}.stat-label{color:#7f8c8d;display:block;margin-bottom:5px}.stat-value{display:block;font-weight:700}.quotes-table-container{background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;overflow:hidden}.quotes-table{border-collapse:collapse;width:100%}.quotes-table th{background:#34495e;color:#fff;font-size:14px;font-weight:600;padding:15px 12px;text-align:left}.quotes-table td{border-bottom:1px solid #ecf0f1;padding:12px;vertical-align:middle}.quote-row:hover{background:#f8f9fa}.quote-row.newest-quote{background:#e8f5e8;border-left:4px solid #27ae60;transition:all .3s ease}.quote-row.newest-quote:hover{background:#d5f4d5}.project-name,.quote-type{font-weight:500}.quote-type{border-radius:12px;display:inline-block;font-size:12px;padding:4px 8px}.quote-type.static{background:#e8f5e8;color:#27ae60}.quote-type.ai{background:#e3f2fd;color:#2196f3}.quote-total{color:#27ae60;font-weight:600}.ai-cost{color:#7f8c8d;font-size:14px}.delete-btn,.download-btn,.view-btn{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:6px 10px;transition:background-color .2s}.download-btn{background:#95a5a6}.download-btn:hover{background:#7f8c8d}.delete-btn{background:#e74c3c}.delete-btn:hover{background:#c0392b}.empty-state{color:#7f8c8d;padding:60px 20px;text-align:center}.empty-state p{font-size:18px;margin:0}.loading-state{padding:60px 20px;text-align:center}.loading-spinner{animation:spin 1s linear infinite;border:3px solid #f3f3f3;border-radius:50%;border-top-color:#3498db;height:40px;margin:0 auto 20px;width:40px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.error-message{background:#f8d7da;border:1px solid #f5c6cb;color:#721c24}.quote-modal-overlay{align-items:center;background:#000000b3;bottom:0;display:flex;justify-content:center;left:0;padding:20px;position:fixed;right:0;top:0;z-index:1000}.quote-modal{background:#fff;border-radius:8px;box-shadow:0 10px 30px #0000004d;max-height:90vh;max-width:800px;overflow-y:auto;width:100%}.modal-header{align-items:center;border-bottom:1px solid #ecf0f1;display:flex;justify-content:space-between;padding:20px 24px}.modal-header h3{color:#2c3e50;margin:0}.close-btn{background:none;border:none;border-radius:4px;color:#7f8c8d;cursor:pointer;font-size:20px;padding:5px;transition:background-color .2s}.close-btn:hover{background:#ecf0f1}.modal-content{padding:24px}.quote-meta{background:#f8f9fa;border-radius:6px;margin-bottom:20px;padding:16px}.meta-row{display:flex;margin-bottom:8px}.meta-row:last-child{margin-bottom:0}.meta-row strong{color:#34495e;min-width:120px}.quote-text h4{color:#2c3e50;margin-bottom:12px}.quote-content{background:#f8f9fa;border:1px solid #e9ecef}.modal-actions{border-top:1px solid #ecf0f1;display:flex;gap:12px;justify-content:flex-end;padding:20px 24px}.modal-actions .download-btn{background:#27ae60}.modal-actions .download-btn:hover{background:#229954}.modal-actions .close-btn{background:#95a5a6;border-radius:4px;color:#fff;padding:10px 16px}.modal-actions .close-btn:hover{background:#7f8c8d}@media (max-width:768px){.completed-quotes-view{padding:15px}.quotes-controls{align-items:stretch;flex-direction:column}.filter-controls{justify-content:center}.summary-stats{gap:15px}.quotes-table-container{overflow-x:auto}.quotes-table{min-width:700px}.quote-modal{margin:10px;max-height:95vh}.modal-content{padding:16px}.modal-actions{flex-direction:column;padding:16px}}.enhanced-table{min-width:1200px}.enhanced-table th{background:linear-gradient(135deg,#2c3e50,#34495e);color:#fff;font-weight:600;padding:15px 10px;text-align:left}.enhanced-table .quote-row:hover{background:#f8f9fa;box-shadow:0 4px 8px #0000001a;transform:translateY(-1px)}.date-cell{width:120px}.date-info{display:flex;flex-direction:column;gap:4px}.date-main{color:#2c3e50;font-weight:600}.quote-id{background:#ecf0f1;border-radius:10px;color:#7f8c8d;font-size:11px;padding:2px 6px;text-align:center}.project-cell{min-width:200px}.project-info{display:flex;flex-direction:column;gap:4px}.project-name{color:#2c3e50;font-weight:600}.project-type{background:#3498db1a;border-radius:10px;color:#3498db;display:inline-block;font-size:12px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.project-description{color:#7f8c8d;font-size:11px;font-style:italic}.customer-cell{min-width:180px}.customer-info{display:flex;flex-direction:column;gap:3px}.customer-name{color:#2c3e50;font-weight:600}.customer-email,.customer-phone{color:#7f8c8d;font-size:11px}.measurements-cell{min-width:140px}.measurements-info{display:flex;flex-direction:column;gap:3px}.area,.roof-type,.work-hours,.workers{background:#2ecc711a;border-radius:8px;color:#2c3e50;font-size:12px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.materials-cell{min-width:120px}.materials-info{display:flex;flex-direction:column;gap:4px}.material-count{color:#e67e22;font-size:12px;font-weight:600}.material-categories{display:flex;flex-direction:column;gap:2px}.material-category{background:#e67e221a;border-radius:6px;color:#e67e22;font-size:10px;padding:1px 4px;width:-webkit-fit-content;width:fit-content}.more-categories{color:#95a5a6;font-size:10px;font-style:italic}.pricing-cell{min-width:140px}.pricing-info{display:flex;flex-direction:column;gap:3px}.total-price{color:#27ae60;font-size:14px;font-weight:700}.labor-cost,.material-cost{color:#7f8c8d;font-size:11px}.quote-badge{border-radius:8px;font-size:10px;margin-top:4px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.quote-badge.static{background:#95a5a633;color:#95a5a6}.quote-badge.ai{background:#9b59b633;color:#9b59b6}.actions-cell{min-width:160px}.actions-buttons{display:flex;flex-direction:column;gap:4px}.action-btn{border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:500;padding:4px 8px;text-align:left;transition:all .2s;width:100%}.view-btn{background:#3498db;color:#fff}.view-btn:hover{background:#2980b9;transform:scale(1.02)}.pdf-btn{background:#e74c3c;color:#fff}.pdf-btn:hover{background:#c0392b;transform:scale(1.02)}.generate-pdf-btn{background:#9b59b6;color:#fff;font-size:.85rem}.generate-pdf-btn:hover{background:#8e44ad;transform:scale(1.02)}.generate-pdf-btn:disabled{background:#bdc3c7;cursor:not-allowed;transform:none}.download-btn{background:#27ae60;color:#fff}.download-btn:hover{background:#229954;transform:scale(1.02)}.delete-btn{background:#e67e22;color:#fff}.delete-btn:hover{background:#d35400;transform:scale(1.02)}.enhanced-modal{max-height:90vh;max-width:900px;width:90vw}.overview-section{background:#f8f9fa;border-radius:8px;margin-bottom:16px;padding:16px}.overview-section h4{border-bottom:2px solid #3498db;color:#2c3e50;font-size:16px;margin:0 0 12px;padding-bottom:8px}.info-grid{grid-gap:12px;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.info-item{display:flex;flex-direction:column;gap:4px}.info-item.full-width{grid-column:1/-1}.info-item .label{color:#7f8c8d;font-size:12px;font-weight:600;text-transform:uppercase}.info-item .value{color:#2c3e50;font-size:14px;font-weight:500}.material-categories-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.category-tag{background:#e67e221a;border-radius:12px;color:#e67e22;font-size:12px;font-weight:500;padding:4px 8px}.pricing-breakdown{display:flex;flex-direction:column;gap:8px}.price-item{align-items:center;background:#fff;border-left:4px solid #3498db;border-radius:6px;display:flex;justify-content:space-between;padding:8px 12px}.price-item.total-price{background:#27ae600d;border-left-color:#27ae60}.price-label{font-weight:500}.price-label,.price-value{color:#2c3e50;font-size:14px}.price-value{font-weight:600}.price-value.total{color:#27ae60;font-size:18px}.quote-text-section{background:#fff;border:1px solid #ecf0f1;border-radius:8px;overflow:hidden}.quote-text-section h4{background:#34495e;color:#fff;margin:0;padding:12px 16px}.quote-content{background:#fafafa;font-size:12px;line-height:1.4;margin:0;max-height:400px;padding:16px}@media (max-width:1200px){.enhanced-table{min-width:1000px}.info-grid{grid-template-columns:1fr}}@media (max-width:768px){.enhanced-table{min-width:800px}.enhanced-modal{max-height:95vh;width:95vw}.overview-section{padding:12px}.actions-buttons{flex-direction:row;flex-wrap:wrap}.action-btn{flex:1 1;min-width:70px}}.materials-list-view{background:#f8f9fa;margin:0;max-width:100%;min-height:100vh;padding:0;width:100%}.materials-header{background:#fff;border-bottom:1px solid #e0e0e0;margin-bottom:0;padding:24px}.materials-header h2{color:#2c3e50;font-size:28px;font-weight:600;margin:0 0 8px}.materials-header p{color:#666;font-size:16px;margin:0 0 24px}.materials-controls{display:flex;flex-direction:column;gap:16px}.filter-controls{align-items:end;display:flex;flex-wrap:wrap;gap:16px}.filter-controls label{display:flex;flex-direction:column;gap:4px;min-width:150px}.filter-controls label span{color:#555;font-size:14px;font-weight:500}.filter-controls input,.filter-controls select{border:1px solid #ddd;border-radius:6px;font-size:14px;padding:8px 12px;transition:border-color .2s}.filter-controls input:focus,.filter-controls select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}.search-input{min-width:250px}.action-controls{align-items:center;display:flex;gap:12px}.add-btn,.refresh-btn{border:none;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;padding:10px 16px;transition:all .2s}.add-btn{background:#27ae60;color:#fff}.add-btn:hover{background:#229954;transform:translateY(-1px)}.refresh-btn{background:#f1f2f6;border:1px solid #ddd;color:#2c3e50}.refresh-btn:hover{background:#e1e2e6}.refresh-btn:disabled{cursor:not-allowed;opacity:.6}.new-material-form{background:#f8f9fa;border:1px solid #e0e0e0;border-radius:8px;margin-top:24px;padding:20px}.new-material-form h4{color:#2c3e50;font-size:18px;margin:0 0 16px}.form-grid{grid-gap:12px;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:16px}.form-grid input,.form-grid select{border:1px solid #ddd;border-radius:6px;font-size:14px;padding:10px 12px}.form-grid input:focus,.form-grid select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}.form-actions{display:flex;gap:12px}.save-btn{background:#27ae60;border:none;border-radius:6px;color:#fff;cursor:pointer;font-weight:500;padding:10px 20px;transition:all .2s}.save-btn:hover:not(:disabled){background:#229954;transform:translateY(-1px)}.save-btn:disabled{cursor:not-allowed;opacity:.6;transform:none}.error-message{background:#fee;border:1px solid #ffcdd2;border-radius:6px;color:#c62828;font-weight:500;margin:16px 24px;padding:12px 16px}.materials-summary{background:#fff;border-bottom:1px solid #e0e0e0;padding:20px 24px}.summary-stats{display:flex;flex-wrap:wrap;gap:32px}.stat-item{display:flex;flex-direction:column;gap:4px}.stat-label{color:#666;font-size:14px;font-weight:500}.stat-value{color:#2c3e50;font-size:24px;font-weight:600}.empty-state,.loading-state{background:#fff;color:#666;padding:60px 24px;text-align:center}.empty-state p,.loading-state p{font-size:18px;margin:8px 0}.materials-table-container{background:#fff;border-radius:0;overflow:auto;position:relative}.materials-table{font-size:14px;table-layout:fixed}.materials-table th{border-bottom:2px solid #e0e0e0;color:#2c3e50;padding:16px 12px;position:-webkit-sticky;position:sticky;text-align:left;top:0;z-index:10}.materials-table th:last-child{background:#f8f9fa;box-shadow:-2px 0 4px #0000001a;position:-webkit-sticky;position:sticky;right:0;z-index:11}.materials-table td{border-bottom:1px solid #f0f0f0;padding:12px;vertical-align:middle}.materials-table td:last-child{background:#fff;box-shadow:-2px 0 4px #0000001a;position:-webkit-sticky;position:sticky;right:0}.material-row:hover,.material-row:hover td:last-child{background:#f8f9fa}.material-row:nth-child(2n),.material-row:nth-child(2n) td:last-child{background:#fafbfc}.material-row:nth-child(2n):hover,.material-row:nth-child(2n):hover td:last-child{background:#f0f2f5}.materials-table td:first-child,.materials-table th:first-child{width:22%}.materials-table td:nth-child(2),.materials-table th:nth-child(2){width:12%}.materials-table td:nth-child(3),.materials-table th:nth-child(3){width:8%}.materials-table td:nth-child(4),.materials-table th:nth-child(4){width:10%}.materials-table td:nth-child(5),.materials-table th:nth-child(5){width:15%}.materials-table td:nth-child(6),.materials-table th:nth-child(6){width:23%}.materials-table td:nth-child(7),.materials-table th:nth-child(7){min-width:120px;width:10%}.material-name{color:#2c3e50;font-weight:600}.category-badge{background:#e3f2fd;border-radius:12px;color:#1976d2;display:inline-block;font-size:12px;font-weight:500;padding:4px 8px}.unit-cell{color:#666;font-size:13px}.price-cell{color:#27ae60;font-family:Courier New,monospace;font-weight:600}.supplier-cell{color:#666}.description-cell{word-wrap:break-word;color:#666;font-size:13px;max-width:200px}.actions{display:flex;gap:8px;justify-content:center}.cancel-edit-btn,.delete-btn,.edit-btn,.save-edit-btn{background:none;border:none;border-radius:4px;cursor:pointer;font-size:16px;padding:6px;transition:all .2s}.edit-btn:hover{background:#e3f2fd;transform:scale(1.1)}.delete-btn:hover{background:#ffebee;transform:scale(1.1)}.save-edit-btn:hover{background:#e8f5e8;transform:scale(1.1)}.cancel-edit-btn:hover{background:#ffebee;transform:scale(1.1)}.edit-input,.edit-select{border:1px solid #ddd;border-radius:4px;font-size:13px;padding:6px 8px;width:100%}.edit-input:focus,.edit-select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}@media (max-width:1024px){.filter-controls{align-items:stretch;flex-direction:column}.filter-controls label{min-width:auto}.summary-stats{gap:16px}.materials-table{font-size:13px}.materials-table td,.materials-table th{padding:10px 8px}}@media (max-width:768px){.materials-header,.materials-summary{padding:16px}.action-controls{align-items:stretch;flex-direction:column}.form-grid{grid-template-columns:1fr}.materials-table-container{overflow-x:auto}.materials-table{min-width:800px}}.project-review{margin:0 auto;max-width:1400px;padding:20px}.project-review h2{border-bottom:2px solid #3498db;color:#2c3e50;margin-bottom:20px;padding-bottom:10px}.error-message{background-color:#e74c3c;border-radius:5px;color:#fff;margin-bottom:20px;padding:15px;text-align:center}.project-review-layout{grid-gap:30px;display:grid;gap:30px;grid-template-columns:400px 1fr;height:calc(100vh - 200px)}.project-list{background:#f8f9fa;border:1px solid #dee2e6;border-radius:10px;overflow-y:auto;padding:20px}.project-list h3{border-bottom:1px solid #dee2e6;color:#495057;margin-bottom:20px;margin-top:0;padding-bottom:10px;text-align:center}.project-item{background:#fff;border:2px solid #e9ecef;border-radius:8px;box-shadow:0 2px 4px #0000001a;cursor:pointer;margin-bottom:15px;padding:15px;transition:all .3s ease}.project-item:hover{border-color:#3498db;box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.project-item.selected{background:#e8f5e8;border-color:#27ae60;box-shadow:0 4px 12px #27ae6033}.project-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:10px}.project-header h4{color:#2c3e50;font-size:16px;margin:0}.status-badge{border-radius:12px;font-size:12px;font-weight:700;padding:4px 8px;text-transform:uppercase}.status-badge.active{background:#d4edda;color:#155724}.status-badge.completed{background:#cce5ff;color:#004085}.status-badge.pending{background:#fff3cd;color:#856404}.status-badge.cancelled{background:#f8d7da;color:#721c24}.project-details p{color:#6c757d;font-size:14px;margin:5px 0}.project-stats{border-top:1px solid #e9ecef;display:flex;flex-wrap:wrap;gap:10px;margin-top:10px;padding-top:10px}.project-stats span{background:#e9ecef;border-radius:12px;color:#495057;font-size:12px;padding:3px 8px}.project-details-panel{background:#fff;border:1px solid #dee2e6;border-radius:10px;box-shadow:0 2px 8px #0000001a;overflow-y:auto;padding:25px}.project-details-panel h3{border-bottom:2px solid #3498db;color:#2c3e50;font-size:24px;margin-bottom:25px;margin-top:0;padding-bottom:10px}.project-details-panel h4{border-bottom:1px solid #ecf0f1;color:#34495e;font-size:18px;margin-bottom:15px;margin-top:30px;padding-bottom:8px}.steps-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:25px}.step-item{background:#f8f9fa;border:2px solid #e9ecef;border-radius:8px;padding:15px;text-align:center;transition:all .3s ease}.step-item.completed{background:#d4edda;border-color:#c3e6cb}.step-item.pending{background:#fff3cd;border-color:#ffeaa7}.step-status{font-size:18px;font-weight:700;margin-bottom:8px}.step-title{color:#495057;font-weight:600;margin-bottom:5px;text-transform:capitalize}.step-timestamp{color:#6c757d;font-size:12px}.geometry-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:15px}.geometry-item{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;display:flex;justify-content:space-between;padding:12px}.geometry-item label{color:#495057;font-weight:600}.geometry-item span{color:#2c3e50;font-weight:700}.geometry-notes{background:#e3f2fd;border-left:4px solid #2196f3;border-radius:0 6px 6px 0;color:#1565c0;margin-top:15px;padding:15px}.quotes-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:25px}.quote-item{background:#f8f9fa;border:2px solid #e9ecef;border-radius:8px;cursor:pointer;padding:20px;transition:all .3s ease}.quote-item:hover{border-color:#3498db;box-shadow:0 4px 8px #3498db33;transform:translateY(-2px)}.quote-item.selected{background:#fdf2f2;border-color:#e74c3c;box-shadow:0 4px 12px #e74c3c33}.quote-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:15px}.quote-header h5{color:#2c3e50;margin:0}.delivery-status{border-radius:12px;font-size:12px;font-weight:700;padding:4px 8px}.delivery-status.delivered{background:#d4edda;color:#155724}.delivery-status.draft{background:#fff3cd;color:#856404}.quote-amounts{margin-bottom:15px}.amount-item{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.amount-item label{color:#495057;font-weight:600}.total-amount{color:#27ae60;font-size:18px;font-weight:700}.amount-breakdown{color:#6c757d;display:flex;flex-direction:column;font-size:14px;gap:5px}.quote-method{background:#e3f2fd;border-radius:6px;color:#1565c0;font-size:14px;margin-bottom:10px;padding:8px 12px}.quote-date{color:#6c757d;font-size:12px;text-align:right}.quote-details{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-top:25px;padding:25px}.quote-details h4{color:#e74c3c;margin-top:0}.quote-details h5{border-bottom:1px solid #dee2e6;color:#495057;margin-bottom:10px;padding-bottom:5px}.quote-content{border:1px solid #dee2e6;font-family:Courier New,monospace;font-size:14px;line-height:1.5;max-height:300px;overflow-y:auto;padding:15px;white-space:pre-wrap}.materials-table,.quote-content{background:#fff;border-radius:6px;margin-bottom:20px}.materials-table{border:1px solid #dee2e6;border-collapse:collapse;overflow:hidden;width:100%}.materials-table td,.materials-table th{border-bottom:1px solid #e9ecef;padding:12px;text-align:left}.materials-table th{background:#f8f9fa;color:#495057;font-weight:600}.materials-table tr:last-child td{border-bottom:none}.materials-table tr:hover{background:#f8f9fa}.quote-responses{grid-gap:15px;display:grid;gap:15px}.response-item{display:flex;flex-direction:column;gap:5px}.response-item label{color:#495057;font-weight:600}.response-item span{background:#fff;border:1px solid #dee2e6;border-radius:6px;color:#495057;padding:10px}.loading{color:#6c757d;font-style:italic;padding:20px;text-align:center}@media (max-width:1024px){.project-review-layout{grid-template-columns:1fr;height:auto}.project-list{height:400px}.quotes-grid{grid-template-columns:1fr}.geometry-grid,.steps-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:768px){.project-review{padding:10px}.geometry-grid,.steps-grid{grid-template-columns:1fr}.project-stats{flex-direction:column;gap:5px}.quote-header{align-items:flex-start;flex-direction:column;gap:10px}} +/*# sourceMappingURL=main.27af5b33.css.map*/ \ No newline at end of file diff --git a/build/static/css/main.27af5b33.css.map b/build/static/css/main.27af5b33.css.map new file mode 100644 index 0000000..4f33778 --- /dev/null +++ b/build/static/css/main.27af5b33.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.27af5b33.css","mappings":"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","sources":["index.css","App.css","components/ProjectFlow.css","components/CompletedQuotes.css","MaterialsList.css","components/ProjectReview.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n\n/* Material suggestion feedback */\n.add-suggestion-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.3s ease;\n font-size: 14px;\n}\n\n.add-suggestion-btn:hover:not(:disabled) {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.add-suggestion-btn.added {\n background: #27ae60;\n animation: pulse 0.5s ease-out;\n}\n\n.add-suggestion-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n@keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n 100% { transform: scale(1); }\n}\n\n/* Historical data sections */\n.historical-section {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.historical-header {\n display: flex;\n justify-content: between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.historical-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.hide-historical-btn {\n background: none;\n border: none;\n color: #95a5a6;\n cursor: pointer;\n font-size: 16px;\n}\n\n.historical-summary {\n background: white;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 15px;\n border-left: 4px solid #3498db;\n}\n\n.avg-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n}\n\n.avg-stats span {\n background: #ecf0f1;\n padding: 8px 12px;\n border-radius: 20px;\n font-size: 14px;\n text-align: center;\n}\n\n.historical-projects {\n display: grid;\n gap: 15px;\n}\n\n.historical-project {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.project-info h5 {\n margin: 0 0 5px 0;\n color: #2c3e50;\n}\n\n.project-details {\n display: flex;\n gap: 15px;\n margin-top: 8px;\n}\n\n.project-details span {\n background: #f8f9fa;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 13px;\n color: #6c757d;\n}\n\n.apply-historical-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n white-space: nowrap;\n}\n\n.apply-historical-btn:hover {\n background: #138496;\n}\n\n.used-materials {\n margin-top: 10px;\n}\n\n.materials-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.add-all-materials-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 4px 12px;\n border-radius: 15px;\n cursor: pointer;\n font-size: 11px;\n transition: all 0.2s ease;\n}\n\n.add-all-materials-btn:hover {\n background: #218838;\n transform: translateY(-1px);\n}\n\n.materials-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.material-chip {\n display: inline-block;\n background: #e7f3ff;\n color: #0066cc;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n margin: 2px 5px 2px 0;\n border: none;\n cursor: default;\n}\n\n.material-chip.clickable {\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #b3d9ff;\n}\n\n.material-chip.clickable:hover {\n background: #cce7ff;\n color: #004499;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,102,204,0.2);\n}\n\n/* Project sorting and filtering */\n.projects-container {\n width: 100%;\n}\n\n.projects-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n padding: 15px 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.filter-controls, .sort-controls {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-controls label, .sort-controls label {\n font-weight: 500;\n color: #2c3e50;\n font-size: 14px;\n}\n\n.filter-select, .sort-select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 5px;\n background: white;\n font-size: 14px;\n min-width: 150px;\n}\n\n.sort-order-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 8px 12px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n transition: all 0.2s ease;\n}\n\n.sort-order-btn:hover {\n background: #2980b9;\n transform: scale(1.1);\n}\n\n@media (max-width: 768px) {\n .projects-controls {\n flex-direction: column;\n align-items: stretch;\n gap: 15px;\n }\n \n .filter-controls, .sort-controls {\n justify-content: space-between;\n }\n \n .filter-select, .sort-select {\n min-width: auto;\n flex: 1;\n }\n}\n","html, body {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n overflow-x: auto;\n width: 100%;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n/* Main content area */\n.main-content {\n width: 100%;\n}\n\n/* Materials mode - full width layout */\n.App.materials-mode {\n width: 100vw;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.App.materials-mode .header {\n width: 100vw;\n margin: 0;\n border-radius: 0;\n box-sizing: border-box;\n}\n\n.App.materials-mode .main-content {\n width: 100vw;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n/* Materials view should use full width */\n.materials-view {\n max-width: none !important;\n width: 100% !important;\n margin: 0 !important;\n padding: 20px !important;\n box-sizing: border-box;\n}\n\n.materials-view .upload-section,\n.materials-view .materials-section {\n max-width: none !important;\n width: 100% !important;\n box-sizing: border-box;\n}\n\n/* Ensure all containers within materials view are full width */\n.materials-view .upload-container,\n.materials-view .materials-header,\n.materials-view .filter-section,\n.materials-view .materials-list,\n.materials-view .materials-table-container {\n max-width: none !important;\n width: 100% !important;\n box-sizing: border-box;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n\n/* Enhanced Materials Section Styles */\n.search-and-filter {\n display: flex;\n gap: 15px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 20px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.search-input {\n flex: 1;\n min-width: 250px;\n padding: 12px 16px;\n border: 2px solid #e9ecef;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s ease;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);\n}\n\n.category-filter {\n padding: 12px 16px;\n border: 2px solid #e9ecef;\n border-radius: 6px;\n background: white;\n font-size: 14px;\n min-width: 200px;\n transition: border-color 0.2s ease;\n}\n\n.category-filter:focus {\n outline: none;\n border-color: #007bff;\n}\n\n.materials-table-container {\n background: white;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 20px;\n width: 100% !important;\n overflow-x: auto; /* Allow horizontal scrolling if needed */\n box-sizing: border-box;\n}\n\n.materials-view .materials-table-container {\n max-width: none !important;\n width: 100% !important;\n}\n\n.results-info {\n padding: 15px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e9ecef;\n font-size: 14px;\n color: #6c757d;\n font-weight: 500;\n}\n\n.materials-table.enhanced {\n width: 100% !important;\n border-collapse: collapse;\n margin: 0;\n table-layout: fixed;\n min-width: 100%;\n}\n\n.materials-view .materials-table.enhanced {\n width: 100% !important;\n min-width: 100% !important;\n}\n\n/* Edit mode styles for materials table */\n.edit-input, .edit-select {\n width: 100%;\n padding: 4px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n box-sizing: border-box;\n}\n\n.edit-input:focus, .edit-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n.btn-success {\n background-color: #28a745;\n color: white;\n border: 1px solid #28a745;\n}\n\n.btn-success:hover {\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-secondary {\n background-color: #6c757d;\n color: white;\n border: 1px solid #6c757d;\n}\n\n.btn-secondary:hover {\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.materials-table.enhanced th {\n background: #495057;\n color: white;\n padding: 15px 12px;\n text-align: left;\n font-weight: 600;\n font-size: 14px;\n border: none;\n white-space: nowrap;\n}\n\n.materials-table.enhanced th:nth-child(1) { width: 25%; } /* Materiale */\n.materials-table.enhanced th:nth-child(2) { width: 15%; } /* Kategori */\n.materials-table.enhanced th:nth-child(3) { width: 10%; } /* Enhed */\n.materials-table.enhanced th:nth-child(4) { width: 15%; } /* Pris */\n.materials-table.enhanced th:nth-child(5) { width: 15%; } /* Leverandør */\n.materials-table.enhanced th:nth-child(6) { width: 20%; } /* Beskrivelse */\n.materials-table.enhanced th:nth-child(7) { width: 10%; } /* Handlinger */\n\n.materials-table.enhanced td {\n padding: 12px;\n border-bottom: 1px solid #e9ecef;\n vertical-align: middle;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.materials-table.enhanced tr:hover {\n background-color: #f8f9fa;\n}\n\n.material-name {\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.category-badge {\n background: #e3f2fd;\n color: #1976d2;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n display: inline-block;\n white-space: nowrap;\n}\n\n.unit-cell {\n font-family: 'Courier New', monospace;\n background: #f8f9fa;\n color: #495057;\n font-weight: 500;\n text-align: center;\n border-radius: 4px;\n font-size: 12px;\n padding: 6px 8px;\n}\n\n.price-cell {\n text-align: right;\n padding-right: 16px;\n}\n\n.price-value {\n color: #28a745;\n font-size: 14px;\n font-weight: 700;\n white-space: nowrap;\n}\n\n.supplier-cell {\n color: #6c757d;\n font-style: italic;\n font-size: 13px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.description-cell {\n color: #6c757d;\n font-size: 12px;\n line-height: 1.3;\n max-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.actions-cell {\n text-align: center;\n white-space: nowrap;\n}\n\n.btn-small {\n padding: 6px 10px;\n font-size: 12px;\n margin: 0 2px;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-edit {\n background: #ffc107;\n color: #212529;\n}\n\n.btn-edit:hover {\n background: #e0a800;\n transform: translateY(-1px);\n}\n\n.btn-danger {\n background: #dc3545;\n color: white;\n}\n\n.btn-danger:hover {\n background: #c82333;\n transform: translateY(-1px);\n}\n\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-icon {\n font-size: 48px;\n display: block;\n margin-bottom: 20px;\n}\n\n.empty-state h4 {\n margin: 0 0 10px 0;\n color: #495057;\n font-weight: 600;\n}\n\n.empty-state p {\n margin: 0 0 20px 0;\n font-size: 14px;\n line-height: 1.5;\n}\n\n/* Enhanced OpenAI Usage Section Styles */\n.usage-stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-top: 30px;\n}\n\n.stat-card {\n background: white;\n border-radius: 12px;\n padding: 25px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n border: 1px solid #e9ecef;\n display: flex;\n align-items: flex-start;\n gap: 15px;\n}\n\n.stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n}\n\n.stat-card.primary-stat {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n grid-column: span 2;\n}\n\n.stat-card.secondary-stat {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n.stat-card.wide-stat {\n grid-column: span 2;\n background: #f8f9fa;\n}\n\n.stat-icon {\n font-size: 24px;\n padding: 8px;\n background: rgba(255,255,255,0.1);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.stat-card.primary-stat .stat-icon,\n.stat-card.secondary-stat .stat-icon {\n background: rgba(255,255,255,0.2);\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-card h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 600;\n opacity: 0.9;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 5px 0;\n line-height: 1.2;\n}\n\n.stat-value.large {\n font-size: 32px;\n}\n\n.stat-value.medium {\n font-size: 20px;\n}\n\n.stat-value.small {\n font-size: 14px;\n font-weight: 500;\n}\n\n.stat-label {\n font-size: 12px;\n opacity: 0.7;\n font-weight: 500;\n}\n\n.token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 10px;\n}\n\n.token-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.token-item.total {\n background: #e3f2fd;\n font-weight: 600;\n border: 2px solid #1976d2;\n}\n\n.loading-state {\n text-align: center;\n padding: 60px 20px;\n}\n\n.loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #007bff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n/* Responsive adjustments */\n@media (max-width: 768px) {\n .search-and-filter {\n flex-direction: column;\n align-items: stretch;\n }\n \n .search-input,\n .category-filter {\n min-width: auto;\n width: 100%;\n }\n \n .usage-stats-grid {\n grid-template-columns: 1fr;\n }\n \n .stat-card.primary-stat,\n .stat-card.wide-stat {\n grid-column: span 1;\n }\n \n .materials-table.enhanced {\n font-size: 11px;\n }\n \n .materials-table.enhanced th,\n .materials-table.enhanced td {\n padding: 8px 4px;\n }\n \n /* Hide less important columns on mobile */\n .materials-table.enhanced th:nth-child(5),\n .materials-table.enhanced td:nth-child(5), /* Leverandør */\n .materials-table.enhanced th:nth-child(6),\n .materials-table.enhanced td:nth-child(6) { /* Beskrivelse */\n display: none;\n }\n \n /* Adjust remaining column widths for mobile */\n .materials-table.enhanced th:nth-child(1) { width: 35%; } /* Materiale */\n .materials-table.enhanced th:nth-child(2) { width: 20%; } /* Kategori */\n .materials-table.enhanced th:nth-child(3) { width: 15%; } /* Enhed */\n .materials-table.enhanced th:nth-child(4) { width: 20%; } /* Pris */\n .materials-table.enhanced th:nth-child(7) { width: 10%; } /* Handlinger */\n}\n","/* Project Flow Styles */\n.project-flow {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #e9ecef;\n}\n\n.project-info h2 {\n margin: 0 0 5px 0;\n color: #2c3e50;\n}\n\n.project-info p {\n margin: 2px 0;\n color: #6c757d;\n}\n\n.reset-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 10px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.reset-btn:hover {\n background: #c82333;\n}\n\n/* Step Navigation */\n.step-navigation {\n display: flex;\n justify-content: space-between;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n overflow-x: auto;\n}\n\n.step {\n flex: 1;\n display: flex;\n align-items: center;\n padding: 15px;\n margin: 0 5px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.3s ease;\n min-width: 180px;\n}\n\n.step.active {\n background: #007bff;\n color: white;\n transform: scale(1.05);\n}\n\n.step.accessible:hover {\n background: #e9ecef;\n}\n\n.step.accessible.active:hover {\n background: #0056b3;\n}\n\n.step.locked {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.step-icon {\n font-size: 24px;\n margin-right: 10px;\n}\n\n.step-info {\n flex: 1;\n}\n\n.step-name {\n font-weight: bold;\n font-size: 16px;\n}\n\n.step-description {\n font-size: 12px;\n opacity: 0.8;\n}\n\n.step-arrow {\n font-size: 20px;\n margin-left: 10px;\n opacity: 0.5;\n}\n\n.step.active .step-arrow {\n display: none;\n}\n\n/* Content Area */\n.step-content {\n background: white;\n border-radius: 10px;\n padding: 30px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n min-height: 600px;\n}\n\n/* Project Creation Styles */\n.project-creation {\n max-width: 800px;\n margin: 0 auto;\n}\n\n.section-header {\n text-align: center;\n margin-bottom: 30px;\n}\n\n.section-header h3 {\n margin: 0 0 10px 0;\n color: #2c3e50;\n font-size: 28px;\n}\n\n.section-header p {\n color: #6c757d;\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n}\n\n.toggle-btn {\n padding: 10px 20px;\n border: 2px solid #007bff;\n background: white;\n color: #007bff;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.toggle-btn.active {\n background: #007bff;\n color: white;\n}\n\n.toggle-btn:hover {\n background: #007bff;\n color: white;\n}\n\n/* Form Styles */\n.form-container {\n max-width: 600px;\n margin: 0 auto;\n}\n\n.project-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n}\n\n.form-group {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.full-width {\n grid-column: 1 / -1;\n}\n\n.form-group.checkbox-group {\n flex-direction: row;\n align-items: center;\n}\n\n.form-group.checkbox-group input {\n margin-right: 8px;\n width: auto;\n}\n\n.form-group label {\n font-weight: bold;\n margin-bottom: 5px;\n color: #2c3e50;\n}\n\n.form-group input,\n.form-group select,\n.form-group textarea {\n padding: 12px;\n border: 1px solid #ced4da;\n border-radius: 5px;\n font-size: 14px;\n transition: border-color 0.3s ease;\n}\n\n.form-group input:focus,\n.form-group select:focus,\n.form-group textarea:focus {\n border-color: #007bff;\n outline: none;\n box-shadow: 0 0 0 2px rgba(0,123,255,0.25);\n}\n\n.submit-btn {\n width: 100%;\n padding: 15px;\n background: #28a745;\n color: white;\n border: none;\n border-radius: 5px;\n font-size: 16px;\n font-weight: bold;\n cursor: pointer;\n margin-top: 20px;\n transition: background 0.3s ease;\n}\n\n.submit-btn:hover {\n background: #218838;\n}\n\n.submit-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #f5c6cb;\n margin: 15px 0;\n}\n\n/* Existing Projects */\n.existing-projects {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.no-projects {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.create-first-btn {\n padding: 12px 24px;\n background: #007bff;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n margin-top: 20px;\n}\n\n.projects-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.project-card {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.project-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n border-color: #007bff;\n}\n\n.project-card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.project-card-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n color: white;\n font-size: 12px;\n font-weight: bold;\n}\n\n.project-card-body p {\n margin: 8px 0;\n color: #6c757d;\n font-size: 14px;\n}\n\n.project-card-footer {\n margin-top: 15px;\n text-align: center;\n}\n\n.continue-text {\n color: #007bff;\n font-size: 12px;\n font-weight: bold;\n}\n\n/* Geometry Input Styles */\n.geometry-input {\n max-width: 800px;\n margin: 0 auto;\n}\n\n.geometry-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.calculations-display {\n background: #e3f2fd;\n padding: 20px;\n border-radius: 8px;\n margin: 20px 0;\n border: 1px solid #bbdefb;\n}\n\n.calculations-display h4 {\n margin: 0 0 15px 0;\n color: #1976d2;\n}\n\n.calc-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n\n.calc-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #bbdefb;\n}\n\n.calc-label {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.calc-value {\n color: #1976d2;\n font-weight: bold;\n}\n\n/* Labor Input Styles */\n.labor-input {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.labor-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.labor-overview {\n background: #fff3cd;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #ffeaa7;\n}\n\n.overview-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n.overview-item {\n display: flex;\n flex-direction: column;\n}\n\n.overview-item label {\n font-weight: bold;\n margin-bottom: 5px;\n color: #2c3e50;\n}\n\n.overview-item input {\n padding: 10px;\n border: 1px solid #ced4da;\n border-radius: 5px;\n}\n\n.overview-item input.fixed-rate {\n background: #e9ecef;\n}\n\n.overview-item small {\n margin-top: 5px;\n color: #6c757d;\n font-size: 0.875em;\n}\n\n.input-with-ai {\n display: flex;\n gap: 10px;\n align-items: center;\n}\n\n.input-with-ai input {\n flex: 1;\n}\n\n.ai-estimate-btn {\n background: #8e44ad;\n color: white;\n border: none;\n padding: 10px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 0.875rem;\n white-space: nowrap;\n transition: background-color 0.2s ease;\n}\n\n.ai-estimate-btn:hover {\n background: #7d3c98;\n}\n\n.ai-estimate-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n.calculations {\n display: flex;\n gap: 30px;\n justify-content: center;\n margin-top: 20px;\n}\n\n.work-breakdown {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin: 20px 0;\n}\n\n.work-breakdown h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.breakdown-list {\n display: flex;\n flex-direction: column;\n gap: 15px;\n}\n\n.breakdown-item {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.breakdown-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 10px;\n}\n\n.hours-inputs {\n display: flex;\n gap: 15px;\n align-items: flex-end;\n}\n\n.hour-input-group {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 5px;\n}\n\n.hour-input-group label {\n font-size: 12px;\n color: #6c757d;\n font-weight: 500;\n}\n\n.hours-input {\n width: 80px;\n padding: 5px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n text-align: center;\n}\n\n.hours-input.allocated {\n border-color: #28a745;\n background-color: #f8fff9;\n}\n\n.description-input {\n width: 100%;\n padding: 8px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n}\n\n.breakdown-totals {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.total-row {\n text-align: center;\n padding: 12px;\n background: #d4edda;\n border-radius: 5px;\n color: #155724;\n}\n\n.total-row.allocated {\n background: #d1ecf1;\n color: #0c5460;\n}\n\n/* Materials Manager Styles */\n.materials-manager {\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.suggestions-section {\n background: #d1ecf1;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #bee5eb;\n}\n\n.suggestions-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.suggestions-header h4 {\n margin: 0;\n color: #0c5460;\n}\n\n.hide-suggestions-btn {\n background: none;\n border: none;\n color: #0c5460;\n cursor: pointer;\n font-size: 16px;\n}\n\n.suggestions-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.suggestion-card {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #bee5eb;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.suggestion-info {\n flex: 1;\n}\n\n.suggestion-info strong {\n color: #2c3e50;\n}\n\n.suggestion-info p {\n margin: 5px 0;\n color: #6c757d;\n font-size: 14px;\n}\n\n.suggestion-details {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.add-suggestion-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 8px 12px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.add-suggestion-btn:hover {\n background: #218838;\n}\n\n.add-material-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.add-material-section h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.material-form {\n display: flex;\n flex-direction: column;\n}\n\n.total-display {\n background: #d4edda;\n color: #155724;\n padding: 15px;\n border-radius: 5px;\n text-align: center;\n border: 1px solid #c3e6cb;\n}\n\n.add-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n margin-top: 15px;\n}\n\n.add-btn:hover {\n background: #0056b3;\n}\n\n.add-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.materials-list {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 20px;\n}\n\n.materials-list h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.material-category {\n margin-bottom: 25px;\n}\n\n.material-category h5 {\n margin: 0 0 10px 0;\n color: #495057;\n font-size: 16px;\n padding-bottom: 5px;\n border-bottom: 1px solid #e9ecef;\n}\n\n.materials-table {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.material-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.material-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.material-info strong {\n color: #2c3e50;\n}\n\n.material-info span {\n color: #6c757d;\n font-size: 14px;\n}\n\n.material-actions {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.material-total {\n font-weight: bold;\n color: #28a745;\n font-size: 16px;\n}\n\n.edit-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 6px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.edit-btn:hover {\n background: #0056b3;\n}\n\n.remove-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 6px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.remove-btn:hover {\n background: #c82333;\n}\n\n/* Material Edit Form Styles */\n.material-edit-form {\n width: 100%;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 5px;\n padding: 15px;\n}\n\n.edit-row {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n margin-bottom: 15px;\n align-items: center;\n}\n\n.edit-inputs {\n display: flex;\n gap: 15px;\n flex-wrap: wrap;\n}\n\n.input-group {\n display: flex;\n align-items: center;\n gap: 5px;\n min-width: 150px;\n}\n\n.input-group label {\n font-size: 12px;\n color: #6c757d;\n min-width: 70px;\n}\n\n.input-group input {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n font-size: 14px;\n}\n\n.input-group span {\n font-size: 12px;\n color: #6c757d;\n min-width: 30px;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 10px;\n border-top: 1px solid #dee2e6;\n padding-top: 10px;\n}\n\n.save-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.save-btn:hover {\n background: #218838;\n}\n\n.save-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.cancel-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.cancel-btn:hover {\n background: #545b62;\n}\n\n.materials-summary {\n background: #e9ecef;\n padding: 20px;\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.summary-item {\n display: flex;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.summary-item.total {\n font-size: 18px;\n color: #28a745;\n border-top: 1px solid #ced4da;\n padding-top: 10px;\n margin-top: 15px;\n}\n\n/* Calculation View Styles */\n.calculation-view {\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.project-summary {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #e9ecef;\n}\n\n.project-summary h4 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n}\n\n.summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n\n.summary-item {\n background: white;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n display: flex;\n justify-content: space-between;\n}\n\n.calculation-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.calculation-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n}\n\n.calculation-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.calculate-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.calculate-btn:hover {\n background: #138496;\n}\n\n.calculate-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.calculation-results {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.calculation-breakdown {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.breakdown-section {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.breakdown-section h5 {\n margin: 0 0 10px 0;\n color: #495057;\n}\n\n.breakdown-item {\n display: flex;\n justify-content: space-between;\n margin-bottom: 8px;\n padding: 5px 0;\n}\n\n.breakdown-item.total {\n border-top: 2px solid #28a745;\n padding-top: 10px;\n margin-top: 10px;\n font-size: 18px;\n color: #28a745;\n}\n\n.quote-generation {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.quote-generation h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.quote-options {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 20px;\n}\n\n.options-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 15px;\n}\n\n.quote-buttons {\n display: flex;\n gap: 15px;\n justify-content: center;\n margin-bottom: 20px;\n}\n\n.static-quote-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.static-quote-btn:hover {\n background: #218838;\n}\n\n.ai-quote-btn {\n background: #6f42c1;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.ai-quote-btn:hover {\n background: #5a32a3;\n}\n\n.html-quote-btn {\n background: #fd7e14;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.html-quote-btn:hover {\n background: #e96500;\n}\n\n.quote-info {\n background: #d1ecf1;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #bee5eb;\n}\n\n.quote-info p {\n margin: 5px 0;\n color: #0c5460;\n font-size: 14px;\n}\n\n.quotes-list {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.quotes-list h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.quotes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.quote-card {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.quote-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.quote-id {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.quote-date {\n font-size: 12px;\n color: #6c757d;\n}\n\n.quote-info {\n margin-bottom: 15px;\n}\n\n.quote-info p {\n margin: 5px 0;\n font-size: 14px;\n color: #495057;\n}\n\n.quote-actions {\n text-align: center;\n display: flex;\n gap: 5px;\n flex-wrap: wrap;\n justify-content: center;\n}\n\n.view-quote-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.view-quote-btn:hover {\n background: #0056b3;\n}\n\n.pdf-download-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.pdf-download-btn:hover {\n background: #c82333;\n}\n\n.pdf-generate-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.pdf-generate-btn:hover {\n background: #545b62;\n}\n\n.pdf-generate-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .step-navigation {\n flex-direction: column;\n gap: 10px;\n }\n \n .step {\n min-width: auto;\n }\n \n .step-arrow {\n display: none;\n }\n \n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .overview-grid {\n grid-template-columns: 1fr;\n }\n \n .calc-grid {\n grid-template-columns: 1fr;\n }\n \n .summary-grid {\n grid-template-columns: 1fr;\n }\n \n .projects-grid {\n grid-template-columns: 1fr;\n }\n \n .suggestions-grid {\n grid-template-columns: 1fr;\n }\n \n .quotes-grid {\n grid-template-columns: 1fr;\n }\n \n .quote-buttons {\n flex-direction: column;\n }\n}\n\n/* Project Card Action Buttons */\n.project-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 15px;\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.card-actions {\n display: flex;\n gap: 5px;\n}\n\n.action-btn {\n background: none;\n border: none;\n padding: 5px;\n cursor: pointer;\n border-radius: 4px;\n font-size: 14px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.action-btn:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n}\n\n.edit-btn {\n background: #ffc107;\n color: #212529;\n}\n\n.edit-btn:hover {\n background: #e0a800;\n}\n\n.delete-btn {\n background: #dc3545;\n color: white;\n}\n\n.delete-btn:hover {\n background: #c82333;\n}\n\n/* Form Actions */\n.form-actions {\n display: flex;\n gap: 15px;\n align-items: center;\n}\n\n.cancel-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s ease;\n}\n\n.cancel-btn:hover {\n background: #5a6268;\n}\n",".completed-quotes-view {\n padding: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.quotes-header {\n margin-bottom: 30px;\n}\n\n.quotes-header h2 {\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.quotes-header p {\n color: #7f8c8d;\n margin-bottom: 20px;\n}\n\n.quotes-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.filter-controls {\n display: flex;\n gap: 15px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-controls label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.filter-controls select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n min-width: 120px;\n}\n\n.refresh-btn {\n padding: 10px 16px;\n background: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n transition: background-color 0.2s;\n}\n\n.refresh-btn:hover {\n background: #2980b9;\n}\n\n.quotes-summary {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n}\n\n.summary-stats {\n display: flex;\n gap: 30px;\n justify-content: center;\n flex-wrap: wrap;\n}\n\n.stat-item {\n text-align: center;\n}\n\n.stat-label {\n display: block;\n color: #7f8c8d;\n font-size: 14px;\n margin-bottom: 5px;\n}\n\n.stat-value {\n display: block;\n font-size: 24px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.quotes-table-container {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n\n.quotes-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.quotes-table th {\n background: #34495e;\n color: white;\n padding: 15px 12px;\n text-align: left;\n font-weight: 600;\n font-size: 14px;\n}\n\n.quotes-table td {\n padding: 12px;\n border-bottom: 1px solid #ecf0f1;\n vertical-align: middle;\n}\n\n.quote-row:hover {\n background: #f8f9fa;\n}\n\n.quote-row.newest-quote {\n background: #e8f5e8;\n border-left: 4px solid #27ae60;\n transition: all 0.3s ease;\n}\n\n.quote-row.newest-quote:hover {\n background: #d5f4d5;\n}\n\n.project-name {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.quote-type {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n display: inline-block;\n}\n\n.quote-type.static {\n background: #e8f5e8;\n color: #27ae60;\n}\n\n.quote-type.ai {\n background: #e3f2fd;\n color: #2196f3;\n}\n\n.quote-total {\n font-weight: 600;\n color: #27ae60;\n}\n\n.ai-cost {\n color: #7f8c8d;\n font-size: 14px;\n}\n\n.actions {\n display: flex;\n gap: 8px;\n}\n\n.view-btn, .download-btn, .delete-btn {\n padding: 6px 10px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s;\n}\n\n.view-btn {\n background: #3498db;\n color: white;\n}\n\n.view-btn:hover {\n background: #2980b9;\n}\n\n.download-btn {\n background: #95a5a6;\n color: white;\n}\n\n.download-btn:hover {\n background: #7f8c8d;\n}\n\n.delete-btn {\n background: #e74c3c;\n color: white;\n}\n\n.delete-btn:hover {\n background: #c0392b;\n}\n\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: #7f8c8d;\n}\n\n.empty-state p {\n font-size: 18px;\n margin: 0;\n}\n\n.loading-state {\n text-align: center;\n padding: 60px 20px;\n}\n\n.loading-spinner {\n border: 3px solid #f3f3f3;\n border-top: 3px solid #3498db;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 15px;\n border-radius: 6px;\n margin-bottom: 20px;\n border: 1px solid #f5c6cb;\n}\n\n/* Quote Modal */\n.quote-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n}\n\n.quote-modal {\n background: white;\n border-radius: 8px;\n width: 100%;\n max-width: 800px;\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid #ecf0f1;\n}\n\n.modal-header h3 {\n margin: 0;\n color: #2c3e50;\n}\n\n.close-btn {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n color: #7f8c8d;\n padding: 5px;\n border-radius: 4px;\n transition: background-color 0.2s;\n}\n\n.close-btn:hover {\n background: #ecf0f1;\n}\n\n.modal-content {\n padding: 24px;\n}\n\n.quote-meta {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 6px;\n margin-bottom: 20px;\n}\n\n.meta-row {\n display: flex;\n margin-bottom: 8px;\n}\n\n.meta-row:last-child {\n margin-bottom: 0;\n}\n\n.meta-row strong {\n min-width: 120px;\n color: #34495e;\n}\n\n.quote-text h4 {\n color: #2c3e50;\n margin-bottom: 12px;\n}\n\n.quote-content {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 6px;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n max-height: 400px;\n overflow-y: auto;\n border: 1px solid #e9ecef;\n}\n\n.modal-actions {\n padding: 20px 24px;\n border-top: 1px solid #ecf0f1;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.modal-actions .download-btn {\n background: #27ae60;\n}\n\n.modal-actions .download-btn:hover {\n background: #229954;\n}\n\n.modal-actions .close-btn {\n background: #95a5a6;\n color: white;\n padding: 10px 16px;\n border-radius: 4px;\n}\n\n.modal-actions .close-btn:hover {\n background: #7f8c8d;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .completed-quotes-view {\n padding: 15px;\n }\n \n .quotes-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .filter-controls {\n justify-content: center;\n }\n \n .summary-stats {\n gap: 15px;\n }\n \n .quotes-table-container {\n overflow-x: auto;\n }\n \n .quotes-table {\n min-width: 700px;\n }\n \n .quote-modal {\n margin: 10px;\n max-height: 95vh;\n }\n \n .modal-content {\n padding: 16px;\n }\n \n .modal-actions {\n padding: 16px;\n flex-direction: column;\n }\n}\n\n/* Enhanced Table Styles */\n.enhanced-table {\n min-width: 1200px;\n}\n\n.enhanced-table th {\n background: linear-gradient(135deg, #2c3e50, #34495e);\n color: white;\n padding: 15px 10px;\n text-align: left;\n font-weight: 600;\n}\n\n.enhanced-table .quote-row:hover {\n background: #f8f9fa;\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n}\n\n/* Cell Styles */\n.date-cell {\n width: 120px;\n}\n\n.date-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.date-main {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.quote-id {\n font-size: 11px;\n color: #7f8c8d;\n background: #ecf0f1;\n padding: 2px 6px;\n border-radius: 10px;\n text-align: center;\n}\n\n.project-cell {\n min-width: 200px;\n}\n\n.project-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.project-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.project-type {\n font-size: 12px;\n color: #3498db;\n background: rgba(52, 152, 219, 0.1);\n padding: 2px 6px;\n border-radius: 10px;\n display: inline-block;\n width: fit-content;\n}\n\n.project-description {\n font-size: 11px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.customer-cell {\n min-width: 180px;\n}\n\n.customer-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.customer-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.customer-email,\n.customer-phone {\n font-size: 11px;\n color: #7f8c8d;\n}\n\n.measurements-cell {\n min-width: 140px;\n}\n\n.measurements-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.roof-type,\n.area,\n.work-hours,\n.workers {\n font-size: 12px;\n color: #2c3e50;\n background: rgba(46, 204, 113, 0.1);\n padding: 2px 6px;\n border-radius: 8px;\n width: fit-content;\n}\n\n.materials-cell {\n min-width: 120px;\n}\n\n.materials-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.material-count {\n font-size: 12px;\n font-weight: 600;\n color: #e67e22;\n}\n\n.material-categories {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.material-category {\n font-size: 10px;\n background: rgba(230, 126, 34, 0.1);\n color: #e67e22;\n padding: 1px 4px;\n border-radius: 6px;\n width: fit-content;\n}\n\n.more-categories {\n font-size: 10px;\n color: #95a5a6;\n font-style: italic;\n}\n\n.pricing-cell {\n min-width: 140px;\n}\n\n.pricing-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.total-price {\n font-size: 14px;\n font-weight: 700;\n color: #27ae60;\n}\n\n.labor-cost,\n.material-cost {\n font-size: 11px;\n color: #7f8c8d;\n}\n\n.quote-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 8px;\n width: fit-content;\n margin-top: 4px;\n}\n\n.quote-badge.static {\n background: rgba(149, 165, 166, 0.2);\n color: #95a5a6;\n}\n\n.quote-badge.ai {\n background: rgba(155, 89, 182, 0.2);\n color: #9b59b6;\n}\n\n.actions-cell {\n min-width: 160px;\n}\n\n.actions-buttons {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.action-btn {\n padding: 4px 8px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.2s;\n text-align: left;\n width: 100%;\n}\n\n.view-btn {\n background: #3498db;\n color: white;\n}\n\n.view-btn:hover {\n background: #2980b9;\n transform: scale(1.02);\n}\n\n.pdf-btn {\n background: #e74c3c;\n color: white;\n}\n\n.pdf-btn:hover {\n background: #c0392b;\n transform: scale(1.02);\n}\n\n.generate-pdf-btn {\n background: #9b59b6;\n color: white;\n font-size: 0.85rem;\n}\n\n.generate-pdf-btn:hover {\n background: #8e44ad;\n transform: scale(1.02);\n}\n\n.generate-pdf-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.download-btn {\n background: #27ae60;\n color: white;\n}\n\n.download-btn:hover {\n background: #229954;\n transform: scale(1.02);\n}\n\n.delete-btn {\n background: #e67e22;\n color: white;\n}\n\n.delete-btn:hover {\n background: #d35400;\n transform: scale(1.02);\n}\n\n/* Enhanced Modal Styles */\n.enhanced-modal {\n max-width: 900px;\n max-height: 90vh;\n width: 90vw;\n}\n\n.overview-section {\n background: #f8f9fa;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.overview-section h4 {\n margin: 0 0 12px 0;\n color: #2c3e50;\n font-size: 16px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 8px;\n}\n\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.info-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.info-item.full-width {\n grid-column: 1 / -1;\n}\n\n.info-item .label {\n font-size: 12px;\n color: #7f8c8d;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.info-item .value {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.material-categories-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 4px;\n}\n\n.category-tag {\n background: rgba(230, 126, 34, 0.1);\n color: #e67e22;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.pricing-breakdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.price-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.price-item.total-price {\n border-left-color: #27ae60;\n background: rgba(39, 174, 96, 0.05);\n}\n\n.price-label {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.price-value {\n font-size: 14px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.price-value.total {\n font-size: 18px;\n color: #27ae60;\n}\n\n.quote-text-section {\n background: #ffffff;\n border: 1px solid #ecf0f1;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.quote-text-section h4 {\n background: #34495e;\n color: white;\n margin: 0;\n padding: 12px 16px;\n}\n\n.quote-content {\n max-height: 400px;\n overflow-y: auto;\n padding: 16px;\n margin: 0;\n font-family: 'Courier New', monospace;\n font-size: 12px;\n line-height: 1.4;\n background: #fafafa;\n}\n\n/* Responsive adjustments for enhanced version */\n@media (max-width: 1200px) {\n .enhanced-table {\n min-width: 1000px;\n }\n \n .info-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 768px) {\n .enhanced-table {\n min-width: 800px;\n }\n \n .enhanced-modal {\n width: 95vw;\n max-height: 95vh;\n }\n \n .overview-section {\n padding: 12px;\n }\n \n .actions-buttons {\n flex-direction: row;\n flex-wrap: wrap;\n }\n \n .action-btn {\n flex: 1;\n min-width: 70px;\n }\n}\n","/* MaterialsList.css - Based on CompletedQuotes design patterns */\n\n.materials-list-view {\n padding: 0;\n width: 100%;\n max-width: 100%;\n margin: 0;\n background: #f8f9fa;\n min-height: 100vh;\n}\n\n.materials-header {\n background: white;\n padding: 24px;\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 0;\n}\n\n.materials-header h2 {\n margin: 0 0 8px 0;\n color: #2c3e50;\n font-size: 28px;\n font-weight: 600;\n}\n\n.materials-header p {\n margin: 0 0 24px 0;\n color: #666;\n font-size: 16px;\n}\n\n.materials-controls {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.filter-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: end;\n}\n\n.filter-controls label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 150px;\n}\n\n.filter-controls label span {\n font-weight: 500;\n color: #555;\n font-size: 14px;\n}\n\n.filter-controls input,\n.filter-controls select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s;\n}\n\n.filter-controls input:focus,\n.filter-controls select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.search-input {\n min-width: 250px;\n}\n\n.action-controls {\n display: flex;\n gap: 12px;\n align-items: center;\n}\n\n.add-btn,\n.refresh-btn {\n padding: 10px 16px;\n border: none;\n border-radius: 6px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 14px;\n}\n\n.add-btn {\n background: #27ae60;\n color: white;\n}\n\n.add-btn:hover {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.refresh-btn {\n background: #f1f2f6;\n color: #2c3e50;\n border: 1px solid #ddd;\n}\n\n.refresh-btn:hover {\n background: #e1e2e6;\n}\n\n.refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* New Material Form */\n.new-material-form {\n margin-top: 24px;\n padding: 20px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n}\n\n.new-material-form h4 {\n margin: 0 0 16px 0;\n color: #2c3e50;\n font-size: 18px;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.form-grid input,\n.form-grid select {\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.form-grid input:focus,\n.form-grid select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.form-actions {\n display: flex;\n gap: 12px;\n}\n\n.save-btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 10px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.save-btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.save-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n/* Error Message */\n.error-message {\n background: #fee;\n color: #c62828;\n padding: 12px 16px;\n border-radius: 6px;\n margin: 16px 24px;\n border: 1px solid #ffcdd2;\n font-weight: 500;\n}\n\n/* Summary Stats */\n.materials-summary {\n background: white;\n padding: 20px 24px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.summary-stats {\n display: flex;\n gap: 32px;\n flex-wrap: wrap;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Loading and Empty States */\n.loading-state,\n.empty-state {\n text-align: center;\n padding: 60px 24px;\n background: white;\n color: #666;\n}\n\n.loading-state p,\n.empty-state p {\n font-size: 18px;\n margin: 8px 0;\n}\n\n/* Materials Table */\n.materials-table-container {\n background: white;\n overflow: auto;\n border-radius: 0;\n position: relative;\n}\n\n.materials-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n table-layout: fixed;\n}\n\n.materials-table th {\n background: #f8f9fa;\n padding: 16px 12px;\n text-align: left;\n font-weight: 600;\n color: #2c3e50;\n border-bottom: 2px solid #e0e0e0;\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n/* Sticky actions column */\n.materials-table th:last-child {\n position: sticky;\n right: 0;\n z-index: 11;\n background: #f8f9fa;\n box-shadow: -2px 0 4px rgba(0,0,0,0.1);\n}\n\n.materials-table td {\n padding: 12px;\n border-bottom: 1px solid #f0f0f0;\n vertical-align: middle;\n}\n\n/* Sticky actions column for data cells */\n.materials-table td:last-child {\n position: sticky;\n right: 0;\n background: white;\n box-shadow: -2px 0 4px rgba(0,0,0,0.1);\n}\n\n.material-row:hover {\n background: #f8f9fa;\n}\n\n.material-row:hover td:last-child {\n background: #f8f9fa;\n}\n\n.material-row:nth-child(even) {\n background: #fafbfc;\n}\n\n.material-row:nth-child(even) td:last-child {\n background: #fafbfc;\n}\n\n.material-row:nth-child(even):hover {\n background: #f0f2f5;\n}\n\n.material-row:nth-child(even):hover td:last-child {\n background: #f0f2f5;\n}\n\n/* Column widths */\n.materials-table th:nth-child(1),\n.materials-table td:nth-child(1) { width: 22%; } /* Material name */\n.materials-table th:nth-child(2),\n.materials-table td:nth-child(2) { width: 12%; } /* Category */\n.materials-table th:nth-child(3),\n.materials-table td:nth-child(3) { width: 8%; } /* Unit */\n.materials-table th:nth-child(4),\n.materials-table td:nth-child(4) { width: 10%; } /* Price */\n.materials-table th:nth-child(5),\n.materials-table td:nth-child(5) { width: 15%; } /* Supplier */\n.materials-table th:nth-child(6),\n.materials-table td:nth-child(6) { width: 23%; } /* Description */\n.materials-table th:nth-child(7),\n.materials-table td:nth-child(7) { width: 10%; min-width: 120px; } /* Actions - sticky */\n\n/* Table Cell Styles */\n.material-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.category-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #e3f2fd;\n color: #1976d2;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.unit-cell {\n color: #666;\n font-size: 13px;\n}\n\n.price-cell {\n font-weight: 600;\n color: #27ae60;\n font-family: 'Courier New', monospace;\n}\n\n.supplier-cell {\n color: #666;\n}\n\n.description-cell {\n color: #666;\n font-size: 13px;\n max-width: 200px;\n word-wrap: break-word;\n}\n\n/* Actions */\n.actions {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n.edit-btn,\n.delete-btn,\n.save-edit-btn,\n.cancel-edit-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px;\n border-radius: 4px;\n transition: all 0.2s;\n font-size: 16px;\n}\n\n.edit-btn:hover {\n background: #e3f2fd;\n transform: scale(1.1);\n}\n\n.delete-btn:hover {\n background: #ffebee;\n transform: scale(1.1);\n}\n\n.save-edit-btn:hover {\n background: #e8f5e8;\n transform: scale(1.1);\n}\n\n.cancel-edit-btn:hover {\n background: #ffebee;\n transform: scale(1.1);\n}\n\n/* Edit Form Inputs */\n.edit-input,\n.edit-select {\n width: 100%;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 13px;\n}\n\n.edit-input:focus,\n.edit-select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .filter-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .filter-controls label {\n min-width: auto;\n }\n \n .summary-stats {\n gap: 16px;\n }\n \n .materials-table {\n font-size: 13px;\n }\n \n .materials-table th,\n .materials-table td {\n padding: 10px 8px;\n }\n}\n\n@media (max-width: 768px) {\n .materials-header {\n padding: 16px;\n }\n \n .materials-summary {\n padding: 16px;\n }\n \n .action-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .materials-table-container {\n overflow-x: auto;\n }\n \n .materials-table {\n min-width: 800px;\n }\n}\n","/* ProjectReview CSS */\n.project-review {\n padding: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.project-review h2 {\n margin-bottom: 20px;\n color: #2c3e50;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.error-message {\n background-color: #e74c3c;\n color: white;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.project-review-layout {\n display: grid;\n grid-template-columns: 400px 1fr;\n gap: 30px;\n height: calc(100vh - 200px);\n}\n\n/* Project List */\n.project-list {\n background: #f8f9fa;\n border-radius: 10px;\n padding: 20px;\n overflow-y: auto;\n border: 1px solid #dee2e6;\n}\n\n.project-list h3 {\n margin-top: 0;\n margin-bottom: 20px;\n color: #495057;\n text-align: center;\n padding-bottom: 10px;\n border-bottom: 1px solid #dee2e6;\n}\n\n.project-item {\n background: white;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 15px;\n margin-bottom: 15px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.project-item:hover {\n border-color: #3498db;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n}\n\n.project-item.selected {\n border-color: #27ae60;\n background: #e8f5e8;\n box-shadow: 0 4px 12px rgba(39, 174, 96, 0.2);\n}\n\n.project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.project-header h4 {\n margin: 0;\n color: #2c3e50;\n font-size: 16px;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n text-transform: uppercase;\n}\n\n.status-badge.active { background: #d4edda; color: #155724; }\n.status-badge.completed { background: #cce5ff; color: #004085; }\n.status-badge.pending { background: #fff3cd; color: #856404; }\n.status-badge.cancelled { background: #f8d7da; color: #721c24; }\n\n.project-details p {\n margin: 5px 0;\n font-size: 14px;\n color: #6c757d;\n}\n\n.project-stats {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid #e9ecef;\n}\n\n.project-stats span {\n background: #e9ecef;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 12px;\n color: #495057;\n}\n\n/* Project Details Panel */\n.project-details-panel {\n background: white;\n border-radius: 10px;\n padding: 25px;\n overflow-y: auto;\n border: 1px solid #dee2e6;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n\n.project-details-panel h3 {\n margin-top: 0;\n margin-bottom: 25px;\n color: #2c3e50;\n font-size: 24px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.project-details-panel h4 {\n color: #34495e;\n margin-top: 30px;\n margin-bottom: 15px;\n font-size: 18px;\n border-bottom: 1px solid #ecf0f1;\n padding-bottom: 8px;\n}\n\n/* Project Steps */\n.steps-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin-bottom: 25px;\n}\n\n.step-item {\n background: #f8f9fa;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 15px;\n text-align: center;\n transition: all 0.3s ease;\n}\n\n.step-item.completed {\n background: #d4edda;\n border-color: #c3e6cb;\n}\n\n.step-item.pending {\n background: #fff3cd;\n border-color: #ffeaa7;\n}\n\n.step-status {\n font-size: 18px;\n font-weight: bold;\n margin-bottom: 8px;\n}\n\n.step-title {\n font-weight: 600;\n color: #495057;\n text-transform: capitalize;\n margin-bottom: 5px;\n}\n\n.step-timestamp {\n font-size: 12px;\n color: #6c757d;\n}\n\n/* Geometry Section */\n.geometry-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin-bottom: 15px;\n}\n\n.geometry-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 6px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.geometry-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.geometry-item span {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.geometry-notes {\n background: #e3f2fd;\n border-left: 4px solid #2196f3;\n padding: 15px;\n margin-top: 15px;\n border-radius: 0 6px 6px 0;\n color: #1565c0;\n}\n\n/* Quotes Section */\n.quotes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n margin-bottom: 25px;\n}\n\n.quote-item {\n background: #f8f9fa;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.quote-item:hover {\n border-color: #3498db;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.2);\n}\n\n.quote-item.selected {\n border-color: #e74c3c;\n background: #fdf2f2;\n box-shadow: 0 4px 12px rgba(231, 76, 60, 0.2);\n}\n\n.quote-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.quote-header h5 {\n margin: 0;\n color: #2c3e50;\n}\n\n.delivery-status {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n}\n\n.delivery-status.delivered {\n background: #d4edda;\n color: #155724;\n}\n\n.delivery-status.draft {\n background: #fff3cd;\n color: #856404;\n}\n\n.quote-amounts {\n margin-bottom: 15px;\n}\n\n.amount-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.amount-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.total-amount {\n font-size: 18px;\n font-weight: bold;\n color: #27ae60;\n}\n\n.amount-breakdown {\n display: flex;\n flex-direction: column;\n gap: 5px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.quote-method {\n background: #e3f2fd;\n padding: 8px 12px;\n border-radius: 6px;\n margin-bottom: 10px;\n font-size: 14px;\n color: #1565c0;\n}\n\n.quote-date {\n font-size: 12px;\n color: #6c757d;\n text-align: right;\n}\n\n/* Quote Details */\n.quote-details {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 25px;\n margin-top: 25px;\n}\n\n.quote-details h4 {\n margin-top: 0;\n color: #e74c3c;\n}\n\n.quote-details h5 {\n color: #495057;\n margin-bottom: 10px;\n border-bottom: 1px solid #dee2e6;\n padding-bottom: 5px;\n}\n\n.quote-content {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n padding: 15px;\n margin-bottom: 20px;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.materials-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n background: white;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #dee2e6;\n}\n\n.materials-table th,\n.materials-table td {\n padding: 12px;\n text-align: left;\n border-bottom: 1px solid #e9ecef;\n}\n\n.materials-table th {\n background: #f8f9fa;\n font-weight: 600;\n color: #495057;\n}\n\n.materials-table tr:last-child td {\n border-bottom: none;\n}\n\n.materials-table tr:hover {\n background: #f8f9fa;\n}\n\n.quote-responses {\n display: grid;\n gap: 15px;\n}\n\n.response-item {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.response-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.response-item span {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n padding: 10px;\n color: #495057;\n}\n\n.loading {\n text-align: center;\n padding: 20px;\n color: #6c757d;\n font-style: italic;\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .project-review-layout {\n grid-template-columns: 1fr;\n height: auto;\n }\n \n .project-list {\n height: 400px;\n }\n \n .quotes-grid {\n grid-template-columns: 1fr;\n }\n \n .steps-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n \n .geometry-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .project-review {\n padding: 10px;\n }\n \n .steps-grid,\n .geometry-grid {\n grid-template-columns: 1fr;\n }\n \n .project-stats {\n flex-direction: column;\n gap: 5px;\n }\n \n .quote-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 10px;\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/css/main.409c5cf8.css b/build/static/css/main.409c5cf8.css new file mode 100644 index 0000000..d408334 --- /dev/null +++ b/build/static/css/main.409c5cf8.css @@ -0,0 +1,2 @@ +body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}.add-suggestion-btn{background:#3498db;padding:8px 16px;transition:all .3s ease}.add-suggestion-btn:hover:not(:disabled){background:#2980b9;transform:translateY(-1px)}.add-suggestion-btn.added{animation:pulse .5s ease-out;background:#27ae60}.add-suggestion-btn:disabled{cursor:not-allowed;opacity:.7}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.05)}to{transform:scale(1)}}.historical-section{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:20px;padding:20px}.historical-header{align-items:center;display:flex;justify-content:between;margin-bottom:15px}.historical-header h4{color:#2c3e50;margin:0}.hide-historical-btn{background:none;border:none;color:#95a5a6;cursor:pointer;font-size:16px}.historical-summary{background:#fff;border-left:4px solid #3498db;border-radius:5px;margin-bottom:15px;padding:15px}.avg-stats{grid-gap:10px;display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.avg-stats span{background:#ecf0f1;border-radius:20px;font-size:14px;padding:8px 12px;text-align:center}.historical-projects{grid-gap:15px;display:grid;gap:15px}.historical-project{align-items:center;background:#fff;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.project-info h5{color:#2c3e50;margin:0 0 5px}.project-details{display:flex;gap:15px;margin-top:8px}.project-details span{background:#f8f9fa;border-radius:12px;color:#6c757d;font-size:13px;padding:4px 8px}.apply-historical-btn{background:#17a2b8;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 16px;white-space:nowrap}.apply-historical-btn:hover{background:#138496}.used-materials{margin-top:10px}.materials-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.add-all-materials-btn{background:#28a745;border:none;border-radius:15px;color:#fff;cursor:pointer;font-size:11px;padding:4px 12px;transition:all .2s ease}.add-all-materials-btn:hover{background:#218838;transform:translateY(-1px)}.materials-chips{display:flex;flex-wrap:wrap;gap:4px}.material-chip{background:#e7f3ff;border:none;border-radius:12px;color:#06c;cursor:default;display:inline-block;font-size:12px;margin:2px 5px 2px 0;padding:2px 8px}.material-chip.clickable{border:1px solid #b3d9ff;cursor:pointer;transition:all .2s ease}.material-chip.clickable:hover{background:#cce7ff;box-shadow:0 2px 4px #06c3;color:#049;transform:translateY(-1px)}.projects-container{width:100%}.projects-controls{align-items:center;background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;margin-bottom:20px;padding:15px 20px}.filter-controls,.sort-controls{align-items:center;display:flex;gap:10px}.filter-controls label,.sort-controls label{color:#2c3e50;font-size:14px;font-weight:500}.filter-select,.sort-select{background:#fff;border:1px solid #ddd;border-radius:5px;font-size:14px;min-width:150px;padding:8px 12px}.sort-order-btn{background:#3498db;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:8px 12px;transition:all .2s ease}.sort-order-btn:hover{background:#2980b9;transform:scale(1.1)}@media (max-width:768px){.projects-controls{align-items:stretch;flex-direction:column;gap:15px}.filter-controls,.sort-controls{justify-content:space-between}.filter-select,.sort-select{flex:1 1;min-width:auto}}body,html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0;overflow-x:auto;padding:0;width:100%}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.container{margin:0 auto;max-width:1200px;padding:20px}.main-content{width:100%}.App.materials-mode{box-sizing:border-box;margin:0;padding:0;width:100vw}.App.materials-mode .header{border-radius:0;box-sizing:border-box;margin:0;width:100vw}.App.materials-mode .main-content{box-sizing:border-box;margin:0;padding:0;width:100vw}.materials-view{margin:0!important;padding:20px!important}.materials-view,.materials-view .filter-section,.materials-view .materials-header,.materials-view .materials-list,.materials-view .materials-section,.materials-view .materials-table-container,.materials-view .upload-container,.materials-view .upload-section{box-sizing:border-box;max-width:none!important;width:100%!important}.header{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-bottom:40px;padding:20px;position:relative;text-align:center}.header h1{color:#2c3e50;font-size:2.5em;margin:0 0 10px}.header p{color:#7f8c8d;font-size:1.1em;margin:0}.ai-budget-bar{background:#ecf0f1;border-radius:20px;font-size:.85em;gap:8px;padding:8px 16px;position:absolute;right:20px;top:10px}.ai-budget-bar,.budget-summary{align-items:center;display:flex}.budget-summary{font-weight:500;gap:6px}.budget-label{color:#34495e}.budget-used{color:#27ae60;font-weight:700}.budget-separator{color:#bdc3c7}.budget-total{color:#34495e;font-weight:700}.budget-mini-bar{background:#ecf0f1;border-radius:2px;height:4px;overflow:hidden;width:60px}.budget-mini-fill{height:100%;transition:width .3s ease}.budget-tokens{color:#7f8c8d;font-size:.9em}.budget-refresh-btn{background:none;border:none;border-radius:3px;cursor:pointer;font-size:1em;padding:2px;transition:background-color .2s}.budget-refresh-btn:hover{background-color:#bdc3c7}.nav-buttons{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin:20px 0}.nav-btn{background:#3498db;border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:.95em;font-weight:500;padding:12px 20px;transition:all .3s ease}.nav-btn:hover{background:#2980b9;transform:translateY(-1px)}.nav-btn.active{background:#27ae60}.logout-btn{background:#e74c3c;border:none;border-radius:4px;color:#fff;cursor:pointer;font-weight:500;left:20px;padding:8px 16px;position:absolute;top:20px}.logout-btn:hover{background:#c0392b}.login-form{background:#fff;border-radius:10px;box-shadow:0 4px 20px #0000001a;margin:0 auto;max-width:400px;padding:40px}.login-form h2{color:#2c3e50;margin-bottom:10px;text-align:center}.login-form p{color:#7f8c8d;margin-bottom:30px;text-align:center}.form-group{margin-bottom:20px}.form-group label{color:#34495e;display:block;font-weight:500;margin-bottom:8px}.form-group input,.form-group select,.form-group textarea{border:2px solid #ecf0f1;border-radius:6px;box-sizing:border-box;font-size:16px;width:100%}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:#3498db}.form-group textarea{min-height:100px;resize:vertical}.form-row{display:flex;flex-wrap:wrap;gap:20px}.form-row .form-group{flex:1 1;min-width:250px}.btn{background:#27ae60;border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:16px;font-weight:500;padding:14px 28px;transition:all .3s ease;width:100%}.btn:hover:not(:disabled){background:#229954;transform:translateY(-1px)}.btn:disabled{background:#bdc3c7;cursor:not-allowed;transform:none}.btn.btn-secondary{background:#95a5a6}.btn.btn-secondary:hover:not(:disabled){background:#7f8c8d}.btn.btn-small{font-size:14px;padding:6px 12px;width:auto}.btn.btn-primary{background:#3498db}.btn.btn-primary:hover:not(:disabled){background:#2980b9}.btn.btn-danger{background:#e74c3c}.btn.btn-danger:hover:not(:disabled){background:#c0392b}.error{background:#f8d7da;border:1px solid #f5c6cb;border-radius:6px;color:#721c24;margin:20px 0;padding:12px}.quote-form{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-bottom:30px;padding:30px}.quote-form h2{color:#2c3e50;margin-bottom:20px;text-align:center}.loading{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:50px 20px}.loading-animation{align-items:center;display:flex;flex-direction:column;gap:20px}.loading-spinner{border:5px solid #ecf0f1;height:50px;width:50px}.loading-text h3{color:#2c3e50;margin:0 0 15px}.loading-steps{display:flex;flex-direction:column;gap:8px}.loading-steps .step{color:#bdc3c7;transition:color .3s ease}.loading-steps .step.active{color:#27ae60;font-weight:500}.loading-progress{margin-top:30px}.progress-bar{background:#ecf0f1;border-radius:3px;height:6px;overflow:hidden;width:100%}.progress-fill{animation:progress 20s ease-in-out;background:linear-gradient(90deg,#3498db,#27ae60);border-radius:3px;height:100%}@keyframes progress{0%{width:0}to{width:100%}}.loading-time{color:#7f8c8d;font-style:italic;margin-top:10px}.quote-result{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-top:30px;padding:30px}.quote-result h2{color:#27ae60;margin-bottom:20px}.quote-result div{color:#2c3e50;font-size:15px;line-height:1.6;white-space:pre-line}.quote-actions{gap:15px;margin-top:30px}.quote-actions .btn{flex:1 1;min-width:200px}.feedback-section{background:#f8f9fa;border-left:4px solid #3498db;border-radius:8px;margin-top:30px;padding:25px}.feedback-section h3{color:#2c3e50;margin-bottom:15px}.upload-section{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:30px}.upload-section h2{color:#2c3e50;margin-bottom:15px}.upload-section p{color:#7f8c8d;margin-bottom:25px}.upload-form{margin-bottom:30px}.file-info{color:#27ae60;font-style:italic;margin-top:8px}.upload-status{border-radius:6px;margin:20px 0;padding:15px}.upload-status.success{background:#d4edda;border:1px solid #c3e6cb;color:#155724}.upload-status.error{background:#f8d7da;border:1px solid #f5c6cb;color:#721c24}.parse-results{background:#ffffff80;border-radius:4px;margin-top:15px;padding:15px}.parse-results ul{margin:10px 0;padding-left:20px}.recent-uploads{margin:30px 0}.recent-uploads h3{color:#2c3e50;margin-bottom:15px}.uploads-list{display:flex;flex-direction:column;gap:8px}.upload-item{align-items:center;background:#f8f9fa;border-left:4px solid #3498db;border-radius:6px;display:flex;justify-content:space-between;padding:12px}.upload-name{color:#2c3e50;flex:1 1;font-weight:500}.upload-status{font-size:.9em}.upload-status,.upload-type{border-radius:4px;padding:4px 8px}.upload-type{background:#ecf0f1;color:#34495e;font-size:.85em}.upload-date{color:#7f8c8d;font-size:.9em}.materials-overview{margin-top:30px}.materials-overview h3{color:#2c3e50;margin-bottom:15px}.materials-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.material-item{background:#f8f9fa;border-left:4px solid #27ae60;border-radius:8px;padding:15px}.material-item strong{color:#2c3e50;display:block;margin-bottom:8px}.material-item .price{color:#27ae60;display:block;font-weight:500;margin-bottom:4px}.material-item .category{color:#3498db;display:block;font-size:.9em;margin-bottom:4px}.material-item .supplier{color:#7f8c8d;font-size:.85em}.more-items{color:#7f8c8d;font-style:italic;margin-top:15px;text-align:center}.pricing-management-section{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:30px}.pricing-management-section h2{color:#2c3e50;margin-bottom:15px}.pricing-management-section p{color:#7f8c8d;margin-bottom:25px}.category-selector{margin-bottom:20px}.category-selector label{color:#2c3e50;display:block;font-weight:700;margin-bottom:5px}.category-selector select{background:#fff;border:1px solid #ddd;border-radius:4px;font-size:14px;margin-bottom:10px;max-width:300px;padding:8px 12px;width:100%}.web-search-btn{align-items:center;background:linear-gradient(135deg,#3498db,#2980b9);border:none;border-radius:6px;color:#fff;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;gap:5px;margin-left:10px;padding:8px 16px;transition:all .3s ease}.web-search-btn:hover{background:linear-gradient(135deg,#2980b9,#3498db);box-shadow:0 4px 8px #3498db4d;transform:translateY(-1px)}.web-search-btn:disabled{background:#bdc3c7;box-shadow:none;cursor:not-allowed;transform:none}.add-price-form{background:#f8f9fa;border-left:4px solid #27ae60;border-radius:8px;margin-bottom:40px;padding:25px}.add-price-form h3{color:#2c3e50;margin-bottom:20px}.prices-list{margin-top:30px}.prices-list h3{color:#2c3e50;margin-bottom:20px}.prices-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.price-item{border:1px solid #ecf0f1;border-radius:8px;box-shadow:0 2px 5px #0000000d;padding:20px;transition:box-shadow .3s ease}.price-item:hover{box-shadow:0 4px 15px #0000001a}.price-header{align-items:center;border-bottom:2px solid #ecf0f1;display:flex;justify-content:space-between;margin-bottom:15px;padding-bottom:10px}.price-header strong{color:#2c3e50;font-size:1.1em}.price-value{color:#27ae60;font-size:1.1em}.price-details{margin-bottom:15px}.price-details p{color:#34495e;font-size:.95em;margin:5px 0}.price-date{color:#7f8c8d;font-size:.85em;margin-bottom:15px}.price-actions{display:flex;gap:10px}.edit-form{background:#f8f9fa;border:2px solid #3498db;border-radius:8px;padding:15px}.edit-actions{margin-top:15px}.no-data{color:#7f8c8d;font-style:italic;padding:40px 20px;text-align:center}.usage-stats{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.usage-overview{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));margin-bottom:30px}.stat-card{border-radius:10px;box-shadow:0 2px 10px #0000001a}.stat-card h3{color:#2c3e50;font-size:1.2em;margin-bottom:15px}.budget-info p,.general-info p,.token-info p{color:#34495e;margin:8px 0}.budget-bar,.token-bar{background:#ecf0f1;border-radius:6px;height:12px;margin:10px 0;overflow:hidden;width:100%}.budget-fill,.token-fill{border-radius:6px;height:100%;transition:width .3s ease}.budget-percent,.token-percent{color:#2c3e50;font-weight:500}.warning-level{border-radius:4px;font-size:.9em;font-weight:500;padding:2px 8px}.warning-level.low{background:#d4edda;color:#155724}.warning-level.medium{background:#fff3cd;color:#856404}.warning-level.high{background:#f8d7da;color:#721c24}.refresh-section{background:#f8f9fa;border-radius:8px;margin-top:30px;padding:20px;text-align:center}.last-update{color:#7f8c8d;font-size:.9em;margin-top:15px}.loading-usage{color:#7f8c8d;padding:50px 20px;text-align:center}@media (max-width:768px){.container,.header{padding:15px}.ai-budget-bar{justify-content:center;margin-top:15px;position:static}.logout-btn{margin-bottom:15px;position:static}.nav-buttons{align-items:center;flex-direction:column}.nav-btn{max-width:300px;width:100%}.form-row{flex-direction:column}.form-row .form-group{min-width:auto}.quote-actions{flex-direction:column}.quote-actions .btn{min-width:auto}.materials-grid,.prices-grid,.usage-overview{grid-template-columns:1fr}}.modal-overlay{align-items:center;background:#000000b3;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.approval-dialog{background:#fff;border-radius:12px;box-shadow:0 10px 30px #0000004d;max-height:80vh;max-width:700px;overflow-y:auto;padding:30px;width:90%}.approval-dialog h3{color:#2c3e50;font-size:1.4em;margin:0 0 15px}.approval-dialog p{color:#7f8c8d;margin-bottom:25px}.approval-list{margin-bottom:25px}.approval-item{border:2px solid #ecf0f1;border-radius:8px;margin-bottom:12px;transition:all .2s ease}.approval-item:hover{border-color:#3498db;box-shadow:0 2px 8px #3498db1a}.approval-checkbox{align-items:flex-start;cursor:pointer;display:flex;gap:12px;padding:15px}.approval-checkbox input[type=checkbox]{margin:4px 0 0;transform:scale(1.2)}.approval-details{flex:1 1}.approval-main{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.approval-main strong{color:#2c3e50;font-size:1.1em}.approval-price{background:#e8f5e8;border-radius:20px;color:#27ae60;font-size:.9em;font-weight:700;padding:4px 12px}.approval-meta{display:flex;gap:15px;margin-bottom:8px}.approval-source{color:#7f8c8d;font-size:.9em}.approval-confidence{color:#8e44ad;font-size:.9em;font-weight:500}.approval-notes{background:#f8f9fa;border-left:3px solid #dee2e6;border-radius:6px;color:#6c757d;font-size:.85em;padding:8px 12px}.approval-actions{border-top:1px solid #ecf0f1;display:flex;gap:15px;justify-content:flex-end;margin-top:25px;padding-top:20px}.approval-actions .btn{min-width:120px}.btn-primary:disabled{background:#bdc3c7;cursor:not-allowed}@media (max-width:768px){.approval-dialog{margin:20px;padding:20px}.approval-main{align-items:flex-start;flex-direction:column;gap:8px}.approval-meta{flex-direction:column;gap:5px}.approval-actions{flex-direction:column-reverse}}.search-and-filter{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;display:flex;flex-wrap:wrap;gap:15px;margin-bottom:20px;padding:20px}.search-input{border:2px solid #e9ecef;border-radius:6px;flex:1 1;font-size:14px;padding:12px 16px;transition:border-color .2s ease}.search-input:focus{border-color:#007bff;box-shadow:0 0 0 3px #007bff1a;outline:none}.category-filter{background:#fff;border:2px solid #e9ecef;border-radius:6px;font-size:14px;min-width:200px;padding:12px 16px;transition:border-color .2s ease}.category-filter:focus{border-color:#007bff;outline:none}.materials-table-container{border-radius:8px;box-shadow:0 2px 10px #0000001a;box-sizing:border-box;margin-top:20px;overflow:hidden;overflow-x:auto;width:100%!important}.materials-view .materials-table-container{max-width:none!important;width:100%!important}.results-info{background:#f8f9fa;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:14px;font-weight:500;padding:15px 20px}.materials-table.enhanced{border-collapse:collapse;margin:0;min-width:100%;table-layout:fixed;width:100%!important}.materials-view .materials-table.enhanced{min-width:100%!important;width:100%!important}.edit-input,.edit-select{box-sizing:border-box;font-size:12px;padding:4px 8px}.edit-input:focus,.edit-select:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff40}.btn-success{background-color:#28a745;border:1px solid #28a745;color:#fff}.btn-success:hover{background-color:#218838;border-color:#1e7e34}.btn-secondary{background-color:#6c757d;border:1px solid #6c757d;color:#fff}.btn-secondary:hover{background-color:#5a6268;border-color:#545b62}.materials-table.enhanced th{background:#495057;border:none;color:#fff;font-size:14px;font-weight:600;padding:15px 12px;text-align:left;white-space:nowrap}.materials-table.enhanced th:first-child{width:25%}.materials-table.enhanced th:nth-child(2){width:15%}.materials-table.enhanced th:nth-child(3){width:10%}.materials-table.enhanced th:nth-child(4),.materials-table.enhanced th:nth-child(5){width:15%}.materials-table.enhanced th:nth-child(6){width:20%}.materials-table.enhanced th:nth-child(7){width:10%}.materials-table.enhanced td{border-bottom:1px solid #e9ecef;overflow:hidden;padding:12px;text-overflow:ellipsis;vertical-align:middle}.materials-table.enhanced tr:hover{background-color:#f8f9fa}.material-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.category-badge{font-size:11px;white-space:nowrap}.unit-cell{background:#f8f9fa;border-radius:4px;color:#495057;font-family:Courier New,monospace;font-size:12px;font-weight:500;padding:6px 8px;text-align:center}.price-cell{padding-right:16px;text-align:right}.price-value{color:#28a745;font-weight:700;white-space:nowrap}.supplier-cell{font-size:13px;font-style:italic}.description-cell,.supplier-cell{color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.description-cell{font-size:12px;line-height:1.3;max-width:0}.actions-cell{text-align:center;white-space:nowrap}.btn-small{border:none;border-radius:4px;cursor:pointer;font-size:12px;margin:0 2px;padding:6px 10px;transition:all .2s ease}.btn-edit{background:#ffc107;color:#212529}.btn-edit:hover{background:#e0a800;transform:translateY(-1px)}.btn-danger{background:#dc3545;color:#fff}.btn-danger:hover{background:#c82333;transform:translateY(-1px)}.empty-state{color:#6c757d}.empty-icon{display:block;font-size:48px;margin-bottom:20px}.empty-state h4{color:#495057;font-weight:600;margin:0 0 10px}.empty-state p{font-size:14px;line-height:1.5;margin:0 0 20px}.usage-stats-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));margin-top:30px}.stat-card{align-items:flex-start;background:#fff;border:1px solid #e9ecef;border-radius:12px;box-shadow:0 4px 20px #0000001a;display:flex;gap:15px;padding:25px;transition:transform .2s ease,box-shadow .2s ease}.stat-card:hover{box-shadow:0 8px 30px #00000026;transform:translateY(-2px)}.stat-card.primary-stat{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;grid-column:span 2}.stat-card.secondary-stat{background:linear-gradient(135deg,#f093fb,#f5576c);color:#fff}.stat-card.wide-stat{background:#f8f9fa;grid-column:span 2}.stat-icon{background:#ffffff1a;border-radius:8px;flex-shrink:0;font-size:24px;padding:8px}.stat-card.primary-stat .stat-icon,.stat-card.secondary-stat .stat-icon{background:#fff3}.stat-content{flex:1 1}.stat-card h3{font-size:14px;font-weight:600;margin:0 0 8px;opacity:.9}.stat-value{line-height:1.2;margin:0 0 5px}.stat-value.large{font-size:32px}.stat-value.medium{font-size:20px}.stat-value.small{font-size:14px;font-weight:500}.stat-label{font-size:12px;opacity:.7}.token-breakdown{display:flex;flex-direction:column;gap:8px;margin-top:10px}.token-item{align-items:center;background:#fff;border-radius:6px;display:flex;font-size:14px;justify-content:space-between;padding:8px 12px}.token-item.total{background:#e3f2fd;border:2px solid #1976d2;font-weight:600}.loading-spinner{border:4px solid #f3f3f3;border-top-color:#007bff}@media (max-width:768px){.search-and-filter{align-items:stretch;flex-direction:column}.category-filter,.search-input{min-width:auto;width:100%}.usage-stats-grid{grid-template-columns:1fr}.stat-card.primary-stat,.stat-card.wide-stat{grid-column:span 1}.materials-table.enhanced{font-size:11px}.materials-table.enhanced td,.materials-table.enhanced th{padding:8px 4px}.materials-table.enhanced td:nth-child(5),.materials-table.enhanced td:nth-child(6),.materials-table.enhanced th:nth-child(5),.materials-table.enhanced th:nth-child(6){display:none}.materials-table.enhanced th:first-child{width:35%}.materials-table.enhanced th:nth-child(2){width:20%}.materials-table.enhanced th:nth-child(3){width:15%}.materials-table.enhanced th:nth-child(4){width:20%}.materials-table.enhanced th:nth-child(7){width:10%}}.project-flow{margin:0 auto;max-width:1200px;padding:20px}.project-header{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.project-info h2{color:#2c3e50;margin:0 0 5px}.project-info p{color:#6c757d;margin:2px 0}.reset-btn{background:#dc3545;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:10px 15px}.reset-btn:hover{background:#c82333}.step-navigation{background:#fff;border-radius:10px;box-shadow:0 2px 4px #0000001a;display:flex;justify-content:space-between;margin-bottom:40px;overflow-x:auto;padding:20px}.step{align-items:center;border-radius:8px;cursor:pointer;display:flex;flex:1 1;margin:0 5px;min-width:180px;padding:15px;transition:all .3s ease}.step.active{background:#007bff;color:#fff;transform:scale(1.05)}.step.accessible:hover{background:#e9ecef}.step.accessible.active:hover{background:#0056b3}.step.locked{cursor:not-allowed;opacity:.5}.step-icon{font-size:24px;margin-right:10px}.step-info{flex:1 1}.step-name{font-size:16px;font-weight:700}.step-description{font-size:12px;opacity:.8}.step-arrow{font-size:20px;margin-left:10px;opacity:.5}.step.active .step-arrow{display:none}.step-content{background:#fff;border-radius:10px;box-shadow:0 2px 8px #0000001a;min-height:600px;padding:30px}.project-creation{margin:0 auto;max-width:800px}.section-header{margin-bottom:30px;text-align:center}.section-header h3{color:#2c3e50;font-size:28px;margin:0 0 10px}.section-header p{color:#6c757d;margin:0}.header-actions{justify-content:center;margin-top:20px}.toggle-btn{background:#fff;border:2px solid #007bff;border-radius:5px;color:#007bff;cursor:pointer;padding:10px 20px;transition:all .3s ease}.toggle-btn.active,.toggle-btn:hover{background:#007bff;color:#fff}.form-container{margin:0 auto;max-width:600px}.project-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.form-grid{grid-gap:20px;gap:20px;grid-template-columns:1fr 1fr}.form-group{display:flex;flex-direction:column}.form-group.full-width{grid-column:1/-1}.form-group.checkbox-group{align-items:center;flex-direction:row}.form-group.checkbox-group input{margin-right:8px;width:auto}.form-group label{color:#2c3e50;font-weight:700;margin-bottom:5px}.form-group input,.form-group select,.form-group textarea{border:1px solid #ced4da;border-radius:5px;font-size:14px;padding:12px;transition:border-color .3s ease}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff40;outline:none}.submit-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;margin-top:20px;padding:15px;transition:background .3s ease;width:100%}.submit-btn:hover{background:#218838}.submit-btn:disabled{background:#6c757d;cursor:not-allowed}.error-message{margin:15px 0;padding:12px}.existing-projects{margin:0 auto;max-width:900px}.no-projects{color:#6c757d;padding:60px 20px;text-align:center}.create-first-btn{background:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;margin-top:20px;padding:12px 24px}.projects-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.project-card{background:#fff;border:1px solid #e9ecef;border-radius:8px;box-shadow:0 2px 4px #0000001a;cursor:pointer;padding:20px;transition:all .3s ease}.project-card:hover{border-color:#007bff;box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.project-card-header{align-items:center}.project-card-header h4{color:#2c3e50;margin:0}.status-badge{color:#fff}.project-card-body p{color:#6c757d;font-size:14px;margin:8px 0}.project-card-footer{margin-top:15px;text-align:center}.continue-text{color:#007bff;font-size:12px;font-weight:700}.geometry-input{margin:0 auto;max-width:800px}.geometry-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.calculations-display{background:#e3f2fd;border:1px solid #bbdefb;border-radius:8px;margin:20px 0;padding:20px}.calculations-display h4{color:#1976d2;margin:0 0 15px}.calc-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.calc-item{align-items:center;background:#fff;border:1px solid #bbdefb;border-radius:5px;display:flex;justify-content:space-between;padding:12px}.calc-label{color:#2c3e50;font-weight:700}.calc-value{color:#1976d2;font-weight:700}.labor-input{margin:0 auto;max-width:900px}.labor-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.labor-overview{background:#fff3cd;border:1px solid #ffeaa7;border-radius:8px;margin-bottom:30px;padding:20px}.overview-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:20px}.overview-item{display:flex;flex-direction:column}.overview-item label{color:#2c3e50;font-weight:700;margin-bottom:5px}.overview-item input{border:1px solid #ced4da;border-radius:5px;padding:10px}.overview-item input.fixed-rate{background:#e9ecef}.overview-item small{color:#6c757d;font-size:12px;margin-top:5px}.calculations{display:flex;gap:30px;justify-content:center;margin-top:20px}.work-breakdown{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin:20px 0;padding:20px}.work-breakdown h4{color:#2c3e50;margin:0 0 20px}.breakdown-list{display:flex;flex-direction:column;gap:15px}.breakdown-item{background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;padding:15px}.breakdown-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:10px}.hours-inputs{align-items:flex-end;display:flex;gap:15px}.hour-input-group{align-items:center;display:flex;flex-direction:column;gap:5px}.hour-input-group label{color:#6c757d;font-size:12px;font-weight:500}.hours-input{border:1px solid #ced4da;border-radius:3px;padding:5px;text-align:center;width:80px}.hours-input.allocated{background-color:#f8fff9;border-color:#28a745}.description-input{border:1px solid #ced4da;border-radius:3px;padding:8px;width:100%}.breakdown-totals{display:flex;flex-direction:column;gap:10px;margin-top:20px}.total-row{background:#d4edda;border-radius:5px;color:#155724;padding:12px;text-align:center}.total-row.allocated{background:#d1ecf1;color:#0c5460}.materials-manager{margin:0 auto;max-width:1000px}.suggestions-section{background:#d1ecf1;border:1px solid #bee5eb;border-radius:8px;margin-bottom:30px;padding:20px}.suggestions-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:15px}.suggestions-header h4{color:#0c5460;margin:0}.hide-suggestions-btn{background:none;border:none;color:#0c5460;cursor:pointer;font-size:16px}.suggestions-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.suggestion-card{align-items:center;background:#fff;border:1px solid #bee5eb;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.suggestion-info{flex:1 1}.suggestion-info strong{color:#2c3e50}.suggestion-info p{color:#6c757d;font-size:14px;margin:5px 0}.suggestion-details{color:#6c757d;display:flex;flex-direction:column;font-size:12px;gap:2px}.add-suggestion-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 12px}.add-suggestion-btn:hover{background:#218838}.add-material-section{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.add-material-section h4{color:#2c3e50;margin:0 0 20px}.material-form{display:flex;flex-direction:column}.total-display{background:#d4edda;border:1px solid #c3e6cb;border-radius:5px;color:#155724;padding:15px;text-align:center}.add-btn{background:#007bff;border:none;border-radius:5px;cursor:pointer;margin-top:15px;padding:12px 20px}.add-btn:hover{background:#0056b3}.add-btn:disabled{background:#6c757d;cursor:not-allowed}.materials-list{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:20px;padding:20px}.materials-list h4{color:#2c3e50;margin:0 0 20px}.material-category{margin-bottom:25px}.material-category h5{border-bottom:1px solid #e9ecef;color:#495057;font-size:16px;margin:0 0 10px;padding-bottom:5px}.materials-table{display:flex;flex-direction:column;gap:10px}.material-row{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.material-info{display:flex;flex:1 1;flex-direction:column;gap:4px}.material-info strong{color:#2c3e50}.material-info span{color:#6c757d;font-size:14px}.material-actions{align-items:center;display:flex;gap:15px}.material-total{color:#28a745;font-size:16px;font-weight:700}.edit-btn{background:#007bff;border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:14px;padding:6px 10px}.edit-btn:hover{background:#0056b3}.remove-btn{background:#dc3545;border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:14px;padding:6px 10px}.remove-btn:hover{background:#c82333}.material-edit-form{background:#fff3cd;border:1px solid #ffc107;border-radius:5px;padding:15px;width:100%}.edit-row{align-items:center;margin-bottom:15px}.edit-inputs,.edit-row{display:flex;flex-wrap:wrap;gap:15px}.input-group{align-items:center;display:flex;gap:5px;min-width:150px}.input-group label{color:#6c757d;font-size:12px;min-width:70px}.input-group input{border:1px solid #ced4da;border-radius:3px;flex:1 1;font-size:14px;padding:5px 8px}.input-group span{color:#6c757d;font-size:12px;min-width:30px}.edit-actions{border-top:1px solid #dee2e6;display:flex;gap:10px;justify-content:flex-end;margin-top:10px;padding-top:10px}.save-btn{background:#28a745;border-radius:3px;font-size:14px;padding:8px 16px}.save-btn:hover{background:#218838}.save-btn:disabled{background:#6c757d}.cancel-btn{border-radius:3px;padding:8px 16px}.cancel-btn:hover{background:#545b62}.materials-summary{background:#e9ecef;border-radius:8px;margin-top:20px;padding:20px}.summary-item{margin-bottom:10px}.summary-item.total{border-top:1px solid #ced4da;color:#28a745;font-size:18px;margin-top:15px;padding-top:10px}.calculation-view{margin:0 auto;max-width:1000px}.project-summary{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.project-summary h4{color:#2c3e50;margin:0 0 15px}.summary-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.summary-item{background:#fff;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:12px}.calculation-section{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.calculation-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.calculation-header h4{color:#2c3e50;margin:0}.calculate-btn{background:#17a2b8;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:12px 20px}.calculate-btn:hover{background:#138496}.calculate-btn:disabled{background:#6c757d;cursor:not-allowed}.calculation-results{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:20px}.calculation-breakdown{display:flex;flex-direction:column;gap:20px}.breakdown-section{background:#fff;border:1px solid #e9ecef;border-radius:5px;padding:15px}.breakdown-section h5{color:#495057;margin:0 0 10px}.breakdown-item{display:flex;justify-content:space-between;margin-bottom:8px;padding:5px 0}.breakdown-item.total{border-top:2px solid #28a745;color:#28a745;font-size:18px;margin-top:10px;padding-top:10px}.quote-generation{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.quote-generation h4{color:#2c3e50;margin:0 0 20px}.quote-options{background:#f8f9fa;border-radius:5px;margin-bottom:20px;padding:15px}.options-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.quote-buttons{display:flex;gap:15px;justify-content:center;margin-bottom:20px}.static-quote-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.static-quote-btn:hover{background:#218838}.ai-quote-btn{background:#6f42c1;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.ai-quote-btn:hover{background:#5a32a3}.html-quote-btn{background:#fd7e14;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.html-quote-btn:hover{background:#e96500}.quote-info{background:#d1ecf1;border:1px solid #bee5eb;border-radius:5px;padding:15px}.quote-info p{color:#0c5460}.quotes-list{background:#fff;border:1px solid #e9ecef;border-radius:8px;padding:20px}.quotes-list h4{color:#2c3e50;margin:0 0 20px}.quotes-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.quote-card{background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;padding:15px}.quote-header{margin-bottom:10px}.quote-id{color:#2c3e50;font-weight:700}.quote-info{margin-bottom:15px}.quote-info p{color:#495057;font-size:14px;margin:5px 0}.quote-actions{display:flex;flex-wrap:wrap;gap:5px;justify-content:center;text-align:center}.view-quote-btn{background:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.view-quote-btn:hover{background:#0056b3}.pdf-download-btn{background:#dc3545;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.pdf-download-btn:hover{background:#c82333}.pdf-generate-btn{background:#6c757d;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.pdf-generate-btn:hover{background:#545b62}.pdf-generate-btn:disabled{cursor:not-allowed;opacity:.6}@media (max-width:768px){.step-navigation{flex-direction:column;gap:10px}.step{min-width:auto}.step-arrow{display:none}.calc-grid,.form-grid,.overview-grid,.projects-grid,.quotes-grid,.suggestions-grid,.summary-grid{grid-template-columns:1fr}.quote-buttons{flex-direction:column}}.project-card-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:15px}.header-actions{align-items:center;display:flex;gap:10px}.card-actions{display:flex;gap:5px}.action-btn{align-items:center;background:none;display:flex;font-size:14px;height:28px;justify-content:center;padding:5px;transition:all .2s ease;width:28px}.action-btn:hover{box-shadow:0 2px 8px #00000026;transform:scale(1.1)}.edit-btn{background:#ffc107;color:#212529}.edit-btn:hover{background:#e0a800}.delete-btn{background:#dc3545}.delete-btn:hover{background:#c82333}.form-actions{align-items:center;gap:15px}.cancel-btn{background:#6c757d;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:12px 20px;transition:background-color .2s ease}.cancel-btn:hover{background:#5a6268}.project-review{margin:0 auto;max-width:1400px;padding:20px}.project-review h2{border-bottom:2px solid #3498db;color:#2c3e50;margin-bottom:20px;padding-bottom:10px}.error-message{background-color:#e74c3c;border-radius:5px;color:#fff;text-align:center}.project-review-layout{grid-gap:30px;display:grid;gap:30px;grid-template-columns:400px 1fr;height:calc(100vh - 200px)}.project-list{background:#f8f9fa;border:1px solid #dee2e6;border-radius:10px;overflow-y:auto;padding:20px}.project-list h3{border-bottom:1px solid #dee2e6;color:#495057;margin-bottom:20px;margin-top:0;padding-bottom:10px;text-align:center}.project-item{background:#fff;border:2px solid #e9ecef;border-radius:8px;box-shadow:0 2px 4px #0000001a;cursor:pointer;margin-bottom:15px;padding:15px;transition:all .3s ease}.project-item:hover{border-color:#3498db;box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.project-item.selected{background:#e8f5e8;border-color:#27ae60;box-shadow:0 4px 12px #27ae6033}.project-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:10px}.project-header h4{color:#2c3e50;font-size:16px;margin:0}.status-badge{border-radius:12px;font-size:12px;font-weight:700;padding:4px 8px;text-transform:uppercase}.status-badge.active{background:#d4edda;color:#155724}.status-badge.completed{background:#cce5ff;color:#004085}.status-badge.pending{background:#fff3cd;color:#856404}.status-badge.cancelled{background:#f8d7da;color:#721c24}.project-details p{color:#6c757d;font-size:14px;margin:5px 0}.project-stats{border-top:1px solid #e9ecef;display:flex;flex-wrap:wrap;gap:10px;margin-top:10px;padding-top:10px}.project-stats span{background:#e9ecef;border-radius:12px;color:#495057;font-size:12px;padding:3px 8px}.project-details-panel{background:#fff;border:1px solid #dee2e6;border-radius:10px;box-shadow:0 2px 8px #0000001a;overflow-y:auto;padding:25px}.project-details-panel h3{border-bottom:2px solid #3498db;color:#2c3e50;font-size:24px;margin-bottom:25px;margin-top:0;padding-bottom:10px}.project-details-panel h4{border-bottom:1px solid #ecf0f1;color:#34495e;font-size:18px;margin-bottom:15px;margin-top:30px;padding-bottom:8px}.steps-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:25px}.step-item{background:#f8f9fa;border:2px solid #e9ecef;border-radius:8px;padding:15px;text-align:center;transition:all .3s ease}.step-item.completed{background:#d4edda;border-color:#c3e6cb}.step-item.pending{background:#fff3cd;border-color:#ffeaa7}.step-status{font-size:18px;font-weight:700;margin-bottom:8px}.step-title{color:#495057;font-weight:600;margin-bottom:5px;text-transform:capitalize}.step-timestamp{color:#6c757d;font-size:12px}.geometry-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:15px}.geometry-item{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;display:flex;justify-content:space-between;padding:12px}.geometry-item label{color:#495057;font-weight:600}.geometry-item span{color:#2c3e50;font-weight:700}.geometry-notes{background:#e3f2fd;border-left:4px solid #2196f3;border-radius:0 6px 6px 0;color:#1565c0;margin-top:15px;padding:15px}.quotes-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:25px}.quote-item{background:#f8f9fa;border:2px solid #e9ecef;border-radius:8px;cursor:pointer;padding:20px;transition:all .3s ease}.quote-item:hover{border-color:#3498db;box-shadow:0 4px 8px #3498db33;transform:translateY(-2px)}.quote-item.selected{background:#fdf2f2;border-color:#e74c3c;box-shadow:0 4px 12px #e74c3c33}.quote-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:15px}.quote-header h5{color:#2c3e50;margin:0}.delivery-status{border-radius:12px;font-size:12px;font-weight:700;padding:4px 8px}.delivery-status.delivered{background:#d4edda;color:#155724}.delivery-status.draft{background:#fff3cd;color:#856404}.quote-amounts{margin-bottom:15px}.amount-item{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.amount-item label{color:#495057;font-weight:600}.total-amount{color:#27ae60;font-size:18px;font-weight:700}.amount-breakdown{color:#6c757d;display:flex;flex-direction:column;font-size:14px;gap:5px}.quote-method{background:#e3f2fd;border-radius:6px;color:#1565c0;font-size:14px;margin-bottom:10px;padding:8px 12px}.quote-date{color:#6c757d;font-size:12px;text-align:right}.quote-details{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-top:25px;padding:25px}.quote-details h4{color:#e74c3c;margin-top:0}.quote-details h5{border-bottom:1px solid #dee2e6;color:#495057;margin-bottom:10px;padding-bottom:5px}.quote-content{border:1px solid #dee2e6;max-height:300px;padding:15px}.materials-table,.quote-content{background:#fff;margin-bottom:20px}.materials-table{border:1px solid #dee2e6;border-radius:6px;overflow:hidden}.materials-table td,.materials-table th{border-bottom:1px solid #e9ecef;padding:12px;text-align:left}.materials-table th{color:#495057}.materials-table tr:last-child td{border-bottom:none}.materials-table tr:hover{background:#f8f9fa}.quote-responses{grid-gap:15px;display:grid;gap:15px}.response-item{display:flex;flex-direction:column;gap:5px}.response-item label{color:#495057;font-weight:600}.response-item span{background:#fff;border:1px solid #dee2e6;border-radius:6px;color:#495057;padding:10px}.loading{color:#6c757d;font-style:italic;padding:20px;text-align:center}@media (max-width:1024px){.project-review-layout{grid-template-columns:1fr;height:auto}.project-list{height:400px}.quotes-grid{grid-template-columns:1fr}.geometry-grid,.steps-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:768px){.project-review{padding:10px}.geometry-grid,.steps-grid{grid-template-columns:1fr}.project-stats{flex-direction:column;gap:5px}.quote-header{align-items:flex-start;flex-direction:column;gap:10px}}.completed-quotes-view{margin:0 auto;max-width:1400px;padding:20px}.quotes-header{margin-bottom:30px}.quotes-header h2{color:#2c3e50;margin-bottom:10px}.quotes-header p{color:#7f8c8d;margin-bottom:20px}.quotes-controls{align-items:center;display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;margin-bottom:20px}.filter-controls{align-items:center;gap:15px}.filter-controls label{align-items:center;font-weight:500;gap:8px}.filter-controls select{background:#fff;border:1px solid #ddd;border-radius:4px;min-width:120px;padding:8px 12px}.refresh-btn{background:#3498db;border:none;border-radius:4px;color:#fff;cursor:pointer;font-weight:500;padding:10px 16px;transition:background-color .2s}.refresh-btn:hover{background:#2980b9}.quotes-summary{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}.summary-stats{gap:30px;justify-content:center}.stat-item{text-align:center}.stat-label{color:#7f8c8d;display:block;margin-bottom:5px}.stat-value{display:block;font-weight:700}.quotes-table-container{background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;overflow:hidden}.quotes-table{border-collapse:collapse;width:100%}.quotes-table th{background:#34495e;color:#fff;font-size:14px;font-weight:600;padding:15px 12px;text-align:left}.quotes-table td{border-bottom:1px solid #ecf0f1;padding:12px;vertical-align:middle}.quote-row:hover{background:#f8f9fa}.quote-row.newest-quote{background:#e8f5e8;border-left:4px solid #27ae60;transition:all .3s ease}.quote-row.newest-quote:hover{background:#d5f4d5}.project-name,.quote-type{font-weight:500}.quote-type{border-radius:12px;display:inline-block;font-size:12px;padding:4px 8px}.quote-type.static{background:#e8f5e8;color:#27ae60}.quote-type.ai{background:#e3f2fd;color:#2196f3}.quote-total{color:#27ae60;font-weight:600}.ai-cost{color:#7f8c8d;font-size:14px}.delete-btn,.download-btn,.view-btn{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:6px 10px;transition:background-color .2s}.download-btn{background:#95a5a6}.download-btn:hover{background:#7f8c8d}.delete-btn{background:#e74c3c}.delete-btn:hover{background:#c0392b}.empty-state{color:#7f8c8d;padding:60px 20px;text-align:center}.empty-state p{font-size:18px;margin:0}.loading-state{padding:60px 20px;text-align:center}.loading-spinner{animation:spin 1s linear infinite;border:3px solid #f3f3f3;border-radius:50%;border-top-color:#3498db;height:40px;margin:0 auto 20px;width:40px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.error-message{background:#f8d7da;border:1px solid #f5c6cb;color:#721c24;margin-bottom:20px;padding:15px}.quote-modal-overlay{align-items:center;background:#000000b3;bottom:0;display:flex;justify-content:center;left:0;padding:20px;position:fixed;right:0;top:0;z-index:1000}.quote-modal{background:#fff;border-radius:8px;box-shadow:0 10px 30px #0000004d;max-height:90vh;max-width:800px;overflow-y:auto;width:100%}.modal-header{align-items:center;border-bottom:1px solid #ecf0f1;display:flex;justify-content:space-between;padding:20px 24px}.modal-header h3{color:#2c3e50;margin:0}.close-btn{background:none;border:none;border-radius:4px;color:#7f8c8d;cursor:pointer;font-size:20px;padding:5px;transition:background-color .2s}.close-btn:hover{background:#ecf0f1}.modal-content{padding:24px}.quote-meta{background:#f8f9fa;border-radius:6px;margin-bottom:20px;padding:16px}.meta-row{display:flex;margin-bottom:8px}.meta-row:last-child{margin-bottom:0}.meta-row strong{color:#34495e;min-width:120px}.quote-text h4{color:#2c3e50;margin-bottom:12px}.quote-content{background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;font-size:14px;line-height:1.5;white-space:pre-wrap}.modal-actions{border-top:1px solid #ecf0f1;display:flex;gap:12px;justify-content:flex-end;padding:20px 24px}.modal-actions .download-btn{background:#27ae60}.modal-actions .download-btn:hover{background:#229954}.modal-actions .close-btn{background:#95a5a6;border-radius:4px;color:#fff;padding:10px 16px}.modal-actions .close-btn:hover{background:#7f8c8d}@media (max-width:768px){.completed-quotes-view{padding:15px}.quotes-controls{align-items:stretch;flex-direction:column}.filter-controls{justify-content:center}.summary-stats{gap:15px}.quotes-table-container{overflow-x:auto}.quotes-table{min-width:700px}.quote-modal{margin:10px;max-height:95vh}.modal-content{padding:16px}.modal-actions{flex-direction:column;padding:16px}}.enhanced-table{min-width:1200px}.enhanced-table th{background:linear-gradient(135deg,#2c3e50,#34495e);color:#fff;font-weight:600;padding:15px 10px;text-align:left}.enhanced-table .quote-row:hover{background:#f8f9fa;box-shadow:0 4px 8px #0000001a;transform:translateY(-1px)}.date-cell{width:120px}.date-info{display:flex;flex-direction:column;gap:4px}.date-main{color:#2c3e50;font-weight:600}.quote-id{background:#ecf0f1;border-radius:10px;color:#7f8c8d;font-size:11px;padding:2px 6px;text-align:center}.project-cell{min-width:200px}.project-info{display:flex;flex-direction:column;gap:4px}.project-name{color:#2c3e50;font-weight:600}.project-type{background:#3498db1a;border-radius:10px;color:#3498db;display:inline-block;font-size:12px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.project-description{color:#7f8c8d;font-size:11px;font-style:italic}.customer-cell{min-width:180px}.customer-info{display:flex;flex-direction:column;gap:3px}.customer-name{color:#2c3e50;font-weight:600}.customer-email,.customer-phone{color:#7f8c8d;font-size:11px}.measurements-cell{min-width:140px}.measurements-info{display:flex;flex-direction:column;gap:3px}.area,.roof-type,.work-hours,.workers{background:#2ecc711a;border-radius:8px;color:#2c3e50;font-size:12px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.materials-cell{min-width:120px}.materials-info{display:flex;flex-direction:column;gap:4px}.material-count{color:#e67e22;font-size:12px;font-weight:600}.material-categories{display:flex;flex-direction:column;gap:2px}.material-category{background:#e67e221a;border-radius:6px;color:#e67e22;font-size:10px;padding:1px 4px;width:-webkit-fit-content;width:fit-content}.more-categories{color:#95a5a6;font-size:10px;font-style:italic}.pricing-cell{min-width:140px}.pricing-info{display:flex;flex-direction:column;gap:3px}.total-price{color:#27ae60;font-size:14px;font-weight:700}.labor-cost,.material-cost{color:#7f8c8d;font-size:11px}.quote-badge{border-radius:8px;font-size:10px;margin-top:4px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.quote-badge.static{background:#95a5a633;color:#95a5a6}.quote-badge.ai{background:#9b59b633;color:#9b59b6}.actions-cell{min-width:160px}.actions-buttons{display:flex;flex-direction:column;gap:4px}.action-btn{border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:500;padding:4px 8px;text-align:left;transition:all .2s;width:100%}.view-btn{background:#3498db;color:#fff}.view-btn:hover{background:#2980b9;transform:scale(1.02)}.pdf-btn{background:#e74c3c;color:#fff}.pdf-btn:hover{background:#c0392b;transform:scale(1.02)}.generate-pdf-btn{background:#9b59b6;color:#fff;font-size:.85rem}.generate-pdf-btn:hover{background:#8e44ad;transform:scale(1.02)}.generate-pdf-btn:disabled{background:#bdc3c7;cursor:not-allowed;transform:none}.download-btn{background:#27ae60;color:#fff}.download-btn:hover{background:#229954;transform:scale(1.02)}.delete-btn{background:#e67e22;color:#fff}.delete-btn:hover{background:#d35400;transform:scale(1.02)}.enhanced-modal{max-height:90vh;max-width:900px;width:90vw}.overview-section{background:#f8f9fa;border-radius:8px;margin-bottom:16px;padding:16px}.overview-section h4{border-bottom:2px solid #3498db;color:#2c3e50;font-size:16px;margin:0 0 12px;padding-bottom:8px}.info-grid{grid-gap:12px;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.info-item{display:flex;flex-direction:column;gap:4px}.info-item.full-width{grid-column:1/-1}.info-item .label{color:#7f8c8d;font-size:12px;font-weight:600;text-transform:uppercase}.info-item .value{color:#2c3e50;font-size:14px;font-weight:500}.material-categories-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.category-tag{background:#e67e221a;border-radius:12px;color:#e67e22;font-size:12px;font-weight:500;padding:4px 8px}.pricing-breakdown{display:flex;flex-direction:column;gap:8px}.price-item{align-items:center;background:#fff;border-left:4px solid #3498db;border-radius:6px;display:flex;justify-content:space-between;padding:8px 12px}.price-item.total-price{background:#27ae600d;border-left-color:#27ae60}.price-label{font-weight:500}.price-label,.price-value{color:#2c3e50;font-size:14px}.price-value{font-weight:600}.price-value.total{color:#27ae60;font-size:18px}.quote-text-section{background:#fff;border:1px solid #ecf0f1;border-radius:8px;overflow:hidden}.quote-text-section h4{background:#34495e;color:#fff;margin:0;padding:12px 16px}.quote-content{background:#fafafa;font-family:Courier New,monospace;font-size:12px;line-height:1.4;margin:0;max-height:400px;overflow-y:auto;padding:16px}@media (max-width:1200px){.enhanced-table{min-width:1000px}.info-grid{grid-template-columns:1fr}}@media (max-width:768px){.enhanced-table{min-width:800px}.enhanced-modal{max-height:95vh;width:95vw}.overview-section{padding:12px}.actions-buttons{flex-direction:row;flex-wrap:wrap}.action-btn{flex:1 1;min-width:70px}}.materials-list-view{background:#f8f9fa;margin:0;max-width:100%;min-height:100vh;padding:0;width:100%}.materials-header{background:#fff;border-bottom:1px solid #e0e0e0;margin-bottom:0;padding:24px}.materials-header h2{color:#2c3e50;font-size:28px;font-weight:600;margin:0 0 8px}.materials-header p{color:#666;font-size:16px;margin:0 0 24px}.materials-controls{display:flex;flex-direction:column;gap:16px}.filter-controls{align-items:end;display:flex;flex-wrap:wrap;gap:16px}.filter-controls label{display:flex;flex-direction:column;gap:4px;min-width:150px}.filter-controls label span{color:#555;font-size:14px;font-weight:500}.filter-controls input,.filter-controls select{border:1px solid #ddd;border-radius:6px;font-size:14px;padding:8px 12px;transition:border-color .2s}.filter-controls input:focus,.filter-controls select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}.search-input{min-width:250px}.action-controls{align-items:center;display:flex;gap:12px}.add-btn,.refresh-btn{border:none;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;padding:10px 16px;transition:all .2s}.add-btn{background:#27ae60;color:#fff}.add-btn:hover{background:#229954;transform:translateY(-1px)}.refresh-btn{background:#f1f2f6;border:1px solid #ddd;color:#2c3e50}.refresh-btn:hover{background:#e1e2e6}.refresh-btn:disabled{cursor:not-allowed;opacity:.6}.new-material-form{background:#f8f9fa;border:1px solid #e0e0e0;border-radius:8px;margin-top:24px;padding:20px}.new-material-form h4{color:#2c3e50;font-size:18px;margin:0 0 16px}.form-grid{grid-gap:12px;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:16px}.form-grid input,.form-grid select{border:1px solid #ddd;border-radius:6px;font-size:14px;padding:10px 12px}.form-grid input:focus,.form-grid select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}.form-actions{display:flex;gap:12px}.save-btn{background:#27ae60;border:none;border-radius:6px;color:#fff;cursor:pointer;font-weight:500;padding:10px 20px;transition:all .2s}.save-btn:hover:not(:disabled){background:#229954;transform:translateY(-1px)}.save-btn:disabled{cursor:not-allowed;opacity:.6;transform:none}.error-message{background:#fee;border:1px solid #ffcdd2;border-radius:6px;color:#c62828;font-weight:500;margin:16px 24px;padding:12px 16px}.materials-summary{background:#fff;border-bottom:1px solid #e0e0e0;padding:20px 24px}.summary-stats{display:flex;flex-wrap:wrap;gap:32px}.stat-item{display:flex;flex-direction:column;gap:4px}.stat-label{color:#666;font-size:14px;font-weight:500}.stat-value{color:#2c3e50;font-size:24px;font-weight:600}.empty-state,.loading-state{background:#fff;color:#666;padding:60px 24px;text-align:center}.empty-state p,.loading-state p{font-size:18px;margin:8px 0}.materials-table-container{background:#fff;border-radius:0;overflow:auto;position:relative}.materials-table{border-collapse:collapse;font-size:14px;table-layout:fixed;width:100%}.materials-table th{border-bottom:2px solid #e0e0e0;color:#2c3e50;font-weight:600;padding:16px 12px;text-align:left;top:0;z-index:10}.materials-table th,.materials-table th:last-child{background:#f8f9fa;position:-webkit-sticky;position:sticky}.materials-table th:last-child{box-shadow:-2px 0 4px #0000001a;right:0;z-index:11}.materials-table td{border-bottom:1px solid #f0f0f0;padding:12px;vertical-align:middle}.materials-table td:last-child{background:#fff;box-shadow:-2px 0 4px #0000001a;position:-webkit-sticky;position:sticky;right:0}.material-row:hover,.material-row:hover td:last-child{background:#f8f9fa}.material-row:nth-child(2n),.material-row:nth-child(2n) td:last-child{background:#fafbfc}.material-row:nth-child(2n):hover,.material-row:nth-child(2n):hover td:last-child{background:#f0f2f5}.materials-table td:first-child,.materials-table th:first-child{width:22%}.materials-table td:nth-child(2),.materials-table th:nth-child(2){width:12%}.materials-table td:nth-child(3),.materials-table th:nth-child(3){width:8%}.materials-table td:nth-child(4),.materials-table th:nth-child(4){width:10%}.materials-table td:nth-child(5),.materials-table th:nth-child(5){width:15%}.materials-table td:nth-child(6),.materials-table th:nth-child(6){width:23%}.materials-table td:nth-child(7),.materials-table th:nth-child(7){min-width:120px;width:10%}.material-name{color:#2c3e50;font-weight:600}.category-badge{background:#e3f2fd;border-radius:12px;color:#1976d2;display:inline-block;font-size:12px;font-weight:500;padding:4px 8px}.unit-cell{color:#666;font-size:13px}.price-cell{color:#27ae60;font-family:Courier New,monospace;font-weight:600}.supplier-cell{color:#666}.description-cell{word-wrap:break-word;color:#666;font-size:13px;max-width:200px}.actions{display:flex;gap:8px;justify-content:center}.cancel-edit-btn,.delete-btn,.edit-btn,.save-edit-btn{background:none;border:none;border-radius:4px;cursor:pointer;font-size:16px;padding:6px;transition:all .2s}.edit-btn:hover{background:#e3f2fd;transform:scale(1.1)}.delete-btn:hover{background:#ffebee;transform:scale(1.1)}.save-edit-btn:hover{background:#e8f5e8;transform:scale(1.1)}.cancel-edit-btn:hover{background:#ffebee;transform:scale(1.1)}.edit-input,.edit-select{border:1px solid #ddd;border-radius:4px;font-size:13px;padding:6px 8px;width:100%}.edit-input:focus,.edit-select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}@media (max-width:1024px){.filter-controls{align-items:stretch;flex-direction:column}.filter-controls label{min-width:auto}.summary-stats{gap:16px}.materials-table{font-size:13px}.materials-table td,.materials-table th{padding:10px 8px}}@media (max-width:768px){.materials-header,.materials-summary{padding:16px}.action-controls{align-items:stretch;flex-direction:column}.form-grid{grid-template-columns:1fr}.materials-table-container{overflow-x:auto}.materials-table{min-width:800px}} +/*# sourceMappingURL=main.409c5cf8.css.map*/ \ No newline at end of file diff --git a/build/static/css/main.409c5cf8.css.map b/build/static/css/main.409c5cf8.css.map new file mode 100644 index 0000000..45ffb57 --- /dev/null +++ b/build/static/css/main.409c5cf8.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.409c5cf8.css","mappings":"AAAA,KAKE,kCAAmC,CACnC,iCAAkC,CAClC,wBAAyB,CALzB,mIAEY,CAHZ,QAOF,CAyiCA,oBACE,kBAAmB,CAGnB,gBAAiB,CAGjB,uBAEF,CAEA,yCACE,kBAAmB,CACnB,0BACF,CAEA,0BAEE,4BAA8B,CAD9B,kBAEF,CAEA,6BAEE,kBAAmB,CADnB,UAEF,CAEA,iBACE,GAAK,kBAAqB,CAC1B,IAAM,qBAAwB,CAC9B,GAAO,kBAAqB,CAC9B,CAGA,oBACE,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAElB,kBAAmB,CADnB,YAEF,CAEA,mBAGE,kBAAmB,CAFnB,YAAa,CACb,uBAAwB,CAExB,kBACF,CAEA,sBAEE,aAAc,CADd,QAEF,CAEA,qBACE,eAAgB,CAChB,WAAY,CACZ,aAAc,CACd,cAAe,CACf,cACF,CAEA,oBACE,eAAiB,CAIjB,6BAA8B,CAF9B,iBAAkB,CAClB,kBAAmB,CAFnB,YAIF,CAEA,WAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,gBACE,kBAAmB,CAEnB,kBAAmB,CACnB,cAAe,CAFf,gBAAiB,CAGjB,iBACF,CAEA,qBAEE,aAAS,CADT,YAAa,CACb,QACF,CAEA,oBAOE,kBAAmB,CANnB,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,YAAa,CACb,6BAA8B,CAJ9B,YAMF,CAEA,iBAEE,aAAc,CADd,cAEF,CAEA,iBACE,YAAa,CACb,QAAS,CACT,cACF,CAEA,sBACE,kBAAmB,CAEnB,kBAAmB,CAEnB,aAAc,CADd,cAAe,CAFf,eAIF,CAEA,sBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAAiB,CAIjB,kBACF,CAEA,4BACE,kBACF,CAEA,gBACE,eACF,CAEA,kBAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,iBACF,CAEA,uBACE,kBAAmB,CAEnB,WAAY,CAEZ,kBAAmB,CAHnB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAAiB,CAIjB,uBACF,CAEA,6BACE,kBAAmB,CACnB,0BACF,CAEA,iBACE,YAAa,CACb,cAAe,CACf,OACF,CAEA,eAEE,kBAAmB,CAMnB,WAAY,CAHZ,kBAAmB,CAFnB,UAAc,CAMd,cAAe,CARf,oBAAqB,CAKrB,cAAe,CACf,oBAAqB,CAHrB,eAMF,CAEA,yBAGE,wBAAyB,CAFzB,cAAe,CACf,uBAEF,CAEA,+BACE,kBAAmB,CAGnB,0BAAyC,CAFzC,UAAc,CACd,0BAEF,CAGA,oBACE,UACF,CAEA,mBAGE,kBAAmB,CACnB,eAAiB,CAEjB,iBAAkB,CAElB,8BAAqC,CAPrC,YAAa,CASb,cAAe,CADf,QAAS,CAPT,6BAA8B,CAK9B,kBAAmB,CAFnB,iBAMF,CAEA,gCAEE,kBAAmB,CADnB,YAAa,CAEb,QACF,CAEA,4CAEE,aAAc,CACd,cAAe,CAFf,eAGF,CAEA,4BAIE,eAAiB,CAFjB,qBAAsB,CACtB,iBAAkB,CAElB,cAAe,CACf,eAAgB,CALhB,gBAMF,CAEA,gBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CACf,eAAiB,CAJjB,gBAAiB,CAKjB,uBACF,CAEA,sBACE,kBAAmB,CACnB,oBACF,CAEA,yBACE,mBAEE,mBAAoB,CADpB,qBAAsB,CAEtB,QACF,CAEA,gCACE,6BACF,CAEA,4BAEE,QAAO,CADP,cAEF,CACF,CCtzCA,UAME,kCAAmC,CACnC,iCAAkC,CAClC,wBAAyB,CALzB,mIAEY,CAJZ,QAAS,CAQT,eAAgB,CAPhB,SAAU,CAQV,UACF,CAEA,KACE,uEAEF,CAEA,WAEE,aAAc,CADd,gBAAiB,CAEjB,YACF,CAGA,cACE,UACF,CAGA,oBAIE,qBAAsB,CAFtB,QAAS,CACT,SAAU,CAFV,WAIF,CAEA,4BAGE,eAAgB,CAChB,qBAAsB,CAFtB,QAAS,CADT,WAIF,CAEA,kCAIE,qBAAsB,CAFtB,QAAS,CACT,SAAU,CAFV,WAIF,CAGA,gBAGE,kBAAoB,CACpB,sBAEF,CAUA,kQAOE,qBAAsB,CAFtB,wBAA0B,CAC1B,oBAEF,CAEA,QAGE,eAAiB,CAEjB,kBAAmB,CACnB,+BAAsC,CAJtC,kBAAmB,CAEnB,YAAa,CAGb,iBAAkB,CANlB,iBAOF,CAEA,WACE,aAAc,CAEd,eAAgB,CADhB,eAEF,CAEA,UACE,aAAc,CAEd,eAAgB,CADhB,QAEF,CAEA,eAIE,kBAAmB,CAEnB,kBAAmB,CACnB,eAAiB,CAGjB,OAAQ,CALR,gBAAiB,CAJjB,iBAAkB,CAElB,UAAW,CADX,QASF,CAEA,+BAJE,kBAAmB,CADnB,YAUF,CALA,gBAIE,eAAgB,CADhB,OAEF,CAEA,cACE,aACF,CAEA,aACE,aAAc,CACd,eACF,CAEA,kBACE,aACF,CAEA,cACE,aAAc,CACd,eACF,CAEA,iBAGE,kBAAmB,CACnB,iBAAkB,CAFlB,UAAW,CAGX,eAAgB,CAJhB,UAKF,CAEA,kBACE,WAAY,CACZ,yBACF,CAEA,eACE,aAAc,CACd,cACF,CAEA,oBACE,eAAgB,CAChB,WAAY,CAIZ,iBAAkB,CAHlB,cAAe,CACf,aAAc,CACd,WAAY,CAEZ,+BACF,CAEA,0BACE,wBACF,CAEA,aACE,YAAa,CAIb,cAAe,CAFf,QAAS,CADT,sBAAuB,CAEvB,aAEF,CAEA,SACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CAGf,eAAiB,CAFjB,eAAgB,CAHhB,iBAAkB,CAIlB,uBAEF,CAEA,eACE,kBAAmB,CACnB,0BACF,CAEA,gBACE,kBACF,CAEA,YAIE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,eAAgB,CAPhB,SAAU,CAIV,gBAAiB,CANjB,iBAAkB,CAClB,QASF,CAEA,kBACE,kBACF,CAEA,YAGE,eAAiB,CAEjB,kBAAmB,CACnB,+BAAsC,CAJtC,aAAc,CADd,eAAgB,CAGhB,YAGF,CAEA,eAEE,aAAc,CACd,kBAAmB,CAFnB,iBAGF,CAEA,cAEE,aAAc,CACd,kBAAmB,CAFnB,iBAGF,CAEA,YACE,kBACF,CAEA,kBAGE,aAAc,CAFd,aAAc,CAGd,eAAgB,CAFhB,iBAGF,CAEA,0DAKE,wBAAyB,CACzB,iBAAkB,CAGlB,qBAAsB,CAFtB,cAAe,CAJf,UAOF,CAEA,4EAIE,oBACF,CAEA,qBACE,gBAAiB,CACjB,eACF,CAEA,UACE,YAAa,CAEb,cAAe,CADf,QAEF,CAEA,sBACE,QAAO,CACP,eACF,CAEA,KACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CACf,eAAgB,CAJhB,iBAAkB,CAMlB,uBAAyB,CADzB,UAEF,CAEA,0BACE,kBAAmB,CACnB,0BACF,CAEA,cACE,kBAAmB,CACnB,kBAAmB,CACnB,cACF,CAEA,mBACE,kBACF,CAEA,wCACE,kBACF,CAEA,eAEE,cAAe,CADf,gBAAiB,CAEjB,UACF,CAEA,iBACE,kBACF,CAEA,sCACE,kBACF,CAEA,gBACE,kBACF,CAEA,qCACE,kBACF,CAEA,OACE,kBAAmB,CAKnB,wBAAyB,CAFzB,iBAAkB,CAFlB,aAAc,CAGd,aAAc,CAFd,YAIF,CAEA,YACE,eAAiB,CAEjB,kBAAmB,CACnB,+BAAsC,CACtC,kBAAmB,CAHnB,YAIF,CAEA,eACE,aAAc,CACd,kBAAmB,CACnB,iBACF,CAEA,SAGE,eAAiB,CACjB,kBAAmB,CACnB,+BAAsC,CAHtC,iBAIF,CAEA,mBAGE,kBAAmB,CAFnB,YAAa,CACb,qBAAsB,CAEtB,QACF,CAEA,iBAIE,wBAA6B,CAF7B,WAAY,CADZ,UAMF,CAOA,iBACE,aAAc,CACd,eACF,CAEA,eACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,qBACE,aAAc,CACd,yBACF,CAEA,4BACE,aAAc,CACd,eACF,CAEA,kBACE,eACF,CAEA,cAGE,kBAAmB,CACnB,iBAAkB,CAFlB,UAAW,CAGX,eAAgB,CAJhB,UAKF,CAEA,eAIE,kCAAmC,CAFnC,iDAAoD,CACpD,iBAAkB,CAFlB,WAIF,CAEA,oBACE,GAAK,OAAW,CAChB,GAAO,UAAa,CACtB,CAEA,cACE,aAAc,CAEd,iBAAkB,CADlB,eAEF,CAEA,cACE,eAAiB,CAEjB,kBAAmB,CACnB,+BAAsC,CACtC,eAAgB,CAHhB,YAIF,CAEA,iBACE,aAAc,CACd,kBACF,CAEA,kBAGE,aAAc,CACd,cAAe,CAFf,eAAgB,CADhB,oBAIF,CAEA,eAEE,QAAS,CACT,eAEF,CAEA,oBACE,QAAO,CACP,eACF,CAEA,kBAGE,kBAAmB,CAEnB,6BAA8B,CAD9B,iBAAkB,CAHlB,eAAgB,CAChB,YAIF,CAEA,qBACE,aAAc,CACd,kBACF,CAEA,gBACE,eAAiB,CAEjB,kBAAmB,CACnB,+BAAsC,CAFtC,YAGF,CAEA,mBACE,aAAc,CACd,kBACF,CAEA,kBACE,aAAc,CACd,kBACF,CAEA,aACE,kBACF,CAEA,WACE,aAAc,CACd,iBAAkB,CAClB,cACF,CAEA,eAEE,iBAAkB,CAClB,aAAc,CAFd,YAGF,CAEA,uBACE,kBAAmB,CAEnB,wBAAyB,CADzB,aAEF,CAEA,qBACE,kBAAmB,CAEnB,wBAAyB,CADzB,aAEF,CAEA,eAGE,oBAAiC,CACjC,iBAAkB,CAHlB,eAAgB,CAChB,YAGF,CAEA,kBACE,aAAc,CACd,iBACF,CAEA,gBACE,aACF,CAEA,mBACE,aAAc,CACd,kBACF,CAEA,cACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,aAGE,kBAAmB,CAEnB,kBAAmB,CAEnB,6BAA8B,CAD9B,iBAAkB,CALlB,YAAa,CACb,6BAA8B,CAE9B,YAIF,CAEA,aAEE,aAAc,CACd,QAAO,CAFP,eAGF,CAEA,eAGE,cACF,CAEA,4BAJE,iBAAkB,CADlB,eAWF,CANA,aACE,kBAAmB,CAInB,aAAc,CADd,eAEF,CAEA,aACE,aAAc,CACd,cACF,CAEA,oBACE,eACF,CAEA,uBACE,aAAc,CACd,kBACF,CAEA,gBAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,eAEE,kBAAmB,CAEnB,6BAA8B,CAD9B,iBAAkB,CAFlB,YAIF,CAEA,sBACE,aAAc,CACd,aAAc,CACd,iBACF,CAEA,sBACE,aAAc,CAEd,aAAc,CADd,eAAgB,CAEhB,iBACF,CAEA,yBACE,aAAc,CAEd,aAAc,CADd,cAAgB,CAEhB,iBACF,CAEA,yBACE,aAAc,CACd,eACF,CAEA,YAEE,aAAc,CACd,iBAAkB,CAClB,eAAgB,CAHhB,iBAIF,CAEA,4BACE,eAAiB,CAEjB,kBAAmB,CACnB,+BAAsC,CAFtC,YAGF,CAEA,+BACE,aAAc,CACd,kBACF,CAEA,8BACE,aAAc,CACd,kBACF,CAEA,mBACE,kBACF,CAEA,yBAIE,aAAc,CAHd,aAAc,CAEd,eAAiB,CADjB,iBAGF,CAEA,0BAME,eAAiB,CAFjB,qBAAsB,CACtB,iBAAkB,CAElB,cAAe,CACf,kBAAmB,CANnB,eAAgB,CAChB,gBAAiB,CAFjB,UAQF,CAEA,gBAUE,kBAAmB,CATnB,kDAAqD,CAErD,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CAGf,mBAAoB,CAFpB,cAAe,CACf,eAAgB,CAGhB,OAAQ,CAER,gBAAiB,CATjB,gBAAiB,CAQjB,uBAEF,CAEA,sBACE,kDAAqD,CAErD,8BAA6C,CAD7C,0BAEF,CAEA,yBACE,kBAAmB,CAGnB,eAAgB,CAFhB,kBAAmB,CACnB,cAEF,CAEA,gBAGE,kBAAmB,CAEnB,6BAA8B,CAD9B,iBAAkB,CAHlB,kBAAmB,CACnB,YAIF,CAEA,mBACE,aAAc,CACd,kBACF,CAEA,aACE,eACF,CAEA,gBACE,aAAc,CACd,kBACF,CAEA,aAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,YAIE,wBAAyB,CADzB,iBAAkB,CAElB,8BAAsC,CAJtC,YAAa,CAKb,8BACF,CAEA,kBACE,+BACF,CAEA,cAGE,kBAAmB,CAGnB,+BAAgC,CALhC,YAAa,CACb,6BAA8B,CAE9B,kBAAmB,CACnB,mBAEF,CAEA,qBACE,aAAc,CACd,eACF,CAEA,aACE,aAAc,CAEd,eACF,CAEA,eACE,kBACF,CAEA,iBAEE,aAAc,CACd,eAAiB,CAFjB,YAGF,CAEA,YACE,aAAc,CACd,eAAiB,CACjB,kBACF,CAEA,eACE,YAAa,CACb,QACF,CAEA,WAIE,kBAAmB,CAHnB,wBAAyB,CACzB,iBAAkB,CAClB,YAEF,CAEA,cAGE,eACF,CAEA,SAGE,aAAc,CACd,iBAAkB,CAFlB,iBAAkB,CADlB,iBAIF,CAEA,aAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,gBAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,kBACF,CAEA,WAGE,kBAAmB,CACnB,+BACF,CAEA,cACE,aAAc,CAEd,eAAgB,CADhB,kBAEF,CAEA,6CAIE,aAAc,CADd,YAEF,CAEA,uBAIE,kBAAmB,CACnB,iBAAkB,CAFlB,WAAY,CAIZ,aAAc,CADd,eAAgB,CAJhB,UAMF,CAEA,yBAIE,iBAAkB,CAFlB,WAAY,CACZ,yBAEF,CAEA,+BAGE,aAAc,CADd,eAEF,CAEA,eAEE,iBAAkB,CAElB,cAAgB,CADhB,eAAgB,CAFhB,eAIF,CAEA,mBACE,kBAAmB,CACnB,aACF,CAEA,sBACE,kBAAmB,CACnB,aACF,CAEA,oBACE,kBAAmB,CACnB,aACF,CAEA,iBAIE,kBAAmB,CACnB,iBAAkB,CAHlB,eAAgB,CAChB,YAAa,CAFb,iBAKF,CAEA,aACE,aAAc,CACd,cAAgB,CAChB,eACF,CAEA,eAGE,aAAc,CADd,iBAAkB,CADlB,iBAGF,CAEA,yBAKE,mBACE,YACF,CAEA,eAGE,sBAAuB,CADvB,eAAgB,CADhB,eAGF,CAEA,YAEE,kBAAmB,CADnB,eAEF,CAEA,aAEE,kBAAmB,CADnB,qBAEF,CAEA,SAEE,eAAgB,CADhB,UAEF,CAEA,UACE,qBACF,CAEA,sBACE,cACF,CAEA,eACE,qBACF,CAEA,oBACE,cACF,CAUA,6CACE,yBACF,CACF,CAGA,eASE,kBAAmB,CAHnB,oBAA8B,CAD9B,QAAS,CAET,YAAa,CACb,sBAAuB,CALvB,MAAO,CAFP,cAAe,CAGf,OAAQ,CAFR,KAAM,CAQN,YACF,CAEA,iBACE,eAAiB,CACjB,kBAAmB,CAMnB,gCAA0C,CAF1C,eAAgB,CAFhB,eAAgB,CAGhB,eAAgB,CAJhB,YAAa,CAEb,SAIF,CAEA,oBAEE,aAAc,CACd,eAAgB,CAFhB,eAGF,CAEA,mBACE,aAAc,CACd,kBACF,CAEA,eACE,kBACF,CAEA,eACE,wBAAyB,CACzB,iBAAkB,CAClB,kBAAmB,CACnB,uBACF,CAEA,qBACE,oBAAqB,CACrB,8BACF,CAEA,mBAEE,sBAAuB,CAEvB,cAAe,CAHf,YAAa,CAIb,QAAS,CAFT,YAGF,CAEA,wCACE,cAAiB,CACjB,oBACF,CAEA,kBACE,QACF,CAEA,eAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,iBACF,CAEA,sBACE,aAAc,CACd,eACF,CAEA,gBACE,kBAAmB,CAGnB,kBAAmB,CAFnB,aAAc,CAId,cAAgB,CADhB,eAAiB,CAFjB,gBAIF,CAEA,eACE,YAAa,CACb,QAAS,CACT,iBACF,CAEA,iBACE,aAAc,CACd,cACF,CAEA,qBACE,aAAc,CACd,cAAgB,CAChB,eACF,CAEA,gBACE,kBAAmB,CAKnB,6BAA8B,CAH9B,iBAAkB,CAElB,aAAc,CADd,eAAiB,CAFjB,gBAKF,CAEA,kBAME,4BAA6B,CAL7B,YAAa,CACb,QAAS,CACT,wBAAyB,CACzB,eAAgB,CAChB,gBAEF,CAEA,uBACE,eACF,CAEA,sBACE,kBAAmB,CACnB,kBACF,CAEA,yBACE,iBAEE,WAAY,CADZ,YAEF,CAEA,eAEE,sBAAuB,CADvB,qBAAsB,CAEtB,OACF,CAEA,eACE,qBAAsB,CACtB,OACF,CAEA,kBACE,6BACF,CACF,CAGA,mBAGE,kBAAmB,CAInB,kBAAmB,CAEnB,wBAAyB,CADzB,iBAAkB,CAPlB,YAAa,CAGb,cAAe,CAFf,QAAS,CAGT,kBAAmB,CACnB,YAIF,CAEA,cAIE,wBAAyB,CACzB,iBAAkB,CAJlB,QAAO,CAKP,cAAe,CAHf,iBAAkB,CAIlB,gCACF,CAEA,oBAEE,oBAAqB,CACrB,8BAA4C,CAF5C,YAGF,CAEA,iBAIE,eAAiB,CAFjB,wBAAyB,CACzB,iBAAkB,CAElB,cAAe,CACf,eAAgB,CALhB,iBAAkB,CAMlB,gCACF,CAEA,uBAEE,oBAAqB,CADrB,YAEF,CAEA,2BAEE,iBAAkB,CAElB,+BAAsC,CAItC,qBAAsB,CAHtB,eAAgB,CAFhB,eAAgB,CAIhB,eAAgB,CADhB,oBAGF,CAEA,2CACE,wBAA0B,CAC1B,oBACF,CAEA,cAEE,kBAAmB,CACnB,+BAAgC,CAEhC,aAAc,CADd,cAAe,CAEf,eAAgB,CALhB,iBAMF,CAEA,0BAEE,wBAAyB,CACzB,QAAS,CAET,cAAe,CADf,kBAAmB,CAHnB,oBAKF,CAEA,0CAEE,wBAA0B,CAD1B,oBAEF,CAGA,yBAME,qBAAsB,CADtB,cAAe,CAHf,eAKF,CAEA,qCAEE,oBAAqB,CACrB,8BACF,CAEA,aACE,wBAAyB,CAEzB,wBAAyB,CADzB,UAEF,CAEA,mBACE,wBAAyB,CACzB,oBACF,CAEA,eACE,wBAAyB,CAEzB,wBAAyB,CADzB,UAEF,CAEA,qBACE,wBAAyB,CACzB,oBACF,CAEA,6BACE,kBAAmB,CAMnB,WAAY,CALZ,UAAY,CAIZ,cAAe,CADf,eAAgB,CAFhB,iBAAkB,CAClB,eAAgB,CAIhB,kBACF,CAEA,yCAA4C,SAAY,CACxD,0CAA4C,SAAY,CACxD,0CAA4C,SAAY,CAExD,oFAA4C,SAAY,CACxD,0CAA4C,SAAY,CACxD,0CAA4C,SAAY,CAExD,6BAEE,+BAAgC,CAEhC,eAAgB,CAHhB,YAAa,CAIb,sBAAuB,CAFvB,qBAGF,CAEA,mCACE,wBACF,CAEA,eAIE,eAAgB,CAChB,sBAAuB,CAFvB,kBAGF,CAEA,gBAKE,cAAe,CAGf,kBACF,CAEA,WAEE,kBAAmB,CAInB,iBAAkB,CAHlB,aAAc,CAFd,iCAAqC,CAMrC,cAAe,CAHf,eAAgB,CAIhB,eAAgB,CAHhB,iBAIF,CAEA,YAEE,kBAAmB,CADnB,gBAEF,CAEA,aACE,aAAc,CAEd,eAAgB,CAChB,kBACF,CAEA,eAGE,cAAe,CADf,iBAKF,CAEA,iCARE,aAAc,CAId,eAAgB,CAChB,sBAAuB,CAFvB,kBAaF,CARA,kBAEE,cAAe,CACf,eAAgB,CAChB,WAIF,CAEA,cACE,iBAAkB,CAClB,kBACF,CAEA,WAKE,WAAY,CADZ,iBAAkB,CAElB,cAAe,CAJf,cAAe,CACf,YAAa,CAFb,gBAAiB,CAMjB,uBACF,CAEA,UACE,kBAAmB,CACnB,aACF,CAEA,gBACE,kBAAmB,CACnB,0BACF,CAEA,YACE,kBAAmB,CACnB,UACF,CAEA,kBACE,kBAAmB,CACnB,0BACF,CAEA,aAGE,aACF,CAEA,YAEE,aAAc,CADd,cAAe,CAEf,kBACF,CAEA,gBAEE,aAAc,CACd,eAAgB,CAFhB,eAGF,CAEA,eAEE,cAAe,CACf,eAAgB,CAFhB,eAGF,CAGA,kBAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,eACF,CAEA,WAQE,sBAAuB,CAPvB,eAAiB,CAKjB,wBAAyB,CAJzB,kBAAmB,CAEnB,+BAAsC,CAGtC,YAAa,CAEb,QAAS,CANT,YAAa,CAEb,iDAKF,CAEA,iBAEE,+BAAuC,CADvC,0BAEF,CAEA,wBACE,kDAA6D,CAC7D,UAAY,CACZ,kBACF,CAEA,0BACE,kDAA6D,CAC7D,UACF,CAEA,qBAEE,kBAAmB,CADnB,kBAEF,CAEA,WAGE,oBAAiC,CACjC,iBAAkB,CAClB,aAAc,CAJd,cAAe,CACf,WAIF,CAEA,wEAEE,gBACF,CAEA,cACE,QACF,CAEA,cAEE,cAAe,CACf,eAAgB,CAFhB,cAAiB,CAGjB,UACF,CAEA,YAIE,eAAgB,CADhB,cAEF,CAEA,kBACE,cACF,CAEA,mBACE,cACF,CAEA,kBACE,cAAe,CACf,eACF,CAEA,YACE,cAAe,CACf,UAEF,CAEA,iBACE,YAAa,CACb,qBAAsB,CACtB,OAAQ,CACR,eACF,CAEA,YAGE,kBAAmB,CAEnB,eAAiB,CACjB,iBAAkB,CALlB,YAAa,CAMb,cAAe,CALf,6BAA8B,CAE9B,gBAIF,CAEA,kBACE,kBAAmB,CAEnB,wBAAyB,CADzB,eAEF,CAOA,iBAIE,wBAA6B,CAA7B,wBAIF,CAQA,yBACE,mBAEE,mBAAoB,CADpB,qBAEF,CAEA,+BAEE,cAAe,CACf,UACF,CAEA,kBACE,yBACF,CAEA,6CAEE,kBACF,CAEA,0BACE,cACF,CAEA,0DAEE,eACF,CAGA,wKAIE,YACF,CAGA,yCAA4C,SAAY,CACxD,0CAA4C,SAAY,CACxD,0CAA4C,SAAY,CACxD,0CAA4C,SAAY,CACxD,0CAA4C,SAAY,CAC1D,CC1iDA,cAEE,aAAc,CADd,gBAAiB,CAEjB,YACF,CAEA,gBAIE,kBAAmB,CAInB,wBAAyB,CAFzB,iBAAkB,CAClB,kBAAmB,CAFnB,YAIF,CAEA,iBAEE,aAAc,CADd,cAEF,CAEA,gBAEE,aAAc,CADd,YAEF,CAEA,WACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,iBAIF,CAEA,iBACE,kBACF,CAGA,iBAIE,eAAiB,CAEjB,kBAAmB,CACnB,8BAAqC,CANrC,YAAa,CACb,6BAA8B,CAC9B,kBAAmB,CAKnB,eAAgB,CAHhB,YAIF,CAEA,MAGE,kBAAmB,CAGnB,iBAAkB,CAClB,cAAe,CALf,YAAa,CADb,QAAO,CAIP,YAAa,CAIb,eAAgB,CALhB,YAAa,CAIb,uBAEF,CAEA,aACE,kBAAmB,CACnB,UAAY,CACZ,qBACF,CAEA,uBACE,kBACF,CAEA,8BACE,kBACF,CAEA,aAEE,kBAAmB,CADnB,UAEF,CAEA,WACE,cAAe,CACf,iBACF,CAEA,WACE,QACF,CAEA,WAEE,cAAe,CADf,eAEF,CAEA,kBACE,cAAe,CACf,UACF,CAEA,YACE,cAAe,CACf,gBAAiB,CACjB,UACF,CAEA,yBACE,YACF,CAGA,cACE,eAAiB,CACjB,kBAAmB,CAEnB,8BAAqC,CACrC,gBAAiB,CAFjB,YAGF,CAGA,kBAEE,aAAc,CADd,eAEF,CAEA,gBAEE,kBAAmB,CADnB,iBAEF,CAEA,mBAEE,aAAc,CACd,cAAe,CAFf,eAGF,CAEA,kBACE,aAAc,CACd,QACF,CAEA,gBAEE,sBAAuB,CAEvB,eACF,CAEA,YAGE,eAAiB,CADjB,wBAAyB,CAGzB,iBAAkB,CADlB,aAAc,CAEd,cAAe,CALf,iBAAkB,CAMlB,uBACF,CAOA,qCACE,kBAAmB,CACnB,UACF,CAGA,gBAEE,aAAc,CADd,eAEF,CAEA,cACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,WAGE,aAAS,CAAT,QAAS,CADT,6BAEF,CAEA,YACE,YAAa,CACb,qBACF,CAEA,uBACE,gBACF,CAEA,2BAEE,kBAAmB,CADnB,kBAEF,CAEA,iCACE,gBAAiB,CACjB,UACF,CAEA,kBAGE,aAAc,CAFd,eAAiB,CACjB,iBAEF,CAEA,0DAIE,wBAAyB,CACzB,iBAAkB,CAClB,cAAe,CAHf,YAAa,CAIb,gCACF,CAEA,4EAGE,oBAAqB,CAErB,8BAA0C,CAD1C,YAEF,CAEA,YAGE,kBAAmB,CAEnB,WAAY,CACZ,iBAAkB,CAFlB,UAAY,CAKZ,cAAe,CAFf,cAAe,CACf,eAAiB,CAEjB,eAAgB,CARhB,YAAa,CASb,8BAAgC,CAVhC,UAWF,CAEA,kBACE,kBACF,CAEA,qBACE,kBAAmB,CACnB,kBACF,CAEA,eAME,aAAc,CAHd,YAIF,CAGA,mBAEE,aAAc,CADd,eAEF,CAEA,aAGE,aAAc,CADd,iBAAkB,CADlB,iBAGF,CAEA,kBAEE,kBAAmB,CAEnB,WAAY,CACZ,iBAAkB,CAFlB,UAAY,CAGZ,cAAe,CACf,eAAgB,CANhB,iBAOF,CAEA,eAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,yDAEF,CAEA,cACE,eAAiB,CACjB,wBAAyB,CACzB,iBAAkB,CAIlB,8BAAqC,CAFrC,cAAe,CADf,YAAa,CAEb,uBAEF,CAEA,oBAGE,oBAAqB,CADrB,8BAAsC,CADtC,0BAGF,CAEA,qBAGE,kBAEF,CAEA,wBAEE,aAAc,CADd,QAEF,CAEA,cAGE,UAGF,CAEA,qBAEE,aAAc,CACd,cAAe,CAFf,YAGF,CAEA,qBACE,eAAgB,CAChB,iBACF,CAEA,eACE,aAAc,CACd,cAAe,CACf,eACF,CAGA,gBAEE,aAAc,CADd,eAEF,CAEA,eACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,sBACE,kBAAmB,CAInB,wBAAyB,CAFzB,iBAAkB,CAClB,aAAc,CAFd,YAIF,CAEA,yBAEE,aAAc,CADd,eAEF,CAEA,WAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,WAGE,kBAAmB,CACnB,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CALlB,YAAa,CACb,6BAA8B,CAG9B,YAGF,CAEA,YAEE,aAAc,CADd,eAEF,CAEA,YACE,aAAc,CACd,eACF,CAGA,aAEE,aAAc,CADd,eAEF,CAEA,YACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,gBACE,kBAAmB,CAInB,wBAAyB,CAFzB,iBAAkB,CAClB,kBAAmB,CAFnB,YAIF,CAEA,eAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,kBACF,CAEA,eACE,YAAa,CACb,qBACF,CAEA,qBAGE,aAAc,CAFd,eAAiB,CACjB,iBAEF,CAEA,qBAEE,wBAAyB,CACzB,iBAAkB,CAFlB,YAGF,CAEA,gCACE,kBACF,CAEA,qBAEE,aAAc,CACd,cAAe,CAFf,cAGF,CAEA,cACE,YAAa,CACb,QAAS,CACT,sBAAuB,CACvB,eACF,CAEA,gBACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,aAAc,CAHd,YAIF,CAEA,mBAEE,aAAc,CADd,eAEF,CAEA,gBACE,YAAa,CACb,qBAAsB,CACtB,QACF,CAEA,gBACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,kBAGE,sBAAuB,CAFvB,YAAa,CACb,6BAA8B,CAE9B,kBACF,CAEA,cAGE,oBAAqB,CAFrB,YAAa,CACb,QAEF,CAEA,kBAGE,kBAAmB,CAFnB,YAAa,CACb,qBAAsB,CAEtB,OACF,CAEA,wBAEE,aAAc,CADd,cAAe,CAEf,eACF,CAEA,aAGE,wBAAyB,CACzB,iBAAkB,CAFlB,WAAY,CAGZ,iBAAkB,CAJlB,UAKF,CAEA,uBAEE,wBAAyB,CADzB,oBAEF,CAEA,mBAGE,wBAAyB,CACzB,iBAAkB,CAFlB,WAAY,CADZ,UAIF,CAEA,kBAEE,YAAa,CACb,qBAAsB,CACtB,QAAS,CAHT,eAIF,CAEA,WAGE,kBAAmB,CACnB,iBAAkB,CAClB,aAAc,CAHd,YAAa,CADb,iBAKF,CAEA,qBACE,kBAAmB,CACnB,aACF,CAGA,mBAEE,aAAc,CADd,gBAEF,CAEA,qBACE,kBAAmB,CAInB,wBAAyB,CAFzB,iBAAkB,CAClB,kBAAmB,CAFnB,YAIF,CAEA,oBAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,kBACF,CAEA,uBAEE,aAAc,CADd,QAEF,CAEA,sBACE,eAAgB,CAChB,WAAY,CACZ,aAAc,CACd,cAAe,CACf,cACF,CAEA,kBAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,yDAEF,CAEA,iBAOE,kBAAmB,CANnB,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,YAAa,CACb,6BAA8B,CAJ9B,YAMF,CAEA,iBACE,QACF,CAEA,wBACE,aACF,CAEA,mBAEE,aAAc,CACd,cAAe,CAFf,YAGF,CAEA,oBAKE,aAAc,CAJd,YAAa,CACb,qBAAsB,CAEtB,cAAe,CADf,OAGF,CAEA,oBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAIF,CAEA,0BACE,kBACF,CAEA,sBACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,kBAAmB,CAHnB,YAIF,CAEA,yBAEE,aAAc,CADd,eAEF,CAEA,eACE,YAAa,CACb,qBACF,CAEA,eACE,kBAAmB,CAKnB,wBAAyB,CAFzB,iBAAkB,CAFlB,aAAc,CACd,YAAa,CAEb,iBAEF,CAEA,SACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAClB,cAAe,CACf,eAAgB,CAHhB,iBAIF,CAEA,eACE,kBACF,CAEA,kBACE,kBAAmB,CACnB,kBACF,CAEA,gBACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,kBAAmB,CAHnB,YAIF,CAEA,mBAEE,aAAc,CADd,eAEF,CAEA,mBACE,kBACF,CAEA,sBAKE,+BAAgC,CAHhC,aAAc,CACd,cAAe,CAFf,eAAkB,CAGlB,kBAEF,CAEA,iBACE,YAAa,CACb,qBAAsB,CACtB,QACF,CAEA,cAGE,kBAAmB,CACnB,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CALlB,YAAa,CACb,6BAA8B,CAG9B,YAGF,CAEA,eAEE,YAAa,CADb,QAAO,CAEP,qBAAsB,CACtB,OACF,CAEA,sBACE,aACF,CAEA,oBACE,aAAc,CACd,cACF,CAEA,kBAEE,kBAAmB,CADnB,YAAa,CAEb,QACF,CAEA,gBAEE,aAAc,CACd,cAAe,CAFf,eAGF,CAEA,UACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAIF,CAEA,gBACE,kBACF,CAEA,YACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAIF,CAEA,kBACE,kBACF,CAGA,oBAEE,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAClB,YAAa,CAJb,UAKF,CAEA,UAKE,kBAAmB,CADnB,kBAEF,CAEA,uBAPE,YAAa,CACb,cAAe,CACf,QASF,CAEA,aAEE,kBAAmB,CADnB,YAAa,CAEb,OAAQ,CACR,eACF,CAEA,mBAEE,aAAc,CADd,cAAe,CAEf,cACF,CAEA,mBAGE,wBAAyB,CACzB,iBAAkB,CAHlB,QAAO,CAIP,cAAe,CAHf,eAIF,CAEA,kBAEE,aAAc,CADd,cAAe,CAEf,cACF,CAEA,cAKE,4BAA6B,CAJ7B,YAAa,CACb,QAAS,CACT,wBAAyB,CACzB,eAAgB,CAEhB,gBACF,CAEA,UACE,kBAAmB,CAInB,iBAAkB,CAElB,cAAe,CAHf,gBAIF,CAEA,gBACE,kBACF,CAEA,mBACE,kBAEF,CAEA,YAKE,iBAAkB,CADlB,gBAIF,CAEA,kBACE,kBACF,CAEA,mBACE,kBAAmB,CAEnB,iBAAkB,CAClB,eAAgB,CAFhB,YAGF,CAEA,cAGE,kBACF,CAEA,oBAGE,4BAA6B,CAD7B,aAAc,CADd,cAAe,CAIf,eAAgB,CADhB,gBAEF,CAGA,kBAEE,aAAc,CADd,gBAEF,CAEA,iBACE,kBAAmB,CAInB,wBAAyB,CAFzB,iBAAkB,CAClB,kBAAmB,CAFnB,YAIF,CAEA,oBAEE,aAAc,CADd,eAEF,CAEA,cAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,cACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,YAAa,CACb,6BAA8B,CAJ9B,YAKF,CAEA,qBACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,kBAAmB,CAHnB,YAIF,CAEA,oBAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,kBACF,CAEA,uBAEE,aAAc,CADd,QAEF,CAEA,eACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,iBAIF,CAEA,qBACE,kBACF,CAEA,wBACE,kBAAmB,CACnB,kBACF,CAEA,qBACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,uBACE,YAAa,CACb,qBAAsB,CACtB,QACF,CAEA,mBACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,sBAEE,aAAc,CADd,eAEF,CAEA,gBACE,YAAa,CACb,6BAA8B,CAC9B,iBAAkB,CAClB,aACF,CAEA,sBACE,4BAA6B,CAI7B,aAAc,CADd,cAAe,CADf,eAAgB,CADhB,gBAIF,CAEA,kBACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CAElB,kBAAmB,CAHnB,YAIF,CAEA,qBAEE,aAAc,CADd,eAEF,CAEA,eACE,kBAAmB,CAEnB,iBAAkB,CAClB,kBAAmB,CAFnB,YAGF,CAEA,cAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,eACE,YAAa,CACb,QAAS,CACT,sBAAuB,CACvB,kBACF,CAEA,kBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CACf,eAAiB,CAJjB,iBAKF,CAEA,wBACE,kBACF,CAEA,cACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CACf,eAAiB,CAJjB,iBAKF,CAEA,oBACE,kBACF,CAEA,gBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CACf,eAAiB,CAJjB,iBAKF,CAEA,sBACE,kBACF,CAEA,YACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,cAEE,aAEF,CAEA,aACE,eAAiB,CAGjB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,gBAEE,aAAc,CADd,eAEF,CAEA,aAEE,yDAEF,CAEA,YACE,kBAAmB,CAGnB,wBAAyB,CADzB,iBAAkB,CADlB,YAGF,CAEA,cAIE,kBACF,CAEA,UAEE,aAAc,CADd,eAEF,CAOA,YACE,kBACF,CAEA,cAGE,aAAc,CADd,cAAe,CADf,YAGF,CAEA,eAEE,YAAa,CAEb,cAAe,CADf,OAAQ,CAER,sBAAuB,CAJvB,iBAKF,CAEA,gBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAIF,CAEA,sBACE,kBACF,CAEA,kBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAIF,CAEA,wBACE,kBACF,CAEA,kBACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,gBAIF,CAEA,wBACE,kBACF,CAEA,2BAEE,kBAAmB,CADnB,UAEF,CAGA,yBACE,iBACE,qBAAsB,CACtB,QACF,CAEA,MACE,cACF,CAEA,YACE,YACF,CA0BA,iGACE,yBACF,CAEA,eACE,qBACF,CACF,CAGA,qBAGE,sBAAuB,CAFvB,YAAa,CACb,6BAA8B,CAE9B,kBACF,CAEA,gBAEE,kBAAmB,CADnB,YAAa,CAEb,QACF,CAEA,cACE,YAAa,CACb,OACF,CAEA,YASE,kBAAmB,CARnB,eAAgB,CAOhB,YAAa,CAFb,cAAe,CAMf,WAAY,CAFZ,sBAAuB,CAPvB,WAAY,CAIZ,uBAAyB,CAIzB,UAEF,CAEA,kBAEE,8BAAsC,CADtC,oBAEF,CAEA,UACE,kBAAmB,CACnB,aACF,CAEA,gBACE,kBACF,CAEA,YACE,kBAEF,CAEA,kBACE,kBACF,CAGA,cAGE,kBAAmB,CADnB,QAEF,CAEA,YACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,cAAe,CAHf,iBAAkB,CAIlB,oCACF,CAEA,kBACE,kBACF,CClzCA,gBAGE,aAAc,CADd,gBAAiB,CADjB,YAGF,CAEA,mBAGE,+BAAgC,CADhC,aAAc,CADd,kBAAmB,CAGnB,mBACF,CAEA,eACE,wBAAyB,CAGzB,iBAAkB,CAFlB,UAAY,CAIZ,iBACF,CAEA,uBAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,+BAAgC,CAEhC,0BACF,CAGA,cACE,kBAAmB,CAInB,wBAAyB,CAHzB,kBAAmB,CAEnB,eAAgB,CADhB,YAGF,CAEA,iBAME,+BAAgC,CAHhC,aAAc,CADd,kBAAmB,CADnB,YAAa,CAIb,mBAAoB,CADpB,iBAGF,CAEA,cACE,eAAiB,CACjB,wBAAyB,CACzB,iBAAkB,CAKlB,8BAAqC,CAFrC,cAAe,CADf,kBAAmB,CADnB,YAAa,CAGb,uBAEF,CAEA,oBACE,oBAAqB,CAErB,8BAAsC,CADtC,0BAEF,CAEA,uBAEE,kBAAmB,CADnB,oBAAqB,CAErB,+BACF,CAEA,gBAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,kBACF,CAEA,mBAEE,aAAc,CACd,cAAe,CAFf,QAGF,CAEA,cAEE,kBAAmB,CACnB,cAAe,CACf,eAAiB,CAHjB,eAAgB,CAIhB,wBACF,CAEA,qBAAuB,kBAAmB,CAAE,aAAgB,CAC5D,wBAA0B,kBAAmB,CAAE,aAAgB,CAC/D,sBAAwB,kBAAmB,CAAE,aAAgB,CAC7D,wBAA0B,kBAAmB,CAAE,aAAgB,CAE/D,mBAGE,aAAc,CADd,cAAe,CADf,YAGF,CAEA,eAME,4BAA6B,CAL7B,YAAa,CACb,cAAe,CACf,QAAS,CACT,eAAgB,CAChB,gBAEF,CAEA,oBACE,kBAAmB,CAEnB,kBAAmB,CAEnB,aAAc,CADd,cAAe,CAFf,eAIF,CAGA,uBACE,eAAiB,CAIjB,wBAAyB,CAHzB,kBAAmB,CAInB,8BAAqC,CAFrC,eAAgB,CADhB,YAIF,CAEA,0BAKE,+BAAgC,CAFhC,aAAc,CACd,cAAe,CAFf,kBAAmB,CADnB,YAAa,CAKb,mBACF,CAEA,0BAKE,+BAAgC,CAJhC,aAAc,CAGd,cAAe,CADf,kBAAmB,CADnB,eAAgB,CAIhB,kBACF,CAGA,YAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,kBACF,CAEA,WACE,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAClB,YAAa,CACb,iBAAkB,CAClB,uBACF,CAEA,qBACE,kBAAmB,CACnB,oBACF,CAEA,mBACE,kBAAmB,CACnB,oBACF,CAEA,aACE,cAAe,CACf,eAAiB,CACjB,iBACF,CAEA,YAEE,aAAc,CADd,eAAgB,CAGhB,iBAAkB,CADlB,yBAEF,CAEA,gBAEE,aAAc,CADd,cAEF,CAGA,eAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,kBACF,CAEA,eAOE,kBAAmB,CANnB,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAElB,YAAa,CACb,6BAA8B,CAF9B,YAIF,CAEA,qBAEE,aAAc,CADd,eAEF,CAEA,oBAEE,aAAc,CADd,eAEF,CAEA,gBACE,kBAAmB,CACnB,6BAA8B,CAG9B,yBAA0B,CAC1B,aAAc,CAFd,eAAgB,CADhB,YAIF,CAGA,aAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,kBACF,CAEA,YACE,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAElB,cAAe,CADf,YAAa,CAEb,uBACF,CAEA,kBACE,oBAAqB,CAErB,8BAA6C,CAD7C,0BAEF,CAEA,qBAEE,kBAAmB,CADnB,oBAAqB,CAErB,+BACF,CAEA,cAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,kBACF,CAEA,iBAEE,aAAc,CADd,QAEF,CAEA,iBAEE,kBAAmB,CACnB,cAAe,CACf,eAAiB,CAHjB,eAIF,CAEA,2BACE,kBAAmB,CACnB,aACF,CAEA,uBACE,kBAAmB,CACnB,aACF,CAEA,eACE,kBACF,CAEA,aAGE,kBAAmB,CAFnB,YAAa,CACb,6BAA8B,CAE9B,iBACF,CAEA,mBAEE,aAAc,CADd,eAEF,CAEA,cAGE,aAAc,CAFd,cAAe,CACf,eAEF,CAEA,kBAKE,aAAc,CAJd,YAAa,CACb,qBAAsB,CAEtB,cAAe,CADf,OAGF,CAEA,cACE,kBAAmB,CAEnB,iBAAkB,CAGlB,aAAc,CADd,cAAe,CADf,kBAAmB,CAFnB,gBAKF,CAEA,YAEE,aAAc,CADd,cAAe,CAEf,gBACF,CAGA,eACE,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAElB,eAAgB,CADhB,YAEF,CAEA,kBAEE,aAAc,CADd,YAEF,CAEA,kBAGE,+BAAgC,CAFhC,aAAc,CACd,kBAAmB,CAEnB,kBACF,CAEA,eAEE,wBAAyB,CAQzB,gBAAiB,CANjB,YAQF,CAEA,gCAbE,eAAiB,CAIjB,kBAiBF,CARA,iBAOE,wBAAyB,CAFzB,iBAAkB,CAClB,eAEF,CAEA,wCAIE,+BAAgC,CAFhC,YAAa,CACb,eAEF,CAEA,oBAGE,aACF,CAEA,kCACE,kBACF,CAEA,0BACE,kBACF,CAEA,iBAEE,aAAS,CADT,YAAa,CACb,QACF,CAEA,eACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,qBAEE,aAAc,CADd,eAEF,CAEA,oBACE,eAAiB,CACjB,wBAAyB,CACzB,iBAAkB,CAElB,aAAc,CADd,YAEF,CAEA,SAGE,aAAc,CACd,iBAAkB,CAFlB,YAAa,CADb,iBAIF,CAGA,0BACE,uBACE,yBAA0B,CAC1B,WACF,CAEA,cACE,YACF,CAEA,aACE,yBACF,CAMA,2BACE,mCACF,CACF,CAEA,yBACE,gBACE,YACF,CAEA,2BAEE,yBACF,CAEA,eACE,qBAAsB,CACtB,OACF,CAEA,cAEE,sBAAuB,CADvB,qBAAsB,CAEtB,QACF,CACF,CC1dA,uBAGE,aAAc,CADd,gBAAiB,CADjB,YAGF,CAEA,eACE,kBACF,CAEA,kBACE,aAAc,CACd,kBACF,CAEA,iBACE,aAAc,CACd,kBACF,CAEA,iBAGE,kBAAmB,CAFnB,YAAa,CAKb,cAAe,CADf,QAAS,CAHT,6BAA8B,CAE9B,kBAGF,CAEA,iBAGE,kBAAmB,CADnB,QAGF,CAEA,uBAEE,kBAAmB,CAEnB,eAAgB,CADhB,OAEF,CAEA,wBAIE,eAAiB,CAFjB,qBAAsB,CACtB,iBAAkB,CAElB,eAAgB,CAJhB,gBAKF,CAEA,aAEE,kBAAmB,CAEnB,WAAY,CACZ,iBAAkB,CAFlB,UAAY,CAGZ,cAAe,CACf,eAAgB,CANhB,iBAAkB,CAOlB,+BACF,CAEA,mBACE,kBACF,CAEA,gBACE,kBAAmB,CAEnB,iBAAkB,CAClB,kBAAmB,CAFnB,YAGF,CAEA,eAEE,QAAS,CACT,sBAEF,CAEA,WACE,iBACF,CAEA,YAEE,aAAc,CADd,aAAc,CAGd,iBACF,CAEA,YACE,aAAc,CAEd,eAEF,CAEA,wBACE,eAAiB,CACjB,iBAAkB,CAClB,8BAAwC,CACxC,eACF,CAEA,cAEE,wBAAyB,CADzB,UAEF,CAEA,iBACE,kBAAmB,CACnB,UAAY,CAIZ,cAAe,CADf,eAAgB,CAFhB,iBAAkB,CAClB,eAGF,CAEA,iBAEE,+BAAgC,CADhC,YAAa,CAEb,qBACF,CAEA,iBACE,kBACF,CAEA,wBACE,kBAAmB,CACnB,6BAA8B,CAC9B,uBACF,CAEA,8BACE,kBACF,CAOA,0BAJE,eAUF,CANA,YAEE,kBAAmB,CAGnB,oBAAqB,CAFrB,cAAe,CAFf,eAKF,CAEA,mBACE,kBAAmB,CACnB,aACF,CAEA,eACE,kBAAmB,CACnB,aACF,CAEA,aAEE,aAAc,CADd,eAEF,CAEA,SACE,aAAc,CACd,cACF,CAOA,oCAEE,WAAY,CACZ,iBAAkB,CAClB,cAAe,CACf,cAAe,CAJf,gBAAiB,CAKjB,+BACF,CAWA,cACE,kBAEF,CAEA,oBACE,kBACF,CAEA,YACE,kBAEF,CAEA,kBACE,kBACF,CAEA,aAGE,aAAc,CADd,iBAAkB,CADlB,iBAGF,CAEA,eACE,cAAe,CACf,QACF,CAEA,eAEE,iBAAkB,CADlB,iBAEF,CAEA,iBAME,iCAAkC,CAJlC,wBAA6B,CAC7B,iBAAkB,CADlB,wBAA6B,CAG7B,WAAY,CAEZ,kBAAmB,CAHnB,UAIF,CAEA,gBACE,GAAK,sBAAyB,CAC9B,GAAO,uBAA2B,CACpC,CAEA,eACE,kBAAmB,CAKnB,wBAAyB,CAJzB,aAAc,CAGd,kBAAmB,CAFnB,YAIF,CAGA,qBAQE,kBAAmB,CAFnB,oBAA8B,CAD9B,QAAS,CAET,YAAa,CAEb,sBAAuB,CANvB,MAAO,CAQP,YAAa,CAVb,cAAe,CAGf,OAAQ,CAFR,KAAM,CAQN,YAEF,CAEA,aACE,eAAiB,CACjB,iBAAkB,CAKlB,gCAA0C,CAF1C,eAAgB,CADhB,eAAgB,CAEhB,eAAgB,CAHhB,UAKF,CAEA,cAGE,kBAAmB,CAEnB,+BAAgC,CAJhC,YAAa,CACb,6BAA8B,CAE9B,iBAEF,CAEA,iBAEE,aAAc,CADd,QAEF,CAEA,WACE,eAAgB,CAChB,WAAY,CAKZ,iBAAkB,CAFlB,aAAc,CADd,cAAe,CADf,cAAe,CAGf,WAAY,CAEZ,+BACF,CAEA,iBACE,kBACF,CAEA,eACE,YACF,CAEA,YACE,kBAAmB,CAEnB,iBAAkB,CAClB,kBAAmB,CAFnB,YAGF,CAEA,UACE,YAAa,CACb,iBACF,CAEA,qBACE,eACF,CAEA,iBAEE,aAAc,CADd,eAEF,CAEA,eACE,aAAc,CACd,kBACF,CAEA,eACE,kBAAmB,CASnB,wBAAyB,CAPzB,iBAAkB,CAGlB,cAAe,CACf,eAAgB,CAHhB,oBAOF,CAEA,eAEE,4BAA6B,CAC7B,YAAa,CACb,QAAS,CACT,wBAAyB,CAJzB,iBAKF,CAEA,6BACE,kBACF,CAEA,mCACE,kBACF,CAEA,0BACE,kBAAmB,CAGnB,iBAAkB,CAFlB,UAAY,CACZ,iBAEF,CAEA,gCACE,kBACF,CAGA,yBACE,uBACE,YACF,CAEA,iBAEE,mBAAoB,CADpB,qBAEF,CAEA,iBACE,sBACF,CAEA,eACE,QACF,CAEA,wBACE,eACF,CAEA,cACE,eACF,CAEA,aACE,WAAY,CACZ,eACF,CAEA,eACE,YACF,CAEA,eAEE,qBAAsB,CADtB,YAEF,CACF,CAGA,gBACE,gBACF,CAEA,mBACE,kDAAqD,CACrD,UAAY,CAGZ,eAAgB,CAFhB,iBAAkB,CAClB,eAEF,CAEA,iCACE,kBAAmB,CAEnB,8BAAqC,CADrC,0BAEF,CAGA,WACE,WACF,CAEA,WACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,WAEE,aAAc,CADd,eAEF,CAEA,UAGE,kBAAmB,CAEnB,kBAAmB,CAHnB,aAAc,CADd,cAAe,CAGf,eAAgB,CAEhB,iBACF,CAEA,cACE,eACF,CAEA,cACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,cAEE,aAAc,CADd,eAEF,CAEA,cAGE,oBAAmC,CAEnC,kBAAmB,CAHnB,aAAc,CAId,oBAAqB,CALrB,cAAe,CAGf,eAAgB,CAGhB,yBAAkB,CAAlB,iBACF,CAEA,qBAEE,aAAc,CADd,cAAe,CAEf,iBACF,CAEA,eACE,eACF,CAEA,eACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,eAEE,aAAc,CADd,eAEF,CAEA,gCAGE,aAAc,CADd,cAEF,CAEA,mBACE,eACF,CAEA,mBACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,sCAME,oBAAmC,CAEnC,iBAAkB,CAHlB,aAAc,CADd,cAAe,CAGf,eAAgB,CAEhB,yBAAkB,CAAlB,iBACF,CAEA,gBACE,eACF,CAEA,gBACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,gBAGE,aAAc,CAFd,cAAe,CACf,eAEF,CAEA,qBACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,mBAEE,oBAAmC,CAGnC,iBAAkB,CAFlB,aAAc,CAFd,cAAe,CAGf,eAAgB,CAEhB,yBAAkB,CAAlB,iBACF,CAEA,iBAEE,aAAc,CADd,cAAe,CAEf,iBACF,CAEA,cACE,eACF,CAEA,cACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,aAGE,aAAc,CAFd,cAAe,CACf,eAEF,CAEA,2BAGE,aAAc,CADd,cAEF,CAEA,aAGE,iBAAkB,CAFlB,cAAe,CAIf,cAAe,CAHf,eAAgB,CAEhB,yBAAkB,CAAlB,iBAEF,CAEA,oBACE,oBAAoC,CACpC,aACF,CAEA,gBACE,oBAAmC,CACnC,aACF,CAEA,cACE,eACF,CAEA,iBACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,YAEE,WAAY,CACZ,iBAAkB,CAClB,cAAe,CACf,cAAe,CACf,eAAgB,CALhB,eAAgB,CAOhB,eAAgB,CADhB,kBAAoB,CAEpB,UACF,CAEA,UACE,kBAAmB,CACnB,UACF,CAEA,gBACE,kBAAmB,CACnB,qBACF,CAEA,SACE,kBAAmB,CACnB,UACF,CAEA,eACE,kBAAmB,CACnB,qBACF,CAEA,kBACE,kBAAmB,CACnB,UAAY,CACZ,gBACF,CAEA,wBACE,kBAAmB,CACnB,qBACF,CAEA,2BACE,kBAAmB,CACnB,kBAAmB,CACnB,cACF,CAEA,cACE,kBAAmB,CACnB,UACF,CAEA,oBACE,kBAAmB,CACnB,qBACF,CAEA,YACE,kBAAmB,CACnB,UACF,CAEA,kBACE,kBAAmB,CACnB,qBACF,CAGA,gBAEE,eAAgB,CADhB,eAAgB,CAEhB,UACF,CAEA,kBACE,kBAAmB,CACnB,iBAAkB,CAElB,kBAAmB,CADnB,YAEF,CAEA,qBAIE,+BAAgC,CAFhC,aAAc,CACd,cAAe,CAFf,eAAkB,CAIlB,kBACF,CAEA,WAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAEF,CAEA,WACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,sBACE,gBACF,CAEA,kBAEE,aAAc,CADd,cAAe,CAEf,eAAgB,CAChB,wBACF,CAEA,kBAEE,aAAc,CADd,cAAe,CAEf,eACF,CAEA,0BACE,YAAa,CACb,cAAe,CACf,OAAQ,CACR,cACF,CAEA,cACE,oBAAmC,CAGnC,kBAAmB,CAFnB,aAAc,CAGd,cAAe,CACf,eAAgB,CAHhB,eAIF,CAEA,mBACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,YAGE,kBAAmB,CAEnB,eAAiB,CAEjB,6BAA8B,CAD9B,iBAAkB,CALlB,YAAa,CACb,6BAA8B,CAE9B,gBAIF,CAEA,wBAEE,oBAAmC,CADnC,yBAEF,CAEA,aAGE,eACF,CAEA,0BAJE,aAAc,CADd,cASF,CAJA,aAEE,eAEF,CAEA,mBAEE,aAAc,CADd,cAEF,CAEA,oBACE,eAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAClB,eACF,CAEA,uBACE,kBAAmB,CACnB,UAAY,CACZ,QAAS,CACT,iBACF,CAEA,eAQE,kBAAmB,CAHnB,iCAAqC,CACrC,cAAe,CACf,eAAgB,CAHhB,QAAS,CAHT,gBAAiB,CACjB,eAAgB,CAChB,YAMF,CAGA,0BACE,gBACE,gBACF,CAEA,WACE,yBACF,CACF,CAEA,yBACE,gBACE,eACF,CAEA,gBAEE,eAAgB,CADhB,UAEF,CAEA,kBACE,YACF,CAEA,iBACE,kBAAmB,CACnB,cACF,CAEA,YACE,QAAO,CACP,cACF,CACF,CCt1BA,qBAKE,kBAAmB,CADnB,QAAS,CADT,cAAe,CAGf,gBAAiB,CALjB,SAAU,CACV,UAKF,CAEA,kBACE,eAAiB,CAEjB,+BAAgC,CAChC,eAAgB,CAFhB,YAGF,CAEA,qBAEE,aAAc,CACd,cAAe,CACf,eAAgB,CAHhB,cAIF,CAEA,oBAEE,UAAW,CACX,cAAe,CAFf,eAGF,CAEA,oBACE,YAAa,CACb,qBAAsB,CACtB,QACF,CAEA,iBAIE,eAAgB,CAHhB,YAAa,CACb,cAAe,CACf,QAEF,CAEA,uBACE,YAAa,CACb,qBAAsB,CACtB,OAAQ,CACR,eACF,CAEA,4BAEE,UAAW,CACX,cAAe,CAFf,eAGF,CAEA,+CAGE,qBAAsB,CACtB,iBAAkB,CAClB,cAAe,CAHf,gBAAiB,CAIjB,2BACF,CAEA,2DAGE,oBAAqB,CACrB,8BAA6C,CAF7C,YAGF,CAEA,cACE,eACF,CAEA,iBAGE,kBAAmB,CAFnB,YAAa,CACb,QAEF,CAEA,sBAGE,WAAY,CACZ,iBAAkB,CAElB,cAAe,CAEf,cAAe,CAHf,eAAgB,CAHhB,iBAAkB,CAKlB,kBAEF,CAEA,SACE,kBAAmB,CACnB,UACF,CAEA,eACE,kBAAmB,CACnB,0BACF,CAEA,aACE,kBAAmB,CAEnB,qBAAsB,CADtB,aAEF,CAEA,mBACE,kBACF,CAEA,sBAEE,kBAAmB,CADnB,UAEF,CAGA,mBAGE,kBAAmB,CACnB,wBAAyB,CACzB,iBAAkB,CAJlB,eAAgB,CAChB,YAIF,CAEA,sBAEE,aAAc,CACd,cAAe,CAFf,eAGF,CAEA,WAGE,aAAS,CAFT,YAAa,CAEb,QAAS,CADT,wDAA2D,CAE3D,kBACF,CAEA,mCAGE,qBAAsB,CACtB,iBAAkB,CAClB,cAAe,CAHf,iBAIF,CAEA,+CAGE,oBAAqB,CACrB,8BAA6C,CAF7C,YAGF,CAEA,cACE,YAAa,CACb,QACF,CAEA,UACE,kBAAmB,CAEnB,WAAY,CAEZ,iBAAkB,CAHlB,UAAY,CAIZ,cAAe,CACf,eAAgB,CAHhB,iBAAkB,CAIlB,kBACF,CAEA,+BACE,kBAAmB,CACnB,0BACF,CAEA,mBAEE,kBAAmB,CADnB,UAAY,CAEZ,cACF,CAGA,eACE,eAAgB,CAKhB,wBAAyB,CAFzB,iBAAkB,CAFlB,aAAc,CAKd,eAAgB,CAFhB,gBAAiB,CAFjB,iBAKF,CAGA,mBACE,eAAiB,CAEjB,+BAAgC,CADhC,iBAEF,CAEA,eACE,YAAa,CAEb,cAAe,CADf,QAEF,CAEA,WACE,YAAa,CACb,qBAAsB,CACtB,OACF,CAEA,YAEE,UAAW,CADX,cAAe,CAEf,eACF,CAEA,YAGE,aAAc,CAFd,cAAe,CACf,eAEF,CAGA,4BAIE,eAAiB,CACjB,UAAW,CAFX,iBAAkB,CADlB,iBAIF,CAEA,gCAEE,cAAe,CACf,YACF,CAGA,2BACE,eAAiB,CAEjB,eAAgB,CADhB,aAAc,CAEd,iBACF,CAEA,iBAEE,wBAAyB,CACzB,cAAe,CACf,kBAAmB,CAHnB,UAIF,CAEA,oBAME,+BAAgC,CADhC,aAAc,CADd,eAAgB,CAFhB,iBAAkB,CAClB,eAAgB,CAKhB,KAAM,CACN,UACF,CAGA,mDAZE,kBAAmB,CAMnB,uBAAgB,CAAhB,eAYF,CANA,+BAKE,+BAAsC,CAHtC,OAAQ,CACR,UAGF,CAEA,oBAEE,+BAAgC,CADhC,YAAa,CAEb,qBACF,CAGA,+BAGE,eAAiB,CACjB,+BAAsC,CAHtC,uBAAgB,CAAhB,eAAgB,CAChB,OAGF,CAMA,sDACE,kBACF,CAMA,sEACE,kBACF,CAMA,kFACE,kBACF,CAGA,gEACmC,SAAY,CAC/C,kEACmC,SAAY,CAC/C,kEACmC,QAAW,CAC9C,kEACmC,SAAY,CAC/C,kEACmC,SAAY,CAC/C,kEACmC,SAAY,CAC/C,kEAC+C,eAAgB,CAA5B,SAA8B,CAGjE,eAEE,aAAc,CADd,eAEF,CAEA,gBAGE,kBAAmB,CAEnB,kBAAmB,CADnB,aAAc,CAHd,oBAAqB,CAKrB,cAAe,CACf,eAAgB,CALhB,eAMF,CAEA,WACE,UAAW,CACX,cACF,CAEA,YAEE,aAAc,CACd,iCAAqC,CAFrC,eAGF,CAEA,eACE,UACF,CAEA,kBAIE,oBAAqB,CAHrB,UAAW,CACX,cAAe,CACf,eAEF,CAGA,SACE,YAAa,CACb,OAAQ,CACR,sBACF,CAEA,sDAIE,eAAgB,CAChB,WAAY,CAGZ,iBAAkB,CAFlB,cAAe,CAIf,cAAe,CAHf,WAAY,CAEZ,kBAEF,CAEA,gBACE,kBAAmB,CACnB,oBACF,CAEA,kBACE,kBAAmB,CACnB,oBACF,CAEA,qBACE,kBAAmB,CACnB,oBACF,CAEA,uBACE,kBAAmB,CACnB,oBACF,CAGA,yBAIE,qBAAsB,CACtB,iBAAkB,CAClB,cAAe,CAHf,eAAgB,CADhB,UAKF,CAEA,qCAGE,oBAAqB,CACrB,8BAA6C,CAF7C,YAGF,CAGA,0BACE,iBAEE,mBAAoB,CADpB,qBAEF,CAEA,uBACE,cACF,CAEA,eACE,QACF,CAEA,iBACE,cACF,CAEA,wCAEE,gBACF,CACF,CAEA,yBAKE,qCACE,YACF,CAEA,iBAEE,mBAAoB,CADpB,qBAEF,CAEA,WACE,yBACF,CAEA,2BACE,eACF,CAEA,iBACE,eACF,CACF","sources":["index.css","App.css","components/ProjectFlow.css","components/ProjectReview.css","components/CompletedQuotes.css","MaterialsList.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n\n/* Material suggestion feedback */\n.add-suggestion-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.3s ease;\n font-size: 14px;\n}\n\n.add-suggestion-btn:hover:not(:disabled) {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.add-suggestion-btn.added {\n background: #27ae60;\n animation: pulse 0.5s ease-out;\n}\n\n.add-suggestion-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n@keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n 100% { transform: scale(1); }\n}\n\n/* Historical data sections */\n.historical-section {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.historical-header {\n display: flex;\n justify-content: between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.historical-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.hide-historical-btn {\n background: none;\n border: none;\n color: #95a5a6;\n cursor: pointer;\n font-size: 16px;\n}\n\n.historical-summary {\n background: white;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 15px;\n border-left: 4px solid #3498db;\n}\n\n.avg-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n}\n\n.avg-stats span {\n background: #ecf0f1;\n padding: 8px 12px;\n border-radius: 20px;\n font-size: 14px;\n text-align: center;\n}\n\n.historical-projects {\n display: grid;\n gap: 15px;\n}\n\n.historical-project {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.project-info h5 {\n margin: 0 0 5px 0;\n color: #2c3e50;\n}\n\n.project-details {\n display: flex;\n gap: 15px;\n margin-top: 8px;\n}\n\n.project-details span {\n background: #f8f9fa;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 13px;\n color: #6c757d;\n}\n\n.apply-historical-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n white-space: nowrap;\n}\n\n.apply-historical-btn:hover {\n background: #138496;\n}\n\n.used-materials {\n margin-top: 10px;\n}\n\n.materials-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.add-all-materials-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 4px 12px;\n border-radius: 15px;\n cursor: pointer;\n font-size: 11px;\n transition: all 0.2s ease;\n}\n\n.add-all-materials-btn:hover {\n background: #218838;\n transform: translateY(-1px);\n}\n\n.materials-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.material-chip {\n display: inline-block;\n background: #e7f3ff;\n color: #0066cc;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n margin: 2px 5px 2px 0;\n border: none;\n cursor: default;\n}\n\n.material-chip.clickable {\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #b3d9ff;\n}\n\n.material-chip.clickable:hover {\n background: #cce7ff;\n color: #004499;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,102,204,0.2);\n}\n\n/* Project sorting and filtering */\n.projects-container {\n width: 100%;\n}\n\n.projects-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n padding: 15px 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.filter-controls, .sort-controls {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-controls label, .sort-controls label {\n font-weight: 500;\n color: #2c3e50;\n font-size: 14px;\n}\n\n.filter-select, .sort-select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 5px;\n background: white;\n font-size: 14px;\n min-width: 150px;\n}\n\n.sort-order-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 8px 12px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n transition: all 0.2s ease;\n}\n\n.sort-order-btn:hover {\n background: #2980b9;\n transform: scale(1.1);\n}\n\n@media (max-width: 768px) {\n .projects-controls {\n flex-direction: column;\n align-items: stretch;\n gap: 15px;\n }\n \n .filter-controls, .sort-controls {\n justify-content: space-between;\n }\n \n .filter-select, .sort-select {\n min-width: auto;\n flex: 1;\n }\n}\n","html, body {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n overflow-x: auto;\n width: 100%;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n/* Main content area */\n.main-content {\n width: 100%;\n}\n\n/* Materials mode - full width layout */\n.App.materials-mode {\n width: 100vw;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.App.materials-mode .header {\n width: 100vw;\n margin: 0;\n border-radius: 0;\n box-sizing: border-box;\n}\n\n.App.materials-mode .main-content {\n width: 100vw;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n/* Materials view should use full width */\n.materials-view {\n max-width: none !important;\n width: 100% !important;\n margin: 0 !important;\n padding: 20px !important;\n box-sizing: border-box;\n}\n\n.materials-view .upload-section,\n.materials-view .materials-section {\n max-width: none !important;\n width: 100% !important;\n box-sizing: border-box;\n}\n\n/* Ensure all containers within materials view are full width */\n.materials-view .upload-container,\n.materials-view .materials-header,\n.materials-view .filter-section,\n.materials-view .materials-list,\n.materials-view .materials-table-container {\n max-width: none !important;\n width: 100% !important;\n box-sizing: border-box;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n\n/* Enhanced Materials Section Styles */\n.search-and-filter {\n display: flex;\n gap: 15px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 20px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.search-input {\n flex: 1;\n min-width: 250px;\n padding: 12px 16px;\n border: 2px solid #e9ecef;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s ease;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);\n}\n\n.category-filter {\n padding: 12px 16px;\n border: 2px solid #e9ecef;\n border-radius: 6px;\n background: white;\n font-size: 14px;\n min-width: 200px;\n transition: border-color 0.2s ease;\n}\n\n.category-filter:focus {\n outline: none;\n border-color: #007bff;\n}\n\n.materials-table-container {\n background: white;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 20px;\n width: 100% !important;\n overflow-x: auto; /* Allow horizontal scrolling if needed */\n box-sizing: border-box;\n}\n\n.materials-view .materials-table-container {\n max-width: none !important;\n width: 100% !important;\n}\n\n.results-info {\n padding: 15px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e9ecef;\n font-size: 14px;\n color: #6c757d;\n font-weight: 500;\n}\n\n.materials-table.enhanced {\n width: 100% !important;\n border-collapse: collapse;\n margin: 0;\n table-layout: fixed;\n min-width: 100%;\n}\n\n.materials-view .materials-table.enhanced {\n width: 100% !important;\n min-width: 100% !important;\n}\n\n/* Edit mode styles for materials table */\n.edit-input, .edit-select {\n width: 100%;\n padding: 4px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n box-sizing: border-box;\n}\n\n.edit-input:focus, .edit-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n.btn-success {\n background-color: #28a745;\n color: white;\n border: 1px solid #28a745;\n}\n\n.btn-success:hover {\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-secondary {\n background-color: #6c757d;\n color: white;\n border: 1px solid #6c757d;\n}\n\n.btn-secondary:hover {\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.materials-table.enhanced th {\n background: #495057;\n color: white;\n padding: 15px 12px;\n text-align: left;\n font-weight: 600;\n font-size: 14px;\n border: none;\n white-space: nowrap;\n}\n\n.materials-table.enhanced th:nth-child(1) { width: 25%; } /* Materiale */\n.materials-table.enhanced th:nth-child(2) { width: 15%; } /* Kategori */\n.materials-table.enhanced th:nth-child(3) { width: 10%; } /* Enhed */\n.materials-table.enhanced th:nth-child(4) { width: 15%; } /* Pris */\n.materials-table.enhanced th:nth-child(5) { width: 15%; } /* Leverandør */\n.materials-table.enhanced th:nth-child(6) { width: 20%; } /* Beskrivelse */\n.materials-table.enhanced th:nth-child(7) { width: 10%; } /* Handlinger */\n\n.materials-table.enhanced td {\n padding: 12px;\n border-bottom: 1px solid #e9ecef;\n vertical-align: middle;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.materials-table.enhanced tr:hover {\n background-color: #f8f9fa;\n}\n\n.material-name {\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.category-badge {\n background: #e3f2fd;\n color: #1976d2;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n display: inline-block;\n white-space: nowrap;\n}\n\n.unit-cell {\n font-family: 'Courier New', monospace;\n background: #f8f9fa;\n color: #495057;\n font-weight: 500;\n text-align: center;\n border-radius: 4px;\n font-size: 12px;\n padding: 6px 8px;\n}\n\n.price-cell {\n text-align: right;\n padding-right: 16px;\n}\n\n.price-value {\n color: #28a745;\n font-size: 14px;\n font-weight: 700;\n white-space: nowrap;\n}\n\n.supplier-cell {\n color: #6c757d;\n font-style: italic;\n font-size: 13px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.description-cell {\n color: #6c757d;\n font-size: 12px;\n line-height: 1.3;\n max-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.actions-cell {\n text-align: center;\n white-space: nowrap;\n}\n\n.btn-small {\n padding: 6px 10px;\n font-size: 12px;\n margin: 0 2px;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-edit {\n background: #ffc107;\n color: #212529;\n}\n\n.btn-edit:hover {\n background: #e0a800;\n transform: translateY(-1px);\n}\n\n.btn-danger {\n background: #dc3545;\n color: white;\n}\n\n.btn-danger:hover {\n background: #c82333;\n transform: translateY(-1px);\n}\n\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-icon {\n font-size: 48px;\n display: block;\n margin-bottom: 20px;\n}\n\n.empty-state h4 {\n margin: 0 0 10px 0;\n color: #495057;\n font-weight: 600;\n}\n\n.empty-state p {\n margin: 0 0 20px 0;\n font-size: 14px;\n line-height: 1.5;\n}\n\n/* Enhanced OpenAI Usage Section Styles */\n.usage-stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-top: 30px;\n}\n\n.stat-card {\n background: white;\n border-radius: 12px;\n padding: 25px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n border: 1px solid #e9ecef;\n display: flex;\n align-items: flex-start;\n gap: 15px;\n}\n\n.stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n}\n\n.stat-card.primary-stat {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n grid-column: span 2;\n}\n\n.stat-card.secondary-stat {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n.stat-card.wide-stat {\n grid-column: span 2;\n background: #f8f9fa;\n}\n\n.stat-icon {\n font-size: 24px;\n padding: 8px;\n background: rgba(255,255,255,0.1);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.stat-card.primary-stat .stat-icon,\n.stat-card.secondary-stat .stat-icon {\n background: rgba(255,255,255,0.2);\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-card h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 600;\n opacity: 0.9;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 5px 0;\n line-height: 1.2;\n}\n\n.stat-value.large {\n font-size: 32px;\n}\n\n.stat-value.medium {\n font-size: 20px;\n}\n\n.stat-value.small {\n font-size: 14px;\n font-weight: 500;\n}\n\n.stat-label {\n font-size: 12px;\n opacity: 0.7;\n font-weight: 500;\n}\n\n.token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 10px;\n}\n\n.token-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.token-item.total {\n background: #e3f2fd;\n font-weight: 600;\n border: 2px solid #1976d2;\n}\n\n.loading-state {\n text-align: center;\n padding: 60px 20px;\n}\n\n.loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #007bff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n/* Responsive adjustments */\n@media (max-width: 768px) {\n .search-and-filter {\n flex-direction: column;\n align-items: stretch;\n }\n \n .search-input,\n .category-filter {\n min-width: auto;\n width: 100%;\n }\n \n .usage-stats-grid {\n grid-template-columns: 1fr;\n }\n \n .stat-card.primary-stat,\n .stat-card.wide-stat {\n grid-column: span 1;\n }\n \n .materials-table.enhanced {\n font-size: 11px;\n }\n \n .materials-table.enhanced th,\n .materials-table.enhanced td {\n padding: 8px 4px;\n }\n \n /* Hide less important columns on mobile */\n .materials-table.enhanced th:nth-child(5),\n .materials-table.enhanced td:nth-child(5), /* Leverandør */\n .materials-table.enhanced th:nth-child(6),\n .materials-table.enhanced td:nth-child(6) { /* Beskrivelse */\n display: none;\n }\n \n /* Adjust remaining column widths for mobile */\n .materials-table.enhanced th:nth-child(1) { width: 35%; } /* Materiale */\n .materials-table.enhanced th:nth-child(2) { width: 20%; } /* Kategori */\n .materials-table.enhanced th:nth-child(3) { width: 15%; } /* Enhed */\n .materials-table.enhanced th:nth-child(4) { width: 20%; } /* Pris */\n .materials-table.enhanced th:nth-child(7) { width: 10%; } /* Handlinger */\n}\n","/* Project Flow Styles */\n.project-flow {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #e9ecef;\n}\n\n.project-info h2 {\n margin: 0 0 5px 0;\n color: #2c3e50;\n}\n\n.project-info p {\n margin: 2px 0;\n color: #6c757d;\n}\n\n.reset-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 10px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.reset-btn:hover {\n background: #c82333;\n}\n\n/* Step Navigation */\n.step-navigation {\n display: flex;\n justify-content: space-between;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n overflow-x: auto;\n}\n\n.step {\n flex: 1;\n display: flex;\n align-items: center;\n padding: 15px;\n margin: 0 5px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.3s ease;\n min-width: 180px;\n}\n\n.step.active {\n background: #007bff;\n color: white;\n transform: scale(1.05);\n}\n\n.step.accessible:hover {\n background: #e9ecef;\n}\n\n.step.accessible.active:hover {\n background: #0056b3;\n}\n\n.step.locked {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.step-icon {\n font-size: 24px;\n margin-right: 10px;\n}\n\n.step-info {\n flex: 1;\n}\n\n.step-name {\n font-weight: bold;\n font-size: 16px;\n}\n\n.step-description {\n font-size: 12px;\n opacity: 0.8;\n}\n\n.step-arrow {\n font-size: 20px;\n margin-left: 10px;\n opacity: 0.5;\n}\n\n.step.active .step-arrow {\n display: none;\n}\n\n/* Content Area */\n.step-content {\n background: white;\n border-radius: 10px;\n padding: 30px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n min-height: 600px;\n}\n\n/* Project Creation Styles */\n.project-creation {\n max-width: 800px;\n margin: 0 auto;\n}\n\n.section-header {\n text-align: center;\n margin-bottom: 30px;\n}\n\n.section-header h3 {\n margin: 0 0 10px 0;\n color: #2c3e50;\n font-size: 28px;\n}\n\n.section-header p {\n color: #6c757d;\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n}\n\n.toggle-btn {\n padding: 10px 20px;\n border: 2px solid #007bff;\n background: white;\n color: #007bff;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.toggle-btn.active {\n background: #007bff;\n color: white;\n}\n\n.toggle-btn:hover {\n background: #007bff;\n color: white;\n}\n\n/* Form Styles */\n.form-container {\n max-width: 600px;\n margin: 0 auto;\n}\n\n.project-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n}\n\n.form-group {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.full-width {\n grid-column: 1 / -1;\n}\n\n.form-group.checkbox-group {\n flex-direction: row;\n align-items: center;\n}\n\n.form-group.checkbox-group input {\n margin-right: 8px;\n width: auto;\n}\n\n.form-group label {\n font-weight: bold;\n margin-bottom: 5px;\n color: #2c3e50;\n}\n\n.form-group input,\n.form-group select,\n.form-group textarea {\n padding: 12px;\n border: 1px solid #ced4da;\n border-radius: 5px;\n font-size: 14px;\n transition: border-color 0.3s ease;\n}\n\n.form-group input:focus,\n.form-group select:focus,\n.form-group textarea:focus {\n border-color: #007bff;\n outline: none;\n box-shadow: 0 0 0 2px rgba(0,123,255,0.25);\n}\n\n.submit-btn {\n width: 100%;\n padding: 15px;\n background: #28a745;\n color: white;\n border: none;\n border-radius: 5px;\n font-size: 16px;\n font-weight: bold;\n cursor: pointer;\n margin-top: 20px;\n transition: background 0.3s ease;\n}\n\n.submit-btn:hover {\n background: #218838;\n}\n\n.submit-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #f5c6cb;\n margin: 15px 0;\n}\n\n/* Existing Projects */\n.existing-projects {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.no-projects {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.create-first-btn {\n padding: 12px 24px;\n background: #007bff;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n margin-top: 20px;\n}\n\n.projects-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.project-card {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.project-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n border-color: #007bff;\n}\n\n.project-card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.project-card-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n color: white;\n font-size: 12px;\n font-weight: bold;\n}\n\n.project-card-body p {\n margin: 8px 0;\n color: #6c757d;\n font-size: 14px;\n}\n\n.project-card-footer {\n margin-top: 15px;\n text-align: center;\n}\n\n.continue-text {\n color: #007bff;\n font-size: 12px;\n font-weight: bold;\n}\n\n/* Geometry Input Styles */\n.geometry-input {\n max-width: 800px;\n margin: 0 auto;\n}\n\n.geometry-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.calculations-display {\n background: #e3f2fd;\n padding: 20px;\n border-radius: 8px;\n margin: 20px 0;\n border: 1px solid #bbdefb;\n}\n\n.calculations-display h4 {\n margin: 0 0 15px 0;\n color: #1976d2;\n}\n\n.calc-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n\n.calc-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #bbdefb;\n}\n\n.calc-label {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.calc-value {\n color: #1976d2;\n font-weight: bold;\n}\n\n/* Labor Input Styles */\n.labor-input {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.labor-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.labor-overview {\n background: #fff3cd;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #ffeaa7;\n}\n\n.overview-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n.overview-item {\n display: flex;\n flex-direction: column;\n}\n\n.overview-item label {\n font-weight: bold;\n margin-bottom: 5px;\n color: #2c3e50;\n}\n\n.overview-item input {\n padding: 10px;\n border: 1px solid #ced4da;\n border-radius: 5px;\n}\n\n.overview-item input.fixed-rate {\n background: #e9ecef;\n}\n\n.overview-item small {\n margin-top: 5px;\n color: #6c757d;\n font-size: 12px;\n}\n\n.calculations {\n display: flex;\n gap: 30px;\n justify-content: center;\n margin-top: 20px;\n}\n\n.work-breakdown {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin: 20px 0;\n}\n\n.work-breakdown h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.breakdown-list {\n display: flex;\n flex-direction: column;\n gap: 15px;\n}\n\n.breakdown-item {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.breakdown-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 10px;\n}\n\n.hours-inputs {\n display: flex;\n gap: 15px;\n align-items: flex-end;\n}\n\n.hour-input-group {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 5px;\n}\n\n.hour-input-group label {\n font-size: 12px;\n color: #6c757d;\n font-weight: 500;\n}\n\n.hours-input {\n width: 80px;\n padding: 5px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n text-align: center;\n}\n\n.hours-input.allocated {\n border-color: #28a745;\n background-color: #f8fff9;\n}\n\n.description-input {\n width: 100%;\n padding: 8px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n}\n\n.breakdown-totals {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.total-row {\n text-align: center;\n padding: 12px;\n background: #d4edda;\n border-radius: 5px;\n color: #155724;\n}\n\n.total-row.allocated {\n background: #d1ecf1;\n color: #0c5460;\n}\n\n/* Materials Manager Styles */\n.materials-manager {\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.suggestions-section {\n background: #d1ecf1;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #bee5eb;\n}\n\n.suggestions-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.suggestions-header h4 {\n margin: 0;\n color: #0c5460;\n}\n\n.hide-suggestions-btn {\n background: none;\n border: none;\n color: #0c5460;\n cursor: pointer;\n font-size: 16px;\n}\n\n.suggestions-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.suggestion-card {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #bee5eb;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.suggestion-info {\n flex: 1;\n}\n\n.suggestion-info strong {\n color: #2c3e50;\n}\n\n.suggestion-info p {\n margin: 5px 0;\n color: #6c757d;\n font-size: 14px;\n}\n\n.suggestion-details {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.add-suggestion-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 8px 12px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.add-suggestion-btn:hover {\n background: #218838;\n}\n\n.add-material-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.add-material-section h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.material-form {\n display: flex;\n flex-direction: column;\n}\n\n.total-display {\n background: #d4edda;\n color: #155724;\n padding: 15px;\n border-radius: 5px;\n text-align: center;\n border: 1px solid #c3e6cb;\n}\n\n.add-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n margin-top: 15px;\n}\n\n.add-btn:hover {\n background: #0056b3;\n}\n\n.add-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.materials-list {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 20px;\n}\n\n.materials-list h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.material-category {\n margin-bottom: 25px;\n}\n\n.material-category h5 {\n margin: 0 0 10px 0;\n color: #495057;\n font-size: 16px;\n padding-bottom: 5px;\n border-bottom: 1px solid #e9ecef;\n}\n\n.materials-table {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.material-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.material-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.material-info strong {\n color: #2c3e50;\n}\n\n.material-info span {\n color: #6c757d;\n font-size: 14px;\n}\n\n.material-actions {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.material-total {\n font-weight: bold;\n color: #28a745;\n font-size: 16px;\n}\n\n.edit-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 6px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.edit-btn:hover {\n background: #0056b3;\n}\n\n.remove-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 6px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.remove-btn:hover {\n background: #c82333;\n}\n\n/* Material Edit Form Styles */\n.material-edit-form {\n width: 100%;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 5px;\n padding: 15px;\n}\n\n.edit-row {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n margin-bottom: 15px;\n align-items: center;\n}\n\n.edit-inputs {\n display: flex;\n gap: 15px;\n flex-wrap: wrap;\n}\n\n.input-group {\n display: flex;\n align-items: center;\n gap: 5px;\n min-width: 150px;\n}\n\n.input-group label {\n font-size: 12px;\n color: #6c757d;\n min-width: 70px;\n}\n\n.input-group input {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n font-size: 14px;\n}\n\n.input-group span {\n font-size: 12px;\n color: #6c757d;\n min-width: 30px;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 10px;\n border-top: 1px solid #dee2e6;\n padding-top: 10px;\n}\n\n.save-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.save-btn:hover {\n background: #218838;\n}\n\n.save-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.cancel-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.cancel-btn:hover {\n background: #545b62;\n}\n\n.materials-summary {\n background: #e9ecef;\n padding: 20px;\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.summary-item {\n display: flex;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.summary-item.total {\n font-size: 18px;\n color: #28a745;\n border-top: 1px solid #ced4da;\n padding-top: 10px;\n margin-top: 15px;\n}\n\n/* Calculation View Styles */\n.calculation-view {\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.project-summary {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #e9ecef;\n}\n\n.project-summary h4 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n}\n\n.summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n\n.summary-item {\n background: white;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n display: flex;\n justify-content: space-between;\n}\n\n.calculation-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.calculation-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n}\n\n.calculation-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.calculate-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.calculate-btn:hover {\n background: #138496;\n}\n\n.calculate-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.calculation-results {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.calculation-breakdown {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.breakdown-section {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.breakdown-section h5 {\n margin: 0 0 10px 0;\n color: #495057;\n}\n\n.breakdown-item {\n display: flex;\n justify-content: space-between;\n margin-bottom: 8px;\n padding: 5px 0;\n}\n\n.breakdown-item.total {\n border-top: 2px solid #28a745;\n padding-top: 10px;\n margin-top: 10px;\n font-size: 18px;\n color: #28a745;\n}\n\n.quote-generation {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.quote-generation h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.quote-options {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 20px;\n}\n\n.options-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 15px;\n}\n\n.quote-buttons {\n display: flex;\n gap: 15px;\n justify-content: center;\n margin-bottom: 20px;\n}\n\n.static-quote-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.static-quote-btn:hover {\n background: #218838;\n}\n\n.ai-quote-btn {\n background: #6f42c1;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.ai-quote-btn:hover {\n background: #5a32a3;\n}\n\n.html-quote-btn {\n background: #fd7e14;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.html-quote-btn:hover {\n background: #e96500;\n}\n\n.quote-info {\n background: #d1ecf1;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #bee5eb;\n}\n\n.quote-info p {\n margin: 5px 0;\n color: #0c5460;\n font-size: 14px;\n}\n\n.quotes-list {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.quotes-list h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.quotes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.quote-card {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.quote-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.quote-id {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.quote-date {\n font-size: 12px;\n color: #6c757d;\n}\n\n.quote-info {\n margin-bottom: 15px;\n}\n\n.quote-info p {\n margin: 5px 0;\n font-size: 14px;\n color: #495057;\n}\n\n.quote-actions {\n text-align: center;\n display: flex;\n gap: 5px;\n flex-wrap: wrap;\n justify-content: center;\n}\n\n.view-quote-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.view-quote-btn:hover {\n background: #0056b3;\n}\n\n.pdf-download-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.pdf-download-btn:hover {\n background: #c82333;\n}\n\n.pdf-generate-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.pdf-generate-btn:hover {\n background: #545b62;\n}\n\n.pdf-generate-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .step-navigation {\n flex-direction: column;\n gap: 10px;\n }\n \n .step {\n min-width: auto;\n }\n \n .step-arrow {\n display: none;\n }\n \n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .overview-grid {\n grid-template-columns: 1fr;\n }\n \n .calc-grid {\n grid-template-columns: 1fr;\n }\n \n .summary-grid {\n grid-template-columns: 1fr;\n }\n \n .projects-grid {\n grid-template-columns: 1fr;\n }\n \n .suggestions-grid {\n grid-template-columns: 1fr;\n }\n \n .quotes-grid {\n grid-template-columns: 1fr;\n }\n \n .quote-buttons {\n flex-direction: column;\n }\n}\n\n/* Project Card Action Buttons */\n.project-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 15px;\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.card-actions {\n display: flex;\n gap: 5px;\n}\n\n.action-btn {\n background: none;\n border: none;\n padding: 5px;\n cursor: pointer;\n border-radius: 4px;\n font-size: 14px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.action-btn:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n}\n\n.edit-btn {\n background: #ffc107;\n color: #212529;\n}\n\n.edit-btn:hover {\n background: #e0a800;\n}\n\n.delete-btn {\n background: #dc3545;\n color: white;\n}\n\n.delete-btn:hover {\n background: #c82333;\n}\n\n/* Form Actions */\n.form-actions {\n display: flex;\n gap: 15px;\n align-items: center;\n}\n\n.cancel-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s ease;\n}\n\n.cancel-btn:hover {\n background: #5a6268;\n}\n","/* ProjectReview CSS */\n.project-review {\n padding: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.project-review h2 {\n margin-bottom: 20px;\n color: #2c3e50;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.error-message {\n background-color: #e74c3c;\n color: white;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.project-review-layout {\n display: grid;\n grid-template-columns: 400px 1fr;\n gap: 30px;\n height: calc(100vh - 200px);\n}\n\n/* Project List */\n.project-list {\n background: #f8f9fa;\n border-radius: 10px;\n padding: 20px;\n overflow-y: auto;\n border: 1px solid #dee2e6;\n}\n\n.project-list h3 {\n margin-top: 0;\n margin-bottom: 20px;\n color: #495057;\n text-align: center;\n padding-bottom: 10px;\n border-bottom: 1px solid #dee2e6;\n}\n\n.project-item {\n background: white;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 15px;\n margin-bottom: 15px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.project-item:hover {\n border-color: #3498db;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n}\n\n.project-item.selected {\n border-color: #27ae60;\n background: #e8f5e8;\n box-shadow: 0 4px 12px rgba(39, 174, 96, 0.2);\n}\n\n.project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.project-header h4 {\n margin: 0;\n color: #2c3e50;\n font-size: 16px;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n text-transform: uppercase;\n}\n\n.status-badge.active { background: #d4edda; color: #155724; }\n.status-badge.completed { background: #cce5ff; color: #004085; }\n.status-badge.pending { background: #fff3cd; color: #856404; }\n.status-badge.cancelled { background: #f8d7da; color: #721c24; }\n\n.project-details p {\n margin: 5px 0;\n font-size: 14px;\n color: #6c757d;\n}\n\n.project-stats {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid #e9ecef;\n}\n\n.project-stats span {\n background: #e9ecef;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 12px;\n color: #495057;\n}\n\n/* Project Details Panel */\n.project-details-panel {\n background: white;\n border-radius: 10px;\n padding: 25px;\n overflow-y: auto;\n border: 1px solid #dee2e6;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n\n.project-details-panel h3 {\n margin-top: 0;\n margin-bottom: 25px;\n color: #2c3e50;\n font-size: 24px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.project-details-panel h4 {\n color: #34495e;\n margin-top: 30px;\n margin-bottom: 15px;\n font-size: 18px;\n border-bottom: 1px solid #ecf0f1;\n padding-bottom: 8px;\n}\n\n/* Project Steps */\n.steps-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin-bottom: 25px;\n}\n\n.step-item {\n background: #f8f9fa;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 15px;\n text-align: center;\n transition: all 0.3s ease;\n}\n\n.step-item.completed {\n background: #d4edda;\n border-color: #c3e6cb;\n}\n\n.step-item.pending {\n background: #fff3cd;\n border-color: #ffeaa7;\n}\n\n.step-status {\n font-size: 18px;\n font-weight: bold;\n margin-bottom: 8px;\n}\n\n.step-title {\n font-weight: 600;\n color: #495057;\n text-transform: capitalize;\n margin-bottom: 5px;\n}\n\n.step-timestamp {\n font-size: 12px;\n color: #6c757d;\n}\n\n/* Geometry Section */\n.geometry-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin-bottom: 15px;\n}\n\n.geometry-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 6px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.geometry-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.geometry-item span {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.geometry-notes {\n background: #e3f2fd;\n border-left: 4px solid #2196f3;\n padding: 15px;\n margin-top: 15px;\n border-radius: 0 6px 6px 0;\n color: #1565c0;\n}\n\n/* Quotes Section */\n.quotes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n margin-bottom: 25px;\n}\n\n.quote-item {\n background: #f8f9fa;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.quote-item:hover {\n border-color: #3498db;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.2);\n}\n\n.quote-item.selected {\n border-color: #e74c3c;\n background: #fdf2f2;\n box-shadow: 0 4px 12px rgba(231, 76, 60, 0.2);\n}\n\n.quote-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.quote-header h5 {\n margin: 0;\n color: #2c3e50;\n}\n\n.delivery-status {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n}\n\n.delivery-status.delivered {\n background: #d4edda;\n color: #155724;\n}\n\n.delivery-status.draft {\n background: #fff3cd;\n color: #856404;\n}\n\n.quote-amounts {\n margin-bottom: 15px;\n}\n\n.amount-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.amount-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.total-amount {\n font-size: 18px;\n font-weight: bold;\n color: #27ae60;\n}\n\n.amount-breakdown {\n display: flex;\n flex-direction: column;\n gap: 5px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.quote-method {\n background: #e3f2fd;\n padding: 8px 12px;\n border-radius: 6px;\n margin-bottom: 10px;\n font-size: 14px;\n color: #1565c0;\n}\n\n.quote-date {\n font-size: 12px;\n color: #6c757d;\n text-align: right;\n}\n\n/* Quote Details */\n.quote-details {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 25px;\n margin-top: 25px;\n}\n\n.quote-details h4 {\n margin-top: 0;\n color: #e74c3c;\n}\n\n.quote-details h5 {\n color: #495057;\n margin-bottom: 10px;\n border-bottom: 1px solid #dee2e6;\n padding-bottom: 5px;\n}\n\n.quote-content {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n padding: 15px;\n margin-bottom: 20px;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.materials-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n background: white;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #dee2e6;\n}\n\n.materials-table th,\n.materials-table td {\n padding: 12px;\n text-align: left;\n border-bottom: 1px solid #e9ecef;\n}\n\n.materials-table th {\n background: #f8f9fa;\n font-weight: 600;\n color: #495057;\n}\n\n.materials-table tr:last-child td {\n border-bottom: none;\n}\n\n.materials-table tr:hover {\n background: #f8f9fa;\n}\n\n.quote-responses {\n display: grid;\n gap: 15px;\n}\n\n.response-item {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.response-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.response-item span {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n padding: 10px;\n color: #495057;\n}\n\n.loading {\n text-align: center;\n padding: 20px;\n color: #6c757d;\n font-style: italic;\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .project-review-layout {\n grid-template-columns: 1fr;\n height: auto;\n }\n \n .project-list {\n height: 400px;\n }\n \n .quotes-grid {\n grid-template-columns: 1fr;\n }\n \n .steps-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n \n .geometry-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .project-review {\n padding: 10px;\n }\n \n .steps-grid,\n .geometry-grid {\n grid-template-columns: 1fr;\n }\n \n .project-stats {\n flex-direction: column;\n gap: 5px;\n }\n \n .quote-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 10px;\n }\n}\n",".completed-quotes-view {\n padding: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.quotes-header {\n margin-bottom: 30px;\n}\n\n.quotes-header h2 {\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.quotes-header p {\n color: #7f8c8d;\n margin-bottom: 20px;\n}\n\n.quotes-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.filter-controls {\n display: flex;\n gap: 15px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-controls label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.filter-controls select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n min-width: 120px;\n}\n\n.refresh-btn {\n padding: 10px 16px;\n background: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n transition: background-color 0.2s;\n}\n\n.refresh-btn:hover {\n background: #2980b9;\n}\n\n.quotes-summary {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n}\n\n.summary-stats {\n display: flex;\n gap: 30px;\n justify-content: center;\n flex-wrap: wrap;\n}\n\n.stat-item {\n text-align: center;\n}\n\n.stat-label {\n display: block;\n color: #7f8c8d;\n font-size: 14px;\n margin-bottom: 5px;\n}\n\n.stat-value {\n display: block;\n font-size: 24px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.quotes-table-container {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n\n.quotes-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.quotes-table th {\n background: #34495e;\n color: white;\n padding: 15px 12px;\n text-align: left;\n font-weight: 600;\n font-size: 14px;\n}\n\n.quotes-table td {\n padding: 12px;\n border-bottom: 1px solid #ecf0f1;\n vertical-align: middle;\n}\n\n.quote-row:hover {\n background: #f8f9fa;\n}\n\n.quote-row.newest-quote {\n background: #e8f5e8;\n border-left: 4px solid #27ae60;\n transition: all 0.3s ease;\n}\n\n.quote-row.newest-quote:hover {\n background: #d5f4d5;\n}\n\n.project-name {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.quote-type {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n display: inline-block;\n}\n\n.quote-type.static {\n background: #e8f5e8;\n color: #27ae60;\n}\n\n.quote-type.ai {\n background: #e3f2fd;\n color: #2196f3;\n}\n\n.quote-total {\n font-weight: 600;\n color: #27ae60;\n}\n\n.ai-cost {\n color: #7f8c8d;\n font-size: 14px;\n}\n\n.actions {\n display: flex;\n gap: 8px;\n}\n\n.view-btn, .download-btn, .delete-btn {\n padding: 6px 10px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s;\n}\n\n.view-btn {\n background: #3498db;\n color: white;\n}\n\n.view-btn:hover {\n background: #2980b9;\n}\n\n.download-btn {\n background: #95a5a6;\n color: white;\n}\n\n.download-btn:hover {\n background: #7f8c8d;\n}\n\n.delete-btn {\n background: #e74c3c;\n color: white;\n}\n\n.delete-btn:hover {\n background: #c0392b;\n}\n\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: #7f8c8d;\n}\n\n.empty-state p {\n font-size: 18px;\n margin: 0;\n}\n\n.loading-state {\n text-align: center;\n padding: 60px 20px;\n}\n\n.loading-spinner {\n border: 3px solid #f3f3f3;\n border-top: 3px solid #3498db;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 15px;\n border-radius: 6px;\n margin-bottom: 20px;\n border: 1px solid #f5c6cb;\n}\n\n/* Quote Modal */\n.quote-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n}\n\n.quote-modal {\n background: white;\n border-radius: 8px;\n width: 100%;\n max-width: 800px;\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid #ecf0f1;\n}\n\n.modal-header h3 {\n margin: 0;\n color: #2c3e50;\n}\n\n.close-btn {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n color: #7f8c8d;\n padding: 5px;\n border-radius: 4px;\n transition: background-color 0.2s;\n}\n\n.close-btn:hover {\n background: #ecf0f1;\n}\n\n.modal-content {\n padding: 24px;\n}\n\n.quote-meta {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 6px;\n margin-bottom: 20px;\n}\n\n.meta-row {\n display: flex;\n margin-bottom: 8px;\n}\n\n.meta-row:last-child {\n margin-bottom: 0;\n}\n\n.meta-row strong {\n min-width: 120px;\n color: #34495e;\n}\n\n.quote-text h4 {\n color: #2c3e50;\n margin-bottom: 12px;\n}\n\n.quote-content {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 6px;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n max-height: 400px;\n overflow-y: auto;\n border: 1px solid #e9ecef;\n}\n\n.modal-actions {\n padding: 20px 24px;\n border-top: 1px solid #ecf0f1;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.modal-actions .download-btn {\n background: #27ae60;\n}\n\n.modal-actions .download-btn:hover {\n background: #229954;\n}\n\n.modal-actions .close-btn {\n background: #95a5a6;\n color: white;\n padding: 10px 16px;\n border-radius: 4px;\n}\n\n.modal-actions .close-btn:hover {\n background: #7f8c8d;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .completed-quotes-view {\n padding: 15px;\n }\n \n .quotes-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .filter-controls {\n justify-content: center;\n }\n \n .summary-stats {\n gap: 15px;\n }\n \n .quotes-table-container {\n overflow-x: auto;\n }\n \n .quotes-table {\n min-width: 700px;\n }\n \n .quote-modal {\n margin: 10px;\n max-height: 95vh;\n }\n \n .modal-content {\n padding: 16px;\n }\n \n .modal-actions {\n padding: 16px;\n flex-direction: column;\n }\n}\n\n/* Enhanced Table Styles */\n.enhanced-table {\n min-width: 1200px;\n}\n\n.enhanced-table th {\n background: linear-gradient(135deg, #2c3e50, #34495e);\n color: white;\n padding: 15px 10px;\n text-align: left;\n font-weight: 600;\n}\n\n.enhanced-table .quote-row:hover {\n background: #f8f9fa;\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n}\n\n/* Cell Styles */\n.date-cell {\n width: 120px;\n}\n\n.date-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.date-main {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.quote-id {\n font-size: 11px;\n color: #7f8c8d;\n background: #ecf0f1;\n padding: 2px 6px;\n border-radius: 10px;\n text-align: center;\n}\n\n.project-cell {\n min-width: 200px;\n}\n\n.project-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.project-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.project-type {\n font-size: 12px;\n color: #3498db;\n background: rgba(52, 152, 219, 0.1);\n padding: 2px 6px;\n border-radius: 10px;\n display: inline-block;\n width: fit-content;\n}\n\n.project-description {\n font-size: 11px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.customer-cell {\n min-width: 180px;\n}\n\n.customer-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.customer-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.customer-email,\n.customer-phone {\n font-size: 11px;\n color: #7f8c8d;\n}\n\n.measurements-cell {\n min-width: 140px;\n}\n\n.measurements-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.roof-type,\n.area,\n.work-hours,\n.workers {\n font-size: 12px;\n color: #2c3e50;\n background: rgba(46, 204, 113, 0.1);\n padding: 2px 6px;\n border-radius: 8px;\n width: fit-content;\n}\n\n.materials-cell {\n min-width: 120px;\n}\n\n.materials-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.material-count {\n font-size: 12px;\n font-weight: 600;\n color: #e67e22;\n}\n\n.material-categories {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.material-category {\n font-size: 10px;\n background: rgba(230, 126, 34, 0.1);\n color: #e67e22;\n padding: 1px 4px;\n border-radius: 6px;\n width: fit-content;\n}\n\n.more-categories {\n font-size: 10px;\n color: #95a5a6;\n font-style: italic;\n}\n\n.pricing-cell {\n min-width: 140px;\n}\n\n.pricing-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.total-price {\n font-size: 14px;\n font-weight: 700;\n color: #27ae60;\n}\n\n.labor-cost,\n.material-cost {\n font-size: 11px;\n color: #7f8c8d;\n}\n\n.quote-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 8px;\n width: fit-content;\n margin-top: 4px;\n}\n\n.quote-badge.static {\n background: rgba(149, 165, 166, 0.2);\n color: #95a5a6;\n}\n\n.quote-badge.ai {\n background: rgba(155, 89, 182, 0.2);\n color: #9b59b6;\n}\n\n.actions-cell {\n min-width: 160px;\n}\n\n.actions-buttons {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.action-btn {\n padding: 4px 8px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.2s;\n text-align: left;\n width: 100%;\n}\n\n.view-btn {\n background: #3498db;\n color: white;\n}\n\n.view-btn:hover {\n background: #2980b9;\n transform: scale(1.02);\n}\n\n.pdf-btn {\n background: #e74c3c;\n color: white;\n}\n\n.pdf-btn:hover {\n background: #c0392b;\n transform: scale(1.02);\n}\n\n.generate-pdf-btn {\n background: #9b59b6;\n color: white;\n font-size: 0.85rem;\n}\n\n.generate-pdf-btn:hover {\n background: #8e44ad;\n transform: scale(1.02);\n}\n\n.generate-pdf-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.download-btn {\n background: #27ae60;\n color: white;\n}\n\n.download-btn:hover {\n background: #229954;\n transform: scale(1.02);\n}\n\n.delete-btn {\n background: #e67e22;\n color: white;\n}\n\n.delete-btn:hover {\n background: #d35400;\n transform: scale(1.02);\n}\n\n/* Enhanced Modal Styles */\n.enhanced-modal {\n max-width: 900px;\n max-height: 90vh;\n width: 90vw;\n}\n\n.overview-section {\n background: #f8f9fa;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.overview-section h4 {\n margin: 0 0 12px 0;\n color: #2c3e50;\n font-size: 16px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 8px;\n}\n\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.info-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.info-item.full-width {\n grid-column: 1 / -1;\n}\n\n.info-item .label {\n font-size: 12px;\n color: #7f8c8d;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.info-item .value {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.material-categories-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 4px;\n}\n\n.category-tag {\n background: rgba(230, 126, 34, 0.1);\n color: #e67e22;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.pricing-breakdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.price-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.price-item.total-price {\n border-left-color: #27ae60;\n background: rgba(39, 174, 96, 0.05);\n}\n\n.price-label {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.price-value {\n font-size: 14px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.price-value.total {\n font-size: 18px;\n color: #27ae60;\n}\n\n.quote-text-section {\n background: #ffffff;\n border: 1px solid #ecf0f1;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.quote-text-section h4 {\n background: #34495e;\n color: white;\n margin: 0;\n padding: 12px 16px;\n}\n\n.quote-content {\n max-height: 400px;\n overflow-y: auto;\n padding: 16px;\n margin: 0;\n font-family: 'Courier New', monospace;\n font-size: 12px;\n line-height: 1.4;\n background: #fafafa;\n}\n\n/* Responsive adjustments for enhanced version */\n@media (max-width: 1200px) {\n .enhanced-table {\n min-width: 1000px;\n }\n \n .info-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 768px) {\n .enhanced-table {\n min-width: 800px;\n }\n \n .enhanced-modal {\n width: 95vw;\n max-height: 95vh;\n }\n \n .overview-section {\n padding: 12px;\n }\n \n .actions-buttons {\n flex-direction: row;\n flex-wrap: wrap;\n }\n \n .action-btn {\n flex: 1;\n min-width: 70px;\n }\n}\n","/* MaterialsList.css - Based on CompletedQuotes design patterns */\n\n.materials-list-view {\n padding: 0;\n width: 100%;\n max-width: 100%;\n margin: 0;\n background: #f8f9fa;\n min-height: 100vh;\n}\n\n.materials-header {\n background: white;\n padding: 24px;\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 0;\n}\n\n.materials-header h2 {\n margin: 0 0 8px 0;\n color: #2c3e50;\n font-size: 28px;\n font-weight: 600;\n}\n\n.materials-header p {\n margin: 0 0 24px 0;\n color: #666;\n font-size: 16px;\n}\n\n.materials-controls {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.filter-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: end;\n}\n\n.filter-controls label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 150px;\n}\n\n.filter-controls label span {\n font-weight: 500;\n color: #555;\n font-size: 14px;\n}\n\n.filter-controls input,\n.filter-controls select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s;\n}\n\n.filter-controls input:focus,\n.filter-controls select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.search-input {\n min-width: 250px;\n}\n\n.action-controls {\n display: flex;\n gap: 12px;\n align-items: center;\n}\n\n.add-btn,\n.refresh-btn {\n padding: 10px 16px;\n border: none;\n border-radius: 6px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 14px;\n}\n\n.add-btn {\n background: #27ae60;\n color: white;\n}\n\n.add-btn:hover {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.refresh-btn {\n background: #f1f2f6;\n color: #2c3e50;\n border: 1px solid #ddd;\n}\n\n.refresh-btn:hover {\n background: #e1e2e6;\n}\n\n.refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* New Material Form */\n.new-material-form {\n margin-top: 24px;\n padding: 20px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n}\n\n.new-material-form h4 {\n margin: 0 0 16px 0;\n color: #2c3e50;\n font-size: 18px;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.form-grid input,\n.form-grid select {\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.form-grid input:focus,\n.form-grid select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.form-actions {\n display: flex;\n gap: 12px;\n}\n\n.save-btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 10px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.save-btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.save-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n/* Error Message */\n.error-message {\n background: #fee;\n color: #c62828;\n padding: 12px 16px;\n border-radius: 6px;\n margin: 16px 24px;\n border: 1px solid #ffcdd2;\n font-weight: 500;\n}\n\n/* Summary Stats */\n.materials-summary {\n background: white;\n padding: 20px 24px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.summary-stats {\n display: flex;\n gap: 32px;\n flex-wrap: wrap;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Loading and Empty States */\n.loading-state,\n.empty-state {\n text-align: center;\n padding: 60px 24px;\n background: white;\n color: #666;\n}\n\n.loading-state p,\n.empty-state p {\n font-size: 18px;\n margin: 8px 0;\n}\n\n/* Materials Table */\n.materials-table-container {\n background: white;\n overflow: auto;\n border-radius: 0;\n position: relative;\n}\n\n.materials-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n table-layout: fixed;\n}\n\n.materials-table th {\n background: #f8f9fa;\n padding: 16px 12px;\n text-align: left;\n font-weight: 600;\n color: #2c3e50;\n border-bottom: 2px solid #e0e0e0;\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n/* Sticky actions column */\n.materials-table th:last-child {\n position: sticky;\n right: 0;\n z-index: 11;\n background: #f8f9fa;\n box-shadow: -2px 0 4px rgba(0,0,0,0.1);\n}\n\n.materials-table td {\n padding: 12px;\n border-bottom: 1px solid #f0f0f0;\n vertical-align: middle;\n}\n\n/* Sticky actions column for data cells */\n.materials-table td:last-child {\n position: sticky;\n right: 0;\n background: white;\n box-shadow: -2px 0 4px rgba(0,0,0,0.1);\n}\n\n.material-row:hover {\n background: #f8f9fa;\n}\n\n.material-row:hover td:last-child {\n background: #f8f9fa;\n}\n\n.material-row:nth-child(even) {\n background: #fafbfc;\n}\n\n.material-row:nth-child(even) td:last-child {\n background: #fafbfc;\n}\n\n.material-row:nth-child(even):hover {\n background: #f0f2f5;\n}\n\n.material-row:nth-child(even):hover td:last-child {\n background: #f0f2f5;\n}\n\n/* Column widths */\n.materials-table th:nth-child(1),\n.materials-table td:nth-child(1) { width: 22%; } /* Material name */\n.materials-table th:nth-child(2),\n.materials-table td:nth-child(2) { width: 12%; } /* Category */\n.materials-table th:nth-child(3),\n.materials-table td:nth-child(3) { width: 8%; } /* Unit */\n.materials-table th:nth-child(4),\n.materials-table td:nth-child(4) { width: 10%; } /* Price */\n.materials-table th:nth-child(5),\n.materials-table td:nth-child(5) { width: 15%; } /* Supplier */\n.materials-table th:nth-child(6),\n.materials-table td:nth-child(6) { width: 23%; } /* Description */\n.materials-table th:nth-child(7),\n.materials-table td:nth-child(7) { width: 10%; min-width: 120px; } /* Actions - sticky */\n\n/* Table Cell Styles */\n.material-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.category-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #e3f2fd;\n color: #1976d2;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.unit-cell {\n color: #666;\n font-size: 13px;\n}\n\n.price-cell {\n font-weight: 600;\n color: #27ae60;\n font-family: 'Courier New', monospace;\n}\n\n.supplier-cell {\n color: #666;\n}\n\n.description-cell {\n color: #666;\n font-size: 13px;\n max-width: 200px;\n word-wrap: break-word;\n}\n\n/* Actions */\n.actions {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n.edit-btn,\n.delete-btn,\n.save-edit-btn,\n.cancel-edit-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px;\n border-radius: 4px;\n transition: all 0.2s;\n font-size: 16px;\n}\n\n.edit-btn:hover {\n background: #e3f2fd;\n transform: scale(1.1);\n}\n\n.delete-btn:hover {\n background: #ffebee;\n transform: scale(1.1);\n}\n\n.save-edit-btn:hover {\n background: #e8f5e8;\n transform: scale(1.1);\n}\n\n.cancel-edit-btn:hover {\n background: #ffebee;\n transform: scale(1.1);\n}\n\n/* Edit Form Inputs */\n.edit-input,\n.edit-select {\n width: 100%;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 13px;\n}\n\n.edit-input:focus,\n.edit-select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .filter-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .filter-controls label {\n min-width: auto;\n }\n \n .summary-stats {\n gap: 16px;\n }\n \n .materials-table {\n font-size: 13px;\n }\n \n .materials-table th,\n .materials-table td {\n padding: 10px 8px;\n }\n}\n\n@media (max-width: 768px) {\n .materials-header {\n padding: 16px;\n }\n \n .materials-summary {\n padding: 16px;\n }\n \n .action-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .materials-table-container {\n overflow-x: auto;\n }\n \n .materials-table {\n min-width: 800px;\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/css/main.b7c98a27.css b/build/static/css/main.b7c98a27.css new file mode 100644 index 0000000..4413774 --- /dev/null +++ b/build/static/css/main.b7c98a27.css @@ -0,0 +1,2 @@ +body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}.add-suggestion-btn{background:#3498db;padding:8px 16px;transition:all .3s ease}.add-suggestion-btn:hover:not(:disabled){background:#2980b9;transform:translateY(-1px)}.add-suggestion-btn.added{animation:pulse .5s ease-out;background:#27ae60}.add-suggestion-btn:disabled{cursor:not-allowed;opacity:.7}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.05)}to{transform:scale(1)}}.historical-section{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:20px;padding:20px}.historical-header{align-items:center;display:flex;justify-content:between;margin-bottom:15px}.historical-header h4{color:#2c3e50;margin:0}.hide-historical-btn{background:none;border:none;color:#95a5a6;cursor:pointer;font-size:16px}.historical-summary{background:#fff;border-left:4px solid #3498db;border-radius:5px;margin-bottom:15px;padding:15px}.avg-stats{grid-gap:10px;display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.avg-stats span{background:#ecf0f1;border-radius:20px;font-size:14px;padding:8px 12px;text-align:center}.historical-projects{grid-gap:15px;display:grid;gap:15px}.historical-project{align-items:center;background:#fff;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.project-info h5{color:#2c3e50;margin:0 0 5px}.project-details{display:flex;gap:15px;margin-top:8px}.project-details span{background:#f8f9fa;border-radius:12px;color:#6c757d;font-size:13px;padding:4px 8px}.apply-historical-btn{background:#17a2b8;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 16px;white-space:nowrap}.apply-historical-btn:hover{background:#138496}.used-materials{margin-top:10px}.materials-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.add-all-materials-btn{background:#28a745;border:none;border-radius:15px;color:#fff;cursor:pointer;font-size:11px;padding:4px 12px;transition:all .2s ease}.add-all-materials-btn:hover{background:#218838;transform:translateY(-1px)}.materials-chips{display:flex;flex-wrap:wrap;gap:4px}.material-chip{background:#e7f3ff;border:none;border-radius:12px;color:#06c;cursor:default;display:inline-block;font-size:12px;margin:2px 5px 2px 0;padding:2px 8px}.material-chip.clickable{border:1px solid #b3d9ff;cursor:pointer;transition:all .2s ease}.material-chip.clickable:hover{background:#cce7ff;box-shadow:0 2px 4px #06c3;color:#049;transform:translateY(-1px)}.projects-container{width:100%}.projects-controls{align-items:center;background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;margin-bottom:20px;padding:15px 20px}.filter-controls,.sort-controls{align-items:center;display:flex;gap:10px}.filter-controls label,.sort-controls label{color:#2c3e50;font-size:14px;font-weight:500}.filter-select,.sort-select{background:#fff;border:1px solid #ddd;border-radius:5px;font-size:14px;min-width:150px;padding:8px 12px}.sort-order-btn{background:#3498db;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:8px 12px;transition:all .2s ease}.sort-order-btn:hover{background:#2980b9;transform:scale(1.1)}@media (max-width:768px){.projects-controls{align-items:stretch;flex-direction:column;gap:15px}.filter-controls,.sort-controls{justify-content:space-between}.filter-select,.sort-select{flex:1 1;min-width:auto}}body,html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0;overflow-x:auto;padding:0;width:100%}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.container{margin:0 auto;max-width:1200px;padding:20px}.main-content{width:100%}.App.materials-mode{box-sizing:border-box;margin:0;padding:0;width:100vw}.App.materials-mode .header{border-radius:0;box-sizing:border-box;margin:0;width:100vw}.App.materials-mode .main-content{box-sizing:border-box;margin:0;padding:0;width:100vw}.materials-view{margin:0!important;padding:20px!important}.materials-view,.materials-view .filter-section,.materials-view .materials-header,.materials-view .materials-list,.materials-view .materials-section,.materials-view .materials-table-container,.materials-view .upload-container,.materials-view .upload-section{box-sizing:border-box;max-width:none!important;width:100%!important}.header{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-bottom:40px;padding:20px;position:relative;text-align:center}.header h1{color:#2c3e50;font-size:2.5em;margin:0 0 10px}.header p{color:#7f8c8d;font-size:1.1em;margin:0}.ai-budget-bar{background:#ecf0f1;border-radius:20px;font-size:.85em;gap:8px;padding:8px 16px;position:absolute;right:20px;top:10px}.ai-budget-bar,.budget-summary{align-items:center;display:flex}.budget-summary{font-weight:500;gap:6px}.budget-label{color:#34495e}.budget-used{color:#27ae60;font-weight:700}.budget-separator{color:#bdc3c7}.budget-total{color:#34495e;font-weight:700}.budget-mini-bar{background:#ecf0f1;border-radius:2px;height:4px;overflow:hidden;width:60px}.budget-mini-fill{height:100%;transition:width .3s ease}.budget-tokens{color:#7f8c8d;font-size:.9em}.budget-refresh-btn{background:none;border:none;border-radius:3px;cursor:pointer;font-size:1em;padding:2px;transition:background-color .2s}.budget-refresh-btn:hover{background-color:#bdc3c7}.nav-buttons{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin:20px 0}.nav-btn{background:#3498db;border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:.95em;font-weight:500;padding:12px 20px;transition:all .3s ease}.nav-btn:hover{background:#2980b9;transform:translateY(-1px)}.nav-btn.active{background:#27ae60}.logout-btn{background:#e74c3c;border:none;border-radius:4px;color:#fff;cursor:pointer;font-weight:500;left:20px;padding:8px 16px;position:absolute;top:20px}.logout-btn:hover{background:#c0392b}.login-form{background:#fff;border-radius:10px;box-shadow:0 4px 20px #0000001a;margin:0 auto;max-width:400px;padding:40px}.login-form h2{color:#2c3e50;margin-bottom:10px;text-align:center}.login-form p{color:#7f8c8d;margin-bottom:30px;text-align:center}.form-group{margin-bottom:20px}.form-group label{color:#34495e;display:block;font-weight:500;margin-bottom:8px}.form-group input,.form-group select,.form-group textarea{border:2px solid #ecf0f1;border-radius:6px;box-sizing:border-box;font-size:16px;width:100%}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:#3498db}.form-group textarea{min-height:100px;resize:vertical}.form-row{display:flex;flex-wrap:wrap;gap:20px}.form-row .form-group{flex:1 1;min-width:250px}.btn{background:#27ae60;border:none;border-radius:6px;color:#fff;cursor:pointer;font-size:16px;font-weight:500;padding:14px 28px;transition:all .3s ease;width:100%}.btn:hover:not(:disabled){background:#229954;transform:translateY(-1px)}.btn:disabled{background:#bdc3c7;cursor:not-allowed;transform:none}.btn.btn-secondary{background:#95a5a6}.btn.btn-secondary:hover:not(:disabled){background:#7f8c8d}.btn.btn-small{font-size:14px;padding:6px 12px;width:auto}.btn.btn-primary{background:#3498db}.btn.btn-primary:hover:not(:disabled){background:#2980b9}.btn.btn-danger{background:#e74c3c}.btn.btn-danger:hover:not(:disabled){background:#c0392b}.error{background:#f8d7da;border:1px solid #f5c6cb;border-radius:6px;color:#721c24;margin:20px 0;padding:12px}.quote-form{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-bottom:30px;padding:30px}.quote-form h2{color:#2c3e50;margin-bottom:20px;text-align:center}.loading{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:50px 20px}.loading-animation{align-items:center;display:flex;flex-direction:column;gap:20px}.loading-spinner{border:5px solid #ecf0f1;height:50px;width:50px}.loading-text h3{color:#2c3e50;margin:0 0 15px}.loading-steps{display:flex;flex-direction:column;gap:8px}.loading-steps .step{color:#bdc3c7;transition:color .3s ease}.loading-steps .step.active{color:#27ae60;font-weight:500}.loading-progress{margin-top:30px}.progress-bar{background:#ecf0f1;border-radius:3px;height:6px;overflow:hidden;width:100%}.progress-fill{animation:progress 20s ease-in-out;background:linear-gradient(90deg,#3498db,#27ae60);border-radius:3px;height:100%}@keyframes progress{0%{width:0}to{width:100%}}.loading-time{color:#7f8c8d;font-style:italic;margin-top:10px}.quote-result{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;margin-top:30px;padding:30px}.quote-result h2{color:#27ae60;margin-bottom:20px}.quote-result div{color:#2c3e50;font-size:15px;line-height:1.6;white-space:pre-line}.quote-actions{gap:15px;margin-top:30px}.quote-actions .btn{flex:1 1;min-width:200px}.feedback-section{background:#f8f9fa;border-left:4px solid #3498db;border-radius:8px;margin-top:30px;padding:25px}.feedback-section h3{color:#2c3e50;margin-bottom:15px}.upload-section{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:30px}.upload-section h2{color:#2c3e50;margin-bottom:15px}.upload-section p{color:#7f8c8d;margin-bottom:25px}.upload-form{margin-bottom:30px}.file-info{color:#27ae60;font-style:italic;margin-top:8px}.upload-status{border-radius:6px;margin:20px 0;padding:15px}.upload-status.success{background:#d4edda;border:1px solid #c3e6cb;color:#155724}.upload-status.error{background:#f8d7da;border:1px solid #f5c6cb;color:#721c24}.parse-results{background:#ffffff80;border-radius:4px;margin-top:15px;padding:15px}.parse-results ul{margin:10px 0;padding-left:20px}.recent-uploads{margin:30px 0}.recent-uploads h3{color:#2c3e50;margin-bottom:15px}.uploads-list{display:flex;flex-direction:column;gap:8px}.upload-item{align-items:center;background:#f8f9fa;border-left:4px solid #3498db;border-radius:6px;display:flex;justify-content:space-between;padding:12px}.upload-name{color:#2c3e50;flex:1 1;font-weight:500}.upload-status{font-size:.9em}.upload-status,.upload-type{border-radius:4px;padding:4px 8px}.upload-type{background:#ecf0f1;color:#34495e;font-size:.85em}.upload-date{color:#7f8c8d;font-size:.9em}.materials-overview{margin-top:30px}.materials-overview h3{color:#2c3e50;margin-bottom:15px}.materials-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.material-item{background:#f8f9fa;border-left:4px solid #27ae60;border-radius:8px;padding:15px}.material-item strong{color:#2c3e50;display:block;margin-bottom:8px}.material-item .price{color:#27ae60;display:block;font-weight:500;margin-bottom:4px}.material-item .category{color:#3498db;display:block;font-size:.9em;margin-bottom:4px}.material-item .supplier{color:#7f8c8d;font-size:.85em}.more-items{color:#7f8c8d;font-style:italic;margin-top:15px;text-align:center}.pricing-management-section{background:#fff;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:30px}.pricing-management-section h2{color:#2c3e50;margin-bottom:15px}.pricing-management-section p{color:#7f8c8d;margin-bottom:25px}.category-selector{margin-bottom:20px}.category-selector label{color:#2c3e50;display:block;font-weight:700;margin-bottom:5px}.category-selector select{background:#fff;border:1px solid #ddd;border-radius:4px;font-size:14px;margin-bottom:10px;max-width:300px;padding:8px 12px;width:100%}.web-search-btn{align-items:center;background:linear-gradient(135deg,#3498db,#2980b9);border:none;border-radius:6px;color:#fff;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;gap:5px;margin-left:10px;padding:8px 16px;transition:all .3s ease}.web-search-btn:hover{background:linear-gradient(135deg,#2980b9,#3498db);box-shadow:0 4px 8px #3498db4d;transform:translateY(-1px)}.web-search-btn:disabled{background:#bdc3c7;box-shadow:none;cursor:not-allowed;transform:none}.add-price-form{background:#f8f9fa;border-left:4px solid #27ae60;border-radius:8px;margin-bottom:40px;padding:25px}.add-price-form h3{color:#2c3e50;margin-bottom:20px}.prices-list{margin-top:30px}.prices-list h3{color:#2c3e50;margin-bottom:20px}.prices-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.price-item{border:1px solid #ecf0f1;border-radius:8px;box-shadow:0 2px 5px #0000000d;padding:20px;transition:box-shadow .3s ease}.price-item:hover{box-shadow:0 4px 15px #0000001a}.price-header{align-items:center;border-bottom:2px solid #ecf0f1;display:flex;justify-content:space-between;margin-bottom:15px;padding-bottom:10px}.price-header strong{color:#2c3e50;font-size:1.1em}.price-value{color:#27ae60;font-size:1.1em}.price-details{margin-bottom:15px}.price-details p{color:#34495e;font-size:.95em;margin:5px 0}.price-date{color:#7f8c8d;font-size:.85em;margin-bottom:15px}.price-actions{display:flex;gap:10px}.edit-form{background:#f8f9fa;border:2px solid #3498db;border-radius:8px;padding:15px}.edit-actions{margin-top:15px}.no-data{color:#7f8c8d;font-style:italic;padding:40px 20px;text-align:center}.usage-stats{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.usage-overview{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));margin-bottom:30px}.stat-card{border-radius:10px;box-shadow:0 2px 10px #0000001a}.stat-card h3{color:#2c3e50;font-size:1.2em;margin-bottom:15px}.budget-info p,.general-info p,.token-info p{color:#34495e;margin:8px 0}.budget-bar,.token-bar{background:#ecf0f1;border-radius:6px;height:12px;margin:10px 0;overflow:hidden;width:100%}.budget-fill,.token-fill{border-radius:6px;height:100%;transition:width .3s ease}.budget-percent,.token-percent{color:#2c3e50;font-weight:500}.warning-level{border-radius:4px;font-size:.9em;font-weight:500;padding:2px 8px}.warning-level.low{background:#d4edda;color:#155724}.warning-level.medium{background:#fff3cd;color:#856404}.warning-level.high{background:#f8d7da;color:#721c24}.refresh-section{background:#f8f9fa;border-radius:8px;margin-top:30px;padding:20px;text-align:center}.last-update{color:#7f8c8d;font-size:.9em;margin-top:15px}.loading-usage{color:#7f8c8d;padding:50px 20px;text-align:center}@media (max-width:768px){.container,.header{padding:15px}.ai-budget-bar{justify-content:center;margin-top:15px;position:static}.logout-btn{margin-bottom:15px;position:static}.nav-buttons{align-items:center;flex-direction:column}.nav-btn{max-width:300px;width:100%}.form-row{flex-direction:column}.form-row .form-group{min-width:auto}.quote-actions{flex-direction:column}.quote-actions .btn{min-width:auto}.materials-grid,.prices-grid,.usage-overview{grid-template-columns:1fr}}.modal-overlay{align-items:center;background:#000000b3;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.approval-dialog{background:#fff;border-radius:12px;box-shadow:0 10px 30px #0000004d;max-height:80vh;max-width:700px;overflow-y:auto;padding:30px;width:90%}.approval-dialog h3{color:#2c3e50;font-size:1.4em;margin:0 0 15px}.approval-dialog p{color:#7f8c8d;margin-bottom:25px}.approval-list{margin-bottom:25px}.approval-item{border:2px solid #ecf0f1;border-radius:8px;margin-bottom:12px;transition:all .2s ease}.approval-item:hover{border-color:#3498db;box-shadow:0 2px 8px #3498db1a}.approval-checkbox{align-items:flex-start;cursor:pointer;display:flex;gap:12px;padding:15px}.approval-checkbox input[type=checkbox]{margin:4px 0 0;transform:scale(1.2)}.approval-details{flex:1 1}.approval-main{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.approval-main strong{color:#2c3e50;font-size:1.1em}.approval-price{background:#e8f5e8;border-radius:20px;color:#27ae60;font-size:.9em;font-weight:700;padding:4px 12px}.approval-meta{display:flex;gap:15px;margin-bottom:8px}.approval-source{color:#7f8c8d;font-size:.9em}.approval-confidence{color:#8e44ad;font-size:.9em;font-weight:500}.approval-notes{background:#f8f9fa;border-left:3px solid #dee2e6;border-radius:6px;color:#6c757d;font-size:.85em;padding:8px 12px}.approval-actions{border-top:1px solid #ecf0f1;display:flex;gap:15px;justify-content:flex-end;margin-top:25px;padding-top:20px}.approval-actions .btn{min-width:120px}.btn-primary:disabled{background:#bdc3c7;cursor:not-allowed}@media (max-width:768px){.approval-dialog{margin:20px;padding:20px}.approval-main{align-items:flex-start;flex-direction:column;gap:8px}.approval-meta{flex-direction:column;gap:5px}.approval-actions{flex-direction:column-reverse}}.search-and-filter{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;display:flex;flex-wrap:wrap;gap:15px;margin-bottom:20px;padding:20px}.search-input{border:2px solid #e9ecef;border-radius:6px;flex:1 1;font-size:14px;padding:12px 16px;transition:border-color .2s ease}.search-input:focus{border-color:#007bff;box-shadow:0 0 0 3px #007bff1a;outline:none}.category-filter{background:#fff;border:2px solid #e9ecef;border-radius:6px;font-size:14px;min-width:200px;padding:12px 16px;transition:border-color .2s ease}.category-filter:focus{border-color:#007bff;outline:none}.materials-table-container{border-radius:8px;box-shadow:0 2px 10px #0000001a;box-sizing:border-box;margin-top:20px;overflow:hidden;overflow-x:auto;width:100%!important}.materials-view .materials-table-container{max-width:none!important;width:100%!important}.results-info{background:#f8f9fa;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:14px;font-weight:500;padding:15px 20px}.materials-table.enhanced{border-collapse:collapse;margin:0;min-width:100%;table-layout:fixed;width:100%!important}.materials-view .materials-table.enhanced{min-width:100%!important;width:100%!important}.edit-input,.edit-select{box-sizing:border-box;font-size:12px;padding:4px 8px}.edit-input:focus,.edit-select:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff40}.btn-success{background-color:#28a745;border:1px solid #28a745;color:#fff}.btn-success:hover{background-color:#218838;border-color:#1e7e34}.btn-secondary{background-color:#6c757d;border:1px solid #6c757d;color:#fff}.btn-secondary:hover{background-color:#5a6268;border-color:#545b62}.materials-table.enhanced th{background:#495057;border:none;color:#fff;font-size:14px;font-weight:600;padding:15px 12px;text-align:left;white-space:nowrap}.materials-table.enhanced th:first-child{width:25%}.materials-table.enhanced th:nth-child(2){width:15%}.materials-table.enhanced th:nth-child(3){width:10%}.materials-table.enhanced th:nth-child(4),.materials-table.enhanced th:nth-child(5){width:15%}.materials-table.enhanced th:nth-child(6){width:20%}.materials-table.enhanced th:nth-child(7){width:10%}.materials-table.enhanced td{border-bottom:1px solid #e9ecef;overflow:hidden;padding:12px;text-overflow:ellipsis;vertical-align:middle}.materials-table.enhanced tr:hover{background-color:#f8f9fa}.material-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.category-badge{font-size:11px;white-space:nowrap}.unit-cell{background:#f8f9fa;border-radius:4px;color:#495057;font-family:Courier New,monospace;font-size:12px;font-weight:500;padding:6px 8px;text-align:center}.price-cell{padding-right:16px;text-align:right}.price-value{color:#28a745;font-weight:700;white-space:nowrap}.supplier-cell{font-size:13px;font-style:italic}.description-cell,.supplier-cell{color:#6c757d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.description-cell{font-size:12px;line-height:1.3;max-width:0}.actions-cell{text-align:center;white-space:nowrap}.btn-small{border:none;border-radius:4px;cursor:pointer;font-size:12px;margin:0 2px;padding:6px 10px;transition:all .2s ease}.btn-edit{background:#ffc107;color:#212529}.btn-edit:hover{background:#e0a800;transform:translateY(-1px)}.btn-danger{background:#dc3545;color:#fff}.btn-danger:hover{background:#c82333;transform:translateY(-1px)}.empty-state{color:#6c757d}.empty-icon{display:block;font-size:48px;margin-bottom:20px}.empty-state h4{color:#495057;font-weight:600;margin:0 0 10px}.empty-state p{font-size:14px;line-height:1.5;margin:0 0 20px}.usage-stats-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));margin-top:30px}.stat-card{align-items:flex-start;background:#fff;border:1px solid #e9ecef;border-radius:12px;box-shadow:0 4px 20px #0000001a;display:flex;gap:15px;padding:25px;transition:transform .2s ease,box-shadow .2s ease}.stat-card:hover{box-shadow:0 8px 30px #00000026;transform:translateY(-2px)}.stat-card.primary-stat{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;grid-column:span 2}.stat-card.secondary-stat{background:linear-gradient(135deg,#f093fb,#f5576c);color:#fff}.stat-card.wide-stat{background:#f8f9fa;grid-column:span 2}.stat-icon{background:#ffffff1a;border-radius:8px;flex-shrink:0;font-size:24px;padding:8px}.stat-card.primary-stat .stat-icon,.stat-card.secondary-stat .stat-icon{background:#fff3}.stat-content{flex:1 1}.stat-card h3{font-size:14px;font-weight:600;margin:0 0 8px;opacity:.9}.stat-value{line-height:1.2;margin:0 0 5px}.stat-value.large{font-size:32px}.stat-value.medium{font-size:20px}.stat-value.small{font-size:14px;font-weight:500}.stat-label{font-size:12px;opacity:.7}.token-breakdown{display:flex;flex-direction:column;gap:8px;margin-top:10px}.token-item{align-items:center;background:#fff;border-radius:6px;display:flex;font-size:14px;justify-content:space-between;padding:8px 12px}.token-item.total{background:#e3f2fd;border:2px solid #1976d2;font-weight:600}.loading-spinner{border:4px solid #f3f3f3;border-top-color:#007bff}@media (max-width:768px){.search-and-filter{align-items:stretch;flex-direction:column}.category-filter,.search-input{min-width:auto;width:100%}.usage-stats-grid{grid-template-columns:1fr}.stat-card.primary-stat,.stat-card.wide-stat{grid-column:span 1}.materials-table.enhanced{font-size:11px}.materials-table.enhanced td,.materials-table.enhanced th{padding:8px 4px}.materials-table.enhanced td:nth-child(5),.materials-table.enhanced td:nth-child(6),.materials-table.enhanced th:nth-child(5),.materials-table.enhanced th:nth-child(6){display:none}.materials-table.enhanced th:first-child{width:35%}.materials-table.enhanced th:nth-child(2){width:20%}.materials-table.enhanced th:nth-child(3){width:15%}.materials-table.enhanced th:nth-child(4){width:20%}.materials-table.enhanced th:nth-child(7){width:10%}}.project-flow{margin:0 auto;max-width:1200px;padding:20px}.project-header{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.project-info h2{color:#2c3e50;margin:0 0 5px}.project-info p{color:#6c757d;margin:2px 0}.reset-btn{background:#dc3545;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:10px 15px}.reset-btn:hover{background:#c82333}.step-navigation{background:#fff;border-radius:10px;box-shadow:0 2px 4px #0000001a;display:flex;justify-content:space-between;margin-bottom:40px;overflow-x:auto;padding:20px}.step{align-items:center;border-radius:8px;cursor:pointer;display:flex;flex:1 1;margin:0 5px;min-width:180px;padding:15px;transition:all .3s ease}.step.active{background:#007bff;color:#fff;transform:scale(1.05)}.step.accessible:hover{background:#e9ecef}.step.accessible.active:hover{background:#0056b3}.step.locked{cursor:not-allowed;opacity:.5}.step-icon{font-size:24px;margin-right:10px}.step-info{flex:1 1}.step-name{font-size:16px;font-weight:700}.step-description{font-size:12px;opacity:.8}.step-arrow{font-size:20px;margin-left:10px;opacity:.5}.step.active .step-arrow{display:none}.step-content{background:#fff;border-radius:10px;box-shadow:0 2px 8px #0000001a;min-height:600px;padding:30px}.project-creation{margin:0 auto;max-width:800px}.section-header{margin-bottom:30px;text-align:center}.section-header h3{color:#2c3e50;font-size:28px;margin:0 0 10px}.section-header p{color:#6c757d;margin:0}.header-actions{justify-content:center;margin-top:20px}.toggle-btn{background:#fff;border:2px solid #007bff;border-radius:5px;color:#007bff;cursor:pointer;padding:10px 20px;transition:all .3s ease}.toggle-btn.active,.toggle-btn:hover{background:#007bff;color:#fff}.form-container{margin:0 auto;max-width:600px}.project-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.form-grid{grid-gap:20px;gap:20px;grid-template-columns:1fr 1fr}.form-group{display:flex;flex-direction:column}.form-group.full-width{grid-column:1/-1}.form-group.checkbox-group{align-items:center;flex-direction:row}.form-group.checkbox-group input{margin-right:8px;width:auto}.form-group label{color:#2c3e50;font-weight:700;margin-bottom:5px}.form-group input,.form-group select,.form-group textarea{border:1px solid #ced4da;border-radius:5px;font-size:14px;padding:12px;transition:border-color .3s ease}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff40;outline:none}.submit-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;margin-top:20px;padding:15px;transition:background .3s ease;width:100%}.submit-btn:hover{background:#218838}.submit-btn:disabled{background:#6c757d;cursor:not-allowed}.error-message{margin:15px 0;padding:12px}.existing-projects{margin:0 auto;max-width:900px}.no-projects{color:#6c757d;padding:60px 20px;text-align:center}.create-first-btn{background:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;margin-top:20px;padding:12px 24px}.projects-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.project-card{background:#fff;border:1px solid #e9ecef;border-radius:8px;box-shadow:0 2px 4px #0000001a;cursor:pointer;padding:20px;transition:all .3s ease}.project-card:hover{border-color:#007bff;box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.project-card-header{align-items:center}.project-card-header h4{color:#2c3e50;margin:0}.status-badge{color:#fff}.project-card-body p{color:#6c757d;font-size:14px;margin:8px 0}.project-card-footer{margin-top:15px;text-align:center}.continue-text{color:#007bff;font-size:12px;font-weight:700}.geometry-input{margin:0 auto;max-width:800px}.geometry-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.calculations-display{background:#e3f2fd;border:1px solid #bbdefb;border-radius:8px;margin:20px 0;padding:20px}.calculations-display h4{color:#1976d2;margin:0 0 15px}.calc-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.calc-item{align-items:center;background:#fff;border:1px solid #bbdefb;border-radius:5px;display:flex;justify-content:space-between;padding:12px}.calc-label{color:#2c3e50;font-weight:700}.calc-value{color:#1976d2;font-weight:700}.labor-input{margin:0 auto;max-width:900px}.labor-form{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:30px}.labor-overview{background:#fff3cd;border:1px solid #ffeaa7;border-radius:8px;margin-bottom:30px;padding:20px}.overview-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:20px}.overview-item{display:flex;flex-direction:column}.overview-item label{color:#2c3e50;font-weight:700;margin-bottom:5px}.overview-item input{border:1px solid #ced4da;border-radius:5px;padding:10px}.overview-item input.fixed-rate{background:#e9ecef}.overview-item small{color:#6c757d;font-size:12px;margin-top:5px}.calculations{display:flex;gap:30px;justify-content:center;margin-top:20px}.work-breakdown{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin:20px 0;padding:20px}.work-breakdown h4{color:#2c3e50;margin:0 0 20px}.breakdown-list{display:flex;flex-direction:column;gap:15px}.breakdown-item{background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;padding:15px}.breakdown-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:10px}.hours-inputs{align-items:flex-end;display:flex;gap:15px}.hour-input-group{align-items:center;display:flex;flex-direction:column;gap:5px}.hour-input-group label{color:#6c757d;font-size:12px;font-weight:500}.hours-input{border:1px solid #ced4da;border-radius:3px;padding:5px;text-align:center;width:80px}.hours-input.allocated{background-color:#f8fff9;border-color:#28a745}.description-input{border:1px solid #ced4da;border-radius:3px;padding:8px;width:100%}.breakdown-totals{display:flex;flex-direction:column;gap:10px;margin-top:20px}.total-row{background:#d4edda;border-radius:5px;color:#155724;padding:12px;text-align:center}.total-row.allocated{background:#d1ecf1;color:#0c5460}.materials-manager{margin:0 auto;max-width:1000px}.suggestions-section{background:#d1ecf1;border:1px solid #bee5eb;border-radius:8px;margin-bottom:30px;padding:20px}.suggestions-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:15px}.suggestions-header h4{color:#0c5460;margin:0}.hide-suggestions-btn{background:none;border:none;color:#0c5460;cursor:pointer;font-size:16px}.suggestions-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.suggestion-card{align-items:center;background:#fff;border:1px solid #bee5eb;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.suggestion-info{flex:1 1}.suggestion-info strong{color:#2c3e50}.suggestion-info p{color:#6c757d;font-size:14px;margin:5px 0}.suggestion-details{color:#6c757d;display:flex;flex-direction:column;font-size:12px;gap:2px}.add-suggestion-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 12px}.add-suggestion-btn:hover{background:#218838}.add-material-section{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.add-material-section h4{color:#2c3e50;margin:0 0 20px}.material-form{display:flex;flex-direction:column}.total-display{background:#d4edda;border:1px solid #c3e6cb;border-radius:5px;color:#155724;padding:15px;text-align:center}.add-btn{background:#007bff;border:none;border-radius:5px;cursor:pointer;margin-top:15px;padding:12px 20px}.add-btn:hover{background:#0056b3}.add-btn:disabled{background:#6c757d;cursor:not-allowed}.materials-list{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:20px;padding:20px}.materials-list h4{color:#2c3e50;margin:0 0 20px}.material-category{margin-bottom:25px}.material-category h5{border-bottom:1px solid #e9ecef;color:#495057;font-size:16px;margin:0 0 10px;padding-bottom:5px}.materials-table{display:flex;flex-direction:column;gap:10px}.material-row{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:15px}.material-info{display:flex;flex:1 1;flex-direction:column;gap:4px}.material-info strong{color:#2c3e50}.material-info span{color:#6c757d;font-size:14px}.material-actions{align-items:center;display:flex;gap:15px}.material-total{color:#28a745;font-size:16px;font-weight:700}.edit-btn{background:#007bff;border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:14px;padding:6px 10px}.edit-btn:hover{background:#0056b3}.remove-btn{background:#dc3545;border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:14px;padding:6px 10px}.remove-btn:hover{background:#c82333}.material-edit-form{background:#fff3cd;border:1px solid #ffc107;border-radius:5px;padding:15px;width:100%}.edit-row{align-items:center;margin-bottom:15px}.edit-inputs,.edit-row{display:flex;flex-wrap:wrap;gap:15px}.input-group{align-items:center;display:flex;gap:5px;min-width:150px}.input-group label{color:#6c757d;font-size:12px;min-width:70px}.input-group input{border:1px solid #ced4da;border-radius:3px;flex:1 1;font-size:14px;padding:5px 8px}.input-group span{color:#6c757d;font-size:12px;min-width:30px}.edit-actions{border-top:1px solid #dee2e6;display:flex;gap:10px;justify-content:flex-end;margin-top:10px;padding-top:10px}.save-btn{background:#28a745;border-radius:3px;font-size:14px;padding:8px 16px}.save-btn:hover{background:#218838}.save-btn:disabled{background:#6c757d}.cancel-btn{border-radius:3px;padding:8px 16px}.cancel-btn:hover{background:#545b62}.materials-summary{background:#e9ecef;border-radius:8px;margin-top:20px;padding:20px}.summary-item{margin-bottom:10px}.summary-item.total{border-top:1px solid #ced4da;color:#28a745;font-size:18px;margin-top:15px;padding-top:10px}.calculation-view{margin:0 auto;max-width:1000px}.project-summary{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.project-summary h4{color:#2c3e50;margin:0 0 15px}.summary-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.summary-item{background:#fff;border:1px solid #e9ecef;border-radius:5px;display:flex;justify-content:space-between;padding:12px}.calculation-section{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.calculation-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.calculation-header h4{color:#2c3e50;margin:0}.calculate-btn{background:#17a2b8;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:12px 20px}.calculate-btn:hover{background:#138496}.calculate-btn:disabled{background:#6c757d;cursor:not-allowed}.calculation-results{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:20px}.calculation-breakdown{display:flex;flex-direction:column;gap:20px}.breakdown-section{background:#fff;border:1px solid #e9ecef;border-radius:5px;padding:15px}.breakdown-section h5{color:#495057;margin:0 0 10px}.breakdown-item{display:flex;justify-content:space-between;margin-bottom:8px;padding:5px 0}.breakdown-item.total{border-top:2px solid #28a745;color:#28a745;font-size:18px;margin-top:10px;padding-top:10px}.quote-generation{background:#fff;border:1px solid #e9ecef;border-radius:8px;margin-bottom:30px;padding:20px}.quote-generation h4{color:#2c3e50;margin:0 0 20px}.quote-options{background:#f8f9fa;border-radius:5px;margin-bottom:20px;padding:15px}.options-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.quote-buttons{display:flex;gap:15px;justify-content:center;margin-bottom:20px}.static-quote-btn{background:#28a745;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.static-quote-btn:hover{background:#218838}.ai-quote-btn{background:#6f42c1;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.ai-quote-btn:hover{background:#5a32a3}.html-quote-btn{background:#fd7e14;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:16px;font-weight:700;padding:15px 25px}.html-quote-btn:hover{background:#e96500}.quote-info{background:#d1ecf1;border:1px solid #bee5eb;border-radius:5px;padding:15px}.quote-info p{color:#0c5460}.quotes-list{background:#fff;border:1px solid #e9ecef;border-radius:8px;padding:20px}.quotes-list h4{color:#2c3e50;margin:0 0 20px}.quotes-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.quote-card{background:#f8f9fa;border:1px solid #e9ecef;border-radius:5px;padding:15px}.quote-header{margin-bottom:10px}.quote-id{color:#2c3e50;font-weight:700}.quote-info{margin-bottom:15px}.quote-info p{color:#495057;font-size:14px;margin:5px 0}.quote-actions{display:flex;flex-wrap:wrap;gap:5px;justify-content:center;text-align:center}.view-quote-btn{background:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.view-quote-btn:hover{background:#0056b3}.pdf-download-btn{background:#dc3545;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.pdf-download-btn:hover{background:#c82333}.pdf-generate-btn{background:#6c757d;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:8px 15px}.pdf-generate-btn:hover{background:#545b62}.pdf-generate-btn:disabled{cursor:not-allowed;opacity:.6}@media (max-width:768px){.step-navigation{flex-direction:column;gap:10px}.step{min-width:auto}.step-arrow{display:none}.calc-grid,.form-grid,.overview-grid,.projects-grid,.quotes-grid,.suggestions-grid,.summary-grid{grid-template-columns:1fr}.quote-buttons{flex-direction:column}}.project-card-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:15px}.header-actions{align-items:center;display:flex;gap:10px}.card-actions{display:flex;gap:5px}.action-btn{align-items:center;background:none;display:flex;font-size:14px;height:28px;justify-content:center;padding:5px;transition:all .2s ease;width:28px}.action-btn:hover{box-shadow:0 2px 8px #00000026;transform:scale(1.1)}.edit-btn{background:#ffc107;color:#212529}.edit-btn:hover{background:#e0a800}.delete-btn{background:#dc3545}.delete-btn:hover{background:#c82333}.form-actions{align-items:center;gap:15px}.cancel-btn{background:#6c757d;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:14px;padding:12px 20px;transition:background-color .2s ease}.cancel-btn:hover{background:#5a6268}.project-review{margin:0 auto;max-width:1400px;padding:20px}.project-review h2{border-bottom:2px solid #3498db;color:#2c3e50;margin-bottom:20px;padding-bottom:10px}.error-message{background-color:#e74c3c;border-radius:5px;color:#fff;text-align:center}.project-review-layout{grid-gap:30px;display:grid;gap:30px;grid-template-columns:400px 1fr;height:calc(100vh - 200px)}.project-list{background:#f8f9fa;border:1px solid #dee2e6;border-radius:10px;overflow-y:auto;padding:20px}.project-list h3{border-bottom:1px solid #dee2e6;color:#495057;margin-bottom:20px;margin-top:0;padding-bottom:10px;text-align:center}.project-item{background:#fff;border:2px solid #e9ecef;border-radius:8px;box-shadow:0 2px 4px #0000001a;cursor:pointer;margin-bottom:15px;padding:15px;transition:all .3s ease}.project-item:hover{border-color:#3498db;box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.project-item.selected{background:#e8f5e8;border-color:#27ae60;box-shadow:0 4px 12px #27ae6033}.project-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:10px}.project-header h4{color:#2c3e50;font-size:16px;margin:0}.status-badge{border-radius:12px;font-size:12px;font-weight:700;padding:4px 8px;text-transform:uppercase}.status-badge.active{background:#d4edda;color:#155724}.status-badge.completed{background:#cce5ff;color:#004085}.status-badge.pending{background:#fff3cd;color:#856404}.status-badge.cancelled{background:#f8d7da;color:#721c24}.project-details p{color:#6c757d;font-size:14px;margin:5px 0}.project-stats{border-top:1px solid #e9ecef;display:flex;flex-wrap:wrap;gap:10px;margin-top:10px;padding-top:10px}.project-stats span{background:#e9ecef;border-radius:12px;color:#495057;font-size:12px;padding:3px 8px}.project-details-panel{background:#fff;border:1px solid #dee2e6;border-radius:10px;box-shadow:0 2px 8px #0000001a;overflow-y:auto;padding:25px}.project-details-panel h3{border-bottom:2px solid #3498db;color:#2c3e50;font-size:24px;margin-bottom:25px;margin-top:0;padding-bottom:10px}.project-details-panel h4{border-bottom:1px solid #ecf0f1;color:#34495e;font-size:18px;margin-bottom:15px;margin-top:30px;padding-bottom:8px}.steps-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:25px}.step-item{background:#f8f9fa;border:2px solid #e9ecef;border-radius:8px;padding:15px;text-align:center;transition:all .3s ease}.step-item.completed{background:#d4edda;border-color:#c3e6cb}.step-item.pending{background:#fff3cd;border-color:#ffeaa7}.step-status{font-size:18px;font-weight:700;margin-bottom:8px}.step-title{color:#495057;font-weight:600;margin-bottom:5px;text-transform:capitalize}.step-timestamp{color:#6c757d;font-size:12px}.geometry-grid{grid-gap:15px;display:grid;gap:15px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:15px}.geometry-item{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;display:flex;justify-content:space-between;padding:12px}.geometry-item label{color:#495057;font-weight:600}.geometry-item span{color:#2c3e50;font-weight:700}.geometry-notes{background:#e3f2fd;border-left:4px solid #2196f3;border-radius:0 6px 6px 0;color:#1565c0;margin-top:15px;padding:15px}.quotes-grid{grid-gap:20px;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:25px}.quote-item{background:#f8f9fa;border:2px solid #e9ecef;border-radius:8px;cursor:pointer;padding:20px;transition:all .3s ease}.quote-item:hover{border-color:#3498db;box-shadow:0 4px 8px #3498db33;transform:translateY(-2px)}.quote-item.selected{background:#fdf2f2;border-color:#e74c3c;box-shadow:0 4px 12px #e74c3c33}.quote-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:15px}.quote-header h5{color:#2c3e50;margin:0}.delivery-status{border-radius:12px;font-size:12px;font-weight:700;padding:4px 8px}.delivery-status.delivered{background:#d4edda;color:#155724}.delivery-status.draft{background:#fff3cd;color:#856404}.quote-amounts{margin-bottom:15px}.amount-item{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.amount-item label{color:#495057;font-weight:600}.total-amount{color:#27ae60;font-size:18px;font-weight:700}.amount-breakdown{color:#6c757d;display:flex;flex-direction:column;font-size:14px;gap:5px}.quote-method{background:#e3f2fd;border-radius:6px;color:#1565c0;font-size:14px;margin-bottom:10px;padding:8px 12px}.quote-date{color:#6c757d;font-size:12px;text-align:right}.quote-details{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;margin-top:25px;padding:25px}.quote-details h4{color:#e74c3c;margin-top:0}.quote-details h5{border-bottom:1px solid #dee2e6;color:#495057;margin-bottom:10px;padding-bottom:5px}.quote-content{border:1px solid #dee2e6;max-height:300px;padding:15px}.materials-table,.quote-content{background:#fff;margin-bottom:20px}.materials-table{border:1px solid #dee2e6;border-radius:6px;overflow:hidden}.materials-table td,.materials-table th{border-bottom:1px solid #e9ecef;padding:12px;text-align:left}.materials-table th{color:#495057}.materials-table tr:last-child td{border-bottom:none}.materials-table tr:hover{background:#f8f9fa}.quote-responses{grid-gap:15px;display:grid;gap:15px}.response-item{display:flex;flex-direction:column;gap:5px}.response-item label{color:#495057;font-weight:600}.response-item span{background:#fff;border:1px solid #dee2e6;border-radius:6px;color:#495057;padding:10px}.loading{color:#6c757d;font-style:italic;padding:20px;text-align:center}@media (max-width:1024px){.project-review-layout{grid-template-columns:1fr;height:auto}.project-list{height:400px}.quotes-grid{grid-template-columns:1fr}.geometry-grid,.steps-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:768px){.project-review{padding:10px}.geometry-grid,.steps-grid{grid-template-columns:1fr}.project-stats{flex-direction:column;gap:5px}.quote-header{align-items:flex-start;flex-direction:column;gap:10px}}.completed-quotes-view{margin:0 auto;max-width:1400px;padding:20px}.quotes-header{margin-bottom:30px}.quotes-header h2{color:#2c3e50;margin-bottom:10px}.quotes-header p{color:#7f8c8d;margin-bottom:20px}.quotes-controls{align-items:center;display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;margin-bottom:20px}.filter-controls{align-items:center;gap:15px}.filter-controls label{align-items:center;font-weight:500;gap:8px}.filter-controls select{background:#fff;border:1px solid #ddd;border-radius:4px;min-width:120px;padding:8px 12px}.refresh-btn{background:#3498db;border:none;border-radius:4px;color:#fff;cursor:pointer;font-weight:500;padding:10px 16px;transition:background-color .2s}.refresh-btn:hover{background:#2980b9}.quotes-summary{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}.summary-stats{gap:30px;justify-content:center}.stat-item{text-align:center}.stat-label{color:#7f8c8d;display:block;margin-bottom:5px}.stat-value{display:block;font-weight:700}.quotes-table-container{background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;overflow:hidden}.quotes-table{border-collapse:collapse;width:100%}.quotes-table th{background:#34495e;color:#fff;font-size:14px;font-weight:600;padding:15px 12px;text-align:left}.quotes-table td{border-bottom:1px solid #ecf0f1;padding:12px;vertical-align:middle}.quote-row:hover{background:#f8f9fa}.quote-row.newest-quote{background:#e8f5e8;border-left:4px solid #27ae60;transition:all .3s ease}.quote-row.newest-quote:hover{background:#d5f4d5}.project-name,.quote-type{font-weight:500}.quote-type{border-radius:12px;display:inline-block;font-size:12px;padding:4px 8px}.quote-type.static{background:#e8f5e8;color:#27ae60}.quote-type.ai{background:#e3f2fd;color:#2196f3}.quote-total{color:#27ae60;font-weight:600}.ai-cost{color:#7f8c8d;font-size:14px}.delete-btn,.download-btn,.view-btn{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:6px 10px;transition:background-color .2s}.download-btn{background:#95a5a6}.download-btn:hover{background:#7f8c8d}.delete-btn{background:#e74c3c}.delete-btn:hover{background:#c0392b}.empty-state{color:#7f8c8d;padding:60px 20px;text-align:center}.empty-state p{font-size:18px;margin:0}.loading-state{padding:60px 20px;text-align:center}.loading-spinner{animation:spin 1s linear infinite;border:3px solid #f3f3f3;border-radius:50%;border-top-color:#3498db;height:40px;margin:0 auto 20px;width:40px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.error-message{background:#f8d7da;border:1px solid #f5c6cb;color:#721c24;margin-bottom:20px;padding:15px}.quote-modal-overlay{align-items:center;background:#000000b3;bottom:0;display:flex;justify-content:center;left:0;padding:20px;position:fixed;right:0;top:0;z-index:1000}.quote-modal{background:#fff;border-radius:8px;box-shadow:0 10px 30px #0000004d;max-height:90vh;max-width:800px;overflow-y:auto;width:100%}.modal-header{align-items:center;border-bottom:1px solid #ecf0f1;display:flex;justify-content:space-between;padding:20px 24px}.modal-header h3{color:#2c3e50;margin:0}.close-btn{background:none;border:none;border-radius:4px;color:#7f8c8d;cursor:pointer;font-size:20px;padding:5px;transition:background-color .2s}.close-btn:hover{background:#ecf0f1}.modal-content{padding:24px}.quote-meta{background:#f8f9fa;border-radius:6px;margin-bottom:20px;padding:16px}.meta-row{display:flex;margin-bottom:8px}.meta-row:last-child{margin-bottom:0}.meta-row strong{color:#34495e;min-width:120px}.quote-text h4{color:#2c3e50;margin-bottom:12px}.quote-content{background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;font-size:14px;line-height:1.5;white-space:pre-wrap}.modal-actions{border-top:1px solid #ecf0f1;display:flex;gap:12px;justify-content:flex-end;padding:20px 24px}.modal-actions .download-btn{background:#27ae60}.modal-actions .download-btn:hover{background:#229954}.modal-actions .close-btn{background:#95a5a6;border-radius:4px;color:#fff;padding:10px 16px}.modal-actions .close-btn:hover{background:#7f8c8d}@media (max-width:768px){.completed-quotes-view{padding:15px}.quotes-controls{align-items:stretch;flex-direction:column}.filter-controls{justify-content:center}.summary-stats{gap:15px}.quotes-table-container{overflow-x:auto}.quotes-table{min-width:700px}.quote-modal{margin:10px;max-height:95vh}.modal-content{padding:16px}.modal-actions{flex-direction:column;padding:16px}}.enhanced-table{min-width:1200px}.enhanced-table th{background:linear-gradient(135deg,#2c3e50,#34495e);color:#fff;font-weight:600;padding:15px 10px;text-align:left}.enhanced-table .quote-row:hover{background:#f8f9fa;box-shadow:0 4px 8px #0000001a;transform:translateY(-1px)}.date-cell{width:120px}.date-info{display:flex;flex-direction:column;gap:4px}.date-main{color:#2c3e50;font-weight:600}.quote-id{background:#ecf0f1;border-radius:10px;color:#7f8c8d;font-size:11px;padding:2px 6px;text-align:center}.project-cell{min-width:200px}.project-info{display:flex;flex-direction:column;gap:4px}.project-name{color:#2c3e50;font-weight:600}.project-type{background:#3498db1a;border-radius:10px;color:#3498db;display:inline-block;font-size:12px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.project-description{color:#7f8c8d;font-size:11px;font-style:italic}.customer-cell{min-width:180px}.customer-info{display:flex;flex-direction:column;gap:3px}.customer-name{color:#2c3e50;font-weight:600}.customer-email,.customer-phone{color:#7f8c8d;font-size:11px}.measurements-cell{min-width:140px}.measurements-info{display:flex;flex-direction:column;gap:3px}.area,.roof-type,.work-hours,.workers{background:#2ecc711a;border-radius:8px;color:#2c3e50;font-size:12px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.materials-cell{min-width:120px}.materials-info{display:flex;flex-direction:column;gap:4px}.material-count{color:#e67e22;font-size:12px;font-weight:600}.material-categories{display:flex;flex-direction:column;gap:2px}.material-category{background:#e67e221a;border-radius:6px;color:#e67e22;font-size:10px;padding:1px 4px;width:-webkit-fit-content;width:fit-content}.more-categories{color:#95a5a6;font-size:10px;font-style:italic}.pricing-cell{min-width:140px}.pricing-info{display:flex;flex-direction:column;gap:3px}.total-price{color:#27ae60;font-size:14px;font-weight:700}.labor-cost,.material-cost{color:#7f8c8d;font-size:11px}.quote-badge{border-radius:8px;font-size:10px;margin-top:4px;padding:2px 6px;width:-webkit-fit-content;width:fit-content}.quote-badge.static{background:#95a5a633;color:#95a5a6}.quote-badge.ai{background:#9b59b633;color:#9b59b6}.actions-cell{min-width:160px}.actions-buttons{display:flex;flex-direction:column;gap:4px}.action-btn{border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:500;padding:4px 8px;text-align:left;transition:all .2s;width:100%}.view-btn{background:#3498db;color:#fff}.view-btn:hover{background:#2980b9;transform:scale(1.02)}.pdf-btn{background:#e74c3c;color:#fff}.pdf-btn:hover{background:#c0392b;transform:scale(1.02)}.generate-pdf-btn{background:#9b59b6;color:#fff;font-size:.85rem}.generate-pdf-btn:hover{background:#8e44ad;transform:scale(1.02)}.generate-pdf-btn:disabled{background:#bdc3c7;cursor:not-allowed;transform:none}.generate-pdf-btn.disabled{background:#95a5a6;cursor:not-allowed;opacity:.6;transform:none}.download-btn{background:#27ae60;color:#fff}.download-btn:hover{background:#229954;transform:scale(1.02)}.delete-btn{background:#e67e22;color:#fff}.delete-btn:hover{background:#d35400;transform:scale(1.02)}.enhanced-modal{max-height:90vh;max-width:900px;width:90vw}.overview-section{background:#f8f9fa;border-radius:8px;margin-bottom:16px;padding:16px}.overview-section h4{border-bottom:2px solid #3498db;color:#2c3e50;font-size:16px;margin:0 0 12px;padding-bottom:8px}.info-grid{grid-gap:12px;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.info-item{display:flex;flex-direction:column;gap:4px}.info-item.full-width{grid-column:1/-1}.info-item .label{color:#7f8c8d;font-size:12px;font-weight:600;text-transform:uppercase}.info-item .value{color:#2c3e50;font-size:14px;font-weight:500}.material-categories-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.category-tag{background:#e67e221a;border-radius:12px;color:#e67e22;font-size:12px;font-weight:500;padding:4px 8px}.pricing-breakdown{display:flex;flex-direction:column;gap:8px}.price-item{align-items:center;background:#fff;border-left:4px solid #3498db;border-radius:6px;display:flex;justify-content:space-between;padding:8px 12px}.price-item.total-price{background:#27ae600d;border-left-color:#27ae60}.price-label{font-weight:500}.price-label,.price-value{color:#2c3e50;font-size:14px}.price-value{font-weight:600}.price-value.total{color:#27ae60;font-size:18px}.quote-text-section{background:#fff;border:1px solid #ecf0f1;border-radius:8px;overflow:hidden}.quote-text-section h4{background:#34495e;color:#fff;margin:0;padding:12px 16px}.quote-content{background:#fafafa;font-family:Courier New,monospace;font-size:12px;line-height:1.4;margin:0;max-height:400px;overflow-y:auto;padding:16px}@media (max-width:1200px){.enhanced-table{min-width:1000px}.info-grid{grid-template-columns:1fr}}@media (max-width:768px){.enhanced-table{min-width:800px}.enhanced-modal{max-height:95vh;width:95vw}.overview-section{padding:12px}.actions-buttons{flex-direction:row;flex-wrap:wrap}.action-btn{flex:1 1;min-width:70px}}.materials-list-view{background:#f8f9fa;margin:0;max-width:100%;min-height:100vh;padding:0;width:100%}.materials-header{background:#fff;border-bottom:1px solid #e0e0e0;margin-bottom:0;padding:24px}.materials-header h2{color:#2c3e50;font-size:28px;font-weight:600;margin:0 0 8px}.materials-header p{color:#666;font-size:16px;margin:0 0 24px}.materials-controls{display:flex;flex-direction:column;gap:16px}.filter-controls{align-items:end;display:flex;flex-wrap:wrap;gap:16px}.filter-controls label{display:flex;flex-direction:column;gap:4px;min-width:150px}.filter-controls label span{color:#555;font-size:14px;font-weight:500}.filter-controls input,.filter-controls select{border:1px solid #ddd;border-radius:6px;font-size:14px;padding:8px 12px;transition:border-color .2s}.filter-controls input:focus,.filter-controls select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}.search-input{min-width:250px}.action-controls{align-items:center;display:flex;gap:12px}.add-btn,.refresh-btn{border:none;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;padding:10px 16px;transition:all .2s}.add-btn{background:#27ae60;color:#fff}.add-btn:hover{background:#229954;transform:translateY(-1px)}.refresh-btn{background:#f1f2f6;border:1px solid #ddd;color:#2c3e50}.refresh-btn:hover{background:#e1e2e6}.refresh-btn:disabled{cursor:not-allowed;opacity:.6}.new-material-form{background:#f8f9fa;border:1px solid #e0e0e0;border-radius:8px;margin-top:24px;padding:20px}.new-material-form h4{color:#2c3e50;font-size:18px;margin:0 0 16px}.form-grid{grid-gap:12px;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:16px}.form-grid input,.form-grid select{border:1px solid #ddd;border-radius:6px;font-size:14px;padding:10px 12px}.form-grid input:focus,.form-grid select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}.form-actions{display:flex;gap:12px}.save-btn{background:#27ae60;border:none;border-radius:6px;color:#fff;cursor:pointer;font-weight:500;padding:10px 20px;transition:all .2s}.save-btn:hover:not(:disabled){background:#229954;transform:translateY(-1px)}.save-btn:disabled{cursor:not-allowed;opacity:.6;transform:none}.error-message{background:#fee;border:1px solid #ffcdd2;border-radius:6px;color:#c62828;font-weight:500;margin:16px 24px;padding:12px 16px}.materials-summary{background:#fff;border-bottom:1px solid #e0e0e0;padding:20px 24px}.summary-stats{display:flex;flex-wrap:wrap;gap:32px}.stat-item{display:flex;flex-direction:column;gap:4px}.stat-label{color:#666;font-size:14px;font-weight:500}.stat-value{color:#2c3e50;font-size:24px;font-weight:600}.empty-state,.loading-state{background:#fff;color:#666;padding:60px 24px;text-align:center}.empty-state p,.loading-state p{font-size:18px;margin:8px 0}.materials-table-container{background:#fff;border-radius:0;overflow:auto;position:relative}.materials-table{border-collapse:collapse;font-size:14px;table-layout:fixed;width:100%}.materials-table th{border-bottom:2px solid #e0e0e0;color:#2c3e50;font-weight:600;padding:16px 12px;text-align:left;top:0;z-index:10}.materials-table th,.materials-table th:last-child{background:#f8f9fa;position:-webkit-sticky;position:sticky}.materials-table th:last-child{box-shadow:-2px 0 4px #0000001a;right:0;z-index:11}.materials-table td{border-bottom:1px solid #f0f0f0;padding:12px;vertical-align:middle}.materials-table td:last-child{background:#fff;box-shadow:-2px 0 4px #0000001a;position:-webkit-sticky;position:sticky;right:0}.material-row:hover,.material-row:hover td:last-child{background:#f8f9fa}.material-row:nth-child(2n),.material-row:nth-child(2n) td:last-child{background:#fafbfc}.material-row:nth-child(2n):hover,.material-row:nth-child(2n):hover td:last-child{background:#f0f2f5}.materials-table td:first-child,.materials-table th:first-child{width:22%}.materials-table td:nth-child(2),.materials-table th:nth-child(2){width:12%}.materials-table td:nth-child(3),.materials-table th:nth-child(3){width:8%}.materials-table td:nth-child(4),.materials-table th:nth-child(4){width:10%}.materials-table td:nth-child(5),.materials-table th:nth-child(5){width:15%}.materials-table td:nth-child(6),.materials-table th:nth-child(6){width:23%}.materials-table td:nth-child(7),.materials-table th:nth-child(7){min-width:120px;width:10%}.material-name{color:#2c3e50;font-weight:600}.category-badge{background:#e3f2fd;border-radius:12px;color:#1976d2;display:inline-block;font-size:12px;font-weight:500;padding:4px 8px}.unit-cell{color:#666;font-size:13px}.price-cell{color:#27ae60;font-family:Courier New,monospace;font-weight:600}.supplier-cell{color:#666}.description-cell{word-wrap:break-word;color:#666;font-size:13px;max-width:200px}.actions{display:flex;gap:8px;justify-content:center}.cancel-edit-btn,.delete-btn,.edit-btn,.save-edit-btn{background:none;border:none;border-radius:4px;cursor:pointer;font-size:16px;padding:6px;transition:all .2s}.edit-btn:hover{background:#e3f2fd;transform:scale(1.1)}.delete-btn:hover{background:#ffebee;transform:scale(1.1)}.save-edit-btn:hover{background:#e8f5e8;transform:scale(1.1)}.cancel-edit-btn:hover{background:#ffebee;transform:scale(1.1)}.edit-input,.edit-select{border:1px solid #ddd;border-radius:4px;font-size:13px;padding:6px 8px;width:100%}.edit-input:focus,.edit-select:focus{border-color:#4a90e2;box-shadow:0 0 0 2px #4a90e21a;outline:none}@media (max-width:1024px){.filter-controls{align-items:stretch;flex-direction:column}.filter-controls label{min-width:auto}.summary-stats{gap:16px}.materials-table{font-size:13px}.materials-table td,.materials-table th{padding:10px 8px}}@media (max-width:768px){.materials-header,.materials-summary{padding:16px}.action-controls{align-items:stretch;flex-direction:column}.form-grid{grid-template-columns:1fr}.materials-table-container{overflow-x:auto}.materials-table{min-width:800px}} +/*# sourceMappingURL=main.b7c98a27.css.map*/ \ No newline at end of file diff --git a/build/static/css/main.b7c98a27.css.map b/build/static/css/main.b7c98a27.css.map new file mode 100644 index 0000000..3065600 --- /dev/null +++ b/build/static/css/main.b7c98a27.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.b7c98a27.css","mappings":"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","sources":["index.css","App.css","components/ProjectFlow.css","components/ProjectReview.css","components/CompletedQuotes.css","MaterialsList.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n\n/* Material suggestion feedback */\n.add-suggestion-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.3s ease;\n font-size: 14px;\n}\n\n.add-suggestion-btn:hover:not(:disabled) {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.add-suggestion-btn.added {\n background: #27ae60;\n animation: pulse 0.5s ease-out;\n}\n\n.add-suggestion-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n@keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n 100% { transform: scale(1); }\n}\n\n/* Historical data sections */\n.historical-section {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.historical-header {\n display: flex;\n justify-content: between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.historical-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.hide-historical-btn {\n background: none;\n border: none;\n color: #95a5a6;\n cursor: pointer;\n font-size: 16px;\n}\n\n.historical-summary {\n background: white;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 15px;\n border-left: 4px solid #3498db;\n}\n\n.avg-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n}\n\n.avg-stats span {\n background: #ecf0f1;\n padding: 8px 12px;\n border-radius: 20px;\n font-size: 14px;\n text-align: center;\n}\n\n.historical-projects {\n display: grid;\n gap: 15px;\n}\n\n.historical-project {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.project-info h5 {\n margin: 0 0 5px 0;\n color: #2c3e50;\n}\n\n.project-details {\n display: flex;\n gap: 15px;\n margin-top: 8px;\n}\n\n.project-details span {\n background: #f8f9fa;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 13px;\n color: #6c757d;\n}\n\n.apply-historical-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n white-space: nowrap;\n}\n\n.apply-historical-btn:hover {\n background: #138496;\n}\n\n.used-materials {\n margin-top: 10px;\n}\n\n.materials-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.add-all-materials-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 4px 12px;\n border-radius: 15px;\n cursor: pointer;\n font-size: 11px;\n transition: all 0.2s ease;\n}\n\n.add-all-materials-btn:hover {\n background: #218838;\n transform: translateY(-1px);\n}\n\n.materials-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.material-chip {\n display: inline-block;\n background: #e7f3ff;\n color: #0066cc;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n margin: 2px 5px 2px 0;\n border: none;\n cursor: default;\n}\n\n.material-chip.clickable {\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #b3d9ff;\n}\n\n.material-chip.clickable:hover {\n background: #cce7ff;\n color: #004499;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,102,204,0.2);\n}\n\n/* Project sorting and filtering */\n.projects-container {\n width: 100%;\n}\n\n.projects-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n padding: 15px 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.filter-controls, .sort-controls {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-controls label, .sort-controls label {\n font-weight: 500;\n color: #2c3e50;\n font-size: 14px;\n}\n\n.filter-select, .sort-select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 5px;\n background: white;\n font-size: 14px;\n min-width: 150px;\n}\n\n.sort-order-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 8px 12px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n transition: all 0.2s ease;\n}\n\n.sort-order-btn:hover {\n background: #2980b9;\n transform: scale(1.1);\n}\n\n@media (max-width: 768px) {\n .projects-controls {\n flex-direction: column;\n align-items: stretch;\n gap: 15px;\n }\n \n .filter-controls, .sort-controls {\n justify-content: space-between;\n }\n \n .filter-select, .sort-select {\n min-width: auto;\n flex: 1;\n }\n}\n","html, body {\n margin: 0;\n padding: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n background-color: #f5f5f5;\n overflow-x: auto;\n width: 100%;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n/* Main content area */\n.main-content {\n width: 100%;\n}\n\n/* Materials mode - full width layout */\n.App.materials-mode {\n width: 100vw;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n.App.materials-mode .header {\n width: 100vw;\n margin: 0;\n border-radius: 0;\n box-sizing: border-box;\n}\n\n.App.materials-mode .main-content {\n width: 100vw;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n/* Materials view should use full width */\n.materials-view {\n max-width: none !important;\n width: 100% !important;\n margin: 0 !important;\n padding: 20px !important;\n box-sizing: border-box;\n}\n\n.materials-view .upload-section,\n.materials-view .materials-section {\n max-width: none !important;\n width: 100% !important;\n box-sizing: border-box;\n}\n\n/* Ensure all containers within materials view are full width */\n.materials-view .upload-container,\n.materials-view .materials-header,\n.materials-view .filter-section,\n.materials-view .materials-list,\n.materials-view .materials-table-container {\n max-width: none !important;\n width: 100% !important;\n box-sizing: border-box;\n}\n\n.header {\n text-align: center;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n position: relative;\n}\n\n.header h1 {\n color: #2c3e50;\n margin: 0 0 10px 0;\n font-size: 2.5em;\n}\n\n.header p {\n color: #7f8c8d;\n margin: 0;\n font-size: 1.1em;\n}\n\n.ai-budget-bar {\n position: absolute;\n top: 10px;\n right: 20px;\n background: #ecf0f1;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.budget-summary {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.budget-label {\n color: #34495e;\n}\n\n.budget-used {\n color: #27ae60;\n font-weight: bold;\n}\n\n.budget-separator {\n color: #bdc3c7;\n}\n\n.budget-total {\n color: #34495e;\n font-weight: bold;\n}\n\n.budget-mini-bar {\n width: 60px;\n height: 4px;\n background: #ecf0f1;\n border-radius: 2px;\n overflow: hidden;\n}\n\n.budget-mini-fill {\n height: 100%;\n transition: width 0.3s ease;\n}\n\n.budget-tokens {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.budget-refresh-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1em;\n padding: 2px;\n border-radius: 3px;\n transition: background-color 0.2s;\n}\n\n.budget-refresh-btn:hover {\n background-color: #bdc3c7;\n}\n\n.nav-buttons {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin: 20px 0;\n flex-wrap: wrap;\n}\n\n.nav-btn {\n background: #3498db;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.3s ease;\n font-size: 0.95em;\n}\n\n.nav-btn:hover {\n background: #2980b9;\n transform: translateY(-1px);\n}\n\n.nav-btn.active {\n background: #27ae60;\n}\n\n.logout-btn {\n position: absolute;\n top: 20px;\n left: 20px;\n background: #e74c3c;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n}\n\n.logout-btn:hover {\n background: #c0392b;\n}\n\n.login-form {\n max-width: 400px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 10px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n}\n\n.login-form h2 {\n text-align: center;\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.login-form p {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 8px;\n color: #34495e;\n font-weight: 500;\n}\n\n.form-group input,\n.form-group textarea,\n.form-group select {\n width: 100%;\n padding: 12px;\n border: 2px solid #ecf0f1;\n border-radius: 6px;\n font-size: 16px;\n transition: border-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group textarea:focus,\n.form-group select:focus {\n outline: none;\n border-color: #3498db;\n}\n\n.form-group textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.form-row {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.form-row .form-group {\n flex: 1;\n min-width: 250px;\n}\n\n.btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 14px 28px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n width: 100%;\n transition: all 0.3s ease;\n}\n\n.btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn.btn-secondary {\n background: #95a5a6;\n}\n\n.btn.btn-secondary:hover:not(:disabled) {\n background: #7f8c8d;\n}\n\n.btn.btn-small {\n padding: 6px 12px;\n font-size: 14px;\n width: auto;\n}\n\n.btn.btn-primary {\n background: #3498db;\n}\n\n.btn.btn-primary:hover:not(:disabled) {\n background: #2980b9;\n}\n\n.btn.btn-danger {\n background: #e74c3c;\n}\n\n.btn.btn-danger:hover:not(:disabled) {\n background: #c0392b;\n}\n\n.error {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 6px;\n margin: 20px 0;\n border: 1px solid #f5c6cb;\n}\n\n.quote-form {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n}\n\n.quote-form h2 {\n color: #2c3e50;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.loading {\n text-align: center;\n padding: 50px 20px;\n background: white;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.loading-animation {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n}\n\n.loading-spinner {\n width: 50px;\n height: 50px;\n border: 5px solid #ecf0f1;\n border-top: 5px solid #3498db;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-text h3 {\n color: #2c3e50;\n margin: 0 0 15px 0;\n}\n\n.loading-steps {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.loading-steps .step {\n color: #bdc3c7;\n transition: color 0.3s ease;\n}\n\n.loading-steps .step.active {\n color: #27ae60;\n font-weight: 500;\n}\n\n.loading-progress {\n margin-top: 30px;\n}\n\n.progress-bar {\n width: 100%;\n height: 6px;\n background: #ecf0f1;\n border-radius: 3px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #3498db, #27ae60);\n border-radius: 3px;\n animation: progress 20s ease-in-out;\n}\n\n@keyframes progress {\n 0% { width: 0%; }\n 100% { width: 100%; }\n}\n\n.loading-time {\n color: #7f8c8d;\n margin-top: 10px;\n font-style: italic;\n}\n\n.quote-result {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 30px;\n}\n\n.quote-result h2 {\n color: #27ae60;\n margin-bottom: 20px;\n}\n\n.quote-result div {\n white-space: pre-line;\n line-height: 1.6;\n color: #2c3e50;\n font-size: 15px;\n}\n\n.quote-actions {\n display: flex;\n gap: 15px;\n margin-top: 30px;\n flex-wrap: wrap;\n}\n\n.quote-actions .btn {\n flex: 1;\n min-width: 200px;\n}\n\n.feedback-section {\n margin-top: 30px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #3498db;\n}\n\n.feedback-section h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.upload-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.upload-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.upload-form {\n margin-bottom: 30px;\n}\n\n.file-info {\n color: #27ae60;\n font-style: italic;\n margin-top: 8px;\n}\n\n.upload-status {\n padding: 15px;\n border-radius: 6px;\n margin: 20px 0;\n}\n\n.upload-status.success {\n background: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.upload-status.error {\n background: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.parse-results {\n margin-top: 15px;\n padding: 15px;\n background: rgba(255,255,255,0.5);\n border-radius: 4px;\n}\n\n.parse-results ul {\n margin: 10px 0;\n padding-left: 20px;\n}\n\n.recent-uploads {\n margin: 30px 0;\n}\n\n.recent-uploads h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.uploads-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.upload-name {\n font-weight: 500;\n color: #2c3e50;\n flex: 1;\n}\n\n.upload-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.upload-type {\n background: #ecf0f1;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n color: #34495e;\n}\n\n.upload-date {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.materials-overview {\n margin-top: 30px;\n}\n\n.materials-overview h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.materials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.material-item {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.material-item strong {\n color: #2c3e50;\n display: block;\n margin-bottom: 8px;\n}\n\n.material-item .price {\n color: #27ae60;\n font-weight: 500;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .category {\n color: #3498db;\n font-size: 0.9em;\n display: block;\n margin-bottom: 4px;\n}\n\n.material-item .supplier {\n color: #7f8c8d;\n font-size: 0.85em;\n}\n\n.more-items {\n text-align: center;\n color: #7f8c8d;\n font-style: italic;\n margin-top: 15px;\n}\n\n.pricing-management-section {\n background: white;\n padding: 30px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.pricing-management-section h2 {\n color: #2c3e50;\n margin-bottom: 15px;\n}\n\n.pricing-management-section p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.category-selector {\n margin-bottom: 20px;\n}\n\n.category-selector label {\n display: block;\n margin-bottom: 5px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.category-selector select {\n width: 100%;\n max-width: 300px;\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n margin-bottom: 10px;\n}\n\n.web-search-btn {\n background: linear-gradient(135deg, #3498db, #2980b9);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: all 0.3s ease;\n margin-left: 10px;\n}\n\n.web-search-btn:hover {\n background: linear-gradient(135deg, #2980b9, #3498db);\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3);\n}\n\n.web-search-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.add-price-form {\n margin-bottom: 40px;\n padding: 25px;\n background: #f8f9fa;\n border-radius: 8px;\n border-left: 4px solid #27ae60;\n}\n\n.add-price-form h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-list {\n margin-top: 30px;\n}\n\n.prices-list h3 {\n color: #2c3e50;\n margin-bottom: 20px;\n}\n\n.prices-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 20px;\n}\n\n.price-item {\n padding: 20px;\n background: white;\n border-radius: 8px;\n border: 1px solid #ecf0f1;\n box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n transition: box-shadow 0.3s ease;\n}\n\n.price-item:hover {\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n\n.price-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n}\n\n.price-header strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.price-value {\n color: #27ae60;\n font-weight: bold;\n font-size: 1.1em;\n}\n\n.price-details {\n margin-bottom: 15px;\n}\n\n.price-details p {\n margin: 5px 0;\n color: #34495e;\n font-size: 0.95em;\n}\n\n.price-date {\n color: #7f8c8d;\n font-size: 0.85em;\n margin-bottom: 15px;\n}\n\n.price-actions {\n display: flex;\n gap: 10px;\n}\n\n.edit-form {\n border: 2px solid #3498db;\n border-radius: 8px;\n padding: 15px;\n background: #f8f9fa;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n margin-top: 15px;\n}\n\n.no-data {\n text-align: center;\n padding: 40px 20px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.usage-overview {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n background: white;\n padding: 25px;\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n.stat-card h3 {\n color: #2c3e50;\n margin-bottom: 15px;\n font-size: 1.2em;\n}\n\n.budget-info p,\n.token-info p,\n.general-info p {\n margin: 8px 0;\n color: #34495e;\n}\n\n.budget-bar,\n.token-bar {\n width: 100%;\n height: 12px;\n background: #ecf0f1;\n border-radius: 6px;\n overflow: hidden;\n margin: 10px 0;\n}\n\n.budget-fill,\n.token-fill {\n height: 100%;\n transition: width 0.3s ease;\n border-radius: 6px;\n}\n\n.budget-percent,\n.token-percent {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.warning-level {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.warning-level.low {\n background: #d4edda;\n color: #155724;\n}\n\n.warning-level.medium {\n background: #fff3cd;\n color: #856404;\n}\n\n.warning-level.high {\n background: #f8d7da;\n color: #721c24;\n}\n\n.refresh-section {\n text-align: center;\n margin-top: 30px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n}\n\n.last-update {\n color: #7f8c8d;\n font-size: 0.9em;\n margin-top: 15px;\n}\n\n.loading-usage {\n text-align: center;\n padding: 50px 20px;\n color: #7f8c8d;\n}\n\n@media (max-width: 768px) {\n .container {\n padding: 15px;\n }\n \n .header {\n padding: 15px;\n }\n \n .ai-budget-bar {\n position: static;\n margin-top: 15px;\n justify-content: center;\n }\n \n .logout-btn {\n position: static;\n margin-bottom: 15px;\n }\n \n .nav-buttons {\n flex-direction: column;\n align-items: center;\n }\n \n .nav-btn {\n width: 100%;\n max-width: 300px;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .form-row .form-group {\n min-width: auto;\n }\n \n .quote-actions {\n flex-direction: column;\n }\n \n .quote-actions .btn {\n min-width: auto;\n }\n \n .prices-grid {\n grid-template-columns: 1fr;\n }\n \n .usage-overview {\n grid-template-columns: 1fr;\n }\n \n .materials-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Web Search Approval Dialog */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.approval-dialog {\n background: white;\n border-radius: 12px;\n padding: 30px;\n max-width: 700px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.approval-dialog h3 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n font-size: 1.4em;\n}\n\n.approval-dialog p {\n color: #7f8c8d;\n margin-bottom: 25px;\n}\n\n.approval-list {\n margin-bottom: 25px;\n}\n\n.approval-item {\n border: 2px solid #ecf0f1;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n}\n\n.approval-item:hover {\n border-color: #3498db;\n box-shadow: 0 2px 8px rgba(52, 152, 219, 0.1);\n}\n\n.approval-checkbox {\n display: flex;\n align-items: flex-start;\n padding: 15px;\n cursor: pointer;\n gap: 12px;\n}\n\n.approval-checkbox input[type=\"checkbox\"] {\n margin: 4px 0 0 0;\n transform: scale(1.2);\n}\n\n.approval-details {\n flex: 1;\n}\n\n.approval-main {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.approval-main strong {\n color: #2c3e50;\n font-size: 1.1em;\n}\n\n.approval-price {\n background: #e8f5e8;\n color: #27ae60;\n padding: 4px 12px;\n border-radius: 20px;\n font-weight: bold;\n font-size: 0.9em;\n}\n\n.approval-meta {\n display: flex;\n gap: 15px;\n margin-bottom: 8px;\n}\n\n.approval-source {\n color: #7f8c8d;\n font-size: 0.9em;\n}\n\n.approval-confidence {\n color: #8e44ad;\n font-size: 0.9em;\n font-weight: 500;\n}\n\n.approval-notes {\n background: #f8f9fa;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 0.85em;\n color: #6c757d;\n border-left: 3px solid #dee2e6;\n}\n\n.approval-actions {\n display: flex;\n gap: 15px;\n justify-content: flex-end;\n margin-top: 25px;\n padding-top: 20px;\n border-top: 1px solid #ecf0f1;\n}\n\n.approval-actions .btn {\n min-width: 120px;\n}\n\n.btn-primary:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n}\n\n@media (max-width: 768px) {\n .approval-dialog {\n padding: 20px;\n margin: 20px;\n }\n \n .approval-main {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .approval-meta {\n flex-direction: column;\n gap: 5px;\n }\n \n .approval-actions {\n flex-direction: column-reverse;\n }\n}\n\n/* Enhanced Materials Section Styles */\n.search-and-filter {\n display: flex;\n gap: 15px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 20px;\n padding: 20px;\n background: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.search-input {\n flex: 1;\n min-width: 250px;\n padding: 12px 16px;\n border: 2px solid #e9ecef;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s ease;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);\n}\n\n.category-filter {\n padding: 12px 16px;\n border: 2px solid #e9ecef;\n border-radius: 6px;\n background: white;\n font-size: 14px;\n min-width: 200px;\n transition: border-color 0.2s ease;\n}\n\n.category-filter:focus {\n outline: none;\n border-color: #007bff;\n}\n\n.materials-table-container {\n background: white;\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n margin-top: 20px;\n width: 100% !important;\n overflow-x: auto; /* Allow horizontal scrolling if needed */\n box-sizing: border-box;\n}\n\n.materials-view .materials-table-container {\n max-width: none !important;\n width: 100% !important;\n}\n\n.results-info {\n padding: 15px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e9ecef;\n font-size: 14px;\n color: #6c757d;\n font-weight: 500;\n}\n\n.materials-table.enhanced {\n width: 100% !important;\n border-collapse: collapse;\n margin: 0;\n table-layout: fixed;\n min-width: 100%;\n}\n\n.materials-view .materials-table.enhanced {\n width: 100% !important;\n min-width: 100% !important;\n}\n\n/* Edit mode styles for materials table */\n.edit-input, .edit-select {\n width: 100%;\n padding: 4px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n box-sizing: border-box;\n}\n\n.edit-input:focus, .edit-select:focus {\n outline: none;\n border-color: #007bff;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);\n}\n\n.btn-success {\n background-color: #28a745;\n color: white;\n border: 1px solid #28a745;\n}\n\n.btn-success:hover {\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-secondary {\n background-color: #6c757d;\n color: white;\n border: 1px solid #6c757d;\n}\n\n.btn-secondary:hover {\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.materials-table.enhanced th {\n background: #495057;\n color: white;\n padding: 15px 12px;\n text-align: left;\n font-weight: 600;\n font-size: 14px;\n border: none;\n white-space: nowrap;\n}\n\n.materials-table.enhanced th:nth-child(1) { width: 25%; } /* Materiale */\n.materials-table.enhanced th:nth-child(2) { width: 15%; } /* Kategori */\n.materials-table.enhanced th:nth-child(3) { width: 10%; } /* Enhed */\n.materials-table.enhanced th:nth-child(4) { width: 15%; } /* Pris */\n.materials-table.enhanced th:nth-child(5) { width: 15%; } /* Leverandør */\n.materials-table.enhanced th:nth-child(6) { width: 20%; } /* Beskrivelse */\n.materials-table.enhanced th:nth-child(7) { width: 10%; } /* Handlinger */\n\n.materials-table.enhanced td {\n padding: 12px;\n border-bottom: 1px solid #e9ecef;\n vertical-align: middle;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.materials-table.enhanced tr:hover {\n background-color: #f8f9fa;\n}\n\n.material-name {\n font-weight: 600;\n color: #2c3e50;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.category-badge {\n background: #e3f2fd;\n color: #1976d2;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n display: inline-block;\n white-space: nowrap;\n}\n\n.unit-cell {\n font-family: 'Courier New', monospace;\n background: #f8f9fa;\n color: #495057;\n font-weight: 500;\n text-align: center;\n border-radius: 4px;\n font-size: 12px;\n padding: 6px 8px;\n}\n\n.price-cell {\n text-align: right;\n padding-right: 16px;\n}\n\n.price-value {\n color: #28a745;\n font-size: 14px;\n font-weight: 700;\n white-space: nowrap;\n}\n\n.supplier-cell {\n color: #6c757d;\n font-style: italic;\n font-size: 13px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.description-cell {\n color: #6c757d;\n font-size: 12px;\n line-height: 1.3;\n max-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.actions-cell {\n text-align: center;\n white-space: nowrap;\n}\n\n.btn-small {\n padding: 6px 10px;\n font-size: 12px;\n margin: 0 2px;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-edit {\n background: #ffc107;\n color: #212529;\n}\n\n.btn-edit:hover {\n background: #e0a800;\n transform: translateY(-1px);\n}\n\n.btn-danger {\n background: #dc3545;\n color: white;\n}\n\n.btn-danger:hover {\n background: #c82333;\n transform: translateY(-1px);\n}\n\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-icon {\n font-size: 48px;\n display: block;\n margin-bottom: 20px;\n}\n\n.empty-state h4 {\n margin: 0 0 10px 0;\n color: #495057;\n font-weight: 600;\n}\n\n.empty-state p {\n margin: 0 0 20px 0;\n font-size: 14px;\n line-height: 1.5;\n}\n\n/* Enhanced OpenAI Usage Section Styles */\n.usage-stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-top: 30px;\n}\n\n.stat-card {\n background: white;\n border-radius: 12px;\n padding: 25px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n border: 1px solid #e9ecef;\n display: flex;\n align-items: flex-start;\n gap: 15px;\n}\n\n.stat-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n}\n\n.stat-card.primary-stat {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n grid-column: span 2;\n}\n\n.stat-card.secondary-stat {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n.stat-card.wide-stat {\n grid-column: span 2;\n background: #f8f9fa;\n}\n\n.stat-icon {\n font-size: 24px;\n padding: 8px;\n background: rgba(255,255,255,0.1);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.stat-card.primary-stat .stat-icon,\n.stat-card.secondary-stat .stat-icon {\n background: rgba(255,255,255,0.2);\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-card h3 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 600;\n opacity: 0.9;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 5px 0;\n line-height: 1.2;\n}\n\n.stat-value.large {\n font-size: 32px;\n}\n\n.stat-value.medium {\n font-size: 20px;\n}\n\n.stat-value.small {\n font-size: 14px;\n font-weight: 500;\n}\n\n.stat-label {\n font-size: 12px;\n opacity: 0.7;\n font-weight: 500;\n}\n\n.token-breakdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 10px;\n}\n\n.token-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.token-item.total {\n background: #e3f2fd;\n font-weight: 600;\n border: 2px solid #1976d2;\n}\n\n.loading-state {\n text-align: center;\n padding: 60px 20px;\n}\n\n.loading-spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #007bff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n/* Responsive adjustments */\n@media (max-width: 768px) {\n .search-and-filter {\n flex-direction: column;\n align-items: stretch;\n }\n \n .search-input,\n .category-filter {\n min-width: auto;\n width: 100%;\n }\n \n .usage-stats-grid {\n grid-template-columns: 1fr;\n }\n \n .stat-card.primary-stat,\n .stat-card.wide-stat {\n grid-column: span 1;\n }\n \n .materials-table.enhanced {\n font-size: 11px;\n }\n \n .materials-table.enhanced th,\n .materials-table.enhanced td {\n padding: 8px 4px;\n }\n \n /* Hide less important columns on mobile */\n .materials-table.enhanced th:nth-child(5),\n .materials-table.enhanced td:nth-child(5), /* Leverandør */\n .materials-table.enhanced th:nth-child(6),\n .materials-table.enhanced td:nth-child(6) { /* Beskrivelse */\n display: none;\n }\n \n /* Adjust remaining column widths for mobile */\n .materials-table.enhanced th:nth-child(1) { width: 35%; } /* Materiale */\n .materials-table.enhanced th:nth-child(2) { width: 20%; } /* Kategori */\n .materials-table.enhanced th:nth-child(3) { width: 15%; } /* Enhed */\n .materials-table.enhanced th:nth-child(4) { width: 20%; } /* Pris */\n .materials-table.enhanced th:nth-child(7) { width: 10%; } /* Handlinger */\n}\n","/* Project Flow Styles */\n.project-flow {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n}\n\n.project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #e9ecef;\n}\n\n.project-info h2 {\n margin: 0 0 5px 0;\n color: #2c3e50;\n}\n\n.project-info p {\n margin: 2px 0;\n color: #6c757d;\n}\n\n.reset-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 10px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.reset-btn:hover {\n background: #c82333;\n}\n\n/* Step Navigation */\n.step-navigation {\n display: flex;\n justify-content: space-between;\n margin-bottom: 40px;\n background: white;\n padding: 20px;\n border-radius: 10px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n overflow-x: auto;\n}\n\n.step {\n flex: 1;\n display: flex;\n align-items: center;\n padding: 15px;\n margin: 0 5px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.3s ease;\n min-width: 180px;\n}\n\n.step.active {\n background: #007bff;\n color: white;\n transform: scale(1.05);\n}\n\n.step.accessible:hover {\n background: #e9ecef;\n}\n\n.step.accessible.active:hover {\n background: #0056b3;\n}\n\n.step.locked {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.step-icon {\n font-size: 24px;\n margin-right: 10px;\n}\n\n.step-info {\n flex: 1;\n}\n\n.step-name {\n font-weight: bold;\n font-size: 16px;\n}\n\n.step-description {\n font-size: 12px;\n opacity: 0.8;\n}\n\n.step-arrow {\n font-size: 20px;\n margin-left: 10px;\n opacity: 0.5;\n}\n\n.step.active .step-arrow {\n display: none;\n}\n\n/* Content Area */\n.step-content {\n background: white;\n border-radius: 10px;\n padding: 30px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n min-height: 600px;\n}\n\n/* Project Creation Styles */\n.project-creation {\n max-width: 800px;\n margin: 0 auto;\n}\n\n.section-header {\n text-align: center;\n margin-bottom: 30px;\n}\n\n.section-header h3 {\n margin: 0 0 10px 0;\n color: #2c3e50;\n font-size: 28px;\n}\n\n.section-header p {\n color: #6c757d;\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n}\n\n.toggle-btn {\n padding: 10px 20px;\n border: 2px solid #007bff;\n background: white;\n color: #007bff;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.toggle-btn.active {\n background: #007bff;\n color: white;\n}\n\n.toggle-btn:hover {\n background: #007bff;\n color: white;\n}\n\n/* Form Styles */\n.form-container {\n max-width: 600px;\n margin: 0 auto;\n}\n\n.project-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n}\n\n.form-group {\n display: flex;\n flex-direction: column;\n}\n\n.form-group.full-width {\n grid-column: 1 / -1;\n}\n\n.form-group.checkbox-group {\n flex-direction: row;\n align-items: center;\n}\n\n.form-group.checkbox-group input {\n margin-right: 8px;\n width: auto;\n}\n\n.form-group label {\n font-weight: bold;\n margin-bottom: 5px;\n color: #2c3e50;\n}\n\n.form-group input,\n.form-group select,\n.form-group textarea {\n padding: 12px;\n border: 1px solid #ced4da;\n border-radius: 5px;\n font-size: 14px;\n transition: border-color 0.3s ease;\n}\n\n.form-group input:focus,\n.form-group select:focus,\n.form-group textarea:focus {\n border-color: #007bff;\n outline: none;\n box-shadow: 0 0 0 2px rgba(0,123,255,0.25);\n}\n\n.submit-btn {\n width: 100%;\n padding: 15px;\n background: #28a745;\n color: white;\n border: none;\n border-radius: 5px;\n font-size: 16px;\n font-weight: bold;\n cursor: pointer;\n margin-top: 20px;\n transition: background 0.3s ease;\n}\n\n.submit-btn:hover {\n background: #218838;\n}\n\n.submit-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #f5c6cb;\n margin: 15px 0;\n}\n\n/* Existing Projects */\n.existing-projects {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.no-projects {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.create-first-btn {\n padding: 12px 24px;\n background: #007bff;\n color: white;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n margin-top: 20px;\n}\n\n.projects-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.project-card {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.project-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n border-color: #007bff;\n}\n\n.project-card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.project-card-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n color: white;\n font-size: 12px;\n font-weight: bold;\n}\n\n.project-card-body p {\n margin: 8px 0;\n color: #6c757d;\n font-size: 14px;\n}\n\n.project-card-footer {\n margin-top: 15px;\n text-align: center;\n}\n\n.continue-text {\n color: #007bff;\n font-size: 12px;\n font-weight: bold;\n}\n\n/* Geometry Input Styles */\n.geometry-input {\n max-width: 800px;\n margin: 0 auto;\n}\n\n.geometry-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.calculations-display {\n background: #e3f2fd;\n padding: 20px;\n border-radius: 8px;\n margin: 20px 0;\n border: 1px solid #bbdefb;\n}\n\n.calculations-display h4 {\n margin: 0 0 15px 0;\n color: #1976d2;\n}\n\n.calc-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n\n.calc-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: white;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #bbdefb;\n}\n\n.calc-label {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.calc-value {\n color: #1976d2;\n font-weight: bold;\n}\n\n/* Labor Input Styles */\n.labor-input {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.labor-form {\n background: #f8f9fa;\n padding: 30px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.labor-overview {\n background: #fff3cd;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #ffeaa7;\n}\n\n.overview-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 20px;\n}\n\n.overview-item {\n display: flex;\n flex-direction: column;\n}\n\n.overview-item label {\n font-weight: bold;\n margin-bottom: 5px;\n color: #2c3e50;\n}\n\n.overview-item input {\n padding: 10px;\n border: 1px solid #ced4da;\n border-radius: 5px;\n}\n\n.overview-item input.fixed-rate {\n background: #e9ecef;\n}\n\n.overview-item small {\n margin-top: 5px;\n color: #6c757d;\n font-size: 12px;\n}\n\n.calculations {\n display: flex;\n gap: 30px;\n justify-content: center;\n margin-top: 20px;\n}\n\n.work-breakdown {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin: 20px 0;\n}\n\n.work-breakdown h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.breakdown-list {\n display: flex;\n flex-direction: column;\n gap: 15px;\n}\n\n.breakdown-item {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.breakdown-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 10px;\n}\n\n.hours-inputs {\n display: flex;\n gap: 15px;\n align-items: flex-end;\n}\n\n.hour-input-group {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 5px;\n}\n\n.hour-input-group label {\n font-size: 12px;\n color: #6c757d;\n font-weight: 500;\n}\n\n.hours-input {\n width: 80px;\n padding: 5px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n text-align: center;\n}\n\n.hours-input.allocated {\n border-color: #28a745;\n background-color: #f8fff9;\n}\n\n.description-input {\n width: 100%;\n padding: 8px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n}\n\n.breakdown-totals {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.total-row {\n text-align: center;\n padding: 12px;\n background: #d4edda;\n border-radius: 5px;\n color: #155724;\n}\n\n.total-row.allocated {\n background: #d1ecf1;\n color: #0c5460;\n}\n\n/* Materials Manager Styles */\n.materials-manager {\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.suggestions-section {\n background: #d1ecf1;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #bee5eb;\n}\n\n.suggestions-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.suggestions-header h4 {\n margin: 0;\n color: #0c5460;\n}\n\n.hide-suggestions-btn {\n background: none;\n border: none;\n color: #0c5460;\n cursor: pointer;\n font-size: 16px;\n}\n\n.suggestions-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 15px;\n}\n\n.suggestion-card {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #bee5eb;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.suggestion-info {\n flex: 1;\n}\n\n.suggestion-info strong {\n color: #2c3e50;\n}\n\n.suggestion-info p {\n margin: 5px 0;\n color: #6c757d;\n font-size: 14px;\n}\n\n.suggestion-details {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.add-suggestion-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 8px 12px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.add-suggestion-btn:hover {\n background: #218838;\n}\n\n.add-material-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.add-material-section h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.material-form {\n display: flex;\n flex-direction: column;\n}\n\n.total-display {\n background: #d4edda;\n color: #155724;\n padding: 15px;\n border-radius: 5px;\n text-align: center;\n border: 1px solid #c3e6cb;\n}\n\n.add-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n margin-top: 15px;\n}\n\n.add-btn:hover {\n background: #0056b3;\n}\n\n.add-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.materials-list {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 20px;\n}\n\n.materials-list h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.material-category {\n margin-bottom: 25px;\n}\n\n.material-category h5 {\n margin: 0 0 10px 0;\n color: #495057;\n font-size: 16px;\n padding-bottom: 5px;\n border-bottom: 1px solid #e9ecef;\n}\n\n.materials-table {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.material-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.material-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.material-info strong {\n color: #2c3e50;\n}\n\n.material-info span {\n color: #6c757d;\n font-size: 14px;\n}\n\n.material-actions {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.material-total {\n font-weight: bold;\n color: #28a745;\n font-size: 16px;\n}\n\n.edit-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 6px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.edit-btn:hover {\n background: #0056b3;\n}\n\n.remove-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 6px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.remove-btn:hover {\n background: #c82333;\n}\n\n/* Material Edit Form Styles */\n.material-edit-form {\n width: 100%;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 5px;\n padding: 15px;\n}\n\n.edit-row {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n margin-bottom: 15px;\n align-items: center;\n}\n\n.edit-inputs {\n display: flex;\n gap: 15px;\n flex-wrap: wrap;\n}\n\n.input-group {\n display: flex;\n align-items: center;\n gap: 5px;\n min-width: 150px;\n}\n\n.input-group label {\n font-size: 12px;\n color: #6c757d;\n min-width: 70px;\n}\n\n.input-group input {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid #ced4da;\n border-radius: 3px;\n font-size: 14px;\n}\n\n.input-group span {\n font-size: 12px;\n color: #6c757d;\n min-width: 30px;\n}\n\n.edit-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n margin-top: 10px;\n border-top: 1px solid #dee2e6;\n padding-top: 10px;\n}\n\n.save-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.save-btn:hover {\n background: #218838;\n}\n\n.save-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.cancel-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.cancel-btn:hover {\n background: #545b62;\n}\n\n.materials-summary {\n background: #e9ecef;\n padding: 20px;\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.summary-item {\n display: flex;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n\n.summary-item.total {\n font-size: 18px;\n color: #28a745;\n border-top: 1px solid #ced4da;\n padding-top: 10px;\n margin-top: 15px;\n}\n\n/* Calculation View Styles */\n.calculation-view {\n max-width: 1000px;\n margin: 0 auto;\n}\n\n.project-summary {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n border: 1px solid #e9ecef;\n}\n\n.project-summary h4 {\n margin: 0 0 15px 0;\n color: #2c3e50;\n}\n\n.summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n}\n\n.summary-item {\n background: white;\n padding: 12px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n display: flex;\n justify-content: space-between;\n}\n\n.calculation-section {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.calculation-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n}\n\n.calculation-header h4 {\n margin: 0;\n color: #2c3e50;\n}\n\n.calculate-btn {\n background: #17a2b8;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.calculate-btn:hover {\n background: #138496;\n}\n\n.calculate-btn:disabled {\n background: #6c757d;\n cursor: not-allowed;\n}\n\n.calculation-results {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.calculation-breakdown {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.breakdown-section {\n background: white;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.breakdown-section h5 {\n margin: 0 0 10px 0;\n color: #495057;\n}\n\n.breakdown-item {\n display: flex;\n justify-content: space-between;\n margin-bottom: 8px;\n padding: 5px 0;\n}\n\n.breakdown-item.total {\n border-top: 2px solid #28a745;\n padding-top: 10px;\n margin-top: 10px;\n font-size: 18px;\n color: #28a745;\n}\n\n.quote-generation {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n margin-bottom: 30px;\n}\n\n.quote-generation h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.quote-options {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 20px;\n}\n\n.options-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 15px;\n}\n\n.quote-buttons {\n display: flex;\n gap: 15px;\n justify-content: center;\n margin-bottom: 20px;\n}\n\n.static-quote-btn {\n background: #28a745;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.static-quote-btn:hover {\n background: #218838;\n}\n\n.ai-quote-btn {\n background: #6f42c1;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.ai-quote-btn:hover {\n background: #5a32a3;\n}\n\n.html-quote-btn {\n background: #fd7e14;\n color: white;\n border: none;\n padding: 15px 25px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n}\n\n.html-quote-btn:hover {\n background: #e96500;\n}\n\n.quote-info {\n background: #d1ecf1;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #bee5eb;\n}\n\n.quote-info p {\n margin: 5px 0;\n color: #0c5460;\n font-size: 14px;\n}\n\n.quotes-list {\n background: white;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n}\n\n.quotes-list h4 {\n margin: 0 0 20px 0;\n color: #2c3e50;\n}\n\n.quotes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n.quote-card {\n background: #f8f9fa;\n padding: 15px;\n border-radius: 5px;\n border: 1px solid #e9ecef;\n}\n\n.quote-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.quote-id {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.quote-date {\n font-size: 12px;\n color: #6c757d;\n}\n\n.quote-info {\n margin-bottom: 15px;\n}\n\n.quote-info p {\n margin: 5px 0;\n font-size: 14px;\n color: #495057;\n}\n\n.quote-actions {\n text-align: center;\n display: flex;\n gap: 5px;\n flex-wrap: wrap;\n justify-content: center;\n}\n\n.view-quote-btn {\n background: #007bff;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.view-quote-btn:hover {\n background: #0056b3;\n}\n\n.pdf-download-btn {\n background: #dc3545;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.pdf-download-btn:hover {\n background: #c82333;\n}\n\n.pdf-generate-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 15px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.pdf-generate-btn:hover {\n background: #545b62;\n}\n\n.pdf-generate-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .step-navigation {\n flex-direction: column;\n gap: 10px;\n }\n \n .step {\n min-width: auto;\n }\n \n .step-arrow {\n display: none;\n }\n \n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .overview-grid {\n grid-template-columns: 1fr;\n }\n \n .calc-grid {\n grid-template-columns: 1fr;\n }\n \n .summary-grid {\n grid-template-columns: 1fr;\n }\n \n .projects-grid {\n grid-template-columns: 1fr;\n }\n \n .suggestions-grid {\n grid-template-columns: 1fr;\n }\n \n .quotes-grid {\n grid-template-columns: 1fr;\n }\n \n .quote-buttons {\n flex-direction: column;\n }\n}\n\n/* Project Card Action Buttons */\n.project-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 15px;\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.card-actions {\n display: flex;\n gap: 5px;\n}\n\n.action-btn {\n background: none;\n border: none;\n padding: 5px;\n cursor: pointer;\n border-radius: 4px;\n font-size: 14px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.action-btn:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n}\n\n.edit-btn {\n background: #ffc107;\n color: #212529;\n}\n\n.edit-btn:hover {\n background: #e0a800;\n}\n\n.delete-btn {\n background: #dc3545;\n color: white;\n}\n\n.delete-btn:hover {\n background: #c82333;\n}\n\n/* Form Actions */\n.form-actions {\n display: flex;\n gap: 15px;\n align-items: center;\n}\n\n.cancel-btn {\n background: #6c757d;\n color: white;\n border: none;\n padding: 12px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s ease;\n}\n\n.cancel-btn:hover {\n background: #5a6268;\n}\n","/* ProjectReview CSS */\n.project-review {\n padding: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.project-review h2 {\n margin-bottom: 20px;\n color: #2c3e50;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.error-message {\n background-color: #e74c3c;\n color: white;\n padding: 15px;\n border-radius: 5px;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.project-review-layout {\n display: grid;\n grid-template-columns: 400px 1fr;\n gap: 30px;\n height: calc(100vh - 200px);\n}\n\n/* Project List */\n.project-list {\n background: #f8f9fa;\n border-radius: 10px;\n padding: 20px;\n overflow-y: auto;\n border: 1px solid #dee2e6;\n}\n\n.project-list h3 {\n margin-top: 0;\n margin-bottom: 20px;\n color: #495057;\n text-align: center;\n padding-bottom: 10px;\n border-bottom: 1px solid #dee2e6;\n}\n\n.project-item {\n background: white;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 15px;\n margin-bottom: 15px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.project-item:hover {\n border-color: #3498db;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n}\n\n.project-item.selected {\n border-color: #27ae60;\n background: #e8f5e8;\n box-shadow: 0 4px 12px rgba(39, 174, 96, 0.2);\n}\n\n.project-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n}\n\n.project-header h4 {\n margin: 0;\n color: #2c3e50;\n font-size: 16px;\n}\n\n.status-badge {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n text-transform: uppercase;\n}\n\n.status-badge.active { background: #d4edda; color: #155724; }\n.status-badge.completed { background: #cce5ff; color: #004085; }\n.status-badge.pending { background: #fff3cd; color: #856404; }\n.status-badge.cancelled { background: #f8d7da; color: #721c24; }\n\n.project-details p {\n margin: 5px 0;\n font-size: 14px;\n color: #6c757d;\n}\n\n.project-stats {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid #e9ecef;\n}\n\n.project-stats span {\n background: #e9ecef;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 12px;\n color: #495057;\n}\n\n/* Project Details Panel */\n.project-details-panel {\n background: white;\n border-radius: 10px;\n padding: 25px;\n overflow-y: auto;\n border: 1px solid #dee2e6;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n\n.project-details-panel h3 {\n margin-top: 0;\n margin-bottom: 25px;\n color: #2c3e50;\n font-size: 24px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.project-details-panel h4 {\n color: #34495e;\n margin-top: 30px;\n margin-bottom: 15px;\n font-size: 18px;\n border-bottom: 1px solid #ecf0f1;\n padding-bottom: 8px;\n}\n\n/* Project Steps */\n.steps-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin-bottom: 25px;\n}\n\n.step-item {\n background: #f8f9fa;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 15px;\n text-align: center;\n transition: all 0.3s ease;\n}\n\n.step-item.completed {\n background: #d4edda;\n border-color: #c3e6cb;\n}\n\n.step-item.pending {\n background: #fff3cd;\n border-color: #ffeaa7;\n}\n\n.step-status {\n font-size: 18px;\n font-weight: bold;\n margin-bottom: 8px;\n}\n\n.step-title {\n font-weight: 600;\n color: #495057;\n text-transform: capitalize;\n margin-bottom: 5px;\n}\n\n.step-timestamp {\n font-size: 12px;\n color: #6c757d;\n}\n\n/* Geometry Section */\n.geometry-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 15px;\n margin-bottom: 15px;\n}\n\n.geometry-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 6px;\n padding: 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.geometry-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.geometry-item span {\n font-weight: bold;\n color: #2c3e50;\n}\n\n.geometry-notes {\n background: #e3f2fd;\n border-left: 4px solid #2196f3;\n padding: 15px;\n margin-top: 15px;\n border-radius: 0 6px 6px 0;\n color: #1565c0;\n}\n\n/* Quotes Section */\n.quotes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 20px;\n margin-bottom: 25px;\n}\n\n.quote-item {\n background: #f8f9fa;\n border: 2px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.quote-item:hover {\n border-color: #3498db;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(52, 152, 219, 0.2);\n}\n\n.quote-item.selected {\n border-color: #e74c3c;\n background: #fdf2f2;\n box-shadow: 0 4px 12px rgba(231, 76, 60, 0.2);\n}\n\n.quote-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15px;\n}\n\n.quote-header h5 {\n margin: 0;\n color: #2c3e50;\n}\n\n.delivery-status {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n}\n\n.delivery-status.delivered {\n background: #d4edda;\n color: #155724;\n}\n\n.delivery-status.draft {\n background: #fff3cd;\n color: #856404;\n}\n\n.quote-amounts {\n margin-bottom: 15px;\n}\n\n.amount-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.amount-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.total-amount {\n font-size: 18px;\n font-weight: bold;\n color: #27ae60;\n}\n\n.amount-breakdown {\n display: flex;\n flex-direction: column;\n gap: 5px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.quote-method {\n background: #e3f2fd;\n padding: 8px 12px;\n border-radius: 6px;\n margin-bottom: 10px;\n font-size: 14px;\n color: #1565c0;\n}\n\n.quote-date {\n font-size: 12px;\n color: #6c757d;\n text-align: right;\n}\n\n/* Quote Details */\n.quote-details {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 25px;\n margin-top: 25px;\n}\n\n.quote-details h4 {\n margin-top: 0;\n color: #e74c3c;\n}\n\n.quote-details h5 {\n color: #495057;\n margin-bottom: 10px;\n border-bottom: 1px solid #dee2e6;\n padding-bottom: 5px;\n}\n\n.quote-content {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n padding: 15px;\n margin-bottom: 20px;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.materials-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n background: white;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #dee2e6;\n}\n\n.materials-table th,\n.materials-table td {\n padding: 12px;\n text-align: left;\n border-bottom: 1px solid #e9ecef;\n}\n\n.materials-table th {\n background: #f8f9fa;\n font-weight: 600;\n color: #495057;\n}\n\n.materials-table tr:last-child td {\n border-bottom: none;\n}\n\n.materials-table tr:hover {\n background: #f8f9fa;\n}\n\n.quote-responses {\n display: grid;\n gap: 15px;\n}\n\n.response-item {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.response-item label {\n font-weight: 600;\n color: #495057;\n}\n\n.response-item span {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 6px;\n padding: 10px;\n color: #495057;\n}\n\n.loading {\n text-align: center;\n padding: 20px;\n color: #6c757d;\n font-style: italic;\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .project-review-layout {\n grid-template-columns: 1fr;\n height: auto;\n }\n \n .project-list {\n height: 400px;\n }\n \n .quotes-grid {\n grid-template-columns: 1fr;\n }\n \n .steps-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n \n .geometry-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .project-review {\n padding: 10px;\n }\n \n .steps-grid,\n .geometry-grid {\n grid-template-columns: 1fr;\n }\n \n .project-stats {\n flex-direction: column;\n gap: 5px;\n }\n \n .quote-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 10px;\n }\n}\n",".completed-quotes-view {\n padding: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.quotes-header {\n margin-bottom: 30px;\n}\n\n.quotes-header h2 {\n color: #2c3e50;\n margin-bottom: 10px;\n}\n\n.quotes-header p {\n color: #7f8c8d;\n margin-bottom: 20px;\n}\n\n.quotes-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.filter-controls {\n display: flex;\n gap: 15px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-controls label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.filter-controls select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n min-width: 120px;\n}\n\n.refresh-btn {\n padding: 10px 16px;\n background: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n transition: background-color 0.2s;\n}\n\n.refresh-btn:hover {\n background: #2980b9;\n}\n\n.quotes-summary {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n}\n\n.summary-stats {\n display: flex;\n gap: 30px;\n justify-content: center;\n flex-wrap: wrap;\n}\n\n.stat-item {\n text-align: center;\n}\n\n.stat-label {\n display: block;\n color: #7f8c8d;\n font-size: 14px;\n margin-bottom: 5px;\n}\n\n.stat-value {\n display: block;\n font-size: 24px;\n font-weight: bold;\n color: #2c3e50;\n}\n\n.quotes-table-container {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n\n.quotes-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.quotes-table th {\n background: #34495e;\n color: white;\n padding: 15px 12px;\n text-align: left;\n font-weight: 600;\n font-size: 14px;\n}\n\n.quotes-table td {\n padding: 12px;\n border-bottom: 1px solid #ecf0f1;\n vertical-align: middle;\n}\n\n.quote-row:hover {\n background: #f8f9fa;\n}\n\n.quote-row.newest-quote {\n background: #e8f5e8;\n border-left: 4px solid #27ae60;\n transition: all 0.3s ease;\n}\n\n.quote-row.newest-quote:hover {\n background: #d5f4d5;\n}\n\n.project-name {\n font-weight: 500;\n color: #2c3e50;\n}\n\n.quote-type {\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n display: inline-block;\n}\n\n.quote-type.static {\n background: #e8f5e8;\n color: #27ae60;\n}\n\n.quote-type.ai {\n background: #e3f2fd;\n color: #2196f3;\n}\n\n.quote-total {\n font-weight: 600;\n color: #27ae60;\n}\n\n.ai-cost {\n color: #7f8c8d;\n font-size: 14px;\n}\n\n.actions {\n display: flex;\n gap: 8px;\n}\n\n.view-btn, .download-btn, .delete-btn {\n padding: 6px 10px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n transition: background-color 0.2s;\n}\n\n.view-btn {\n background: #3498db;\n color: white;\n}\n\n.view-btn:hover {\n background: #2980b9;\n}\n\n.download-btn {\n background: #95a5a6;\n color: white;\n}\n\n.download-btn:hover {\n background: #7f8c8d;\n}\n\n.delete-btn {\n background: #e74c3c;\n color: white;\n}\n\n.delete-btn:hover {\n background: #c0392b;\n}\n\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: #7f8c8d;\n}\n\n.empty-state p {\n font-size: 18px;\n margin: 0;\n}\n\n.loading-state {\n text-align: center;\n padding: 60px 20px;\n}\n\n.loading-spinner {\n border: 3px solid #f3f3f3;\n border-top: 3px solid #3498db;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 15px;\n border-radius: 6px;\n margin-bottom: 20px;\n border: 1px solid #f5c6cb;\n}\n\n/* Quote Modal */\n.quote-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n}\n\n.quote-modal {\n background: white;\n border-radius: 8px;\n width: 100%;\n max-width: 800px;\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid #ecf0f1;\n}\n\n.modal-header h3 {\n margin: 0;\n color: #2c3e50;\n}\n\n.close-btn {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n color: #7f8c8d;\n padding: 5px;\n border-radius: 4px;\n transition: background-color 0.2s;\n}\n\n.close-btn:hover {\n background: #ecf0f1;\n}\n\n.modal-content {\n padding: 24px;\n}\n\n.quote-meta {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 6px;\n margin-bottom: 20px;\n}\n\n.meta-row {\n display: flex;\n margin-bottom: 8px;\n}\n\n.meta-row:last-child {\n margin-bottom: 0;\n}\n\n.meta-row strong {\n min-width: 120px;\n color: #34495e;\n}\n\n.quote-text h4 {\n color: #2c3e50;\n margin-bottom: 12px;\n}\n\n.quote-content {\n background: #f8f9fa;\n padding: 16px;\n border-radius: 6px;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n max-height: 400px;\n overflow-y: auto;\n border: 1px solid #e9ecef;\n}\n\n.modal-actions {\n padding: 20px 24px;\n border-top: 1px solid #ecf0f1;\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.modal-actions .download-btn {\n background: #27ae60;\n}\n\n.modal-actions .download-btn:hover {\n background: #229954;\n}\n\n.modal-actions .close-btn {\n background: #95a5a6;\n color: white;\n padding: 10px 16px;\n border-radius: 4px;\n}\n\n.modal-actions .close-btn:hover {\n background: #7f8c8d;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .completed-quotes-view {\n padding: 15px;\n }\n \n .quotes-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .filter-controls {\n justify-content: center;\n }\n \n .summary-stats {\n gap: 15px;\n }\n \n .quotes-table-container {\n overflow-x: auto;\n }\n \n .quotes-table {\n min-width: 700px;\n }\n \n .quote-modal {\n margin: 10px;\n max-height: 95vh;\n }\n \n .modal-content {\n padding: 16px;\n }\n \n .modal-actions {\n padding: 16px;\n flex-direction: column;\n }\n}\n\n/* Enhanced Table Styles */\n.enhanced-table {\n min-width: 1200px;\n}\n\n.enhanced-table th {\n background: linear-gradient(135deg, #2c3e50, #34495e);\n color: white;\n padding: 15px 10px;\n text-align: left;\n font-weight: 600;\n}\n\n.enhanced-table .quote-row:hover {\n background: #f8f9fa;\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n}\n\n/* Cell Styles */\n.date-cell {\n width: 120px;\n}\n\n.date-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.date-main {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.quote-id {\n font-size: 11px;\n color: #7f8c8d;\n background: #ecf0f1;\n padding: 2px 6px;\n border-radius: 10px;\n text-align: center;\n}\n\n.project-cell {\n min-width: 200px;\n}\n\n.project-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.project-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.project-type {\n font-size: 12px;\n color: #3498db;\n background: rgba(52, 152, 219, 0.1);\n padding: 2px 6px;\n border-radius: 10px;\n display: inline-block;\n width: fit-content;\n}\n\n.project-description {\n font-size: 11px;\n color: #7f8c8d;\n font-style: italic;\n}\n\n.customer-cell {\n min-width: 180px;\n}\n\n.customer-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.customer-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.customer-email,\n.customer-phone {\n font-size: 11px;\n color: #7f8c8d;\n}\n\n.measurements-cell {\n min-width: 140px;\n}\n\n.measurements-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.roof-type,\n.area,\n.work-hours,\n.workers {\n font-size: 12px;\n color: #2c3e50;\n background: rgba(46, 204, 113, 0.1);\n padding: 2px 6px;\n border-radius: 8px;\n width: fit-content;\n}\n\n.materials-cell {\n min-width: 120px;\n}\n\n.materials-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.material-count {\n font-size: 12px;\n font-weight: 600;\n color: #e67e22;\n}\n\n.material-categories {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.material-category {\n font-size: 10px;\n background: rgba(230, 126, 34, 0.1);\n color: #e67e22;\n padding: 1px 4px;\n border-radius: 6px;\n width: fit-content;\n}\n\n.more-categories {\n font-size: 10px;\n color: #95a5a6;\n font-style: italic;\n}\n\n.pricing-cell {\n min-width: 140px;\n}\n\n.pricing-info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.total-price {\n font-size: 14px;\n font-weight: 700;\n color: #27ae60;\n}\n\n.labor-cost,\n.material-cost {\n font-size: 11px;\n color: #7f8c8d;\n}\n\n.quote-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 8px;\n width: fit-content;\n margin-top: 4px;\n}\n\n.quote-badge.static {\n background: rgba(149, 165, 166, 0.2);\n color: #95a5a6;\n}\n\n.quote-badge.ai {\n background: rgba(155, 89, 182, 0.2);\n color: #9b59b6;\n}\n\n.actions-cell {\n min-width: 160px;\n}\n\n.actions-buttons {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.action-btn {\n padding: 4px 8px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.2s;\n text-align: left;\n width: 100%;\n}\n\n.view-btn {\n background: #3498db;\n color: white;\n}\n\n.view-btn:hover {\n background: #2980b9;\n transform: scale(1.02);\n}\n\n.pdf-btn {\n background: #e74c3c;\n color: white;\n}\n\n.pdf-btn:hover {\n background: #c0392b;\n transform: scale(1.02);\n}\n\n.generate-pdf-btn {\n background: #9b59b6;\n color: white;\n font-size: 0.85rem;\n}\n\n.generate-pdf-btn:hover {\n background: #8e44ad;\n transform: scale(1.02);\n}\n\n.generate-pdf-btn:disabled {\n background: #bdc3c7;\n cursor: not-allowed;\n transform: none;\n}\n\n.generate-pdf-btn.disabled {\n background: #95a5a6;\n cursor: not-allowed;\n transform: none;\n opacity: 0.6;\n}\n\n.download-btn {\n background: #27ae60;\n color: white;\n}\n\n.download-btn:hover {\n background: #229954;\n transform: scale(1.02);\n}\n\n.delete-btn {\n background: #e67e22;\n color: white;\n}\n\n.delete-btn:hover {\n background: #d35400;\n transform: scale(1.02);\n}\n\n/* Enhanced Modal Styles */\n.enhanced-modal {\n max-width: 900px;\n max-height: 90vh;\n width: 90vw;\n}\n\n.overview-section {\n background: #f8f9fa;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.overview-section h4 {\n margin: 0 0 12px 0;\n color: #2c3e50;\n font-size: 16px;\n border-bottom: 2px solid #3498db;\n padding-bottom: 8px;\n}\n\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 12px;\n}\n\n.info-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.info-item.full-width {\n grid-column: 1 / -1;\n}\n\n.info-item .label {\n font-size: 12px;\n color: #7f8c8d;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.info-item .value {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.material-categories-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 4px;\n}\n\n.category-tag {\n background: rgba(230, 126, 34, 0.1);\n color: #e67e22;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.pricing-breakdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.price-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border-left: 4px solid #3498db;\n}\n\n.price-item.total-price {\n border-left-color: #27ae60;\n background: rgba(39, 174, 96, 0.05);\n}\n\n.price-label {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.price-value {\n font-size: 14px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.price-value.total {\n font-size: 18px;\n color: #27ae60;\n}\n\n.quote-text-section {\n background: #ffffff;\n border: 1px solid #ecf0f1;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.quote-text-section h4 {\n background: #34495e;\n color: white;\n margin: 0;\n padding: 12px 16px;\n}\n\n.quote-content {\n max-height: 400px;\n overflow-y: auto;\n padding: 16px;\n margin: 0;\n font-family: 'Courier New', monospace;\n font-size: 12px;\n line-height: 1.4;\n background: #fafafa;\n}\n\n/* Responsive adjustments for enhanced version */\n@media (max-width: 1200px) {\n .enhanced-table {\n min-width: 1000px;\n }\n \n .info-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 768px) {\n .enhanced-table {\n min-width: 800px;\n }\n \n .enhanced-modal {\n width: 95vw;\n max-height: 95vh;\n }\n \n .overview-section {\n padding: 12px;\n }\n \n .actions-buttons {\n flex-direction: row;\n flex-wrap: wrap;\n }\n \n .action-btn {\n flex: 1;\n min-width: 70px;\n }\n}\n","/* MaterialsList.css - Based on CompletedQuotes design patterns */\n\n.materials-list-view {\n padding: 0;\n width: 100%;\n max-width: 100%;\n margin: 0;\n background: #f8f9fa;\n min-height: 100vh;\n}\n\n.materials-header {\n background: white;\n padding: 24px;\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 0;\n}\n\n.materials-header h2 {\n margin: 0 0 8px 0;\n color: #2c3e50;\n font-size: 28px;\n font-weight: 600;\n}\n\n.materials-header p {\n margin: 0 0 24px 0;\n color: #666;\n font-size: 16px;\n}\n\n.materials-controls {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.filter-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n align-items: end;\n}\n\n.filter-controls label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 150px;\n}\n\n.filter-controls label span {\n font-weight: 500;\n color: #555;\n font-size: 14px;\n}\n\n.filter-controls input,\n.filter-controls select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s;\n}\n\n.filter-controls input:focus,\n.filter-controls select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.search-input {\n min-width: 250px;\n}\n\n.action-controls {\n display: flex;\n gap: 12px;\n align-items: center;\n}\n\n.add-btn,\n.refresh-btn {\n padding: 10px 16px;\n border: none;\n border-radius: 6px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 14px;\n}\n\n.add-btn {\n background: #27ae60;\n color: white;\n}\n\n.add-btn:hover {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.refresh-btn {\n background: #f1f2f6;\n color: #2c3e50;\n border: 1px solid #ddd;\n}\n\n.refresh-btn:hover {\n background: #e1e2e6;\n}\n\n.refresh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* New Material Form */\n.new-material-form {\n margin-top: 24px;\n padding: 20px;\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n}\n\n.new-material-form h4 {\n margin: 0 0 16px 0;\n color: #2c3e50;\n font-size: 18px;\n}\n\n.form-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.form-grid input,\n.form-grid select {\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.form-grid input:focus,\n.form-grid select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.form-actions {\n display: flex;\n gap: 12px;\n}\n\n.save-btn {\n background: #27ae60;\n color: white;\n border: none;\n padding: 10px 20px;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.save-btn:hover:not(:disabled) {\n background: #229954;\n transform: translateY(-1px);\n}\n\n.save-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n/* Error Message */\n.error-message {\n background: #fee;\n color: #c62828;\n padding: 12px 16px;\n border-radius: 6px;\n margin: 16px 24px;\n border: 1px solid #ffcdd2;\n font-weight: 500;\n}\n\n/* Summary Stats */\n.materials-summary {\n background: white;\n padding: 20px 24px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.summary-stats {\n display: flex;\n gap: 32px;\n flex-wrap: wrap;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat-label {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Loading and Empty States */\n.loading-state,\n.empty-state {\n text-align: center;\n padding: 60px 24px;\n background: white;\n color: #666;\n}\n\n.loading-state p,\n.empty-state p {\n font-size: 18px;\n margin: 8px 0;\n}\n\n/* Materials Table */\n.materials-table-container {\n background: white;\n overflow: auto;\n border-radius: 0;\n position: relative;\n}\n\n.materials-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n table-layout: fixed;\n}\n\n.materials-table th {\n background: #f8f9fa;\n padding: 16px 12px;\n text-align: left;\n font-weight: 600;\n color: #2c3e50;\n border-bottom: 2px solid #e0e0e0;\n position: sticky;\n top: 0;\n z-index: 10;\n}\n\n/* Sticky actions column */\n.materials-table th:last-child {\n position: sticky;\n right: 0;\n z-index: 11;\n background: #f8f9fa;\n box-shadow: -2px 0 4px rgba(0,0,0,0.1);\n}\n\n.materials-table td {\n padding: 12px;\n border-bottom: 1px solid #f0f0f0;\n vertical-align: middle;\n}\n\n/* Sticky actions column for data cells */\n.materials-table td:last-child {\n position: sticky;\n right: 0;\n background: white;\n box-shadow: -2px 0 4px rgba(0,0,0,0.1);\n}\n\n.material-row:hover {\n background: #f8f9fa;\n}\n\n.material-row:hover td:last-child {\n background: #f8f9fa;\n}\n\n.material-row:nth-child(even) {\n background: #fafbfc;\n}\n\n.material-row:nth-child(even) td:last-child {\n background: #fafbfc;\n}\n\n.material-row:nth-child(even):hover {\n background: #f0f2f5;\n}\n\n.material-row:nth-child(even):hover td:last-child {\n background: #f0f2f5;\n}\n\n/* Column widths */\n.materials-table th:nth-child(1),\n.materials-table td:nth-child(1) { width: 22%; } /* Material name */\n.materials-table th:nth-child(2),\n.materials-table td:nth-child(2) { width: 12%; } /* Category */\n.materials-table th:nth-child(3),\n.materials-table td:nth-child(3) { width: 8%; } /* Unit */\n.materials-table th:nth-child(4),\n.materials-table td:nth-child(4) { width: 10%; } /* Price */\n.materials-table th:nth-child(5),\n.materials-table td:nth-child(5) { width: 15%; } /* Supplier */\n.materials-table th:nth-child(6),\n.materials-table td:nth-child(6) { width: 23%; } /* Description */\n.materials-table th:nth-child(7),\n.materials-table td:nth-child(7) { width: 10%; min-width: 120px; } /* Actions - sticky */\n\n/* Table Cell Styles */\n.material-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.category-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #e3f2fd;\n color: #1976d2;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.unit-cell {\n color: #666;\n font-size: 13px;\n}\n\n.price-cell {\n font-weight: 600;\n color: #27ae60;\n font-family: 'Courier New', monospace;\n}\n\n.supplier-cell {\n color: #666;\n}\n\n.description-cell {\n color: #666;\n font-size: 13px;\n max-width: 200px;\n word-wrap: break-word;\n}\n\n/* Actions */\n.actions {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n.edit-btn,\n.delete-btn,\n.save-edit-btn,\n.cancel-edit-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px;\n border-radius: 4px;\n transition: all 0.2s;\n font-size: 16px;\n}\n\n.edit-btn:hover {\n background: #e3f2fd;\n transform: scale(1.1);\n}\n\n.delete-btn:hover {\n background: #ffebee;\n transform: scale(1.1);\n}\n\n.save-edit-btn:hover {\n background: #e8f5e8;\n transform: scale(1.1);\n}\n\n.cancel-edit-btn:hover {\n background: #ffebee;\n transform: scale(1.1);\n}\n\n/* Edit Form Inputs */\n.edit-input,\n.edit-select {\n width: 100%;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 13px;\n}\n\n.edit-input:focus,\n.edit-select:focus {\n outline: none;\n border-color: #4a90e2;\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .filter-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .filter-controls label {\n min-width: auto;\n }\n \n .summary-stats {\n gap: 16px;\n }\n \n .materials-table {\n font-size: 13px;\n }\n \n .materials-table th,\n .materials-table td {\n padding: 10px 8px;\n }\n}\n\n@media (max-width: 768px) {\n .materials-header {\n padding: 16px;\n }\n \n .materials-summary {\n padding: 16px;\n }\n \n .action-controls {\n flex-direction: column;\n align-items: stretch;\n }\n \n .form-grid {\n grid-template-columns: 1fr;\n }\n \n .materials-table-container {\n overflow-x: auto;\n }\n \n .materials-table {\n min-width: 800px;\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/js/main.236c063a.js b/build/static/js/main.236c063a.js new file mode 100644 index 0000000..301b26b --- /dev/null +++ b/build/static/js/main.236c063a.js @@ -0,0 +1,3 @@ +/*! For license information please see main.236c063a.js.LICENSE.txt */ +(()=>{"use strict";var e={43:(e,t,n)=>{e.exports=n(202)},153:(e,t,n)=>{var r=n(43),a=Symbol.for("react.element"),l=Symbol.for("react.fragment"),s=Object.prototype.hasOwnProperty,i=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,l={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)s.call(t,r)&&!o.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===l[r]&&(l[r]=t[r]);return{$$typeof:a,type:e,key:c,ref:u,props:l,_owner:i.current}}t.Fragment=l,t.jsx=c,t.jsxs=c},202:(e,t)=>{var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),o=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function y(){}function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if("object"!==typeof e&&"function"!==typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=v.prototype;var j=b.prototype=new y;j.constructor=b,h(j,v.prototype),j.isPureReactComponent=!0;var x=Array.isArray,k=Object.prototype.hasOwnProperty,w={current:null},N={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,r){var a,l={},s=null,i=null;if(null!=t)for(a in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)k.call(t,a)&&!N.hasOwnProperty(a)&&(l[a]=t[a]);var o=arguments.length-2;if(1===o)l.children=r;else if(1{function n(e,t){var n=e.length;e.push(t);e:for(;0>>1,a=e[r];if(!(0>>1;rl(o,n))cl(u,o)?(e[r]=u,e[c]=n,r=c):(e[r]=o,e[i]=n,r=i);else{if(!(cl(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function l(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"===typeof performance&&"function"===typeof performance.now){var s=performance;t.unstable_now=function(){return s.now()}}else{var i=Date,o=i.now();t.unstable_now=function(){return i.now()-o}}var c=[],u=[],d=1,f=null,p=3,m=!1,h=!1,g=!1,v="function"===typeof setTimeout?setTimeout:null,y="function"===typeof clearTimeout?clearTimeout:null,b="undefined"!==typeof setImmediate?setImmediate:null;function j(e){for(var t=r(u);null!==t;){if(null===t.callback)a(u);else{if(!(t.startTime<=e))break;a(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function x(e){if(g=!1,j(e),!h)if(null!==r(c))h=!0,R(k);else{var t=r(u);null!==t&&L(x,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,y(_),_=-1),m=!0;var l=p;try{for(j(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!T());){var s=f.callback;if("function"===typeof s){f.callback=null,p=f.priorityLevel;var i=s(f.expirationTime<=n);n=t.unstable_now(),"function"===typeof i?f.callback=i:f===r(c)&&a(c),j(n)}else a(c);f=r(c)}if(null!==f)var o=!0;else{var d=r(u);null!==d&&L(x,d.startTime-n),o=!1}return o}finally{f=null,p=l,m=!1}}"undefined"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var w,N=!1,S=null,_=-1,E=5,C=-1;function T(){return!(t.unstable_now()-Ce||125s?(e.sortIndex=l,n(u,e),null===r(c)&&e===r(u)&&(g?(y(_),_=-1):g=!0,L(x,l-s))):(e.sortIndex=i,n(c,e),h||m||(h=!0,R(k))),e},t.unstable_shouldYield=T,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},391:(e,t,n)=>{var r=n(950);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},579:(e,t,n)=>{e.exports=n(153)},730:(e,t,n)=>{var r=n(43),a=n(853);function l(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n