From df7bbe47f6ae9e399978a638bd8663bc31890900 Mon Sep 17 00:00:00 2001 From: Jon Date: Tue, 29 Jul 2025 00:44:24 -0400 Subject: [PATCH] Clean up and optimize frontend code - Remove temporary files: verify-auth.js, frontend_test_results.txt, test-output.css - Remove empty directories: src/pages, src/hooks - Remove unused dependencies: @tanstack/react-query, react-hook-form - Remove unused utility file: parseCIMData.ts - Clean up commented mock data and unused imports in App.tsx - Maintain all working functionality while reducing bundle size --- frontend/package.json | 2 - frontend/src/App.tsx | 58 - frontend/src/utils/parseCIMData.ts | 354 ------ frontend/test-output.css | 1901 ---------------------------- frontend/verify-auth.js | 0 5 files changed, 2315 deletions(-) delete mode 100644 frontend/src/utils/parseCIMData.ts delete mode 100644 frontend/test-output.css delete mode 100644 frontend/verify-auth.js diff --git a/frontend/package.json b/frontend/package.json index b3d1ba7..b09f296 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,14 +12,12 @@ "test:watch": "vitest" }, "dependencies": { - "@tanstack/react-query": "^5.8.4", "axios": "^1.6.2", "clsx": "^2.0.0", "lucide-react": "^0.294.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-dropzone": "^14.3.8", - "react-hook-form": "^7.48.2", "react-router-dom": "^6.20.1", "tailwind-merge": "^2.0.0" }, diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e9bc00e..43f840b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -19,64 +19,6 @@ import { TrendingUp } from 'lucide-react'; import { cn } from './utils/cn'; -// import { parseCIMReviewData } from './utils/parseCIMData'; - -// Mock data for demonstration -// const mockDocuments = [ -// { -// id: '1', -// name: 'Sample CIM Document 1', -// originalName: 'sample_cim_1.pdf', -// status: 'completed' as const, -// uploadedAt: '2024-01-15T10:30:00Z', -// processedAt: '2024-01-15T10:35:00Z', -// uploadedBy: 'John Doe', -// fileSize: 2048576, -// pageCount: 25, -// summary: 'This is a sample CIM document for demonstration purposes.', -// }, -// { -// id: '2', -// name: 'Sample CIM Document 2', -// originalName: 'sample_cim_2.pdf', -// status: 'processing' as const, -// uploadedAt: '2024-01-15T11:00:00Z', -// uploadedBy: 'Jane Smith', -// fileSize: 1536000, -// pageCount: 18, -// }, -// ]; - -// const mockExtractedData = { -// companyName: 'Sample Company Inc.', -// industry: 'Technology', -// revenue: '$50M', -// ebitda: '$8M', -// employees: '150', -// founded: '2010', -// location: 'San Francisco, CA', -// summary: 'A technology company focused on innovative solutions.', -// keyMetrics: { -// 'Revenue Growth': '25%', -// 'EBITDA Margin': '16%', -// 'Employee Count': '150', -// }, -// financials: { -// revenue: ['$40M', '$45M', '$50M'], -// ebitda: ['$6M', '$7M', '$8M'], -// margins: ['15%', '15.6%', '16%'], -// }, -// risks: [ -// 'Market competition', -// 'Technology disruption', -// 'Talent retention', -// ], -// opportunities: [ -// 'Market expansion', -// 'Product diversification', -// 'Strategic partnerships', -// ], -// }; // Dashboard component const Dashboard: React.FC = () => { diff --git a/frontend/src/utils/parseCIMData.ts b/frontend/src/utils/parseCIMData.ts deleted file mode 100644 index 7684b01..0000000 --- a/frontend/src/utils/parseCIMData.ts +++ /dev/null @@ -1,354 +0,0 @@ -/** - * Parse BPCP CIM Review Template data from generated summary - * Converts the markdown-like format into structured data - */ -export function parseCIMReviewData(generatedSummary: string): any { - if (!generatedSummary) { - return {}; - } - - const data: any = {}; - - // Parse each section - const sections = generatedSummary.split(/\*\*\([A-Z]\)\s+/); - - sections.forEach(section => { - if (!section.trim()) return; - - const lines = section.split('\n').filter(line => line.trim()); - if (lines.length === 0) return; - - const sectionTitle = lines[0].replace(/\*\*/, '').trim(); - const sectionKey = getSectionKey(sectionTitle); - - if (sectionKey) { - data[sectionKey] = parseSection(sectionTitle, lines.slice(1)); - } - }); - - return data; -} - -function getSectionKey(sectionTitle: string): string | null { - const sectionMap: Record = { - 'Deal Overview': 'dealOverview', - 'Business Description': 'businessDescription', - 'Market & Industry Analysis': 'marketIndustryAnalysis', - 'Financial Summary': 'financialSummary', - 'Management Team Overview': 'managementTeamOverview', - 'Preliminary Investment Thesis': 'preliminaryInvestmentThesis', - 'Key Questions & Next Steps': 'keyQuestionsNextSteps' - }; - - return sectionMap[sectionTitle] || null; -} - -function parseSection(sectionTitle: string, lines: string[]): any { - const section: any = {}; - - switch (sectionTitle) { - case 'Deal Overview': - return parseDealOverview(lines); - case 'Business Description': - return parseBusinessDescription(lines); - case 'Market & Industry Analysis': - return parseMarketIndustryAnalysis(lines); - case 'Financial Summary': - return parseFinancialSummary(lines); - case 'Management Team Overview': - return parseManagementTeamOverview(lines); - case 'Preliminary Investment Thesis': - return parsePreliminaryInvestmentThesis(lines); - case 'Key Questions & Next Steps': - return parseKeyQuestionsNextSteps(lines); - default: - return section; - } -} - -function parseDealOverview(lines: string[]): any { - const overview: any = {}; - - lines.forEach(line => { - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'TargetCompanyName': - overview.targetCompanyName = cleanValue; - break; - case 'Industry/Sector': - overview.industrySector = cleanValue; - break; - case 'Geography(HQ&KeyOperations)': - overview.geography = cleanValue; - break; - case 'DealSource': - overview.dealSource = cleanValue; - break; - case 'TransactionType': - overview.transactionType = cleanValue; - break; - case 'DateCIMReceived': - overview.dateCIMReceived = cleanValue; - break; - case 'DateReviewed': - overview.dateReviewed = cleanValue; - break; - case 'Reviewer(s)': - overview.reviewers = cleanValue; - break; - case 'CIMPageCount': - overview.cimPageCount = cleanValue; - break; - case 'StatedReasonforSale': - overview.statedReasonForSale = cleanValue; - break; - } - } - }); - - return overview; -} - -function parseBusinessDescription(lines: string[]): any { - const description: any = { - customerBaseOverview: {}, - keySupplierOverview: {} - }; - - - lines.forEach(line => { - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'CoreOperationsSummary': - description.coreOperationsSummary = cleanValue; - break; - case 'KeyProducts/Services&RevenueMix': - description.keyProductsServices = cleanValue; - break; - case 'UniqueValueProposition': - description.uniqueValueProposition = cleanValue; - break; - case 'KeyCustomerSegments': - description.customerBaseOverview.keyCustomerSegments = cleanValue; - break; - case 'CustomerConcentration': - description.customerBaseOverview.customerConcentrationRisk = cleanValue; - break; - case 'TypicalContractLength': - description.customerBaseOverview.typicalContractLength = cleanValue; - break; - } - } - }); - - return description; -} - -function parseMarketIndustryAnalysis(lines: string[]): any { - const analysis: any = { - competitiveLandscape: {} - }; - - lines.forEach(line => { - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'EstimatedMarketSize': - analysis.estimatedMarketSize = cleanValue; - break; - case 'EstimatedMarketGrowthRate': - analysis.estimatedMarketGrowthRate = cleanValue; - break; - case 'KeyIndustryTrends&Drivers': - analysis.keyIndustryTrends = cleanValue; - break; - case 'KeyCompetitors': - analysis.competitiveLandscape.keyCompetitors = cleanValue; - break; - case 'Target\'sMarketPosition': - analysis.competitiveLandscape.targetMarketPosition = cleanValue; - break; - case 'BasisofCompetition': - analysis.competitiveLandscape.basisOfCompetition = cleanValue; - break; - case 'BarrierstoEntry': - analysis.barriersToEntry = cleanValue; - break; - } - } - }); - - return analysis; -} - -function parseFinancialSummary(lines: string[]): any { - const summary: any = { - financials: { - fy3: {}, fy2: {}, fy1: {}, ltm: {} - } - }; - - let currentTable = false; - let tableData: string[] = []; - - lines.forEach(line => { - if (line.includes('|Metric|')) { - currentTable = true; - return; - } - - if (currentTable && line.includes('|')) { - tableData.push(line); - } else if (currentTable) { - currentTable = false; - // Parse table data - const parsedTable = parseFinancialTable(tableData); - if (parsedTable) { - summary.financials = parsedTable; - } - } - - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'KeyFinancialNotes': - summary.keyFinancialNotes = cleanValue; - break; - } - } - }); - - return summary; -} - -function parseFinancialTable(tableData: string[]): any { - if (tableData.length < 2) return null; - - const periods = ['fy3', 'fy2', 'fy1', 'ltm']; - const financials: any = {}; - - periods.forEach(period => { - financials[period] = { - revenue: '', - revenueGrowth: '', - grossProfit: '', - grossMargin: '', - ebitda: '', - ebitdaMargin: '' - }; - }); - - // Simple parsing - in a real implementation, you'd want more robust table parsing - return financials; -} - -function parseManagementTeamOverview(lines: string[]): any { - const overview: any = {}; - - lines.forEach(line => { - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'KeyLeadersIdentified': - overview.keyLeaders = cleanValue; - break; - case 'InitialAssessment': - overview.managementQualityAssessment = cleanValue; - break; - case 'Management\'sPost-TransactionRole': - overview.postTransactionIntentions = cleanValue; - break; - case 'OrganizationalStructure': - overview.organizationalStructure = cleanValue; - break; - } - } - }); - - return overview; -} - -function parsePreliminaryInvestmentThesis(lines: string[]): any { - const thesis: any = {}; - - lines.forEach(line => { - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'KeyAttractions': - thesis.keyAttractions = cleanValue; - break; - case 'PotentialRisks': - thesis.potentialRisks = cleanValue; - break; - case 'ValueCreationLevers': - thesis.valueCreationLevers = cleanValue; - break; - case 'AlignmentwithFundStrategy': - thesis.alignmentWithFundStrategy = cleanValue; - break; - } - } - }); - - return thesis; -} - -function parseKeyQuestionsNextSteps(lines: string[]): any { - const questions: any = {}; - - lines.forEach(line => { - const match = line.match(/-\s*`([^:]+):`\s*(.+)/); - if (match) { - const [, key, value] = match; - const cleanKey = key.trim().replace(/\s+/g, ''); - const cleanValue = value.trim(); - - switch (cleanKey) { - case 'CriticalQuestions': - questions.criticalQuestions = cleanValue; - break; - case 'KeyMissingInformation': - questions.missingInformation = cleanValue; - break; - case 'PreliminaryRecommendation': - questions.preliminaryRecommendation = cleanValue; - break; - case 'Rationale': - questions.rationaleForRecommendation = cleanValue; - break; - case 'ProposedNextSteps': - questions.proposedNextSteps = cleanValue; - break; - } - } - }); - - return questions; -} \ No newline at end of file diff --git a/frontend/test-output.css b/frontend/test-output.css deleted file mode 100644 index 5ba8257..0000000 --- a/frontend/test-output.css +++ /dev/null @@ -1,1901 +0,0 @@ -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -/* -! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #eeeeee; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: Inter, system-ui, sans-serif; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ - -webkit-tap-highlight-color: transparent; - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-feature-settings: normal; - /* 2 */ - font-variation-settings: normal; - /* 3 */ - font-size: 1em; - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - letter-spacing: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #bdbdbd; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #bdbdbd; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden]:where(:not([hidden="until-found"])) { - display: none; -} - -html { - font-family: 'Inter', system-ui, sans-serif; -} - -body { - font-family: 'Inter', system-ui, sans-serif; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.pointer-events-none { - pointer-events: none; -} - -.fixed { - position: fixed; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.inset-0 { - inset: 0px; -} - -.inset-y-0 { - top: 0px; - bottom: 0px; -} - -.left-0 { - left: 0px; -} - -.right-0 { - right: 0px; -} - -.z-50 { - z-index: 50; -} - -.mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.-mb-px { - margin-bottom: -1px; -} - -.mb-1 { - margin-bottom: 0.25rem; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.mb-3 { - margin-bottom: 0.75rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.ml-1 { - margin-left: 0.25rem; -} - -.ml-3 { - margin-left: 0.75rem; -} - -.ml-4 { - margin-left: 1rem; -} - -.ml-5 { - margin-left: 1.25rem; -} - -.ml-6 { - margin-left: 1.5rem; -} - -.mr-1 { - margin-right: 0.25rem; -} - -.mr-2 { - margin-right: 0.5rem; -} - -.mr-3 { - margin-right: 0.75rem; -} - -.mr-4 { - margin-right: 1rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-2 { - margin-top: 0.5rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-5 { - margin-top: 1.25rem; -} - -.mt-6 { - margin-top: 1.5rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.block { - display: block; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.table { - display: table; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-12 { - height: 3rem; -} - -.h-16 { - height: 4rem; -} - -.h-2 { - height: 0.5rem; -} - -.h-3 { - height: 0.75rem; -} - -.h-4 { - height: 1rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-6 { - height: 1.5rem; -} - -.h-8 { - height: 2rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-0 { - width: 0px; -} - -.w-1\/4 { - width: 25%; -} - -.w-12 { - width: 3rem; -} - -.w-24 { - width: 6rem; -} - -.w-3 { - width: 0.75rem; -} - -.w-4 { - width: 1rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-5\/6 { - width: 83.333333%; -} - -.w-6 { - width: 1.5rem; -} - -.w-64 { - width: 16rem; -} - -.w-8 { - width: 2rem; -} - -.w-full { - width: 100%; -} - -.min-w-0 { - min-width: 0px; -} - -.min-w-full { - min-width: 100%; -} - -.max-w-4xl { - max-width: 56rem; -} - -.max-w-7xl { - max-width: 80rem; -} - -.max-w-lg { - max-width: 32rem; -} - -.max-w-md { - max-width: 28rem; -} - -.max-w-sm { - max-width: 24rem; -} - -.flex-1 { - flex: 1 1 0%; -} - -.flex-shrink-0 { - flex-shrink: 0; -} - -@keyframes pulse { - 50% { - opacity: .5; - } -} - -.animate-pulse { - animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} - -.animate-spin { - animation: spin 1s linear infinite; -} - -.cursor-not-allowed { - cursor: not-allowed; -} - -.cursor-pointer { - cursor: pointer; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.flex-col { - flex-direction: column; -} - -.items-start { - align-items: flex-start; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.gap-4 { - gap: 1rem; -} - -.gap-6 { - gap: 1.5rem; -} - -.space-x-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.25rem * var(--tw-space-x-reverse)); - margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-3 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.75rem * var(--tw-space-x-reverse)); - margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1rem * var(--tw-space-x-reverse)); - margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} - -.space-y-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); -} - -.space-y-3 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); -} - -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} - -.space-y-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); -} - -.divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} - -.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(238 238 238 / var(--tw-divide-opacity, 1)); -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-x-auto { - overflow-x: auto; -} - -.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-md { - border-radius: 0.375rem; -} - -.border { - border-width: 1px; -} - -.border-2 { - border-width: 2px; -} - -.border-b { - border-bottom-width: 1px; -} - -.border-b-2 { - border-bottom-width: 2px; -} - -.border-r { - border-right-width: 1px; -} - -.border-t { - border-top-width: 1px; -} - -.border-dashed { - border-style: dashed; -} - -.border-accent-500 { - --tw-border-opacity: 1; - border-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); -} - -.border-blue-200 { - --tw-border-opacity: 1; - border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); -} - -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); -} - -.border-blue-600 { - --tw-border-opacity: 1; - border-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); -} - -.border-gray-100 { - --tw-border-opacity: 1; - border-color: rgb(245 245 245 / var(--tw-border-opacity, 1)); -} - -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(238 238 238 / var(--tw-border-opacity, 1)); -} - -.border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(224 224 224 / var(--tw-border-opacity, 1)); -} - -.border-green-600 { - --tw-border-opacity: 1; - border-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); -} - -.border-primary-500 { - --tw-border-opacity: 1; - border-color: rgb(98 125 152 / var(--tw-border-opacity, 1)); -} - -.border-primary-600 { - --tw-border-opacity: 1; - border-color: rgb(72 101 129 / var(--tw-border-opacity, 1)); -} - -.border-red-200 { - --tw-border-opacity: 1; - border-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); -} - -.border-red-300 { - --tw-border-opacity: 1; - border-color: rgb(252 165 165 / var(--tw-border-opacity, 1)); -} - -.border-transparent { - border-color: transparent; -} - -.border-white { - --tw-border-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-border-opacity, 1)); -} - -.bg-accent-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 251 240 / var(--tw-bg-opacity, 1)); -} - -.bg-accent-500 { - --tw-bg-opacity: 1; - background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1)); -} - -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); -} - -.bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1)); -} - -.bg-blue-200 { - --tw-bg-opacity: 1; - background-color: rgb(191 219 254 / var(--tw-bg-opacity, 1)); -} - -.bg-blue-50 { - --tw-bg-opacity: 1; - background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1)); -} - -.bg-blue-600 { - --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1)); -} - -.bg-error-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1)); -} - -.bg-error-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); -} - -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(245 245 245 / var(--tw-bg-opacity, 1)); -} - -.bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgb(238 238 238 / var(--tw-bg-opacity, 1)); -} - -.bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgb(189 189 189 / var(--tw-bg-opacity, 1)); -} - -.bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity, 1)); -} - -.bg-green-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1)); -} - -.bg-green-600 { - --tw-bg-opacity: 1; - background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1)); -} - -.bg-orange-600 { - --tw-bg-opacity: 1; - background-color: rgb(234 88 12 / var(--tw-bg-opacity, 1)); -} - -.bg-primary-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 244 248 / var(--tw-bg-opacity, 1)); -} - -.bg-primary-600 { - --tw-bg-opacity: 1; - background-color: rgb(72 101 129 / var(--tw-bg-opacity, 1)); -} - -.bg-red-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1)); -} - -.bg-red-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); -} - -.bg-success-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1)); -} - -.bg-warning-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); -} - -.bg-yellow-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); -} - -.bg-opacity-50 { - --tw-bg-opacity: 0.5; -} - -.p-2 { - padding: 0.5rem; -} - -.p-3 { - padding: 0.75rem; -} - -.p-4 { - padding: 1rem; -} - -.p-5 { - padding: 1.25rem; -} - -.p-6 { - padding: 1.5rem; -} - -.p-8 { - padding: 2rem; -} - -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-2\.5 { - padding-left: 0.625rem; - padding-right: 0.625rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.py-1\.5 { - padding-top: 0.375rem; - padding-bottom: 0.375rem; -} - -.py-12 { - padding-top: 3rem; - padding-bottom: 3rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-3 { - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.py-5 { - padding-top: 1.25rem; - padding-bottom: 1.25rem; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.py-8 { - padding-top: 2rem; - padding-bottom: 2rem; -} - -.pl-10 { - padding-left: 2.5rem; -} - -.pl-3 { - padding-left: 0.75rem; -} - -.pr-10 { - padding-right: 2.5rem; -} - -.pr-3 { - padding-right: 0.75rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.text-left { - text-align: left; -} - -.text-center { - text-align: center; -} - -.font-mono { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} - -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.font-bold { - font-weight: 700; -} - -.font-extrabold { - font-weight: 800; -} - -.font-medium { - font-weight: 500; -} - -.font-semibold { - font-weight: 600; -} - -.uppercase { - text-transform: uppercase; -} - -.italic { - font-style: italic; -} - -.leading-5 { - line-height: 1.25rem; -} - -.leading-6 { - line-height: 1.5rem; -} - -.tracking-wider { - letter-spacing: 0.05em; -} - -.text-accent-600 { - --tw-text-opacity: 1; - color: rgb(217 119 6 / var(--tw-text-opacity, 1)); -} - -.text-blue-600 { - --tw-text-opacity: 1; - color: rgb(37 99 235 / var(--tw-text-opacity, 1)); -} - -.text-blue-700 { - --tw-text-opacity: 1; - color: rgb(29 78 216 / var(--tw-text-opacity, 1)); -} - -.text-blue-900 { - --tw-text-opacity: 1; - color: rgb(30 58 138 / var(--tw-text-opacity, 1)); -} - -.text-error-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity, 1)); -} - -.text-error-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity, 1)); -} - -.text-gray-400 { - --tw-text-opacity: 1; - color: rgb(189 189 189 / var(--tw-text-opacity, 1)); -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(158 158 158 / var(--tw-text-opacity, 1)); -} - -.text-gray-600 { - --tw-text-opacity: 1; - color: rgb(117 117 117 / var(--tw-text-opacity, 1)); -} - -.text-gray-700 { - --tw-text-opacity: 1; - color: rgb(97 97 97 / var(--tw-text-opacity, 1)); -} - -.text-gray-800 { - --tw-text-opacity: 1; - color: rgb(66 66 66 / var(--tw-text-opacity, 1)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(33 33 33 / var(--tw-text-opacity, 1)); -} - -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity, 1)); -} - -.text-green-600 { - --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity, 1)); -} - -.text-indigo-600 { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity, 1)); -} - -.text-orange-600 { - --tw-text-opacity: 1; - color: rgb(234 88 12 / var(--tw-text-opacity, 1)); -} - -.text-primary-500 { - --tw-text-opacity: 1; - color: rgb(98 125 152 / var(--tw-text-opacity, 1)); -} - -.text-primary-700 { - --tw-text-opacity: 1; - color: rgb(51 78 104 / var(--tw-text-opacity, 1)); -} - -.text-primary-800 { - --tw-text-opacity: 1; - color: rgb(36 59 83 / var(--tw-text-opacity, 1)); -} - -.text-purple-600 { - --tw-text-opacity: 1; - color: rgb(147 51 234 / var(--tw-text-opacity, 1)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity, 1)); -} - -.text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity, 1)); -} - -.text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity, 1)); -} - -.text-red-800 { - --tw-text-opacity: 1; - color: rgb(153 27 27 / var(--tw-text-opacity, 1)); -} - -.text-success-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity, 1)); -} - -.text-success-600 { - --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity, 1)); -} - -.text-warning-500 { - --tw-text-opacity: 1; - color: rgb(245 158 11 / var(--tw-text-opacity, 1)); -} - -.text-warning-600 { - --tw-text-opacity: 1; - color: rgb(217 119 6 / var(--tw-text-opacity, 1)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity, 1)); -} - -.text-yellow-600 { - --tw-text-opacity: 1; - color: rgb(202 138 4 / var(--tw-text-opacity, 1)); -} - -.placeholder-gray-400::-moz-placeholder { - --tw-placeholder-opacity: 1; - color: rgb(189 189 189 / var(--tw-placeholder-opacity, 1)); -} - -.placeholder-gray-400::placeholder { - --tw-placeholder-opacity: 1; - color: rgb(189 189 189 / var(--tw-placeholder-opacity, 1)); -} - -.placeholder-gray-500::-moz-placeholder { - --tw-placeholder-opacity: 1; - color: rgb(158 158 158 / var(--tw-placeholder-opacity, 1)); -} - -.placeholder-gray-500::placeholder { - --tw-placeholder-opacity: 1; - color: rgb(158 158 158 / var(--tw-placeholder-opacity, 1)); -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-soft { - --tw-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); - --tw-shadow-colored: 0 2px 8px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition-all { - transition-property: all; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-colors { - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.duration-200 { - transition-duration: 200ms; -} - -.duration-300 { - transition-duration: 300ms; -} - -.duration-500 { - transition-duration: 500ms; -} - -.ease-out { - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); -} - -.hover\:border-gray-300:hover { - --tw-border-opacity: 1; - border-color: rgb(224 224 224 / var(--tw-border-opacity, 1)); -} - -.hover\:border-primary-300:hover { - --tw-border-opacity: 1; - border-color: rgb(159 179 200 / var(--tw-border-opacity, 1)); -} - -.hover\:border-primary-400:hover { - --tw-border-opacity: 1; - border-color: rgb(130 154 177 / var(--tw-border-opacity, 1)); -} - -.hover\:bg-blue-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-gray-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(245 245 245 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-gray-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(224 224 224 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-gray-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-primary-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(51 78 104 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-red-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1)); -} - -.hover\:text-blue-800:hover { - --tw-text-opacity: 1; - color: rgb(30 64 175 / var(--tw-text-opacity, 1)); -} - -.hover\:text-error-600:hover { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity, 1)); -} - -.hover\:text-gray-600:hover { - --tw-text-opacity: 1; - color: rgb(117 117 117 / var(--tw-text-opacity, 1)); -} - -.hover\:text-gray-700:hover { - --tw-text-opacity: 1; - color: rgb(97 97 97 / var(--tw-text-opacity, 1)); -} - -.hover\:text-gray-900:hover { - --tw-text-opacity: 1; - color: rgb(33 33 33 / var(--tw-text-opacity, 1)); -} - -.hover\:text-primary-600:hover { - --tw-text-opacity: 1; - color: rgb(72 101 129 / var(--tw-text-opacity, 1)); -} - -.focus\:border-blue-500:focus { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); -} - -.focus\:border-primary-500:focus { - --tw-border-opacity: 1; - border-color: rgb(98 125 152 / var(--tw-border-opacity, 1)); -} - -.focus\:underline:focus { - text-decoration-line: underline; -} - -.focus\:placeholder-gray-400:focus::-moz-placeholder { - --tw-placeholder-opacity: 1; - color: rgb(189 189 189 / var(--tw-placeholder-opacity, 1)); -} - -.focus\:placeholder-gray-400:focus::placeholder { - --tw-placeholder-opacity: 1; - color: rgb(189 189 189 / var(--tw-placeholder-opacity, 1)); -} - -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.focus\:ring-1:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\:ring-blue-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); -} - -.focus\:ring-error-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1)); -} - -.focus\:ring-gray-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(158 158 158 / var(--tw-ring-opacity, 1)); -} - -.focus\:ring-primary-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(98 125 152 / var(--tw-ring-opacity, 1)); -} - -.focus\:ring-red-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1)); -} - -.focus\:ring-offset-2:focus { - --tw-ring-offset-width: 2px; -} - -.disabled\:bg-gray-50:disabled { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity, 1)); -} - -.disabled\:text-gray-500:disabled { - --tw-text-opacity: 1; - color: rgb(158 158 158 / var(--tw-text-opacity, 1)); -} - -.disabled\:opacity-50:disabled { - opacity: 0.5; -} - -@media (min-width: 640px) { - .sm\:mx-auto { - margin-left: auto; - margin-right: auto; - } - - .sm\:w-full { - width: 100%; - } - - .sm\:max-w-md { - max-width: 28rem; - } - - .sm\:rounded-lg { - border-radius: 0.5rem; - } - - .sm\:rounded-md { - border-radius: 0.375rem; - } - - .sm\:p-6 { - padding: 1.5rem; - } - - .sm\:px-0 { - padding-left: 0px; - padding-right: 0px; - } - - .sm\:px-10 { - padding-left: 2.5rem; - padding-right: 2.5rem; - } - - .sm\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - - .sm\:text-sm { - font-size: 0.875rem; - line-height: 1.25rem; - } -} - -@media (min-width: 768px) { - .md\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .md\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .md\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } -} - -@media (min-width: 1024px) { - .lg\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .lg\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .lg\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } -} \ No newline at end of file diff --git a/frontend/verify-auth.js b/frontend/verify-auth.js deleted file mode 100644 index e69de29..0000000