Merge pull request #4 from presenton/presenton/upload_page_tests
Merge pull request #4 from presenton/upload_page_tests
This commit is contained in:
commit
c732ec8efa
46 changed files with 1823 additions and 557 deletions
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
|
|
@ -43,8 +42,11 @@ const SlideCountSelect: React.FC<{
|
|||
value: string | null;
|
||||
onValueChange: (value: string) => void;
|
||||
}> = ({ value, onValueChange }) => (
|
||||
<Select value={value || ""} onValueChange={onValueChange}>
|
||||
<SelectTrigger className="w-[180px] font-satoshi font-medium bg-blue-100 border-blue-200 focus-visible:ring-blue-300">
|
||||
<Select value={value || ""} onValueChange={onValueChange} name="slides">
|
||||
<SelectTrigger
|
||||
className="w-[180px] font-satoshi font-medium bg-blue-100 border-blue-200 focus-visible:ring-blue-300"
|
||||
data-testid="slides-select"
|
||||
>
|
||||
<SelectValue placeholder="Select Slides" />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="font-satoshi">
|
||||
|
|
@ -53,8 +55,9 @@ const SlideCountSelect: React.FC<{
|
|||
key={option}
|
||||
value={option}
|
||||
className="font-satoshi text-sm font-medium"
|
||||
role="option"
|
||||
>
|
||||
{option} Slides
|
||||
{option} slides
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
|
|
@ -75,6 +78,8 @@ const LanguageSelect: React.FC<{
|
|||
<Button
|
||||
variant="outline"
|
||||
role="combobox"
|
||||
name="language"
|
||||
data-testid="language-select"
|
||||
aria-expanded={open}
|
||||
className="w-[200px] justify-between font-satoshi font-semibold overflow-hidden bg-blue-100 hover:bg-blue-100 border-blue-200 focus-visible:ring-blue-300 border-none"
|
||||
>
|
||||
|
|
@ -97,6 +102,7 @@ const LanguageSelect: React.FC<{
|
|||
<CommandItem
|
||||
key={language}
|
||||
value={language}
|
||||
role="option"
|
||||
onSelect={(currentValue) => {
|
||||
onValueChange(currentValue);
|
||||
onOpenChange(false);
|
||||
|
|
|
|||
|
|
@ -29,15 +29,15 @@ export function PromptInput({
|
|||
</h4>
|
||||
<div className="flex justify-end">
|
||||
<div
|
||||
className={`inline-flex items-center gap-2 px-3 py-1.5 rounded-md border border-[#5146E5] text-sm font-semibold ${
|
||||
researchMode ? "bg-[#5146E5] text-white" : "text-[#5146E5]"
|
||||
}`}
|
||||
className={`inline-flex items-center gap-2 px-3 py-1.5 rounded-md border border-[#5146E5] text-sm font-semibold ${researchMode ? "bg-[#5146E5] text-white" : "text-[#5146E5]"
|
||||
}`}
|
||||
>
|
||||
<span>Research Mode</span>
|
||||
<Switch.Root
|
||||
defaultChecked={researchMode}
|
||||
onCheckedChange={(val) => setResearchMode(val)}
|
||||
className={`${styles.SwitchRoot}`}
|
||||
data-testid="research-mode-switch"
|
||||
>
|
||||
<Switch.Thumb className={styles.SwitchThumb} />
|
||||
</Switch.Root>
|
||||
|
|
@ -57,16 +57,15 @@ export function PromptInput({
|
|||
rows={5}
|
||||
onChange={(e) => handleChange(e.target.value)}
|
||||
placeholder="Tell us about your presentation"
|
||||
className={`py-4 px-5 border-2 font-medium text-base min-h-[150px] max-h-[300px] border-[#5146E5] focus-visible:ring-offset-0 font-satoshi focus-visible:ring-[#5146E5] overflow-y-auto custom_scrollbar ${
|
||||
researchMode ? "border-dashed" : ""
|
||||
}`}
|
||||
data-testid="prompt-input"
|
||||
className={`py-4 px-5 border-2 font-medium text-base min-h-[150px] max-h-[300px] border-[#5146E5] focus-visible:ring-offset-0 font-satoshi focus-visible:ring-[#5146E5] overflow-y-auto custom_scrollbar ${researchMode ? "border-dashed" : ""
|
||||
}`}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<p
|
||||
className={`text-sm text-gray-500 font-satoshi font-medium ${
|
||||
showHint ? "opacity-100" : "opacity-0"
|
||||
}`}
|
||||
className={`text-sm text-gray-500 font-satoshi font-medium ${showHint ? "opacity-100" : "opacity-0"
|
||||
}`}
|
||||
>
|
||||
Provide specific details about your presentation needs (e.g., topic,
|
||||
style, key points) for more accurate results
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ const SupportingDoc = ({ files, onFilesChange }: SupportingDocProps) => {
|
|||
id="file-upload"
|
||||
ref={fileInputRef}
|
||||
multiple
|
||||
data-testid="file-upload-input"
|
||||
/>
|
||||
|
||||
<button
|
||||
|
|
@ -174,7 +175,7 @@ const SupportingDoc = ({ files, onFilesChange }: SupportingDocProps) => {
|
|||
Selected Files ({files.length})
|
||||
</h3>
|
||||
</div>
|
||||
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3">
|
||||
<div data-testid="file-list" className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3">
|
||||
{filesWithIds.map((file) => (
|
||||
<div key={file.id}
|
||||
className="bg-white rounded-lg border border-gray-200 overflow-hidden
|
||||
|
|
|
|||
|
|
@ -0,0 +1,299 @@
|
|||
import React from 'react'
|
||||
import UploadPage from './UploadPage'
|
||||
import { mount } from 'cypress/react'
|
||||
import { store } from '@/store/store'
|
||||
import { Provider } from 'react-redux'
|
||||
import { AppRouterContext } from 'next/dist/shared/lib/app-router-context.shared-runtime'
|
||||
import { Toaster } from '@/components/ui/toaster'
|
||||
|
||||
// Import global styles
|
||||
import '@/app/globals.css'
|
||||
|
||||
// Create a mock router
|
||||
const createRouter = (push = cy.stub().as('router.push')) => ({
|
||||
push,
|
||||
back: cy.stub(),
|
||||
forward: cy.stub(),
|
||||
refresh: cy.stub(),
|
||||
replace: cy.stub(),
|
||||
prefetch: cy.stub(),
|
||||
route: '/',
|
||||
pathname: '/',
|
||||
query: {},
|
||||
asPath: '/',
|
||||
})
|
||||
|
||||
interface RouterWrapperProps {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
// Custom mount command with Redux Provider and Next.js Router
|
||||
Cypress.Commands.add('mount', (component, options = {}) => {
|
||||
const router = createRouter()
|
||||
const RouterWrapper = ({ children }: RouterWrapperProps) => (
|
||||
<AppRouterContext.Provider value={router}>
|
||||
<Provider store={store}>
|
||||
{children}
|
||||
<Toaster />
|
||||
</Provider>
|
||||
</AppRouterContext.Provider>
|
||||
)
|
||||
|
||||
return mount(
|
||||
<RouterWrapper>
|
||||
{component}
|
||||
</RouterWrapper>,
|
||||
options
|
||||
)
|
||||
})
|
||||
|
||||
// Helper function to check for toast message
|
||||
const checkToast = (message: string) => {
|
||||
// Wait for toast to appear and check its content
|
||||
cy.get('[role="status"]', { timeout: 5000 })
|
||||
.should('exist')
|
||||
.and('contain', message)
|
||||
}
|
||||
|
||||
describe('<UploadPage />', () => {
|
||||
beforeEach(() => {
|
||||
// Set viewport size
|
||||
cy.viewport(1440, 900)
|
||||
|
||||
// Reset any previous interceptions
|
||||
cy.intercept('POST', '**/ppt/generate*', {
|
||||
statusCode: 200,
|
||||
body: { id: 'test-id' }
|
||||
}).as('createPresentation')
|
||||
|
||||
cy.intercept('POST', '**/ppt/titles/generate*', {
|
||||
statusCode: 200,
|
||||
body: { id: 'test-id', titles: ['Title 1', 'Title 2'] }
|
||||
}).as('generateTitles')
|
||||
|
||||
cy.intercept('POST', '**/ppt/create', {
|
||||
statusCode: 200,
|
||||
body: { id: 'test-id' }
|
||||
}).as('getQuestions')
|
||||
|
||||
cy.mount(<UploadPage />)
|
||||
})
|
||||
|
||||
describe('Configuration Selection', () => {
|
||||
it('should allow selecting number of slides', () => {
|
||||
// Force click to handle any overlay issues
|
||||
cy.get('[data-testid="slides-select"]').click({ force: true })
|
||||
// Wait for content to be visible
|
||||
cy.get('[role="option"]').should('be.visible')
|
||||
// Click the option
|
||||
cy.get('[role="option"]').contains('12').click()
|
||||
// Verify selection
|
||||
cy.get('[data-testid="slides-select"]').should('contain', '12')
|
||||
})
|
||||
|
||||
it('should allow selecting language', () => {
|
||||
// Force click to handle any overlay issues
|
||||
cy.get('[data-testid="language-select"]').click({ force: true })
|
||||
// Wait for content to be visible and click
|
||||
cy.get('[role="option"]').contains('Chinese').should('be.visible').click()
|
||||
// Verify selection
|
||||
cy.get('[data-testid="language-select"]').should('contain', 'Chinese')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Prompt Input', () => {
|
||||
it('should allow entering prompt text', () => {
|
||||
const testPrompt = 'Create a presentation about AI'
|
||||
cy.get('[data-testid="prompt-input"]').type(testPrompt)
|
||||
cy.get('[data-testid="prompt-input"]').should('have.value', testPrompt)
|
||||
})
|
||||
|
||||
it('should toggle research mode', () => {
|
||||
cy.get('[data-testid="research-mode-switch"]').click()
|
||||
cy.get('[data-testid="research-mode-switch"]').should('have.attr', 'aria-checked', 'true')
|
||||
})
|
||||
})
|
||||
|
||||
describe('File Upload', () => {
|
||||
it('should handle document uploads', () => {
|
||||
cy.fixture('example.txt').as('testFile')
|
||||
cy.get('[data-testid="file-upload-input"]').selectFile('@testFile', { force: true })
|
||||
cy.contains('example.txt').should('exist')
|
||||
// Check for success toast
|
||||
checkToast('Files selected')
|
||||
})
|
||||
})
|
||||
describe('File Handling', () => {
|
||||
beforeEach(() => {
|
||||
// Create a text file fixture
|
||||
cy.writeFile('cypress/fixtures/test-doc.txt', 'Test content')
|
||||
})
|
||||
|
||||
it('should handle multiple document uploads', () => {
|
||||
// Create two files with different names
|
||||
const file1 = new File(['content1'], 'document1.txt', { type: 'text/plain' })
|
||||
const file2 = new File(['content2'], 'document2.txt', { type: 'text/plain' })
|
||||
|
||||
// Upload multiple files
|
||||
cy.get('[data-testid="file-upload-input"]')
|
||||
.selectFile([
|
||||
{ contents: file1, fileName: 'document1.txt' },
|
||||
{ contents: file2, fileName: 'document2.txt' }
|
||||
], { force: true })
|
||||
|
||||
// Verify files are listed
|
||||
cy.get('[data-testid="file-list"]').within(() => {
|
||||
cy.contains('document1.txt').should('be.visible')
|
||||
cy.contains('document2.txt').should('be.visible')
|
||||
})
|
||||
checkToast('Files selected')
|
||||
})
|
||||
|
||||
it('should handle image uploads', () => {
|
||||
// Create an image file
|
||||
const imageFile = new File(['image content'], 'test-image.jpg', { type: 'image/jpeg' })
|
||||
|
||||
cy.get('[data-testid="file-upload-input"]')
|
||||
.selectFile({
|
||||
contents: imageFile,
|
||||
fileName: 'test-image.jpg',
|
||||
mimeType: 'image/jpeg'
|
||||
}, { force: true })
|
||||
|
||||
// Verify image is listed
|
||||
cy.get('[data-testid="file-list"]').within(() => {
|
||||
cy.contains('test-image.jpg').should('be.visible')
|
||||
})
|
||||
checkToast('Files selected')
|
||||
})
|
||||
|
||||
it('should handle mixed document and image uploads', () => {
|
||||
// Create document and image files
|
||||
const docFile = new File(['doc content'], 'test-doc.txt', { type: 'text/plain' })
|
||||
const imageFile = new File(['image content'], 'test-image.jpg', { type: 'image/jpeg' })
|
||||
|
||||
cy.get('[data-testid="file-upload-input"]')
|
||||
.selectFile([
|
||||
{ contents: docFile, fileName: 'test-doc.txt' },
|
||||
{ contents: imageFile, fileName: 'test-image.jpg', mimeType: 'image/jpeg' }
|
||||
], { force: true })
|
||||
|
||||
// Verify both files are listed
|
||||
cy.get('[data-testid="file-list"]').within(() => {
|
||||
cy.contains('test-doc.txt').should('be.visible')
|
||||
cy.contains('test-image.jpg').should('be.visible')
|
||||
})
|
||||
checkToast('Files selected')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Validation', () => {
|
||||
it('should show error when no prompt or documents provided', () => {
|
||||
// Click next without entering prompt or uploading files
|
||||
cy.contains('button', 'Next').click()
|
||||
// Check for error toast
|
||||
checkToast('No Prompt or Document Provided')
|
||||
})
|
||||
it('should show error when no prompt provided but research mode is on', () => {
|
||||
cy.get('[data-testid="research-mode-switch"]').click({ force: true })
|
||||
cy.get('[data-testid="research-mode-switch"]').should('have.attr', 'aria-checked', 'true')
|
||||
cy.contains('button', 'Next').click()
|
||||
checkToast('No Prompt or Document Provided')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Generation Flow', () => {
|
||||
it('should proceed to theme page with prompt-only configuration', () => {
|
||||
// Enter prompt
|
||||
cy.get('[data-testid="prompt-input"]').type('Create a presentation about AI')
|
||||
|
||||
// Click generate
|
||||
cy.contains('button', 'Next').click()
|
||||
|
||||
// Wait for API calls with longer timeout
|
||||
cy.wait('@getQuestions', { timeout: 10000 })
|
||||
cy.wait('@generateTitles', { timeout: 10000 })
|
||||
|
||||
// Verify navigation to theme page
|
||||
cy.get('@router.push').should('be.calledWith', '/theme')
|
||||
})
|
||||
|
||||
it('should proceed to documents-preview with research mode', () => {
|
||||
// Enable research mode
|
||||
cy.get('[data-testid="research-mode-switch"]').click({ force: true })
|
||||
|
||||
// Enter prompt
|
||||
cy.get('[data-testid="prompt-input"]').type('Research about AI technology')
|
||||
|
||||
// Intercept research report generation
|
||||
cy.intercept('POST', '**/ppt/report/generate', {
|
||||
statusCode: 200,
|
||||
body: { content: 'Research report content' }
|
||||
}).as('researchReport')
|
||||
|
||||
// Click generate
|
||||
cy.contains('button', 'Next').click()
|
||||
|
||||
// Wait for research API call
|
||||
cy.wait('@researchReport', { timeout: 10000 })
|
||||
|
||||
// Verify navigation to documents-preview page
|
||||
cy.get('@router.push').should('be.calledWith', '/documents-preview')
|
||||
})
|
||||
|
||||
it('should proceed to documents-preview with uploaded document', () => {
|
||||
// Upload a document
|
||||
cy.fixture('example.txt').as('testFile')
|
||||
cy.get('[data-testid="file-upload-input"]').selectFile('@testFile', { force: true })
|
||||
|
||||
// Enter prompt
|
||||
cy.get('[data-testid="prompt-input"]').type('Analyze this document')
|
||||
|
||||
// Intercept document upload and decomposition
|
||||
cy.intercept('POST', '**/ppt/files/upload', {
|
||||
statusCode: 200,
|
||||
body: {
|
||||
documents: ['doc1'],
|
||||
images: []
|
||||
}
|
||||
}).as('uploadDoc')
|
||||
|
||||
cy.intercept('POST', '**/ppt/files/decompose', {
|
||||
statusCode: 200,
|
||||
body: {
|
||||
documents: { doc1: 'content' },
|
||||
images: {},
|
||||
charts: {},
|
||||
tables: {}
|
||||
}
|
||||
}).as('decomposeDoc')
|
||||
|
||||
// Click generate
|
||||
cy.contains('button', 'Next').click()
|
||||
|
||||
// Wait for upload and decompose API calls
|
||||
cy.wait('@uploadDoc', { timeout: 10000 })
|
||||
cy.wait('@decomposeDoc', { timeout: 10000 })
|
||||
|
||||
// Verify navigation to documents-preview page
|
||||
cy.get('@router.push').should('be.calledWith', '/documents-preview')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Error Handling', () => {
|
||||
it('should handle API errors gracefully', () => {
|
||||
// Setup API to return error
|
||||
cy.intercept('POST', '**/ppt/create', {
|
||||
statusCode: 500,
|
||||
body: { error: 'Internal Server Error' }
|
||||
}).as('apiError')
|
||||
|
||||
// Enter prompt and try to generate
|
||||
cy.get('[data-testid="prompt-input"]').type('Test presentation')
|
||||
cy.contains('button', 'Next').click()
|
||||
|
||||
// Check for error toast
|
||||
checkToast('Failed to generate presentation')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
@ -304,17 +304,20 @@ const UploadPage = () => {
|
|||
onChange={(value) => handleConfigChange("prompt", value)}
|
||||
researchMode={researchMode}
|
||||
setResearchMode={setResearchModel}
|
||||
data-testid="prompt-input"
|
||||
/>
|
||||
</div>
|
||||
<SupportingDoc
|
||||
files={[...documents, ...images]}
|
||||
onFilesChange={handleFilesChange}
|
||||
data-testid="file-upload-input"
|
||||
/>
|
||||
<Button
|
||||
onClick={handleGeneratePresentation}
|
||||
className="w-full rounded-[32px] flex items-center justify-center py-6 bg-[#5141e5] text-white font-satoshi font-semibold text-xl hover:bg-[#5141e5]/80 transition-colors duration-300"
|
||||
data-testid="next-button"
|
||||
>
|
||||
<span> Next</span>
|
||||
<span>Next</span>
|
||||
<ChevronRight className="!w-6 !h-6" />
|
||||
</Button>
|
||||
</Wrapper>
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const AirplaneIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg className={cn('', className)} xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40">
|
||||
<path d="M30.643 7.061c.45-.109 1.188-.103 1.522.276.38.334.386 1.073.283 1.529-.212.88-.68 1.618-1.227 2.318-.48.616-.962 1.231-1.444 1.846l-.002.002v.001c-.753.96-1.505 1.921-2.252 2.883a.434.434 0 0 0-.078.322c.114.659.607 3.37 1.1 6.088.507 2.788 1.015 5.582 1.116 6.17a.434.434 0 0 1-.077.321c-.313.387-.635.765-.959 1.144l-.223.263a.877.877 0 0 1-1.463-.198l-1.21-2.614-2.576-5.556a.978.978 0 0 0-1.516-.346l-1.446 1.195a6785.635 6785.635 0 0 1-5.563 4.597c-.11.083-.154.16-.122.315.131.67.238 1.435.344 2.196.096.69.192 1.376.305 1.984a.377.377 0 0 1-.044.266.279.279 0 0 1-.028.033.241.241 0 0 0-.013.015l-.013.015a1.297 1.297 0 0 1-1.69.127.725.725 0 0 1-.234-.328l-1.415-3.578a1 1 0 0 0-.562-.562L7.58 26.37a.724.724 0 0 1-.331-.238 1.309 1.309 0 0 1 .142-1.7l.016-.014a.283.283 0 0 1 .032-.027.377.377 0 0 1 .267-.044c.595.11 1.265.203 1.94.297.776.107 1.557.214 2.24.352.154.025.225-.013.315-.122.6-.73 3.023-3.658 4.76-5.757l1.031-1.246a.977.977 0 0 0-.346-1.516l-5.576-2.585-2.594-1.201a.874.874 0 0 1-.197-1.463c.177-.148.353-.298.529-.447.29-.248.581-.495.877-.735a.433.433 0 0 1 .321-.077c.698.119 4.453.8 7.653 1.381h.002c2.161.393 4.07.739 4.61.835a.465.465 0 0 0 .322-.078c.616-.48 1.232-.963 1.848-1.446.96-.752 1.921-1.505 2.884-2.252.7-.546 1.439-1.015 2.318-1.227ZM28.5 12a.5.5 0 0 0-1 0v1a.5.5 0 0 0 1 0v-1ZM26 13.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 1 0v-1a.5.5 0 0 0-.5-.5ZM24.5 16a.5.5 0 0 0-1 0v1a.5.5 0 0 0 1 0v-1Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default AirplaneIcon
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const BabyIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M24 9a4 4 0 1 1-8 0 4 4 0 0 1 8 0ZM15.427 24.86a1 1 0 0 1 1.413-.26l1.7 1.214a1 1 0 0 1 .125 1.52l-2.594 2.595a.1.1 0 0 0 0 .142l2.1 2.1c.942.942.433 2.487-.76 2.78-.258.063-.516-.056-.704-.244L13.16 31.16a2 2 0 0 1-.25-2.523l2.518-3.777Z" fill="currentColor" />
|
||||
<path d="M15.813 20.077c.051-.09.187-.053.187.05v2.621c0 .134.117.237.25.22 2.49-.31 5.01-.31 7.5 0a.222.222 0 0 0 .25-.22v-2.621c0-.103.136-.14.187-.05l2.237 3.915A2 2 0 0 0 28.161 25h.977a.5.5 0 0 0 .434-.748L26 18l-.894-1.789A4 4 0 0 0 21.528 14h-3.056a4 4 0 0 0-3.578 2.211L14 18l-3.572 6.252a.5.5 0 0 0 .434.748h.977a2 2 0 0 0 1.737-1.008l2.237-3.915Z" fill="currentColor" />
|
||||
<path d="M23.16 24.6a1 1 0 0 1 1.413.26l2.517 3.776a2 2 0 0 1-.25 2.523l-3.547 3.548c-.188.188-.446.307-.704.244-1.192-.293-1.702-1.838-.76-2.78l2.1-2.1a.1.1 0 0 0 0-.142l-2.594-2.594a1 1 0 0 1 .126-1.521L23.16 24.6Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default BabyIcon
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const BanknoteIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M20 21a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z" fill="currentColor" />
|
||||
<path d="M8 17a4.001 4.001 0 0 0 3.874-3h16.252c.445 1.725 2.01 3 3.874 3v5a4.001 4.001 0 0 0-3.874 3H11.874A4.001 4.001 0 0 0 8 22v-5Zm12 5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z" fill="currentColor" />
|
||||
<path d="M4 11a1 1 0 0 1 1-1h30a1 1 0 0 1 1 1v17a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V11Zm6.959 2.498a3 3 0 0 1-3.27 2.486c-.344-.036-.689.207-.689.552v5.928c0 .345.345.588.688.552a3 3 0 0 1 3.27 2.486c.046.273.266.498.542.498h17c.276 0 .496-.226.541-.498a3 3 0 0 1 3.27-2.486c.344.036.689-.207.689-.552v-5.928c0-.345-.345-.588-.688-.552a3 3 0 0 1-3.27-2.486c-.046-.272-.266-.498-.542-.498h-17c-.276 0-.496.226-.541.498Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default BanknoteIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const BicycleIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M20 9a1 1 0 1 0 0 2h3.313l2.308 6h-6.203l-.77-2H20a1 1 0 1 0 0-2h-5a1 1 0 1 0 0 2h1.577c0 .12.021.24.067.359L19.198 22h-2.281A6.002 6.002 0 0 0 5 23a6 6 0 0 0 11.917 1h6.166A6.002 6.002 0 0 0 35 23a6 6 0 0 0-6-6h-1.236l-2.584-6.718A2 2 0 0 0 23.313 9H20Zm4.528 10a5.98 5.98 0 0 0-1.445 3h-1.742l-1.154-3h4.34Zm-9.371 5.722a4.5 4.5 0 1 1 0-3.444.5.5 0 1 1-.924.383 3.5 3.5 0 1 0 0 2.679.5.5 0 0 1 .924.382Zm14.151-6.211a4.5 4.5 0 1 1-3.265 1.097.5.5 0 1 1 .657.753 3.5 3.5 0 1 0 2.54-.853.5.5 0 1 1 .068-.997Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default BicycleIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const BookIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M15 6h4v6.132l-1.168-.78a1.5 1.5 0 0 0-1.664 0l-1.168.78V6Z" fill="currentColor" />
|
||||
<path d="M20 13.066V6h8a2 2 0 0 1 2 2v18.38c0 .197-.06.389-.16.558A5.972 5.972 0 0 0 29 30c0 1.17.335 2.262.914 3.185a.524.524 0 0 1-.438.815H14a4 4 0 0 1-4-4V10a4 4 0 0 1 4-4v7.066a.5.5 0 0 0 .777.416l1.946-1.297a.5.5 0 0 1 .554 0l1.946 1.297a.5.5 0 0 0 .777-.416ZM27.148 28H13.5a2 2 0 1 0 0 4h13.648c.306 0 .53-.287.476-.589a.492.492 0 0 0-.476-.411H13.5a1 1 0 1 1 0-2h13.648a.492.492 0 0 0 .476-.411.495.495 0 0 0-.476-.589Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default BookIcon
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const BriefcaseIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M16 11v-1a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1h8a2 2 0 0 1 2 2v4.125L29.767 20.3a3.5 3.5 0 0 1-2.1.7H21.5a1 1 0 0 0-1-1h-1a1 1 0 0 0-1 1h-6.167a3.5 3.5 0 0 1-2.1-.7L6 17.125V13a2 2 0 0 1 2-2h8Zm2-1v1h4v-1h-4Z" fill="currentColor" />
|
||||
<path d="M6 18.375V29a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V18.375L30.367 21.1a4.5 4.5 0 0 1-2.7.9H21.5v1a1 1 0 0 1-1 1h-1a1 1 0 0 1-1-1v-1h-6.167a4.5 4.5 0 0 1-2.7-.9L6 18.375Z" fill="currentColor" />
|
||||
<path d="M20.5 21h-1v2h1v-2Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default BriefcaseIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const BuildingIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg className={cn('', className)} xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox='0 0 40 40' width="40">
|
||||
<path d="M11 8a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v24a2 2 0 0 1-2 2h-4v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5h-4a2 2 0 0 1-2-2V8Zm8.5 7a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1ZM19 9.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5ZM24.5 21a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1Zm-.5-5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5Zm.5-6.5a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1ZM14 21.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5Zm.5-6.5a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1ZM14 9.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5ZM19.5 21a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-1Z" fill="currentColor" />
|
||||
<path d="M22 29v5h-4v-5h4Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default BuildingIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const CarIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M12 25.5a2 2 0 1 0-4 0 2 2 0 0 0 4 0ZM29 27.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor" />
|
||||
<path d="M10.465 9a5 5 0 0 0-4.682 3.244L4 17v8a1 1 0 0 0 1 1h1.03a4 4 0 0 0 7.94 0h11.06a4 4 0 0 0 7.94 0H35a1 1 0 0 0 1-1v-4a4 4 0 0 0-4-4h-4l-1.783-4.756A5 5 0 0 0 21.535 9h-11.07ZM10 28.5a3 3 0 1 1 0-6 3 3 0 0 1 0 6Zm22-3a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM16 11v6H6.134l1.522-4.053A3 3 0 0 1 10.465 11H16Zm2 0h3.535a3 3 0 0 1 2.809 1.947L25.86 17H18v-6Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default CarIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const ClockIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M31 20c0 6.075-4.925 11-11 11S9 26.075 9 20 13.925 9 20 9s11 4.925 11 11Zm-11.5.207 5.803 5.803a.5.5 0 1 0 .707-.707l-5.51-5.51V12a.5.5 0 0 0-1 0v8.207Z" fill="currentColor" />
|
||||
<path d="M34 20c0 7.732-6.268 14-14 14S6 27.732 6 20 12.268 6 20 6s14 6.268 14 14Zm-2 0c0-6.627-5.373-12-12-12S8 13.373 8 20s5.373 12 12 12 12-5.373 12-12Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default ClockIcon
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const CornIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M25.878 23.5c.024-.328.044-.662.06-1h-.453a.5.5 0 0 1-.465-.684c-.374.644-.727 1.33-1.052 2.053a.5.5 0 0 1-.25.573 24.22 24.22 0 0 0-.416 1.066c-1.21 3.322-1.566 6.548-1.229 9.123 1.818-1.586 3.22-5.24 3.717-10.131h-.305a.5.5 0 1 1 0-1h.393ZM25.485 21.5a.5.5 0 0 0-.389.186c.244-.413.497-.809.756-1.186h.134c0 .337-.004.67-.012 1h-.489Z" fill="currentColor" />
|
||||
<path d="M24.985 19.996a.5.5 0 0 1 .328-.465c.207-.287.42-.563.635-.829a43.533 43.533 0 0 0-.009-.202h-.454a.5.5 0 1 1 0-1h.396c-.024-.337-.052-.67-.084-1h-.312a.5.5 0 1 1 0-1h.202a36.358 36.358 0 0 0-.137-1h-.065a.5.5 0 0 1-.1-.99c-.071-.387-.147-.765-.229-1.134a.499.499 0 0 1-.132-.569c-.318-1.308-.706-2.485-1.15-3.493a.5.5 0 0 1-.389.186h-1a.5.5 0 1 1 0-1h1a10.25 10.25 0 0 0-.592-1h-.408a.5.5 0 0 1-.305-.896C21.5 4.89 20.76 4.5 19.986 4.5c-.775 0-1.515.391-2.195 1.104a.5.5 0 0 1-.306.896h-.406a10.27 10.27 0 0 0-.592 1h.998a.5.5 0 0 1 0 1h-1a.499.499 0 0 1-.388-.185c-.444 1.008-.831 2.185-1.15 3.494a.498.498 0 0 1-.131.566c-.082.37-.158.748-.229 1.135a.5.5 0 0 1-.102.99h-.063c-.05.328-.096.662-.137 1h.2a.5.5 0 0 1 0 1h-.31c-.032.33-.06.663-.084 1h.394a.5.5 0 0 1 0 1h-.453l-.008.176c.227.278.45.567.668.868a.5.5 0 0 1 .292.415c.38.554.743 1.143 1.086 1.763a.5.5 0 0 1 .415-.222h1a.5.5 0 0 1 0 1h-1.004c.164.326.323.66.476 1h.528a.5.5 0 0 1 0 1h-.106c.087.22.171.441.253.666 1.323 3.634 1.688 7.225 1.208 10.081.37.167.754.253 1.146.253.4 0 .79-.09 1.167-.262-.478-2.855-.112-6.441 1.21-10.072.081-.225.166-.447.253-.666h-.13a.5.5 0 1 1 0-1h.551c.153-.34.312-.675.477-1h-1.029a.5.5 0 1 1 0-1h1a.5.5 0 0 1 .428.242c.339-.614.698-1.197 1.072-1.746Zm-5.5-4.496h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5-5.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5 1.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5-5.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5 11.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5 2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5 1.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5 2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5 1.5h1a.5.5 0 1 1 0 1h-1a.5.5 0 0 1 0-1Zm-.5-11.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5-6.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm2.5 8.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5-6.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5 2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm0 6a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5 1.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5-5.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm-6 2a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5-6.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5 2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm0 6a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Zm.5 1.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 1 1 0-1Zm-.5-5.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 0 1h-1a.5.5 0 0 1-.5-.5Z" fill="currentColor" />
|
||||
<path d="M14.142 20.5h-.156c0 .337.004.67.011 1h.488a.5.5 0 0 1 0 1h-.452c.016.338.037.672.06 1h.392a.5.5 0 0 1 0 1h-.303c.498 4.91 1.909 8.572 3.737 10.148.341-2.578-.015-5.81-1.227-9.14-.13-.358-.267-.708-.41-1.051a.5.5 0 0 1-.27-.62 21.565 21.565 0 0 0-1.87-3.337ZM28.93 18.055a.45.45 0 0 0-.758-.276c-1.894 1.756-3.672 4.437-4.87 7.729-1.198 3.291-1.56 6.488-1.238 9.05a.45.45 0 0 0 .759.277c1.894-1.757 3.671-4.438 4.87-7.73 1.197-3.291 1.559-6.488 1.237-9.05Z" fill="currentColor" />
|
||||
<path d="M11.823 17.779a.45.45 0 0 0-.759.276c-.321 2.562.04 5.759 1.238 9.05 1.199 3.292 2.976 5.973 4.87 7.73a.45.45 0 0 0 .758-.276c.322-2.563-.04-5.76-1.238-9.051-1.198-3.292-2.976-5.973-4.87-7.73Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default CornIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const CupIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M25.207 31h-9.414l-1.56-19h12.534l-1.56 18.99V31Z" fill="currentColor" />
|
||||
<path d="M12.074 6a1 1 0 0 0-.998 1.071l1.725 24.143A3 3 0 0 0 15.793 34h9.414a3 3 0 0 0 2.992-2.786L29.923 7.07A1 1 0 0 0 28.927 6H12.074Zm2.16 5h12.533a1 1 0 0 1 .996 1.082l-1.559 18.99a1 1 0 0 1-.997.928h-9.414a1 1 0 0 1-.997-.929l-1.56-18.99A1 1 0 0 1 14.234 11Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default CupIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const DrinkBottleIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M14 18h12v16a2 2 0 0 1-2 2h-8a2 2 0 0 1-2-2V18ZM14 12a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v5H14v-5ZM17 5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V5Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default DrinkBottleIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const DropletIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M20 34c5.727 0 10.37-4.864 10.37-10.866 0-5.027-7.277-14.022-9.64-16.81a.951.951 0 0 0-1.461 0c-2.362 2.788-9.64 11.783-9.64 16.81C9.63 29.136 14.272 34 20 34Zm8.514-10.866c0 5.198-3.983 9.102-8.514 9.102a.5.5 0 1 1 0-1c3.942 0 7.514-3.419 7.514-8.102a.5.5 0 1 1 1 0Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default DropletIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const FemalePersonIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M20 4a3 3 0 0 0-3 3v1a3 3 0 1 0 6 0V7a3 3 0 0 0-3-3ZM17 17l-2.48 5.788A2 2 0 0 1 12.68 24h-.923a.5.5 0 0 1-.46-.697L14 17l.994-2.486A4 4 0 0 1 18.708 12h2.584a4 4 0 0 1 3.714 2.514L26 17l2.701 6.303a.5.5 0 0 1-.46.697h-.922a2 2 0 0 1-1.838-1.212L23 17l2.806 9.356a.5.5 0 0 1-.479.644h-1.386l-.657 8.538a.5.5 0 0 1-.498.462h-.112a2 2 0 0 1-1.999-1.923L20.404 27h-.808l-.272 7.077A2 2 0 0 1 17.325 36h-.112a.5.5 0 0 1-.498-.462L16.058 27h-1.386a.5.5 0 0 1-.479-.644L17 17Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default FemalePersonIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const FireIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M19.902 31.078c-4.068-.042-6.153-4.141-4.714-7.207.776-1.657 1.246-2.884 1.525-3.711l.035.031c.727.652 2.1.864 2.893-.193.655-.872 1.09-1.818 1.38-2.665.989 2.258 1.187 4.515 1.191 5.91.002.64.303 1.269.834 1.621.274.183.633.302 1.031.256.186-.021.359-.077.515-.157.531 3.664-2.107 6.143-4.69 6.115Z" fill="currentColor" />
|
||||
<path d="M28.782 19.395c1.568 4.95-.393 14.246-8.89 14.257-7.334.011-12.01-6.665-8.93-14.19.177-.433.345-.825.504-1.194.698-1.626 1.212-2.822 1.468-5.213a.537.537 0 0 1 .815-.399c.594.356 1.172.866 1.625 1.316.474.471 1.286.434 1.623-.143 1.72-2.953 2.123-5.661 2.203-7.068a.534.534 0 0 1 .86-.399c5.407 4.177 5.917 10.087 5.769 13.114-.04.817.772 1.356 1.301.732.27-.318.5-.648.685-.943a.537.537 0 0 1 .967.13Zm-11.366.052c-.333-.3-.724-.604-1.048-.727a.237.237 0 0 0-.315.169c-.135.528-.579 2.012-1.77 4.557-1.725 3.676.759 8.582 5.609 8.632 3.433.037 6.634-3.384 5.554-7.971l-.02-.081a8.762 8.762 0 0 0-.12-.44l-.001-.005a9.088 9.088 0 0 0-.08-.253.243.243 0 0 0-.444-.045 3.59 3.59 0 0 1-.427.608l-.023.027c-.46.516-1.117.014-1.119-.678-.005-1.677-.273-4.594-1.796-7.365a13.066 13.066 0 0 0-.334-.572l-.002-.004-.115-.181c-.118-.186-.41-.124-.444.095-.01.066-.023.136-.036.21v.005a11 11 0 0 1-.129.607c-.23.958-.672 2.24-1.515 3.363-.34.455-1.002.429-1.425.049Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default FireIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const FirstAidIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M21.5 16.5a.5.5 0 0 0-.5-.5h-2a.5.5 0 0 0-.5.5v2a.5.5 0 0 1-.5.5h-2a.5.5 0 0 0-.5.5v2a.5.5 0 0 0 .5.5h2a.5.5 0 0 1 .5.5v2a.5.5 0 0 0 .5.5h2a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-2a.5.5 0 0 1-.5-.5v-2Z" fill="currentColor" />
|
||||
<path d="M16 9v1H7a2 2 0 0 0-2 2v17a2 2 0 0 0 2 2h26a2 2 0 0 0 2-2V12a2 2 0 0 0-2-2h-9V9a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2Zm6 0v1h-4V9h4ZM9.5 12a.5.5 0 0 1 .5.5v16a.5.5 0 0 1-1 0v-16a.5.5 0 0 1 .5-.5Zm20.5.5a.5.5 0 0 1 1 0v16a.5.5 0 0 1-1 0v-16ZM21 15a1.5 1.5 0 0 1 1.5 1.5V18H24a1.5 1.5 0 0 1 1.5 1.5v2A1.5 1.5 0 0 1 24 23h-1.5v1.5A1.5 1.5 0 0 1 21 26h-2a1.5 1.5 0 0 1-1.5-1.5V23H16a1.5 1.5 0 0 1-1.5-1.5v-2A1.5 1.5 0 0 1 16 18h1.5v-1.5A1.5 1.5 0 0 1 19 15h2Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default FirstAidIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const GlobeIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M21.234 30.355c-.476.483-.892.645-1.234.645-.342 0-.758-.162-1.234-.645-.479-.486-.956-1.24-1.378-2.254-.472-1.132-.85-2.528-1.092-4.101h7.408c-.242 1.573-.62 2.969-1.091 4.1-.423 1.014-.9 1.769-1.38 2.255ZM16 20c0 1.043.057 2.048.163 3h7.674c.106-.952.163-1.957.163-3s-.057-2.048-.163-3h-7.674A27.123 27.123 0 0 0 16 20ZM22.199 30.78c1.167-1.374 2.079-3.808 2.516-6.78h5.535a11.02 11.02 0 0 1-8.051 6.78ZM24.843 23h5.743c.27-.954.414-1.96.414-3s-.144-2.046-.414-3h-5.743c.102.959.157 1.964.157 3s-.055 2.041-.157 3ZM9.414 23h5.744A28.206 28.206 0 0 1 15 20c0-1.036.055-2.041.158-3H9.414c-.27.954-.414 1.96-.414 3s.144 2.046.414 3ZM15.284 24H9.75a11.02 11.02 0 0 0 8.051 6.78c-1.167-1.374-2.079-3.808-2.516-6.78ZM23.704 16h-7.408c.242-1.573.62-2.969 1.091-4.1.423-1.014.9-1.769 1.38-2.255C19.241 9.162 19.657 9 20 9c.342 0 .758.162 1.234.645.479.486.956 1.24 1.378 2.254.472 1.132.85 2.528 1.092 4.101ZM30.25 16h-5.535c-.437-2.972-1.349-5.406-2.516-6.78A11.02 11.02 0 0 1 30.25 16ZM15.284 16c.438-2.972 1.35-5.406 2.517-6.78A11.02 11.02 0 0 0 9.75 16h5.534Z" fill="currentColor" />
|
||||
<path d="M20 34c-7.732 0-14-6.268-14-14S12.268 6 20 6s14 6.268 14 14-6.268 14-14 14Zm12-14c0-6.627-5.373-12-12-12S8 13.373 8 20s5.373 12 12 12 12-5.373 12-12Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default GlobeIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const HandIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M19.368 8.3c0-.718.571-1.3 1.276-1.3.705 0 1.276.582 1.276 1.3v9.086c0 .347.202.66.515.796a.848.848 0 0 0 1.171-.645l1.228-7.096a1.278 1.278 0 0 1 1.478-1.054 1.298 1.298 0 0 1 1.035 1.506l-1.407 8.131a.823.823 0 0 0 .475.896.796.796 0 0 0 .996-.313l2.57-4.11a1.085 1.085 0 0 1 1.905.105c.153.314.152.682-.002.994L29.576 21.3l-2.683 8.2c-.684 2.09-2.604 3.5-4.767 3.5h-2.247c-1.7 0-3.584-1.68-4.84-2.96-1.257-1.28-7.551-6.671-7.551-6.671a1.441 1.441 0 0 1-.3-1.792 1.382 1.382 0 0 1 1.904-.522l4.424 2.587c.785.459 1.774-.053 1.874-.969l.075-.684c.013-.12.01-.24-.01-.359l-1.9-11.238a1.322 1.322 0 0 1 1.054-1.529 1.3 1.3 0 0 1 1.497 1.032l1.697 8.243a.787.787 0 0 0 1.248.479.81.81 0 0 0 .317-.645V8.3Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default HandIcon
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const HouseIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M30.276 20.2 19.746 9.434 9.214 20.2a1 1 0 0 1-1.43-1.398L18.673 7.67a1.5 1.5 0 0 1 2.145 0L24 10.924V8.5a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5v5.49l4.706 4.81a1 1 0 1 1-1.43 1.4Z" fill="currentColor" />
|
||||
<path d="M28.746 20.5v8a2 2 0 0 1-2 2h-4v-6a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v6h-4a2 2 0 0 1-2-2v-8l8.646-8.646a.5.5 0 0 1 .707 0l8.647 8.646Z" fill="currentColor" />
|
||||
<path d="M21.746 30.5v-6h-4v6h4Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default HouseIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const LaptopIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M30 12H10v12h20V12Z" fill="currentColor" />
|
||||
<path d="M9 9a2 2 0 0 0-2 2v16h26V11a2 2 0 0 0-2-2H9Zm.917 2h20.166c.507 0 .917.392.917.875V25H9V11.875c0-.483.41-.875.917-.875ZM4 29v-1h12a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1h12v1a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default LaptopIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const LightBulbIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M9.098 16.38C8.224 9.826 13.324 4 19.938 4h1.019c6.613 0 11.713 5.825 10.84 12.38a13.5 13.5 0 0 1-1.661 4.914l-2.085 3.649A2.098 2.098 0 0 1 26.23 26H14.665a2.098 2.098 0 0 1-1.822-1.057l-2.085-3.649a13.5 13.5 0 0 1-1.66-4.913Zm12.145-6.317a.5.5 0 0 0-.68.194l-1.675 3.014A1.5 1.5 0 0 0 20.2 15.5h.616a.5.5 0 0 1 .44.74l-2.194 4.02a.5.5 0 1 0 .878.48l2.193-4.022a1.5 1.5 0 0 0-1.317-2.218H20.2a.5.5 0 0 1-.437-.743l1.675-3.014a.5.5 0 0 0-.194-.68ZM14.5 28a1 1 0 0 1 1-1h10a1 1 0 1 1 0 2h-10a1 1 0 0 1-1-1ZM16.5 30a1 1 0 1 0 0 2h8a1 1 0 1 0 0-2h-8ZM16.534 33a.024.024 0 0 0-.023.032l.04.122a4.162 4.162 0 0 0 7.898 0l.04-.122a.024.024 0 0 0-.023-.032h-7.933Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default LightBulbIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const MalePersonIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M17 7a3 3 0 1 1 6 0v1a3 3 0 0 1-6 0V7Z" fill="currentColor" />
|
||||
<path clip-rule="evenodd" d="m20 23-.858 11.153A2 2 0 0 1 17.148 36H16.5a.5.5 0 0 1-.5-.5V16.8l-1.168 5.608A2 2 0 0 1 12.874 24h-.76a.5.5 0 0 1-.489-.602l1.763-8.461A3.69 3.69 0 0 1 17 12h6a3.69 3.69 0 0 1 3.612 2.937l1.763 8.461a.5.5 0 0 1-.49.602h-.759a2 2 0 0 1-1.958-1.592L24 16.8v18.7a.5.5 0 0 1-.5.5h-.648a2 2 0 0 1-1.994-1.847L20 23Z" fill="currentColor" fillRule="evenodd" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default MalePersonIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const MealIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M4 11a2.5 2.5 0 0 1 5 0v2a2.5 2.5 0 0 1-1.5 2.292V28.5a1 1 0 1 1-2 0V15.292A2.5 2.5 0 0 1 4 13v-2ZM27 19.5a7 7 0 1 1-14 0 7 7 0 0 1 14 0Z" fill="currentColor" />
|
||||
<path d="M20 29.5c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10Zm8-10a8 8 0 1 1-16 0 8 8 0 0 1 16 0ZM34.5 15.292A2.5 2.5 0 0 0 36 13v-2c0-.459-.123-.888-.339-1.258C35.453 9.386 35 9.588 35 10v2a.5.5 0 0 1-1 0v-2a.5.5 0 0 0-1 0v2a.5.5 0 0 1-1 0v-1.999c0-.412-.454-.614-.661-.258-.216.37-.339.799-.339 1.257v2a2.5 2.5 0 0 0 1.5 2.292V28.5a1 1 0 1 0 2 0V15.292Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default MealIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const MobilePhoneIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M14 5a2 2 0 0 0-2 2v26a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2H14Zm5.5 2h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1Zm-2.5.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM18.5 32h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default MobilePhoneIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const MortarboardIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M5.246 17.925c-.826-.34-.826-1.51 0-1.85l14.373-5.918a1 1 0 0 1 .762 0l14.373 5.918c.826.34.826 1.51 0 1.85l-2.38.98v3.147a1 1 0 0 1 0 1.733v.134l.638 1.276a.5.5 0 0 1-.447.724h-1.382a.5.5 0 0 1-.448-.724l.639-1.276v-.134a1 1 0 0 1 0-1.733v-2.735L20.38 23.843a1 1 0 0 1-.762 0L5.246 17.925Z" fill="currentColor" />
|
||||
<path d="M10 20.964V28c0 1.105 4.477 2 10 2s10-.895 10-2v-7.036l-9.238 3.804a2 2 0 0 1-1.523 0L10 20.964Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default MortarboardIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const PersonIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M20 4a3 3 0 0 0-3 3v1a3 3 0 1 0 6 0V7a3 3 0 0 0-3-3ZM16.893 17.748c.017-.115-.145-.16-.19-.053l-2.183 5.093A2 2 0 0 1 12.68 24h-.923a.5.5 0 0 1-.46-.697L14 17l.994-2.486A4 4 0 0 1 18.708 12h2.584a4 4 0 0 1 3.714 2.514L26 17l2.701 6.303a.5.5 0 0 1-.46.697h-.922a2 2 0 0 1-1.838-1.212l-2.183-5.093c-.046-.108-.207-.062-.191.053L24 24l.955 11.459a.5.5 0 0 1-.498.541h-.763a2 2 0 0 1-1.973-1.671L20.1 24.592c-.019-.112-.179-.112-.198 0l-1.622 9.737A2 2 0 0 1 16.306 36h-.763a.5.5 0 0 1-.498-.541L16 24l.893-6.252Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default PersonIcon
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const SpannerIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M29.217 28.717a1 1 0 1 0-2 0 1 1 0 0 0 2 0Z" fill="currentColor" />
|
||||
<path d="M21.101 15.945a7.997 7.997 0 0 0-2.071-7.729 7.979 7.979 0 0 0-6.018-2.335c-.77.035-1.03.945-.485 1.49l3.944 3.944a1 1 0 0 1 .242 1.023l-1.06 3.182a1 1 0 0 1-.633.632l-3.182 1.061a1 1 0 0 1-1.023-.242L6.87 13.027c-.544-.544-1.454-.285-1.489.485a7.98 7.98 0 0 0 2.335 6.018 7.997 7.997 0 0 0 7.729 2.071l9.858 9.86a4 4 0 0 0 5.657-5.658l-9.859-9.858Zm5.116 12.772a2 2 0 1 1 4 0 2 2 0 0 1-4 0Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default SpannerIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const StarIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M19.497 6.358c.158-.477.848-.477 1.006 0l3.178 9.582c.071.214.274.358.503.358H34.47c.512 0 .726.643.31.938l-8.32 5.922a.512.512 0 0 0-.192.58l3.178 9.581c.158.478-.4.875-.814.58l-8.321-5.922a.538.538 0 0 0-.622 0l-8.321 5.922c-.415.295-.972-.102-.814-.58l3.178-9.582a.512.512 0 0 0-.192-.58l-8.32-5.921c-.415-.295-.202-.938.31-.938h10.286c.229 0 .432-.144.502-.358l3.179-9.582Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default StarIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const SyringeIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M15.5 4a.5.5 0 0 0 0 1H17v3h-2.5a.5.5 0 0 0 0 1H16v2h3.5a.5.5 0 0 1 0 1H16v2h3.5a.5.5 0 0 1 0 1H16v2h3.5a.5.5 0 0 1 0 1H16v9a4 4 0 0 0 3.5 3.97v3.794c0 .155.036.308.106.447l.305.61a.1.1 0 0 0 .178 0l.305-.61a.999.999 0 0 0 .106-.447v-3.795A4 4 0 0 0 24 27V9h1.5a.5.5 0 0 0 0-1H23V5h1.5a.5.5 0 0 0 0-1h-9Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default SyringeIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const TentIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M18.337 9.088a.5.5 0 0 0-.129.695l1.168 1.574L7.4 27.5H4.5a.5.5 0 0 0 0 1h31a.5.5 0 0 0 0-1h-2.9L20.62 11.357l1.167-1.574a.5.5 0 0 0-.824-.566l-.965 1.301-.966-1.301a.5.5 0 0 0-.695-.129Zm2.48 12.036 3.591 5.088a.5.5 0 0 1-.817.576L20 21.7l-3.591 5.088a.5.5 0 0 1-.817-.576l3.591-5.088a1 1 0 0 1 1.634 0Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default TentIcon
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const TreeIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M20 6a7 7 0 0 0-7 7v.427A7.5 7.5 0 0 0 15.5 28H19v4h-6a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2h-6v-4h3.5A7.5 7.5 0 0 0 27 13.427V13a7 7 0 0 0-7-7Zm9.429 14.5a.5.5 0 0 1 .5.5c0 2.41-1.69 4.5-3.929 4.5a.5.5 0 0 1 0-1c1.548 0 2.929-1.492 2.929-3.5a.5.5 0 0 1 .5-.5Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default TreeIcon
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
import { cn } from '@/lib/utils'
|
||||
import React from 'react'
|
||||
|
||||
const TruckIcon = ({
|
||||
className
|
||||
}: {
|
||||
className?: string
|
||||
}) => {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="40" viewBox="0 0 40 40" width="40" className={cn(className)}>
|
||||
<path d="M12 29a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM29 27a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor">
|
||||
</path>
|
||||
<path d="M6 9a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v3h4a4 4 0 0 1 4 4v10a1 1 0 0 1-1 1h-2a4 4 0 0 1-8 0h-7a4 4 0 0 1-8 0H7a1 1 0 0 1-1-1V9Zm26 9v-2a2 2 0 0 0-2-2h-4v4h6Zm-17 9a3 3 0 1 0-6 0 3 3 0 0 0 6 0Zm12 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z" fill="currentColor" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
export default TruckIcon
|
||||
10
servers/nextjs/cypress.config.ts
Normal file
10
servers/nextjs/cypress.config.ts
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
import { defineConfig } from "cypress";
|
||||
|
||||
export default defineConfig({
|
||||
component: {
|
||||
devServer: {
|
||||
framework: "next",
|
||||
bundler: "webpack",
|
||||
},
|
||||
},
|
||||
});
|
||||
5
servers/nextjs/cypress/fixtures/example.json
Normal file
5
servers/nextjs/cypress/fixtures/example.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
||||
1
servers/nextjs/cypress/fixtures/example.txt
Normal file
1
servers/nextjs/cypress/fixtures/example.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
This is a sample text file for testing file uploads in the UploadPage component.
|
||||
1
servers/nextjs/cypress/fixtures/test-doc.txt
Normal file
1
servers/nextjs/cypress/fixtures/test-doc.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
Test content
|
||||
37
servers/nextjs/cypress/support/commands.ts
Normal file
37
servers/nextjs/cypress/support/commands.ts
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/// <reference types="cypress" />
|
||||
// ***********************************************
|
||||
// This example commands.ts shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
//
|
||||
// declare global {
|
||||
// namespace Cypress {
|
||||
// interface Chainable {
|
||||
// login(email: string, password: string): Chainable<void>
|
||||
// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
||||
// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
|
||||
// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
14
servers/nextjs/cypress/support/component-index.html
Normal file
14
servers/nextjs/cypress/support/component-index.html
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>Components App</title>
|
||||
<!-- Used by Next.js to inject CSS. -->
|
||||
<div id="__next_css__DO_NOT_USE__"></div>
|
||||
</head>
|
||||
<body>
|
||||
<div data-cy-root></div>
|
||||
</body>
|
||||
</html>
|
||||
36
servers/nextjs/cypress/support/component.ts
Normal file
36
servers/nextjs/cypress/support/component.ts
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// ***********************************************************
|
||||
// This example support/component.ts is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
|
||||
import { mount } from 'cypress/react'
|
||||
|
||||
// Augment the Cypress namespace to include type definitions for
|
||||
// your custom command.
|
||||
// Alternatively, can be defined in cypress/support/component.d.ts
|
||||
// with a <reference path="./component" /> at the top of your spec.
|
||||
declare global {
|
||||
namespace Cypress {
|
||||
interface Chainable {
|
||||
mount: typeof mount
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Cypress.Commands.add('mount', mount)
|
||||
|
||||
// Example use:
|
||||
// cy.mount(<MyComponent />)
|
||||
1399
servers/nextjs/package-lock.json
generated
1399
servers/nextjs/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -85,6 +85,7 @@
|
|||
"@types/uuid": "^10.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.14.0",
|
||||
"@typescript-eslint/parser": "^8.14.0",
|
||||
"cypress": "^14.3.3",
|
||||
"eslint": "^8",
|
||||
"eslint-config-next": "^14.2.14",
|
||||
"postcss": "^8",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue