├── .github └── workflows │ └── pages.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── index.html ├── package.json ├── public ├── favicon.ico ├── logo192.png ├── logo512.png ├── manifest.json ├── pdf.svg └── robots.txt ├── screenshot.png ├── src ├── App.tsx ├── assets │ └── react.svg ├── components │ ├── Document.tsx │ ├── DownloadPDF.tsx │ ├── EditableCalendarInput.tsx │ ├── EditableFileImage.tsx │ ├── EditableInput.tsx │ ├── EditableSelect.tsx │ ├── EditableTextarea.tsx │ ├── InvoicePage.tsx │ ├── Page.tsx │ ├── Text.tsx │ └── View.tsx ├── data │ ├── countryList.ts │ ├── initialData.ts │ └── types.ts ├── hooks │ └── useOnClickOutside.ts ├── images │ ├── download.svg │ ├── remove.svg │ ├── resize.svg │ ├── template_download.svg │ └── template_upload.svg ├── main.tsx ├── scss │ ├── _app.scss │ ├── _color.scss │ ├── _icons.scss │ ├── _layout.scss │ ├── _spacing.scss │ ├── _text.scss │ ├── _typography.scss │ ├── _variables.scss │ └── main.scss ├── serviceWorker.ts ├── styles │ ├── compose.ts │ └── styles.ts └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── yarn.lock /.github/workflows/pages.yml: -------------------------------------------------------------------------------- 1 | name: Github Pages 2 | on: 3 | push: 4 | branches: ['master'] 5 | workflow_dispatch: 6 | 7 | permissions: 8 | pages: write 9 | id-token: write 10 | 11 | concurrency: 12 | group: 'pages' 13 | cancel-in-progress: false 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v3 20 | - run: yarn 21 | - run: yarn build --base=/react-invoice-generator/ 22 | - name: Upload artifact 23 | uses: actions/upload-pages-artifact@v3 24 | with: 25 | name: 'github-pages' 26 | path: 'dist' 27 | 28 | deploy: 29 | environment: 30 | name: github-pages 31 | url: ${{ steps.deployment.outputs.page_url }} 32 | runs-on: ubuntu-latest 33 | needs: build 34 | steps: 35 | - name: Deploy to GitHub Pages 36 | uses: actions/deploy-pages@v4 37 | with: 38 | path: dist 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false, 4 | "printWidth": 100 5 | } 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Tuan Pham 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Invoice Generator 2 | 3 | React Invoice Generator allows you quickly make invoices and save them as PDF. [https://tuanpham-dev.github.io/react-invoice-generator/](https://tuanpham-dev.github.io/react-invoice-generator/) 4 | 5 | ![react-invoice-generator](https://raw.githubusercontent.com/tuanpham-dev/react-invoice-generator/master/screenshot.png) 6 | 7 | ## Available Scripts 8 | 9 | In the project directory, you can run: 10 | 11 | ### `yarn start` 12 | 13 | Runs the app in the development mode.
14 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 15 | 16 | The page will reload if you make edits.
17 | You will also see any lint errors in the console. 18 | 19 | ### `yarn lint` (`lint:write`) 20 | 21 | Launches Prettier, an opinionated code formatter. 22 | 23 | https://prettier.io/ 24 | 25 | ### `yarn build` 26 | 27 | Builds the app for production to the `build` folder.
28 | It correctly bundles React in production mode and optimizes the build for the best performance. 29 | 30 | The build is minified and the filenames include the hashes.
31 | Your app is ready to be deployed! 32 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | React Invoice Generator 8 | 9 | 10 | 11 | 12 | 13 | 14 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "invoice-generator", 3 | "version": "0.2.1", 4 | "private": true, 5 | "type": "module", 6 | "homepage": "https://tuanpham-dev.github.io/react-invoice-generator/", 7 | "scripts": { 8 | "dev": "vite", 9 | "build": "tsc && vite build", 10 | "lint": "prettier -c .", 11 | "lint:write": "prettier -w .", 12 | "preview": "vite preview" 13 | }, 14 | "dependencies": { 15 | "@react-pdf/renderer": "^3.4.2", 16 | "@uidotdev/usehooks": "^2.4.1", 17 | "@vitejs/plugin-react-swc": "^3.6.0", 18 | "date-fns": "^3.6.0", 19 | "file-saver": "^2.0.5", 20 | "gh-pages": "^6.1.1", 21 | "rc-slider": "10.5.0", 22 | "react": "^18.2.0", 23 | "react-datepicker": "^6.6.0", 24 | "react-dom": "^18.2.0", 25 | "react-textarea-autosize": "^8.5.3", 26 | "sass": "^1.72.0", 27 | "typescript": "^5.4.3", 28 | "vite": "^5.2.7", 29 | "zod": "^3.22.4" 30 | }, 31 | "devDependencies": { 32 | "@types/date-fns": "^2.6.0", 33 | "@types/file-saver": "^2.0.7", 34 | "@types/node": "^20.11.30", 35 | "@types/rc-slider": "^9.3.0", 36 | "@types/react": "^18.2.73", 37 | "@types/react-datepicker": "^6.2.0", 38 | "@types/react-dom": "^18.2.23", 39 | "@types/react-textarea-autosize": "^8.0.0", 40 | "prettier": "^3.2.5" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuanpham-dev/react-invoice-generator/63172bd2c6d09455bcaa574bdd6a4b6c5fa5393f/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuanpham-dev/react-invoice-generator/63172bd2c6d09455bcaa574bdd6a4b6c5fa5393f/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuanpham-dev/react-invoice-generator/63172bd2c6d09455bcaa574bdd6a4b6c5fa5393f/public/logo512.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Invoice Generator", 3 | "name": "React Invoice Generator", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /public/pdf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 10 | 11 | 14 | 16 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuanpham-dev/react-invoice-generator/63172bd2c6d09455bcaa574bdd6a4b6c5fa5393f/screenshot.png -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import InvoicePage from './components/InvoicePage' 2 | import { Invoice } from './data/types' 3 | 4 | function App() { 5 | const savedInvoice = window.localStorage.getItem('invoiceData') 6 | let data = null 7 | 8 | try { 9 | if (savedInvoice) { 10 | data = JSON.parse(savedInvoice) 11 | } 12 | } catch (_e) {} 13 | 14 | const onInvoiceUpdated = (invoice: Invoice) => { 15 | window.localStorage.setItem('invoiceData', JSON.stringify(invoice)) 16 | } 17 | 18 | return ( 19 |
20 |

React Invoice Generator

21 | 22 |
23 | ) 24 | } 25 | 26 | export default App 27 | -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Document.tsx: -------------------------------------------------------------------------------- 1 | import { FC, PropsWithChildren } from 'react' 2 | import { Document as PdfDocument } from '@react-pdf/renderer' 3 | 4 | interface Props { 5 | pdfMode?: boolean 6 | } 7 | 8 | const Document: FC> = ({ pdfMode, children }) => { 9 | return <>{pdfMode ? {children} : <>{children}} 10 | } 11 | 12 | export default Document 13 | -------------------------------------------------------------------------------- /src/components/DownloadPDF.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from 'react' 2 | import { PDFDownloadLink } from '@react-pdf/renderer' 3 | import { Invoice, TInvoice } from '../data/types' 4 | import { useDebounce } from '@uidotdev/usehooks' 5 | import InvoicePage from './InvoicePage' 6 | import FileSaver from 'file-saver' 7 | 8 | interface Props { 9 | data: Invoice 10 | setData(data: Invoice): void 11 | } 12 | 13 | const Download: FC = ({ data, setData }) => { 14 | const debounced = useDebounce(data, 500) 15 | 16 | function handleInput(e: React.ChangeEvent) { 17 | if (!e.target.files?.length) return 18 | 19 | const file = e.target.files[0] 20 | file 21 | .text() 22 | .then((str: string) => { 23 | try { 24 | if (!(str.startsWith('{') && str.endsWith('}'))) { 25 | str = atob(str) 26 | } 27 | const d = JSON.parse(str) 28 | const dParsed = TInvoice.parse(d) 29 | console.info('parsed correctly') 30 | setData(dParsed) 31 | } catch (e) { 32 | console.error(e) 33 | return 34 | } 35 | }) 36 | .catch((err) => console.error(err)) 37 | } 38 | 39 | function handleSaveTemplate() { 40 | const blob = new Blob([JSON.stringify(debounced)], { 41 | type: 'text/plain;charset=utf-8', 42 | }) 43 | FileSaver(blob, title + '.template') 44 | } 45 | 46 | const title = data.invoiceTitle ? data.invoiceTitle.toLowerCase() : 'invoice' 47 | return ( 48 |
49 | } 52 | fileName={`${title}.pdf`} 53 | aria-label="Save PDF" 54 | title="Save PDF" 55 | className="download-pdf__pdf" 56 | > 57 |

Save PDF

58 | 59 |
72 | ) 73 | } 74 | 75 | export default Download 76 | -------------------------------------------------------------------------------- /src/components/EditableCalendarInput.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react' 2 | import { Text } from '@react-pdf/renderer' 3 | import DatePicker from 'react-datepicker' 4 | import 'react-datepicker/dist/react-datepicker.css' 5 | import compose from '../styles/compose' 6 | 7 | interface Props { 8 | className?: string 9 | value?: string 10 | selected?: Date 11 | onChange?: (date: Date | [Date, Date] | null) => void 12 | pdfMode?: boolean 13 | } 14 | 15 | const EditableCalendarInput: FC = ({ className, value, selected, onChange, pdfMode }) => { 16 | return ( 17 | <> 18 | {pdfMode ? ( 19 | {value} 20 | ) : ( 21 | onChange(date) : () => null} 25 | dateFormat="MMM dd, yyyy" 26 | /> 27 | )} 28 | 29 | ) 30 | } 31 | 32 | export default EditableCalendarInput 33 | -------------------------------------------------------------------------------- /src/components/EditableFileImage.tsx: -------------------------------------------------------------------------------- 1 | import { FC, useRef, useState } from 'react' 2 | import Slider from 'rc-slider' 3 | import { Image } from '@react-pdf/renderer' 4 | import useOnClickOutside from '../hooks/useOnClickOutside' 5 | import compose from '../styles/compose' 6 | import 'rc-slider/assets/index.css' 7 | 8 | interface Props { 9 | className?: string 10 | placeholder?: string 11 | value?: string 12 | width?: number 13 | onChangeImage?: (value: string) => void 14 | onChangeWidth?: (value: number) => void 15 | pdfMode?: boolean 16 | } 17 | 18 | const EditableFileImage: FC = ({ 19 | className, 20 | placeholder, 21 | value, 22 | width, 23 | onChangeImage, 24 | onChangeWidth, 25 | pdfMode, 26 | }) => { 27 | const fileInput = useRef(null) 28 | const widthWrapper = useRef(null) 29 | const [isEditing, setIsEditing] = useState(false) 30 | const marks = { 31 | 100: '100px', 32 | 150: '150px', 33 | 200: '200px', 34 | 250: '250px', 35 | } 36 | 37 | const handleClickOutside = () => { 38 | if (isEditing) { 39 | setIsEditing(false) 40 | } 41 | } 42 | 43 | useOnClickOutside(widthWrapper, handleClickOutside) 44 | 45 | const handleUpload = () => { 46 | fileInput?.current?.click() 47 | } 48 | 49 | const handleChangeImage = () => { 50 | if (fileInput?.current?.files) { 51 | const files = fileInput.current.files 52 | 53 | if (files.length > 0 && typeof onChangeImage === 'function') { 54 | const reader = new FileReader() 55 | 56 | reader.addEventListener('load', () => { 57 | if (typeof reader.result === 'string') { 58 | onChangeImage(reader.result) 59 | } 60 | }) 61 | 62 | reader.readAsDataURL(files[0]) 63 | } 64 | } 65 | } 66 | 67 | const handleChangeWidth = (value: number) => { 68 | if (typeof onChangeWidth === 'function') { 69 | onChangeWidth(value) 70 | } 71 | } 72 | 73 | const handleEdit = () => { 74 | setIsEditing(!isEditing) 75 | } 76 | 77 | const clearImage = () => { 78 | if (typeof onChangeImage === 'function') { 79 | onChangeImage('') 80 | } 81 | } 82 | 83 | if (pdfMode) { 84 | if (value) { 85 | return ( 86 | 93 | ) 94 | } else { 95 | return <> 96 | } 97 | } 98 | 99 | return ( 100 |
101 | {!value ? ( 102 | 105 | ) : ( 106 | <> 107 | {placeholder} 113 | 114 | 117 | 118 | 121 | 122 | 125 | 126 | {isEditing && ( 127 |
128 | 137 |
138 | )} 139 | 140 | )} 141 | 142 | 150 |
151 | ) 152 | } 153 | 154 | export default EditableFileImage 155 | -------------------------------------------------------------------------------- /src/components/EditableInput.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react' 2 | import { Text } from '@react-pdf/renderer' 3 | import compose from '../styles/compose' 4 | 5 | interface Props { 6 | className?: string 7 | placeholder?: string 8 | value?: string 9 | onChange?: (value: string) => void 10 | pdfMode?: boolean 11 | } 12 | 13 | const EditableInput: FC = ({ className, placeholder, value, onChange, pdfMode }) => { 14 | return ( 15 | <> 16 | {pdfMode ? ( 17 | {value} 18 | ) : ( 19 | onChange(e.target.value) : undefined} 25 | /> 26 | )} 27 | 28 | ) 29 | } 30 | 31 | export default EditableInput 32 | -------------------------------------------------------------------------------- /src/components/EditableSelect.tsx: -------------------------------------------------------------------------------- 1 | import { FC, useState } from 'react' 2 | import { Text } from '@react-pdf/renderer' 3 | import compose from '../styles/compose' 4 | 5 | export interface SelectOption { 6 | value: string 7 | text: string 8 | } 9 | 10 | interface Props { 11 | className?: string 12 | options?: SelectOption[] 13 | placeholder?: string 14 | value?: string 15 | onChange?: (value: string) => void 16 | pdfMode?: boolean 17 | } 18 | 19 | const EditableSelect: FC = ({ 20 | className, 21 | options, 22 | placeholder, 23 | value, 24 | onChange, 25 | pdfMode, 26 | }) => { 27 | const [isEditing, setIsEditing] = useState(false) 28 | 29 | return ( 30 | <> 31 | {pdfMode ? ( 32 | {value} 33 | ) : ( 34 | <> 35 | {isEditing ? ( 36 | 49 | ) : ( 50 | setIsEditing(true)} 57 | /> 58 | )} 59 | 60 | )} 61 | 62 | ) 63 | } 64 | 65 | export default EditableSelect 66 | -------------------------------------------------------------------------------- /src/components/EditableTextarea.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react' 2 | import TextareaAutosize from 'react-textarea-autosize' 3 | import { Text } from '@react-pdf/renderer' 4 | import compose from '../styles/compose' 5 | 6 | interface Props { 7 | className?: string 8 | placeholder?: string 9 | value?: string 10 | onChange?: (value: string) => void 11 | pdfMode?: boolean 12 | rows?: number 13 | } 14 | 15 | const EditableTextarea: FC = ({ 16 | className, 17 | placeholder, 18 | value, 19 | onChange, 20 | pdfMode, 21 | rows, 22 | }) => { 23 | return ( 24 | <> 25 | {pdfMode ? ( 26 | {value} 27 | ) : ( 28 | onChange(e.target.value) : undefined} 34 | /> 35 | )} 36 | 37 | ) 38 | } 39 | 40 | export default EditableTextarea 41 | -------------------------------------------------------------------------------- /src/components/InvoicePage.tsx: -------------------------------------------------------------------------------- 1 | import { FC, useState, useEffect } from 'react' 2 | import { Invoice, ProductLine } from '../data/types' 3 | import { initialInvoice, initialProductLine } from '../data/initialData' 4 | import EditableInput from './EditableInput' 5 | import EditableSelect from './EditableSelect' 6 | import EditableTextarea from './EditableTextarea' 7 | import EditableCalendarInput from './EditableCalendarInput' 8 | import EditableFileImage from './EditableFileImage' 9 | import countryList from '../data/countryList' 10 | import Document from './Document' 11 | import Page from './Page' 12 | import View from './View' 13 | import Text from './Text' 14 | import { Font } from '@react-pdf/renderer' 15 | import Download from './DownloadPDF' 16 | import { format } from 'date-fns/format' 17 | 18 | Font.register({ 19 | family: 'Nunito', 20 | fonts: [ 21 | { src: 'https://fonts.gstatic.com/s/nunito/v12/XRXV3I6Li01BKofINeaE.ttf' }, 22 | { 23 | src: 'https://fonts.gstatic.com/s/nunito/v12/XRXW3I6Li01BKofA6sKUYevN.ttf', 24 | fontWeight: 600, 25 | }, 26 | ], 27 | }) 28 | 29 | interface Props { 30 | data?: Invoice 31 | pdfMode?: boolean 32 | onChange?: (invoice: Invoice) => void 33 | } 34 | 35 | const InvoicePage: FC = ({ data, pdfMode, onChange }) => { 36 | const [invoice, setInvoice] = useState(data ? { ...data } : { ...initialInvoice }) 37 | const [subTotal, setSubTotal] = useState() 38 | const [saleTax, setSaleTax] = useState() 39 | 40 | const dateFormat = 'MMM dd, yyyy' 41 | const invoiceDate = invoice.invoiceDate !== '' ? new Date(invoice.invoiceDate) : new Date() 42 | const invoiceDueDate = 43 | invoice.invoiceDueDate !== '' 44 | ? new Date(invoice.invoiceDueDate) 45 | : new Date(invoiceDate.valueOf()) 46 | 47 | if (invoice.invoiceDueDate === '') { 48 | invoiceDueDate.setDate(invoiceDueDate.getDate() + 30) 49 | } 50 | 51 | const handleChange = (name: keyof Invoice, value: string | number) => { 52 | if (name !== 'productLines') { 53 | const newInvoice = { ...invoice } 54 | 55 | if (name === 'logoWidth' && typeof value === 'number') { 56 | newInvoice[name] = value 57 | } else if (name !== 'logoWidth' && typeof value === 'string') { 58 | newInvoice[name] = value 59 | } 60 | 61 | setInvoice(newInvoice) 62 | } 63 | } 64 | 65 | const handleProductLineChange = (index: number, name: keyof ProductLine, value: string) => { 66 | const productLines = invoice.productLines.map((productLine, i) => { 67 | if (i === index) { 68 | const newProductLine = { ...productLine } 69 | 70 | if (name === 'description') { 71 | newProductLine[name] = value 72 | } else { 73 | if ( 74 | value[value.length - 1] === '.' || 75 | (value[value.length - 1] === '0' && value.includes('.')) 76 | ) { 77 | newProductLine[name] = value 78 | } else { 79 | const n = parseFloat(value) 80 | 81 | newProductLine[name] = (n ? n : 0).toString() 82 | } 83 | } 84 | 85 | return newProductLine 86 | } 87 | 88 | return { ...productLine } 89 | }) 90 | 91 | setInvoice({ ...invoice, productLines }) 92 | } 93 | 94 | const handleRemove = (i: number) => { 95 | const productLines = invoice.productLines.filter((_, index) => index !== i) 96 | 97 | setInvoice({ ...invoice, productLines }) 98 | } 99 | 100 | const handleAdd = () => { 101 | const productLines = [...invoice.productLines, { ...initialProductLine }] 102 | 103 | setInvoice({ ...invoice, productLines }) 104 | } 105 | 106 | const calculateAmount = (quantity: string, rate: string) => { 107 | const quantityNumber = parseFloat(quantity) 108 | const rateNumber = parseFloat(rate) 109 | const amount = quantityNumber && rateNumber ? quantityNumber * rateNumber : 0 110 | 111 | return amount.toFixed(2) 112 | } 113 | 114 | useEffect(() => { 115 | let subTotal = 0 116 | 117 | invoice.productLines.forEach((productLine) => { 118 | const quantityNumber = parseFloat(productLine.quantity) 119 | const rateNumber = parseFloat(productLine.rate) 120 | const amount = quantityNumber && rateNumber ? quantityNumber * rateNumber : 0 121 | 122 | subTotal += amount 123 | }) 124 | 125 | setSubTotal(subTotal) 126 | }, [invoice.productLines]) 127 | 128 | useEffect(() => { 129 | const match = invoice.taxLabel.match(/(\d+)%/) 130 | const taxRate = match ? parseFloat(match[1]) : 0 131 | const saleTax = subTotal ? (subTotal * taxRate) / 100 : 0 132 | 133 | setSaleTax(saleTax) 134 | }, [subTotal, invoice.taxLabel]) 135 | 136 | useEffect(() => { 137 | if (onChange) { 138 | onChange(invoice) 139 | } 140 | }, [onChange, invoice]) 141 | 142 | return ( 143 | 144 | 145 | {!pdfMode && setInvoice(d)} />} 146 | 147 | 148 | 149 | handleChange('logo', value)} 156 | onChangeWidth={(value) => handleChange('logoWidth', value)} 157 | /> 158 | handleChange('companyName', value)} 163 | pdfMode={pdfMode} 164 | /> 165 | handleChange('name', value)} 169 | pdfMode={pdfMode} 170 | /> 171 | handleChange('companyAddress', value)} 175 | pdfMode={pdfMode} 176 | /> 177 | handleChange('companyAddress2', value)} 181 | pdfMode={pdfMode} 182 | /> 183 | handleChange('companyCountry', value)} 187 | pdfMode={pdfMode} 188 | /> 189 | 190 | 191 | handleChange('title', value)} 196 | pdfMode={pdfMode} 197 | /> 198 | 199 | 200 | 201 | 202 | 203 | handleChange('billTo', value)} 207 | pdfMode={pdfMode} 208 | /> 209 | handleChange('clientName', value)} 213 | pdfMode={pdfMode} 214 | /> 215 | handleChange('clientAddress', value)} 219 | pdfMode={pdfMode} 220 | /> 221 | handleChange('clientAddress2', value)} 225 | pdfMode={pdfMode} 226 | /> 227 | handleChange('clientCountry', value)} 231 | pdfMode={pdfMode} 232 | /> 233 | 234 | 235 | 236 | 237 | handleChange('invoiceTitleLabel', value)} 241 | pdfMode={pdfMode} 242 | /> 243 | 244 | 245 | handleChange('invoiceTitle', value)} 249 | pdfMode={pdfMode} 250 | /> 251 | 252 | 253 | 254 | 255 | handleChange('invoiceDateLabel', value)} 259 | pdfMode={pdfMode} 260 | /> 261 | 262 | 263 | 267 | handleChange( 268 | 'invoiceDate', 269 | date && !Array.isArray(date) ? format(date, dateFormat) : '', 270 | ) 271 | } 272 | pdfMode={pdfMode} 273 | /> 274 | 275 | 276 | 277 | 278 | handleChange('invoiceDueDateLabel', value)} 282 | pdfMode={pdfMode} 283 | /> 284 | 285 | 286 | 290 | handleChange( 291 | 'invoiceDueDate', 292 | date ? (!Array.isArray(date) ? format(date, dateFormat) : '') : '', 293 | ) 294 | } 295 | pdfMode={pdfMode} 296 | /> 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | handleChange('productLineDescription', value)} 308 | pdfMode={pdfMode} 309 | /> 310 | 311 | 312 | handleChange('productLineQuantity', value)} 316 | pdfMode={pdfMode} 317 | /> 318 | 319 | 320 | handleChange('productLineQuantityRate', value)} 324 | pdfMode={pdfMode} 325 | /> 326 | 327 | 328 | handleChange('productLineQuantityAmount', value)} 332 | pdfMode={pdfMode} 333 | /> 334 | 335 | 336 | 337 | {invoice.productLines.map((productLine, i) => { 338 | return pdfMode && productLine.description === '' ? ( 339 | 340 | ) : ( 341 | 342 | 343 | handleProductLineChange(i, 'description', value)} 349 | pdfMode={pdfMode} 350 | /> 351 | 352 | 353 | handleProductLineChange(i, 'quantity', value)} 357 | pdfMode={pdfMode} 358 | /> 359 | 360 | 361 | handleProductLineChange(i, 'rate', value)} 365 | pdfMode={pdfMode} 366 | /> 367 | 368 | 369 | 370 | {calculateAmount(productLine.quantity, productLine.rate)} 371 | 372 | 373 | {!pdfMode && ( 374 | 382 | )} 383 | 384 | ) 385 | })} 386 | 387 | 388 | 389 | {!pdfMode && ( 390 | 394 | )} 395 | 396 | 397 | 398 | 399 | handleChange('subTotalLabel', value)} 402 | pdfMode={pdfMode} 403 | /> 404 | 405 | 406 | 407 | {subTotal?.toFixed(2)} 408 | 409 | 410 | 411 | 412 | 413 | handleChange('taxLabel', value)} 416 | pdfMode={pdfMode} 417 | /> 418 | 419 | 420 | 421 | {saleTax?.toFixed(2)} 422 | 423 | 424 | 425 | 426 | 427 | handleChange('totalLabel', value)} 431 | pdfMode={pdfMode} 432 | /> 433 | 434 | 435 | handleChange('currency', value)} 439 | pdfMode={pdfMode} 440 | /> 441 | 442 | {(typeof subTotal !== 'undefined' && typeof saleTax !== 'undefined' 443 | ? subTotal + saleTax 444 | : 0 445 | ).toFixed(2)} 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | handleChange('notesLabel', value)} 457 | pdfMode={pdfMode} 458 | /> 459 | handleChange('notes', value)} 464 | pdfMode={pdfMode} 465 | /> 466 | 467 | 468 | handleChange('termLabel', value)} 472 | pdfMode={pdfMode} 473 | /> 474 | handleChange('term', value)} 479 | pdfMode={pdfMode} 480 | /> 481 | 482 | 483 | 484 | ) 485 | } 486 | 487 | export default InvoicePage 488 | -------------------------------------------------------------------------------- /src/components/Page.tsx: -------------------------------------------------------------------------------- 1 | import { FC, PropsWithChildren } from 'react' 2 | import { Page as PdfPage } from '@react-pdf/renderer' 3 | import compose from '../styles/compose' 4 | 5 | interface Props { 6 | className?: string 7 | pdfMode?: boolean 8 | } 9 | 10 | const Page: FC> = ({ className, pdfMode, children }) => { 11 | return ( 12 | <> 13 | {pdfMode ? ( 14 | 15 | {children} 16 | 17 | ) : ( 18 |
{children}
19 | )} 20 | 21 | ) 22 | } 23 | 24 | export default Page 25 | -------------------------------------------------------------------------------- /src/components/Text.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react' 2 | import { Text as PdfText } from '@react-pdf/renderer' 3 | import compose from '../styles/compose' 4 | 5 | interface Props { 6 | className?: string 7 | pdfMode?: boolean 8 | children?: string 9 | } 10 | 11 | const Text: FC = ({ className, pdfMode, children }) => { 12 | return ( 13 | <> 14 | {pdfMode ? ( 15 | {children} 16 | ) : ( 17 | {children} 18 | )} 19 | 20 | ) 21 | } 22 | 23 | export default Text 24 | -------------------------------------------------------------------------------- /src/components/View.tsx: -------------------------------------------------------------------------------- 1 | import { FC, PropsWithChildren } from 'react' 2 | import { View as PdfView } from '@react-pdf/renderer' 3 | import compose from '../styles/compose' 4 | 5 | interface Props { 6 | className?: string 7 | pdfMode?: boolean 8 | } 9 | 10 | const View: FC> = ({ className, pdfMode, children }) => { 11 | return ( 12 | <> 13 | {pdfMode ? ( 14 | {children} 15 | ) : ( 16 |
{children}
17 | )} 18 | 19 | ) 20 | } 21 | 22 | export default View 23 | -------------------------------------------------------------------------------- /src/data/countryList.ts: -------------------------------------------------------------------------------- 1 | const countryList = [ 2 | { value: 'Bangladesh', text: 'Bangladesh' }, 3 | { value: 'Belgium', text: 'Belgium' }, 4 | { value: 'Burkina Faso', text: 'Burkina Faso' }, 5 | { value: 'Bulgaria', text: 'Bulgaria' }, 6 | { value: 'Bosnia and Herzegovina', text: 'Bosnia and Herzegovina' }, 7 | { value: 'Barbados', text: 'Barbados' }, 8 | { value: 'Wallis and Futuna', text: 'Wallis and Futuna' }, 9 | { value: 'Saint Barthelemy', text: 'Saint Barthelemy' }, 10 | { value: 'Bermuda', text: 'Bermuda' }, 11 | { value: 'Brunei', text: 'Brunei' }, 12 | { value: 'Bolivia', text: 'Bolivia' }, 13 | { value: 'Bahrain', text: 'Bahrain' }, 14 | { value: 'Burundi', text: 'Burundi' }, 15 | { value: 'Benin', text: 'Benin' }, 16 | { value: 'Bhutan', text: 'Bhutan' }, 17 | { value: 'Jamaica', text: 'Jamaica' }, 18 | { value: 'Bouvet Island', text: 'Bouvet Island' }, 19 | { value: 'Botswana', text: 'Botswana' }, 20 | { value: 'Samoa', text: 'Samoa' }, 21 | { 22 | value: 'Bonaire, Saint Eustatius and Saba ', 23 | text: 'Bonaire, Saint Eustatius and Saba ', 24 | }, 25 | { value: 'Brazil', text: 'Brazil' }, 26 | { value: 'Bahamas', text: 'Bahamas' }, 27 | { value: 'Jersey', text: 'Jersey' }, 28 | { value: 'Belarus', text: 'Belarus' }, 29 | { value: 'Belize', text: 'Belize' }, 30 | { value: 'Russia', text: 'Russia' }, 31 | { value: 'Rwanda', text: 'Rwanda' }, 32 | { value: 'Serbia', text: 'Serbia' }, 33 | { value: 'East Timor', text: 'East Timor' }, 34 | { value: 'Reunion', text: 'Reunion' }, 35 | { value: 'Turkmenistan', text: 'Turkmenistan' }, 36 | { value: 'Tajikistan', text: 'Tajikistan' }, 37 | { value: 'Romania', text: 'Romania' }, 38 | { value: 'Tokelau', text: 'Tokelau' }, 39 | { value: 'Guinea-Bissau', text: 'Guinea-Bissau' }, 40 | { value: 'Guam', text: 'Guam' }, 41 | { value: 'Guatemala', text: 'Guatemala' }, 42 | { 43 | value: 'South Georgia and the South Sandwich Islands', 44 | text: 'South Georgia and the South Sandwich Islands', 45 | }, 46 | { value: 'Greece', text: 'Greece' }, 47 | { value: 'Equatorial Guinea', text: 'Equatorial Guinea' }, 48 | { value: 'Guadeloupe', text: 'Guadeloupe' }, 49 | { value: 'Japan', text: 'Japan' }, 50 | { value: 'Guyana', text: 'Guyana' }, 51 | { value: 'Guernsey', text: 'Guernsey' }, 52 | { value: 'French Guiana', text: 'French Guiana' }, 53 | { value: 'Georgia', text: 'Georgia' }, 54 | { value: 'Grenada', text: 'Grenada' }, 55 | { value: 'United Kingdom', text: 'United Kingdom' }, 56 | { value: 'Gabon', text: 'Gabon' }, 57 | { value: 'El Salvador', text: 'El Salvador' }, 58 | { value: 'Guinea', text: 'Guinea' }, 59 | { value: 'Gambia', text: 'Gambia' }, 60 | { value: 'Greenland', text: 'Greenland' }, 61 | { value: 'Gibraltar', text: 'Gibraltar' }, 62 | { value: 'Ghana', text: 'Ghana' }, 63 | { value: 'Oman', text: 'Oman' }, 64 | { value: 'Tunisia', text: 'Tunisia' }, 65 | { value: 'Jordan', text: 'Jordan' }, 66 | { value: 'Croatia', text: 'Croatia' }, 67 | { value: 'Haiti', text: 'Haiti' }, 68 | { value: 'Hungary', text: 'Hungary' }, 69 | { value: 'Hong Kong', text: 'Hong Kong' }, 70 | { value: 'Honduras', text: 'Honduras' }, 71 | { 72 | value: 'Heard Island and McDonald Islands', 73 | text: 'Heard Island and McDonald Islands', 74 | }, 75 | { value: 'Venezuela', text: 'Venezuela' }, 76 | { value: 'Puerto Rico', text: 'Puerto Rico' }, 77 | { value: 'Palestinian Territory', text: 'Palestinian Territory' }, 78 | { value: 'Palau', text: 'Palau' }, 79 | { value: 'Portugal', text: 'Portugal' }, 80 | { value: 'Svalbard and Jan Mayen', text: 'Svalbard and Jan Mayen' }, 81 | { value: 'Paraguay', text: 'Paraguay' }, 82 | { value: 'Iraq', text: 'Iraq' }, 83 | { value: 'Panama', text: 'Panama' }, 84 | { value: 'French Polynesia', text: 'French Polynesia' }, 85 | { value: 'Papua New Guinea', text: 'Papua New Guinea' }, 86 | { value: 'Peru', text: 'Peru' }, 87 | { value: 'Pakistan', text: 'Pakistan' }, 88 | { value: 'Philippines', text: 'Philippines' }, 89 | { value: 'Pitcairn', text: 'Pitcairn' }, 90 | { value: 'Poland', text: 'Poland' }, 91 | { value: 'Saint Pierre and Miquelon', text: 'Saint Pierre and Miquelon' }, 92 | { value: 'Zambia', text: 'Zambia' }, 93 | { value: 'Western Sahara', text: 'Western Sahara' }, 94 | { value: 'Estonia', text: 'Estonia' }, 95 | { value: 'Egypt', text: 'Egypt' }, 96 | { value: 'South Africa', text: 'South Africa' }, 97 | { value: 'Ecuador', text: 'Ecuador' }, 98 | { value: 'Italy', text: 'Italy' }, 99 | { value: 'Vietnam', text: 'Vietnam' }, 100 | { value: 'Solomon Islands', text: 'Solomon Islands' }, 101 | { value: 'Ethiopia', text: 'Ethiopia' }, 102 | { value: 'Somalia', text: 'Somalia' }, 103 | { value: 'Zimbabwe', text: 'Zimbabwe' }, 104 | { value: 'Saudi Arabia', text: 'Saudi Arabia' }, 105 | { value: 'Spain', text: 'Spain' }, 106 | { value: 'Eritrea', text: 'Eritrea' }, 107 | { value: 'Montenegro', text: 'Montenegro' }, 108 | { value: 'Moldova', text: 'Moldova' }, 109 | { value: 'Madagascar', text: 'Madagascar' }, 110 | { value: 'Saint Martin', text: 'Saint Martin' }, 111 | { value: 'Morocco', text: 'Morocco' }, 112 | { value: 'Monaco', text: 'Monaco' }, 113 | { value: 'Uzbekistan', text: 'Uzbekistan' }, 114 | { value: 'Myanmar', text: 'Myanmar' }, 115 | { value: 'Mali', text: 'Mali' }, 116 | { value: 'Macao', text: 'Macao' }, 117 | { value: 'Mongolia', text: 'Mongolia' }, 118 | { value: 'Marshall Islands', text: 'Marshall Islands' }, 119 | { value: 'Macedonia', text: 'Macedonia' }, 120 | { value: 'Mauritius', text: 'Mauritius' }, 121 | { value: 'Malta', text: 'Malta' }, 122 | { value: 'Malawi', text: 'Malawi' }, 123 | { value: 'Maldives', text: 'Maldives' }, 124 | { value: 'Martinique', text: 'Martinique' }, 125 | { value: 'Northern Mariana Islands', text: 'Northern Mariana Islands' }, 126 | { value: 'Montserrat', text: 'Montserrat' }, 127 | { value: 'Mauritania', text: 'Mauritania' }, 128 | { value: 'Isle of Man', text: 'Isle of Man' }, 129 | { value: 'Uganda', text: 'Uganda' }, 130 | { value: 'Tanzania', text: 'Tanzania' }, 131 | { value: 'Malaysia', text: 'Malaysia' }, 132 | { value: 'Mexico', text: 'Mexico' }, 133 | { value: 'Israel', text: 'Israel' }, 134 | { value: 'France', text: 'France' }, 135 | { 136 | value: 'British Indian Ocean Territory', 137 | text: 'British Indian Ocean Territory', 138 | }, 139 | { value: 'Saint Helena', text: 'Saint Helena' }, 140 | { value: 'Finland', text: 'Finland' }, 141 | { value: 'Fiji', text: 'Fiji' }, 142 | { value: 'Falkland Islands', text: 'Falkland Islands' }, 143 | { value: 'Micronesia', text: 'Micronesia' }, 144 | { value: 'Faroe Islands', text: 'Faroe Islands' }, 145 | { value: 'Nicaragua', text: 'Nicaragua' }, 146 | { value: 'Netherlands', text: 'Netherlands' }, 147 | { value: 'Norway', text: 'Norway' }, 148 | { value: 'Namibia', text: 'Namibia' }, 149 | { value: 'Vanuatu', text: 'Vanuatu' }, 150 | { value: 'New Caledonia', text: 'New Caledonia' }, 151 | { value: 'Niger', text: 'Niger' }, 152 | { value: 'Norfolk Island', text: 'Norfolk Island' }, 153 | { value: 'Nigeria', text: 'Nigeria' }, 154 | { value: 'New Zealand', text: 'New Zealand' }, 155 | { value: 'Nepal', text: 'Nepal' }, 156 | { value: 'Nauru', text: 'Nauru' }, 157 | { value: 'Niue', text: 'Niue' }, 158 | { value: 'Cook Islands', text: 'Cook Islands' }, 159 | { value: 'Kosovo', text: 'Kosovo' }, 160 | { value: 'Ivory Coast', text: 'Ivory Coast' }, 161 | { value: 'Switzerland', text: 'Switzerland' }, 162 | { value: 'Colombia', text: 'Colombia' }, 163 | { value: 'China', text: 'China' }, 164 | { value: 'Cameroon', text: 'Cameroon' }, 165 | { value: 'Chile', text: 'Chile' }, 166 | { value: 'Cocos Islands', text: 'Cocos Islands' }, 167 | { value: 'Canada', text: 'Canada' }, 168 | { value: 'Republic of the Congo', text: 'Republic of the Congo' }, 169 | { value: 'Central African Republic', text: 'Central African Republic' }, 170 | { 171 | value: 'Democratic Republic of the Congo', 172 | text: 'Democratic Republic of the Congo', 173 | }, 174 | { value: 'Czech Republic', text: 'Czech Republic' }, 175 | { value: 'Cyprus', text: 'Cyprus' }, 176 | { value: 'Christmas Island', text: 'Christmas Island' }, 177 | { value: 'Costa Rica', text: 'Costa Rica' }, 178 | { value: 'Curacao', text: 'Curacao' }, 179 | { value: 'Cape Verde', text: 'Cape Verde' }, 180 | { value: 'Cuba', text: 'Cuba' }, 181 | { value: 'Swaziland', text: 'Swaziland' }, 182 | { value: 'Syria', text: 'Syria' }, 183 | { value: 'Sint Maarten', text: 'Sint Maarten' }, 184 | { value: 'Kyrgyzstan', text: 'Kyrgyzstan' }, 185 | { value: 'Kenya', text: 'Kenya' }, 186 | { value: 'South Sudan', text: 'South Sudan' }, 187 | { value: 'Suriname', text: 'Suriname' }, 188 | { value: 'Kiribati', text: 'Kiribati' }, 189 | { value: 'Cambodia', text: 'Cambodia' }, 190 | { value: 'Saint Kitts and Nevis', text: 'Saint Kitts and Nevis' }, 191 | { value: 'Comoros', text: 'Comoros' }, 192 | { value: 'Sao Tome and Principe', text: 'Sao Tome and Principe' }, 193 | { value: 'Slovakia', text: 'Slovakia' }, 194 | { value: 'South Korea', text: 'South Korea' }, 195 | { value: 'Slovenia', text: 'Slovenia' }, 196 | { value: 'North Korea', text: 'North Korea' }, 197 | { value: 'Kuwait', text: 'Kuwait' }, 198 | { value: 'Senegal', text: 'Senegal' }, 199 | { value: 'San Marino', text: 'San Marino' }, 200 | { value: 'Sierra Leone', text: 'Sierra Leone' }, 201 | { value: 'Seychelles', text: 'Seychelles' }, 202 | { value: 'Kazakhstan', text: 'Kazakhstan' }, 203 | { value: 'Cayman Islands', text: 'Cayman Islands' }, 204 | { value: 'Singapore', text: 'Singapore' }, 205 | { value: 'Sweden', text: 'Sweden' }, 206 | { value: 'Sudan', text: 'Sudan' }, 207 | { value: 'Dominican Republic', text: 'Dominican Republic' }, 208 | { value: 'Dominica', text: 'Dominica' }, 209 | { value: 'Djibouti', text: 'Djibouti' }, 210 | { value: 'Denmark', text: 'Denmark' }, 211 | { value: 'British Virgin Islands', text: 'British Virgin Islands' }, 212 | { value: 'Germany', text: 'Germany' }, 213 | { value: 'Yemen', text: 'Yemen' }, 214 | { value: 'Algeria', text: 'Algeria' }, 215 | { value: 'United States', text: 'United States' }, 216 | { value: 'Uruguay', text: 'Uruguay' }, 217 | { value: 'Mayotte', text: 'Mayotte' }, 218 | { 219 | value: 'United States Minor Outlying Islands', 220 | text: 'United States Minor Outlying Islands', 221 | }, 222 | { value: 'Lebanon', text: 'Lebanon' }, 223 | { value: 'Saint Lucia', text: 'Saint Lucia' }, 224 | { value: 'Laos', text: 'Laos' }, 225 | { value: 'Tuvalu', text: 'Tuvalu' }, 226 | { value: 'Taiwan', text: 'Taiwan' }, 227 | { value: 'Trinidad and Tobago', text: 'Trinidad and Tobago' }, 228 | { value: 'Turkey', text: 'Turkey' }, 229 | { value: 'Sri Lanka', text: 'Sri Lanka' }, 230 | { value: 'Liechtenstein', text: 'Liechtenstein' }, 231 | { value: 'Latvia', text: 'Latvia' }, 232 | { value: 'Tonga', text: 'Tonga' }, 233 | { value: 'Lithuania', text: 'Lithuania' }, 234 | { value: 'Luxembourg', text: 'Luxembourg' }, 235 | { value: 'Liberia', text: 'Liberia' }, 236 | { value: 'Lesotho', text: 'Lesotho' }, 237 | { value: 'Thailand', text: 'Thailand' }, 238 | { value: 'French Southern Territories', text: 'French Southern Territories' }, 239 | { value: 'Togo', text: 'Togo' }, 240 | { value: 'Chad', text: 'Chad' }, 241 | { value: 'Turks and Caicos Islands', text: 'Turks and Caicos Islands' }, 242 | { value: 'Libya', text: 'Libya' }, 243 | { value: 'Vatican', text: 'Vatican' }, 244 | { 245 | value: 'Saint Vincent and the Grenadines', 246 | text: 'Saint Vincent and the Grenadines', 247 | }, 248 | { value: 'United Arab Emirates', text: 'United Arab Emirates' }, 249 | { value: 'Andorra', text: 'Andorra' }, 250 | { value: 'Antigua and Barbuda', text: 'Antigua and Barbuda' }, 251 | { value: 'Afghanistan', text: 'Afghanistan' }, 252 | { value: 'Anguilla', text: 'Anguilla' }, 253 | { value: 'U.S. Virgin Islands', text: 'U.S. Virgin Islands' }, 254 | { value: 'Iceland', text: 'Iceland' }, 255 | { value: 'Iran', text: 'Iran' }, 256 | { value: 'Armenia', text: 'Armenia' }, 257 | { value: 'Albania', text: 'Albania' }, 258 | { value: 'Angola', text: 'Angola' }, 259 | { value: 'Antarctica', text: 'Antarctica' }, 260 | { value: 'American Samoa', text: 'American Samoa' }, 261 | { value: 'Argentina', text: 'Argentina' }, 262 | { value: 'Australia', text: 'Australia' }, 263 | { value: 'Austria', text: 'Austria' }, 264 | { value: 'Aruba', text: 'Aruba' }, 265 | { value: 'India', text: 'India' }, 266 | { value: 'Aland Islands', text: 'Aland Islands' }, 267 | { value: 'Azerbaijan', text: 'Azerbaijan' }, 268 | { value: 'Ireland', text: 'Ireland' }, 269 | { value: 'Indonesia', text: 'Indonesia' }, 270 | { value: 'Ukraine', text: 'Ukraine' }, 271 | { value: 'Qatar', text: 'Qatar' }, 272 | { value: 'Mozambique', text: 'Mozambique' }, 273 | ] 274 | 275 | export default countryList 276 | -------------------------------------------------------------------------------- /src/data/initialData.ts: -------------------------------------------------------------------------------- 1 | import { ProductLine, Invoice } from './types' 2 | 3 | export const initialProductLine: ProductLine = { 4 | description: '', 5 | quantity: '1', 6 | rate: '0.00', 7 | } 8 | 9 | export const initialInvoice: Invoice = { 10 | logo: '', 11 | logoWidth: 100, 12 | title: 'INVOICE', 13 | companyName: '', 14 | name: '', 15 | companyAddress: '', 16 | companyAddress2: '', 17 | companyCountry: 'United States', 18 | billTo: 'Bill To:', 19 | clientName: '', 20 | clientAddress: '', 21 | clientAddress2: '', 22 | clientCountry: 'United States', 23 | invoiceTitleLabel: 'Invoice#', 24 | invoiceTitle: '', 25 | invoiceDateLabel: 'Invoice Date', 26 | invoiceDate: '', 27 | invoiceDueDateLabel: 'Due Date', 28 | invoiceDueDate: '', 29 | productLineDescription: 'Item Description', 30 | productLineQuantity: 'Qty', 31 | productLineQuantityRate: 'Rate', 32 | productLineQuantityAmount: 'Amount', 33 | productLines: [ 34 | { 35 | description: 'Brochure Design', 36 | quantity: '2', 37 | rate: '100.00', 38 | }, 39 | { ...initialProductLine }, 40 | { ...initialProductLine }, 41 | ], 42 | subTotalLabel: 'Sub Total', 43 | taxLabel: 'Sale Tax (10%)', 44 | totalLabel: 'TOTAL', 45 | currency: '$', 46 | notesLabel: 'Notes', 47 | notes: 'It was great doing business with you.', 48 | termLabel: 'Terms & Conditions', 49 | term: 'Please make the payment by the due date.', 50 | } 51 | -------------------------------------------------------------------------------- /src/data/types.ts: -------------------------------------------------------------------------------- 1 | import { CSSProperties } from 'react' 2 | import { z, TypeOf } from 'zod' 3 | 4 | export interface ProductLine { 5 | description: string 6 | quantity: string 7 | rate: string 8 | } 9 | 10 | export const TProductLine = z.object({ 11 | description: z.string(), 12 | quantity: z.string(), 13 | rate: z.string(), 14 | }) 15 | 16 | export const TInvoice = z.object({ 17 | logo: z.string(), 18 | logoWidth: z.number(), 19 | title: z.string(), 20 | companyName: z.string(), 21 | name: z.string(), 22 | companyAddress: z.string(), 23 | companyAddress2: z.string(), 24 | companyCountry: z.string(), 25 | billTo: z.string(), 26 | clientName: z.string(), 27 | clientAddress: z.string(), 28 | clientAddress2: z.string(), 29 | clientCountry: z.string(), 30 | invoiceTitleLabel: z.string(), 31 | invoiceTitle: z.string(), 32 | invoiceDateLabel: z.string(), 33 | invoiceDate: z.string(), 34 | invoiceDueDateLabel: z.string(), 35 | invoiceDueDate: z.string(), 36 | productLineDescription: z.string(), 37 | productLineQuantity: z.string(), 38 | productLineQuantityRate: z.string(), 39 | productLineQuantityAmount: z.string(), 40 | productLines: z.array(TProductLine), 41 | subTotalLabel: z.string(), 42 | taxLabel: z.string(), 43 | totalLabel: z.string(), 44 | currency: z.string(), 45 | notesLabel: z.string(), 46 | notes: z.string(), 47 | termLabel: z.string(), 48 | term: z.string(), 49 | }) 50 | 51 | export type Invoice = TypeOf 52 | 53 | export interface CSSClasses { 54 | [key: string]: CSSProperties 55 | } 56 | -------------------------------------------------------------------------------- /src/hooks/useOnClickOutside.ts: -------------------------------------------------------------------------------- 1 | import { RefObject, useEffect } from 'react' 2 | 3 | type AnyEvent = MouseEvent | TouchEvent 4 | 5 | function useOnClickOutside( 6 | ref: RefObject, 7 | handler: (event: AnyEvent) => void, 8 | ) { 9 | useEffect(() => { 10 | const listener = (event: AnyEvent) => { 11 | const el = ref?.current 12 | 13 | // Do nothing if clicking ref's element or descendent elements 14 | if (!el || el.contains(event.target as Node)) { 15 | return 16 | } 17 | 18 | handler(event) 19 | } 20 | 21 | document.addEventListener(`mousedown`, listener) 22 | document.addEventListener(`touchstart`, listener) 23 | 24 | return () => { 25 | document.removeEventListener(`mousedown`, listener) 26 | document.removeEventListener(`touchstart`, listener) 27 | } 28 | 29 | // Reload only if ref or handler changes 30 | }, [ref, handler]) 31 | } 32 | 33 | export default useOnClickOutside 34 | -------------------------------------------------------------------------------- /src/images/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/images/remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/images/resize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/images/template_download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/images/template_upload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 39 | 41 | 43 | 47 | 48 | 52 | 53 | 55 | 62 | 69 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App.tsx' 4 | import './scss/main.scss' 5 | import * as serviceWorker from './serviceWorker' 6 | 7 | ReactDOM.createRoot(document.getElementById('root')!).render( 8 | 9 | 10 | , 11 | ) 12 | 13 | serviceWorker.register() 14 | -------------------------------------------------------------------------------- /src/scss/_app.scss: -------------------------------------------------------------------------------- 1 | .app { 2 | margin: 30px auto 50px auto; 3 | width: 700px; 4 | } 5 | 6 | .input, 7 | .span, 8 | .select { 9 | display: inline-block; 10 | width: 98%; 11 | padding: 4px 12px 4px 0; 12 | margin-bottom: 1px; 13 | border: 1px dotted transparent; 14 | transition: 15 | background 0.1s ease-in-out, 16 | border-color 0.2s ease-in-out; 17 | } 18 | 19 | .input, 20 | .select { 21 | &:hover, 22 | &:focus { 23 | background: $color-yellow; 24 | } 25 | 26 | &:focus { 27 | border-color: $color-cyan; 28 | } 29 | 30 | &.white { 31 | &:hover, 32 | &:focus { 33 | color: inherit; 34 | } 35 | } 36 | } 37 | 38 | .invoice-wrapper { 39 | position: relative; 40 | background: #fff; 41 | padding: 40px 35px; 42 | box-shadow: 0 0 17px 0 rgba(16, 40, 73, 0.09); 43 | } 44 | 45 | .download-pdf { 46 | position: fixed; 47 | top: 100px; 48 | margin-left: -110px; 49 | width: 40px; 50 | height: 40px; 51 | transition: opacity 0.2s ease-in-out; 52 | 53 | &.loading { 54 | opacity: 0.3; 55 | } 56 | 57 | button { 58 | border: none; 59 | } 60 | 61 | a, 62 | label, 63 | button { 64 | display: block; 65 | background-repeat: no-repeat; 66 | top: 0; 67 | left: 0; 68 | width: 100%; 69 | height: 100%; 70 | } 71 | .download-pdf__pdf { 72 | background: url('../images/download.svg'); 73 | } 74 | .download-pdf__template_download { 75 | width: 30px; 76 | height: 30px; 77 | background: url('../images/template_download.svg'); 78 | } 79 | .download-pdf__template_upload { 80 | width: 30px; 81 | height: 30px; 82 | background: url('../images/template_upload.svg'); 83 | } 84 | input[type='file'] { 85 | visibility: hidden; 86 | } 87 | } 88 | 89 | .image { 90 | position: relative; 91 | display: inline-block; 92 | } 93 | 94 | .image__file { 95 | position: absolute; 96 | width: 1px; 97 | height: 1px; 98 | padding: 0; 99 | margin: -1px; 100 | overflow: hidden; 101 | clip: rect(0, 0, 0, 0); 102 | border: 0; 103 | } 104 | 105 | .image__upload { 106 | cursor: pointer; 107 | font-size: 12px; 108 | color: $placeholder-color; 109 | background-color: $color-gray; 110 | border: 2px dashed $placeholder-color; 111 | display: block; 112 | width: 100px; 113 | height: 20px; 114 | padding: 0; 115 | outline: none; 116 | transition: 117 | height 0.2s, 118 | font-size 0.2s; 119 | 120 | &:focus, 121 | &:hover { 122 | height: 100px; 123 | font-size: 14px; 124 | } 125 | } 126 | 127 | .image__img { 128 | display: block; 129 | } 130 | 131 | .image__change { 132 | cursor: pointer; 133 | font-size: 14px; 134 | color: $placeholder-color; 135 | background-color: $color-gray; 136 | border: 2px dashed $placeholder-color; 137 | position: absolute; 138 | top: 0; 139 | left: 0; 140 | width: 100%; 141 | height: 100%; 142 | opacity: 0; 143 | transition: opacity 0.2s; 144 | 145 | &:hover, 146 | &:focus { 147 | opacity: 0.95; 148 | } 149 | } 150 | 151 | .image__edit, 152 | .image__remove { 153 | background: #999 no-repeat center center; 154 | background-size: 10px 10px; 155 | border: 0; 156 | border-radius: 50%; 157 | padding: 0; 158 | position: absolute; 159 | width: 20px; 160 | height: 20px; 161 | top: -10px; 162 | text-indent: -9999em; 163 | opacity: 0; 164 | transition: 165 | opacity 0.2s, 166 | background-color 0.2s; 167 | 168 | &:hover, 169 | &:focus { 170 | background-color: #666; 171 | } 172 | 173 | .image:hover &, 174 | .image:focus-within & { 175 | opacity: 1; 176 | } 177 | } 178 | 179 | .image__edit { 180 | background-image: url('../images/resize.svg'); 181 | right: 20px; 182 | } 183 | 184 | .image__remove { 185 | background-image: url('../images/remove.svg'); 186 | right: -10px; 187 | } 188 | 189 | .image__width-wrapper { 190 | background-color: $color-white; 191 | padding: 10px 20px 25px; 192 | position: absolute; 193 | width: 270px; 194 | top: -70px; 195 | left: 0; 196 | border-radius: 4px; 197 | box-shadow: 2px 1px 6px rgba(0, 0, 0, 0.15); 198 | } 199 | -------------------------------------------------------------------------------- /src/scss/_color.scss: -------------------------------------------------------------------------------- 1 | .dark { 2 | color: $color-dark; 3 | } 4 | 5 | .white { 6 | color: $color-white; 7 | } 8 | 9 | .bg-white { 10 | background-color: $color-white; 11 | } 12 | 13 | .bg-dark { 14 | background-color: $color-dark-2; 15 | } 16 | 17 | .bg-gray { 18 | background-color: $color-gray; 19 | } 20 | 21 | .bg-red { 22 | background-color: $color-red; 23 | } 24 | 25 | .bg-green { 26 | background-color: $color-green; 27 | } 28 | -------------------------------------------------------------------------------- /src/scss/_icons.scss: -------------------------------------------------------------------------------- 1 | .icon { 2 | display: inline-block; 3 | position: relative; 4 | width: 16px; 5 | height: 16px; 6 | border: 0; 7 | border-radius: 50%; 8 | } 9 | 10 | .icon-absolute { 11 | position: absolute; 12 | } 13 | 14 | .icon-remove { 15 | &::before, 16 | &::after { 17 | content: ''; 18 | position: absolute; 19 | width: 2px; 20 | height: 10px; 21 | left: 7px; 22 | top: 3px; 23 | background-color: $color-white; 24 | } 25 | 26 | &::before { 27 | transform: rotate(45deg); 28 | } 29 | 30 | &::after { 31 | transform: rotate(-45deg); 32 | } 33 | } 34 | 35 | .icon-add { 36 | &::before, 37 | &::after { 38 | content: ''; 39 | position: absolute; 40 | width: 2px; 41 | height: 10px; 42 | left: 7px; 43 | top: 3px; 44 | background-color: $color-white; 45 | } 46 | 47 | &::after { 48 | transform: rotate(-90deg); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/scss/_layout.scss: -------------------------------------------------------------------------------- 1 | .block { 2 | display: block; 3 | } 4 | 5 | .flex { 6 | display: flex; 7 | } 8 | 9 | .w-auto { 10 | width: auto !important; 11 | } 12 | 13 | .w-100 { 14 | width: 100% !important; 15 | } 16 | 17 | .w-50 { 18 | width: 50%; 19 | } 20 | 21 | .w-55 { 22 | width: 55%; 23 | } 24 | 25 | .w-45 { 26 | width: 45%; 27 | } 28 | 29 | .w-60 { 30 | width: 60%; 31 | } 32 | 33 | .w-40 { 34 | width: 40%; 35 | } 36 | 37 | .w-48 { 38 | width: 48%; 39 | } 40 | 41 | .w-17 { 42 | width: 17%; 43 | } 44 | 45 | .w-18 { 46 | width: 18%; 47 | } 48 | 49 | .row { 50 | position: relative; 51 | border-bottom: 1px solid $color-gray; 52 | } 53 | 54 | .row__remove { 55 | display: flex; 56 | padding: 0; 57 | position: absolute; 58 | top: 10px; 59 | right: -20px; 60 | opacity: 0; 61 | transition: opacity 0.2s ease-in-out; 62 | 63 | .row:hover &, 64 | .row:focus-within & { 65 | opacity: 1; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/scss/_spacing.scss: -------------------------------------------------------------------------------- 1 | .mt-40 { 2 | margin-top: 40px; 3 | } 4 | 5 | .mt-30 { 6 | margin-top: 30px; 7 | } 8 | 9 | .mt-20 { 10 | margin-top: 20px; 11 | } 12 | 13 | .mt-10 { 14 | margin-top: 10px; 15 | } 16 | 17 | .mb-5 { 18 | margin-bottom: 5px; 19 | } 20 | 21 | .mr-10 { 22 | margin-right: 10px; 23 | } 24 | 25 | .ml-30 { 26 | margin-left: 30px; 27 | } 28 | 29 | .p-4-8 { 30 | padding: 4px 8px; 31 | } 32 | 33 | .p-5 { 34 | padding: 5px; 35 | } 36 | 37 | .pb-10 { 38 | padding-bottom: 10px; 39 | } 40 | -------------------------------------------------------------------------------- /src/scss/_text.scss: -------------------------------------------------------------------------------- 1 | .right { 2 | text-align: right; 3 | } 4 | 5 | .center { 6 | text-align: center; 7 | } 8 | 9 | .text-small { 10 | font-size: 12px; 11 | } 12 | 13 | .bold { 14 | font-weight: 600; 15 | } 16 | 17 | .fs-20 { 18 | font-size: 20px; 19 | } 20 | 21 | .fs-30 { 22 | font-size: 30px; 23 | } 24 | 25 | .fs-45 { 26 | font-size: 45px; 27 | } 28 | 29 | .upper { 30 | text-transform: uppercase; 31 | } 32 | -------------------------------------------------------------------------------- /src/scss/_typography.scss: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Nunito, sans-serif; 3 | font-size: 14px; 4 | color: #555; 5 | background: $background-color; 6 | padding: 0; 7 | margin: 0; 8 | } 9 | 10 | * { 11 | box-sizing: border-box; 12 | } 13 | 14 | ::placeholder { 15 | color: $placeholder-color; 16 | opacity: 1; 17 | } 18 | 19 | input, 20 | textarea, 21 | select { 22 | font-family: Nunito, sans-serif; 23 | font-size: 14px; 24 | color: #555; 25 | background: transparent; 26 | border-radius: 3px; 27 | outline: 0; 28 | } 29 | 30 | select { 31 | outline: 0; 32 | } 33 | 34 | button { 35 | font-family: Nunito, sans-serif; 36 | font-size: 14px; 37 | border-radius: 3px; 38 | } 39 | 40 | textarea { 41 | resize: vertical; 42 | background: transparent; 43 | } 44 | 45 | button.link { 46 | display: flex; 47 | align-items: center; 48 | background: transparent; 49 | border: 0; 50 | color: $color-blue; 51 | 52 | &:hover, 53 | &:focus { 54 | text-decoration: underline; 55 | } 56 | 57 | &:focus { 58 | outline: 1px dotted $color-cyan; 59 | opacity: 1; 60 | } 61 | } 62 | 63 | h1 { 64 | margin-top: 0; 65 | margin-bottom: 30px; 66 | } 67 | -------------------------------------------------------------------------------- /src/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | $background-color: #f2f3f5; 2 | $placeholder-color: #aaa; 3 | 4 | $color-dark: #222; 5 | $color-dark-2: #666; 6 | $color-gray: #e3e3e3; 7 | $color-yellow: #fdf4db; 8 | $color-cyan: #66afe9; 9 | $color-white: #fff; 10 | $color-red: #f03434; 11 | $color-green: #26a65b; 12 | $color-blue: #428bca; 13 | -------------------------------------------------------------------------------- /src/scss/main.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | @import 'color'; 3 | @import 'layout'; 4 | @import 'typography'; 5 | @import 'spacing'; 6 | @import 'text'; 7 | @import 'icons'; 8 | @import 'app'; 9 | -------------------------------------------------------------------------------- /src/serviceWorker.ts: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.0/8 are considered localhost for IPv4. 18 | window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/), 19 | ) 20 | 21 | type Config = { 22 | onSuccess?: (registration: ServiceWorkerRegistration) => void 23 | onUpdate?: (registration: ServiceWorkerRegistration) => void 24 | } 25 | 26 | export function register(config?: Config) { 27 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 28 | // The URL constructor is available in all browsers that support SW. 29 | const publicUrl = new URL(process.env.PUBLIC_URL!, window.location.href) 30 | if (publicUrl.origin !== window.location.origin) { 31 | // Our service worker won't work if PUBLIC_URL is on a different origin 32 | // from what our page is served on. This might happen if a CDN is used to 33 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 34 | return 35 | } 36 | 37 | window.addEventListener('load', () => { 38 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` 39 | 40 | if (isLocalhost) { 41 | // This is running on localhost. Let's check if a service worker still exists or not. 42 | checkValidServiceWorker(swUrl, config) 43 | 44 | // Add some additional logging to localhost, pointing developers to the 45 | // service worker/PWA documentation. 46 | navigator.serviceWorker.ready.then(() => { 47 | console.log( 48 | 'This web app is being served cache-first by a service ' + 49 | 'worker. To learn more, visit https://bit.ly/CRA-PWA', 50 | ) 51 | }) 52 | } else { 53 | // Is not localhost. Just register service worker 54 | registerValidSW(swUrl, config) 55 | } 56 | }) 57 | } 58 | } 59 | 60 | function registerValidSW(swUrl: string, config?: Config) { 61 | navigator.serviceWorker 62 | .register(swUrl) 63 | .then((registration) => { 64 | registration.onupdatefound = () => { 65 | const installingWorker = registration.installing 66 | if (installingWorker == null) { 67 | return 68 | } 69 | installingWorker.onstatechange = () => { 70 | if (installingWorker.state === 'installed') { 71 | if (navigator.serviceWorker.controller) { 72 | // At this point, the updated precached content has been fetched, 73 | // but the previous service worker will still serve the older 74 | // content until all client tabs are closed. 75 | console.log( 76 | 'New content is available and will be used when all ' + 77 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.', 78 | ) 79 | 80 | // Execute callback 81 | if (config && config.onUpdate) { 82 | config.onUpdate(registration) 83 | } 84 | } else { 85 | // At this point, everything has been precached. 86 | // It's the perfect time to display a 87 | // "Content is cached for offline use." message. 88 | console.log('Content is cached for offline use.') 89 | 90 | // Execute callback 91 | if (config && config.onSuccess) { 92 | config.onSuccess(registration) 93 | } 94 | } 95 | } 96 | } 97 | } 98 | }) 99 | .catch((error) => { 100 | console.error('Error during service worker registration:', error) 101 | }) 102 | } 103 | 104 | function checkValidServiceWorker(swUrl: string, config?: Config) { 105 | // Check if the service worker can be found. If it can't reload the page. 106 | fetch(swUrl, { 107 | headers: { 'Service-Worker': 'script' }, 108 | }) 109 | .then((response) => { 110 | // Ensure service worker exists, and that we really are getting a JS file. 111 | const contentType = response.headers.get('content-type') 112 | if ( 113 | response.status === 404 || 114 | (contentType != null && contentType.indexOf('javascript') === -1) 115 | ) { 116 | // No service worker found. Probably a different app. Reload the page. 117 | navigator.serviceWorker.ready.then((registration) => { 118 | registration.unregister().then(() => { 119 | window.location.reload() 120 | }) 121 | }) 122 | } else { 123 | // Service worker found. Proceed as normal. 124 | registerValidSW(swUrl, config) 125 | } 126 | }) 127 | .catch(() => { 128 | console.log('No internet connection found. App is running in offline mode.') 129 | }) 130 | } 131 | 132 | export function unregister() { 133 | if ('serviceWorker' in navigator) { 134 | navigator.serviceWorker.ready 135 | .then((registration) => { 136 | registration.unregister() 137 | }) 138 | .catch((error) => { 139 | console.error(error.message) 140 | }) 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /src/styles/compose.ts: -------------------------------------------------------------------------------- 1 | import ReactPDF from '@react-pdf/renderer' 2 | import styles from './styles' 3 | 4 | const compose = (classes: string): ReactPDF.Styles => { 5 | const css: ReactPDF.Styles = { 6 | //@ts-ignore 7 | '@import': 'url(https://fonts.bunny.net/css?family=nunito:400,600)', 8 | } 9 | 10 | const classesArray: string[] = classes.replace(/\s+/g, ' ').split(' ') 11 | 12 | classesArray.forEach((className) => { 13 | if (typeof styles[className] !== undefined) { 14 | Object.assign(css, styles[className]) 15 | } 16 | }) 17 | 18 | return css 19 | } 20 | 21 | export default compose 22 | -------------------------------------------------------------------------------- /src/styles/styles.ts: -------------------------------------------------------------------------------- 1 | import { CSSClasses } from '../data/types' 2 | 3 | const colorDark = '#222' 4 | const colorDark2 = '#666' 5 | const colorGray = '#e3e3e3' 6 | const colorWhite = '#fff' 7 | 8 | const styles: CSSClasses = { 9 | dark: { 10 | color: colorDark, 11 | }, 12 | 13 | white: { 14 | color: colorWhite, 15 | }, 16 | 17 | 'bg-dark': { 18 | backgroundColor: colorDark2, 19 | }, 20 | 21 | 'bg-gray': { 22 | backgroundColor: colorGray, 23 | }, 24 | 25 | flex: { 26 | display: 'flex', 27 | flexDirection: 'row', 28 | flexWrap: 'nowrap', 29 | }, 30 | 31 | 'w-auto': { 32 | flex: 1, 33 | paddingRight: '8px', 34 | }, 35 | 36 | 'ml-30': { 37 | flex: 1, 38 | }, 39 | 40 | 'w-100': { 41 | width: '100%', 42 | }, 43 | 44 | 'w-50': { 45 | width: '50%', 46 | }, 47 | 48 | 'w-55': { 49 | width: '55%', 50 | }, 51 | 52 | 'w-45': { 53 | width: '45%', 54 | }, 55 | 56 | 'w-60': { 57 | width: '60%', 58 | }, 59 | 60 | 'w-40': { 61 | width: '40%', 62 | }, 63 | 64 | 'w-48': { 65 | width: '48%', 66 | }, 67 | 68 | 'w-17': { 69 | width: '17%', 70 | }, 71 | 72 | 'w-18': { 73 | width: '18%', 74 | }, 75 | 76 | row: { 77 | borderBottom: `1px solid ${colorGray}`, 78 | }, 79 | 80 | 'mt-40': { 81 | marginTop: '40px', 82 | }, 83 | 84 | 'mt-30': { 85 | marginTop: '30px', 86 | }, 87 | 88 | 'mt-20': { 89 | marginTop: '20px', 90 | }, 91 | 92 | 'mt-10': { 93 | marginTop: '10px', 94 | }, 95 | 96 | 'mb-5': { 97 | marginBottom: '5px', 98 | }, 99 | 100 | 'p-4-8': { 101 | padding: '4px 8px', 102 | }, 103 | 104 | 'p-5': { 105 | padding: '5px', 106 | }, 107 | 108 | 'pb-10': { 109 | paddingBottom: '10px', 110 | }, 111 | 112 | right: { 113 | textAlign: 'right', 114 | }, 115 | 116 | bold: { 117 | fontWeight: 'bold', 118 | }, 119 | 120 | 'fs-20': { 121 | fontSize: '20px', 122 | }, 123 | 124 | 'fs-45': { 125 | fontSize: '45px', 126 | }, 127 | 128 | page: { 129 | fontFamily: 'Nunito', 130 | fontSize: '13px', 131 | color: '#555', 132 | padding: '40px 35px', 133 | }, 134 | 135 | span: { 136 | padding: '4px 12px 4px 0', 137 | }, 138 | 139 | logo: { 140 | display: 'block', 141 | }, 142 | } 143 | 144 | export default styles 145 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.10.1", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13": 6 | version "7.24.1" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" 8 | integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== 9 | dependencies: 10 | regenerator-runtime "^0.14.0" 11 | 12 | "@esbuild/aix-ppc64@0.20.2": 13 | version "0.20.2" 14 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" 15 | integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== 16 | 17 | "@esbuild/android-arm64@0.20.2": 18 | version "0.20.2" 19 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" 20 | integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== 21 | 22 | "@esbuild/android-arm@0.20.2": 23 | version "0.20.2" 24 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" 25 | integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== 26 | 27 | "@esbuild/android-x64@0.20.2": 28 | version "0.20.2" 29 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" 30 | integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== 31 | 32 | "@esbuild/darwin-arm64@0.20.2": 33 | version "0.20.2" 34 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" 35 | integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== 36 | 37 | "@esbuild/darwin-x64@0.20.2": 38 | version "0.20.2" 39 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" 40 | integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== 41 | 42 | "@esbuild/freebsd-arm64@0.20.2": 43 | version "0.20.2" 44 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" 45 | integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== 46 | 47 | "@esbuild/freebsd-x64@0.20.2": 48 | version "0.20.2" 49 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" 50 | integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== 51 | 52 | "@esbuild/linux-arm64@0.20.2": 53 | version "0.20.2" 54 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" 55 | integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== 56 | 57 | "@esbuild/linux-arm@0.20.2": 58 | version "0.20.2" 59 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" 60 | integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== 61 | 62 | "@esbuild/linux-ia32@0.20.2": 63 | version "0.20.2" 64 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" 65 | integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== 66 | 67 | "@esbuild/linux-loong64@0.20.2": 68 | version "0.20.2" 69 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" 70 | integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== 71 | 72 | "@esbuild/linux-mips64el@0.20.2": 73 | version "0.20.2" 74 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" 75 | integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== 76 | 77 | "@esbuild/linux-ppc64@0.20.2": 78 | version "0.20.2" 79 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" 80 | integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== 81 | 82 | "@esbuild/linux-riscv64@0.20.2": 83 | version "0.20.2" 84 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" 85 | integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== 86 | 87 | "@esbuild/linux-s390x@0.20.2": 88 | version "0.20.2" 89 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" 90 | integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== 91 | 92 | "@esbuild/linux-x64@0.20.2": 93 | version "0.20.2" 94 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" 95 | integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== 96 | 97 | "@esbuild/netbsd-x64@0.20.2": 98 | version "0.20.2" 99 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" 100 | integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== 101 | 102 | "@esbuild/openbsd-x64@0.20.2": 103 | version "0.20.2" 104 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" 105 | integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== 106 | 107 | "@esbuild/sunos-x64@0.20.2": 108 | version "0.20.2" 109 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" 110 | integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== 111 | 112 | "@esbuild/win32-arm64@0.20.2": 113 | version "0.20.2" 114 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" 115 | integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== 116 | 117 | "@esbuild/win32-ia32@0.20.2": 118 | version "0.20.2" 119 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" 120 | integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== 121 | 122 | "@esbuild/win32-x64@0.20.2": 123 | version "0.20.2" 124 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" 125 | integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== 126 | 127 | "@floating-ui/core@^1.0.0": 128 | version "1.6.0" 129 | resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" 130 | integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== 131 | dependencies: 132 | "@floating-ui/utils" "^0.2.1" 133 | 134 | "@floating-ui/dom@^1.6.1": 135 | version "1.6.3" 136 | resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" 137 | integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== 138 | dependencies: 139 | "@floating-ui/core" "^1.0.0" 140 | "@floating-ui/utils" "^0.2.0" 141 | 142 | "@floating-ui/react-dom@^2.0.0": 143 | version "2.0.8" 144 | resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d" 145 | integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== 146 | dependencies: 147 | "@floating-ui/dom" "^1.6.1" 148 | 149 | "@floating-ui/react@^0.26.2": 150 | version "0.26.10" 151 | resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.10.tgz#d4a4878bcfaed70963ec0eaa67a71bead5924ee5" 152 | integrity sha512-sh6f9gVvWQdEzLObrWbJ97c0clJObiALsFe0LiR/kb3tDRKwEhObASEH2QyfdoO/ZBPzwxa9j+nYFo+sqgbioA== 153 | dependencies: 154 | "@floating-ui/react-dom" "^2.0.0" 155 | "@floating-ui/utils" "^0.2.0" 156 | tabbable "^6.0.0" 157 | 158 | "@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": 159 | version "0.2.1" 160 | resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" 161 | integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== 162 | 163 | "@react-pdf/fns@2.2.1": 164 | version "2.2.1" 165 | resolved "https://registry.yarnpkg.com/@react-pdf/fns/-/fns-2.2.1.tgz#04fe664a6f70214569c9c27e249e3395836f37d5" 166 | integrity sha512-s78aDg0vDYaijU5lLOCsUD+qinQbfOvcNeaoX9AiE7+kZzzCo6B/nX+l48cmt9OosJmvZvE9DWR9cLhrhOi2pA== 167 | dependencies: 168 | "@babel/runtime" "^7.20.13" 169 | 170 | "@react-pdf/font@^2.4.4": 171 | version "2.4.4" 172 | resolved "https://registry.yarnpkg.com/@react-pdf/font/-/font-2.4.4.tgz#52c2b900a2eb4cca579cc58ea85d062c02a879cd" 173 | integrity sha512-yjK5eSY+LcbxS0m+sOYln8GdgIbUgti4xjwf14kx8OSsOMJQJyHFALHMh2cLcKJR9yZeqVDo1FwCsY6gw1yCkg== 174 | dependencies: 175 | "@babel/runtime" "^7.20.13" 176 | "@react-pdf/types" "^2.4.1" 177 | cross-fetch "^3.1.5" 178 | fontkit "^2.0.2" 179 | is-url "^1.2.4" 180 | 181 | "@react-pdf/image@^2.3.6": 182 | version "2.3.6" 183 | resolved "https://registry.yarnpkg.com/@react-pdf/image/-/image-2.3.6.tgz#72444842517f8b0c08bbf4c216d8b41110498d16" 184 | integrity sha512-7iZDYZrZlJqNzS6huNl2XdMcLFUo68e6mOdzQeJ63d5eApdthhSHBnkGzHfLhH5t8DCpZNtClmklzuLL63ADfw== 185 | dependencies: 186 | "@babel/runtime" "^7.20.13" 187 | "@react-pdf/png-js" "^2.3.1" 188 | cross-fetch "^3.1.5" 189 | jay-peg "^1.0.2" 190 | 191 | "@react-pdf/layout@^3.11.5": 192 | version "3.11.5" 193 | resolved "https://registry.yarnpkg.com/@react-pdf/layout/-/layout-3.11.5.tgz#c1caf04e8f58dbecde56ffed7fd5a56d63f3683c" 194 | integrity sha512-VLOzWIODUKw0ZTrS9XDkwl3q1OHKG8qd6OyCZZ7Q8/SijAh9ho70HEc/f1ffBFmM0nGrKMG0M3L0/7z1XKmOGw== 195 | dependencies: 196 | "@babel/runtime" "^7.20.13" 197 | "@react-pdf/fns" "2.2.1" 198 | "@react-pdf/image" "^2.3.6" 199 | "@react-pdf/pdfkit" "^3.1.9" 200 | "@react-pdf/primitives" "^3.1.1" 201 | "@react-pdf/stylesheet" "^4.2.4" 202 | "@react-pdf/textkit" "^4.4.1" 203 | "@react-pdf/types" "^2.4.1" 204 | cross-fetch "^3.1.5" 205 | emoji-regex "^10.3.0" 206 | queue "^6.0.1" 207 | yoga-layout "^2.0.1" 208 | 209 | "@react-pdf/pdfkit@^3.1.9": 210 | version "3.1.9" 211 | resolved "https://registry.yarnpkg.com/@react-pdf/pdfkit/-/pdfkit-3.1.9.tgz#c6af1ec6880668404fa927dfe66118bafa50a54c" 212 | integrity sha512-9ZPF9gGkBWLcEc+HMkbJ5bHsxenej5Kz9YWWs10EeS8d5v6UF027Ffl+75HXZmgiO5iLVONTYj06LnyYZ95XMQ== 213 | dependencies: 214 | "@babel/runtime" "^7.20.13" 215 | "@react-pdf/png-js" "^2.3.1" 216 | browserify-zlib "^0.2.0" 217 | crypto-js "^4.2.0" 218 | fontkit "^2.0.2" 219 | jay-peg "^1.0.2" 220 | vite-compatible-readable-stream "^3.6.1" 221 | 222 | "@react-pdf/png-js@^2.3.1": 223 | version "2.3.1" 224 | resolved "https://registry.yarnpkg.com/@react-pdf/png-js/-/png-js-2.3.1.tgz#5381d5443ac1134e98fc446fa1debb45950665bc" 225 | integrity sha512-pEZ18I4t1vAUS4lmhvXPmXYP4PHeblpWP/pAlMMRkEyP7tdAeHUN7taQl9sf9OPq7YITMY3lWpYpJU6t4CZgZg== 226 | dependencies: 227 | browserify-zlib "^0.2.0" 228 | 229 | "@react-pdf/primitives@^3.1.1": 230 | version "3.1.1" 231 | resolved "https://registry.yarnpkg.com/@react-pdf/primitives/-/primitives-3.1.1.tgz#45a3253806fa61046f3821b8553bfee3cd848d14" 232 | integrity sha512-miwjxLwTnO3IjoqkTVeTI+9CdyDggwekmSLhVCw+a/7FoQc+gF3J2dSKwsHvAcVFM0gvU8mzCeTofgw0zPDq0w== 233 | 234 | "@react-pdf/render@^3.4.3": 235 | version "3.4.3" 236 | resolved "https://registry.yarnpkg.com/@react-pdf/render/-/render-3.4.3.tgz#1aefea3b130349a6916fecfc229d0196d55f9305" 237 | integrity sha512-9LL059vfwrK1gA0uIA4utpQ/pUH9EW/yia4bb7pCoARs8IlupY5UP265jgax15ua0p+MdUwShZzQ9rilu7kGsw== 238 | dependencies: 239 | "@babel/runtime" "^7.20.13" 240 | "@react-pdf/fns" "2.2.1" 241 | "@react-pdf/primitives" "^3.1.1" 242 | "@react-pdf/textkit" "^4.4.1" 243 | "@react-pdf/types" "^2.4.1" 244 | abs-svg-path "^0.1.1" 245 | color-string "^1.9.1" 246 | normalize-svg-path "^1.1.0" 247 | parse-svg-path "^0.1.2" 248 | svg-arc-to-cubic-bezier "^3.2.0" 249 | 250 | "@react-pdf/renderer@^3.4.2": 251 | version "3.4.2" 252 | resolved "https://registry.yarnpkg.com/@react-pdf/renderer/-/renderer-3.4.2.tgz#f13f7d291a1af108ed543c38c2efb86a4afb9f21" 253 | integrity sha512-YNwioiN97SOqEdCskfixsru+Y7hHbUjyayYFALKwWiAnoTOckfpacfGyIgXZXtZiwPYwnSGYTaJRxpjC7seCkA== 254 | dependencies: 255 | "@babel/runtime" "^7.20.13" 256 | "@react-pdf/font" "^2.4.4" 257 | "@react-pdf/layout" "^3.11.5" 258 | "@react-pdf/pdfkit" "^3.1.9" 259 | "@react-pdf/primitives" "^3.1.1" 260 | "@react-pdf/render" "^3.4.3" 261 | "@react-pdf/types" "^2.4.1" 262 | events "^3.3.0" 263 | object-assign "^4.1.1" 264 | prop-types "^15.6.2" 265 | queue "^6.0.1" 266 | scheduler "^0.17.0" 267 | 268 | "@react-pdf/stylesheet@^4.2.4": 269 | version "4.2.4" 270 | resolved "https://registry.yarnpkg.com/@react-pdf/stylesheet/-/stylesheet-4.2.4.tgz#805ce12d49bc666bd34740e72850f95139f0de47" 271 | integrity sha512-CgRfDzeMtnV0GL7zSn381NubmgwqKhFKcK1YrWX3azl/KWVh52jjFd3HWi6dvcETNT862mjWz5MnExe4WOBJXA== 272 | dependencies: 273 | "@babel/runtime" "^7.20.13" 274 | "@react-pdf/fns" "2.2.1" 275 | "@react-pdf/types" "^2.4.1" 276 | color-string "^1.9.1" 277 | hsl-to-hex "^1.0.0" 278 | media-engine "^1.0.3" 279 | postcss-value-parser "^4.1.0" 280 | 281 | "@react-pdf/textkit@^4.4.1": 282 | version "4.4.1" 283 | resolved "https://registry.yarnpkg.com/@react-pdf/textkit/-/textkit-4.4.1.tgz#b4e4181ea7d4269c54a1794d4022b55c5135f0e7" 284 | integrity sha512-Jl9wdTqIvJ5pX+vAGz0EOhP7ut5Two9H6CzTKo/YYPeD79cM2yTXF3JzTERBC28y7LR0Waq9D2LHQjI+b/EYUQ== 285 | dependencies: 286 | "@babel/runtime" "^7.20.13" 287 | "@react-pdf/fns" "2.2.1" 288 | bidi-js "^1.0.2" 289 | hyphen "^1.6.4" 290 | unicode-properties "^1.4.1" 291 | 292 | "@react-pdf/types@^2.4.1": 293 | version "2.4.1" 294 | resolved "https://registry.yarnpkg.com/@react-pdf/types/-/types-2.4.1.tgz#5a3b1edd86001d740563deb74852691cbe3126ba" 295 | integrity sha512-w8pk7svhjVj5f7d7kjEGXSk26ffCqRSQcgWR4DwcFltNpSM18ZJmzmM6WrNeeP437y48LlykLnmGDA3oATakgw== 296 | 297 | "@rollup/rollup-android-arm-eabi@4.13.2": 298 | version "4.13.2" 299 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz#fbf098f49d96a8cac9056f22f5fd80906ef3af85" 300 | integrity sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g== 301 | 302 | "@rollup/rollup-android-arm64@4.13.2": 303 | version "4.13.2" 304 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz#0d2448251040fce19a98eee505dff5b3c8ec9b98" 305 | integrity sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ== 306 | 307 | "@rollup/rollup-darwin-arm64@4.13.2": 308 | version "4.13.2" 309 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz#78db4d4da5b1b84c22adbe25c8a4961b3f22d3af" 310 | integrity sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA== 311 | 312 | "@rollup/rollup-darwin-x64@4.13.2": 313 | version "4.13.2" 314 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz#fcc05af54379f8ee5c7e954987d4514c6fd0fb42" 315 | integrity sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A== 316 | 317 | "@rollup/rollup-linux-arm-gnueabihf@4.13.2": 318 | version "4.13.2" 319 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz#2ce200efa1ef4a56ee2af7b453edc74a259d7d31" 320 | integrity sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ== 321 | 322 | "@rollup/rollup-linux-arm64-gnu@4.13.2": 323 | version "4.13.2" 324 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz#5a24aac882bff9abfda3f45f6f1db2166c342a4a" 325 | integrity sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ== 326 | 327 | "@rollup/rollup-linux-arm64-musl@4.13.2": 328 | version "4.13.2" 329 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz#f1fb4c6f961d3f3397231a99e621d199200e4ea9" 330 | integrity sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA== 331 | 332 | "@rollup/rollup-linux-powerpc64le-gnu@4.13.2": 333 | version "4.13.2" 334 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz#46b2463d94ac3af3e0f7a2947b695397bc13b755" 335 | integrity sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ== 336 | 337 | "@rollup/rollup-linux-riscv64-gnu@4.13.2": 338 | version "4.13.2" 339 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz#47b932ee59a5395a3a341b0493e361d9e6032cf2" 340 | integrity sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw== 341 | 342 | "@rollup/rollup-linux-s390x-gnu@4.13.2": 343 | version "4.13.2" 344 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz#8e14a1b3c3b9a4440c70a9c1ba12d32aa21f9712" 345 | integrity sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg== 346 | 347 | "@rollup/rollup-linux-x64-gnu@4.13.2": 348 | version "4.13.2" 349 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz#270e939194b66df77bcb33dd9a5ddf7784bd7997" 350 | integrity sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A== 351 | 352 | "@rollup/rollup-linux-x64-musl@4.13.2": 353 | version "4.13.2" 354 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz#e8dd0f3c2046acbda2934490b36552e856a3bc6a" 355 | integrity sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA== 356 | 357 | "@rollup/rollup-win32-arm64-msvc@4.13.2": 358 | version "4.13.2" 359 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz#f8b65a4a7e7a6b383e7b14439129b2f474ff123c" 360 | integrity sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA== 361 | 362 | "@rollup/rollup-win32-ia32-msvc@4.13.2": 363 | version "4.13.2" 364 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz#bc1c5a4fbc4337d6cb15da80a4de95fd53ab3573" 365 | integrity sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw== 366 | 367 | "@rollup/rollup-win32-x64-msvc@4.13.2": 368 | version "4.13.2" 369 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz#851959c4c1c3c6647aba1f388198c8243aed6917" 370 | integrity sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ== 371 | 372 | "@swc/core-darwin-arm64@1.4.11": 373 | version "1.4.11" 374 | resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.11.tgz#91ef40816e10495a4038a98dc6c8dfcc85d9c59b" 375 | integrity sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg== 376 | 377 | "@swc/core-darwin-x64@1.4.11": 378 | version "1.4.11" 379 | resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.11.tgz#6f71e3cd4687ef5df226ba0b8a20adc52fa7dc9e" 380 | integrity sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg== 381 | 382 | "@swc/core-linux-arm-gnueabihf@1.4.11": 383 | version "1.4.11" 384 | resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.11.tgz#08521822b5510cb506bc49e728f416636ff0306f" 385 | integrity sha512-XJLB71uw0rog4DjYAPxFGAuGCBQpgJDlPZZK6MTmZOvI/1t0+DelJ24IjHIxk500YYM26Yv47xPabqFPD7I2zQ== 386 | 387 | "@swc/core-linux-arm64-gnu@1.4.11": 388 | version "1.4.11" 389 | resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.11.tgz#9485bc591aa573b282d08b168b80a60badb8df9b" 390 | integrity sha512-vYQwzJvm/iu052d5Iw27UFALIN5xSrGkPZXxLNMHPySVko2QMNNBv35HLatkEQHbQ3X+VKSW9J9SkdtAvAVRAQ== 391 | 392 | "@swc/core-linux-arm64-musl@1.4.11": 393 | version "1.4.11" 394 | resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.11.tgz#85eecad7aaab7e94b1ff15ab9d95e80a1e95f356" 395 | integrity sha512-eV+KduiRYUFjPsvbZuJ9aknQH9Tj0U2/G9oIZSzLx/18WsYi+upzHbgxmIIHJ2VJgfd7nN40RI/hMtxNsUzR/g== 396 | 397 | "@swc/core-linux-x64-gnu@1.4.11": 398 | version "1.4.11" 399 | resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.11.tgz#16259de893489b4699045e36bf52b2afe5d10f6d" 400 | integrity sha512-WA1iGXZ2HpqM1OR9VCQZJ8sQ1KP2or9O4bO8vWZo6HZJIeoQSo7aa9waaCLRpkZvkng1ct/TF/l6ymqSNFXIzQ== 401 | 402 | "@swc/core-linux-x64-musl@1.4.11": 403 | version "1.4.11" 404 | resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.11.tgz#0f4e644fc2b62c8c966072389d354337a22b4dde" 405 | integrity sha512-UkVJToKf0owwQYRnGvjHAeYVDfeimCEcx0VQSbJoN7Iy0ckRZi7YPlmWJU31xtKvikE2bQWCOVe0qbSDqqcWXA== 406 | 407 | "@swc/core-win32-arm64-msvc@1.4.11": 408 | version "1.4.11" 409 | resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.11.tgz#d836b79d8730bf83e6b38a5b888e83944d6fb233" 410 | integrity sha512-35khwkyly7lF5NDSyvIrukBMzxPorgc5iTSDfVO/LvnmN5+fm4lTlrDr4tUfTdOhv3Emy7CsKlsNAeFRJ+Pm+w== 411 | 412 | "@swc/core-win32-ia32-msvc@1.4.11": 413 | version "1.4.11" 414 | resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.11.tgz#bc60bbdc65134aaa5b214e2aaf209acfce401d17" 415 | integrity sha512-Wx8/6f0ufgQF2pbVPsJ2dAmFLwIOW+xBE5fxnb7VnEbGkTgP1qMDWiiAtD9rtvDSuODG3i1AEmAak/2HAc6i6A== 416 | 417 | "@swc/core-win32-x64-msvc@1.4.11": 418 | version "1.4.11" 419 | resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.11.tgz#92fd6d4e2d70bbd4fda438f02310d998db8c7b7c" 420 | integrity sha512-0xRFW6K9UZQH2NVC/0pVB0GJXS45lY24f+6XaPBF1YnMHd8A8GoHl7ugyM5yNUTe2AKhSgk5fJV00EJt/XBtdQ== 421 | 422 | "@swc/core@^1.3.107": 423 | version "1.4.11" 424 | resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.11.tgz#e91f488df9242584cc6f1b034419f8302aeb0c85" 425 | integrity sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg== 426 | dependencies: 427 | "@swc/counter" "^0.1.2" 428 | "@swc/types" "^0.1.5" 429 | optionalDependencies: 430 | "@swc/core-darwin-arm64" "1.4.11" 431 | "@swc/core-darwin-x64" "1.4.11" 432 | "@swc/core-linux-arm-gnueabihf" "1.4.11" 433 | "@swc/core-linux-arm64-gnu" "1.4.11" 434 | "@swc/core-linux-arm64-musl" "1.4.11" 435 | "@swc/core-linux-x64-gnu" "1.4.11" 436 | "@swc/core-linux-x64-musl" "1.4.11" 437 | "@swc/core-win32-arm64-msvc" "1.4.11" 438 | "@swc/core-win32-ia32-msvc" "1.4.11" 439 | "@swc/core-win32-x64-msvc" "1.4.11" 440 | 441 | "@swc/counter@^0.1.2", "@swc/counter@^0.1.3": 442 | version "0.1.3" 443 | resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" 444 | integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== 445 | 446 | "@swc/helpers@^0.4.2": 447 | version "0.4.36" 448 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.36.tgz#fcfff76ed52c214f357e8e9d3f37b568908072d9" 449 | integrity sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q== 450 | dependencies: 451 | legacy-swc-helpers "npm:@swc/helpers@=0.4.14" 452 | tslib "^2.4.0" 453 | 454 | "@swc/types@^0.1.5": 455 | version "0.1.6" 456 | resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba" 457 | integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg== 458 | dependencies: 459 | "@swc/counter" "^0.1.3" 460 | 461 | "@types/date-fns@^2.6.0": 462 | version "2.6.0" 463 | resolved "https://registry.yarnpkg.com/@types/date-fns/-/date-fns-2.6.0.tgz#b062ca46562002909be0c63a6467ed173136acc1" 464 | integrity sha512-9DSw2ZRzV0Tmpa6PHHJbMcZn79HHus+BBBohcOaDzkK/G3zMjDUDYjJIWBFLbkh+1+/IOS0A59BpQfdr37hASg== 465 | dependencies: 466 | date-fns "*" 467 | 468 | "@types/estree@1.0.5": 469 | version "1.0.5" 470 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 471 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 472 | 473 | "@types/file-saver@^2.0.7": 474 | version "2.0.7" 475 | resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.7.tgz#8dbb2f24bdc7486c54aa854eb414940bbd056f7d" 476 | integrity sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A== 477 | 478 | "@types/node@^20.11.30": 479 | version "20.12.2" 480 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" 481 | integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== 482 | dependencies: 483 | undici-types "~5.26.4" 484 | 485 | "@types/prop-types@*": 486 | version "15.7.12" 487 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" 488 | integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== 489 | 490 | "@types/rc-slider@^9.3.0": 491 | version "9.3.1" 492 | resolved "https://registry.yarnpkg.com/@types/rc-slider/-/rc-slider-9.3.1.tgz#ed0a11a87fdb3064b2767705c7bd94b62a112725" 493 | integrity sha512-apvhMnpQltIzLIvKfZGeI5uvBK4CoDAnqXlV7rtFRVn4Ecwe5Db32I4LF1sNlhAVevLjLJuE+7Fpi3OnG1mVbg== 494 | dependencies: 495 | rc-slider "*" 496 | 497 | "@types/react-datepicker@^6.2.0": 498 | version "6.2.0" 499 | resolved "https://registry.yarnpkg.com/@types/react-datepicker/-/react-datepicker-6.2.0.tgz#1c93c10d12d1d683eacf46a82e35b953cd0da117" 500 | integrity sha512-+JtO4Fm97WLkJTH8j8/v3Ldh7JCNRwjMYjRaKh4KHH0M3jJoXtwiD3JBCsdlg3tsFIw9eQSqyAPeVDN2H2oM9Q== 501 | dependencies: 502 | "@floating-ui/react" "^0.26.2" 503 | "@types/react" "*" 504 | date-fns "^3.3.1" 505 | 506 | "@types/react-dom@^18.2.23": 507 | version "18.2.23" 508 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.23.tgz#112338760f622a16d64271b408355f2f27f6302c" 509 | integrity sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A== 510 | dependencies: 511 | "@types/react" "*" 512 | 513 | "@types/react-textarea-autosize@^8.0.0": 514 | version "8.0.0" 515 | resolved "https://registry.yarnpkg.com/@types/react-textarea-autosize/-/react-textarea-autosize-8.0.0.tgz#f68f388552aaa608328b3e352d9a23ad7e0f72e4" 516 | integrity sha512-KVqk+/+RMQB3ZDpk7ZTpYHauU3Ue+Y0f09POvGaEpaGb+izzbpoM47tkDGlbF37iT7JYZ8QFwLzqiOPYbQaztA== 517 | dependencies: 518 | react-textarea-autosize "*" 519 | 520 | "@types/react@*", "@types/react@^18.2.73": 521 | version "18.2.73" 522 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" 523 | integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== 524 | dependencies: 525 | "@types/prop-types" "*" 526 | csstype "^3.0.2" 527 | 528 | "@uidotdev/usehooks@^2.4.1": 529 | version "2.4.1" 530 | resolved "https://registry.yarnpkg.com/@uidotdev/usehooks/-/usehooks-2.4.1.tgz#4b733eaeae09a7be143c6c9ca158b56cc1ea75bf" 531 | integrity sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg== 532 | 533 | "@vitejs/plugin-react-swc@^3.6.0": 534 | version "3.6.0" 535 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz#dc9cd1363baf3780f3ad3e0a12a46a3ffe0c7526" 536 | integrity sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g== 537 | dependencies: 538 | "@swc/core" "^1.3.107" 539 | 540 | abs-svg-path@^0.1.1: 541 | version "0.1.1" 542 | resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" 543 | integrity sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA== 544 | 545 | anymatch@~3.1.2: 546 | version "3.1.3" 547 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 548 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 549 | dependencies: 550 | normalize-path "^3.0.0" 551 | picomatch "^2.0.4" 552 | 553 | array-union@^1.0.1: 554 | version "1.0.2" 555 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 556 | integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== 557 | dependencies: 558 | array-uniq "^1.0.1" 559 | 560 | array-uniq@^1.0.1: 561 | version "1.0.3" 562 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 563 | integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== 564 | 565 | async@^3.2.4: 566 | version "3.2.5" 567 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" 568 | integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== 569 | 570 | balanced-match@^1.0.0: 571 | version "1.0.2" 572 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 573 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 574 | 575 | base64-js@^1.1.2, base64-js@^1.3.0: 576 | version "1.5.1" 577 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 578 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 579 | 580 | bidi-js@^1.0.2: 581 | version "1.0.3" 582 | resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2" 583 | integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== 584 | dependencies: 585 | require-from-string "^2.0.2" 586 | 587 | binary-extensions@^2.0.0: 588 | version "2.3.0" 589 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 590 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 591 | 592 | brace-expansion@^1.1.7: 593 | version "1.1.11" 594 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 595 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 596 | dependencies: 597 | balanced-match "^1.0.0" 598 | concat-map "0.0.1" 599 | 600 | braces@~3.0.2: 601 | version "3.0.2" 602 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 603 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 604 | dependencies: 605 | fill-range "^7.0.1" 606 | 607 | brotli@^1.3.2: 608 | version "1.3.3" 609 | resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" 610 | integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== 611 | dependencies: 612 | base64-js "^1.1.2" 613 | 614 | browserify-zlib@^0.2.0: 615 | version "0.2.0" 616 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 617 | integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== 618 | dependencies: 619 | pako "~1.0.5" 620 | 621 | "chokidar@>=3.0.0 <4.0.0": 622 | version "3.6.0" 623 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 624 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 625 | dependencies: 626 | anymatch "~3.1.2" 627 | braces "~3.0.2" 628 | glob-parent "~5.1.2" 629 | is-binary-path "~2.1.0" 630 | is-glob "~4.0.1" 631 | normalize-path "~3.0.0" 632 | readdirp "~3.6.0" 633 | optionalDependencies: 634 | fsevents "~2.3.2" 635 | 636 | classnames@^2.2.5: 637 | version "2.5.1" 638 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" 639 | integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== 640 | 641 | clone@^2.1.2: 642 | version "2.1.2" 643 | resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" 644 | integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== 645 | 646 | clsx@^2.1.0: 647 | version "2.1.0" 648 | resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" 649 | integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== 650 | 651 | color-name@^1.0.0: 652 | version "1.1.4" 653 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 654 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 655 | 656 | color-string@^1.9.1: 657 | version "1.9.1" 658 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" 659 | integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== 660 | dependencies: 661 | color-name "^1.0.0" 662 | simple-swizzle "^0.2.2" 663 | 664 | commander@^11.0.0: 665 | version "11.1.0" 666 | resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" 667 | integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== 668 | 669 | commondir@^1.0.1: 670 | version "1.0.1" 671 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 672 | integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== 673 | 674 | concat-map@0.0.1: 675 | version "0.0.1" 676 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 677 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 678 | 679 | cross-fetch@^3.1.5: 680 | version "3.1.8" 681 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" 682 | integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== 683 | dependencies: 684 | node-fetch "^2.6.12" 685 | 686 | crypto-js@^4.2.0: 687 | version "4.2.0" 688 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" 689 | integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== 690 | 691 | csstype@^3.0.2: 692 | version "3.1.3" 693 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 694 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 695 | 696 | date-fns@*, date-fns@^3.3.1, date-fns@^3.6.0: 697 | version "3.6.0" 698 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" 699 | integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== 700 | 701 | dfa@^1.2.0: 702 | version "1.2.0" 703 | resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" 704 | integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== 705 | 706 | email-addresses@^5.0.0: 707 | version "5.0.0" 708 | resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" 709 | integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== 710 | 711 | emoji-regex@^10.3.0: 712 | version "10.3.0" 713 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" 714 | integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== 715 | 716 | esbuild@^0.20.1: 717 | version "0.20.2" 718 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" 719 | integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== 720 | optionalDependencies: 721 | "@esbuild/aix-ppc64" "0.20.2" 722 | "@esbuild/android-arm" "0.20.2" 723 | "@esbuild/android-arm64" "0.20.2" 724 | "@esbuild/android-x64" "0.20.2" 725 | "@esbuild/darwin-arm64" "0.20.2" 726 | "@esbuild/darwin-x64" "0.20.2" 727 | "@esbuild/freebsd-arm64" "0.20.2" 728 | "@esbuild/freebsd-x64" "0.20.2" 729 | "@esbuild/linux-arm" "0.20.2" 730 | "@esbuild/linux-arm64" "0.20.2" 731 | "@esbuild/linux-ia32" "0.20.2" 732 | "@esbuild/linux-loong64" "0.20.2" 733 | "@esbuild/linux-mips64el" "0.20.2" 734 | "@esbuild/linux-ppc64" "0.20.2" 735 | "@esbuild/linux-riscv64" "0.20.2" 736 | "@esbuild/linux-s390x" "0.20.2" 737 | "@esbuild/linux-x64" "0.20.2" 738 | "@esbuild/netbsd-x64" "0.20.2" 739 | "@esbuild/openbsd-x64" "0.20.2" 740 | "@esbuild/sunos-x64" "0.20.2" 741 | "@esbuild/win32-arm64" "0.20.2" 742 | "@esbuild/win32-ia32" "0.20.2" 743 | "@esbuild/win32-x64" "0.20.2" 744 | 745 | escape-string-regexp@^1.0.2: 746 | version "1.0.5" 747 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 748 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 749 | 750 | events@^3.3.0: 751 | version "3.3.0" 752 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 753 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 754 | 755 | fast-deep-equal@^3.1.3: 756 | version "3.1.3" 757 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 758 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 759 | 760 | file-saver@^2.0.5: 761 | version "2.0.5" 762 | resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" 763 | integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== 764 | 765 | filename-reserved-regex@^2.0.0: 766 | version "2.0.0" 767 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 768 | integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== 769 | 770 | filenamify@^4.3.0: 771 | version "4.3.0" 772 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" 773 | integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== 774 | dependencies: 775 | filename-reserved-regex "^2.0.0" 776 | strip-outer "^1.0.1" 777 | trim-repeated "^1.0.0" 778 | 779 | fill-range@^7.0.1: 780 | version "7.0.1" 781 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 782 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 783 | dependencies: 784 | to-regex-range "^5.0.1" 785 | 786 | find-cache-dir@^3.3.1: 787 | version "3.3.2" 788 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" 789 | integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== 790 | dependencies: 791 | commondir "^1.0.1" 792 | make-dir "^3.0.2" 793 | pkg-dir "^4.1.0" 794 | 795 | find-up@^4.0.0: 796 | version "4.1.0" 797 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 798 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 799 | dependencies: 800 | locate-path "^5.0.0" 801 | path-exists "^4.0.0" 802 | 803 | fontkit@^2.0.2: 804 | version "2.0.2" 805 | resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-2.0.2.tgz#ac5384f3ecab8327c6d2ea2e4d384afc544b48fd" 806 | integrity sha512-jc4k5Yr8iov8QfS6u8w2CnHWVmbOGtdBtOXMze5Y+QD966Rx6PEVWXSEGwXlsDlKtu1G12cJjcsybnqhSk/+LA== 807 | dependencies: 808 | "@swc/helpers" "^0.4.2" 809 | brotli "^1.3.2" 810 | clone "^2.1.2" 811 | dfa "^1.2.0" 812 | fast-deep-equal "^3.1.3" 813 | restructure "^3.0.0" 814 | tiny-inflate "^1.0.3" 815 | unicode-properties "^1.4.0" 816 | unicode-trie "^2.0.0" 817 | 818 | fs-extra@^11.1.1: 819 | version "11.2.0" 820 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" 821 | integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== 822 | dependencies: 823 | graceful-fs "^4.2.0" 824 | jsonfile "^6.0.1" 825 | universalify "^2.0.0" 826 | 827 | fs.realpath@^1.0.0: 828 | version "1.0.0" 829 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 830 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 831 | 832 | fsevents@~2.3.2, fsevents@~2.3.3: 833 | version "2.3.3" 834 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 835 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 836 | 837 | gh-pages@^6.1.1: 838 | version "6.1.1" 839 | resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-6.1.1.tgz#e80af927a081cb480657fde5a0b87ea2e77d6c74" 840 | integrity sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw== 841 | dependencies: 842 | async "^3.2.4" 843 | commander "^11.0.0" 844 | email-addresses "^5.0.0" 845 | filenamify "^4.3.0" 846 | find-cache-dir "^3.3.1" 847 | fs-extra "^11.1.1" 848 | globby "^6.1.0" 849 | 850 | glob-parent@~5.1.2: 851 | version "5.1.2" 852 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 853 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 854 | dependencies: 855 | is-glob "^4.0.1" 856 | 857 | glob@^7.0.3: 858 | version "7.2.3" 859 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 860 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 861 | dependencies: 862 | fs.realpath "^1.0.0" 863 | inflight "^1.0.4" 864 | inherits "2" 865 | minimatch "^3.1.1" 866 | once "^1.3.0" 867 | path-is-absolute "^1.0.0" 868 | 869 | globby@^6.1.0: 870 | version "6.1.0" 871 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 872 | integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== 873 | dependencies: 874 | array-union "^1.0.1" 875 | glob "^7.0.3" 876 | object-assign "^4.0.1" 877 | pify "^2.0.0" 878 | pinkie-promise "^2.0.0" 879 | 880 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 881 | version "4.2.11" 882 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 883 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 884 | 885 | hsl-to-hex@^1.0.0: 886 | version "1.0.0" 887 | resolved "https://registry.yarnpkg.com/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz#c58c826dc6d2f1e0a5ff1da5a7ecbf03faac1352" 888 | integrity sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA== 889 | dependencies: 890 | hsl-to-rgb-for-reals "^1.1.0" 891 | 892 | hsl-to-rgb-for-reals@^1.1.0: 893 | version "1.1.1" 894 | resolved "https://registry.yarnpkg.com/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz#e1eb23f6b78016e3722431df68197e6dcdc016d9" 895 | integrity sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg== 896 | 897 | hyphen@^1.6.4: 898 | version "1.10.4" 899 | resolved "https://registry.yarnpkg.com/hyphen/-/hyphen-1.10.4.tgz#ae16551b8a56ae7c34ffd4b98777221795e6c912" 900 | integrity sha512-SejXzIpv9gOVdDWXd4suM1fdF1k2dxZGvuTdkOVLoazYfK7O4DykIQbdrvuyG+EaTNlXAGhMndtKrhykgbt0gg== 901 | 902 | immutable@^4.0.0: 903 | version "4.3.5" 904 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" 905 | integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== 906 | 907 | inflight@^1.0.4: 908 | version "1.0.6" 909 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 910 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 911 | dependencies: 912 | once "^1.3.0" 913 | wrappy "1" 914 | 915 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 916 | version "2.0.4" 917 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 918 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 919 | 920 | is-arrayish@^0.3.1: 921 | version "0.3.2" 922 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" 923 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 924 | 925 | is-binary-path@~2.1.0: 926 | version "2.1.0" 927 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 928 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 929 | dependencies: 930 | binary-extensions "^2.0.0" 931 | 932 | is-extglob@^2.1.1: 933 | version "2.1.1" 934 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 935 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 936 | 937 | is-glob@^4.0.1, is-glob@~4.0.1: 938 | version "4.0.3" 939 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 940 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 941 | dependencies: 942 | is-extglob "^2.1.1" 943 | 944 | is-number@^7.0.0: 945 | version "7.0.0" 946 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 947 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 948 | 949 | is-url@^1.2.4: 950 | version "1.2.4" 951 | resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" 952 | integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== 953 | 954 | jay-peg@^1.0.2: 955 | version "1.0.2" 956 | resolved "https://registry.yarnpkg.com/jay-peg/-/jay-peg-1.0.2.tgz#17a54d386e472f5f313f3d6e88770b170ea569f4" 957 | integrity sha512-fyV3NVvv6pTys/3BTapBUGAWAuU9rM2gRcgijZHzptd5KKL+s+S7hESFN+wOsbDH1MzFwdlRAXi0aGxS6uiMKg== 958 | dependencies: 959 | restructure "^3.0.0" 960 | 961 | "js-tokens@^3.0.0 || ^4.0.0": 962 | version "4.0.0" 963 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 964 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 965 | 966 | jsonfile@^6.0.1: 967 | version "6.1.0" 968 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 969 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 970 | dependencies: 971 | universalify "^2.0.0" 972 | optionalDependencies: 973 | graceful-fs "^4.1.6" 974 | 975 | "legacy-swc-helpers@npm:@swc/helpers@=0.4.14": 976 | version "0.4.14" 977 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" 978 | integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== 979 | dependencies: 980 | tslib "^2.4.0" 981 | 982 | locate-path@^5.0.0: 983 | version "5.0.0" 984 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 985 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 986 | dependencies: 987 | p-locate "^4.1.0" 988 | 989 | loose-envify@^1.1.0, loose-envify@^1.4.0: 990 | version "1.4.0" 991 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 992 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 993 | dependencies: 994 | js-tokens "^3.0.0 || ^4.0.0" 995 | 996 | make-dir@^3.0.2: 997 | version "3.1.0" 998 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 999 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1000 | dependencies: 1001 | semver "^6.0.0" 1002 | 1003 | media-engine@^1.0.3: 1004 | version "1.0.3" 1005 | resolved "https://registry.yarnpkg.com/media-engine/-/media-engine-1.0.3.tgz#be3188f6cd243ea2a40804a35de5a5b032f58dad" 1006 | integrity sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg== 1007 | 1008 | minimatch@^3.1.1: 1009 | version "3.1.2" 1010 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1011 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1012 | dependencies: 1013 | brace-expansion "^1.1.7" 1014 | 1015 | nanoid@^3.3.7: 1016 | version "3.3.7" 1017 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 1018 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1019 | 1020 | node-fetch@^2.6.12: 1021 | version "2.7.0" 1022 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1023 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1024 | dependencies: 1025 | whatwg-url "^5.0.0" 1026 | 1027 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1028 | version "3.0.0" 1029 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1030 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1031 | 1032 | normalize-svg-path@^1.1.0: 1033 | version "1.1.0" 1034 | resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" 1035 | integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== 1036 | dependencies: 1037 | svg-arc-to-cubic-bezier "^3.0.0" 1038 | 1039 | object-assign@^4.0.1, object-assign@^4.1.1: 1040 | version "4.1.1" 1041 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1042 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1043 | 1044 | once@^1.3.0: 1045 | version "1.4.0" 1046 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1047 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1048 | dependencies: 1049 | wrappy "1" 1050 | 1051 | p-limit@^2.2.0: 1052 | version "2.3.0" 1053 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1054 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1055 | dependencies: 1056 | p-try "^2.0.0" 1057 | 1058 | p-locate@^4.1.0: 1059 | version "4.1.0" 1060 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1061 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1062 | dependencies: 1063 | p-limit "^2.2.0" 1064 | 1065 | p-try@^2.0.0: 1066 | version "2.2.0" 1067 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1068 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1069 | 1070 | pako@^0.2.5: 1071 | version "0.2.9" 1072 | resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" 1073 | integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== 1074 | 1075 | pako@~1.0.5: 1076 | version "1.0.11" 1077 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1078 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1079 | 1080 | parse-svg-path@^0.1.2: 1081 | version "0.1.2" 1082 | resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" 1083 | integrity sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ== 1084 | 1085 | path-exists@^4.0.0: 1086 | version "4.0.0" 1087 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1088 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1089 | 1090 | path-is-absolute@^1.0.0: 1091 | version "1.0.1" 1092 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1093 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1094 | 1095 | picocolors@^1.0.0: 1096 | version "1.0.0" 1097 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1098 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1099 | 1100 | picomatch@^2.0.4, picomatch@^2.2.1: 1101 | version "2.3.1" 1102 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1103 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1104 | 1105 | pify@^2.0.0: 1106 | version "2.3.0" 1107 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1108 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== 1109 | 1110 | pinkie-promise@^2.0.0: 1111 | version "2.0.1" 1112 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1113 | integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== 1114 | dependencies: 1115 | pinkie "^2.0.0" 1116 | 1117 | pinkie@^2.0.0: 1118 | version "2.0.4" 1119 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1120 | integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== 1121 | 1122 | pkg-dir@^4.1.0: 1123 | version "4.2.0" 1124 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1125 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1126 | dependencies: 1127 | find-up "^4.0.0" 1128 | 1129 | postcss-value-parser@^4.1.0: 1130 | version "4.2.0" 1131 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" 1132 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 1133 | 1134 | postcss@^8.4.38: 1135 | version "8.4.38" 1136 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" 1137 | integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== 1138 | dependencies: 1139 | nanoid "^3.3.7" 1140 | picocolors "^1.0.0" 1141 | source-map-js "^1.2.0" 1142 | 1143 | prettier@^3.2.5: 1144 | version "3.2.5" 1145 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" 1146 | integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== 1147 | 1148 | prop-types@^15.6.2, prop-types@^15.7.2: 1149 | version "15.8.1" 1150 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 1151 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 1152 | dependencies: 1153 | loose-envify "^1.4.0" 1154 | object-assign "^4.1.1" 1155 | react-is "^16.13.1" 1156 | 1157 | queue@^6.0.1: 1158 | version "6.0.2" 1159 | resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" 1160 | integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== 1161 | dependencies: 1162 | inherits "~2.0.3" 1163 | 1164 | rc-slider@*, rc-slider@10.5.0: 1165 | version "10.5.0" 1166 | resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.5.0.tgz#1bd4853d114cb3403b67c485125887adb6a2a117" 1167 | integrity sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw== 1168 | dependencies: 1169 | "@babel/runtime" "^7.10.1" 1170 | classnames "^2.2.5" 1171 | rc-util "^5.27.0" 1172 | 1173 | rc-util@^5.27.0: 1174 | version "5.39.1" 1175 | resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.39.1.tgz#7bca4fb55e20add0eef5c23166cd9f9e5f51a8a1" 1176 | integrity sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ== 1177 | dependencies: 1178 | "@babel/runtime" "^7.18.3" 1179 | react-is "^18.2.0" 1180 | 1181 | react-datepicker@^6.6.0: 1182 | version "6.6.0" 1183 | resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-6.6.0.tgz#0128547211c8fece08fef0b5406efffff2d36f1f" 1184 | integrity sha512-ERC0/Q4pPC9bNIcGUpdCbHc+oCxhkU3WI3UOGHkyJ3A9fqALCYpEmLc5S5xvAd7DuCDdbsyW97oRPM6pWWwjww== 1185 | dependencies: 1186 | "@floating-ui/react" "^0.26.2" 1187 | clsx "^2.1.0" 1188 | date-fns "^3.3.1" 1189 | prop-types "^15.7.2" 1190 | react-onclickoutside "^6.13.0" 1191 | 1192 | react-dom@^18.2.0: 1193 | version "18.2.0" 1194 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 1195 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 1196 | dependencies: 1197 | loose-envify "^1.1.0" 1198 | scheduler "^0.23.0" 1199 | 1200 | react-is@^16.13.1: 1201 | version "16.13.1" 1202 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1203 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1204 | 1205 | react-is@^18.2.0: 1206 | version "18.2.0" 1207 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" 1208 | integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 1209 | 1210 | react-onclickoutside@^6.13.0: 1211 | version "6.13.0" 1212 | resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz#e165ea4e5157f3da94f4376a3ab3e22a565f4ffc" 1213 | integrity sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A== 1214 | 1215 | react-textarea-autosize@*, react-textarea-autosize@^8.5.3: 1216 | version "8.5.3" 1217 | resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" 1218 | integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== 1219 | dependencies: 1220 | "@babel/runtime" "^7.20.13" 1221 | use-composed-ref "^1.3.0" 1222 | use-latest "^1.2.1" 1223 | 1224 | react@^18.2.0: 1225 | version "18.2.0" 1226 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 1227 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 1228 | dependencies: 1229 | loose-envify "^1.1.0" 1230 | 1231 | readdirp@~3.6.0: 1232 | version "3.6.0" 1233 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1234 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1235 | dependencies: 1236 | picomatch "^2.2.1" 1237 | 1238 | regenerator-runtime@^0.14.0: 1239 | version "0.14.1" 1240 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" 1241 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 1242 | 1243 | require-from-string@^2.0.2: 1244 | version "2.0.2" 1245 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1246 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1247 | 1248 | restructure@^3.0.0: 1249 | version "3.0.1" 1250 | resolved "https://registry.yarnpkg.com/restructure/-/restructure-3.0.1.tgz#d610105f09978a42c806c1fc2048ff56900e6a21" 1251 | integrity sha512-6neDpI/yE9eogQo22qmWwKIA9wFPRyYjQleDEh6zaNAf2ZPqLJYUvNBJBWEWNoBlCeQMQkvIOe2YI/K2GOag+g== 1252 | 1253 | rollup@^4.13.0: 1254 | version "4.13.2" 1255 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.2.tgz#ac57d2dc48e8f5562f5a6daadb9caee590069262" 1256 | integrity sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g== 1257 | dependencies: 1258 | "@types/estree" "1.0.5" 1259 | optionalDependencies: 1260 | "@rollup/rollup-android-arm-eabi" "4.13.2" 1261 | "@rollup/rollup-android-arm64" "4.13.2" 1262 | "@rollup/rollup-darwin-arm64" "4.13.2" 1263 | "@rollup/rollup-darwin-x64" "4.13.2" 1264 | "@rollup/rollup-linux-arm-gnueabihf" "4.13.2" 1265 | "@rollup/rollup-linux-arm64-gnu" "4.13.2" 1266 | "@rollup/rollup-linux-arm64-musl" "4.13.2" 1267 | "@rollup/rollup-linux-powerpc64le-gnu" "4.13.2" 1268 | "@rollup/rollup-linux-riscv64-gnu" "4.13.2" 1269 | "@rollup/rollup-linux-s390x-gnu" "4.13.2" 1270 | "@rollup/rollup-linux-x64-gnu" "4.13.2" 1271 | "@rollup/rollup-linux-x64-musl" "4.13.2" 1272 | "@rollup/rollup-win32-arm64-msvc" "4.13.2" 1273 | "@rollup/rollup-win32-ia32-msvc" "4.13.2" 1274 | "@rollup/rollup-win32-x64-msvc" "4.13.2" 1275 | fsevents "~2.3.2" 1276 | 1277 | safe-buffer@~5.2.0: 1278 | version "5.2.1" 1279 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1280 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1281 | 1282 | sass@^1.72.0: 1283 | version "1.72.0" 1284 | resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c" 1285 | integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA== 1286 | dependencies: 1287 | chokidar ">=3.0.0 <4.0.0" 1288 | immutable "^4.0.0" 1289 | source-map-js ">=0.6.2 <2.0.0" 1290 | 1291 | scheduler@^0.17.0: 1292 | version "0.17.0" 1293 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" 1294 | integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA== 1295 | dependencies: 1296 | loose-envify "^1.1.0" 1297 | object-assign "^4.1.1" 1298 | 1299 | scheduler@^0.23.0: 1300 | version "0.23.0" 1301 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 1302 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 1303 | dependencies: 1304 | loose-envify "^1.1.0" 1305 | 1306 | semver@^6.0.0: 1307 | version "6.3.1" 1308 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1309 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1310 | 1311 | simple-swizzle@^0.2.2: 1312 | version "0.2.2" 1313 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 1314 | integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== 1315 | dependencies: 1316 | is-arrayish "^0.3.1" 1317 | 1318 | "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: 1319 | version "1.2.0" 1320 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" 1321 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 1322 | 1323 | string_decoder@^1.1.1: 1324 | version "1.3.0" 1325 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1326 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1327 | dependencies: 1328 | safe-buffer "~5.2.0" 1329 | 1330 | strip-outer@^1.0.1: 1331 | version "1.0.1" 1332 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 1333 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 1334 | dependencies: 1335 | escape-string-regexp "^1.0.2" 1336 | 1337 | svg-arc-to-cubic-bezier@^3.0.0, svg-arc-to-cubic-bezier@^3.2.0: 1338 | version "3.2.0" 1339 | resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" 1340 | integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== 1341 | 1342 | tabbable@^6.0.0: 1343 | version "6.2.0" 1344 | resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" 1345 | integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== 1346 | 1347 | tiny-inflate@^1.0.0, tiny-inflate@^1.0.3: 1348 | version "1.0.3" 1349 | resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" 1350 | integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== 1351 | 1352 | to-regex-range@^5.0.1: 1353 | version "5.0.1" 1354 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1355 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1356 | dependencies: 1357 | is-number "^7.0.0" 1358 | 1359 | tr46@~0.0.3: 1360 | version "0.0.3" 1361 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1362 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1363 | 1364 | trim-repeated@^1.0.0: 1365 | version "1.0.0" 1366 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 1367 | integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== 1368 | dependencies: 1369 | escape-string-regexp "^1.0.2" 1370 | 1371 | tslib@^2.4.0: 1372 | version "2.6.2" 1373 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 1374 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 1375 | 1376 | typescript@^5.4.3: 1377 | version "5.4.3" 1378 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" 1379 | integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== 1380 | 1381 | undici-types@~5.26.4: 1382 | version "5.26.5" 1383 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1384 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1385 | 1386 | unicode-properties@^1.4.0, unicode-properties@^1.4.1: 1387 | version "1.4.1" 1388 | resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" 1389 | integrity sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== 1390 | dependencies: 1391 | base64-js "^1.3.0" 1392 | unicode-trie "^2.0.0" 1393 | 1394 | unicode-trie@^2.0.0: 1395 | version "2.0.0" 1396 | resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" 1397 | integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== 1398 | dependencies: 1399 | pako "^0.2.5" 1400 | tiny-inflate "^1.0.0" 1401 | 1402 | universalify@^2.0.0: 1403 | version "2.0.1" 1404 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" 1405 | integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== 1406 | 1407 | use-composed-ref@^1.3.0: 1408 | version "1.3.0" 1409 | resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" 1410 | integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== 1411 | 1412 | use-isomorphic-layout-effect@^1.1.1: 1413 | version "1.1.2" 1414 | resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" 1415 | integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== 1416 | 1417 | use-latest@^1.2.1: 1418 | version "1.2.1" 1419 | resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" 1420 | integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== 1421 | dependencies: 1422 | use-isomorphic-layout-effect "^1.1.1" 1423 | 1424 | util-deprecate@^1.0.1: 1425 | version "1.0.2" 1426 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1427 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1428 | 1429 | vite-compatible-readable-stream@^3.6.1: 1430 | version "3.6.1" 1431 | resolved "https://registry.yarnpkg.com/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz#27267aebbdc9893c0ddf65a421279cbb1e31d8cd" 1432 | integrity sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ== 1433 | dependencies: 1434 | inherits "^2.0.3" 1435 | string_decoder "^1.1.1" 1436 | util-deprecate "^1.0.1" 1437 | 1438 | vite@^5.2.7: 1439 | version "5.2.7" 1440 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.7.tgz#e1b8a985eb54fcb9467d7f7f009d87485016df6e" 1441 | integrity sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA== 1442 | dependencies: 1443 | esbuild "^0.20.1" 1444 | postcss "^8.4.38" 1445 | rollup "^4.13.0" 1446 | optionalDependencies: 1447 | fsevents "~2.3.3" 1448 | 1449 | webidl-conversions@^3.0.0: 1450 | version "3.0.1" 1451 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1452 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1453 | 1454 | whatwg-url@^5.0.0: 1455 | version "5.0.0" 1456 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1457 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1458 | dependencies: 1459 | tr46 "~0.0.3" 1460 | webidl-conversions "^3.0.0" 1461 | 1462 | wrappy@1: 1463 | version "1.0.2" 1464 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1465 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1466 | 1467 | yoga-layout@^2.0.1: 1468 | version "2.0.1" 1469 | resolved "https://registry.yarnpkg.com/yoga-layout/-/yoga-layout-2.0.1.tgz#4bc686abe2464f977866650ddccc1dbcf9f0d03c" 1470 | integrity sha512-tT/oChyDXelLo2A+UVnlW9GU7CsvFMaEnd9kVFsaiCQonFAXd3xrHhkLYu+suwwosrAEQ746xBU+HvYtm1Zs2Q== 1471 | 1472 | zod@^3.22.4: 1473 | version "3.22.4" 1474 | resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" 1475 | integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== 1476 | --------------------------------------------------------------------------------