From b0dd6f55a62ff5b11e06362a16c28da63ec83e57 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Mon, 31 Jul 2023 01:52:04 -0300 Subject: [PATCH 01/46] feat: add DividendsChart --- .old/HistoryChart.tsx | 43 --------------- .old/ResultsProviders.tsx | 54 ------------------- .old/getQuote.ts | 9 ---- src/@types/ResultsTypes.ts | 6 +++ .../components/DividendsChart/index.tsx | 42 +++++++++++++++ .../portfolios/[portfolioId]/details/page.tsx | 17 +++--- src/config.ts | 6 +++ src/helpers/tickers.ts | 13 ++--- src/hooks/useResults.ts | 1 + src/reducers/dataReducer.ts | 16 +++++- 10 files changed, 87 insertions(+), 120 deletions(-) delete mode 100644 .old/HistoryChart.tsx delete mode 100644 .old/ResultsProviders.tsx delete mode 100644 .old/getQuote.ts create mode 100644 src/app/portfolios/[portfolioId]/details/components/DividendsChart/index.tsx diff --git a/.old/HistoryChart.tsx b/.old/HistoryChart.tsx deleted file mode 100644 index 446b856..0000000 --- a/.old/HistoryChart.tsx +++ /dev/null @@ -1,43 +0,0 @@ -'use client' - -import { DividendsData } from '@/@types/QuotesTypes' -import { Card, Title, BarChart } from '@tremor/react' -import moment from 'moment' - -const dataFormatter = (number: number) => - `R$ ${Intl.NumberFormat('pt-BR').format(number).toString()}` - -const getHistoryDividendsData = (data: DividendsData) => { - return data.cashDividends - .filter((dividend) => dividend.label === 'RENDIMENTO') - .map((dividend) => { - return { - ...dividend, - paymentDate: moment(dividend.paymentDate).format('MM/YYYY'), - } - }) - .reverse() -} - -interface Props { - data: DividendsData -} - -export function HistoryChart(props: Props) { - const data = getHistoryDividendsData(props.data) - - return ( - - Dividendos pagos últimos 12 meses - - - ) -} diff --git a/.old/ResultsProviders.tsx b/.old/ResultsProviders.tsx deleted file mode 100644 index 1eb407f..0000000 --- a/.old/ResultsProviders.tsx +++ /dev/null @@ -1,54 +0,0 @@ -// 'use client' - -// import { ReactNode, useEffect, useState } from 'react' - -// import { ResultsContext } from '@/contexts/ResultsContext' -// import { Result } from '@/@types/ResultsTypes' -// import { Ticker } from '@/@types/TickersTypes' -// import { useTickers } from '@/hooks/useTickers' -// import { fetchTicker } from '@/helpers/tickers' - -// export function ResultsProviders({ children }: { children: ReactNode }) { - -// const [results, setResults] = useState([]) -// const { tickers } = useTickers() - -// const get = (ticker: string): Result => { -// return results.find((r) => r.ticker === ticker) || {} as Result -// } - -// const load = async (tickers: Ticker[]) => { -// console.log('loading results...', tickers); - -// const newResults: Result[] = [] -// Promise.allSettled(tickers.map((t) => fetchTicker(t.ticker))) -// .then((responses) => { -// responses.forEach((response) => { -// if (response.status === 'fulfilled') { -// newResults.push(response.value) -// } -// }) -// }) -// .finally(() => { -// setResults(newResults) -// console.log('results loaded', newResults); -// }) - -// } - -// useEffect(() => { -// load(tickers) -// }, [tickers]) - -// return ( -// -// {children} -// -// ) -// } diff --git a/.old/getQuote.ts b/.old/getQuote.ts deleted file mode 100644 index 7d9c394..0000000 --- a/.old/getQuote.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { brAPI } from './api/brapi' -import { investidor10 } from './api/investidor10' - -export const getQuote = async (ticket: string) => { - const result = await brAPI(ticket) - const company = await investidor10(ticket) - - return { ...result, ...company } -} diff --git a/src/@types/ResultsTypes.ts b/src/@types/ResultsTypes.ts index c2d2818..9ec6d64 100644 --- a/src/@types/ResultsTypes.ts +++ b/src/@types/ResultsTypes.ts @@ -1,5 +1,10 @@ import { Ticker } from "./TickersTypes" +export interface DividendHistory { + date: string + value: number +} + export interface Result{ ticker: string dy: number @@ -9,6 +14,7 @@ export interface Result{ lastDividend: number isError: boolean isLoading: boolean + dividendHistory: DividendHistory[] } export interface ResultsContextType { diff --git a/src/app/portfolios/[portfolioId]/details/components/DividendsChart/index.tsx b/src/app/portfolios/[portfolioId]/details/components/DividendsChart/index.tsx new file mode 100644 index 0000000..d3dd19c --- /dev/null +++ b/src/app/portfolios/[portfolioId]/details/components/DividendsChart/index.tsx @@ -0,0 +1,42 @@ +import { Ticker } from "@/@types/TickersTypes" +import { useResult } from "@/hooks/useResults" +import { LineChart } from "@tremor/react" +import { set } from "lodash" + +type Props = { + tickers: Ticker[] +} + +const dataFormatter = (number: number) => + `R$ ${Intl.NumberFormat('pt-BR').format(number).toString()}` + +export const DividendsChart = ({ tickers }: Props) => { + const dataTemp: any = [] + const categories = tickers.map((ticker) => ticker.ticker) + + tickers.forEach((ticker) => { + const result = useResult(ticker.ticker) + + result.dividendHistory.forEach((history) => { + set(dataTemp, [history.date, ticker.ticker], history.value) + }) + }) + + const data = Object.keys(dataTemp).map((date) => { + return { date, ...dataTemp[date] } + }) + + return ( +
+ +
+ ) +} \ No newline at end of file diff --git a/src/app/portfolios/[portfolioId]/details/page.tsx b/src/app/portfolios/[portfolioId]/details/page.tsx index 75c6349..8a7fe91 100644 --- a/src/app/portfolios/[portfolioId]/details/page.tsx +++ b/src/app/portfolios/[portfolioId]/details/page.tsx @@ -9,6 +9,8 @@ import { usePortfolios } from "@/hooks/usePortfolios" import { useTickers } from "@/hooks/useTickers" import { DetailsTable } from "@/components/details/DatailsTable" import { useData } from "@/hooks/useData" +import { DividendsChart } from "./components/DividendsChart" +import { useResult } from "@/hooks/useResults" interface AnalisesProps { params: { @@ -16,11 +18,8 @@ interface AnalisesProps { } } -// const dataFormatter = (number: number) => -// `R$ ${Intl.NumberFormat('pt-BR').format(number).toString()}` - export default function PagePortfolioDetails({ params }: AnalisesProps) { - const { data } = useData() + const { data, results } = useData() const { listByPortfolioId } = useTickers() const { getPortfolio } = usePortfolios() @@ -42,6 +41,11 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { ) } + const tickersVisibled = tickersFiltred.filter((ticker) => { + const { isError } = useResult(ticker.ticker) + return !isError && !ticker.isHidden + }) + return (
@@ -49,12 +53,13 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { {portfolio.name} - + Dividendos pagos últimos 12 meses - + +
) diff --git a/src/config.ts b/src/config.ts index 903e065..abc478d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,4 +17,10 @@ export const config = { cache: { time: 1000 * 60 * 15, // 15 minutes }, + + charts: { + colors: [ + 'blue', 'green', 'red', 'yellow', + ] + } } diff --git a/src/helpers/tickers.ts b/src/helpers/tickers.ts index 8ce33b3..f85c3af 100644 --- a/src/helpers/tickers.ts +++ b/src/helpers/tickers.ts @@ -2,10 +2,11 @@ import { brAPI } from "./brapi" import { DividendsData, Result as Response } from "@/@types/QuotesTypes" -import { Result } from "@/@types/ResultsTypes" +import { DividendHistory, Result } from "@/@types/ResultsTypes" import { round, uniqBy } from "lodash" import { Ticker } from "@/@types/TickersTypes" import { getResultByCache } from "./results" +import moment from "moment" const getPrice = (data: Response): number => { return round(data.regularMarketPrice, 2) @@ -42,15 +43,13 @@ const getLastDividend = (data: Response): number => { return round(dividends[0].rate, 2) } -export const getHistoryDividendsData = (data: DividendsData) => { +export const getDividendHistory = (data: DividendsData): DividendHistory[] => { return data.cashDividends .filter((dividend) => dividend.label === 'RENDIMENTO') .map((dividend) => { return { - ...dividend, - - // ? - // paymentDate: moment(dividend.paymentDate).format('MM/YYYY'), + date: moment(dividend.paymentDate).format('MM/YYYY'), + value: round(dividend.rate, 2), } }) .reverse() @@ -72,6 +71,7 @@ export const fetchTicker = async (ticker: string): Promise => { requestedAt, isError: true, isLoading: false, + dividendHistory: [], } } @@ -84,6 +84,7 @@ export const fetchTicker = async (ticker: string): Promise => { requestedAt, isError: false, isLoading: false, + dividendHistory: getDividendHistory(brResultAPI.dividendsData), } } diff --git a/src/hooks/useResults.ts b/src/hooks/useResults.ts index 05954ee..d3b3238 100644 --- a/src/hooks/useResults.ts +++ b/src/hooks/useResults.ts @@ -16,6 +16,7 @@ export const useResult = (ticker: string): Result => { requestedAt: 0, isError: false, isLoading: true, + dividendHistory: [], } } diff --git a/src/reducers/dataReducer.ts b/src/reducers/dataReducer.ts index 9bb69cd..3b53202 100644 --- a/src/reducers/dataReducer.ts +++ b/src/reducers/dataReducer.ts @@ -5,6 +5,12 @@ import { tickersActions } from '@/actions/tickersActions' export const dataInitialState: DataType = { tickers: [ + { + "ticker": "XPLG11", + "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", + "quantity": 0, + "isHidden": false, + }, { "ticker": "AAGR11", "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", @@ -12,13 +18,19 @@ export const dataInitialState: DataType = { "isHidden": false, }, { - "ticker": "AAZQ11", + "ticker": "XPML11", + "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", + "quantity": 0, + "isHidden": false, + }, + { + "ticker": "VISC11", "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", "quantity": 0, "isHidden": false, }, { - "ticker": "MXRF11", + "ticker": "SARE11", "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", "quantity": 0, "isHidden": false, From bb782008191db0448f30424060d3d9d57a754b6e Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Tue, 1 Aug 2023 18:19:53 -0300 Subject: [PATCH 02/46] feat: init priceHistory --- src/@types/ResultsTypes.ts | 5 ++- .../index.tsx => DividendsChart.tsx} | 0 .../details/components/PriceChart.tsx | 44 +++++++++++++++++++ .../portfolios/[portfolioId]/details/page.tsx | 6 +++ src/helpers/tickers.ts | 15 ++++++- src/hooks/useResults.ts | 1 + 6 files changed, 67 insertions(+), 4 deletions(-) rename src/app/portfolios/[portfolioId]/details/components/{DividendsChart/index.tsx => DividendsChart.tsx} (100%) create mode 100644 src/app/portfolios/[portfolioId]/details/components/PriceChart.tsx diff --git a/src/@types/ResultsTypes.ts b/src/@types/ResultsTypes.ts index 9ec6d64..ce2d308 100644 --- a/src/@types/ResultsTypes.ts +++ b/src/@types/ResultsTypes.ts @@ -1,6 +1,6 @@ import { Ticker } from "./TickersTypes" -export interface DividendHistory { +export interface History { date: string value: number } @@ -14,7 +14,8 @@ export interface Result{ lastDividend: number isError: boolean isLoading: boolean - dividendHistory: DividendHistory[] + dividendHistory: History[] + priceHistory: History[] } export interface ResultsContextType { diff --git a/src/app/portfolios/[portfolioId]/details/components/DividendsChart/index.tsx b/src/app/portfolios/[portfolioId]/details/components/DividendsChart.tsx similarity index 100% rename from src/app/portfolios/[portfolioId]/details/components/DividendsChart/index.tsx rename to src/app/portfolios/[portfolioId]/details/components/DividendsChart.tsx diff --git a/src/app/portfolios/[portfolioId]/details/components/PriceChart.tsx b/src/app/portfolios/[portfolioId]/details/components/PriceChart.tsx new file mode 100644 index 0000000..cb5f9ed --- /dev/null +++ b/src/app/portfolios/[portfolioId]/details/components/PriceChart.tsx @@ -0,0 +1,44 @@ +import { Ticker } from "@/@types/TickersTypes" +import { useResult } from "@/hooks/useResults" +import { AreaChart, LineChart } from "@tremor/react" +import { set } from "lodash" + +type Props = { + tickers: Ticker[] +} + +const dataFormatter = (number: number) => + `R$ ${Intl.NumberFormat('pt-BR').format(number).toString()}` + +export const PriceChart = ({ tickers }: Props) => { + const dataTemp: any = [] + const categories = tickers.map((ticker) => ticker.ticker) + + tickers.forEach((ticker) => { + const result = useResult(ticker.ticker) + + result.priceHistory.forEach((history) => { + set(dataTemp, [history.date, ticker.ticker], history.value) + }) + }) + + const data = Object.keys(dataTemp).map((date) => { + return { date, ...dataTemp[date] } + }) + + console.log(data); + + return ( +
+ +
+ ) +} \ No newline at end of file diff --git a/src/app/portfolios/[portfolioId]/details/page.tsx b/src/app/portfolios/[portfolioId]/details/page.tsx index 8a7fe91..a15c05f 100644 --- a/src/app/portfolios/[portfolioId]/details/page.tsx +++ b/src/app/portfolios/[portfolioId]/details/page.tsx @@ -11,6 +11,7 @@ import { DetailsTable } from "@/components/details/DatailsTable" import { useData } from "@/hooks/useData" import { DividendsChart } from "./components/DividendsChart" import { useResult } from "@/hooks/useResults" +import { PriceChart } from "./components/PriceChart" interface AnalisesProps { params: { @@ -57,6 +58,11 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { + Valorização últimos 12 meses + + + + Dividendos pagos últimos 12 meses diff --git a/src/helpers/tickers.ts b/src/helpers/tickers.ts index f85c3af..f20fbe2 100644 --- a/src/helpers/tickers.ts +++ b/src/helpers/tickers.ts @@ -2,7 +2,7 @@ import { brAPI } from "./brapi" import { DividendsData, Result as Response } from "@/@types/QuotesTypes" -import { DividendHistory, Result } from "@/@types/ResultsTypes" +import { History, Result } from "@/@types/ResultsTypes" import { round, uniqBy } from "lodash" import { Ticker } from "@/@types/TickersTypes" import { getResultByCache } from "./results" @@ -43,7 +43,7 @@ const getLastDividend = (data: Response): number => { return round(dividends[0].rate, 2) } -export const getDividendHistory = (data: DividendsData): DividendHistory[] => { +export const getDividendHistory = (data: DividendsData): History[] => { return data.cashDividends .filter((dividend) => dividend.label === 'RENDIMENTO') .map((dividend) => { @@ -55,6 +55,16 @@ export const getDividendHistory = (data: DividendsData): DividendHistory[] => { .reverse() } +export const getPriceHistory = (data: Response): History[] => { + return data.historicalDataPrice.map((history) => { + return { + date: moment.unix(history.date).format('MM/YYYY'), + value: round(history.close, 2), + } + }) + .reverse() +} + export const fetchTicker = async (ticker: string): Promise => { const brResultAPI = await brAPI(ticker) // const company = await investidor10API(ticker) @@ -85,6 +95,7 @@ export const fetchTicker = async (ticker: string): Promise => { isError: false, isLoading: false, dividendHistory: getDividendHistory(brResultAPI.dividendsData), + priceHistory: getPriceHistory(brResultAPI), } } diff --git a/src/hooks/useResults.ts b/src/hooks/useResults.ts index d3b3238..6802c96 100644 --- a/src/hooks/useResults.ts +++ b/src/hooks/useResults.ts @@ -17,6 +17,7 @@ export const useResult = (ticker: string): Result => { isError: false, isLoading: true, dividendHistory: [], + priceHistory: [], } } From ba3d3ec43ab4db1df8352020e0d1e909354a40e6 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Tue, 1 Aug 2023 19:37:27 -0300 Subject: [PATCH 03/46] refactor: components --- src/@types/DataTypes.d.ts | 2 +- src/actions/tickersActions.ts | 27 +------------------ src/app/layout.tsx | 3 ++- src/app/page.tsx | 4 +-- .../portfolios/[portfolioId]/details/page.tsx | 10 +++---- .../details/chart}/DividendsChart.tsx | 0 .../details/chart}/PriceChart.tsx | 0 .../table/{Remove.tsx => BtnRemove.tsx} | 2 +- .../{Visibility.tsx => BtnVisibility.tsx} | 2 +- src/components/details/table/Row.tsx | 12 ++++----- .../{DatailsTable.tsx => table/index.tsx} | 10 +++---- .../home/{Form => form}/SelectPortfolios.tsx | 0 .../home/{Form => form}/SelectTickers.tsx | 0 src/components/home/{Form => form}/index.tsx | 0 .../Buttons.tsx} | 4 +-- .../{Info/InfoTable.tsx => info/Cards.tsx} | 8 +++--- .../{Info/InfoHeader.tsx => info/Header.tsx} | 6 ++--- src/components/home/{Info => info}/index.tsx | 4 +-- src/helpers/tickers.ts | 3 ++- src/hooks/usePortfolios.ts | 1 - src/reducers/dataReducer.ts | 4 --- 21 files changed, 37 insertions(+), 65 deletions(-) rename src/{app/portfolios/[portfolioId]/details/components => components/details/chart}/DividendsChart.tsx (100%) rename src/{app/portfolios/[portfolioId]/details/components => components/details/chart}/PriceChart.tsx (100%) rename src/components/details/table/{Remove.tsx => BtnRemove.tsx} (90%) rename src/components/details/table/{Visibility.tsx => BtnVisibility.tsx} (89%) rename src/components/details/{DatailsTable.tsx => table/index.tsx} (86%) rename src/components/home/{Form => form}/SelectPortfolios.tsx (100%) rename src/components/home/{Form => form}/SelectTickers.tsx (100%) rename src/components/home/{Form => form}/index.tsx (100%) rename src/components/home/{Info/InfoHeaderButtons.tsx => info/Buttons.tsx} (84%) rename src/components/home/{Info/InfoTable.tsx => info/Cards.tsx} (68%) rename src/components/home/{Info/InfoHeader.tsx => info/Header.tsx} (61%) rename src/components/home/{Info => info}/index.tsx (79%) diff --git a/src/@types/DataTypes.d.ts b/src/@types/DataTypes.d.ts index 7b856f7..8d2fbc3 100644 --- a/src/@types/DataTypes.d.ts +++ b/src/@types/DataTypes.d.ts @@ -4,7 +4,7 @@ import { Ticker } from '@/@types/TickersTypes' export type ActionsFunctionsTypes = 'LOAD' | 'CLEAR' | - 'TICKERS_UPDATE' | 'TICKERS_INSERT' | 'TICKERS_REMOVE' | 'TICKERS_SET_VISIBILITY' | + 'TICKERS_INSERT' | 'TICKERS_REMOVE' | 'TICKERS_SET_VISIBILITY' | 'PORTFOLIOS_UPDATE' | 'PORTFOLIOS_INSERT' | 'PORTFOLIOS_REMOVE' export interface DataType { diff --git a/src/actions/tickersActions.ts b/src/actions/tickersActions.ts index d031938..dac46e3 100644 --- a/src/actions/tickersActions.ts +++ b/src/actions/tickersActions.ts @@ -10,20 +10,6 @@ const defaultValues: Ticker = { } export const tickersActions = { - update: (state: DataType, { ticker, portfolioId, data }: any): DataType => { - const { tickers } = state - - const newTickers = tickers.map((t) => { - if (t.ticker === ticker.ticker && t.portfolioId === ticker.portfolioId) { - return ticker - } - - return t - }) - - return { ...state, tickers: newTickers } - }, - insert: (state: DataType, { tickersList, portfoliosList }: any): DataType => { const { tickers } = state @@ -38,18 +24,7 @@ export const tickersActions = { return a.ticker === b.ticker && a.portfolioId === b.portfolioId }) - // for (const ticker of tickersFiltred) { - // try { - // ticker.data = await fetchTicker(ticker.ticker) - // }catch (error) { - // ticker.isError = true - // } - // } - - return { - ...state, - tickers: tickersFiltred - } + return { ...state, tickers: tickersFiltred } }, remove: (state: DataType, { ticker, portfolioId }: any): DataType => { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 23416cc..6bf0bba 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -9,6 +9,7 @@ import { DataProvider } from '@/providers/DataProvider' // import 'react-toastify/dist/ReactToastify.css' import '../styles/output.css' +import Loading from './loading' const inter = Inter({ weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'], @@ -29,7 +30,7 @@ export default function RootLayout({ children }: { children: ReactNode }) {
- {children} + }>{children}
{/* */} diff --git a/src/app/page.tsx b/src/app/page.tsx index b13569c..65c9242 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,5 +1,5 @@ -import { Info } from '@/components/home/Info' -import { Form } from '@/components/home/Form' +import { Info } from '@/components/home/info' +import { Form } from '@/components/home/form' export default function Home() { return ( diff --git a/src/app/portfolios/[portfolioId]/details/page.tsx b/src/app/portfolios/[portfolioId]/details/page.tsx index a15c05f..0b65be4 100644 --- a/src/app/portfolios/[portfolioId]/details/page.tsx +++ b/src/app/portfolios/[portfolioId]/details/page.tsx @@ -7,11 +7,11 @@ import { Card } from "@tremor/react" import { useEffect, useState } from "react" import { usePortfolios } from "@/hooks/usePortfolios" import { useTickers } from "@/hooks/useTickers" -import { DetailsTable } from "@/components/details/DatailsTable" +import { Table } from "@/components/details/table" import { useData } from "@/hooks/useData" -import { DividendsChart } from "./components/DividendsChart" import { useResult } from "@/hooks/useResults" -import { PriceChart } from "./components/PriceChart" +import { DividendsChart } from "@/components/details/chart/DividendsChart" +import { PriceChart } from "@/components/details/chart/PriceChart" interface AnalisesProps { params: { @@ -20,7 +20,7 @@ interface AnalisesProps { } export default function PagePortfolioDetails({ params }: AnalisesProps) { - const { data, results } = useData() + const { data } = useData() const { listByPortfolioId } = useTickers() const { getPortfolio } = usePortfolios() @@ -55,7 +55,7 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { - + Valorização últimos 12 meses diff --git a/src/app/portfolios/[portfolioId]/details/components/DividendsChart.tsx b/src/components/details/chart/DividendsChart.tsx similarity index 100% rename from src/app/portfolios/[portfolioId]/details/components/DividendsChart.tsx rename to src/components/details/chart/DividendsChart.tsx diff --git a/src/app/portfolios/[portfolioId]/details/components/PriceChart.tsx b/src/components/details/chart/PriceChart.tsx similarity index 100% rename from src/app/portfolios/[portfolioId]/details/components/PriceChart.tsx rename to src/components/details/chart/PriceChart.tsx diff --git a/src/components/details/table/Remove.tsx b/src/components/details/table/BtnRemove.tsx similarity index 90% rename from src/components/details/table/Remove.tsx rename to src/components/details/table/BtnRemove.tsx index 7a600c8..c61fed1 100644 --- a/src/components/details/table/Remove.tsx +++ b/src/components/details/table/BtnRemove.tsx @@ -9,7 +9,7 @@ type Props = { ticker: Ticker, } -export function Remove({ ticker }: Props) { +export function BtnRemove({ ticker }: Props) { const { removeTicker } = useTickers() return ( diff --git a/src/components/details/table/Visibility.tsx b/src/components/details/table/BtnVisibility.tsx similarity index 89% rename from src/components/details/table/Visibility.tsx rename to src/components/details/table/BtnVisibility.tsx index 7d2fa7c..63d3a72 100644 --- a/src/components/details/table/Visibility.tsx +++ b/src/components/details/table/BtnVisibility.tsx @@ -10,7 +10,7 @@ type Props = { isDisabled?: boolean, } -export function Visibility({ ticker, isDisabled = false}: Props) { +export function BtnVisibility({ ticker, isDisabled = false}: Props) { const { setVisibility } = useTickers() const icon = isDisabled || ticker.isHidden ? EyeSlash : Eye diff --git a/src/components/details/table/Row.tsx b/src/components/details/table/Row.tsx index 10d0505..15df556 100644 --- a/src/components/details/table/Row.tsx +++ b/src/components/details/table/Row.tsx @@ -2,9 +2,9 @@ import { TableCell, TableRow } from '@tremor/react' import { Ticker } from '@/@types/TickersTypes' -import { Remove } from './Remove' +import { BtnRemove } from './BtnRemove' import { useResult } from '@/hooks/useResults' -import { Visibility } from './Visibility' +import { BtnVisibility } from './BtnVisibility' type Props = { ticker: Ticker, @@ -22,8 +22,8 @@ export function Row({ ticker }: Props) { -- - - + + ) @@ -38,8 +38,8 @@ export function Row({ ticker }: Props) { {lastDividend} - - + + ) diff --git a/src/components/details/DatailsTable.tsx b/src/components/details/table/index.tsx similarity index 86% rename from src/components/details/DatailsTable.tsx rename to src/components/details/table/index.tsx index e67deba..41fe287 100644 --- a/src/components/details/DatailsTable.tsx +++ b/src/components/details/table/index.tsx @@ -1,20 +1,20 @@ import { Ticker } from '@/@types/TickersTypes' import { - Table, + Table as TableReact, TableBody, TableHead, TableHeaderCell, TableRow, } from '@tremor/react' -import { Row } from './table/Row' +import { Row } from './Row' type Props = { tickers: Ticker[] } -export function DetailsTable({ tickers }: Props) { +export function Table({ tickers }: Props) { return ( -
+ Papel @@ -30,6 +30,6 @@ export function DetailsTable({ tickers }: Props) { ))} -
+ ) } diff --git a/src/components/home/Form/SelectPortfolios.tsx b/src/components/home/form/SelectPortfolios.tsx similarity index 100% rename from src/components/home/Form/SelectPortfolios.tsx rename to src/components/home/form/SelectPortfolios.tsx diff --git a/src/components/home/Form/SelectTickers.tsx b/src/components/home/form/SelectTickers.tsx similarity index 100% rename from src/components/home/Form/SelectTickers.tsx rename to src/components/home/form/SelectTickers.tsx diff --git a/src/components/home/Form/index.tsx b/src/components/home/form/index.tsx similarity index 100% rename from src/components/home/Form/index.tsx rename to src/components/home/form/index.tsx diff --git a/src/components/home/Info/InfoHeaderButtons.tsx b/src/components/home/info/Buttons.tsx similarity index 84% rename from src/components/home/Info/InfoHeaderButtons.tsx rename to src/components/home/info/Buttons.tsx index 3ea840b..75702d8 100644 --- a/src/components/home/Info/InfoHeaderButtons.tsx +++ b/src/components/home/info/Buttons.tsx @@ -1,14 +1,14 @@ 'use client' -import { Button, Icon } from "@tremor/react" import { PencilSimple, ChartLineUp } from '@phosphor-icons/react' +import { Icon } from "@tremor/react" import Link from "next/link" type Props = { portfolioId: string } -export function InfoHeaderButtons({ portfolioId }: Props) { +export function Buttons({ portfolioId }: Props) { return (
diff --git a/src/components/home/Info/InfoTable.tsx b/src/components/home/info/Cards.tsx similarity index 68% rename from src/components/home/Info/InfoTable.tsx rename to src/components/home/info/Cards.tsx index f41afa9..93f4cdf 100644 --- a/src/components/home/Info/InfoTable.tsx +++ b/src/components/home/info/Cards.tsx @@ -4,21 +4,21 @@ import { Card } from '@tremor/react' import { useTickers } from '@/hooks/useTickers' import { TableTickers } from '@/components/TableTickers' -import { InfoHeader } from './InfoHeader' +import { Header } from './Header' type Props = { portfolioId: string portfolioName: string } -export function InfoTable({ portfolioId, portfolioName }: Props) { +export function Cards({ portfolioId, portfolioName }: Props) { const { listByPortfolioId } = useTickers() const tickers = listByPortfolioId(portfolioId) if (!tickers.length) { return ( - +

Sem ativos nesta carteira

) @@ -26,7 +26,7 @@ export function InfoTable({ portfolioId, portfolioName }: Props) { return ( - +
) diff --git a/src/components/home/Info/InfoHeader.tsx b/src/components/home/info/Header.tsx similarity index 61% rename from src/components/home/Info/InfoHeader.tsx rename to src/components/home/info/Header.tsx index d55098b..8db3949 100644 --- a/src/components/home/Info/InfoHeader.tsx +++ b/src/components/home/info/Header.tsx @@ -1,18 +1,18 @@ 'use client' import { Title } from "@tremor/react" -import { InfoHeaderButtons } from "./InfoHeaderButtons" +import { Buttons } from "./Buttons" type Props = { portfolioId: string portfolioName: string } -export function InfoHeader({ portfolioId, portfolioName }: Props) { +export function Header({ portfolioId, portfolioName }: Props) { return (
{portfolioName} - +
) } \ No newline at end of file diff --git a/src/components/home/Info/index.tsx b/src/components/home/info/index.tsx similarity index 79% rename from src/components/home/Info/index.tsx rename to src/components/home/info/index.tsx index 2915cbb..f5e277f 100644 --- a/src/components/home/Info/index.tsx +++ b/src/components/home/info/index.tsx @@ -1,7 +1,7 @@ 'use client' import { usePortfolios } from '@/hooks/usePortfolios' -import { InfoTable } from './InfoTable' +import { Cards } from './Cards' import { Title } from '@tremor/react' export function Info() { @@ -13,7 +13,7 @@ export function Info() {
{listPortfolios().map((g) => ( - + ))}
diff --git a/src/helpers/tickers.ts b/src/helpers/tickers.ts index f20fbe2..cf9be3e 100644 --- a/src/helpers/tickers.ts +++ b/src/helpers/tickers.ts @@ -24,7 +24,7 @@ const getPVP = (data: Response): number => { // return round(regularMarketPrice / (valuePatrimonial / totalCotas), 2) - return 1 + return 0 } const getDY = (data: Response): number => { @@ -82,6 +82,7 @@ export const fetchTicker = async (ticker: string): Promise => { isError: true, isLoading: false, dividendHistory: [], + priceHistory: [], } } diff --git a/src/hooks/usePortfolios.ts b/src/hooks/usePortfolios.ts index 0667370..2356fcc 100644 --- a/src/hooks/usePortfolios.ts +++ b/src/hooks/usePortfolios.ts @@ -16,6 +16,5 @@ export const usePortfolios = () => { return data.portfolios[index] } - } } \ No newline at end of file diff --git a/src/reducers/dataReducer.ts b/src/reducers/dataReducer.ts index 3b53202..8ff22d0 100644 --- a/src/reducers/dataReducer.ts +++ b/src/reducers/dataReducer.ts @@ -67,10 +67,6 @@ export const dataReducer = (state: DataType, action: ActionsType): DataType => { return tickersActions.insert(state, action.payload) } - case 'TICKERS_UPDATE': { - return tickersActions.update(state, action.payload) - } - case 'TICKERS_REMOVE': { return tickersActions.remove(state, action.payload) } From ec9ccd86033664a4dace76d4745d77554f75068c Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Tue, 1 Aug 2023 20:10:02 -0300 Subject: [PATCH 04/46] feat: add toCurrency helper --- src/app/portfolios/[portfolioId]/details/page.tsx | 10 +++++----- src/components/TableTickersRow.tsx | 8 ++++---- src/components/details/chart/DividendsChart.tsx | 8 +++----- src/components/details/chart/PriceChart.tsx | 10 ++++------ src/components/details/table/Row.tsx | 7 ++++--- src/helpers/currency.ts | 8 ++++++++ 6 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 src/helpers/currency.ts diff --git a/src/app/portfolios/[portfolioId]/details/page.tsx b/src/app/portfolios/[portfolioId]/details/page.tsx index 0b65be4..ac4b216 100644 --- a/src/app/portfolios/[portfolioId]/details/page.tsx +++ b/src/app/portfolios/[portfolioId]/details/page.tsx @@ -20,16 +20,16 @@ interface AnalisesProps { } export default function PagePortfolioDetails({ params }: AnalisesProps) { + const [portfolio, setPortfolio] = useState(false) + const [tickersFiltred, setTickersFiltred] = useState([]) + const { data } = useData() const { listByPortfolioId } = useTickers() const { getPortfolio } = usePortfolios() - const [portfolio, setPortfolio] = useState(false) - const [tickersFiltred, setTickersFiltred] = useState([]) - useEffect(() => { setPortfolio(getPortfolio(params.portfolioId)) - setTickersFiltred(listByPortfolioId(params.portfolioId)) + // setTickersFiltred(listByPortfolioId(params.portfolioId)) }, []) useEffect(() => { @@ -43,7 +43,7 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { } const tickersVisibled = tickersFiltred.filter((ticker) => { - const { isError } = useResult(ticker.ticker) + const isError = false return !isError && !ticker.isHidden }) diff --git a/src/components/TableTickersRow.tsx b/src/components/TableTickersRow.tsx index 023931d..c414e9c 100644 --- a/src/components/TableTickersRow.tsx +++ b/src/components/TableTickersRow.tsx @@ -1,6 +1,7 @@ 'use client' import { Ticker } from '@/@types/TickersTypes' +import { toCurrency } from '@/helpers/currency' import { useResult } from '@/hooks/useResults' import { TableCell, TableRow } from '@tremor/react' @@ -9,7 +10,6 @@ type Props = { } export function TableTickersRow({ ticker }: Props) { - const { dy, isError, isLoading, lastDividend, price } = useResult(ticker.ticker) if (isError || isLoading) { @@ -27,10 +27,10 @@ export function TableTickersRow({ ticker }: Props) { return ( {ticker.ticker} - {price} + {toCurrency(price)} - - {dy} - {lastDividend} + {toCurrency(dy)} + {toCurrency(lastDividend)} ) } diff --git a/src/components/details/chart/DividendsChart.tsx b/src/components/details/chart/DividendsChart.tsx index d3dd19c..0af1e80 100644 --- a/src/components/details/chart/DividendsChart.tsx +++ b/src/components/details/chart/DividendsChart.tsx @@ -1,4 +1,5 @@ import { Ticker } from "@/@types/TickersTypes" +import { toCurrency } from "@/helpers/currency" import { useResult } from "@/hooks/useResults" import { LineChart } from "@tremor/react" import { set } from "lodash" @@ -7,9 +8,6 @@ type Props = { tickers: Ticker[] } -const dataFormatter = (number: number) => - `R$ ${Intl.NumberFormat('pt-BR').format(number).toString()}` - export const DividendsChart = ({ tickers }: Props) => { const dataTemp: any = [] const categories = tickers.map((ticker) => ticker.ticker) @@ -34,8 +32,8 @@ export const DividendsChart = ({ tickers }: Props) => { index="date" categories={categories} colors={['blue', 'green', 'red', 'yellow', 'purple', 'orange', "indigo", "orange"]} - valueFormatter={dataFormatter} - yAxisWidth={60} + valueFormatter={toCurrency} + yAxisWidth={80} />
) diff --git a/src/components/details/chart/PriceChart.tsx b/src/components/details/chart/PriceChart.tsx index cb5f9ed..232af39 100644 --- a/src/components/details/chart/PriceChart.tsx +++ b/src/components/details/chart/PriceChart.tsx @@ -1,15 +1,13 @@ import { Ticker } from "@/@types/TickersTypes" +import { toCurrency } from "@/helpers/currency" import { useResult } from "@/hooks/useResults" -import { AreaChart, LineChart } from "@tremor/react" +import { AreaChart } from "@tremor/react" import { set } from "lodash" type Props = { tickers: Ticker[] } -const dataFormatter = (number: number) => - `R$ ${Intl.NumberFormat('pt-BR').format(number).toString()}` - export const PriceChart = ({ tickers }: Props) => { const dataTemp: any = [] const categories = tickers.map((ticker) => ticker.ticker) @@ -36,8 +34,8 @@ export const PriceChart = ({ tickers }: Props) => { index="date" categories={categories} colors={['blue', 'green', 'red', 'yellow', 'purple', 'orange', "indigo", "orange"]} - valueFormatter={dataFormatter} - yAxisWidth={60} + valueFormatter={toCurrency} + yAxisWidth={80} /> ) diff --git a/src/components/details/table/Row.tsx b/src/components/details/table/Row.tsx index 15df556..cb72f3b 100644 --- a/src/components/details/table/Row.tsx +++ b/src/components/details/table/Row.tsx @@ -5,6 +5,7 @@ import { Ticker } from '@/@types/TickersTypes' import { BtnRemove } from './BtnRemove' import { useResult } from '@/hooks/useResults' import { BtnVisibility } from './BtnVisibility' +import { toCurrency } from '@/helpers/currency' type Props = { ticker: Ticker, @@ -32,10 +33,10 @@ export function Row({ ticker }: Props) { return ( {ticker.ticker} - {price} + {toCurrency(price)} - - {dy} - {lastDividend} + {toCurrency(dy)} + {toCurrency(lastDividend)} diff --git a/src/helpers/currency.ts b/src/helpers/currency.ts new file mode 100644 index 0000000..d7180e7 --- /dev/null +++ b/src/helpers/currency.ts @@ -0,0 +1,8 @@ + +export const toCurrency = (number: number) => { + return `R$ ${Intl.NumberFormat('pt-BR', { + currency: 'BRL', + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(number).toString()}` +} From 15ba1fa99f26b03c48c9d726fd5cec9eea571abf Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 5 Aug 2023 15:56:27 -0300 Subject: [PATCH 05/46] refactor: organize components --- src/@types/ResultsTypes.ts | 2 + .../portfolios/[portfolioId]/details/page.tsx | 27 +++-------- src/components/details/chart/CardChart.tsx | 47 +++++++++++++++++++ .../details/chart/DividendsChart.tsx | 6 --- src/components/details/chart/PriceChart.tsx | 1 - src/components/details/table/Row.tsx | 5 +- src/helpers/tickers.ts | 44 ++++++++++------- src/hooks/useChart.ts | 34 ++++++++++++++ src/hooks/useResults.ts | 41 +++++++++------- 9 files changed, 144 insertions(+), 63 deletions(-) create mode 100644 src/components/details/chart/CardChart.tsx create mode 100644 src/hooks/useChart.ts diff --git a/src/@types/ResultsTypes.ts b/src/@types/ResultsTypes.ts index ce2d308..954e76d 100644 --- a/src/@types/ResultsTypes.ts +++ b/src/@types/ResultsTypes.ts @@ -1,8 +1,10 @@ import { Ticker } from "./TickersTypes" export interface History { + ticker: string date: string value: number + timestamp: number } export interface Result{ diff --git a/src/app/portfolios/[portfolioId]/details/page.tsx b/src/app/portfolios/[portfolioId]/details/page.tsx index ac4b216..fc92276 100644 --- a/src/app/portfolios/[portfolioId]/details/page.tsx +++ b/src/app/portfolios/[portfolioId]/details/page.tsx @@ -9,9 +9,8 @@ import { usePortfolios } from "@/hooks/usePortfolios" import { useTickers } from "@/hooks/useTickers" import { Table } from "@/components/details/table" import { useData } from "@/hooks/useData" -import { useResult } from "@/hooks/useResults" -import { DividendsChart } from "@/components/details/chart/DividendsChart" -import { PriceChart } from "@/components/details/chart/PriceChart" +import { CardChart } from "@/components/details/chart/CardChart" +import Loading from "@/app/loading" interface AnalisesProps { params: { @@ -29,7 +28,7 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { useEffect(() => { setPortfolio(getPortfolio(params.portfolioId)) - // setTickersFiltred(listByPortfolioId(params.portfolioId)) + setTickersFiltred(listByPortfolioId(params.portfolioId)) }, []) useEffect(() => { @@ -38,15 +37,10 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { if (!portfolio) { return ( - Loading... + ) } - const tickersVisibled = tickersFiltred.filter((ticker) => { - const isError = false - return !isError && !ticker.isHidden - }) - return (
@@ -54,19 +48,12 @@ export default function PagePortfolioDetails({ params }: AnalisesProps) { {portfolio.name} - + - Valorização últimos 12 meses - - - - - Dividendos pagos últimos 12 meses - - - + + ) } diff --git a/src/components/details/chart/CardChart.tsx b/src/components/details/chart/CardChart.tsx new file mode 100644 index 0000000..89629f5 --- /dev/null +++ b/src/components/details/chart/CardChart.tsx @@ -0,0 +1,47 @@ +import { Ticker } from "@/@types/TickersTypes" +import { PageTitle } from "@/components/PageTitle" +import { toCurrency } from "@/helpers/currency" +import { useChart } from "@/hooks/useChart" +import { AreaChart, AreaChartProps, BarChart, Card, LineChart } from "@tremor/react" +import { useState } from "react" + +type ChartType = 'area' | 'line' | 'bar' +type HistoryType = 'priceHistory' | 'dividendHistory' + +type Props = { + tickers: Ticker[] + title: string + history: HistoryType +} + +export const CardChart = ({ tickers, title, history }: Props) => { + const [chart, setChart] = useState('area') + const { getCategories, getHistory } = useChart(tickers) + + console.log(11111, getHistory(history)) + + const chartOptions: AreaChartProps = { + data: getHistory(history), + categories: getCategories(), + index: 'date', + yAxisWidth: 80, + className: 'mt-6', + valueFormatter: toCurrency, + colors: [ + 'blue', 'green', 'red', 'yellow', + 'purple', 'orange', "indigo", "orange" + ], + } + + return ( + <> + {title} + + {chart === 'area' && ()} + {chart === 'line' && ()} + {chart === 'bar' && ()} + + + + ) +} \ No newline at end of file diff --git a/src/components/details/chart/DividendsChart.tsx b/src/components/details/chart/DividendsChart.tsx index 0af1e80..7f7f28d 100644 --- a/src/components/details/chart/DividendsChart.tsx +++ b/src/components/details/chart/DividendsChart.tsx @@ -12,13 +12,7 @@ export const DividendsChart = ({ tickers }: Props) => { const dataTemp: any = [] const categories = tickers.map((ticker) => ticker.ticker) - tickers.forEach((ticker) => { - const result = useResult(ticker.ticker) - result.dividendHistory.forEach((history) => { - set(dataTemp, [history.date, ticker.ticker], history.value) - }) - }) const data = Object.keys(dataTemp).map((date) => { return { date, ...dataTemp[date] } diff --git a/src/components/details/chart/PriceChart.tsx b/src/components/details/chart/PriceChart.tsx index 232af39..e7a26c2 100644 --- a/src/components/details/chart/PriceChart.tsx +++ b/src/components/details/chart/PriceChart.tsx @@ -24,7 +24,6 @@ export const PriceChart = ({ tickers }: Props) => { return { date, ...dataTemp[date] } }) - console.log(data); return (
diff --git a/src/components/details/table/Row.tsx b/src/components/details/table/Row.tsx index cb72f3b..b9b8bd9 100644 --- a/src/components/details/table/Row.tsx +++ b/src/components/details/table/Row.tsx @@ -3,7 +3,7 @@ import { TableCell, TableRow } from '@tremor/react' import { Ticker } from '@/@types/TickersTypes' import { BtnRemove } from './BtnRemove' -import { useResult } from '@/hooks/useResults' +import { useResults } from '@/hooks/useResults' import { BtnVisibility } from './BtnVisibility' import { toCurrency } from '@/helpers/currency' @@ -12,7 +12,8 @@ type Props = { } export function Row({ ticker }: Props) { - const { dy, isError, isLoading, lastDividend, price } = useResult(ticker.ticker) + const { getTickerResult } = useResults() + const { dy, isError, isLoading, lastDividend, price } = getTickerResult(ticker.ticker) if (isError || isLoading) { return ( diff --git a/src/helpers/tickers.ts b/src/helpers/tickers.ts index cf9be3e..4153b82 100644 --- a/src/helpers/tickers.ts +++ b/src/helpers/tickers.ts @@ -3,7 +3,7 @@ import { brAPI } from "./brapi" import { DividendsData, Result as Response } from "@/@types/QuotesTypes" import { History, Result } from "@/@types/ResultsTypes" -import { round, uniqBy } from "lodash" +import { round, sortBy, uniqBy } from "lodash" import { Ticker } from "@/@types/TickersTypes" import { getResultByCache } from "./results" import moment from "moment" @@ -43,26 +43,39 @@ const getLastDividend = (data: Response): number => { return round(dividends[0].rate, 2) } -export const getDividendHistory = (data: DividendsData): History[] => { - return data.cashDividends +export const getDividendHistory = (ticker: string, data: DividendsData): History[] => { + const histories = data.cashDividends .filter((dividend) => dividend.label === 'RENDIMENTO') .map((dividend) => { + const date = moment(dividend.paymentDate) return { - date: moment(dividend.paymentDate).format('MM/YYYY'), + ticker, + timestamp: date.unix(), + date: date.format('MM/YYYY'), value: round(dividend.rate, 2), } }) - .reverse() + + console.log('dividend', sortBy(histories, 'timestamp')) + + + return sortBy(histories, 'timestamp') } -export const getPriceHistory = (data: Response): History[] => { - return data.historicalDataPrice.map((history) => { - return { - date: moment.unix(history.date).format('MM/YYYY'), - value: round(history.close, 2), - } - }) - .reverse() +export const getPriceHistory = (ticker: string, data: Response): History[] => { + const histories = data.historicalDataPrice.map((history) => { + const date = moment.unix(history.date) + return { + ticker, + timestamp: date.unix(), + date: date.format('MM/YYYY'), + value: round(history.close, 2), + } + }) + + console.log('price', sortBy(histories, 'timestamp')) + + return sortBy(histories, 'timestamp') } export const fetchTicker = async (ticker: string): Promise => { @@ -95,8 +108,8 @@ export const fetchTicker = async (ticker: string): Promise => { requestedAt, isError: false, isLoading: false, - dividendHistory: getDividendHistory(brResultAPI.dividendsData), - priceHistory: getPriceHistory(brResultAPI), + dividendHistory: getDividendHistory(ticker, brResultAPI.dividendsData), + priceHistory: getPriceHistory(ticker, brResultAPI), } } @@ -109,7 +122,6 @@ export const getAllResults = async (tickers: Ticker[], results: Result[]): Promi const result = getResultByCache(ticker.ticker, results) if (result) { - console.log(ticker.ticker, 'from cache'); return result } diff --git a/src/hooks/useChart.ts b/src/hooks/useChart.ts new file mode 100644 index 0000000..6540338 --- /dev/null +++ b/src/hooks/useChart.ts @@ -0,0 +1,34 @@ +import { Ticker } from "@/@types/TickersTypes"; +import { useResults } from "./useResults"; +import { set } from "lodash"; + +type HistoryType = 'priceHistory' | 'dividendHistory' + +export const useChart = (tickers: Ticker[]) => { + const { getTickerResult } = useResults() + + const tickersVisibled = tickers.filter((ticker) => { + const { isError } = getTickerResult(ticker.ticker) + return !isError && !ticker.isHidden + }) + + return { + getCategories: () => tickersVisibled.map((ticker) => ticker.ticker), + + getHistory: (type: HistoryType) => { + const dataTemp: any = [] + + tickers.forEach((ticker) => { + const result = getTickerResult(ticker.ticker) + + result[type].forEach((history) => { + set(dataTemp, [history.date, ticker.ticker], history.value) + }) + }) + + return Object.keys(dataTemp).map((date) => { + return { date, ...dataTemp[date] } + }) + } + } +} diff --git a/src/hooks/useResults.ts b/src/hooks/useResults.ts index 6802c96..df0e447 100644 --- a/src/hooks/useResults.ts +++ b/src/hooks/useResults.ts @@ -1,25 +1,30 @@ import { Result } from "@/@types/ResultsTypes"; import { useData } from "./useData"; -export const useResult = (ticker: string): Result => { +export const useResults = () => { const { results } = useData() - const result = results.find((r) => r.ticker === ticker) - - if(!result) { - return { - ticker, - dy: 0, - pvp: 0, - price: 0, - lastDividend: 0, - requestedAt: 0, - isError: false, - isLoading: true, - dividendHistory: [], - priceHistory: [], + return { + getPriceHistory: () => {}, + getTickerResult: (ticker: string): Result => { + const result = results.find((r) => r.ticker === ticker) + + if(!result) { + return { + ticker, + dy: 0, + pvp: 0, + price: 0, + lastDividend: 0, + requestedAt: 0, + isError: false, + isLoading: true, + dividendHistory: [], + priceHistory: [], + } + } + + return result } } - - return result -} \ No newline at end of file +} From d5b463dec1eccc2784ec20ea186ed751c12b3c47 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 5 Aug 2023 16:16:08 -0300 Subject: [PATCH 06/46] refactor app --- .old/Card.tsx | 32 ----------------------- .old/fiis/[ticket]/page.tsx | 46 ---------------------------------- .old/getPVP.ts | 15 ----------- .old/selic/page.tsx | 19 -------------- src/app/layout.tsx | 3 --- src/providers/DataProvider.tsx | 3 --- 6 files changed, 118 deletions(-) delete mode 100644 .old/Card.tsx delete mode 100644 .old/fiis/[ticket]/page.tsx delete mode 100644 .old/getPVP.ts delete mode 100644 .old/selic/page.tsx diff --git a/.old/Card.tsx b/.old/Card.tsx deleted file mode 100644 index 408b8db..0000000 --- a/.old/Card.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Card as CardComponent, Metric, Text } from '@tremor/react' - -interface Props { - title: string - type: 'percent' | 'currency' | 'number' - value: number -} - -export function Card({ title, type, value }: Props) { - let valueText = '' - - switch (type) { - case 'currency': - valueText = `R$ ${value}` - break - - case 'percent': - valueText = `${value}%` - break - - case 'number': - valueText = `${value}` - break - } - - return ( - - {title} - {valueText} - - ) -} diff --git a/.old/fiis/[ticket]/page.tsx b/.old/fiis/[ticket]/page.tsx deleted file mode 100644 index 364a4c0..0000000 --- a/.old/fiis/[ticket]/page.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { HistoryChart } from '@/components/HistoryChart' -import { getQuote } from '@/helpers/getQuote' -import { Card } from '@/components/Card' -import { getPVP } from '@/helpers/getPVP' -import { getDY } from '@/helpers/getDY' -import { getLastDY } from '@/helpers/getLastDY' - -interface AnalisesProps { - params: { - ticket: string - } -} - -export default async function PageFiis({ params }: AnalisesProps) { - const data = await getQuote(params.ticket) - - const pvp = getPVP( - data.valuePatrimonial, - data.totalCotas, - data.regularMarketPrice, - ) - - const dy = getDY(data.dividendsData, data.regularMarketPrice) - const lastDy = getLastDY(data.dividendsData) - const volume = data.averageDailyVolume10Day - - return ( - <> -

{data.symbol}

-

{data.longName}

- -
- - - - - -
- - - {/* */} - - {/*
{JSON.stringify(data, null, 2)}
*/} - - ) -} diff --git a/.old/getPVP.ts b/.old/getPVP.ts deleted file mode 100644 index 18ac1ac..0000000 --- a/.old/getPVP.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { round } from 'lodash' - -export const getPVP = ( - valuePatrimonial: number, - totalCotas: number, - regularMarketPrice: number, -) => { - if (totalCotas === 0) { - throw new Error('Não foi possível calcular o PVP!') - } - - console.log(valuePatrimonial, regularMarketPrice) - - return round(regularMarketPrice / (valuePatrimonial / totalCotas), 2) -} diff --git a/.old/selic/page.tsx b/.old/selic/page.tsx deleted file mode 100644 index 67eac2c..0000000 --- a/.old/selic/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { config } from '@/config' - -export default async function PageSelic() { - const response = await fetch( - `${config.api.host}/api/v2/prime-rate?country=brazil&historical=true&start=01%2F01%2F2022&end=31%2F12%2F2023&sortBy=date&sortOrder=desc`, - { - cache: 'no-store', - }, - ) - - const selic = await response.json() - - return ( - <> -

Selic

-
{JSON.stringify(selic, null, 2)}
- - ) -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6bf0bba..3a31bab 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,4 @@ import { ReactNode, Suspense } from 'react' -// import { ToastContainer } from 'react-toastify' import { Inter } from 'next/font/google' import { config } from '@/config' @@ -7,7 +6,6 @@ import { Header } from '@/components/layout/Header' import { Main } from '@/components/layout/Main' import { DataProvider } from '@/providers/DataProvider' -// import 'react-toastify/dist/ReactToastify.css' import '../styles/output.css' import Loading from './loading' @@ -32,7 +30,6 @@ export default function RootLayout({ children }: { children: ReactNode }) {
}>{children}
- {/* */} diff --git a/src/providers/DataProvider.tsx b/src/providers/DataProvider.tsx index a92b696..1630577 100644 --- a/src/providers/DataProvider.tsx +++ b/src/providers/DataProvider.tsx @@ -12,7 +12,6 @@ export const DataContext = createContext({}) export function DataProvider({ children }: { children: ReactNode }) { const [data, dispatchReducerData] = useReducer(dataReducer, dataInitialState); const [results, setResult] = useState([]) - const { save } = storageActions const dispatch = (action: ActionsType) => { console.log('dispatch', action); @@ -27,8 +26,6 @@ export function DataProvider({ children }: { children: ReactNode }) { getAllResults(data.tickers, results).then((results) => { setResult(results) }) - - save(data) }, [data]) return ( From 2c3371120551a09ae3fa1395467d5c7544e26ab0 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Thu, 10 Aug 2023 21:57:32 -0300 Subject: [PATCH 07/46] refactor: change full app --- .gitignore | 1 + src/@types/ContextTypes.d.ts | 19 ++ src/@types/DataTypes.d.ts | 24 --- src/@types/PortfoliosTypes.d.ts | 14 -- src/@types/QuotesTypes.d.ts | 90 --------- src/@types/ResultsTypes.ts | 27 --- src/@types/TickersTypes.d.ts | 33 ++- src/actions/portfoliosActions.ts | 46 ++--- src/actions/storageActions.ts | 28 --- src/actions/tickersActions.ts | 46 ++--- src/app/layout.tsx | 2 +- .../portfolios/[portfolioId]/details/page.tsx | 59 ------ src/components/PageTitle.tsx | 12 -- src/components/TableTickers.tsx | 38 ---- src/components/TableTickersRow.tsx | 36 ---- src/components/common/Title.tsx | 12 ++ src/components/details/chart/CardChart.tsx | 47 ----- .../details/chart/DividendsChart.tsx | 34 ---- src/components/details/chart/PriceChart.tsx | 41 ---- src/components/details/table/Row.tsx | 48 ----- src/components/home/form/index.tsx | 2 - src/components/home/info/Buttons.tsx | 6 +- src/components/home/info/Cards.tsx | 4 +- src/components/home/info/index.tsx | 4 +- .../{details => home}/table/BtnRemove.tsx | 5 +- .../{details => home}/table/BtnVisibility.tsx | 15 +- src/components/home/table/Cell.tsx | 16 ++ src/components/home/table/Row.tsx | 60 ++++++ .../table/index.tsx => home/table/Table.tsx} | 19 +- src/components/home/table/index.tsx | 5 + src/config.ts | 13 +- src/helpers/TickerFetchAPI.ts | 191 ++++++++++++++++++ src/helpers/brapi.ts | 25 --- src/helpers/investidor10.ts | 46 ----- src/helpers/results.ts | 17 -- src/helpers/storage.ts | 27 +++ src/helpers/tickers.ts | 139 ------------- src/hooks/useChart.ts | 34 ---- src/hooks/useData.ts | 2 +- src/hooks/usePortfolios.ts | 8 +- src/hooks/useResults.ts | 30 --- src/hooks/useTickerFetch.ts | 44 ++++ src/hooks/useTickers.ts | 29 +-- src/providers/DataProvider.tsx | 36 ++-- src/reducers/dataReducer.ts | 79 -------- src/reducers/portfoliosReducer.ts | 20 ++ src/reducers/tickersReducer.ts | 23 +++ src/storage/portfoliosInitialState.ts | 5 + src/storage/tickersInitialState.ts | 10 + tsconfig.json | 2 +- 50 files changed, 546 insertions(+), 1027 deletions(-) create mode 100644 src/@types/ContextTypes.d.ts delete mode 100644 src/@types/DataTypes.d.ts delete mode 100644 src/@types/QuotesTypes.d.ts delete mode 100644 src/@types/ResultsTypes.ts delete mode 100644 src/actions/storageActions.ts delete mode 100644 src/app/portfolios/[portfolioId]/details/page.tsx delete mode 100644 src/components/PageTitle.tsx delete mode 100644 src/components/TableTickers.tsx delete mode 100644 src/components/TableTickersRow.tsx create mode 100644 src/components/common/Title.tsx delete mode 100644 src/components/details/chart/CardChart.tsx delete mode 100644 src/components/details/chart/DividendsChart.tsx delete mode 100644 src/components/details/chart/PriceChart.tsx delete mode 100644 src/components/details/table/Row.tsx rename src/components/{details => home}/table/BtnRemove.tsx (62%) rename src/components/{details => home}/table/BtnVisibility.tsx (52%) create mode 100644 src/components/home/table/Cell.tsx create mode 100644 src/components/home/table/Row.tsx rename src/components/{details/table/index.tsx => home/table/Table.tsx} (66%) create mode 100644 src/components/home/table/index.tsx create mode 100644 src/helpers/TickerFetchAPI.ts delete mode 100644 src/helpers/brapi.ts delete mode 100644 src/helpers/investidor10.ts delete mode 100644 src/helpers/results.ts create mode 100644 src/helpers/storage.ts delete mode 100644 src/helpers/tickers.ts delete mode 100644 src/hooks/useChart.ts delete mode 100644 src/hooks/useResults.ts create mode 100644 src/hooks/useTickerFetch.ts delete mode 100644 src/reducers/dataReducer.ts create mode 100644 src/reducers/portfoliosReducer.ts create mode 100644 src/reducers/tickersReducer.ts create mode 100644 src/storage/portfoliosInitialState.ts create mode 100644 src/storage/tickersInitialState.ts diff --git a/.gitignore b/.gitignore index c87c9b3..ed854fa 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + diff --git a/src/@types/ContextTypes.d.ts b/src/@types/ContextTypes.d.ts new file mode 100644 index 0000000..d960a01 --- /dev/null +++ b/src/@types/ContextTypes.d.ts @@ -0,0 +1,19 @@ +import { Portfolio } from '@/@types/PortfoliosTypes' +import { Ticker } from '@/@types/TickersTypes' + +export interface TickerActionType { + type: 'INSERT' | 'REMOVE' | 'SET_VISIBILITY' + payload?: any +} + +export interface PortfolioActionType { + type: 'INSERT' | 'UPDATE' | 'REMOVE' + payload?: any +} + +export interface DataContextType { + tickers: Ticker[] + portfolios: Portfolio[] + dispatchTickers: React.Dispatch + dispatchPortfolios: React.Dispatch +} diff --git a/src/@types/DataTypes.d.ts b/src/@types/DataTypes.d.ts deleted file mode 100644 index 8d2fbc3..0000000 --- a/src/@types/DataTypes.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Portfolio } from '@/@types/PortfoliosTypes' -import { Result } from '@/@types/ResultsTypes' -import { Ticker } from '@/@types/TickersTypes' - -export type ActionsFunctionsTypes = - 'LOAD' | 'CLEAR' | - 'TICKERS_INSERT' | 'TICKERS_REMOVE' | 'TICKERS_SET_VISIBILITY' | - 'PORTFOLIOS_UPDATE' | 'PORTFOLIOS_INSERT' | 'PORTFOLIOS_REMOVE' - -export interface DataType { - tickers: Ticker[] - portfolios: Portfolio[] -} - -export interface ActionsType { - type: ActionsFunctionsTypes - payload?: any -} - -export interface DataContextType { - data: DataType - results: Result[] - dispatch: React.Dispatch -} diff --git a/src/@types/PortfoliosTypes.d.ts b/src/@types/PortfoliosTypes.d.ts index df07262..31de4bc 100644 --- a/src/@types/PortfoliosTypes.d.ts +++ b/src/@types/PortfoliosTypes.d.ts @@ -2,17 +2,3 @@ export interface Portfolio { id: string name: string } - -export interface PortfolioResponse { - status: 'success' | 'error' - message: string -} - -export interface PortfoliosContextType { - portfolios: Portfolio[] - getPortfolio: (id: string) => Portfolio - listPortfolios: () => Portfolio[] - insertPortfolio: (portfolio: Omit) => PortfolioResponse - deletePortfolio: (id: string) => PortfolioResponse - updatePortfolio: (id: string, portfolio: Portfolio) => PortfolioResponse -} diff --git a/src/@types/QuotesTypes.d.ts b/src/@types/QuotesTypes.d.ts deleted file mode 100644 index 293e598..0000000 --- a/src/@types/QuotesTypes.d.ts +++ /dev/null @@ -1,90 +0,0 @@ -export interface HistoricalDataPrice { - date: number - open?: number - high?: number - low?: number - close: number - volume?: number - adjustedClose: number -} - -export interface CashDividend { - assetIssued: string - paymentDate: string - rate: number - relatedTo: string - approvedOn: string - isinCode: string - label: string - lastDatePrior: string - remarks: string -} - -export interface StockDividend { - assetIssued: string - factor: number - approvedOn: string - isinCode: string - label: string - lastDatePrior: string - remarks: string -} - -export interface Subscription { - assetIssued: string - percentage: number - priceUnit: number - tradingPeriod: string - subscriptionDate: string - approvedOn: string - isinCode: string - label: string - lastDatePrior: string - remarks: string -} - -export interface DividendsData { - cashDividends: CashDividend[] - stockDividends: StockDividend[] - subscriptions: Subscription[] -} - -export interface Result { - symbol: string - shortName: string - longName: string - currency: string - regularMarketPrice: number - regularMarketDayHigh: number - regularMarketDayLow: number - regularMarketDayRange: string - regularMarketChange: number - regularMarketChangePercent: number - regularMarketTime: string - marketCap: number - regularMarketVolume: number - regularMarketPreviousClose: number - regularMarketOpen: number - averageDailyVolume10Day: number - averageDailyVolume3Month: number - fiftyTwoWeekLowChange: number - fiftyTwoWeekRange: string - fiftyTwoWeekHighChange: number - fiftyTwoWeekHighChangePercent: number - fiftyTwoWeekLow: number - fiftyTwoWeekHigh: number - twoHundredDayAverage: number - twoHundredDayAverageChange: number - twoHundredDayAverageChangePercent: number - validRanges: string[] - historicalDataPrice: HistoricalDataPrice[] - priceEarnings: any - earningsPerShare: any - logourl: string - dividendsData: DividendsData -} - -export interface ResultQuotes { - results: Result[] - requestedAt: string -} diff --git a/src/@types/ResultsTypes.ts b/src/@types/ResultsTypes.ts deleted file mode 100644 index 954e76d..0000000 --- a/src/@types/ResultsTypes.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Ticker } from "./TickersTypes" - -export interface History { - ticker: string - date: string - value: number - timestamp: number -} - -export interface Result{ - ticker: string - dy: number - pvp: number - price: number - requestedAt: number - lastDividend: number - isError: boolean - isLoading: boolean - dividendHistory: History[] - priceHistory: History[] -} - -export interface ResultsContextType { - results: Result[] - get: (ticker: string) => Result - load: (tickers: Ticker[]) => Promise -} diff --git a/src/@types/TickersTypes.d.ts b/src/@types/TickersTypes.d.ts index b2788c6..c93066d 100644 --- a/src/@types/TickersTypes.d.ts +++ b/src/@types/TickersTypes.d.ts @@ -1,26 +1,23 @@ -export interface TickerData{ - price: number - pvp: number - dy: number - lastDividend: number -} - export interface Ticker { + ticker: string portfolioId: string - isHidden: boolean quantity: number - ticker: string + isHidden: boolean } -export interface TickerActionResponse { - status: 'success' | 'error' - message: string +export interface TickerData { + dy12: number + dividend12: number + pvp: number + price: number + lastDividend: number + dividendHistory: any[], + dailyPriceHistory: any[], + monthlyPriceHistory: any[], } -export interface TickersContextType { - tickers: Ticker[] - addTickers: (tickers: string[], portfolios: string[]) => Promise - removeTicker: (ticker: Ticker) => TickerActionResponse - updateTicker: (ticker: Ticker) => TickerActionResponse - listByPortfolioId: (id: string) => Ticker[] +export interface TickerFecth { + isLoading: boolean + isError: boolean + data: TickerData } diff --git a/src/actions/portfoliosActions.ts b/src/actions/portfoliosActions.ts index f6fa5fd..bf27c30 100644 --- a/src/actions/portfoliosActions.ts +++ b/src/actions/portfoliosActions.ts @@ -1,47 +1,29 @@ -import { DataType } from "@/@types/DataTypes" import { Portfolio } from "@/@types/PortfoliosTypes" import { findIndex } from 'lodash' import { v4 as uuid } from 'uuid' - export const portfoliosActions = { - update: (state: DataType, payload: any): DataType => { - const { portfolios } = state - - const index = findIndex(portfolios, { id: payload.id }) + update: (state: Portfolio[], payload: any): Portfolio[] => { + const portfolios = state.map((p) => { + if (p.id === payload.id) { + return payload + } - portfolios[index].name = payload.name + return p + }) - return { - ...state, - portfolios: [...portfolios] - } + return [...portfolios] }, - - insert: (state: DataType, payload: any): DataType => { - const { portfolios } = state - const newPortfolio: Portfolio = { + insert: (state: Portfolio[], payload: any): Portfolio[] => { + return [...state, { id: uuid(), name: payload.name - } - - return { - ...state, - portfolios: [...portfolios, newPortfolio] - } + }] }, - - remove: (state: DataType, payload: any): DataType => { - const { portfolios } = state - - const index = findIndex(portfolios, { id: payload.id }) - - portfolios.splice(index, 1) - return { - ...state, - portfolios: [...portfolios] - } + remove: (state: Portfolio[], payload: any): Portfolio[] => { + const portfolios = state.filter((p) => (p.id !== payload.id)) + return [...portfolios] }, } diff --git a/src/actions/storageActions.ts b/src/actions/storageActions.ts deleted file mode 100644 index c516446..0000000 --- a/src/actions/storageActions.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DataType } from "@/@types/DataTypes" -import { dataInitialState } from "@/reducers/dataReducer" - -export const storageActions = { - load: (state: DataType): DataType => { - const data = localStorage.getItem('data') - - if (data) { - return JSON.parse(data) - } - - return state - }, - - save: (state: DataType) => { - const data = JSON.stringify(state) - localStorage.setItem('data', data) - - return state - }, - - clear: () => { - const data = JSON.stringify(dataInitialState) - localStorage.setItem('data', data) - - return dataInitialState - } -} diff --git a/src/actions/tickersActions.ts b/src/actions/tickersActions.ts index dac46e3..761eae6 100644 --- a/src/actions/tickersActions.ts +++ b/src/actions/tickersActions.ts @@ -1,52 +1,38 @@ import { Ticker } from "@/@types/TickersTypes" -import { DataType } from "@/@types/DataTypes" import { findIndex, uniqWith } from 'lodash' - -const defaultValues: Ticker = { - ticker: '', - portfolioId: '', - quantity: 0, - isHidden: false, -} +import { config } from "@/config" export const tickersActions = { - insert: (state: DataType, { tickersList, portfoliosList }: any): DataType => { - const { tickers } = state - + insert: (state: Ticker[], { tickersList, portfoliosList }: any): Ticker[] => { + const newTickers: Ticker[] = [] portfoliosList.forEach((portfolioId: string) => { tickersList.forEach((ticker: string) => { - newTickers.push({ ...defaultValues, ticker, portfolioId }) + newTickers.push({ ...config.defaults.ticker, ticker, portfolioId }) }) }) - const tickersFiltred = uniqWith([...tickers, ...newTickers], (a, b) => { + const tickersFiltred = uniqWith([...state, ...newTickers], (a, b) => { return a.ticker === b.ticker && a.portfolioId === b.portfolioId }) - return { ...state, tickers: tickersFiltred } + return [...tickersFiltred] }, - remove: (state: DataType, { ticker, portfolioId }: any): DataType => { - const { tickers } = state - - const index = findIndex(tickers, { ticker, portfolioId }) - tickers.splice(index, 1) - - return { ...state, tickers } + remove: (state: Ticker[], { ticker, portfolioId }: any): Ticker[] => { + const tickers = state.filter((i => (i.ticker !== ticker || i.portfolioId !== portfolioId))) + return [...tickers] }, - setVisibility: (state: DataType, { ticker, portfolioId, isHidden }: any): DataType => { - const { tickers } = state - - const newTickers = tickers.map((t) => { - if (t.ticker === ticker && t.portfolioId === portfolioId) { - return { ...t, isHidden } + update: (state: Ticker[], payload: any): Ticker[] => { + const tickers = state.map((i) => { + if (i.ticker === payload.ticker && i.portfolioId === payload.portfolioId) { + return payload } - return t + return i }) - return { ...state, tickers: newTickers } - } + return [...tickers] + }, } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3a31bab..5a35869 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ -import { ReactNode, Suspense } from 'react' + import { ReactNode, Suspense } from 'react' import { Inter } from 'next/font/google' import { config } from '@/config' diff --git a/src/app/portfolios/[portfolioId]/details/page.tsx b/src/app/portfolios/[portfolioId]/details/page.tsx deleted file mode 100644 index fc92276..0000000 --- a/src/app/portfolios/[portfolioId]/details/page.tsx +++ /dev/null @@ -1,59 +0,0 @@ -'use client' - -import { Portfolio } from "@/@types/PortfoliosTypes" -import { Ticker } from "@/@types/TickersTypes" -import { PageTitle } from "@/components/PageTitle" -import { Card } from "@tremor/react" -import { useEffect, useState } from "react" -import { usePortfolios } from "@/hooks/usePortfolios" -import { useTickers } from "@/hooks/useTickers" -import { Table } from "@/components/details/table" -import { useData } from "@/hooks/useData" -import { CardChart } from "@/components/details/chart/CardChart" -import Loading from "@/app/loading" - -interface AnalisesProps { - params: { - portfolioId: string - } -} - -export default function PagePortfolioDetails({ params }: AnalisesProps) { - const [portfolio, setPortfolio] = useState(false) - const [tickersFiltred, setTickersFiltred] = useState([]) - - const { data } = useData() - const { listByPortfolioId } = useTickers() - const { getPortfolio } = usePortfolios() - - useEffect(() => { - setPortfolio(getPortfolio(params.portfolioId)) - setTickersFiltred(listByPortfolioId(params.portfolioId)) - }, []) - - useEffect(() => { - setTickersFiltred(listByPortfolioId(params.portfolioId)) - }, [data]) - - if (!portfolio) { - return ( - - ) - } - - return ( -
- - Análise da carteira - {portfolio.name} - - - -
- - - - - - ) -} diff --git a/src/components/PageTitle.tsx b/src/components/PageTitle.tsx deleted file mode 100644 index f7d0da8..0000000 --- a/src/components/PageTitle.tsx +++ /dev/null @@ -1,12 +0,0 @@ -'use client' - -import { Title } from "@tremor/react" -import { ReactNode } from "react" - -export function PageTitle({ children }: { children: ReactNode }) { - return ( - - {children} - - ) -} diff --git a/src/components/TableTickers.tsx b/src/components/TableTickers.tsx deleted file mode 100644 index ba6d769..0000000 --- a/src/components/TableTickers.tsx +++ /dev/null @@ -1,38 +0,0 @@ -'use client' - -import { Ticker } from '@/@types/TickersTypes' -import { - Table, - TableBody, - TableHead, - TableHeaderCell, - TableRow, -} from '@tremor/react' - -import { TableTickersRow } from './TableTickersRow' - -type Props = { - tickers: Ticker[] -} - -export function TableTickers({ tickers }: Props) { - - return ( -
- - - Papel - Valor Atual - PV/P - Dividend Yield - Últ. Rendimento - - - - {tickers.map((t) => ( - - ))} - -
- ) -} diff --git a/src/components/TableTickersRow.tsx b/src/components/TableTickersRow.tsx deleted file mode 100644 index c414e9c..0000000 --- a/src/components/TableTickersRow.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client' - -import { Ticker } from '@/@types/TickersTypes' -import { toCurrency } from '@/helpers/currency' -import { useResult } from '@/hooks/useResults' -import { TableCell, TableRow } from '@tremor/react' - -type Props = { - ticker: Ticker, -} - -export function TableTickersRow({ ticker }: Props) { - const { dy, isError, isLoading, lastDividend, price } = useResult(ticker.ticker) - - if (isError || isLoading) { - return ( - - {ticker.ticker} - - - - - - - - - - ) - } - - return ( - - {ticker.ticker} - {toCurrency(price)} - - - {toCurrency(dy)} - {toCurrency(lastDividend)} - - ) -} diff --git a/src/components/common/Title.tsx b/src/components/common/Title.tsx new file mode 100644 index 0000000..8e62d32 --- /dev/null +++ b/src/components/common/Title.tsx @@ -0,0 +1,12 @@ +'use client' + +import { Title as TitleReact } from "@tremor/react" +import { ReactNode } from "react" + +export function Title({ children }: { children: ReactNode }) { + return ( + + {children} + + ) +} diff --git a/src/components/details/chart/CardChart.tsx b/src/components/details/chart/CardChart.tsx deleted file mode 100644 index 89629f5..0000000 --- a/src/components/details/chart/CardChart.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { Ticker } from "@/@types/TickersTypes" -import { PageTitle } from "@/components/PageTitle" -import { toCurrency } from "@/helpers/currency" -import { useChart } from "@/hooks/useChart" -import { AreaChart, AreaChartProps, BarChart, Card, LineChart } from "@tremor/react" -import { useState } from "react" - -type ChartType = 'area' | 'line' | 'bar' -type HistoryType = 'priceHistory' | 'dividendHistory' - -type Props = { - tickers: Ticker[] - title: string - history: HistoryType -} - -export const CardChart = ({ tickers, title, history }: Props) => { - const [chart, setChart] = useState('area') - const { getCategories, getHistory } = useChart(tickers) - - console.log(11111, getHistory(history)) - - const chartOptions: AreaChartProps = { - data: getHistory(history), - categories: getCategories(), - index: 'date', - yAxisWidth: 80, - className: 'mt-6', - valueFormatter: toCurrency, - colors: [ - 'blue', 'green', 'red', 'yellow', - 'purple', 'orange', "indigo", "orange" - ], - } - - return ( - <> - {title} - - {chart === 'area' && ()} - {chart === 'line' && ()} - {chart === 'bar' && ()} - - - - ) -} \ No newline at end of file diff --git a/src/components/details/chart/DividendsChart.tsx b/src/components/details/chart/DividendsChart.tsx deleted file mode 100644 index 7f7f28d..0000000 --- a/src/components/details/chart/DividendsChart.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Ticker } from "@/@types/TickersTypes" -import { toCurrency } from "@/helpers/currency" -import { useResult } from "@/hooks/useResults" -import { LineChart } from "@tremor/react" -import { set } from "lodash" - -type Props = { - tickers: Ticker[] -} - -export const DividendsChart = ({ tickers }: Props) => { - const dataTemp: any = [] - const categories = tickers.map((ticker) => ticker.ticker) - - - - const data = Object.keys(dataTemp).map((date) => { - return { date, ...dataTemp[date] } - }) - - return ( -
- -
- ) -} \ No newline at end of file diff --git a/src/components/details/chart/PriceChart.tsx b/src/components/details/chart/PriceChart.tsx deleted file mode 100644 index e7a26c2..0000000 --- a/src/components/details/chart/PriceChart.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Ticker } from "@/@types/TickersTypes" -import { toCurrency } from "@/helpers/currency" -import { useResult } from "@/hooks/useResults" -import { AreaChart } from "@tremor/react" -import { set } from "lodash" - -type Props = { - tickers: Ticker[] -} - -export const PriceChart = ({ tickers }: Props) => { - const dataTemp: any = [] - const categories = tickers.map((ticker) => ticker.ticker) - - tickers.forEach((ticker) => { - const result = useResult(ticker.ticker) - - result.priceHistory.forEach((history) => { - set(dataTemp, [history.date, ticker.ticker], history.value) - }) - }) - - const data = Object.keys(dataTemp).map((date) => { - return { date, ...dataTemp[date] } - }) - - - return ( -
- -
- ) -} \ No newline at end of file diff --git a/src/components/details/table/Row.tsx b/src/components/details/table/Row.tsx deleted file mode 100644 index b9b8bd9..0000000 --- a/src/components/details/table/Row.tsx +++ /dev/null @@ -1,48 +0,0 @@ -'use client' - -import { TableCell, TableRow } from '@tremor/react' -import { Ticker } from '@/@types/TickersTypes' -import { BtnRemove } from './BtnRemove' -import { useResults } from '@/hooks/useResults' -import { BtnVisibility } from './BtnVisibility' -import { toCurrency } from '@/helpers/currency' - -type Props = { - ticker: Ticker, -} - -export function Row({ ticker }: Props) { - const { getTickerResult } = useResults() - const { dy, isError, isLoading, lastDividend, price } = getTickerResult(ticker.ticker) - - if (isError || isLoading) { - return ( - - {ticker.ticker} - - - - - - - - - - - - - - ) - } - - return ( - - {ticker.ticker} - {toCurrency(price)} - - - {toCurrency(dy)} - {toCurrency(lastDividend)} - - - - - - - ) -} diff --git a/src/components/home/form/index.tsx b/src/components/home/form/index.tsx index 3fd22a3..91ea4ae 100644 --- a/src/components/home/form/index.tsx +++ b/src/components/home/form/index.tsx @@ -16,8 +16,6 @@ export function Form() { const onPortfoliosSelected = (value: any) => setPortfolioSelected(value) const onSubmit = () => { - console.log('onSubmit...'); - if (!portfolioSelected.length || !tickersSelected.length) { return console.error('Portfolio selection') } diff --git a/src/components/home/info/Buttons.tsx b/src/components/home/info/Buttons.tsx index 75702d8..3c75e79 100644 --- a/src/components/home/info/Buttons.tsx +++ b/src/components/home/info/Buttons.tsx @@ -11,13 +11,13 @@ type Props = { export function Buttons({ portfolioId }: Props) { return (
- + - + {/* - + */}
) } diff --git a/src/components/home/info/Cards.tsx b/src/components/home/info/Cards.tsx index 93f4cdf..b59e259 100644 --- a/src/components/home/info/Cards.tsx +++ b/src/components/home/info/Cards.tsx @@ -3,7 +3,7 @@ import { Card } from '@tremor/react' import { useTickers } from '@/hooks/useTickers' -import { TableTickers } from '@/components/TableTickers' +import { Table } from '@/components/home/table' import { Header } from './Header' type Props = { @@ -27,7 +27,7 @@ export function Cards({ portfolioId, portfolioName }: Props) { return (
- + ) } diff --git a/src/components/home/info/index.tsx b/src/components/home/info/index.tsx index f5e277f..d748b41 100644 --- a/src/components/home/info/index.tsx +++ b/src/components/home/info/index.tsx @@ -1,8 +1,8 @@ 'use client' +import { Title } from '@tremor/react' import { usePortfolios } from '@/hooks/usePortfolios' import { Cards } from './Cards' -import { Title } from '@tremor/react' export function Info() { const { listPortfolios } = usePortfolios() @@ -11,7 +11,7 @@ export function Info() {
Minhas Carteiras -
+
{listPortfolios().map((g) => ( ))} diff --git a/src/components/details/table/BtnRemove.tsx b/src/components/home/table/BtnRemove.tsx similarity index 62% rename from src/components/details/table/BtnRemove.tsx rename to src/components/home/table/BtnRemove.tsx index c61fed1..5317de3 100644 --- a/src/components/details/table/BtnRemove.tsx +++ b/src/components/home/table/BtnRemove.tsx @@ -7,13 +7,14 @@ import { Trash } from '@phosphor-icons/react' type Props = { ticker: Ticker, + isDisabled?: boolean, } -export function BtnRemove({ ticker }: Props) { +export function BtnRemove({ ticker, isDisabled = false }: Props) { const { removeTicker } = useTickers() return ( - ) diff --git a/src/components/details/table/BtnVisibility.tsx b/src/components/home/table/BtnVisibility.tsx similarity index 52% rename from src/components/details/table/BtnVisibility.tsx rename to src/components/home/table/BtnVisibility.tsx index 63d3a72..6cd316d 100644 --- a/src/components/details/table/BtnVisibility.tsx +++ b/src/components/home/table/BtnVisibility.tsx @@ -10,14 +10,19 @@ type Props = { isDisabled?: boolean, } -export function BtnVisibility({ ticker, isDisabled = false}: Props) { +export function BtnVisibility({ ticker, isDisabled = false }: Props) { const { setVisibility } = useTickers() - - const icon = isDisabled || ticker.isHidden ? EyeSlash : Eye + const icon = isDisabled || ticker.isHidden ? Eye : EyeSlash return ( - ) } diff --git a/src/components/home/table/Cell.tsx b/src/components/home/table/Cell.tsx new file mode 100644 index 0000000..b47c3a7 --- /dev/null +++ b/src/components/home/table/Cell.tsx @@ -0,0 +1,16 @@ +import { TableCell } from '@tremor/react' + +type Props = { + children: React.ReactNode, + isHidden?: boolean, +} + +export function Cell({ children, isHidden = false }: Props) { + const className = 'text-center ' + (isHidden ? 'text-gray-300 line-through;' : '') + + return ( + <> + {children} + + ) +} diff --git a/src/components/home/table/Row.tsx b/src/components/home/table/Row.tsx new file mode 100644 index 0000000..e02c279 --- /dev/null +++ b/src/components/home/table/Row.tsx @@ -0,0 +1,60 @@ +'use client' + +import { Ticker } from '@/@types/TickersTypes' +import { toCurrency } from '@/helpers/currency' +import { useTickerFetch } from '@/hooks/useTickerFetch' +import { TableCell, TableRow } from '@tremor/react' +import { Cell } from './Cell' +import { BtnVisibility } from './BtnVisibility' +import { BtnRemove } from './BtnRemove' +import { Spinner } from '@phosphor-icons/react' + +type Props = { + ticker: Ticker, +} + +export function Row({ ticker }: Props) { + const { isError, isLoading, data } = useTickerFetch(ticker) + const { isHidden } = ticker + + if (isLoading) { + return ( + + + + + + ... + + + ) + } + + if (isError) { + return ( + + + + + + {ticker.ticker} + Infelizmente ocorreu um erro ao tentar carregar os dados desse ativo! + + ) + } + + return ( + + + + + + {ticker.ticker} + {toCurrency(data.price)} + {data.pvp} + {data.dy12}% + {toCurrency(data.lastDividend)} + {toCurrency(data.dividend12)} + + ) +} diff --git a/src/components/details/table/index.tsx b/src/components/home/table/Table.tsx similarity index 66% rename from src/components/details/table/index.tsx rename to src/components/home/table/Table.tsx index 41fe287..c71b192 100644 --- a/src/components/details/table/index.tsx +++ b/src/components/home/table/Table.tsx @@ -1,11 +1,14 @@ +'use client' + import { Ticker } from '@/@types/TickersTypes' import { - Table as TableReact, + Table as TremorTable, TableBody, TableHead, TableHeaderCell, TableRow, } from '@tremor/react' + import { Row } from './Row' type Props = { @@ -13,23 +16,25 @@ type Props = { } export function Table({ tickers }: Props) { + return ( - + + Papel Valor Atual PV/P - Dividend Yield - Últ. Rendimento - + DY + Últ. Rend. + Rend. Últ. 12M {tickers.map((t) => ( - + ))} - + ) } diff --git a/src/components/home/table/index.tsx b/src/components/home/table/index.tsx new file mode 100644 index 0000000..47e27d2 --- /dev/null +++ b/src/components/home/table/index.tsx @@ -0,0 +1,5 @@ +import { Table } from '@/components/home/table/Table' + +export { + Table +} \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index abc478d..0a367e0 100644 --- a/src/config.ts +++ b/src/config.ts @@ -8,14 +8,13 @@ export const config = { }, }, - apis: { - brapi: { - host: 'https://brapi.dev/', - }, - }, + api: {}, - cache: { - time: 1000 * 60 * 15, // 15 minutes + defaults: { + ticker: { + quantity: 1, + isHidden: false, + } }, charts: { diff --git a/src/helpers/TickerFetchAPI.ts b/src/helpers/TickerFetchAPI.ts new file mode 100644 index 0000000..fda33a8 --- /dev/null +++ b/src/helpers/TickerFetchAPI.ts @@ -0,0 +1,191 @@ +import { Ticker, TickerData } from "@/@types/TickersTypes"; +import { round } from "lodash"; +import moment from "moment"; + +type Params = Record + +interface DividendHistory { + amount: number, + isin_code: string, + payment_at: number, + month_payment_at: string, +} + +interface PricesHistory { + +} + +interface ResultsPriceHistory { + [key: string]: Record> +} + +interface DailyPriceHistory{ + date: number, + avg: number, + min: number, + max: number, +} + +interface PriceHistory { + date: number, + price: number, +} + +export class TickerFetchAPI { + private readonly ticker: string + private readonly api_key = '5be6b9db' + private readonly api_base_url = 'https://api.hgbrasil.com/' + + constructor(ticker: Ticker) { + this.ticker = ticker.ticker + } + + private getURL(endpoint: string, params: Params): string { + const queryString = new URLSearchParams({ ...params, key: this.api_key, format: 'json-cors' }); + const url = new URL(this.api_base_url) + + url.pathname = endpoint + url.search = queryString.toString() + + return url.toString() + } + + public async fetch(): Promise { + const { price, pvp } = await this.fetchData(this.ticker) + const { dividendHistory } = await this.fetchDividends(this.ticker) + const { dailyPriceHistory, monthlyPriceHistory } = await this.fetchPrices(this.ticker) + const { dividend12, dy12, lastDividend } = this.getDividends(dividendHistory, price) + + return { + dy12, + dividend12, + price, + pvp, + lastDividend, + dividendHistory: [], + dailyPriceHistory, + monthlyPriceHistory, + } + } + + private async fetchData(symbol: string) { + const url = this.getURL('finance/stock_price', { symbol }) + + const response = await fetch(url, { + method: 'GET', + cache: 'force-cache', + }) + + const data = await response.json() + const result = data.results[symbol] + + return { + price: Number(result.price), + pvp: round(result.financials.price_to_book_ratio, 2), + } + } + + private async fetchDividends(symbol: string) { + const url = this.getURL('finance/stock_dividends', { symbol }) + + const response = await fetch(url, { + method: 'GET', + cache: 'force-cache', + next: { + revalidate: 3600 + }, + }) + + const data = await response.json() + const dividends = data.results[symbol].filter((result: any) => { + const tickerCode = `BR${symbol.substring(0, 4)}CTF` + return (result.label === 'Rendimento' && result.isin_code.includes(tickerCode)) + }).map((result: any) => { + const payment_at = new Date(result.payment_date + ' 00:00:00 GMT-0300').getTime() + const isin_code = result.isin_code + const amount = Number(result.amount) + const month_payment_at = moment(payment_at).startOf('month').format('YYYY-MM-DD') + + return { + amount, + isin_code, + payment_at, + month_payment_at, + } + }) + + return { + dividendHistory: dividends.splice(0, 12).reverse() + } + } + + private async fetchPrices(symbol: string) { + const url = this.getURL('finance/historical/stocks', { symbol, days_ago: '20' }) + + const response = await fetch(url, { + method: 'GET', + cache: 'force-cache', + }) + + const data = await response.json() + const monthlyPriceHistory = this.getPriceHistory(data.results) + const dailyPriceHistory = this.getDailyPriceHistory(data.results) + + return { + monthlyPriceHistory: monthlyPriceHistory, + dailyPriceHistory: dailyPriceHistory, + } + } + + private getPriceHistory(prices: ResultsPriceHistory): PriceHistory[] { + const history: PriceHistory[] = [] + + for (const day in prices) { + const date = new Date(`${day} 00:00:00 GMT-0300`).getTime() + + const priceAverage = Object.values(prices[day][this.ticker]).reduce((acc, price) => { + return acc + price + }, 0) + + history.push({ date, price: round(priceAverage, 2) }) + } + + return history + } + + private getDailyPriceHistory(prices: ResultsPriceHistory): DailyPriceHistory[] { + const history: DailyPriceHistory[] = [] + + for (const day in prices) { + Object.keys(prices[day][this.ticker]).map((hour) => { + const date = new Date(`${day} ${hour}:00 GMT-0300`).getTime() + const price = prices[day][this.ticker][hour] + + history.push({ + date, + avg: round(price, 2), + max: 0, + min: 0, + }) + }) + } + + return history + } + + private getDividends(dividendHistory: DividendHistory[], price: number) { + const lastDividend = dividendHistory[dividendHistory.length - 1].amount + + const dividend12 = dividendHistory.reduce((acc, dividend) => { + return acc + dividend.amount + }, 0) + + const dy12 = round(dividend12 / price * 100, 2) + + return { + dy12, + dividend12, + lastDividend + } + } +} diff --git a/src/helpers/brapi.ts b/src/helpers/brapi.ts deleted file mode 100644 index cab06b4..0000000 --- a/src/helpers/brapi.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Result, ResultQuotes } from '@/@types/QuotesTypes' - -export const brAPI = async (ticket: string): Promise => { - try { - const response = await fetch( - `https://brapi.dev/api/quote/${ticket}?range=1y&interval=1mo&fundamental=true÷nds=true`, - { - cache: 'force-cache', - next: { - revalidate: 300 - } - } - ) - - const quotes: ResultQuotes = await response.json() - - if (!quotes || !quotes.results[0]) { - throw new Error('Nenhum resultado foi encontrado!') - } - - return quotes.results[0] - } catch (error) { - return false; - } -} diff --git a/src/helpers/investidor10.ts b/src/helpers/investidor10.ts deleted file mode 100644 index fa9d61d..0000000 --- a/src/helpers/investidor10.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as cheerio from 'cheerio' - -export const investidor10API = async (ticket: string) => { - // const response = await fetch( - // `https://www.suno.com.br/fundos-imobiliarios/${ticket.toLowerCase()}/`, - // ) - - const result = { - totalCotas: 0, - valuePerCotas: 0, - valuePatrimonial: 0, - } - - // const data = await response.text() - // const dom = cheerio.load(data) - - // #indicadores > div.row.gx-4 > div.col-12.gx-4.col-lg-4 > div > div:nth-child(1) > div > div.style__GaugeContent-sc-7o52xg-2.paGZO > div.style__GaugeValues-sc-7o52xg-5.iISrIB.col-6 > ul > li:nth-child(1) > span:nth-child(2) - - - // const table = dom('//*[@id="indicadores"]/div[2]/div[1]/div/div[1]/div/div[2]/div[2]/ul/li[1]/span[2]').text() - // console.log(table); - - - // const valuePerCotas = table - // .match(/VAL. PATRIMONIAL P\/ COTA\s*(R\$ ([\d.,]+))/)?.[2] - // .replaceAll('.', '') - // .replaceAll(',', '.') - // .trim() - - // const totalCotas = table - // .match(/COTAS EMITIDAS\s*([\d.]+)/)?.[1] - // .replaceAll('.', '') - // .trim() - - // if (totalCotas) { - // result.totalCotas = Number(totalCotas) - // } - - // if (valuePerCotas) { - // result.valuePerCotas = Number(valuePerCotas) - // } - - // result.valuePatrimonial = result.valuePerCotas * result.totalCotas - - return result -} diff --git a/src/helpers/results.ts b/src/helpers/results.ts deleted file mode 100644 index 5b523cc..0000000 --- a/src/helpers/results.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Result } from "@/@types/ResultsTypes"; -import { config } from "@/config"; - -const validateRequestAt = (timestamp : number): boolean => { - return timestamp + config.cache.time > new Date().getTime() -} - -export const getResultByCache = (ticker: string, results: Result[]): Result | false => { - const index = results.findIndex((result) => result.ticker === ticker) - - if (index === -1 || !validateRequestAt(results[index].requestedAt)) { - return false - } - - return results[index] -} - diff --git a/src/helpers/storage.ts b/src/helpers/storage.ts new file mode 100644 index 0000000..4dc4b89 --- /dev/null +++ b/src/helpers/storage.ts @@ -0,0 +1,27 @@ +// import { dataInitialState } from "@/reducers/dataReducer" + +// export const storageActions = { +// load: (state: DataType): DataType => { +// const data = localStorage.getItem('data') + +// if (data) { +// return JSON.parse(data) +// } + +// return state +// }, + +// save: (state: DataType) => { +// const data = JSON.stringify(state) +// localStorage.setItem('data', data) + +// return state +// }, + +// clear: () => { +// const data = JSON.stringify(dataInitialState) +// localStorage.setItem('data', data) + +// return dataInitialState +// } +// } diff --git a/src/helpers/tickers.ts b/src/helpers/tickers.ts deleted file mode 100644 index 4153b82..0000000 --- a/src/helpers/tickers.ts +++ /dev/null @@ -1,139 +0,0 @@ -'use client' - -import { brAPI } from "./brapi" -import { DividendsData, Result as Response } from "@/@types/QuotesTypes" -import { History, Result } from "@/@types/ResultsTypes" -import { round, sortBy, uniqBy } from "lodash" -import { Ticker } from "@/@types/TickersTypes" -import { getResultByCache } from "./results" -import moment from "moment" - -const getPrice = (data: Response): number => { - return round(data.regularMarketPrice, 2) -} - -const getPVP = (data: Response): number => { - - // valuePatrimonial: number, - // // totalCotas: number, - // if (totalCotas === 0) { - // throw new Error('Não foi possível calcular o PVP!') - // } - - // console.log(valuePatrimonial, regularMarketPrice) - - // return round(regularMarketPrice / (valuePatrimonial / totalCotas), 2) - - return 0 -} - -const getDY = (data: Response): number => { - const total = data.dividendsData.cashDividends - .filter((dividend) => dividend.label === 'RENDIMENTO') - .reduce((acc, dividend) => acc + dividend.rate, 0) - - return round((total / data.regularMarketPrice) * 100, 2) -} - -const getLastDividend = (data: Response): number => { - const dividends = data.dividendsData.cashDividends.filter( - (dividend) => dividend.label === 'RENDIMENTO', - ) - - return round(dividends[0].rate, 2) -} - -export const getDividendHistory = (ticker: string, data: DividendsData): History[] => { - const histories = data.cashDividends - .filter((dividend) => dividend.label === 'RENDIMENTO') - .map((dividend) => { - const date = moment(dividend.paymentDate) - return { - ticker, - timestamp: date.unix(), - date: date.format('MM/YYYY'), - value: round(dividend.rate, 2), - } - }) - - console.log('dividend', sortBy(histories, 'timestamp')) - - - return sortBy(histories, 'timestamp') -} - -export const getPriceHistory = (ticker: string, data: Response): History[] => { - const histories = data.historicalDataPrice.map((history) => { - const date = moment.unix(history.date) - return { - ticker, - timestamp: date.unix(), - date: date.format('MM/YYYY'), - value: round(history.close, 2), - } - }) - - console.log('price', sortBy(histories, 'timestamp')) - - return sortBy(histories, 'timestamp') -} - -export const fetchTicker = async (ticker: string): Promise => { - const brResultAPI = await brAPI(ticker) - // const company = await investidor10API(ticker) - - const requestedAt = new Date().getTime() - - if (brResultAPI === false) { - return { - ticker, - dy: 0, - pvp: 0, - price: 0, - lastDividend: 0, - requestedAt, - isError: true, - isLoading: false, - dividendHistory: [], - priceHistory: [], - } - } - - return { - ticker, - dy: getDY(brResultAPI), - pvp: getPVP(brResultAPI), - price: getPrice(brResultAPI), - lastDividend: getLastDividend(brResultAPI), - requestedAt, - isError: false, - isLoading: false, - dividendHistory: getDividendHistory(ticker, brResultAPI.dividendsData), - priceHistory: getPriceHistory(ticker, brResultAPI), - } -} - -export const getAllResults = async (tickers: Ticker[], results: Result[]): Promise => { - const newResults: Result[] = [] - - const uniqueTickers = uniqBy(tickers, 'ticker') - const tickersToFetch = await Promise.allSettled( - uniqueTickers.map(async (ticker) => { - const result = getResultByCache(ticker.ticker, results) - - if (result) { - return result - } - - return await fetchTicker(ticker.ticker) - }) - ) - - tickersToFetch.forEach((tickerToFetch) => { - if (tickerToFetch.status === 'fulfilled') { - newResults.push(tickerToFetch.value) - } - }) - - return newResults -} \ No newline at end of file diff --git a/src/hooks/useChart.ts b/src/hooks/useChart.ts deleted file mode 100644 index 6540338..0000000 --- a/src/hooks/useChart.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Ticker } from "@/@types/TickersTypes"; -import { useResults } from "./useResults"; -import { set } from "lodash"; - -type HistoryType = 'priceHistory' | 'dividendHistory' - -export const useChart = (tickers: Ticker[]) => { - const { getTickerResult } = useResults() - - const tickersVisibled = tickers.filter((ticker) => { - const { isError } = getTickerResult(ticker.ticker) - return !isError && !ticker.isHidden - }) - - return { - getCategories: () => tickersVisibled.map((ticker) => ticker.ticker), - - getHistory: (type: HistoryType) => { - const dataTemp: any = [] - - tickers.forEach((ticker) => { - const result = getTickerResult(ticker.ticker) - - result[type].forEach((history) => { - set(dataTemp, [history.date, ticker.ticker], history.value) - }) - }) - - return Object.keys(dataTemp).map((date) => { - return { date, ...dataTemp[date] } - }) - } - } -} diff --git a/src/hooks/useData.ts b/src/hooks/useData.ts index 640b527..756182c 100644 --- a/src/hooks/useData.ts +++ b/src/hooks/useData.ts @@ -1,6 +1,6 @@ import { useContext } from "react" -import { DataContextType } from "@/@types/DataTypes" +import { DataContextType } from "@/@types/ContextTypes" import { DataContext } from "@/providers/DataProvider" export const useData = () => { diff --git a/src/hooks/usePortfolios.ts b/src/hooks/usePortfolios.ts index 2356fcc..3928049 100644 --- a/src/hooks/usePortfolios.ts +++ b/src/hooks/usePortfolios.ts @@ -2,19 +2,19 @@ import { findIndex } from "lodash"; import { useData } from "./useData"; export const usePortfolios = () => { - const { data } = useData() + const { portfolios } = useData() return { - listPortfolios: () => data.portfolios.sort((a, b) => a.name.localeCompare(b.name)), + listPortfolios: () => portfolios.sort((a, b) => a.name.localeCompare(b.name)), getPortfolio: (id: string) => { - const index = findIndex(data.portfolios, (portfolio) => portfolio.id === id); + const index = findIndex(portfolios, (portfolio) => portfolio.id === id); if(index === -1) { throw new Error(`Portfolio not found (${id})`) } - return data.portfolios[index] + return portfolios[index] } } } \ No newline at end of file diff --git a/src/hooks/useResults.ts b/src/hooks/useResults.ts deleted file mode 100644 index df0e447..0000000 --- a/src/hooks/useResults.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Result } from "@/@types/ResultsTypes"; -import { useData } from "./useData"; - -export const useResults = () => { - const { results } = useData() - - return { - getPriceHistory: () => {}, - getTickerResult: (ticker: string): Result => { - const result = results.find((r) => r.ticker === ticker) - - if(!result) { - return { - ticker, - dy: 0, - pvp: 0, - price: 0, - lastDividend: 0, - requestedAt: 0, - isError: false, - isLoading: true, - dividendHistory: [], - priceHistory: [], - } - } - - return result - } - } -} diff --git a/src/hooks/useTickerFetch.ts b/src/hooks/useTickerFetch.ts new file mode 100644 index 0000000..7265b9c --- /dev/null +++ b/src/hooks/useTickerFetch.ts @@ -0,0 +1,44 @@ +import { useEffect, useState } from "react" +import { Ticker, TickerData, TickerFecth } from "@/@types/TickersTypes"; +import { TickerFetchAPI } from "@/helpers/TickerFetchAPI"; + + +const defaultTickerFetch: TickerData = { + dy12: 0, + dividend12: 0, + pvp: 0, + price: 0, + lastDividend: 0, + dividendHistory: [], + dailyPriceHistory: [], + monthlyPriceHistory: [], +} + +export const useTickerFetch = (ticker: Ticker): TickerFecth => { + const [data, setData] = useState(defaultTickerFetch); + const [isError, setIsError] = useState(false); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + setIsLoading(true); + + const fetchData = async () => { + try { + + const api = new TickerFetchAPI(ticker); + const newData = await api.fetch(); + + setData(newData); + setIsLoading(false); + setIsError(false); + } catch (error) { + setIsError(true); + setIsLoading(false); + } + }; + + fetchData(); + }, [ticker]); + + return { data, isError, isLoading } +} \ No newline at end of file diff --git a/src/hooks/useTickers.ts b/src/hooks/useTickers.ts index 6e40f58..65f3f16 100644 --- a/src/hooks/useTickers.ts +++ b/src/hooks/useTickers.ts @@ -2,37 +2,26 @@ import { Ticker } from "@/@types/TickersTypes" import { useData } from "./useData" export const useTickers = () => { - const { data, dispatch } = useData() + const { tickers, dispatchTickers } = useData() return { addTickers: (tickersList: string[], portfoliosList: string[]) => { - dispatch({ - type: 'TICKERS_INSERT', payload: { - tickersList, portfoliosList - } + dispatchTickers({ + type: 'INSERT', + payload: { tickersList, portfoliosList } }) }, - removeTicker: ({ ticker, portfolioId }: Ticker) => { - dispatch({ - type: 'TICKERS_REMOVE', payload: { - ticker, portfolioId - } - }) + removeTicker: (ticker: Ticker) => { + dispatchTickers({ type: 'REMOVE', payload: ticker }) }, - setVisibility: ({ ticker, portfolioId, isHidden }: Ticker) => { - dispatch({ - type: 'TICKERS_SET_VISIBILITY', payload: { - ticker, - portfolioId, - isHidden: !isHidden - } - }) + setVisibility: (ticker: Ticker) => { + dispatchTickers({ type: 'SET_VISIBILITY', payload: ticker }) }, listByPortfolioId: (id: string) => { - return data.tickers.filter((t) => t.portfolioId === id) + return tickers.filter((t) => t.portfolioId === id) } } } \ No newline at end of file diff --git a/src/providers/DataProvider.tsx b/src/providers/DataProvider.tsx index 1630577..7779a6c 100644 --- a/src/providers/DataProvider.tsx +++ b/src/providers/DataProvider.tsx @@ -1,35 +1,27 @@ "use client" -import { ActionsType } from '@/@types/DataTypes'; -import { Result } from '@/@types/ResultsTypes'; -import { storageActions } from '@/actions/storageActions'; -import { getAllResults } from '@/helpers/tickers'; -import { dataInitialState, dataReducer } from '@/reducers/dataReducer'; -import { ReactNode, createContext, useEffect, useReducer, useState } from 'react' +import { ReactNode, createContext, useEffect, useReducer } from 'react' +import { portfoliosInitialState } from '@/storage/portfoliosInitialState'; +import { tickersInitialState } from '@/storage/tickersInitialState'; +import { portfoliosReducer } from '@/reducers/portfoliosReducer'; +import { tickersReducer } from '@/reducers/tickersReducer'; +import { DataContextType } from '@/@types/ContextTypes'; -export const DataContext = createContext({}) +export const DataContext = createContext({} as DataContextType) export function DataProvider({ children }: { children: ReactNode }) { - const [data, dispatchReducerData] = useReducer(dataReducer, dataInitialState); - const [results, setResult] = useState([]) - - const dispatch = (action: ActionsType) => { - console.log('dispatch', action); - dispatchReducerData(action) - } + const [tickers, dispatchTickers] = useReducer(tickersReducer, tickersInitialState); + const [portfolios, dispatchPortfolios] = useReducer(portfoliosReducer, portfoliosInitialState); useEffect(() => { - dispatch({ type: 'LOAD' }); + // dispatch({ type: 'LOAD' }); }, []) - useEffect(() => { - getAllResults(data.tickers, results).then((results) => { - setResult(results) - }) - }, [data]) - return ( - + {children} ) diff --git a/src/reducers/dataReducer.ts b/src/reducers/dataReducer.ts deleted file mode 100644 index 8ff22d0..0000000 --- a/src/reducers/dataReducer.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { portfoliosActions } from '@/actions/portfoliosActions' -import { ActionsType, DataType } from '@/@types/DataTypes' -import { storageActions } from '@/actions/storageActions' -import { tickersActions } from '@/actions/tickersActions' - -export const dataInitialState: DataType = { - tickers: [ - { - "ticker": "XPLG11", - "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", - "quantity": 0, - "isHidden": false, - }, - { - "ticker": "AAGR11", - "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", - "quantity": 0, - "isHidden": false, - }, - { - "ticker": "XPML11", - "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", - "quantity": 0, - "isHidden": false, - }, - { - "ticker": "VISC11", - "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", - "quantity": 0, - "isHidden": false, - }, - { - "ticker": "SARE11", - "portfolioId": "5a31ee47-6b2f-4586-8fb9-983010149ec7", - "quantity": 0, - "isHidden": false, - } - ], - portfolios: [ - { id: '5a31ee47-6b2f-4586-8fb9-983010149ec7', name: 'Carteira #1' }, - ], -} - -export const dataReducer = (state: DataType, action: ActionsType): DataType => { - switch (action.type) { - case 'LOAD': { - return storageActions.load(state) - } - - case 'CLEAR': { - return storageActions.clear() - } - - case 'PORTFOLIOS_INSERT': { - return portfoliosActions.insert(state, action.payload) - } - - case 'PORTFOLIOS_UPDATE': { - return portfoliosActions.insert(state, action.payload) - } - - case 'PORTFOLIOS_REMOVE': { - return portfoliosActions.insert(state, action.payload) - } - - case 'TICKERS_INSERT': { - return tickersActions.insert(state, action.payload) - } - - case 'TICKERS_REMOVE': { - return tickersActions.remove(state, action.payload) - } - - case 'TICKERS_SET_VISIBILITY': { - return tickersActions.setVisibility(state, action.payload) - } - } - -} \ No newline at end of file diff --git a/src/reducers/portfoliosReducer.ts b/src/reducers/portfoliosReducer.ts new file mode 100644 index 0000000..d7442bd --- /dev/null +++ b/src/reducers/portfoliosReducer.ts @@ -0,0 +1,20 @@ +import { portfoliosActions } from '@/actions/portfoliosActions' +import { PortfolioActionType } from '@/@types/ContextTypes' +import { Portfolio } from '@/@types/PortfoliosTypes' + +export const portfoliosReducer = (state: Portfolio[], action: PortfolioActionType): Portfolio[] => { + switch (action.type) { + case 'INSERT': { + return portfoliosActions.insert(state, action.payload) + } + + case 'UPDATE': { + return portfoliosActions.update(state, action.payload) + } + + case 'REMOVE': { + return portfoliosActions.remove(state, action.payload) + } + } + +} \ No newline at end of file diff --git a/src/reducers/tickersReducer.ts b/src/reducers/tickersReducer.ts new file mode 100644 index 0000000..b0431f4 --- /dev/null +++ b/src/reducers/tickersReducer.ts @@ -0,0 +1,23 @@ +import { tickersActions } from '@/actions/tickersActions' +import { TickerActionType } from '@/@types/ContextTypes' +import { Ticker } from '@/@types/TickersTypes' + +export const tickersReducer = (state: Ticker[], action: TickerActionType): Ticker[] => { + switch (action.type) { + case 'INSERT': { + return tickersActions.insert(state, action.payload) + } + + case 'REMOVE': { + return tickersActions.remove(state, action.payload) + } + + case 'SET_VISIBILITY': { + return tickersActions.update(state, { + ...action.payload, + isHidden: !action.payload.isHidden + }) + } + } + +} \ No newline at end of file diff --git a/src/storage/portfoliosInitialState.ts b/src/storage/portfoliosInitialState.ts new file mode 100644 index 0000000..1275db0 --- /dev/null +++ b/src/storage/portfoliosInitialState.ts @@ -0,0 +1,5 @@ +import { Portfolio } from "@/@types/PortfoliosTypes"; + +export const portfoliosInitialState: Portfolio[] = [ + { id: '5a31ee47-6b2f-4586-8fb9-983010149ec7', name: 'Carteira #1' }, +] \ No newline at end of file diff --git a/src/storage/tickersInitialState.ts b/src/storage/tickersInitialState.ts new file mode 100644 index 0000000..d03e42b --- /dev/null +++ b/src/storage/tickersInitialState.ts @@ -0,0 +1,10 @@ +import { Ticker } from "@/@types/TickersTypes"; +import { config } from "@/config"; + +const portfolioId = '5a31ee47-6b2f-4586-8fb9-983010149ec7' + +export const tickersInitialState: Ticker[] = [ + { ...config.defaults.ticker, portfolioId, ticker: "XPLG11" }, + { ...config.defaults.ticker, portfolioId, ticker: "VISC11" }, + { ...config.defaults.ticker, portfolioId, ticker: "SARE11" }, +] \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 0c7555f..2eb8a96 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,6 +23,6 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".old/useChart.ts"], "exclude": ["node_modules"] } From 22e9e07d08ac3f3979d52be92be5f25fed9b3d41 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Thu, 10 Aug 2023 22:14:01 -0300 Subject: [PATCH 08/46] fix: eslint --- .eslintrc.json | 2 +- public/about.txt | 6 + public/android-chrome-192x192.png | Bin 0 -> 5758 bytes public/android-chrome-512x512.png | Bin 0 -> 17009 bytes public/apple-touch-icon.png | Bin 0 -> 5177 bytes public/favicon-16x16.png | Bin 0 -> 395 bytes public/favicon-32x32.png | Bin 0 -> 717 bytes public/favicon.ico | Bin 0 -> 15406 bytes public/site.webmanifest | 1 + src/@types/TickersTypes.d.ts | 8 +- src/actions/portfoliosActions.ts | 15 ++- src/actions/tickersActions.ts | 14 ++- src/app/layout.tsx | 2 +- src/components/common/Title.tsx | 4 +- src/components/home/form/index.tsx | 6 +- src/components/home/info/Buttons.tsx | 10 +- src/components/home/info/Cards.tsx | 4 +- src/components/home/info/Header.tsx | 10 +- src/components/home/table/BtnRemove.tsx | 16 ++- src/components/home/table/BtnVisibility.tsx | 10 +- src/components/home/table/Cell.tsx | 7 +- src/components/home/table/Row.tsx | 14 ++- src/components/home/table/Table.tsx | 19 +-- src/components/home/table/index.tsx | 4 +- src/config.ts | 8 +- src/helpers/TickerFetchAPI.ts | 125 ++++++++++++-------- src/helpers/currency.ts | 5 +- src/hooks/useData.ts | 10 +- src/hooks/usePortfolios.ts | 15 +-- src/hooks/useTickerFetch.ts | 40 +++---- src/hooks/useTickers.ts | 10 +- src/providers/DataProvider.tsx | 34 ++++-- src/reducers/portfoliosReducer.ts | 8 +- src/reducers/tickersReducer.ts | 10 +- src/storage/portfoliosInitialState.ts | 4 +- src/storage/tickersInitialState.ts | 12 +- 36 files changed, 248 insertions(+), 185 deletions(-) create mode 100644 public/about.txt create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/site.webmanifest diff --git a/.eslintrc.json b/.eslintrc.json index 165a9ff..5e24c36 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,3 @@ { - "extends": ["next/core-web-vitals", "@rocketseat/eslint-config/react"] + "extends": ["@rocketseat/eslint-config/react"] } diff --git a/public/about.txt b/public/about.txt new file mode 100644 index 0000000..7d6aedf --- /dev/null +++ b/public/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following font: + +- Font Title: Leckerli One +- Font Author: Copyright (c) 2011 Gesine Todt (www.gesine-todt.de), with Reserved Font Names "Leckerli" +- Font Source: http://fonts.gstatic.com/s/leckerlione/v16/V8mCoQH8VCsNttEnxnGQ-1itLZxcBtItFw.ttf +- Font License: SIL Open Font License, 1.1 (http://scripts.sil.org/OFL)) diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..5de3877abc178fcd744beb3372128a4317af0760 GIT binary patch literal 5758 zcmaJ_XEa>j*Pa<}79%`!U6KCAN0U;y4 z_2=Af5GSCwzJ@ZOYKV0c0AP@PsERc7x8BVoPotZd=nb798LBB3!3siRS_G6;VZ=v6 z6~`+8TSV!W*CNk5H^t~U6(NaC5>nwu^M1cC=hU1~wAg=hgBG`zX?>@o5hH{dD z&o=TmU(Fj${LMFb|E$?&{_g^zEp%dbuMJvCJ836i6swmiz)zBglB0^|Yc%9nCbi7f z|1jPihj50WP_bBwXwgQIt|ei7Fqa5NKiQrwi>!OA(8~75s_g>~jZ~yGl+DvQQAKfh zh+Ta6&5#gCOsv8)D`Mc@Vc*hYVhAv%LW zw{C5}(31e}d2&09ra@kV=4pjf7b+no;IM{RFX2Gb{@};8jkIan=;*mB**WT30GFU( zyHh!Y2ZQ!G7e_VaActCh!);>%1!*uOb+iLE`^Mm)Fx;!RbA7hI5+k&{@hk|8V)RHX zr8=-K_=%5bBp03vwB1)s9T?EDf!aWTC_Qs%mgoyhWdh0>)Nm${Aoa8grX3MM5hEJV zYV~hj0QTkg{R;K5FaFW!@8n*M5qnV;Di{EEh@f|^|BGT_t@I5Yuz(A;#!Pls|Ad?p z$c|#s|Bn^VQ@~&rUkdS$#VLDzTNnEkc;m3(`pT2(U5=%-{m15@1f07inMBNcHcayb zng$_$o6$7>9mGEoXNotEj-Gob`yH?qm>02S04BN$S<1^Q>{y2nc~Q_y9R&24;p*0F`h>dDRre_xW1^C- z*L^Gb0XA^@a)zHmrWrU#W6=(M|qGVKmB z7Nh=Cju^a&QY9@*c2s)Z7rtf2mpEr3h9wwW55<2`YC8P>%zcTV)_xy<5$@9wWU@*K zQhdwZfcS-Mh7Ma5+O*GFBvoIE_VTQiI9wZ@`X&5OU_4p<@*~hr*BXT9+cf4y|!Pvu(FX<9<(O93v!8+w`SO&QNjHbjOvppE-dHlet>WC- zvo!61GklC5iC;RZTbJpGqs7BSy&cq^&jMy{lfKwesf^S6)Eclgz^nTreVHcdF=0Y} zLx~~ea=Jr65ZFyqPGSU&aLFDnW40V-5_6;Ep8y9OR;00owZrYkzhD{(sgd6d_k7<=fuJSxerHT6tE{%DGK0_(_78$ zWbx8G;yy3@-Sy{&k$wd3vrQ*eszIusvlkT=P(rfs;uFfsdjnNF zZD;h53UvPj8J}F^VBm5nu2WUSfg3ThGu7Cb>-)G?QNj>r!q}DWk!{4$p;buEp?mgu zs}r7A)I|33kD5&?xyQ-&oj><&==hyDL0ago?1Sial!a^A6HX^ZDP#&PtA$xC0RD4N zQy)X_1lI)hIS<^J>AL+`@|l<6Wf+wQ1&~$-JYGFk#&QmSzF|7!Hx|<^&ik+I z16L4F?&p5#aEz$YgPyi!?H_f>N8Wv%_9Wq{LuKeTd!HE@;Ycv3q3(F?q>C+#17R$e z%l_i7s5}dZ;FUBXrGtVX zei*Fe%$B71#pcRd`#fTs|HwQ5p!v(DiJrmjpy892!Y&*FnnN)wOne zwYJQ)_D}Aj^O|bB3+^7JVi@fmWWqAVBs9v}GH8yLn*CaTmY+kT(EH?i4Yb-FwEx}z zGK)!j+~%1X5SM5M_7IQKX`#-GW^M260D+5ed_R0C z`zZ0-TShM3KevRJ^41PUsB4~c_l-SZPv&Oaw|4)}bT&!SCS3RD)bK}nEoIy!I7y1o zdq11RJyzZnRC#M6Cd6vBdJ*{ydrEl-Up3yXmv5W+C zHM!n<+SX~3p>mrOzO~k)!cU`UGsu$II`V6rx*cYkO0F`%-Nd07Bo?h&#dH zJ=4Mc^~+qkf1_BI&H|hg#4F@uV@%W9yaSd!-lp_(XvLDe=hatkYY>5)z5zV@8TI<& z4R6b6|2X|Yrn8fU(ulVpHb}Oe-^bN_M!&nDy;qj0gXjAA%_s{vNC(Y6_#IYu4;vsu zNub@k>hl*mQtr0uFBwR1E~QGA7&y@IH8e_zCn84$d;3?pUZOuPKqH=g$@==cdZ&9- zOqT!@#V-N*=whCLjLG^Ldl*^~Y&wrVd)yIB+`(k+5yk z3KNr)&eu;9O>{%gU*=Ey7(5gMwez8~WFI#z52O3`b|$xr{#tNokhd~;zLqVP8Lveh zBm0F0J~#Y8_bUBqUM&}ACqf5Iquz{Bm$Tc$-G*F_jxXI_Y)<}J0d7=Dqe5H!^)o~V zF;$dpqrz(Ts!c+Pf?e;WpkUI+kE7fqfhxXakJ);rtZxv~3zG=GEy<%?8`^j(A_`o*G$ z-94!4gmGFFcI%I(j8W2y3|>0W=np2iy9`t)hlb`6$)0rtuM`9v4)}n6xA?7x45^?u zm2$RScott@Te09zq%^vSlt%M_kExz5`WOSI-}w9j^;Z7HKghXnQbnXhR{V+<(qLbm z>(~KK(Pj_iN-{ezn)1FR@>^VIyB4?i;TUEq(9U;R+Hx*Bp2ahLoJg$#WEYHLk&6ZP z4Nug?CHA@~sCIYP-_2+d*%1Yku#c+WQil)EWN32iAa67Iah29R`fT*hXQBcuTec>C zpWS-fz2Sb0=g``U-8!}J(UaXzL<*+s)a<#ewgD;Td?gc0raPL)1HAi z3BYXK)0PicO=f)sy)?_UHk-RT4-vk1@!F5UbtV?Bf*{vJ+w8_UT`pdibpsM#{)HEG zithJ5D(&E>Anphp#ctoPcsMa}SjB_=Azv1?R-O1Gi!-_$ zGS5jazC2~hv-<=g)EA3Wzma{4u~|{aSI#CNy4t_T3l}e-ZZCnJp#so=QtpB8T72Cd z=OTM8T+S3v>H3`Bz%<BUK1)fU2U zdAGAM)Z{KP?QWrMAEpJ~ODp9Cc3SkxKD#^>g}jTiE}Gfwz)AO_;z7u!0QY*Q&VITm zU8>C%-cfEe4uEYJPv+Y;yvP3j>-0nu)vkL`z_e-XR*GD2jc&qUg>0F!l5a3g=_Yel z@?B=cEZJ}~`*@YZ{GU!Nywo}u_YeU&0zVR|tVPN_= zBEQ-4Yg9s`?U}Mkc!+c4Fbx7^7Na8S>8Mmge@{u_D*u@Gi8gC&-R;WWJ8{c!A&@4e zooAVFdr)_2Q-2sF2H4KDT(P6UK?hEHe?9S@N!)8$g;*3q9qRZ-0xm@-PP=RYu-tI8 z_n8vd@7gQ=$xnO%!2jRyQ0N^{STIRntfO3$V1ACHWAD2g(RX}UrU5NaotRvfU$B85 z0yZzFb(X#z6(*}qMlC4k$-nS&DqCSX)k{Q$OhCeT5Cif(o|US}hOvpb)|W|FWFPf! zt9J6EWh>INfbVbLYFUzsn*M$D%ks2WWU3h17@-3&+YP8|39hEHNActn`dJT;ECd&#OuyH|ke$l9Pc`UfIdPLNBy%@#scfmnQFkZh z(L4{>)fmGW5!6q}z7foDRrP%4GVtd94>a4w_gA4qUQ}jwMHBLB@YR@E{SjO44n zGvtxVtG0O4-gDh3>A)fVfzcTl1E3W=+&rQJKJv2Q>J9$-u6|fmPaC$D@@+BS()2UQ z&)qxkmAB2}&aJ1CmQNqC+I~1?3Huio^h4z+ur|Qk1#Jphcs2)h zPjSus)I}ef+u~L9@Z~99sLW*Ax@%{OVpqN5s!}nsZH$!(q?zuxA)cyfMnx;ggIp4} z$-h2ikWK3o9Qm!dyT>}<`Bcu=O)|XH&x)f>iZl*jeJ{OHiH1=?+HrOAj%|5>@IN56 zTxiPT_NIkBDE9kZfgqm-AAi#XinzXt)b5+;tZk>aZ~4$E9ta!OkYIQKu~o zn)4!42+5!4yKooIy-&7k@Ra~5p#nO96pJ$Nrq>Ee8Y}-IY{|FkB(#m^NrPeHu-jIo zz2-{DSNj^MMG^5F&6m@v94{aoJ(A1UmUD%(Y0|~`r-@gtaC_aC@2P;-{>%ys-*U4* z@nScPLmQ`a4amtr&Pc%Blu%-OAu?hkQa{k`=tQE;D+?(h1^(9;{$w5>-s8)%UOk5Y zq`SLbG}ETWAqp9;DUZE=J{GADosS(8^i(RPWd)Ch1MHRL8Val$Viw&oN7hngcZ52T zMCT+*0s)?>+`&5av9mg2>|%@;fysJuqBP>(qIulgF{sy((Z$2#}7kxS#RMQsA;$&cLZTlah3=9t&rbV=hQ}2U*&DT5y>e zP~CX8frMZC|ADW}_Y<@amBu$9c| z;KB?w?o)b;!j+0Gl0Fyex{nIAVA(o`pb)7(hpCL1ztQS!JN$gR&Mn@CPPv zW`@Md9zOSA);}!1oaK2S!r~{ZIY_}qake58 zFP#BF@QzDSn}XrzU@$Qdbv4%Y28So$Tqlw>k;Jwm)BHPUE!fnDO%p+BaX1Fukb*jW z;I_1Y@vC_}C%2u2N6rBGOGC|n@DRNu0b7RH=mJ$VjY`(O6m5cHQfi@GEqKa@f;Hcf zy0bK=XjcFpYRcRAFU=f}uq_7igF(I(a{CsHGL`#2^=H@aKQa-lvGu&mB$^_fJem!U zP&ANT7TgIdexRW6Yad>^HDiv0cob9Cq$#q1N}HeVbUy!JpG{6lVQ6Fous2I+-G~bS z&zOmK?QK2TwX9g1hW9p7{5Oa{7QbtaO8#0n^&^-xG&eU_ebjP?lNd~4lD^8row{** zG3wW^>9OiJsS$|hT9C^K~8gzuqq~6{kQ$up9MeEAdhLC;#p#;+^c_IQQA^jA-tLiw$-b7Yp5|p z({@rHk||+Bg9?6PU1g9<(6sOPPwxu1?0k#3U7t<9UtF*;5{>2F{Bd7J3$S^-%&az7 zJXv8WfADp!Nw)3$l0WMYx3)EKpuX&P;HDm>`WCTn@r>_HE4RKRo%ASRW%FdyK4(}k^e zE)D^LCXbXvPU$HWt-3K^1=}qmF#=GUy2b8qrWQs z1VDls_!n>I`q?uW*iPs~jaYw$T1Io8X_b(K@im)e9I8)%See7-aT0GSpWfl7FbRCr z%nJq4?Z6fKMjVn7RWu4;hEXAd{<@|Lf_!O`cn2qNtd{SRHK2Z2{hwz~9WDByxg92Y z^qJz5kbjFGysy3oCG9^5=MgLFe0F$h-Ar1&IlqI1`r97 zlq_iw1PPLJn(YU8@BQAp`v>efyYDZ)=RDKZ6+Ts6Rb9;s4K)P{)HxIk2BWy6cI>JnbnxzLvnQKr;Md=kuowM)AtGHc^FsS5!lh{>X{= zWcwS6&Ga-HvT)>6npkpgxJtr?VAn0DYSpBe)~lZVUEI~}FDmZXb_v9^!PHyIYrBgCqIbYi@{04LYO=^u4O+>3JpLv-nh}bhnkXOXNvGg-So$dhySdg3^MiQ{s6Tc^^B?~z z?yMrSU~S`q`)%lEVkn~ z%qkutXC#lc#I^hyt8ch07}_CaN)a(91k0T9Yf~ve(B{Z%biRkg2C{dcyyee&339o4 zrAtSN0#=9{^Lh^XcqqQEoKO)^$1q@FL^D^CW|CxzZ(31cvv;Q6OW))r#eO{biAIoY zQayQVqVCrggPU!Ru%Ky5;zQ%bhES~|E68GAB7Hk>BObro@7^O25K6ADo|$u^b$NBn z0!mxQjGt(xfZO%!4@Uo74yeG?rC~6^a`Sm#ZLFepm5{$n1fyDh{4v z!5vawctW998+X=Bi)iK^*ORDUjQ$NbeUnzD@%L><)sO8`iF%dJUh~pNUt@&=+r7Ub zJyBQ?=yLU#z7kD2roLkIC4;sxfrk5MJVTSpAL$dxx-~EsAs%knYCzQJfO)k^nu0GQ zg!c$E8hKbtC%bEfWh9601Zc%tns0(5db_lb7JZKwr`<3kw9rouaq5|-?RX;!%bb40 z);yH0*u;7aD2)_%jHJRmH{cAy@IZqe*Z} z5D?(M(2U`}(;)B<0d0(A%r!PQNUH3eq$&5$y{;psMgM?;GfYOXeav* z)UvTE86Pj!eXDt^vi_F=HomRLoi}+Dr>GUHu%eEr{m*bQVLZLKh@#ij*US@6tx!`Q z2^T7)$CKb<7sfFn-nbgP)l&(TV|WM6&b#Roe7dr)Z9=rNI&F;g=uLL-3Vc~8tm;M_k`+lI>7O;hJ!0kWW8M<|>TMaX( zAFwG`C{zRRVaf^ZV83$8hK{8bP{tBr3FMAHks$407cW;MSn8#j`2X@-+TfLD%2qCmcEOY z?vY?X42u&9|6dWKguVMSyGv}{vdu*Q_+gDJ*@GcMK4(+B%Axd3viPA_i1ne@2O%F0 zm3V_~gSqh;2?u$PHTL*W&6M}RrWC*39wTdM9`q50lm)QU`d=ZFo%!71UF3HF zuS2h5@EhY1l)L($hhDcNbSPF(wB?B_J&@-yv|(256?N|75;7KCaJes@#u%4LA$xPj zM3M-zFDqXlhN&aR3syrapOpndFn>!6@bS6hYna#iIMfvHTyjRt&Pz#kJLO6J-;F#Ae%G zeepf-9`c(JXn0xZk!YvP-{`I)TfcXv|Bv=|zO=Z`QU*9r$(YcL#?nfO8o)ztWJf;k z*G@6v)puKI2tFWc4fdte&ofbtadARk;}ozWS`Z^&^uFYrZFTJeqrXaYU)nT#(P~2= z<(@&^gd1itAWXa%`l&ki#Ss#goAuHHzs z)$e?JfJXsKl)@z3oTip?;9WFvx2R(^aC~*ZSjhFlxiG|cl9By$`*!+5vqbS(6tYF> zA=j6uYWFsx{X1g#_Jfl5eGa1^$H&$nY^mrssPa5)4L@8Btsn(HY)8mmw0Xa%Ij5+Z zr)c4ZT%bb{>ei*@FJ49UG~d%0?LLUW>Z7kDVIwkU|JL#>RG?gznAFFtb7Zp+bTY)j zBMcAMSH9R2oL0{dXcMYX^2>}eAMZ0yP4|}f)o2nN{DXW_OXc9r?itieFbGSly|qFZ zEBVSMx1igvqrq*@-l!>}>K#uQ4Te9nKAa9~qg5QP`DCpK-r`^%(3&@MAN|L$Xqcz_ z@u69R2ngp7p7B@-d==p{ucDb)b~T$!zZRRq&3!ssw(#4;?Bll_ zEc!o1U>KUq>*xr&1*YEfrxs2rZ{JVs{${(6@>akdmZgmMeRy^egd(MML}&@O-nN>| zj=kS}L3i80G?B6DO+B+k1fvP*o7!9rE&#vx+B{gX>!lci{>%HH>*g-PIm}v6TpFLS z=PhuV19UZ2*E3`RSIFBfh9s?zT;ANH^sS)1EN0qYEXV>_SHmtHHeSDC2W!YRcz8+8 zcT(m9-Tp)SKiv|g=I3GodJJ%5qUIrwawM~R`iz0Kr@suDnoaDGjW6Ln&zqLSA3ThI zkC36>ZgoX(F}6M90E`qqOWixtzkIK+RzlHZ0S=Qspb3I2E(j7B@Z=K+CJ zn@TV`+fcaP{88iMc`shm%fh1S$Z3wErF``7klklcFuvb+j^26I_;BsBe<|%Fv(s1d z{Sn!x-RGV4f8URll%koSzx4vBfcS8qzcUp$Rk~wyWyjMes`<=2 zZr{EOqIoSZx`}JBE9Q{UM}H7TXj1!=uukKVSSdgGAA|UvL>)M?fo^b}$9?(l^4fE8 z0!IJX+;Nq~8rtC8C;l{awDRBxd2kOGrH-P*|3;z=fhGQ|>hNzzs|u8hGK~|5FCC0R zM`8tO!ZOMJgr?68x*|A9%~PG{enXq+-M#BbZ!x?b(!%L+d+GOZgBma0$C4`O&@?6UUS`j8q4K_}6Mh*)3d{E|*{6znpQ861 z#)eH1@2YrGumcEADFmnIim7!dF{6Kbq|?}oynfQfk@L~_&|`a*!QfC8$dp|*!oQ?z z2##=ReF;usT^{i_lAdmuswcryG_?-kw3W?9_??FbkDAPJZK;=lpTy;Ar4NeepJ5)( zREiLPjX>Sv43pgQ%lE?$c70Hm>LDG5SyomDF72|65{HxFMb?{vgCVTgd_La>^C9P44+wu-qaWkSefK?0yDW16>d1u*&%~B@-}!n z3;huWH1u2Sc0T7Nx6E|~g$jqjZx|$KHx14g3|_fO`tBtH)vJRmrUT&h9#l8^&R8Bx zAxp55TjAo=gxA{J)2(|LClQ1ANK(DSz~o6cvLSz&A>IZAi!jWj*^7ap0w&NImGg*o4u$ z`l+>NVx2Qb%$!~8cM5k*LgnTCgpIAKnE`y###SL-YHz9IpiF!wb^tFub8dXWXrWT( zj9$sr_P0jjDy@zit&Xc_GimM(#g8hS#&&B!$5<>Z^=o4YOZ^{p6w4+HJIiJSN+x1Fwzkf`Msnn%QNU9NY%#w#;V8d7 zw&6;)KSG$M2%g35XwNxr&R%Xi^RwV>)X@0Ohh?Mgkjc6Otl!GyYVB6F2i>4=Q(jB^ z^*4;Bm_)~fE#E~@yv8^eeEjmZS6FpN z-nrpxe(y9qI7bk9$B&AG-aeA8YyXX_ za+2FV$8FrcW-ChnIUBMf)mMq2&a7?J*mFiXh?f^kv-4Mp9 zg1LS#_?rTa+LEXn=3b!k{-0%&s``!V{Z4`F9f>3GBHU1zcm6LBWQNXw&{LGuwGq6S zNI+iwDlEb%ZqeuL6~FiBB`2pxTB)D+HlKDx+xE`AHrUGEGOzIyv9{OKk;VK3(Y&|6 zY_7zyh)wdddS9k$-?LV?-B!nKy=oHCIwBTz2XFUWx2KxK!qTCh3d>tFINbI5njFwS zk(C0O&fI(BCgCeXM5h++HIZrw>8uVPmZnZ5WU^LlNvaw-)mu4DSlJC@y>L%$EWZ8p zrg?r7pg2W>zxUkN!!r`?EE?UnpT+G5`F&R`HzTaxyG=zfSFOC)A83RR58<~M7CF?L zC_sS@N=p)mG_t~@eiY?)!~TdQg)9ph-u)*Yt!vA(db1t#IA-+s{@K@s(Qiv-GCvNO z^j;I4(Pe!C3Jm{H|KTSA$yZo3u+F5eUx?Au5z9+@tRDToKg%+=f?a9Vy(0VGIJOh& zPc+PR&A$TS;uKis()&J(>njEM9`pJZN5c|x(6@X3Q|as%?5-NSh?hyQQR43~Bc>qL zg9?KrtzcB5;ZFbo>86)Cha<~gPfy_ZZjX0Po%m?(=inM$vYwhBS#N6UGz1}8GJq_s zt_M30!6|_uysi-28e$nv89u=IjBf9PJsBOo^byUyg}&$IOFGNl!+o)>;?x?fuR*-A z%~KM*npnn8ZhSq=j9W4upXD`iSk~}jXYVcZ0AtW5h3KKuMfIfpvTpI(>$PWYHuHo* zD)^-LXMQ_qiFlsx?V*{>JMuceG_=w9r+2e&+#IMl9QV9t>5811(au?Ht25HiN)I(# z$wL7)K7qVCt>%Vo2$Q#m5F3B$owd!Wy`mY_<*zojp~dBc;R=TwZw_C(R&9%mec^tce}mKUz{}6flR&lL56dp${>1m)x|B>^9=*RXuYAMYp&pr~dN=HNvbtY_ ze3n1rH`piAQLpUnBiA6RgZa%l$+{>lh-LS7?w+?+4Vd?} z-DPez?s=AIjDc!31lMl=x5o2T>HOVOx21x|NGEGmOzom>xoEg;?})dw7-^Q*zDo&35XZY%+V#q{)(^g9pVE zdfg=*6VOVU;{zV;xN@zZafDG#we|0VR&M-X2dr} zIkJfnqTksa(;iK2_U;uO2yC-jjBj<>N|=(lA86=5te003ee!o|K5=RfKMR*>eE;!j zL4m9o5C+~m_o@RIyK#>0k1#(?!Fuww)W=tQEq+g_hO{!$S&S_*7>RwGgn$aACn;Z> zw=fZ+4k{@#QUrB}ju!m|TRHe42H($jYxGnHJX?p);m0jzU$#B~O;iy;zVvbaTwX8; zgJU0Zv}lEgsJ3Xwe$h34)?fXV4DZgcA|L9MYE~_LO6&vI7$L?CDO`et$=7Z6xTqhPfa)k_1dQ_55ktN3;6nY}~-k9@hxB`^sMCkf8P((j# z-poF%?&yg1Cb4@=A-U<`)35xEr;8aTMW?JR^!i2P5}t8#F$X221TtF9Rrb6p{p<94 z!ESKxT^c(NK1soXXSi!cj|!V6S`P%n6a%@*J&Kmqh=Jc7#hx$;bxG9E(j1eb)=BTO zY9jg9g`?+e6Lr@ zf`h*d6`9x14o3^=w1)Uel)m6wTbhnfIGFWL+QK*cP{;b%0mWgo_p|Pyb?fGcYX)uiMFb=9zv2Pbh5kWHBxv`lsbGJHNL69lE?)-$(Ie zy*ZE)zr~^JHWp^BJXRcAZGUys9w&vaFZswDTZecI9T(b5nVZ3`bcJfzROzR_16YNK z96{6PB`ywRj;H*0F4b+xWSeX$PXxZXk@w*$Z;EUMVC;9Bu-V9!QC!e@UQ@A(Hkpc_ zGCO0U(|jIvH&&AZ2g}@Q{jClWJA)V6O))J%d<2jCHxBm#nY{k&{S+2=vdqrs{IjESAoZN2>n&xEWiC&<{z5RJAsbzd_L z$-tiSKliK(Zy(0Q2$IRuF(4B9Z>Wutg;lepME*_4#KrDi@Mte&WU66KsCakg1r|lu z5KC$Z(oRUHaNX(y@8v(zMPEOxo$~#qEw<^qJ>254#Mr~!xD~Jw{hWJp+SzB;LjUiQ z1X%J4GJ|f-H^lOCm-)^qXLTrh)bwY`p;cRKyrb zodu=6I`oW!t>I)12J!XGxxQ`(QvvwM=83r&v$#_ze&r7Cnx;lxJ$!+UOS^ z466X=p*Pr$A#3Mnh}_Z@0o!wuYw&$X$@b-{!wTKa3WE1uRHn(6xbE%m)Zrm=RSA@n zoHkNgYvACY21=H^^5Kl)y`A{#-2sZAI^vo_4bYRj5AvVqrK@kJecCt#ECUoH@b`YU z4&18qQ6vLs)&ZfmzfB=-i#HgnM5Yk8zx89$O?U(!O$!v83xvpvdLytTtxW5X>=MwG z*>Gltu7L3|*iQ^Z&0l$5kp_5MvTfHFlp1Y3z4nETPed(+udm&e#oPz{ywr3`#vwt8 z7i-#Zmy9S`N#_hbI)*Yh2bC7Vb-D;p$2JMB|3dEak!>v+>>nD8mkc+BN%A+S!jZoq zw#zm(t$b(I-{a#n( zV2RsWeM?goa~T{6mKBxLBFZ>UlZnpJrdYn^p81K;tDeB93qZ>sS>RMteyt*Cvn`S{ zd>5PeGie;~d-oqwU9Sp3pe&(Mt>?FJ#nc>Llo)%4?7>@-5kcC|mAXJ}8Ze-2)HS}M z*=uP0y?1IK)22eJ={kKX(=IH6CLsghz2$+qYA!2!j8>pK81L;YmiL&nT5K#8YR)c` z`!~x5A>*8uci$I{++a{Ee%4!kP)K;$O@|c$?}FXZn9|o;7)3IVi}o-0#cmC$*MHxd zh3;IaAtRr;#w+lNpK0KF$!t`@ptW8jLG3}Ir6@6|P=L?m>GoIC`v|zqbKSbQ{GCmI zj$gnvh#6{d+JFw|waeYkSKT-L$vO4!KOCqg^cpq(#p(tkhYFcHB<^d`iU^UX zhvQw|19)sv%m&nFtpyS-KWItAwj6e+I&*08if6a>y#KZ%V6N19^E@aW8EApX=*JeS z_N8jezvMnz;~T4ec9WZ*B2Yq{ppEBYVs_#ejFG$A;wun#(W`D&?O=+gs7-p658AQTEA zlHkuXdWY24zb2YDM-?aAd}LS@Ab0S{AFP3{kM5rZIL-gX&{3wU?C!^UxmO~UG&;6F zrYGeaa=Ahs&#T!vO7k2v(O8oVZ6td5q654(TU=hUv%AgE4^Hof2bGtAQW)x~7}S@< zEqWL=U`tElOlCbO${7zuKCC|u1$D4HK*g_Y*9^h)klkZvsg;#FGx1Shes`j7af78+ zLnTq`=Rz9Dh^=`um5Ntp{i6Pe>;ALMTJZcQ>4eX=);+x9A7!M8n)lZ0!bh2oW93I3 z$$*`)Iy%rNBs$A0m`+jnta*&jxu_B3lIH;09w;St+@gC#Y~e?`R@QFqn{F*^Pb9g2 zN+p@J$C}o+b7y7`Z{O*so=B=?LtW>0^-+70U#Dv=e%yLDt>Nysg+r9~ZEynfyi)tY zg*hrqL>{^h{> zscp70x!xi7R%B6jzYZ?&4G8|Y#gDEg{Y}(aAplw?u_kG>h}Itb*ZniJj(QbI$i!|obq7u$Gr0AY9tJf<2Z9oL%zGuFlM zfJmgx&^tSKsmPGieI;c#?>7&sopx~3v)tzuGs+UGW*A*xT?uI%z{ogKnf&A!F~b~| z)mx>WV|wVsSyJ-f?iG%jqSijmuDWKf?=kre^PFV<}4Dh8c*sq2l= zCKGrO|0nq$6o=Wg=E}#S{+R_}Lyr)kcbBP=mRu-pR*;FplWsoZFIwL3cC#I{wHkD{ z{Zpy&cfbV+T5xErJ-Wga?(T01W#X3t+wYzO)mwgL!zORTuClC=Ur*OvkAP0Az7X?u zPPt68Wt2Ba*l_h>C`_qD<6l^Nx!Q+XB zVBgiu;H@=cy}Cg}t%K0QV=X&_c*kgPs1zHIQcp)qmdWf$`z`gEHL_obQ8o_?N|O~t z1dmeqoxkwWUFU9rts5oxXm12zU$O*wZ_VXEc$Ba}hWynSodYZx;$G_c`pZ)*?ooi}s zwy=>}QA>hB4=cr_-kA*9e!{UGMDzh~d%F#v;Mxllpwi7tDee0MONeGi*lpTF#%r zOwD@RI1mlzX9a_PgGvI*j(QT7$Tw(S=61#yd;vv4W(<2`l^NJNMU&I$6*h$v+iC^s(J%cai$od0N!D;hH z!mf8xzWHn9o(EzPN{D}Xm9wa=X^tz*2hdm;aMukYD-9yv3SyQX;S7HnZ(V_~ks@s# zF2g`4KC)yOWImkLEq=PYoG5_L%c{ z3eg(FzXplwm~{ZMv@#Kz+tHH4_?cWi=*WF8k7MD-V#*W%lRVJXEo%Vrjjkr#?7@5P znEEM|J0RS#(H(A7GSx0u;B}&1D^EHAR$ts^7MCLmtjJxSBi@pFOEQR*Bkmmt6@O9H z14)nN68#{W+kI+g=o@eUtFc%OcecOVtzq8!KGMkA1fqzH`cKvlI?A29pX`x;4dqt% zgAHUN{JOR_x|R-nHl^*2Zd@rAly|Fv?~S2YR9|lVxwbTjlq3lIcnNn@mDya*e%`aw zH@X}{RZ1K?D%SpxcKQcfy8~O?Bc9rEyY>q8kVs+Lvl&=hb!<21!=*VCD$M{$*U`s) z>9gCZwKn{O;EZ3tv)Q zzgX9TU$WfofST`rio|m068iX$R&J!4Z^d6!5by!D#XDfQjtBEHE91V1-~t`ItI0B1eVkMQJo_kOuA8|b&WKK9|Sg|X)ajDcoso}2k?n8;{P44Pd?pNL0ZP18fz~W&q&%g> z%x~(WYvbx9+n&P zb}%BdwnnC?(uVIw#?Is;)(c|&#>b&o83i@scL z_2tj}LM>>@BC7^``}^8tLV@sSSr8>r!#NIHLq^iApy?WI2xfXx#&I|T3qbFiz$Mp*;5^7b6BogFa z5Ga;e|6~06T|@F@^nh8g`NWJl5nwI|FhK9xW*Hgs2}4O4oMFrXvPbSZJpa3PIJkPi zfX_(xQ~4@p0}kke(5Q~L>ECOv1ZOr|abI!L!Mk!@+AoV1B9-@t%O^+(5s++D}}0&IZ#n($UM@EyP4u_w2edG zu_hz;g{d(XKsmpL3|P8rQ1yceQRNcAxPORed`nT_&pEbs8X8{u_gb8~5w>vPEgRLg zli|c3eoCj~=w_-0q$zXkeE~+B+^eN3#c&(hS1&ZsFtm=gOBAWpwygpUT1 z*`o35zh;07&p}cN$pfjbE@~Ed9)uP>D&x`ugbRI8ye4T!gvB7jLkeZ9!@>1;$>d|6 zl#rTkBG&6njv#*Q+;1NKW~cLa^QF;glZjh6>IWZHZ4VNFswWpx4LxR}%m>vp)Av(b z3wGV;4?aSrupl0o7?JZCjN4-AMx144nfTkk7UE+Bnk zTJKw@&$#sD7ERVEv&@h{`icYk>g#nWutpkA;Yu#OPo#v!{TBS=D>iwDk{0^GM=11c zyt%)@oM>)|=eoluzXue*BHZFaXmpu) zYvCIk&r_*U~>lhs`^-eAh$SY8la*e zV5cxRBns=y`A7$|-qjElM?M9TkrY^(BPBOuz~qK`lX32Y8d#BTac3@Q(gQF>rcTFx zAf&Y?U^%SJGD#h5C4;4MmE7Su{R)^&ARWcu4Kn)cPssQe4R0?X{Y%4L?;)wVPUcLg z+0ouCVjhzpo^J_6AwU2EEAE%>##BfTq^4O5lfX4)l&r6v#J>h0jktV<)l>m0R zZh!L$p&fjJEO#CF;MTPt`d?cLAPx_L&_CqOzZlMQMd-o!-9M{?m{GC@S_8H~h3Os@ zZf_ByONik@{i#ldar3b8kd1U5kd*RN_GROONrG)tyJTSvi`T5l}t&@ zdh$xlI7(B5__wayz%9Gtx{RnlS`b#L#FPH*3M#a|6_&@%lOn4D*p!RnePzbK zPs&uROaHN7qHRXzDRWG}C(Vo=0GkqMwQ-HMQ>~qLcVYQclBV(k`#TlqKl}-b#6LhJ z4y%nLWchBRAiLLJpQ#x|7+OwuxbC8p;dBNrl!HWEyxXynB1b?M+nIwnNtQIRAg+o%QaRM2`&k@W;F z_QNP1cd^P;QA!OJS;&T$1eGprCd*MvrzGyij$zAMn7y8eY(oTA{FiX$3cQ3v;+ z!X^!^V8{~l5)k0|<-BZ%;fn!9O7|tIZS=5XZDO*0c1Mp`ughovup^Pjet~7+qWdf`%Fwung6-E%9d`>yveK~-!`RrgwjUJ zpocvHOl?qS=>y>2zrm?UD8CuZoLH(z=qp0*;H!GX`6$GBfx5tV9~Uu~hm0!a!W1qY z%4WUWaaSg$Akmw^4`|Lx$T=lVNAL)C}^p(z;s2*MQLJAgu>?2l06`F!a7&N_VXj5cOjLTruHhhPg|qcJ+moG zuD}=l825Y1VEs)$Zv$7k2Jq6h&qQHdO0ZCx1JZ-z)Zst(27@ai1`-?Q{p?tFe*Z0w zek*P|D6ioGm-kuEyXs$HbAz!j$sS$xkoY8}Obj^+lx+&kMb2??GQr78)m)#uk}fu_ z6n$lPHE09-LId`|)Euw8p6aR!Yz&rDSljqD({ImifEyDq0|8?8GtJCi`3m>z?tW$u z8*?9-#Yj^Uk7|Ol0UCkkG6GWDNf2`&j;{D2saM7JH!mEynE*ghLzdRVRF#55^+g0a zpm7PamaGHGL<04_UP+{jv?b~VnO{#AsjejYJnv^V_|4ViM-#+XG2p8$!`bX28ckXL z;1S;$%F{@C9YW#2%pzda(sH+>C45Dnx!{`70qwIo>@2j5v5bNt@yCq(U9u5$q*r#NkSGI^6E(mMD&N2Pa!3QLd-<`Q_ zq6Q%ZjN+vrB!e5Iys)(2xF6S-2rM(7hh#-ViptjEx#aV}anOBMJ4kmR#hV;$QUU2W z2Wr?Mzr<$J*Rtf5-D*b!ju6YhGARb2sc90ZeVkyJe(lHGgZBzEM=Oa&kbaB?Cz|*N zmiQ&QqPdF_3qFFz2jQn6IiaiHiC&(lx3#`pm&Y$ez3&swvUl_!HZ7bFzj73T*}%qB z$pNOu=p)a_0L)9edoak*$=zU^?S3Z2dVj;;+i4k%dnx%N7vB`TBni8si)nY`Qlb&715#0lq<-tQqjG zw*>PlF#JwkPwD&n?4Ku(mu+J~U^!{x=O!*T88z~IYJ2q;O)DqCVkJqt!EF~c3Dk*8 zdzdcJU$R&Kw&pIq{`s4p)=YU`9_Q&?xB+NWP=I$G*;gJfk4na~B{0cD=Jkq;4g@9O z`eqqIPp(1EMdqVke$I^?FM+K(Y>v5|q0zjXz}2)L`9F^WU6YA|(a9&<9exvCU0?odv6Mt( z%V9Pud$E4O`_jm^(rApU9K`oU;A}6qnW~SX$H*yOV-gFF|6a=%Z`O9TJ5pIk-<527 z=S@m5B|Im-j0{|dZa|)B!|+#yh51y-=huPdr6eNo=2Cy4vxuV^j6#3+ecAgZ9SZ$Hc1SHe zAb-&&y*6$8*#zz|DtrYqriWeL`qegM2bu&%z+6K)HaCk6DlS!fqi;q#w0vlmf@M-V zw*0t~16c%0&K^dtsP*QMa-64V6@(YpCa$oNSIW#A#3h4X3h?>UH>2jmCXbT*xgrgM zm~t>AGu25%g!^$6r2t%Wo-?dz)7g;*=O>zAE>Jdfa~8)ZzdN}{Ug@jmV8Gk4Z+CSH zzpH#7!O^unKFQ(kX?(L0{TQ;%9E2&(*Uk-7nplt?=Nnma;z0^!?$+2GQ4$gH4s!Go z$SG)ZIKXHW8vQ0mb)e`4vk$Q^9*mn>H{L*-Lv*GA9bwK;8;sR(V@MsierRalY2BLG zqHHvAe8y0x3BBe>hjRZ9ziZd1#nSo7XQjGE@0K*$XyH1qF2AAM$EmAol7lmJ4rpD2 zZrYvpP7>+zQleQEO;7wtU9f3s_-psEK*L6ps>WTD z9~c2wBFU`_Y+Xx!%l3-3llZAzmoL`Tkgiezj?S?suei=Uf-7wBc%SdCbv+1Ad>i~R zxn7y2v1AhW)(y9^W%i-&_dp>Dl%L4~ehD=*&;bjTrx)rt7CxdtJNUQ96o%Bae!DeL z#)1chGMJ{;|_q&;iS z`v>!WocM#aYysaNWh~pRQai2m(4i!YX#*_stT}%IxCQEx1NkYTfk?pd(~^I30|0tR znlK=`Ty#eYKp}`7StzO5_|v=1$hBfX|{KLKO%}Egzf_^hsX`V zvj4v&grbwA>;E3bvL3yi;)(xyVluANVc4lO_%`ehlSX$C6gePxM3H*O3c(5qzUhg) zNj-*v1}iJ(>Ky`sGk>W5-nHUe^tS;sU{ z+B|4gCnDS}rv!~zl~AbogFqrn_H^LKt`fRS7X!tIEzYhq<;@8M#6ei9y`uMHYUj>UL>gSDA~ zDTYz|0ZgsKQ8o1X2gMP#lTQY$T_WVIqXytpOIaob3nJe_^tbRAys!K3W$4QR&NjYfa53@mDBWrz zAuCCbe^$w3-l)x8n3)Krb^zVSyzuKRA&kHTKgH zQR?TKxI*&I^CC9C#t%@eJEs4^vrIsba>XnpdA<>=cBL{~JspyDF1-^gh#) z9P4sIM4h#(l)Uxt&cTkW>p9#PAe2H_uwFfwY*}y}=o7ACI z0mc(spKfuczUeg6&ey}@2s_nUcHbk2KWQyqI5SaKHb3@97r3ggB&j&19C5QMc0 z2>D4BJ<50vUY$b3!Qk@<7B}M1l%_qx;BT36^yFC!>(r#OAbqShE)6}*$4_Z=;LS5# z$-@;2*=xhltLIo(DeR3VmBoMkiVoBDpq_&%-m7-7Pw5dX+(5kxANg*C{1ev`s;z&X zB*&4qr@S~%A6ZosNu%Tl3m*!erX;$;V|8Kc`02PTCXR%u0XNc=-f4V~AS}=6;h~rl zIiIWC)<0gwLpsIK9yVh8yIt28nBpv2Y00`IqZ-GbWA`QJDjR(*dt zSvJ=x01f8#j{ru^7bZFCC(E~fI1BwQq&ihImyWakQWv)Ge!1bw~wGhDonea($oaMyHGgwQx z;}`biZLf1(B{pnf);5nHO7BRpdOXFcVZBS$I(LrUk3`mt$HPITR?ZN71YT(9T zzz1Sc0@Y5)Oi=Lth53e9pG?`vxnWp4LtpDo!KeFls|zZjuKO=jLW5J4kG!n+E~|JG zo?QH}?DttzdNJI+`fhk z^Y+6dJvhQA?N_T+Lcf>zs!dp_wW}(5_2XGM?v0Z~3XSW+z<+mctKBNNVfOTY0S_Gj A6951J literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..69ed2e1329eae176586edcc74305aafb0f94fe2d GIT binary patch literal 5177 zcmbt&-3@{WNJuyg4Ba3dlF~7B%MjAi&5VF_gLEh=4L?aiLeRkx z86>3Z;eOZq`~}a4bM{&5x~{eN{&IG_($j&HkuZ|r;o*^~tHBIzZQFkbeCPI-pS&Y} zYw-OH;847VDdyjJcr=IVu%|{r*0^E_!gzjuIPx)m1}cg`oC};?BdtWsP|l8`^M=BJ zM1ywrRF<5GQ^+4>^L9O)uM$zbfswGdz&+BJsC$mS4thx-cJS+{C_*v9j1@1OB`YNT z)OtXYYfv?nEwV9atF&$83>iN99P@OKu`*+OHk`jnrY zVPaH$XWeHz-r(L5e&;c47$?vE1l5{HOr z7aMi?3Di{w9U(9NiS}LbbF}s1HT=^5?z!s39sInlD~O6xb0o9vd&x-Ba|oKvx99a| zt#JHgdW-M|1Il#zPn_psE5Y#P6EJQme?WiMvO?>XRDm>s%+D{DJ9Ffn$s`AS8a66E6!Pb7^HB!>Bt_dN5{k{CYV--~I8n%VB#nZ)QUn@U z2d)O3nTis`gVx%(#GNn;7*)0W)|wbay)4*U^JEFkkIqc#eCJGy&(mfcWE|W=r3d9> z^6{7!B+ziF-K#lp;6fpFq&AmJjBm9j8^)MXRV7HV`^R?q+FPwX@^LFkQ65CH_Pvj> zrh1Ich|pc zpM$T=k9FtR;K`i~EreU&T=8pQ#hrL2qn+AO+VawUsV6TChPeLh$Ahi=Jh{P3XX8_&3^NBNQ9*D@d_(Mje3svBqLR$lrdKJ9JYHDI@h5TXvV@n?J5D)7U>i^{-PwNUDC(Yl9?2(Es5kbKp zrO%u3_z=>0BG+cWD|L1Kqw(TmB}4Nddg8qQo&jBuBBRw-iK;y1@0$WmN-Z4cT2K|2 zB?E-Z-AMOe^`8X;C{IshJKeikR$sZ25uqK~!f?OEPMOmHv+jDeEP9N>zzO@mP?jx^ zrUe)@5v1+XOy5yMW-od$;URcTW!g>DP=vq!YspKfgpNQHduRB4@j%p5=iqo&!O^F- zr_Y0e%zT#Mxs&bgU+p?(%k6DnZqC*9^YgHafWKQ;3 z>bpIcz{nVeg|$%=`{3VoU6tkzeoYg4 zd+5?Q*b>%Wwn{VEs&_oLxmRif4ko(xdy+`>aGlz`DCyc?as)q7eJK>Lf0@W;mr&;D ze7a-r?8F*8`^8t)$~35cNkL8S@kE?}n|7*(|5?O1$2+He3n`xUtq|^zA8u*Dw}@m` z`jbfdK~VAJxmHp(YFudVy@?^0p?n3^9)?83CzL53imUs`t9k7~^1Aelkhd;Qp7{A9 zU$|*t?HP#q_mIF3+xU9~`VUj1L?I$2ewmF4k##NfSxQrtig9O5n||d~Jtu~_AJ^j# zN-nvHr;4#eFxCK6-sxIq+#J zkWq(;dAiq1W6#!<_aRQ?<-X8U6D&-{nh+B!R*+x&2B)^}s;K`?rQ%KZzv~vNJr?w* zj+39aWg_P>dt=mqboeOQft&nbAse0q1Y}LU)q$lEuFavnfp8a3k zs+hNw@bt0xbzb^-@<^5LHKIZEaMc$BV*)io?a?XlR3nm??Ie?Ay_!f37=Re8G zzPi}7QLg0Of^cnIgVv*7grJ_Yt{5*Yols)y=gBMFc+jS45)7DnT)J(-uE~Ao4kQD6+Y8IR0$n z8vbx~SPXl}gZ|XxaYp97r4EM*-!%L+$CJ63P!@ek_`K%N{D)r8FQ;je-iOR`-NtSZ zf`0Bc#NRhgVrLpvg_twTC+7;6{zN-12#1xuAXB-o<2UZg=aWbVo3B8ftR~lY3+T9Y zwbJoaTciZh!k;!e5&`cAC3+e}gZpzrxuu5D~hR;n1MyPAS;V&kVTPq`wp(Z{j>g zV@|y=GK%63ZsTC{h#hy1`ieH*;YvS1<_u+>fs_pPm(z0Z{_e^1qOyhsK>eQ&V}(1} zwdvd<)Rb-`RDfvFzQ3YD0kGNOV?!Kz$kkBa80M)v;A$c?Y)8l)Q{9+pyN*H-929QNW(J9=?k zmHoDYpiMTD=iX4a6nuul%;sai6O&W*pQfSqMoKYhya&S^>zacxMuFiG#-GGtpJqzg zS2Ht^p6ir3Yqosi6)k)>)oI^%iK^WMwbY@yShALQ^0Kz}_ZCT?YN(aB2rm&7^HqowC}>qO{XwYdqctr) z)O&p2+&X@;^&FSRwtMm8+um2=2&_8hh$CGHaa6OG_~evX%`v8gaZ@qQ&jiJz+1t3E<{E*1nI&G4%93&KhxX7Lo*

PnOl2u` zTJ;V;-oxh>n)xW1UPwU{&wT!=F3*^VTife*Bg5~tzv8nTKLGzT>xjTpbB0BX`S0^J z-vrL1(N9`@FXBig(@{aP;R8?`;A7I&;o*Kev!o{Oy-N`_^eqH?a0I}GAIA?UBCH}( zS7?HH<;l3o4T@^SXKcr<8&Oq8Z?%mFQd;P^*J;k*z1!0&qP6;jAEDddK|S{BjmYl{ z+1~345nN3NC-}4kU|||6yc*YqJ@~?C@Hq4$t;sR%*D(80A4WwzB8S#}g~vOhEOC(f zqOZlv^HL(r8C|2a(+9|L{ii(;HPh&Q)unUYK2}p0Iv84(o91wGSsmHc61f`iIN>mZ z%oyUrGSCZ=9k$W@r=X?+FOvsrj9 zm^pxnf7o&(f0lR*#y*G435j7Ne_471qnd^Vaa_}Q@YQ50T!AcShV$k<&h&U>3_&ZY;S|18&;A#z{wfDgE)P(%aN<_7m~ zJF1U{({Txp(&u*RN=ayM*eT7SrDpUCE6*vg1Hv&E^xtM13w|iGw;}rnxSq`MDCj*8 z*3i)I?UBimJ1TMDyrpYCL>=c`KK|L+w`NKfsKKjm?;(_h%t6@nL^w}lj9Ly)=9X8R zeTAz}Vl#l^!oi-!Z$tahC%rqDg4fFIS;+oAktZyb6#i`j8K7*1#`imoWvkVTLZE1X z%KVLd2^K%lTu@b1pR@1nhj2v5<+iFG}+aAcIo#9ao3RAjSj#0p{Yot4r}o;I62+`b5cO?0M=Mo< zMQESruDgJEb$_uOZZK$@*;3eo3Y1l_Oy)zHxeQ7b%(Mn*Om3hPi7!&0 zWLzB3=NQ{hQd3b#tiJtXF-Xg;IuE|k`x&5I-eL_|jHtRo2Jab{1rtJ*T?$Q7clxZ` zO=)kqZo>}r*j_?^QXg%ryTLbCa5JynZjDxQ0gFh!uXvl7k_i=wbdL!MK-_xp*bePy zmU6ApvIISzY<`4aGcQbl=4cE0HraK@obmXbpA}Y;jC-^z@rDXahGt^@d!}6KD6L-h zb5r_;M?`TWQZQ8hE*ZMDX7HsO+R)w)7>8`6ckRtMZy{=Ud;ZIrAhTR7-RKT4jJog! z7anw}oSq5Iwq>Ujglc~5fJN{L3UvglJFea6kh<|EI<}Nj(4uS0gY8UL3yp(7CAPI41ywtD4GI@>z2q{IK9SV z$$Fk%N*TROQo@2+@=1LD(bHHv(Mp?QJy?(#!Wqx{F%M&@0lr4L*h%mPe3a$P0Ukeb4&5LTjHlO#AEpOj>eCE*iw(p~g`VNuZ=Bycc$|Cun$ z>=BAba*3)_Urrcw{%~S6_1~2mbli&#QK%oA8}%TX2^AonO=+ry|5*IPl4%GqOufwI zZ#a{mY#7GfK>VN@Mst(a4$gJF=gY!XYb6k_Px$MM*?KR5(wqlTRoFaTtc5SyruxJ#5lmh{ImQq}5*7i*lSBS0&lhDtn>SUN+1T zXE|;wagcJ56LQ%S7t%T@R{3|>&6r&~nkF%3)@1nVclz}{@AtiZpMb0-fjOX#-<1l? z3&`553-O1Qssl7T<6t8M8^G&aP13f#ZIP2p2v0@QdQ5r#<-+M4X=S<1rneicBf zA7Ub`p2AQ&h%K;i4CfCZ2!IAVSMa1%0ZjG6)+IbEkdK3}76L2q_(kx&FWU@;L$EHv z$sG)4jQNWtc(X~%1n>wD>w!ccbTpg2q)ph)S#vP~!mTjg4WnH~`td!;7s2O+jSEo9 z4gmdIcg{^fK?VP^(f&_m$zUV|83_)qVIb|inijxJ1mq~Jox#|y3&3my7Nd|lg5;qK pK%gEv{gAyiR@bTi<(U3-&hMTBdSeF$zWV?G002ovPDHLkV1h|gtH=NV literal 0 HcmV?d00001 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..025f873a3444e0b361888442eeaac458d60010c7 GIT binary patch literal 717 zcmV;;0y6!HP)Px%he4A__9FR^U|#tt*=lRNzHk ziBVC87g5?p7S+0pC_xGuR9KW@kQFFignh_Dr&v&GEnVBDa0OabWA@y`Dw@GAh3G~NBU z?EeR_d_Jts28RviWrE2Fp)dr)@H6^}za9%giw`~r64zO(0_$?&U=ftA1iNkW4{UEU zG`-OPFgFt#OJHA~@~pI3-v}&iRI8K7l2*WIfX6P_xPRdnKo)6cY zaI^)^w+n&J1F$wnjEir;Bi{@FESL?O9N>K~k{2z4*X3dy2trl^{0PkeK%$hj+n{>0 z_~+g`*mGOE_@opgfdRAFx}&wFb^^pE&V@9w@mv zv0uz1C4j{Q=Ze8y2xetnN!ZC&IPpxvG3t^M;Hnec1&Na>OY+qKSj}KFgEd3#0To{8 z`8rJi8yzsm1OwmUsSC0!B5`RG+_Qj>7B z3NmI1nF0@V4o*c@#7Y5-Re?DUK-pmUhI9nzKLWW{RZ!WGthlUhHm1X*Dp0lx@^jP< z*W8_agQ*2b3P4L@*_eLz3>#00000NkvXXu0mjf)B`!@ literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e8b6384e47e0fad28441038019ff38000f37ad0 GIT binary patch literal 15406 zcmeHOX>1i$6do3Lg`&Ydrg1^ks2C!OXaX@Y8Y6#PFp5E=CPa-&)M#Quh=yRUgrgFa(icaXU=!- za_%|jo@!bbt(%sVq)D5sjqI*z12j!bPFDAQduiG{dDgFA%lkf>R@ht9`pR#FL@3mA zX>1F=(MC&cl!_QDX`IsPyu$fT?F}p#2#mi>|4nS|hA$8-TfT~oPM3ef=Zb#!Txax4 zhbj7_o1D?lx=YbF)=D3AkL?@t9|d;J2Aa>QZ>;$MSn?9E{0(5@mC?VI+7(#+9&q}Q zqBs6sJTyAJ-iJ$HQIsck0_oQSlY0QE-J;X4{Se5w9hh`2aPBN{p;^)E-;LI8{Tc{V z0l$s|$eX2bEU;|2>Vsv{59z%k;}|a(fB6ikE)9~}{@I=uncj#m<2GRa0GZ2!qJQ9)2$+7Wl|Fn87{Al@bw}1 z<%@=E&i!Wov_I04yvL9&_QAp-0Qm?0Ghrmx^4<3SHuu>Op96W~D~JzA+JcWl&v~`+OKsW0 zwDbDL=mW>IAC%nU`$vikTrAHSCy@}X_NLUf;w17~6aC*4W3}NJrxnU|z>|H)ow*nY zVkB0<+=_jimLc~IKE`d;(+wgAG53^8SrQ4mE((R^PnRz-6zlrsSnv!s{JhhD^ND_Ty(R8S{EUO}Jl>CU#)ygWvRXMWvKH#3?1BEr z&lupT16K6ve)aqQ$Ir1~49u<+o;Ba%9qahM)cD@-PBEv6bVS9%8E>Y%b(N~kdo})J#J!dA_r^1V z*~b0}mn8BNp6RtGN6YPb$a&BFEXMzI@ zKjJFfLxc9d==_T90O!25Uv_2Mbx=nYYPtV1_d0MApxt9Fl(X(%W%JPfX|1w< zaSy9wmG`V%@5PJ6ww3e!w))fQyUcrm^50~h)LT)ycTd|Y?=`{i(VUxlBf$6%bN}pO zh#i(hbj05IVxM@JFT}hH`ZCOsq24j(v33~0e4s{bZa4GIqRqEd8EdYO6(iLD5-|6T zIWJ{0MvSkQiQm9In!2cDC2(*V@VD$G`*I~uE(h3?rTSsV3}Ab@%Hc?aIBK+hx%A!} zJ?3t|Ch{4i$|rEQKjJrLJik`C5Q&*T(2~c|k_(YYGPLGzwC13Mav}V@9`yO%nmn+a literal 0 HcmV?d00001 diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/src/@types/TickersTypes.d.ts b/src/@types/TickersTypes.d.ts index c93066d..15266f5 100644 --- a/src/@types/TickersTypes.d.ts +++ b/src/@types/TickersTypes.d.ts @@ -11,12 +11,12 @@ export interface TickerData { pvp: number price: number lastDividend: number - dividendHistory: any[], - dailyPriceHistory: any[], - monthlyPriceHistory: any[], + dividendHistory: any[] + dailyPriceHistory: any[] + monthlyPriceHistory: any[] } -export interface TickerFecth { +export interface TickerFecth { isLoading: boolean isError: boolean data: TickerData diff --git a/src/actions/portfoliosActions.ts b/src/actions/portfoliosActions.ts index bf27c30..b43e8cc 100644 --- a/src/actions/portfoliosActions.ts +++ b/src/actions/portfoliosActions.ts @@ -1,4 +1,4 @@ -import { Portfolio } from "@/@types/PortfoliosTypes" +import { Portfolio } from '@/@types/PortfoliosTypes' import { findIndex } from 'lodash' import { v4 as uuid } from 'uuid' @@ -16,14 +16,17 @@ export const portfoliosActions = { }, insert: (state: Portfolio[], payload: any): Portfolio[] => { - return [...state, { - id: uuid(), - name: payload.name - }] + return [ + ...state, + { + id: uuid(), + name: payload.name, + }, + ] }, remove: (state: Portfolio[], payload: any): Portfolio[] => { - const portfolios = state.filter((p) => (p.id !== payload.id)) + const portfolios = state.filter((p) => p.id !== payload.id) return [...portfolios] }, } diff --git a/src/actions/tickersActions.ts b/src/actions/tickersActions.ts index 761eae6..10e7285 100644 --- a/src/actions/tickersActions.ts +++ b/src/actions/tickersActions.ts @@ -1,10 +1,9 @@ -import { Ticker } from "@/@types/TickersTypes" +import { Ticker } from '@/@types/TickersTypes' import { findIndex, uniqWith } from 'lodash' -import { config } from "@/config" +import { config } from '@/config' export const tickersActions = { insert: (state: Ticker[], { tickersList, portfoliosList }: any): Ticker[] => { - const newTickers: Ticker[] = [] portfoliosList.forEach((portfolioId: string) => { tickersList.forEach((ticker: string) => { @@ -20,13 +19,18 @@ export const tickersActions = { }, remove: (state: Ticker[], { ticker, portfolioId }: any): Ticker[] => { - const tickers = state.filter((i => (i.ticker !== ticker || i.portfolioId !== portfolioId))) + const tickers = state.filter( + (i) => i.ticker !== ticker || i.portfolioId !== portfolioId, + ) return [...tickers] }, update: (state: Ticker[], payload: any): Ticker[] => { const tickers = state.map((i) => { - if (i.ticker === payload.ticker && i.portfolioId === payload.portfolioId) { + if ( + i.ticker === payload.ticker && + i.portfolioId === payload.portfolioId + ) { return payload } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 5a35869..3a31bab 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ - import { ReactNode, Suspense } from 'react' +import { ReactNode, Suspense } from 'react' import { Inter } from 'next/font/google' import { config } from '@/config' diff --git a/src/components/common/Title.tsx b/src/components/common/Title.tsx index 8e62d32..0434d6e 100644 --- a/src/components/common/Title.tsx +++ b/src/components/common/Title.tsx @@ -1,7 +1,7 @@ 'use client' -import { Title as TitleReact } from "@tremor/react" -import { ReactNode } from "react" +import { Title as TitleReact } from '@tremor/react' +import { ReactNode } from 'react' export function Title({ children }: { children: ReactNode }) { return ( diff --git a/src/components/home/form/index.tsx b/src/components/home/form/index.tsx index 91ea4ae..ec03e09 100644 --- a/src/components/home/form/index.tsx +++ b/src/components/home/form/index.tsx @@ -29,13 +29,11 @@ export function Form() { Análise de Fundos Imobiliários -
+
- +

) diff --git a/src/components/home/info/Buttons.tsx b/src/components/home/info/Buttons.tsx index 3c75e79..e100fcf 100644 --- a/src/components/home/info/Buttons.tsx +++ b/src/components/home/info/Buttons.tsx @@ -1,8 +1,8 @@ 'use client' import { PencilSimple, ChartLineUp } from '@phosphor-icons/react' -import { Icon } from "@tremor/react" -import Link from "next/link" +import { Icon } from '@tremor/react' +import Link from 'next/link' type Props = { portfolioId: string @@ -12,7 +12,11 @@ export function Buttons({ portfolioId }: Props) { return (
- + {/* diff --git a/src/components/home/info/Cards.tsx b/src/components/home/info/Cards.tsx index b59e259..2f11f16 100644 --- a/src/components/home/info/Cards.tsx +++ b/src/components/home/info/Cards.tsx @@ -19,13 +19,13 @@ export function Cards({ portfolioId, portfolioName }: Props) { return (
-

Sem ativos nesta carteira

+

Sem ativos nesta carteira

) } return ( - +
diff --git a/src/components/home/info/Header.tsx b/src/components/home/info/Header.tsx index 8db3949..1436f38 100644 --- a/src/components/home/info/Header.tsx +++ b/src/components/home/info/Header.tsx @@ -1,7 +1,7 @@ 'use client' -import { Title } from "@tremor/react" -import { Buttons } from "./Buttons" +import { Title } from '@tremor/react' +import { Buttons } from './Buttons' type Props = { portfolioId: string @@ -11,8 +11,10 @@ type Props = { export function Header({ portfolioId, portfolioName }: Props) { return (
- {portfolioName} + + {portfolioName} +
) -} \ No newline at end of file +} diff --git a/src/components/home/table/BtnRemove.tsx b/src/components/home/table/BtnRemove.tsx index 5317de3..98fcdd4 100644 --- a/src/components/home/table/BtnRemove.tsx +++ b/src/components/home/table/BtnRemove.tsx @@ -6,16 +6,22 @@ import { Ticker } from '@/@types/TickersTypes' import { Trash } from '@phosphor-icons/react' type Props = { - ticker: Ticker, - isDisabled?: boolean, + ticker: Ticker + isDisabled?: boolean } export function BtnRemove({ ticker, isDisabled = false }: Props) { const { removeTicker } = useTickers() - + return ( - ) } diff --git a/src/components/home/table/BtnVisibility.tsx b/src/components/home/table/BtnVisibility.tsx index 6cd316d..8fbf80d 100644 --- a/src/components/home/table/BtnVisibility.tsx +++ b/src/components/home/table/BtnVisibility.tsx @@ -6,8 +6,8 @@ import { Ticker } from '@/@types/TickersTypes' import { Eye, EyeSlash, Trash } from '@phosphor-icons/react' type Props = { - ticker: Ticker, - isDisabled?: boolean, + ticker: Ticker + isDisabled?: boolean } export function BtnVisibility({ ticker, isDisabled = false }: Props) { @@ -16,10 +16,10 @@ export function BtnVisibility({ ticker, isDisabled = false }: Props) { return (
- - - ) -} diff --git a/src/components/home/info/Buttons.tsx b/src/components/home/info/Buttons.tsx deleted file mode 100644 index 7cc2b3b..0000000 --- a/src/components/home/info/Buttons.tsx +++ /dev/null @@ -1,28 +0,0 @@ -'use client' - -import { PencilSimple } from '@phosphor-icons/react' -import { Icon } from '@tremor/react' -import Link from 'next/link' - -type Props = { - portfolioId: string -} - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export function Buttons({ portfolioId }: Props) { - return ( -
- - - - - {/* - - */} -
- ) -} diff --git a/src/components/home/info/Cards.tsx b/src/components/home/info/Cards.tsx deleted file mode 100644 index 2f11f16..0000000 --- a/src/components/home/info/Cards.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client' - -import { Card } from '@tremor/react' - -import { useTickers } from '@/hooks/useTickers' -import { Table } from '@/components/home/table' -import { Header } from './Header' - -type Props = { - portfolioId: string - portfolioName: string -} - -export function Cards({ portfolioId, portfolioName }: Props) { - const { listByPortfolioId } = useTickers() - const tickers = listByPortfolioId(portfolioId) - - if (!tickers.length) { - return ( - -
-

Sem ativos nesta carteira

- - ) - } - - return ( - -
-
- - ) -} diff --git a/src/components/home/info/Header.tsx b/src/components/home/info/Header.tsx deleted file mode 100644 index 1436f38..0000000 --- a/src/components/home/info/Header.tsx +++ /dev/null @@ -1,20 +0,0 @@ -'use client' - -import { Title } from '@tremor/react' -import { Buttons } from './Buttons' - -type Props = { - portfolioId: string - portfolioName: string -} - -export function Header({ portfolioId, portfolioName }: Props) { - return ( -
- - {portfolioName} - - -
- ) -} diff --git a/src/components/home/info/index.tsx b/src/components/home/info/index.tsx deleted file mode 100644 index d748b41..0000000 --- a/src/components/home/info/index.tsx +++ /dev/null @@ -1,21 +0,0 @@ -'use client' - -import { Title } from '@tremor/react' -import { usePortfolios } from '@/hooks/usePortfolios' -import { Cards } from './Cards' - -export function Info() { - const { listPortfolios } = usePortfolios() - - return ( -
- Minhas Carteiras - -
- {listPortfolios().map((g) => ( - - ))} -
-
- ) -} diff --git a/src/components/home/table/index.tsx b/src/components/home/table/index.tsx deleted file mode 100644 index f388134..0000000 --- a/src/components/home/table/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import { Table } from '@/components/home/table/Table' - -export { Table } diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx deleted file mode 100644 index 2d9e1e5..0000000 --- a/src/components/layout/Header.tsx +++ /dev/null @@ -1,18 +0,0 @@ -'use client' - -import { config } from '@/config' -import { List, Gear } from '@phosphor-icons/react' - -export function Header() { - return ( -
- -
- ) -} diff --git a/src/components/layout/HeaderMobile.tsx b/src/components/layout/HeaderMobile.tsx new file mode 100644 index 0000000..2a178e0 --- /dev/null +++ b/src/components/layout/HeaderMobile.tsx @@ -0,0 +1,15 @@ +'use client' +import { List } from '@phosphor-icons/react' +import { Logo } from '../common/Logo' +import { Button } from '@tremor/react' + +export function HeaderMobile() { + return ( +
+ + +
+ ) +} diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index bf481ed..db0649d 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -1,5 +1,11 @@ import { ReactNode } from 'react' +// flex flex-col flex-grow lg:-ml-64 + export function Main({ children }: { children: ReactNode }) { - return
{children}
+ return ( +
+
{children}
+
+ ) } diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx new file mode 100644 index 0000000..b909de5 --- /dev/null +++ b/src/components/layout/Sidebar.tsx @@ -0,0 +1,27 @@ +'use client' + +import { Calculator, Question, Wallet } from '@phosphor-icons/react' +import { SidebarMenuItem } from './SidebarMenu' +import { Logo } from '../common/Logo' + +export function Sidebar() { + return ( + + ) +} diff --git a/src/components/layout/SidebarMenu.tsx b/src/components/layout/SidebarMenu.tsx new file mode 100644 index 0000000..f09efb1 --- /dev/null +++ b/src/components/layout/SidebarMenu.tsx @@ -0,0 +1,21 @@ +import { Icon } from '@phosphor-icons/react' + +interface MenuItemProps { + icon: Icon + label: string + href: string +} + +export function SidebarMenuItem({ label, icon: Icon }: MenuItemProps) { + return ( +
  • + + + {label} + +
  • + ) +} diff --git a/src/components/pages/home/dividend-history-chart/index.tsx b/src/components/pages/home/dividend-history-chart/index.tsx new file mode 100644 index 0000000..1099496 --- /dev/null +++ b/src/components/pages/home/dividend-history-chart/index.tsx @@ -0,0 +1,38 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +'use client' + +import { useEffect, useState } from 'react' +import { TickerData, TickerResult } from '@/@types/TickersTypes' +import { usePortfolios } from '@/hooks/usePortfolios' +import { TickersCard } from '../tickers-card' +import { Title } from '@/components/common/Title' +import { TickerFetchAPI } from '@/helpers/TickerFetchAPI' + +export function DividendHistoryCard() { + const { tickers } = usePortfolios() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [results, setResults] = useState([]) + + useEffect(() => { + Promise.allSettled( + tickers.map((ticker) => new TickerFetchAPI(ticker).fetch()), + ).then((results) => { + const dataFiltred = results.filter( + ({ status }) => status === 'fulfilled', + ) as PromiseFulfilledResult[] + + const data = dataFiltred.map(({ value }) => value) + + // setResults() + }) + }, [tickers]) + + return ( + + + Histórico de dividendos + <span className="text-gray-500 text-sm">Últimos 12 meses</span> + + + ) +} diff --git a/src/components/home/form/SelectPortfolios.tsx b/src/components/pages/home/form-card/SelectPortfolios.tsx similarity index 100% rename from src/components/home/form/SelectPortfolios.tsx rename to src/components/pages/home/form-card/SelectPortfolios.tsx diff --git a/src/components/home/form/SelectTickers.tsx b/src/components/pages/home/form-card/SelectTickers.tsx similarity index 95% rename from src/components/home/form/SelectTickers.tsx rename to src/components/pages/home/form-card/SelectTickers.tsx index 0d01e85..a0e4eb4 100644 --- a/src/components/home/form/SelectTickers.tsx +++ b/src/components/pages/home/form-card/SelectTickers.tsx @@ -14,9 +14,8 @@ export function SelectTickers(props: SelectTickersProps) {
    {getFundsStorage().map((f) => { return ( diff --git a/src/components/pages/home/form-card/index.tsx b/src/components/pages/home/form-card/index.tsx new file mode 100644 index 0000000..ae3e188 --- /dev/null +++ b/src/components/pages/home/form-card/index.tsx @@ -0,0 +1,31 @@ +'use client' + +import { Button, Card } from '@tremor/react' +import { useState } from 'react' +import { SelectTickers } from './SelectTickers' +import { useTickers } from '@/hooks/useTickers' +import { portfoliosInitialState } from '@/storage/portfoliosInitialState' +import { Title } from '@/components/common/Title' + +export function FormCard() { + const { addTickers } = useTickers() + + const [tickersSelected, setTickersSelected] = useState([]) + + const onTickersSelected = (value: string[]) => setTickersSelected(value) + + const onSubmit = () => { + addTickers(tickersSelected, [portfoliosInitialState[0].id]) + } + + return ( + + Análise de Fundos Imobiliários + +
    + + +
    +
    + ) +} diff --git a/src/components/pages/home/price-history-card/index.tsx b/src/components/pages/home/price-history-card/index.tsx new file mode 100644 index 0000000..bfcc423 --- /dev/null +++ b/src/components/pages/home/price-history-card/index.tsx @@ -0,0 +1,17 @@ +'use client' + +import { TickersCard } from '../tickers-card' +import { Title } from '@/components/common/Title' + +export function PriceHistoryCard() { + // const { tickers } = usePortfolios() + + return ( + + + <span>Histórico de valorização</span> + <span className="text-gray-500 text-sm">Últimos 20 dias</span> + + + ) +} diff --git a/src/components/pages/home/stocks-cards/StockCard.tsx b/src/components/pages/home/stocks-cards/StockCard.tsx new file mode 100644 index 0000000..533ce8f --- /dev/null +++ b/src/components/pages/home/stocks-cards/StockCard.tsx @@ -0,0 +1,25 @@ +import { cn } from '@/helpers/utils' +import { Card, Text, BadgeDelta, Metric, CardProps } from '@tremor/react' + +interface Props extends CardProps { + title: string + points: number + percentage: number +} + +export function StockCard({ title, points, percentage, className }: Props) { + const type = percentage > 0 ? 'increase' : 'decrease' + const color = percentage > 0 ? 'green' : 'red' + + return ( + +
    + {title} + + {percentage}% + +
    + {points} +
    + ) +} diff --git a/src/components/pages/home/stocks-cards/index.tsx b/src/components/pages/home/stocks-cards/index.tsx new file mode 100644 index 0000000..c8aef5c --- /dev/null +++ b/src/components/pages/home/stocks-cards/index.tsx @@ -0,0 +1,10 @@ +import { StockCard } from './StockCard' + +export function StocksCards() { + return ( +
    + + +
    + ) +} diff --git a/src/components/pages/home/suggestions-card/index.tsx b/src/components/pages/home/suggestions-card/index.tsx new file mode 100644 index 0000000..7c2b52f --- /dev/null +++ b/src/components/pages/home/suggestions-card/index.tsx @@ -0,0 +1,61 @@ +'use client' + +import { Button, Card, ListItem, List } from '@tremor/react' +import { useEffect, useState } from 'react' +import { Suggestion } from '@/@types/SuggestionsTypes' +import { usePortfolios } from '@/hooks/usePortfolios' +import { ArrowsClockwise } from '@phosphor-icons/react' +import { useTickers } from '@/hooks/useTickers' +import { Title } from '@/components/common/Title' + +export function SuggestionsCard() { + const { addTickers } = useTickers() + const { getSuggestions, portfolioId } = usePortfolios() + const [suggestions, setSuggestions] = useState([]) + + const onReload = () => { + setSuggestions(getSuggestions()) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(onReload, []) + + const addTicker = (ticker: string) => { + addTickers([ticker], [portfolioId]) + + const newSuggestions = suggestions.filter((s) => s.ticker !== ticker) + + if (newSuggestions.length) { + return setSuggestions(newSuggestions) + } + + onReload() + } + + return ( + + + Talvez te interesse! + <Button onClick={onReload} variant="light"> + <ArrowsClockwise /> + </Button> + + + {suggestions.map((suggestion) => ( + + {suggestion.ticker} + + + + + + ))} + + + ) +} diff --git a/src/components/pages/home/tickers-card/index.tsx b/src/components/pages/home/tickers-card/index.tsx new file mode 100644 index 0000000..9d63170 --- /dev/null +++ b/src/components/pages/home/tickers-card/index.tsx @@ -0,0 +1,19 @@ +'use client' + +import { ReactNode } from 'react' +import { Card } from '@tremor/react' +import { usePortfolios } from '@/hooks/usePortfolios' + +export function TickersCard({ children }: { children: ReactNode }) { + const { tickers } = usePortfolios() + + if (!tickers.length) { + return ( + +

    Sem ativos nesta carteira

    +
    + ) + } + + return {children} +} diff --git a/src/components/home/table/BtnRemove.tsx b/src/components/pages/home/tickers-table/BtnRemove.tsx similarity index 100% rename from src/components/home/table/BtnRemove.tsx rename to src/components/pages/home/tickers-table/BtnRemove.tsx diff --git a/src/components/home/table/BtnVisibility.tsx b/src/components/pages/home/tickers-table/BtnVisibility.tsx similarity index 100% rename from src/components/home/table/BtnVisibility.tsx rename to src/components/pages/home/tickers-table/BtnVisibility.tsx diff --git a/src/components/home/table/Cell.tsx b/src/components/pages/home/tickers-table/Cell.tsx similarity index 100% rename from src/components/home/table/Cell.tsx rename to src/components/pages/home/tickers-table/Cell.tsx diff --git a/src/components/home/table/Row.tsx b/src/components/pages/home/tickers-table/Row.tsx similarity index 100% rename from src/components/home/table/Row.tsx rename to src/components/pages/home/tickers-table/Row.tsx diff --git a/src/components/home/table/Table.tsx b/src/components/pages/home/tickers-table/Table.tsx similarity index 88% rename from src/components/home/table/Table.tsx rename to src/components/pages/home/tickers-table/Table.tsx index f43eb47..7a2a257 100644 --- a/src/components/home/table/Table.tsx +++ b/src/components/pages/home/tickers-table/Table.tsx @@ -1,6 +1,5 @@ 'use client' -import { Ticker } from '@/@types/TickersTypes' import { Table as TremorTable, TableBody, @@ -9,13 +8,12 @@ import { TableRow, } from '@tremor/react' +import { usePortfolios } from '@/hooks/usePortfolios' import { Row } from './Row' -type Props = { - tickers: Ticker[] -} +export function Table() { + const { tickers } = usePortfolios() -export function Table({ tickers }: Props) { return ( diff --git a/src/components/pages/home/tickers-table/index.tsx b/src/components/pages/home/tickers-table/index.tsx new file mode 100644 index 0000000..8141bf4 --- /dev/null +++ b/src/components/pages/home/tickers-table/index.tsx @@ -0,0 +1,12 @@ +import { Table } from './Table' +import { TickersCard } from '../tickers-card' +import { Title } from '@/components/common/Title' + +export function TickersTable() { + return ( + + Minha Carteira +
    + + ) +} diff --git a/src/config.ts b/src/config.ts index 701be7f..53a09fb 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,3 +1,18 @@ +const getConfigAPI = () => { + if (!process.env.NEXT_PUBLIC_API_KEY) { + throw new Error('NEXT_PUBLIC_API_KEY not found') + } + + if (!process.env.NEXT_PUBLIC_API_URL) { + throw new Error('NEXT_PUBLIC_API_URL not found') + } + + return { + key: process.env.NEXT_PUBLIC_API_KEY, + url: process.env.NEXT_PUBLIC_API_URL, + } +} + export const config = { app: { metadata: { @@ -8,7 +23,7 @@ export const config = { }, }, - api: {}, + api: getConfigAPI(), defaults: { ticker: { @@ -17,6 +32,10 @@ export const config = { }, }, + suggestions: { + limit: 5, + }, + charts: { colors: ['blue', 'green', 'red', 'yellow'], }, diff --git a/src/helpers/TickerFetchAPI.ts b/src/helpers/TickerFetchAPI.ts index 4546fab..094fc94 100644 --- a/src/helpers/TickerFetchAPI.ts +++ b/src/helpers/TickerFetchAPI.ts @@ -1,4 +1,5 @@ import { Ticker, TickerData } from '@/@types/TickersTypes' +import { config } from '@/config' import { round } from 'lodash' import moment from 'moment' @@ -29,11 +30,13 @@ interface PriceHistory { export class TickerFetchAPI { private readonly ticker: string - private readonly api_key = '5be6b9db' - private readonly api_base_url = 'https://api.hgbrasil.com/' + private api_key: string + private api_base_url: string constructor(ticker: Ticker) { this.ticker = ticker.ticker + this.api_key = config.api.key + this.api_base_url = config.api.url } private getURL(endpoint: string, params: Params): string { @@ -42,6 +45,7 @@ export class TickerFetchAPI { key: this.api_key, format: 'json-cors', }) + const url = new URL(this.api_base_url) url.pathname = endpoint @@ -62,14 +66,15 @@ export class TickerFetchAPI { ) return { + pvp, dy12, - dividend12, price, - pvp, + dividend12, lastDividend, - dividendHistory: [], dailyPriceHistory, + dividendHistory: [], monthlyPriceHistory, + ticker: this.ticker, } } diff --git a/src/helpers/fetchStocks.ts b/src/helpers/fetchStocks.ts new file mode 100644 index 0000000..a7bcb2b --- /dev/null +++ b/src/helpers/fetchStocks.ts @@ -0,0 +1,26 @@ +import { StockResult } from '@/@types/StocksTypes' +import { config } from '@/config' + +export const fetchStocks = async (): Promise => { + const { key, url } = config.api + + const response = await fetch(`${url}/finance?key=${key}&format=json-cors`, { + method: 'GET', + cache: 'force-cache', + next: { + revalidate: 3600, + }, + }) + + if (!response.ok) { + throw new Error('Something went wrong') + } + + const { results } = await response.json() + + if (!results) { + throw new Error('No results found') + } + + return results.stocks as StockResult +} diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts new file mode 100644 index 0000000..d32b0fe --- /dev/null +++ b/src/helpers/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/src/hooks/usePortfolios.ts b/src/hooks/usePortfolios.ts index f658491..f8807f7 100644 --- a/src/hooks/usePortfolios.ts +++ b/src/hooks/usePortfolios.ts @@ -1,13 +1,29 @@ -import { findIndex } from 'lodash' +import { useContext } from 'react' +import { find, findIndex, sampleSize } from 'lodash' import { useData } from './useData' +import { PortfolioContext } from '@/providers/PortfolioProvider' +import { PortfolioContextType } from '@/@types/ContextTypes' +import { getFundsStorage } from '@/storage/funds' +import { Suggestion } from '@/@types/SuggestionsTypes' +import { config } from '@/config' + export const usePortfolios = () => { const { portfolios } = useData() + const portfolio = useContext(PortfolioContext) as PortfolioContextType - return { - listPortfolios: () => - portfolios.sort((a, b) => a.name.localeCompare(b.name)), + if (!portfolio) { + throw new Error('useData must be used within a DataProvider') + } + const { tickers, portfolioId } = portfolio + + return { + portfolioId, + tickers, + listPortfolios: () => { + return portfolios.sort((a, b) => a.name.localeCompare(b.name)) + }, getPortfolio: (id: string) => { const index = findIndex(portfolios, (portfolio) => portfolio.id === id) @@ -17,5 +33,14 @@ export const usePortfolios = () => { return portfolios[index] }, + getSuggestions: (): Suggestion[] => { + const funds = getFundsStorage() + + const fundsFiltered = funds.filter(({ ticker }) => { + return typeof find(tickers, { ticker }) === 'undefined' + }) + + return sampleSize(fundsFiltered, config.suggestions.limit) + }, } } diff --git a/src/hooks/useTickerFetch.ts b/src/hooks/useTickerFetch.ts index 86e9518..9e0934c 100644 --- a/src/hooks/useTickerFetch.ts +++ b/src/hooks/useTickerFetch.ts @@ -3,6 +3,7 @@ import { Ticker, TickerData, TickerFecth } from '@/@types/TickersTypes' import { TickerFetchAPI } from '@/helpers/TickerFetchAPI' const defaultTickerFetch: TickerData = { + ticker: '', dy12: 0, dividend12: 0, pvp: 0, diff --git a/src/providers/DataProvider.tsx b/src/providers/DataProvider.tsx index c06e62d..63edc12 100644 --- a/src/providers/DataProvider.tsx +++ b/src/providers/DataProvider.tsx @@ -14,6 +14,7 @@ export function DataProvider({ children }: { children: ReactNode }) { tickersReducer, tickersInitialState, ) + const [portfolios, dispatchPortfolios] = useReducer( portfoliosReducer, portfoliosInitialState, diff --git a/src/providers/PortfolioProvider.tsx b/src/providers/PortfolioProvider.tsx new file mode 100644 index 0000000..8786f00 --- /dev/null +++ b/src/providers/PortfolioProvider.tsx @@ -0,0 +1,37 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client' + +import { ReactNode, createContext, useEffect, useState } from 'react' +import { PortfolioContextType } from '@/@types/ContextTypes' +import { Ticker } from '@/@types/TickersTypes' +import { useTickers } from '@/hooks/useTickers' +import { useData } from '@/hooks/useData' +import { portfoliosInitialState } from '@/storage/portfoliosInitialState' + +export const PortfolioContext = createContext( + {} as PortfolioContextType, +) + +export function PortfolioProvider({ children }: { children: ReactNode }) { + const { tickers } = useData() + const { listByPortfolioId } = useTickers() + const [portfolioTickers, setPortfolioTickers] = useState([]) + + const portfolioId = portfoliosInitialState[0].id + + useEffect(() => { + const tickers = listByPortfolioId(portfolioId) + setPortfolioTickers(tickers) + }, [tickers]) + + return ( + + {children} + + ) +} diff --git a/src/styles/globals.css b/src/styles/globals.css index b5c61c9..399284a 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -1,3 +1,11 @@ @tailwind base; @tailwind components; @tailwind utilities; + +:root { + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} diff --git a/src/styles/output.css b/src/styles/output.css deleted file mode 100644 index 2fa0e92..0000000 --- a/src/styles/output.css +++ /dev/null @@ -1,14805 +0,0 @@ -/* -! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -*/ - -html { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font family by default. -2. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-size: 1em; - /* 2 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden] { - display: none; -} - -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.sticky { - position: sticky; -} - -.bottom-0 { - bottom: 0px; -} - -.bottom-0\.5 { - bottom: 0.125rem; -} - -.bottom-1 { - bottom: 0.25rem; -} - -.bottom-1\.5 { - bottom: 0.375rem; -} - -.bottom-2 { - bottom: 0.5rem; -} - -.bottom-2\.5 { - bottom: 0.625rem; -} - -.bottom-3 { - bottom: 0.75rem; -} - -.bottom-3\.5 { - bottom: 0.875rem; -} - -.bottom-4 { - bottom: 1rem; -} - -.bottom-6 { - bottom: 1.5rem; -} - -.bottom-8 { - bottom: 2rem; -} - -.bottom-px { - bottom: 1px; -} - -.left-0 { - left: 0px; -} - -.left-0\.5 { - left: 0.125rem; -} - -.left-1 { - left: 0.25rem; -} - -.left-1\.5 { - left: 0.375rem; -} - -.left-1\/2 { - left: 50%; -} - -.left-2 { - left: 0.5rem; -} - -.left-2\.5 { - left: 0.625rem; -} - -.left-3 { - left: 0.75rem; -} - -.left-3\.5 { - left: 0.875rem; -} - -.left-4 { - left: 1rem; -} - -.left-6 { - left: 1.5rem; -} - -.left-8 { - left: 2rem; -} - -.left-px { - left: 1px; -} - -.right-0 { - right: 0px; -} - -.right-0\.5 { - right: 0.125rem; -} - -.right-1 { - right: 0.25rem; -} - -.right-1\.5 { - right: 0.375rem; -} - -.right-1\/2 { - right: 50%; -} - -.right-2 { - right: 0.5rem; -} - -.right-2\.5 { - right: 0.625rem; -} - -.right-3 { - right: 0.75rem; -} - -.right-3\.5 { - right: 0.875rem; -} - -.right-4 { - right: 1rem; -} - -.right-6 { - right: 1.5rem; -} - -.right-8 { - right: 2rem; -} - -.right-px { - right: 1px; -} - -.top-0 { - top: 0px; -} - -.top-0\.5 { - top: 0.125rem; -} - -.top-1 { - top: 0.25rem; -} - -.top-1\.5 { - top: 0.375rem; -} - -.top-2 { - top: 0.5rem; -} - -.top-2\.5 { - top: 0.625rem; -} - -.top-3 { - top: 0.75rem; -} - -.top-3\.5 { - top: 0.875rem; -} - -.top-4 { - top: 1rem; -} - -.top-6 { - top: 1.5rem; -} - -.top-8 { - top: 2rem; -} - -.top-px { - top: 1px; -} - -.z-10 { - z-index: 10; -} - -.z-20 { - z-index: 20; -} - -.col-span-1 { - grid-column: span 1 / span 1; -} - -.col-span-10 { - grid-column: span 10 / span 10; -} - -.col-span-11 { - grid-column: span 11 / span 11; -} - -.col-span-12 { - grid-column: span 12 / span 12; -} - -.col-span-2 { - grid-column: span 2 / span 2; -} - -.col-span-3 { - grid-column: span 3 / span 3; -} - -.col-span-4 { - grid-column: span 4 / span 4; -} - -.col-span-5 { - grid-column: span 5 / span 5; -} - -.col-span-6 { - grid-column: span 6 / span 6; -} - -.col-span-7 { - grid-column: span 7 / span 7; -} - -.col-span-8 { - grid-column: span 8 / span 8; -} - -.col-span-9 { - grid-column: span 9 / span 9; -} - -.col-start-2 { - grid-column-start: 2; -} - -.col-start-3 { - grid-column-start: 3; -} - -.col-start-4 { - grid-column-start: 4; -} - -.col-start-5 { - grid-column-start: 5; -} - -.col-start-6 { - grid-column-start: 6; -} - -.col-start-7 { - grid-column-start: 7; -} - -.m-4 { - margin: 1rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.-mb-0 { - margin-bottom: -0px; -} - -.-mb-0\.5 { - margin-bottom: -0.125rem; -} - -.-mb-1 { - margin-bottom: -0.25rem; -} - -.-mb-1\.5 { - margin-bottom: -0.375rem; -} - -.-mb-2 { - margin-bottom: -0.5rem; -} - -.-mb-2\.5 { - margin-bottom: -0.625rem; -} - -.-mb-3 { - margin-bottom: -0.75rem; -} - -.-mb-3\.5 { - margin-bottom: -0.875rem; -} - -.-mb-4 { - margin-bottom: -1rem; -} - -.-mb-6 { - margin-bottom: -1.5rem; -} - -.-mb-8 { - margin-bottom: -2rem; -} - -.-mb-px { - margin-bottom: -1px; -} - -.-ml-0 { - margin-left: -0px; -} - -.-ml-0\.5 { - margin-left: -0.125rem; -} - -.-ml-1 { - margin-left: -0.25rem; -} - -.-ml-1\.5 { - margin-left: -0.375rem; -} - -.-ml-2 { - margin-left: -0.5rem; -} - -.-ml-2\.5 { - margin-left: -0.625rem; -} - -.-ml-3 { - margin-left: -0.75rem; -} - -.-ml-3\.5 { - margin-left: -0.875rem; -} - -.-ml-4 { - margin-left: -1rem; -} - -.-ml-6 { - margin-left: -1.5rem; -} - -.-ml-8 { - margin-left: -2rem; -} - -.-ml-px { - margin-left: -1px; -} - -.-mr-0 { - margin-right: -0px; -} - -.-mr-0\.5 { - margin-right: -0.125rem; -} - -.-mr-1 { - margin-right: -0.25rem; -} - -.-mr-1\.5 { - margin-right: -0.375rem; -} - -.-mr-2 { - margin-right: -0.5rem; -} - -.-mr-2\.5 { - margin-right: -0.625rem; -} - -.-mr-3 { - margin-right: -0.75rem; -} - -.-mr-3\.5 { - margin-right: -0.875rem; -} - -.-mr-4 { - margin-right: -1rem; -} - -.-mr-6 { - margin-right: -1.5rem; -} - -.-mr-8 { - margin-right: -2rem; -} - -.-mr-px { - margin-right: -1px; -} - -.-mt-0 { - margin-top: -0px; -} - -.-mt-0\.5 { - margin-top: -0.125rem; -} - -.-mt-1 { - margin-top: -0.25rem; -} - -.-mt-1\.5 { - margin-top: -0.375rem; -} - -.-mt-2 { - margin-top: -0.5rem; -} - -.-mt-2\.5 { - margin-top: -0.625rem; -} - -.-mt-3 { - margin-top: -0.75rem; -} - -.-mt-3\.5 { - margin-top: -0.875rem; -} - -.-mt-4 { - margin-top: -1rem; -} - -.-mt-6 { - margin-top: -1.5rem; -} - -.-mt-8 { - margin-top: -2rem; -} - -.-mt-px { - margin-top: -1px; -} - -.mb-0 { - margin-bottom: 0px; -} - -.mb-0\.5 { - margin-bottom: 0.125rem; -} - -.mb-1 { - margin-bottom: 0.25rem; -} - -.mb-1\.5 { - margin-bottom: 0.375rem; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.mb-2\.5 { - margin-bottom: 0.625rem; -} - -.mb-3 { - margin-bottom: 0.75rem; -} - -.mb-3\.5 { - margin-bottom: 0.875rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.mb-px { - margin-bottom: 1px; -} - -.ml-0 { - margin-left: 0px; -} - -.ml-0\.5 { - margin-left: 0.125rem; -} - -.ml-1 { - margin-left: 0.25rem; -} - -.ml-1\.5 { - margin-left: 0.375rem; -} - -.ml-2 { - margin-left: 0.5rem; -} - -.ml-2\.5 { - margin-left: 0.625rem; -} - -.ml-3 { - margin-left: 0.75rem; -} - -.ml-3\.5 { - margin-left: 0.875rem; -} - -.ml-4 { - margin-left: 1rem; -} - -.ml-6 { - margin-left: 1.5rem; -} - -.ml-8 { - margin-left: 2rem; -} - -.ml-px { - margin-left: 1px; -} - -.mr-0 { - margin-right: 0px; -} - -.mr-0\.5 { - margin-right: 0.125rem; -} - -.mr-1 { - margin-right: 0.25rem; -} - -.mr-1\.5 { - margin-right: 0.375rem; -} - -.mr-2 { - margin-right: 0.5rem; -} - -.mr-2\.5 { - margin-right: 0.625rem; -} - -.mr-3 { - margin-right: 0.75rem; -} - -.mr-3\.5 { - margin-right: 0.875rem; -} - -.mr-4 { - margin-right: 1rem; -} - -.mr-6 { - margin-right: 1.5rem; -} - -.mr-8 { - margin-right: 2rem; -} - -.mr-px { - margin-right: 1px; -} - -.mt-0 { - margin-top: 0px; -} - -.mt-0\.5 { - margin-top: 0.125rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-1\.5 { - margin-top: 0.375rem; -} - -.mt-2 { - margin-top: 0.5rem; -} - -.mt-2\.5 { - margin-top: 0.625rem; -} - -.mt-3 { - margin-top: 0.75rem; -} - -.mt-3\.5 { - margin-top: 0.875rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-5 { - margin-top: 1.25rem; -} - -.mt-6 { - margin-top: 1.5rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.mt-px { - margin-top: 1px; -} - -.block { - display: block; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.table { - display: table; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-0 { - height: 0px; -} - -.h-0\.5 { - height: 0.125rem; -} - -.h-1 { - height: 0.25rem; -} - -.h-10 { - height: 2.5rem; -} - -.h-2 { - height: 0.5rem; -} - -.h-3 { - height: 0.75rem; -} - -.h-4 { - height: 1rem; -} - -.h-44 { - height: 11rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-6 { - height: 1.5rem; -} - -.h-7 { - height: 1.75rem; -} - -.h-80 { - height: 20rem; -} - -.h-9 { - height: 2.25rem; -} - -.h-full { - height: 100%; -} - -.max-h-\[228px\] { - max-height: 228px; -} - -.max-h-fit { - max-height: -moz-fit-content; - max-height: fit-content; -} - -.w-0 { - width: 0px; -} - -.w-0\.5 { - width: 0.125rem; -} - -.w-1 { - width: 0.25rem; -} - -.w-1\/2 { - width: 50%; -} - -.w-16 { - width: 4rem; -} - -.w-2 { - width: 0.5rem; -} - -.w-3 { - width: 0.75rem; -} - -.w-4 { - width: 1rem; -} - -.w-4\/5 { - width: 80%; -} - -.w-48 { - width: 12rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-6 { - width: 1.5rem; -} - -.w-7 { - width: 1.75rem; -} - -.w-9 { - width: 2.25rem; -} - -.w-full { - width: 100%; -} - -.w-max { - width: -moz-max-content; - width: max-content; -} - -.min-w-\[10rem\] { - min-width: 10rem; -} - -.min-w-min { - min-width: -moz-min-content; - min-width: min-content; -} - -.max-w-full { - max-width: 100%; -} - -.max-w-xs { - max-width: 20rem; -} - -.flex-1 { - flex: 1 1 0%; -} - -.flex-none { - flex: none; -} - -.flex-shrink-0 { - flex-shrink: 0; -} - -.shrink-0 { - flex-shrink: 0; -} - -.-translate-x-1\/2 { - --tw-translate-x: -50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.translate-x-1\/2 { - --tw-translate-x: 50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.-rotate-180 { - --tw-rotate: -180deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} - -.animate-spin { - animation: spin 1s linear infinite; -} - -.cursor-default { - cursor: default; -} - -.cursor-pointer { - cursor: pointer; -} - -.cursor-text { - cursor: text; -} - -.resize { - resize: both; -} - -.columns-auto { - -moz-columns: auto; - columns: auto; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.grid-cols-10 { - grid-template-columns: repeat(10, minmax(0, 1fr)); -} - -.grid-cols-11 { - grid-template-columns: repeat(11, minmax(0, 1fr)); -} - -.grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); -} - -.grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); -} - -.grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); -} - -.grid-cols-7 { - grid-template-columns: repeat(7, minmax(0, 1fr)); -} - -.grid-cols-8 { - grid-template-columns: repeat(8, minmax(0, 1fr)); -} - -.grid-cols-9 { - grid-template-columns: repeat(9, minmax(0, 1fr)); -} - -.grid-cols-none { - grid-template-columns: none; -} - -.flex-row { - flex-direction: row; -} - -.flex-row-reverse { - flex-direction: row-reverse; -} - -.flex-col { - flex-direction: column; -} - -.flex-col-reverse { - flex-direction: column-reverse; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.flex-nowrap { - flex-wrap: nowrap; -} - -.items-start { - align-items: flex-start; -} - -.items-end { - align-items: flex-end; -} - -.items-center { - align-items: center; -} - -.items-baseline { - align-items: baseline; -} - -.items-stretch { - align-items: stretch; -} - -.justify-start { - justify-content: flex-start; -} - -.justify-end { - justify-content: flex-end; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.justify-around { - justify-content: space-around; -} - -.justify-evenly { - justify-content: space-evenly; -} - -.gap-4 { - gap: 1rem; -} - -.gap-8 { - gap: 2rem; -} - -.space-x-0 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0px * var(--tw-space-x-reverse)); - margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-0\.5 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.125rem * var(--tw-space-x-reverse)); - margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.25rem * var(--tw-space-x-reverse)); - margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-1\.5 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.375rem * var(--tw-space-x-reverse)); - margin-left: calc(0.375rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-2\.5 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.625rem * var(--tw-space-x-reverse)); - margin-left: calc(0.625rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-3 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.75rem * var(--tw-space-x-reverse)); - margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-3\.5 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.875rem * var(--tw-space-x-reverse)); - margin-left: calc(0.875rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1rem * var(--tw-space-x-reverse)); - margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1.5rem * var(--tw-space-x-reverse)); - margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-px > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1px * var(--tw-space-x-reverse)); - margin-left: calc(1px * calc(1 - var(--tw-space-x-reverse))); -} - -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} - -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} - -.divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} - -.divide-amber-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 243 199 / var(--tw-divide-opacity)); -} - -.divide-amber-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(253 230 138 / var(--tw-divide-opacity)); -} - -.divide-amber-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(252 211 77 / var(--tw-divide-opacity)); -} - -.divide-amber-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(251 191 36 / var(--tw-divide-opacity)); -} - -.divide-amber-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(255 251 235 / var(--tw-divide-opacity)); -} - -.divide-amber-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(245 158 11 / var(--tw-divide-opacity)); -} - -.divide-amber-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(217 119 6 / var(--tw-divide-opacity)); -} - -.divide-amber-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(180 83 9 / var(--tw-divide-opacity)); -} - -.divide-amber-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(146 64 14 / var(--tw-divide-opacity)); -} - -.divide-amber-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(120 53 15 / var(--tw-divide-opacity)); -} - -.divide-black > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(0 0 0 / var(--tw-divide-opacity)); -} - -.divide-blue-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(219 234 254 / var(--tw-divide-opacity)); -} - -.divide-blue-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(191 219 254 / var(--tw-divide-opacity)); -} - -.divide-blue-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(147 197 253 / var(--tw-divide-opacity)); -} - -.divide-blue-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(96 165 250 / var(--tw-divide-opacity)); -} - -.divide-blue-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(239 246 255 / var(--tw-divide-opacity)); -} - -.divide-blue-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-divide-opacity)); -} - -.divide-blue-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(37 99 235 / var(--tw-divide-opacity)); -} - -.divide-blue-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(29 78 216 / var(--tw-divide-opacity)); -} - -.divide-blue-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(30 64 175 / var(--tw-divide-opacity)); -} - -.divide-blue-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(30 58 138 / var(--tw-divide-opacity)); -} - -.divide-cyan-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(207 250 254 / var(--tw-divide-opacity)); -} - -.divide-cyan-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(165 243 252 / var(--tw-divide-opacity)); -} - -.divide-cyan-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(103 232 249 / var(--tw-divide-opacity)); -} - -.divide-cyan-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(34 211 238 / var(--tw-divide-opacity)); -} - -.divide-cyan-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(236 254 255 / var(--tw-divide-opacity)); -} - -.divide-cyan-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(6 182 212 / var(--tw-divide-opacity)); -} - -.divide-cyan-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(8 145 178 / var(--tw-divide-opacity)); -} - -.divide-cyan-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(14 116 144 / var(--tw-divide-opacity)); -} - -.divide-cyan-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(21 94 117 / var(--tw-divide-opacity)); -} - -.divide-cyan-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(22 78 99 / var(--tw-divide-opacity)); -} - -.divide-emerald-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(209 250 229 / var(--tw-divide-opacity)); -} - -.divide-emerald-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(167 243 208 / var(--tw-divide-opacity)); -} - -.divide-emerald-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(110 231 183 / var(--tw-divide-opacity)); -} - -.divide-emerald-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(52 211 153 / var(--tw-divide-opacity)); -} - -.divide-emerald-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(236 253 245 / var(--tw-divide-opacity)); -} - -.divide-emerald-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(16 185 129 / var(--tw-divide-opacity)); -} - -.divide-emerald-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-divide-opacity)); -} - -.divide-emerald-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(4 120 87 / var(--tw-divide-opacity)); -} - -.divide-emerald-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(6 95 70 / var(--tw-divide-opacity)); -} - -.divide-emerald-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(6 78 59 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(250 232 255 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(245 208 254 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(240 171 252 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(232 121 249 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(253 244 255 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(217 70 239 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(192 38 211 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(162 28 175 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(134 25 143 / var(--tw-divide-opacity)); -} - -.divide-fuchsia-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(112 26 117 / var(--tw-divide-opacity)); -} - -.divide-gray-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(243 244 246 / var(--tw-divide-opacity)); -} - -.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-divide-opacity)); -} - -.divide-gray-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-divide-opacity)); -} - -.divide-gray-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(156 163 175 / var(--tw-divide-opacity)); -} - -.divide-gray-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(249 250 251 / var(--tw-divide-opacity)); -} - -.divide-gray-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-divide-opacity)); -} - -.divide-gray-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(75 85 99 / var(--tw-divide-opacity)); -} - -.divide-gray-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(55 65 81 / var(--tw-divide-opacity)); -} - -.divide-gray-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-divide-opacity)); -} - -.divide-gray-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(17 24 39 / var(--tw-divide-opacity)); -} - -.divide-green-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(220 252 231 / var(--tw-divide-opacity)); -} - -.divide-green-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(187 247 208 / var(--tw-divide-opacity)); -} - -.divide-green-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(134 239 172 / var(--tw-divide-opacity)); -} - -.divide-green-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(74 222 128 / var(--tw-divide-opacity)); -} - -.divide-green-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(240 253 244 / var(--tw-divide-opacity)); -} - -.divide-green-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(34 197 94 / var(--tw-divide-opacity)); -} - -.divide-green-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(22 163 74 / var(--tw-divide-opacity)); -} - -.divide-green-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(21 128 61 / var(--tw-divide-opacity)); -} - -.divide-green-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(22 101 52 / var(--tw-divide-opacity)); -} - -.divide-green-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(20 83 45 / var(--tw-divide-opacity)); -} - -.divide-indigo-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(224 231 255 / var(--tw-divide-opacity)); -} - -.divide-indigo-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(199 210 254 / var(--tw-divide-opacity)); -} - -.divide-indigo-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(165 180 252 / var(--tw-divide-opacity)); -} - -.divide-indigo-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(129 140 248 / var(--tw-divide-opacity)); -} - -.divide-indigo-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(238 242 255 / var(--tw-divide-opacity)); -} - -.divide-indigo-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(99 102 241 / var(--tw-divide-opacity)); -} - -.divide-indigo-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(79 70 229 / var(--tw-divide-opacity)); -} - -.divide-indigo-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(67 56 202 / var(--tw-divide-opacity)); -} - -.divide-indigo-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(55 48 163 / var(--tw-divide-opacity)); -} - -.divide-indigo-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(49 46 129 / var(--tw-divide-opacity)); -} - -.divide-lime-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(236 252 203 / var(--tw-divide-opacity)); -} - -.divide-lime-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(217 249 157 / var(--tw-divide-opacity)); -} - -.divide-lime-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(190 242 100 / var(--tw-divide-opacity)); -} - -.divide-lime-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(163 230 53 / var(--tw-divide-opacity)); -} - -.divide-lime-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(247 254 231 / var(--tw-divide-opacity)); -} - -.divide-lime-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(132 204 22 / var(--tw-divide-opacity)); -} - -.divide-lime-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(101 163 13 / var(--tw-divide-opacity)); -} - -.divide-lime-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(77 124 15 / var(--tw-divide-opacity)); -} - -.divide-lime-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(63 98 18 / var(--tw-divide-opacity)); -} - -.divide-lime-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(54 83 20 / var(--tw-divide-opacity)); -} - -.divide-neutral-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(245 245 245 / var(--tw-divide-opacity)); -} - -.divide-neutral-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(229 229 229 / var(--tw-divide-opacity)); -} - -.divide-neutral-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(212 212 212 / var(--tw-divide-opacity)); -} - -.divide-neutral-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(163 163 163 / var(--tw-divide-opacity)); -} - -.divide-neutral-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(250 250 250 / var(--tw-divide-opacity)); -} - -.divide-neutral-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(115 115 115 / var(--tw-divide-opacity)); -} - -.divide-neutral-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(82 82 82 / var(--tw-divide-opacity)); -} - -.divide-neutral-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(64 64 64 / var(--tw-divide-opacity)); -} - -.divide-neutral-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(38 38 38 / var(--tw-divide-opacity)); -} - -.divide-neutral-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(23 23 23 / var(--tw-divide-opacity)); -} - -.divide-orange-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(255 237 213 / var(--tw-divide-opacity)); -} - -.divide-orange-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 215 170 / var(--tw-divide-opacity)); -} - -.divide-orange-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(253 186 116 / var(--tw-divide-opacity)); -} - -.divide-orange-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(251 146 60 / var(--tw-divide-opacity)); -} - -.divide-orange-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(255 247 237 / var(--tw-divide-opacity)); -} - -.divide-orange-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-divide-opacity)); -} - -.divide-orange-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(234 88 12 / var(--tw-divide-opacity)); -} - -.divide-orange-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(194 65 12 / var(--tw-divide-opacity)); -} - -.divide-orange-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(154 52 18 / var(--tw-divide-opacity)); -} - -.divide-orange-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(124 45 18 / var(--tw-divide-opacity)); -} - -.divide-pink-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(252 231 243 / var(--tw-divide-opacity)); -} - -.divide-pink-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(251 207 232 / var(--tw-divide-opacity)); -} - -.divide-pink-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(249 168 212 / var(--tw-divide-opacity)); -} - -.divide-pink-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(244 114 182 / var(--tw-divide-opacity)); -} - -.divide-pink-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(253 242 248 / var(--tw-divide-opacity)); -} - -.divide-pink-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(236 72 153 / var(--tw-divide-opacity)); -} - -.divide-pink-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(219 39 119 / var(--tw-divide-opacity)); -} - -.divide-pink-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(190 24 93 / var(--tw-divide-opacity)); -} - -.divide-pink-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(131 24 67 / var(--tw-divide-opacity)); -} - -.divide-purple-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(243 232 255 / var(--tw-divide-opacity)); -} - -.divide-purple-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(233 213 255 / var(--tw-divide-opacity)); -} - -.divide-purple-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(216 180 254 / var(--tw-divide-opacity)); -} - -.divide-purple-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(192 132 252 / var(--tw-divide-opacity)); -} - -.divide-purple-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(250 245 255 / var(--tw-divide-opacity)); -} - -.divide-purple-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(168 85 247 / var(--tw-divide-opacity)); -} - -.divide-purple-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(147 51 234 / var(--tw-divide-opacity)); -} - -.divide-purple-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(126 34 206 / var(--tw-divide-opacity)); -} - -.divide-purple-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(107 33 168 / var(--tw-divide-opacity)); -} - -.divide-purple-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(88 28 135 / var(--tw-divide-opacity)); -} - -.divide-red-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 226 226 / var(--tw-divide-opacity)); -} - -.divide-red-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 202 202 / var(--tw-divide-opacity)); -} - -.divide-red-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(252 165 165 / var(--tw-divide-opacity)); -} - -.divide-red-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(248 113 113 / var(--tw-divide-opacity)); -} - -.divide-red-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 242 242 / var(--tw-divide-opacity)); -} - -.divide-red-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-divide-opacity)); -} - -.divide-red-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(220 38 38 / var(--tw-divide-opacity)); -} - -.divide-red-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(185 28 28 / var(--tw-divide-opacity)); -} - -.divide-red-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(153 27 27 / var(--tw-divide-opacity)); -} - -.divide-red-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(127 29 29 / var(--tw-divide-opacity)); -} - -.divide-rose-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(255 228 230 / var(--tw-divide-opacity)); -} - -.divide-rose-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 205 211 / var(--tw-divide-opacity)); -} - -.divide-rose-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(253 164 175 / var(--tw-divide-opacity)); -} - -.divide-rose-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(251 113 133 / var(--tw-divide-opacity)); -} - -.divide-rose-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(255 241 242 / var(--tw-divide-opacity)); -} - -.divide-rose-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(244 63 94 / var(--tw-divide-opacity)); -} - -.divide-rose-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(225 29 72 / var(--tw-divide-opacity)); -} - -.divide-rose-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(190 18 60 / var(--tw-divide-opacity)); -} - -.divide-rose-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(159 18 57 / var(--tw-divide-opacity)); -} - -.divide-rose-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(136 19 55 / var(--tw-divide-opacity)); -} - -.divide-sky-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(224 242 254 / var(--tw-divide-opacity)); -} - -.divide-sky-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(186 230 253 / var(--tw-divide-opacity)); -} - -.divide-sky-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(125 211 252 / var(--tw-divide-opacity)); -} - -.divide-sky-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(56 189 248 / var(--tw-divide-opacity)); -} - -.divide-sky-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(240 249 255 / var(--tw-divide-opacity)); -} - -.divide-sky-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(14 165 233 / var(--tw-divide-opacity)); -} - -.divide-sky-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(2 132 199 / var(--tw-divide-opacity)); -} - -.divide-sky-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(3 105 161 / var(--tw-divide-opacity)); -} - -.divide-sky-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(7 89 133 / var(--tw-divide-opacity)); -} - -.divide-sky-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(12 74 110 / var(--tw-divide-opacity)); -} - -.divide-slate-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(241 245 249 / var(--tw-divide-opacity)); -} - -.divide-slate-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-divide-opacity)); -} - -.divide-slate-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(203 213 225 / var(--tw-divide-opacity)); -} - -.divide-slate-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(148 163 184 / var(--tw-divide-opacity)); -} - -.divide-slate-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(248 250 252 / var(--tw-divide-opacity)); -} - -.divide-slate-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(100 116 139 / var(--tw-divide-opacity)); -} - -.divide-slate-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(71 85 105 / var(--tw-divide-opacity)); -} - -.divide-slate-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(51 65 85 / var(--tw-divide-opacity)); -} - -.divide-slate-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(30 41 59 / var(--tw-divide-opacity)); -} - -.divide-slate-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(15 23 42 / var(--tw-divide-opacity)); -} - -.divide-stone-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(245 245 244 / var(--tw-divide-opacity)); -} - -.divide-stone-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(231 229 228 / var(--tw-divide-opacity)); -} - -.divide-stone-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(214 211 209 / var(--tw-divide-opacity)); -} - -.divide-stone-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(168 162 158 / var(--tw-divide-opacity)); -} - -.divide-stone-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(250 250 249 / var(--tw-divide-opacity)); -} - -.divide-stone-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(120 113 108 / var(--tw-divide-opacity)); -} - -.divide-stone-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(87 83 78 / var(--tw-divide-opacity)); -} - -.divide-stone-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(68 64 60 / var(--tw-divide-opacity)); -} - -.divide-stone-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(41 37 36 / var(--tw-divide-opacity)); -} - -.divide-stone-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(28 25 23 / var(--tw-divide-opacity)); -} - -.divide-teal-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(204 251 241 / var(--tw-divide-opacity)); -} - -.divide-teal-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(153 246 228 / var(--tw-divide-opacity)); -} - -.divide-teal-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(94 234 212 / var(--tw-divide-opacity)); -} - -.divide-teal-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(45 212 191 / var(--tw-divide-opacity)); -} - -.divide-teal-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(240 253 250 / var(--tw-divide-opacity)); -} - -.divide-teal-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(20 184 166 / var(--tw-divide-opacity)); -} - -.divide-teal-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(13 148 136 / var(--tw-divide-opacity)); -} - -.divide-teal-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(15 118 110 / var(--tw-divide-opacity)); -} - -.divide-teal-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(17 94 89 / var(--tw-divide-opacity)); -} - -.divide-teal-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(19 78 74 / var(--tw-divide-opacity)); -} - -.divide-transparent > :not([hidden]) ~ :not([hidden]) { - border-color: transparent; -} - -.divide-violet-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(237 233 254 / var(--tw-divide-opacity)); -} - -.divide-violet-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(221 214 254 / var(--tw-divide-opacity)); -} - -.divide-violet-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(196 181 253 / var(--tw-divide-opacity)); -} - -.divide-violet-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(167 139 250 / var(--tw-divide-opacity)); -} - -.divide-violet-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(245 243 255 / var(--tw-divide-opacity)); -} - -.divide-violet-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(139 92 246 / var(--tw-divide-opacity)); -} - -.divide-violet-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(124 58 237 / var(--tw-divide-opacity)); -} - -.divide-violet-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(109 40 217 / var(--tw-divide-opacity)); -} - -.divide-violet-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(91 33 182 / var(--tw-divide-opacity)); -} - -.divide-violet-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(76 29 149 / var(--tw-divide-opacity)); -} - -.divide-white > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-divide-opacity)); -} - -.divide-yellow-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 249 195 / var(--tw-divide-opacity)); -} - -.divide-yellow-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 240 138 / var(--tw-divide-opacity)); -} - -.divide-yellow-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(253 224 71 / var(--tw-divide-opacity)); -} - -.divide-yellow-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(250 204 21 / var(--tw-divide-opacity)); -} - -.divide-yellow-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(254 252 232 / var(--tw-divide-opacity)); -} - -.divide-yellow-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(234 179 8 / var(--tw-divide-opacity)); -} - -.divide-yellow-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(202 138 4 / var(--tw-divide-opacity)); -} - -.divide-yellow-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(161 98 7 / var(--tw-divide-opacity)); -} - -.divide-yellow-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(133 77 14 / var(--tw-divide-opacity)); -} - -.divide-yellow-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(113 63 18 / var(--tw-divide-opacity)); -} - -.divide-zinc-100 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(244 244 245 / var(--tw-divide-opacity)); -} - -.divide-zinc-200 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(228 228 231 / var(--tw-divide-opacity)); -} - -.divide-zinc-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(212 212 216 / var(--tw-divide-opacity)); -} - -.divide-zinc-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(161 161 170 / var(--tw-divide-opacity)); -} - -.divide-zinc-50 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(250 250 250 / var(--tw-divide-opacity)); -} - -.divide-zinc-500 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(113 113 122 / var(--tw-divide-opacity)); -} - -.divide-zinc-600 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(82 82 91 / var(--tw-divide-opacity)); -} - -.divide-zinc-700 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(63 63 70 / var(--tw-divide-opacity)); -} - -.divide-zinc-800 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(39 39 42 / var(--tw-divide-opacity)); -} - -.divide-zinc-900 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(24 24 27 / var(--tw-divide-opacity)); -} - -.overflow-auto { - overflow: auto; -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-x-auto { - overflow-x: auto; -} - -.overflow-y-auto { - overflow-y: auto; -} - -.overflow-x-clip { - overflow-x: clip; -} - -.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-md { - border-radius: 0.375rem; -} - -.rounded-none { - border-radius: 0px; -} - -.rounded-b { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.rounded-b-full { - border-bottom-right-radius: 9999px; - border-bottom-left-radius: 9999px; -} - -.rounded-b-lg { - border-bottom-right-radius: 0.5rem; - border-bottom-left-radius: 0.5rem; -} - -.rounded-b-md { - border-bottom-right-radius: 0.375rem; - border-bottom-left-radius: 0.375rem; -} - -.rounded-b-none { - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; -} - -.rounded-l { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.rounded-l-full { - border-top-left-radius: 9999px; - border-bottom-left-radius: 9999px; -} - -.rounded-l-lg { - border-top-left-radius: 0.5rem; - border-bottom-left-radius: 0.5rem; -} - -.rounded-l-md { - border-top-left-radius: 0.375rem; - border-bottom-left-radius: 0.375rem; -} - -.rounded-l-none { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; -} - -.rounded-r { - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; -} - -.rounded-r-full { - border-top-right-radius: 9999px; - border-bottom-right-radius: 9999px; -} - -.rounded-r-lg { - border-top-right-radius: 0.5rem; - border-bottom-right-radius: 0.5rem; -} - -.rounded-r-md { - border-top-right-radius: 0.375rem; - border-bottom-right-radius: 0.375rem; -} - -.rounded-r-none { - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; -} - -.rounded-t { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.rounded-t-full { - border-top-left-radius: 9999px; - border-top-right-radius: 9999px; -} - -.rounded-t-lg { - border-top-left-radius: 0.5rem; - border-top-right-radius: 0.5rem; -} - -.rounded-t-md { - border-top-left-radius: 0.375rem; - border-top-right-radius: 0.375rem; -} - -.rounded-t-none { - border-top-left-radius: 0px; - border-top-right-radius: 0px; -} - -.border { - border-width: 1px; -} - -.border-0 { - border-width: 0px; -} - -.border-2 { - border-width: 2px; -} - -.border-4 { - border-width: 4px; -} - -.border-b { - border-bottom-width: 1px; -} - -.border-b-0 { - border-bottom-width: 0px; -} - -.border-b-2 { - border-bottom-width: 2px; -} - -.border-b-4 { - border-bottom-width: 4px; -} - -.border-l { - border-left-width: 1px; -} - -.border-l-0 { - border-left-width: 0px; -} - -.border-l-2 { - border-left-width: 2px; -} - -.border-l-4 { - border-left-width: 4px; -} - -.border-r { - border-right-width: 1px; -} - -.border-r-0 { - border-right-width: 0px; -} - -.border-r-2 { - border-right-width: 2px; -} - -.border-r-4 { - border-right-width: 4px; -} - -.border-t { - border-top-width: 1px; -} - -.border-t-0 { - border-top-width: 0px; -} - -.border-t-2 { - border-top-width: 2px; -} - -.border-t-4 { - border-top-width: 4px; -} - -.border-solid { - border-style: solid; -} - -.border-dashed { - border-style: dashed; -} - -.border-amber-100 { - --tw-border-opacity: 1; - border-color: rgb(254 243 199 / var(--tw-border-opacity)); -} - -.border-amber-200 { - --tw-border-opacity: 1; - border-color: rgb(253 230 138 / var(--tw-border-opacity)); -} - -.border-amber-300 { - --tw-border-opacity: 1; - border-color: rgb(252 211 77 / var(--tw-border-opacity)); -} - -.border-amber-400 { - --tw-border-opacity: 1; - border-color: rgb(251 191 36 / var(--tw-border-opacity)); -} - -.border-amber-50 { - --tw-border-opacity: 1; - border-color: rgb(255 251 235 / var(--tw-border-opacity)); -} - -.border-amber-500 { - --tw-border-opacity: 1; - border-color: rgb(245 158 11 / var(--tw-border-opacity)); -} - -.border-amber-600 { - --tw-border-opacity: 1; - border-color: rgb(217 119 6 / var(--tw-border-opacity)); -} - -.border-amber-700 { - --tw-border-opacity: 1; - border-color: rgb(180 83 9 / var(--tw-border-opacity)); -} - -.border-amber-800 { - --tw-border-opacity: 1; - border-color: rgb(146 64 14 / var(--tw-border-opacity)); -} - -.border-amber-900 { - --tw-border-opacity: 1; - border-color: rgb(120 53 15 / var(--tw-border-opacity)); -} - -.border-black { - --tw-border-opacity: 1; - border-color: rgb(0 0 0 / var(--tw-border-opacity)); -} - -.border-blue-100 { - --tw-border-opacity: 1; - border-color: rgb(219 234 254 / var(--tw-border-opacity)); -} - -.border-blue-200 { - --tw-border-opacity: 1; - border-color: rgb(191 219 254 / var(--tw-border-opacity)); -} - -.border-blue-300 { - --tw-border-opacity: 1; - border-color: rgb(147 197 253 / var(--tw-border-opacity)); -} - -.border-blue-400 { - --tw-border-opacity: 1; - border-color: rgb(96 165 250 / var(--tw-border-opacity)); -} - -.border-blue-50 { - --tw-border-opacity: 1; - border-color: rgb(239 246 255 / var(--tw-border-opacity)); -} - -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} - -.border-blue-600 { - --tw-border-opacity: 1; - border-color: rgb(37 99 235 / var(--tw-border-opacity)); -} - -.border-blue-700 { - --tw-border-opacity: 1; - border-color: rgb(29 78 216 / var(--tw-border-opacity)); -} - -.border-blue-800 { - --tw-border-opacity: 1; - border-color: rgb(30 64 175 / var(--tw-border-opacity)); -} - -.border-blue-900 { - --tw-border-opacity: 1; - border-color: rgb(30 58 138 / var(--tw-border-opacity)); -} - -.border-cyan-100 { - --tw-border-opacity: 1; - border-color: rgb(207 250 254 / var(--tw-border-opacity)); -} - -.border-cyan-200 { - --tw-border-opacity: 1; - border-color: rgb(165 243 252 / var(--tw-border-opacity)); -} - -.border-cyan-300 { - --tw-border-opacity: 1; - border-color: rgb(103 232 249 / var(--tw-border-opacity)); -} - -.border-cyan-400 { - --tw-border-opacity: 1; - border-color: rgb(34 211 238 / var(--tw-border-opacity)); -} - -.border-cyan-50 { - --tw-border-opacity: 1; - border-color: rgb(236 254 255 / var(--tw-border-opacity)); -} - -.border-cyan-500 { - --tw-border-opacity: 1; - border-color: rgb(6 182 212 / var(--tw-border-opacity)); -} - -.border-cyan-600 { - --tw-border-opacity: 1; - border-color: rgb(8 145 178 / var(--tw-border-opacity)); -} - -.border-cyan-700 { - --tw-border-opacity: 1; - border-color: rgb(14 116 144 / var(--tw-border-opacity)); -} - -.border-cyan-800 { - --tw-border-opacity: 1; - border-color: rgb(21 94 117 / var(--tw-border-opacity)); -} - -.border-cyan-900 { - --tw-border-opacity: 1; - border-color: rgb(22 78 99 / var(--tw-border-opacity)); -} - -.border-emerald-100 { - --tw-border-opacity: 1; - border-color: rgb(209 250 229 / var(--tw-border-opacity)); -} - -.border-emerald-200 { - --tw-border-opacity: 1; - border-color: rgb(167 243 208 / var(--tw-border-opacity)); -} - -.border-emerald-300 { - --tw-border-opacity: 1; - border-color: rgb(110 231 183 / var(--tw-border-opacity)); -} - -.border-emerald-400 { - --tw-border-opacity: 1; - border-color: rgb(52 211 153 / var(--tw-border-opacity)); -} - -.border-emerald-50 { - --tw-border-opacity: 1; - border-color: rgb(236 253 245 / var(--tw-border-opacity)); -} - -.border-emerald-500 { - --tw-border-opacity: 1; - border-color: rgb(16 185 129 / var(--tw-border-opacity)); -} - -.border-emerald-600 { - --tw-border-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-border-opacity)); -} - -.border-emerald-700 { - --tw-border-opacity: 1; - border-color: rgb(4 120 87 / var(--tw-border-opacity)); -} - -.border-emerald-800 { - --tw-border-opacity: 1; - border-color: rgb(6 95 70 / var(--tw-border-opacity)); -} - -.border-emerald-900 { - --tw-border-opacity: 1; - border-color: rgb(6 78 59 / var(--tw-border-opacity)); -} - -.border-fuchsia-100 { - --tw-border-opacity: 1; - border-color: rgb(250 232 255 / var(--tw-border-opacity)); -} - -.border-fuchsia-200 { - --tw-border-opacity: 1; - border-color: rgb(245 208 254 / var(--tw-border-opacity)); -} - -.border-fuchsia-300 { - --tw-border-opacity: 1; - border-color: rgb(240 171 252 / var(--tw-border-opacity)); -} - -.border-fuchsia-400 { - --tw-border-opacity: 1; - border-color: rgb(232 121 249 / var(--tw-border-opacity)); -} - -.border-fuchsia-50 { - --tw-border-opacity: 1; - border-color: rgb(253 244 255 / var(--tw-border-opacity)); -} - -.border-fuchsia-500 { - --tw-border-opacity: 1; - border-color: rgb(217 70 239 / var(--tw-border-opacity)); -} - -.border-fuchsia-600 { - --tw-border-opacity: 1; - border-color: rgb(192 38 211 / var(--tw-border-opacity)); -} - -.border-fuchsia-700 { - --tw-border-opacity: 1; - border-color: rgb(162 28 175 / var(--tw-border-opacity)); -} - -.border-fuchsia-800 { - --tw-border-opacity: 1; - border-color: rgb(134 25 143 / var(--tw-border-opacity)); -} - -.border-fuchsia-900 { - --tw-border-opacity: 1; - border-color: rgb(112 26 117 / var(--tw-border-opacity)); -} - -.border-gray-100 { - --tw-border-opacity: 1; - border-color: rgb(243 244 246 / var(--tw-border-opacity)); -} - -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity)); -} - -.border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} - -.border-gray-400 { - --tw-border-opacity: 1; - border-color: rgb(156 163 175 / var(--tw-border-opacity)); -} - -.border-gray-50 { - --tw-border-opacity: 1; - border-color: rgb(249 250 251 / var(--tw-border-opacity)); -} - -.border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); -} - -.border-gray-600 { - --tw-border-opacity: 1; - border-color: rgb(75 85 99 / var(--tw-border-opacity)); -} - -.border-gray-700 { - --tw-border-opacity: 1; - border-color: rgb(55 65 81 / var(--tw-border-opacity)); -} - -.border-gray-800 { - --tw-border-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-border-opacity)); -} - -.border-gray-900 { - --tw-border-opacity: 1; - border-color: rgb(17 24 39 / var(--tw-border-opacity)); -} - -.border-green-100 { - --tw-border-opacity: 1; - border-color: rgb(220 252 231 / var(--tw-border-opacity)); -} - -.border-green-200 { - --tw-border-opacity: 1; - border-color: rgb(187 247 208 / var(--tw-border-opacity)); -} - -.border-green-300 { - --tw-border-opacity: 1; - border-color: rgb(134 239 172 / var(--tw-border-opacity)); -} - -.border-green-400 { - --tw-border-opacity: 1; - border-color: rgb(74 222 128 / var(--tw-border-opacity)); -} - -.border-green-50 { - --tw-border-opacity: 1; - border-color: rgb(240 253 244 / var(--tw-border-opacity)); -} - -.border-green-500 { - --tw-border-opacity: 1; - border-color: rgb(34 197 94 / var(--tw-border-opacity)); -} - -.border-green-600 { - --tw-border-opacity: 1; - border-color: rgb(22 163 74 / var(--tw-border-opacity)); -} - -.border-green-700 { - --tw-border-opacity: 1; - border-color: rgb(21 128 61 / var(--tw-border-opacity)); -} - -.border-green-800 { - --tw-border-opacity: 1; - border-color: rgb(22 101 52 / var(--tw-border-opacity)); -} - -.border-green-900 { - --tw-border-opacity: 1; - border-color: rgb(20 83 45 / var(--tw-border-opacity)); -} - -.border-indigo-100 { - --tw-border-opacity: 1; - border-color: rgb(224 231 255 / var(--tw-border-opacity)); -} - -.border-indigo-200 { - --tw-border-opacity: 1; - border-color: rgb(199 210 254 / var(--tw-border-opacity)); -} - -.border-indigo-300 { - --tw-border-opacity: 1; - border-color: rgb(165 180 252 / var(--tw-border-opacity)); -} - -.border-indigo-400 { - --tw-border-opacity: 1; - border-color: rgb(129 140 248 / var(--tw-border-opacity)); -} - -.border-indigo-50 { - --tw-border-opacity: 1; - border-color: rgb(238 242 255 / var(--tw-border-opacity)); -} - -.border-indigo-500 { - --tw-border-opacity: 1; - border-color: rgb(99 102 241 / var(--tw-border-opacity)); -} - -.border-indigo-600 { - --tw-border-opacity: 1; - border-color: rgb(79 70 229 / var(--tw-border-opacity)); -} - -.border-indigo-700 { - --tw-border-opacity: 1; - border-color: rgb(67 56 202 / var(--tw-border-opacity)); -} - -.border-indigo-800 { - --tw-border-opacity: 1; - border-color: rgb(55 48 163 / var(--tw-border-opacity)); -} - -.border-indigo-900 { - --tw-border-opacity: 1; - border-color: rgb(49 46 129 / var(--tw-border-opacity)); -} - -.border-lime-100 { - --tw-border-opacity: 1; - border-color: rgb(236 252 203 / var(--tw-border-opacity)); -} - -.border-lime-200 { - --tw-border-opacity: 1; - border-color: rgb(217 249 157 / var(--tw-border-opacity)); -} - -.border-lime-300 { - --tw-border-opacity: 1; - border-color: rgb(190 242 100 / var(--tw-border-opacity)); -} - -.border-lime-400 { - --tw-border-opacity: 1; - border-color: rgb(163 230 53 / var(--tw-border-opacity)); -} - -.border-lime-50 { - --tw-border-opacity: 1; - border-color: rgb(247 254 231 / var(--tw-border-opacity)); -} - -.border-lime-500 { - --tw-border-opacity: 1; - border-color: rgb(132 204 22 / var(--tw-border-opacity)); -} - -.border-lime-600 { - --tw-border-opacity: 1; - border-color: rgb(101 163 13 / var(--tw-border-opacity)); -} - -.border-lime-700 { - --tw-border-opacity: 1; - border-color: rgb(77 124 15 / var(--tw-border-opacity)); -} - -.border-lime-800 { - --tw-border-opacity: 1; - border-color: rgb(63 98 18 / var(--tw-border-opacity)); -} - -.border-lime-900 { - --tw-border-opacity: 1; - border-color: rgb(54 83 20 / var(--tw-border-opacity)); -} - -.border-neutral-100 { - --tw-border-opacity: 1; - border-color: rgb(245 245 245 / var(--tw-border-opacity)); -} - -.border-neutral-200 { - --tw-border-opacity: 1; - border-color: rgb(229 229 229 / var(--tw-border-opacity)); -} - -.border-neutral-300 { - --tw-border-opacity: 1; - border-color: rgb(212 212 212 / var(--tw-border-opacity)); -} - -.border-neutral-400 { - --tw-border-opacity: 1; - border-color: rgb(163 163 163 / var(--tw-border-opacity)); -} - -.border-neutral-50 { - --tw-border-opacity: 1; - border-color: rgb(250 250 250 / var(--tw-border-opacity)); -} - -.border-neutral-500 { - --tw-border-opacity: 1; - border-color: rgb(115 115 115 / var(--tw-border-opacity)); -} - -.border-neutral-600 { - --tw-border-opacity: 1; - border-color: rgb(82 82 82 / var(--tw-border-opacity)); -} - -.border-neutral-700 { - --tw-border-opacity: 1; - border-color: rgb(64 64 64 / var(--tw-border-opacity)); -} - -.border-neutral-800 { - --tw-border-opacity: 1; - border-color: rgb(38 38 38 / var(--tw-border-opacity)); -} - -.border-neutral-900 { - --tw-border-opacity: 1; - border-color: rgb(23 23 23 / var(--tw-border-opacity)); -} - -.border-orange-100 { - --tw-border-opacity: 1; - border-color: rgb(255 237 213 / var(--tw-border-opacity)); -} - -.border-orange-200 { - --tw-border-opacity: 1; - border-color: rgb(254 215 170 / var(--tw-border-opacity)); -} - -.border-orange-300 { - --tw-border-opacity: 1; - border-color: rgb(253 186 116 / var(--tw-border-opacity)); -} - -.border-orange-400 { - --tw-border-opacity: 1; - border-color: rgb(251 146 60 / var(--tw-border-opacity)); -} - -.border-orange-50 { - --tw-border-opacity: 1; - border-color: rgb(255 247 237 / var(--tw-border-opacity)); -} - -.border-orange-500 { - --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); -} - -.border-orange-600 { - --tw-border-opacity: 1; - border-color: rgb(234 88 12 / var(--tw-border-opacity)); -} - -.border-orange-700 { - --tw-border-opacity: 1; - border-color: rgb(194 65 12 / var(--tw-border-opacity)); -} - -.border-orange-800 { - --tw-border-opacity: 1; - border-color: rgb(154 52 18 / var(--tw-border-opacity)); -} - -.border-orange-900 { - --tw-border-opacity: 1; - border-color: rgb(124 45 18 / var(--tw-border-opacity)); -} - -.border-pink-100 { - --tw-border-opacity: 1; - border-color: rgb(252 231 243 / var(--tw-border-opacity)); -} - -.border-pink-200 { - --tw-border-opacity: 1; - border-color: rgb(251 207 232 / var(--tw-border-opacity)); -} - -.border-pink-300 { - --tw-border-opacity: 1; - border-color: rgb(249 168 212 / var(--tw-border-opacity)); -} - -.border-pink-400 { - --tw-border-opacity: 1; - border-color: rgb(244 114 182 / var(--tw-border-opacity)); -} - -.border-pink-50 { - --tw-border-opacity: 1; - border-color: rgb(253 242 248 / var(--tw-border-opacity)); -} - -.border-pink-500 { - --tw-border-opacity: 1; - border-color: rgb(236 72 153 / var(--tw-border-opacity)); -} - -.border-pink-600 { - --tw-border-opacity: 1; - border-color: rgb(219 39 119 / var(--tw-border-opacity)); -} - -.border-pink-700 { - --tw-border-opacity: 1; - border-color: rgb(190 24 93 / var(--tw-border-opacity)); -} - -.border-pink-900 { - --tw-border-opacity: 1; - border-color: rgb(131 24 67 / var(--tw-border-opacity)); -} - -.border-purple-100 { - --tw-border-opacity: 1; - border-color: rgb(243 232 255 / var(--tw-border-opacity)); -} - -.border-purple-200 { - --tw-border-opacity: 1; - border-color: rgb(233 213 255 / var(--tw-border-opacity)); -} - -.border-purple-300 { - --tw-border-opacity: 1; - border-color: rgb(216 180 254 / var(--tw-border-opacity)); -} - -.border-purple-400 { - --tw-border-opacity: 1; - border-color: rgb(192 132 252 / var(--tw-border-opacity)); -} - -.border-purple-50 { - --tw-border-opacity: 1; - border-color: rgb(250 245 255 / var(--tw-border-opacity)); -} - -.border-purple-500 { - --tw-border-opacity: 1; - border-color: rgb(168 85 247 / var(--tw-border-opacity)); -} - -.border-purple-600 { - --tw-border-opacity: 1; - border-color: rgb(147 51 234 / var(--tw-border-opacity)); -} - -.border-purple-700 { - --tw-border-opacity: 1; - border-color: rgb(126 34 206 / var(--tw-border-opacity)); -} - -.border-purple-800 { - --tw-border-opacity: 1; - border-color: rgb(107 33 168 / var(--tw-border-opacity)); -} - -.border-purple-900 { - --tw-border-opacity: 1; - border-color: rgb(88 28 135 / var(--tw-border-opacity)); -} - -.border-red-100 { - --tw-border-opacity: 1; - border-color: rgb(254 226 226 / var(--tw-border-opacity)); -} - -.border-red-200 { - --tw-border-opacity: 1; - border-color: rgb(254 202 202 / var(--tw-border-opacity)); -} - -.border-red-300 { - --tw-border-opacity: 1; - border-color: rgb(252 165 165 / var(--tw-border-opacity)); -} - -.border-red-400 { - --tw-border-opacity: 1; - border-color: rgb(248 113 113 / var(--tw-border-opacity)); -} - -.border-red-50 { - --tw-border-opacity: 1; - border-color: rgb(254 242 242 / var(--tw-border-opacity)); -} - -.border-red-500 { - --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); -} - -.border-red-600 { - --tw-border-opacity: 1; - border-color: rgb(220 38 38 / var(--tw-border-opacity)); -} - -.border-red-700 { - --tw-border-opacity: 1; - border-color: rgb(185 28 28 / var(--tw-border-opacity)); -} - -.border-red-800 { - --tw-border-opacity: 1; - border-color: rgb(153 27 27 / var(--tw-border-opacity)); -} - -.border-red-900 { - --tw-border-opacity: 1; - border-color: rgb(127 29 29 / var(--tw-border-opacity)); -} - -.border-rose-100 { - --tw-border-opacity: 1; - border-color: rgb(255 228 230 / var(--tw-border-opacity)); -} - -.border-rose-200 { - --tw-border-opacity: 1; - border-color: rgb(254 205 211 / var(--tw-border-opacity)); -} - -.border-rose-300 { - --tw-border-opacity: 1; - border-color: rgb(253 164 175 / var(--tw-border-opacity)); -} - -.border-rose-400 { - --tw-border-opacity: 1; - border-color: rgb(251 113 133 / var(--tw-border-opacity)); -} - -.border-rose-50 { - --tw-border-opacity: 1; - border-color: rgb(255 241 242 / var(--tw-border-opacity)); -} - -.border-rose-500 { - --tw-border-opacity: 1; - border-color: rgb(244 63 94 / var(--tw-border-opacity)); -} - -.border-rose-600 { - --tw-border-opacity: 1; - border-color: rgb(225 29 72 / var(--tw-border-opacity)); -} - -.border-rose-700 { - --tw-border-opacity: 1; - border-color: rgb(190 18 60 / var(--tw-border-opacity)); -} - -.border-rose-800 { - --tw-border-opacity: 1; - border-color: rgb(159 18 57 / var(--tw-border-opacity)); -} - -.border-rose-900 { - --tw-border-opacity: 1; - border-color: rgb(136 19 55 / var(--tw-border-opacity)); -} - -.border-sky-100 { - --tw-border-opacity: 1; - border-color: rgb(224 242 254 / var(--tw-border-opacity)); -} - -.border-sky-200 { - --tw-border-opacity: 1; - border-color: rgb(186 230 253 / var(--tw-border-opacity)); -} - -.border-sky-300 { - --tw-border-opacity: 1; - border-color: rgb(125 211 252 / var(--tw-border-opacity)); -} - -.border-sky-400 { - --tw-border-opacity: 1; - border-color: rgb(56 189 248 / var(--tw-border-opacity)); -} - -.border-sky-50 { - --tw-border-opacity: 1; - border-color: rgb(240 249 255 / var(--tw-border-opacity)); -} - -.border-sky-500 { - --tw-border-opacity: 1; - border-color: rgb(14 165 233 / var(--tw-border-opacity)); -} - -.border-sky-600 { - --tw-border-opacity: 1; - border-color: rgb(2 132 199 / var(--tw-border-opacity)); -} - -.border-sky-700 { - --tw-border-opacity: 1; - border-color: rgb(3 105 161 / var(--tw-border-opacity)); -} - -.border-sky-800 { - --tw-border-opacity: 1; - border-color: rgb(7 89 133 / var(--tw-border-opacity)); -} - -.border-sky-900 { - --tw-border-opacity: 1; - border-color: rgb(12 74 110 / var(--tw-border-opacity)); -} - -.border-slate-100 { - --tw-border-opacity: 1; - border-color: rgb(241 245 249 / var(--tw-border-opacity)); -} - -.border-slate-200 { - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)); -} - -.border-slate-300 { - --tw-border-opacity: 1; - border-color: rgb(203 213 225 / var(--tw-border-opacity)); -} - -.border-slate-400 { - --tw-border-opacity: 1; - border-color: rgb(148 163 184 / var(--tw-border-opacity)); -} - -.border-slate-50 { - --tw-border-opacity: 1; - border-color: rgb(248 250 252 / var(--tw-border-opacity)); -} - -.border-slate-500 { - --tw-border-opacity: 1; - border-color: rgb(100 116 139 / var(--tw-border-opacity)); -} - -.border-slate-600 { - --tw-border-opacity: 1; - border-color: rgb(71 85 105 / var(--tw-border-opacity)); -} - -.border-slate-700 { - --tw-border-opacity: 1; - border-color: rgb(51 65 85 / var(--tw-border-opacity)); -} - -.border-slate-800 { - --tw-border-opacity: 1; - border-color: rgb(30 41 59 / var(--tw-border-opacity)); -} - -.border-slate-900 { - --tw-border-opacity: 1; - border-color: rgb(15 23 42 / var(--tw-border-opacity)); -} - -.border-stone-100 { - --tw-border-opacity: 1; - border-color: rgb(245 245 244 / var(--tw-border-opacity)); -} - -.border-stone-200 { - --tw-border-opacity: 1; - border-color: rgb(231 229 228 / var(--tw-border-opacity)); -} - -.border-stone-300 { - --tw-border-opacity: 1; - border-color: rgb(214 211 209 / var(--tw-border-opacity)); -} - -.border-stone-400 { - --tw-border-opacity: 1; - border-color: rgb(168 162 158 / var(--tw-border-opacity)); -} - -.border-stone-50 { - --tw-border-opacity: 1; - border-color: rgb(250 250 249 / var(--tw-border-opacity)); -} - -.border-stone-500 { - --tw-border-opacity: 1; - border-color: rgb(120 113 108 / var(--tw-border-opacity)); -} - -.border-stone-600 { - --tw-border-opacity: 1; - border-color: rgb(87 83 78 / var(--tw-border-opacity)); -} - -.border-stone-700 { - --tw-border-opacity: 1; - border-color: rgb(68 64 60 / var(--tw-border-opacity)); -} - -.border-stone-800 { - --tw-border-opacity: 1; - border-color: rgb(41 37 36 / var(--tw-border-opacity)); -} - -.border-stone-900 { - --tw-border-opacity: 1; - border-color: rgb(28 25 23 / var(--tw-border-opacity)); -} - -.border-teal-100 { - --tw-border-opacity: 1; - border-color: rgb(204 251 241 / var(--tw-border-opacity)); -} - -.border-teal-200 { - --tw-border-opacity: 1; - border-color: rgb(153 246 228 / var(--tw-border-opacity)); -} - -.border-teal-300 { - --tw-border-opacity: 1; - border-color: rgb(94 234 212 / var(--tw-border-opacity)); -} - -.border-teal-400 { - --tw-border-opacity: 1; - border-color: rgb(45 212 191 / var(--tw-border-opacity)); -} - -.border-teal-50 { - --tw-border-opacity: 1; - border-color: rgb(240 253 250 / var(--tw-border-opacity)); -} - -.border-teal-500 { - --tw-border-opacity: 1; - border-color: rgb(20 184 166 / var(--tw-border-opacity)); -} - -.border-teal-600 { - --tw-border-opacity: 1; - border-color: rgb(13 148 136 / var(--tw-border-opacity)); -} - -.border-teal-700 { - --tw-border-opacity: 1; - border-color: rgb(15 118 110 / var(--tw-border-opacity)); -} - -.border-teal-800 { - --tw-border-opacity: 1; - border-color: rgb(17 94 89 / var(--tw-border-opacity)); -} - -.border-teal-900 { - --tw-border-opacity: 1; - border-color: rgb(19 78 74 / var(--tw-border-opacity)); -} - -.border-transparent { - border-color: transparent; -} - -.border-violet-100 { - --tw-border-opacity: 1; - border-color: rgb(237 233 254 / var(--tw-border-opacity)); -} - -.border-violet-200 { - --tw-border-opacity: 1; - border-color: rgb(221 214 254 / var(--tw-border-opacity)); -} - -.border-violet-300 { - --tw-border-opacity: 1; - border-color: rgb(196 181 253 / var(--tw-border-opacity)); -} - -.border-violet-400 { - --tw-border-opacity: 1; - border-color: rgb(167 139 250 / var(--tw-border-opacity)); -} - -.border-violet-50 { - --tw-border-opacity: 1; - border-color: rgb(245 243 255 / var(--tw-border-opacity)); -} - -.border-violet-500 { - --tw-border-opacity: 1; - border-color: rgb(139 92 246 / var(--tw-border-opacity)); -} - -.border-violet-600 { - --tw-border-opacity: 1; - border-color: rgb(124 58 237 / var(--tw-border-opacity)); -} - -.border-violet-700 { - --tw-border-opacity: 1; - border-color: rgb(109 40 217 / var(--tw-border-opacity)); -} - -.border-violet-800 { - --tw-border-opacity: 1; - border-color: rgb(91 33 182 / var(--tw-border-opacity)); -} - -.border-violet-900 { - --tw-border-opacity: 1; - border-color: rgb(76 29 149 / var(--tw-border-opacity)); -} - -.border-white { - --tw-border-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-border-opacity)); -} - -.border-yellow-100 { - --tw-border-opacity: 1; - border-color: rgb(254 249 195 / var(--tw-border-opacity)); -} - -.border-yellow-200 { - --tw-border-opacity: 1; - border-color: rgb(254 240 138 / var(--tw-border-opacity)); -} - -.border-yellow-300 { - --tw-border-opacity: 1; - border-color: rgb(253 224 71 / var(--tw-border-opacity)); -} - -.border-yellow-400 { - --tw-border-opacity: 1; - border-color: rgb(250 204 21 / var(--tw-border-opacity)); -} - -.border-yellow-50 { - --tw-border-opacity: 1; - border-color: rgb(254 252 232 / var(--tw-border-opacity)); -} - -.border-yellow-500 { - --tw-border-opacity: 1; - border-color: rgb(234 179 8 / var(--tw-border-opacity)); -} - -.border-yellow-600 { - --tw-border-opacity: 1; - border-color: rgb(202 138 4 / var(--tw-border-opacity)); -} - -.border-yellow-700 { - --tw-border-opacity: 1; - border-color: rgb(161 98 7 / var(--tw-border-opacity)); -} - -.border-yellow-800 { - --tw-border-opacity: 1; - border-color: rgb(133 77 14 / var(--tw-border-opacity)); -} - -.border-yellow-900 { - --tw-border-opacity: 1; - border-color: rgb(113 63 18 / var(--tw-border-opacity)); -} - -.border-zinc-100 { - --tw-border-opacity: 1; - border-color: rgb(244 244 245 / var(--tw-border-opacity)); -} - -.border-zinc-200 { - --tw-border-opacity: 1; - border-color: rgb(228 228 231 / var(--tw-border-opacity)); -} - -.border-zinc-300 { - --tw-border-opacity: 1; - border-color: rgb(212 212 216 / var(--tw-border-opacity)); -} - -.border-zinc-400 { - --tw-border-opacity: 1; - border-color: rgb(161 161 170 / var(--tw-border-opacity)); -} - -.border-zinc-50 { - --tw-border-opacity: 1; - border-color: rgb(250 250 250 / var(--tw-border-opacity)); -} - -.border-zinc-500 { - --tw-border-opacity: 1; - border-color: rgb(113 113 122 / var(--tw-border-opacity)); -} - -.border-zinc-600 { - --tw-border-opacity: 1; - border-color: rgb(82 82 91 / var(--tw-border-opacity)); -} - -.border-zinc-700 { - --tw-border-opacity: 1; - border-color: rgb(63 63 70 / var(--tw-border-opacity)); -} - -.border-zinc-800 { - --tw-border-opacity: 1; - border-color: rgb(39 39 42 / var(--tw-border-opacity)); -} - -.border-zinc-900 { - --tw-border-opacity: 1; - border-color: rgb(24 24 27 / var(--tw-border-opacity)); -} - -.border-b-gray-500 { - --tw-border-opacity: 1; - border-bottom-color: rgb(107 114 128 / var(--tw-border-opacity)); -} - -.bg-amber-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 243 199 / var(--tw-bg-opacity)); -} - -.bg-amber-200 { - --tw-bg-opacity: 1; - background-color: rgb(253 230 138 / var(--tw-bg-opacity)); -} - -.bg-amber-300 { - --tw-bg-opacity: 1; - background-color: rgb(252 211 77 / var(--tw-bg-opacity)); -} - -.bg-amber-400 { - --tw-bg-opacity: 1; - background-color: rgb(251 191 36 / var(--tw-bg-opacity)); -} - -.bg-amber-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 251 235 / var(--tw-bg-opacity)); -} - -.bg-amber-500 { - --tw-bg-opacity: 1; - background-color: rgb(245 158 11 / var(--tw-bg-opacity)); -} - -.bg-amber-600 { - --tw-bg-opacity: 1; - background-color: rgb(217 119 6 / var(--tw-bg-opacity)); -} - -.bg-amber-700 { - --tw-bg-opacity: 1; - background-color: rgb(180 83 9 / var(--tw-bg-opacity)); -} - -.bg-amber-800 { - --tw-bg-opacity: 1; - background-color: rgb(146 64 14 / var(--tw-bg-opacity)); -} - -.bg-amber-900 { - --tw-bg-opacity: 1; - background-color: rgb(120 53 15 / var(--tw-bg-opacity)); -} - -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity)); -} - -.bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgb(219 234 254 / var(--tw-bg-opacity)); -} - -.bg-blue-200 { - --tw-bg-opacity: 1; - background-color: rgb(191 219 254 / var(--tw-bg-opacity)); -} - -.bg-blue-300 { - --tw-bg-opacity: 1; - background-color: rgb(147 197 253 / var(--tw-bg-opacity)); -} - -.bg-blue-400 { - --tw-bg-opacity: 1; - background-color: rgb(96 165 250 / var(--tw-bg-opacity)); -} - -.bg-blue-50 { - --tw-bg-opacity: 1; - background-color: rgb(239 246 255 / var(--tw-bg-opacity)); -} - -.bg-blue-500 { - --tw-bg-opacity: 1; - background-color: rgb(59 130 246 / var(--tw-bg-opacity)); -} - -.bg-blue-600 { - --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); -} - -.bg-blue-700 { - --tw-bg-opacity: 1; - background-color: rgb(29 78 216 / var(--tw-bg-opacity)); -} - -.bg-blue-800 { - --tw-bg-opacity: 1; - background-color: rgb(30 64 175 / var(--tw-bg-opacity)); -} - -.bg-blue-900 { - --tw-bg-opacity: 1; - background-color: rgb(30 58 138 / var(--tw-bg-opacity)); -} - -.bg-cyan-100 { - --tw-bg-opacity: 1; - background-color: rgb(207 250 254 / var(--tw-bg-opacity)); -} - -.bg-cyan-200 { - --tw-bg-opacity: 1; - background-color: rgb(165 243 252 / var(--tw-bg-opacity)); -} - -.bg-cyan-300 { - --tw-bg-opacity: 1; - background-color: rgb(103 232 249 / var(--tw-bg-opacity)); -} - -.bg-cyan-400 { - --tw-bg-opacity: 1; - background-color: rgb(34 211 238 / var(--tw-bg-opacity)); -} - -.bg-cyan-50 { - --tw-bg-opacity: 1; - background-color: rgb(236 254 255 / var(--tw-bg-opacity)); -} - -.bg-cyan-500 { - --tw-bg-opacity: 1; - background-color: rgb(6 182 212 / var(--tw-bg-opacity)); -} - -.bg-cyan-600 { - --tw-bg-opacity: 1; - background-color: rgb(8 145 178 / var(--tw-bg-opacity)); -} - -.bg-cyan-700 { - --tw-bg-opacity: 1; - background-color: rgb(14 116 144 / var(--tw-bg-opacity)); -} - -.bg-cyan-800 { - --tw-bg-opacity: 1; - background-color: rgb(21 94 117 / var(--tw-bg-opacity)); -} - -.bg-cyan-900 { - --tw-bg-opacity: 1; - background-color: rgb(22 78 99 / var(--tw-bg-opacity)); -} - -.bg-emerald-100 { - --tw-bg-opacity: 1; - background-color: rgb(209 250 229 / var(--tw-bg-opacity)); -} - -.bg-emerald-200 { - --tw-bg-opacity: 1; - background-color: rgb(167 243 208 / var(--tw-bg-opacity)); -} - -.bg-emerald-300 { - --tw-bg-opacity: 1; - background-color: rgb(110 231 183 / var(--tw-bg-opacity)); -} - -.bg-emerald-400 { - --tw-bg-opacity: 1; - background-color: rgb(52 211 153 / var(--tw-bg-opacity)); -} - -.bg-emerald-50 { - --tw-bg-opacity: 1; - background-color: rgb(236 253 245 / var(--tw-bg-opacity)); -} - -.bg-emerald-500 { - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); -} - -.bg-emerald-600 { - --tw-bg-opacity: 1; - background-color: rgb(5 150 105 / var(--tw-bg-opacity)); -} - -.bg-emerald-700 { - --tw-bg-opacity: 1; - background-color: rgb(4 120 87 / var(--tw-bg-opacity)); -} - -.bg-emerald-800 { - --tw-bg-opacity: 1; - background-color: rgb(6 95 70 / var(--tw-bg-opacity)); -} - -.bg-emerald-900 { - --tw-bg-opacity: 1; - background-color: rgb(6 78 59 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-100 { - --tw-bg-opacity: 1; - background-color: rgb(250 232 255 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-200 { - --tw-bg-opacity: 1; - background-color: rgb(245 208 254 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-300 { - --tw-bg-opacity: 1; - background-color: rgb(240 171 252 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-400 { - --tw-bg-opacity: 1; - background-color: rgb(232 121 249 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-50 { - --tw-bg-opacity: 1; - background-color: rgb(253 244 255 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-500 { - --tw-bg-opacity: 1; - background-color: rgb(217 70 239 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-600 { - --tw-bg-opacity: 1; - background-color: rgb(192 38 211 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-700 { - --tw-bg-opacity: 1; - background-color: rgb(162 28 175 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-800 { - --tw-bg-opacity: 1; - background-color: rgb(134 25 143 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-900 { - --tw-bg-opacity: 1; - background-color: rgb(112 26 117 / var(--tw-bg-opacity)); -} - -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} - -.bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgb(229 231 235 / var(--tw-bg-opacity)); -} - -.bg-gray-300 { - --tw-bg-opacity: 1; - background-color: rgb(209 213 219 / var(--tw-bg-opacity)); -} - -.bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgb(156 163 175 / var(--tw-bg-opacity)); -} - -.bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} - -.bg-gray-500 { - --tw-bg-opacity: 1; - background-color: rgb(107 114 128 / var(--tw-bg-opacity)); -} - -.bg-gray-600 { - --tw-bg-opacity: 1; - background-color: rgb(75 85 99 / var(--tw-bg-opacity)); -} - -.bg-gray-700 { - --tw-bg-opacity: 1; - background-color: rgb(55 65 81 / var(--tw-bg-opacity)); -} - -.bg-gray-800 { - --tw-bg-opacity: 1; - background-color: rgb(31 41 55 / var(--tw-bg-opacity)); -} - -.bg-gray-900 { - --tw-bg-opacity: 1; - background-color: rgb(17 24 39 / var(--tw-bg-opacity)); -} - -.bg-green-100 { - --tw-bg-opacity: 1; - background-color: rgb(220 252 231 / var(--tw-bg-opacity)); -} - -.bg-green-200 { - --tw-bg-opacity: 1; - background-color: rgb(187 247 208 / var(--tw-bg-opacity)); -} - -.bg-green-300 { - --tw-bg-opacity: 1; - background-color: rgb(134 239 172 / var(--tw-bg-opacity)); -} - -.bg-green-400 { - --tw-bg-opacity: 1; - background-color: rgb(74 222 128 / var(--tw-bg-opacity)); -} - -.bg-green-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 244 / var(--tw-bg-opacity)); -} - -.bg-green-500 { - --tw-bg-opacity: 1; - background-color: rgb(34 197 94 / var(--tw-bg-opacity)); -} - -.bg-green-600 { - --tw-bg-opacity: 1; - background-color: rgb(22 163 74 / var(--tw-bg-opacity)); -} - -.bg-green-700 { - --tw-bg-opacity: 1; - background-color: rgb(21 128 61 / var(--tw-bg-opacity)); -} - -.bg-green-800 { - --tw-bg-opacity: 1; - background-color: rgb(22 101 52 / var(--tw-bg-opacity)); -} - -.bg-green-900 { - --tw-bg-opacity: 1; - background-color: rgb(20 83 45 / var(--tw-bg-opacity)); -} - -.bg-indigo-100 { - --tw-bg-opacity: 1; - background-color: rgb(224 231 255 / var(--tw-bg-opacity)); -} - -.bg-indigo-200 { - --tw-bg-opacity: 1; - background-color: rgb(199 210 254 / var(--tw-bg-opacity)); -} - -.bg-indigo-300 { - --tw-bg-opacity: 1; - background-color: rgb(165 180 252 / var(--tw-bg-opacity)); -} - -.bg-indigo-400 { - --tw-bg-opacity: 1; - background-color: rgb(129 140 248 / var(--tw-bg-opacity)); -} - -.bg-indigo-50 { - --tw-bg-opacity: 1; - background-color: rgb(238 242 255 / var(--tw-bg-opacity)); -} - -.bg-indigo-500 { - --tw-bg-opacity: 1; - background-color: rgb(99 102 241 / var(--tw-bg-opacity)); -} - -.bg-indigo-600 { - --tw-bg-opacity: 1; - background-color: rgb(79 70 229 / var(--tw-bg-opacity)); -} - -.bg-indigo-700 { - --tw-bg-opacity: 1; - background-color: rgb(67 56 202 / var(--tw-bg-opacity)); -} - -.bg-indigo-800 { - --tw-bg-opacity: 1; - background-color: rgb(55 48 163 / var(--tw-bg-opacity)); -} - -.bg-indigo-900 { - --tw-bg-opacity: 1; - background-color: rgb(49 46 129 / var(--tw-bg-opacity)); -} - -.bg-inherit { - background-color: inherit; -} - -.bg-lime-100 { - --tw-bg-opacity: 1; - background-color: rgb(236 252 203 / var(--tw-bg-opacity)); -} - -.bg-lime-200 { - --tw-bg-opacity: 1; - background-color: rgb(217 249 157 / var(--tw-bg-opacity)); -} - -.bg-lime-300 { - --tw-bg-opacity: 1; - background-color: rgb(190 242 100 / var(--tw-bg-opacity)); -} - -.bg-lime-400 { - --tw-bg-opacity: 1; - background-color: rgb(163 230 53 / var(--tw-bg-opacity)); -} - -.bg-lime-50 { - --tw-bg-opacity: 1; - background-color: rgb(247 254 231 / var(--tw-bg-opacity)); -} - -.bg-lime-500 { - --tw-bg-opacity: 1; - background-color: rgb(132 204 22 / var(--tw-bg-opacity)); -} - -.bg-lime-600 { - --tw-bg-opacity: 1; - background-color: rgb(101 163 13 / var(--tw-bg-opacity)); -} - -.bg-lime-700 { - --tw-bg-opacity: 1; - background-color: rgb(77 124 15 / var(--tw-bg-opacity)); -} - -.bg-lime-800 { - --tw-bg-opacity: 1; - background-color: rgb(63 98 18 / var(--tw-bg-opacity)); -} - -.bg-lime-900 { - --tw-bg-opacity: 1; - background-color: rgb(54 83 20 / var(--tw-bg-opacity)); -} - -.bg-neutral-100 { - --tw-bg-opacity: 1; - background-color: rgb(245 245 245 / var(--tw-bg-opacity)); -} - -.bg-neutral-200 { - --tw-bg-opacity: 1; - background-color: rgb(229 229 229 / var(--tw-bg-opacity)); -} - -.bg-neutral-300 { - --tw-bg-opacity: 1; - background-color: rgb(212 212 212 / var(--tw-bg-opacity)); -} - -.bg-neutral-400 { - --tw-bg-opacity: 1; - background-color: rgb(163 163 163 / var(--tw-bg-opacity)); -} - -.bg-neutral-50 { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity)); -} - -.bg-neutral-500 { - --tw-bg-opacity: 1; - background-color: rgb(115 115 115 / var(--tw-bg-opacity)); -} - -.bg-neutral-600 { - --tw-bg-opacity: 1; - background-color: rgb(82 82 82 / var(--tw-bg-opacity)); -} - -.bg-neutral-700 { - --tw-bg-opacity: 1; - background-color: rgb(64 64 64 / var(--tw-bg-opacity)); -} - -.bg-neutral-800 { - --tw-bg-opacity: 1; - background-color: rgb(38 38 38 / var(--tw-bg-opacity)); -} - -.bg-neutral-900 { - --tw-bg-opacity: 1; - background-color: rgb(23 23 23 / var(--tw-bg-opacity)); -} - -.bg-orange-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 237 213 / var(--tw-bg-opacity)); -} - -.bg-orange-200 { - --tw-bg-opacity: 1; - background-color: rgb(254 215 170 / var(--tw-bg-opacity)); -} - -.bg-orange-300 { - --tw-bg-opacity: 1; - background-color: rgb(253 186 116 / var(--tw-bg-opacity)); -} - -.bg-orange-400 { - --tw-bg-opacity: 1; - background-color: rgb(251 146 60 / var(--tw-bg-opacity)); -} - -.bg-orange-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 247 237 / var(--tw-bg-opacity)); -} - -.bg-orange-500 { - --tw-bg-opacity: 1; - background-color: rgb(249 115 22 / var(--tw-bg-opacity)); -} - -.bg-orange-600 { - --tw-bg-opacity: 1; - background-color: rgb(234 88 12 / var(--tw-bg-opacity)); -} - -.bg-orange-700 { - --tw-bg-opacity: 1; - background-color: rgb(194 65 12 / var(--tw-bg-opacity)); -} - -.bg-orange-800 { - --tw-bg-opacity: 1; - background-color: rgb(154 52 18 / var(--tw-bg-opacity)); -} - -.bg-orange-900 { - --tw-bg-opacity: 1; - background-color: rgb(124 45 18 / var(--tw-bg-opacity)); -} - -.bg-pink-100 { - --tw-bg-opacity: 1; - background-color: rgb(252 231 243 / var(--tw-bg-opacity)); -} - -.bg-pink-200 { - --tw-bg-opacity: 1; - background-color: rgb(251 207 232 / var(--tw-bg-opacity)); -} - -.bg-pink-300 { - --tw-bg-opacity: 1; - background-color: rgb(249 168 212 / var(--tw-bg-opacity)); -} - -.bg-pink-400 { - --tw-bg-opacity: 1; - background-color: rgb(244 114 182 / var(--tw-bg-opacity)); -} - -.bg-pink-50 { - --tw-bg-opacity: 1; - background-color: rgb(253 242 248 / var(--tw-bg-opacity)); -} - -.bg-pink-500 { - --tw-bg-opacity: 1; - background-color: rgb(236 72 153 / var(--tw-bg-opacity)); -} - -.bg-pink-600 { - --tw-bg-opacity: 1; - background-color: rgb(219 39 119 / var(--tw-bg-opacity)); -} - -.bg-pink-700 { - --tw-bg-opacity: 1; - background-color: rgb(190 24 93 / var(--tw-bg-opacity)); -} - -.bg-pink-900 { - --tw-bg-opacity: 1; - background-color: rgb(131 24 67 / var(--tw-bg-opacity)); -} - -.bg-purple-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 232 255 / var(--tw-bg-opacity)); -} - -.bg-purple-200 { - --tw-bg-opacity: 1; - background-color: rgb(233 213 255 / var(--tw-bg-opacity)); -} - -.bg-purple-300 { - --tw-bg-opacity: 1; - background-color: rgb(216 180 254 / var(--tw-bg-opacity)); -} - -.bg-purple-400 { - --tw-bg-opacity: 1; - background-color: rgb(192 132 252 / var(--tw-bg-opacity)); -} - -.bg-purple-50 { - --tw-bg-opacity: 1; - background-color: rgb(250 245 255 / var(--tw-bg-opacity)); -} - -.bg-purple-500 { - --tw-bg-opacity: 1; - background-color: rgb(168 85 247 / var(--tw-bg-opacity)); -} - -.bg-purple-600 { - --tw-bg-opacity: 1; - background-color: rgb(147 51 234 / var(--tw-bg-opacity)); -} - -.bg-purple-700 { - --tw-bg-opacity: 1; - background-color: rgb(126 34 206 / var(--tw-bg-opacity)); -} - -.bg-purple-800 { - --tw-bg-opacity: 1; - background-color: rgb(107 33 168 / var(--tw-bg-opacity)); -} - -.bg-purple-900 { - --tw-bg-opacity: 1; - background-color: rgb(88 28 135 / var(--tw-bg-opacity)); -} - -.bg-red-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} - -.bg-red-200 { - --tw-bg-opacity: 1; - background-color: rgb(254 202 202 / var(--tw-bg-opacity)); -} - -.bg-red-300 { - --tw-bg-opacity: 1; - background-color: rgb(252 165 165 / var(--tw-bg-opacity)); -} - -.bg-red-400 { - --tw-bg-opacity: 1; - background-color: rgb(248 113 113 / var(--tw-bg-opacity)); -} - -.bg-red-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity)); -} - -.bg-red-500 { - --tw-bg-opacity: 1; - background-color: rgb(239 68 68 / var(--tw-bg-opacity)); -} - -.bg-red-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); -} - -.bg-red-700 { - --tw-bg-opacity: 1; - background-color: rgb(185 28 28 / var(--tw-bg-opacity)); -} - -.bg-red-800 { - --tw-bg-opacity: 1; - background-color: rgb(153 27 27 / var(--tw-bg-opacity)); -} - -.bg-red-900 { - --tw-bg-opacity: 1; - background-color: rgb(127 29 29 / var(--tw-bg-opacity)); -} - -.bg-rose-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 228 230 / var(--tw-bg-opacity)); -} - -.bg-rose-200 { - --tw-bg-opacity: 1; - background-color: rgb(254 205 211 / var(--tw-bg-opacity)); -} - -.bg-rose-300 { - --tw-bg-opacity: 1; - background-color: rgb(253 164 175 / var(--tw-bg-opacity)); -} - -.bg-rose-400 { - --tw-bg-opacity: 1; - background-color: rgb(251 113 133 / var(--tw-bg-opacity)); -} - -.bg-rose-50 { - --tw-bg-opacity: 1; - background-color: rgb(255 241 242 / var(--tw-bg-opacity)); -} - -.bg-rose-500 { - --tw-bg-opacity: 1; - background-color: rgb(244 63 94 / var(--tw-bg-opacity)); -} - -.bg-rose-600 { - --tw-bg-opacity: 1; - background-color: rgb(225 29 72 / var(--tw-bg-opacity)); -} - -.bg-rose-700 { - --tw-bg-opacity: 1; - background-color: rgb(190 18 60 / var(--tw-bg-opacity)); -} - -.bg-rose-800 { - --tw-bg-opacity: 1; - background-color: rgb(159 18 57 / var(--tw-bg-opacity)); -} - -.bg-rose-900 { - --tw-bg-opacity: 1; - background-color: rgb(136 19 55 / var(--tw-bg-opacity)); -} - -.bg-sky-100 { - --tw-bg-opacity: 1; - background-color: rgb(224 242 254 / var(--tw-bg-opacity)); -} - -.bg-sky-200 { - --tw-bg-opacity: 1; - background-color: rgb(186 230 253 / var(--tw-bg-opacity)); -} - -.bg-sky-300 { - --tw-bg-opacity: 1; - background-color: rgb(125 211 252 / var(--tw-bg-opacity)); -} - -.bg-sky-400 { - --tw-bg-opacity: 1; - background-color: rgb(56 189 248 / var(--tw-bg-opacity)); -} - -.bg-sky-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 249 255 / var(--tw-bg-opacity)); -} - -.bg-sky-500 { - --tw-bg-opacity: 1; - background-color: rgb(14 165 233 / var(--tw-bg-opacity)); -} - -.bg-sky-600 { - --tw-bg-opacity: 1; - background-color: rgb(2 132 199 / var(--tw-bg-opacity)); -} - -.bg-sky-700 { - --tw-bg-opacity: 1; - background-color: rgb(3 105 161 / var(--tw-bg-opacity)); -} - -.bg-sky-800 { - --tw-bg-opacity: 1; - background-color: rgb(7 89 133 / var(--tw-bg-opacity)); -} - -.bg-sky-900 { - --tw-bg-opacity: 1; - background-color: rgb(12 74 110 / var(--tw-bg-opacity)); -} - -.bg-slate-100 { - --tw-bg-opacity: 1; - background-color: rgb(241 245 249 / var(--tw-bg-opacity)); -} - -.bg-slate-200 { - --tw-bg-opacity: 1; - background-color: rgb(226 232 240 / var(--tw-bg-opacity)); -} - -.bg-slate-300 { - --tw-bg-opacity: 1; - background-color: rgb(203 213 225 / var(--tw-bg-opacity)); -} - -.bg-slate-400 { - --tw-bg-opacity: 1; - background-color: rgb(148 163 184 / var(--tw-bg-opacity)); -} - -.bg-slate-50 { - --tw-bg-opacity: 1; - background-color: rgb(248 250 252 / var(--tw-bg-opacity)); -} - -.bg-slate-500 { - --tw-bg-opacity: 1; - background-color: rgb(100 116 139 / var(--tw-bg-opacity)); -} - -.bg-slate-600 { - --tw-bg-opacity: 1; - background-color: rgb(71 85 105 / var(--tw-bg-opacity)); -} - -.bg-slate-700 { - --tw-bg-opacity: 1; - background-color: rgb(51 65 85 / var(--tw-bg-opacity)); -} - -.bg-slate-800 { - --tw-bg-opacity: 1; - background-color: rgb(30 41 59 / var(--tw-bg-opacity)); -} - -.bg-slate-900 { - --tw-bg-opacity: 1; - background-color: rgb(15 23 42 / var(--tw-bg-opacity)); -} - -.bg-stone-100 { - --tw-bg-opacity: 1; - background-color: rgb(245 245 244 / var(--tw-bg-opacity)); -} - -.bg-stone-200 { - --tw-bg-opacity: 1; - background-color: rgb(231 229 228 / var(--tw-bg-opacity)); -} - -.bg-stone-300 { - --tw-bg-opacity: 1; - background-color: rgb(214 211 209 / var(--tw-bg-opacity)); -} - -.bg-stone-400 { - --tw-bg-opacity: 1; - background-color: rgb(168 162 158 / var(--tw-bg-opacity)); -} - -.bg-stone-50 { - --tw-bg-opacity: 1; - background-color: rgb(250 250 249 / var(--tw-bg-opacity)); -} - -.bg-stone-500 { - --tw-bg-opacity: 1; - background-color: rgb(120 113 108 / var(--tw-bg-opacity)); -} - -.bg-stone-600 { - --tw-bg-opacity: 1; - background-color: rgb(87 83 78 / var(--tw-bg-opacity)); -} - -.bg-stone-700 { - --tw-bg-opacity: 1; - background-color: rgb(68 64 60 / var(--tw-bg-opacity)); -} - -.bg-stone-800 { - --tw-bg-opacity: 1; - background-color: rgb(41 37 36 / var(--tw-bg-opacity)); -} - -.bg-stone-900 { - --tw-bg-opacity: 1; - background-color: rgb(28 25 23 / var(--tw-bg-opacity)); -} - -.bg-teal-100 { - --tw-bg-opacity: 1; - background-color: rgb(204 251 241 / var(--tw-bg-opacity)); -} - -.bg-teal-200 { - --tw-bg-opacity: 1; - background-color: rgb(153 246 228 / var(--tw-bg-opacity)); -} - -.bg-teal-300 { - --tw-bg-opacity: 1; - background-color: rgb(94 234 212 / var(--tw-bg-opacity)); -} - -.bg-teal-400 { - --tw-bg-opacity: 1; - background-color: rgb(45 212 191 / var(--tw-bg-opacity)); -} - -.bg-teal-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 250 / var(--tw-bg-opacity)); -} - -.bg-teal-500 { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} - -.bg-teal-600 { - --tw-bg-opacity: 1; - background-color: rgb(13 148 136 / var(--tw-bg-opacity)); -} - -.bg-teal-700 { - --tw-bg-opacity: 1; - background-color: rgb(15 118 110 / var(--tw-bg-opacity)); -} - -.bg-teal-800 { - --tw-bg-opacity: 1; - background-color: rgb(17 94 89 / var(--tw-bg-opacity)); -} - -.bg-teal-900 { - --tw-bg-opacity: 1; - background-color: rgb(19 78 74 / var(--tw-bg-opacity)); -} - -.bg-transparent { - background-color: transparent; -} - -.bg-violet-100 { - --tw-bg-opacity: 1; - background-color: rgb(237 233 254 / var(--tw-bg-opacity)); -} - -.bg-violet-200 { - --tw-bg-opacity: 1; - background-color: rgb(221 214 254 / var(--tw-bg-opacity)); -} - -.bg-violet-300 { - --tw-bg-opacity: 1; - background-color: rgb(196 181 253 / var(--tw-bg-opacity)); -} - -.bg-violet-400 { - --tw-bg-opacity: 1; - background-color: rgb(167 139 250 / var(--tw-bg-opacity)); -} - -.bg-violet-50 { - --tw-bg-opacity: 1; - background-color: rgb(245 243 255 / var(--tw-bg-opacity)); -} - -.bg-violet-500 { - --tw-bg-opacity: 1; - background-color: rgb(139 92 246 / var(--tw-bg-opacity)); -} - -.bg-violet-600 { - --tw-bg-opacity: 1; - background-color: rgb(124 58 237 / var(--tw-bg-opacity)); -} - -.bg-violet-700 { - --tw-bg-opacity: 1; - background-color: rgb(109 40 217 / var(--tw-bg-opacity)); -} - -.bg-violet-800 { - --tw-bg-opacity: 1; - background-color: rgb(91 33 182 / var(--tw-bg-opacity)); -} - -.bg-violet-900 { - --tw-bg-opacity: 1; - background-color: rgb(76 29 149 / var(--tw-bg-opacity)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.bg-yellow-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 249 195 / var(--tw-bg-opacity)); -} - -.bg-yellow-200 { - --tw-bg-opacity: 1; - background-color: rgb(254 240 138 / var(--tw-bg-opacity)); -} - -.bg-yellow-300 { - --tw-bg-opacity: 1; - background-color: rgb(253 224 71 / var(--tw-bg-opacity)); -} - -.bg-yellow-400 { - --tw-bg-opacity: 1; - background-color: rgb(250 204 21 / var(--tw-bg-opacity)); -} - -.bg-yellow-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 252 232 / var(--tw-bg-opacity)); -} - -.bg-yellow-500 { - --tw-bg-opacity: 1; - background-color: rgb(234 179 8 / var(--tw-bg-opacity)); -} - -.bg-yellow-600 { - --tw-bg-opacity: 1; - background-color: rgb(202 138 4 / var(--tw-bg-opacity)); -} - -.bg-yellow-700 { - --tw-bg-opacity: 1; - background-color: rgb(161 98 7 / var(--tw-bg-opacity)); -} - -.bg-yellow-800 { - --tw-bg-opacity: 1; - background-color: rgb(133 77 14 / var(--tw-bg-opacity)); -} - -.bg-yellow-900 { - --tw-bg-opacity: 1; - background-color: rgb(113 63 18 / var(--tw-bg-opacity)); -} - -.bg-zinc-100 { - --tw-bg-opacity: 1; - background-color: rgb(244 244 245 / var(--tw-bg-opacity)); -} - -.bg-zinc-200 { - --tw-bg-opacity: 1; - background-color: rgb(228 228 231 / var(--tw-bg-opacity)); -} - -.bg-zinc-300 { - --tw-bg-opacity: 1; - background-color: rgb(212 212 216 / var(--tw-bg-opacity)); -} - -.bg-zinc-400 { - --tw-bg-opacity: 1; - background-color: rgb(161 161 170 / var(--tw-bg-opacity)); -} - -.bg-zinc-50 { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity)); -} - -.bg-zinc-500 { - --tw-bg-opacity: 1; - background-color: rgb(113 113 122 / var(--tw-bg-opacity)); -} - -.bg-zinc-600 { - --tw-bg-opacity: 1; - background-color: rgb(82 82 91 / var(--tw-bg-opacity)); -} - -.bg-zinc-700 { - --tw-bg-opacity: 1; - background-color: rgb(63 63 70 / var(--tw-bg-opacity)); -} - -.bg-zinc-800 { - --tw-bg-opacity: 1; - background-color: rgb(39 39 42 / var(--tw-bg-opacity)); -} - -.bg-zinc-900 { - --tw-bg-opacity: 1; - background-color: rgb(24 24 27 / var(--tw-bg-opacity)); -} - -.p-0 { - padding: 0px; -} - -.p-0\.5 { - padding: 0.125rem; -} - -.p-1 { - padding: 0.25rem; -} - -.p-1\.5 { - padding: 0.375rem; -} - -.p-2 { - padding: 0.5rem; -} - -.p-2\.5 { - padding: 0.625rem; -} - -.p-3 { - padding: 0.75rem; -} - -.p-3\.5 { - padding: 0.875rem; -} - -.p-4 { - padding: 1rem; -} - -.p-6 { - padding: 1.5rem; -} - -.p-8 { - padding: 2rem; -} - -.p-px { - padding: 1px; -} - -.px-0 { - padding-left: 0px; - padding-right: 0px; -} - -.px-0\.5 { - padding-left: 0.125rem; - padding-right: 0.125rem; -} - -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.px-1\.5 { - padding-left: 0.375rem; - padding-right: 0.375rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-2\.5 { - padding-left: 0.625rem; - padding-right: 0.625rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-3\.5 { - padding-left: 0.875rem; - padding-right: 0.875rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.px-8 { - padding-left: 2rem; - padding-right: 2rem; -} - -.px-px { - padding-left: 1px; - padding-right: 1px; -} - -.py-0 { - padding-top: 0px; - padding-bottom: 0px; -} - -.py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.py-1\.5 { - padding-top: 0.375rem; - padding-bottom: 0.375rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-2\.5 { - padding-top: 0.625rem; - padding-bottom: 0.625rem; -} - -.py-3 { - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - -.py-3\.5 { - padding-top: 0.875rem; - padding-bottom: 0.875rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.py-8 { - padding-top: 2rem; - padding-bottom: 2rem; -} - -.py-px { - padding-top: 1px; - padding-bottom: 1px; -} - -.pb-0 { - padding-bottom: 0px; -} - -.pb-0\.5 { - padding-bottom: 0.125rem; -} - -.pb-1 { - padding-bottom: 0.25rem; -} - -.pb-1\.5 { - padding-bottom: 0.375rem; -} - -.pb-2 { - padding-bottom: 0.5rem; -} - -.pb-2\.5 { - padding-bottom: 0.625rem; -} - -.pb-3 { - padding-bottom: 0.75rem; -} - -.pb-3\.5 { - padding-bottom: 0.875rem; -} - -.pb-4 { - padding-bottom: 1rem; -} - -.pb-6 { - padding-bottom: 1.5rem; -} - -.pb-8 { - padding-bottom: 2rem; -} - -.pb-px { - padding-bottom: 1px; -} - -.pl-0 { - padding-left: 0px; -} - -.pl-0\.5 { - padding-left: 0.125rem; -} - -.pl-1 { - padding-left: 0.25rem; -} - -.pl-1\.5 { - padding-left: 0.375rem; -} - -.pl-2 { - padding-left: 0.5rem; -} - -.pl-2\.5 { - padding-left: 0.625rem; -} - -.pl-3 { - padding-left: 0.75rem; -} - -.pl-3\.5 { - padding-left: 0.875rem; -} - -.pl-4 { - padding-left: 1rem; -} - -.pl-6 { - padding-left: 1.5rem; -} - -.pl-8 { - padding-left: 2rem; -} - -.pl-px { - padding-left: 1px; -} - -.pr-0 { - padding-right: 0px; -} - -.pr-0\.5 { - padding-right: 0.125rem; -} - -.pr-1 { - padding-right: 0.25rem; -} - -.pr-1\.5 { - padding-right: 0.375rem; -} - -.pr-2 { - padding-right: 0.5rem; -} - -.pr-2\.5 { - padding-right: 0.625rem; -} - -.pr-3 { - padding-right: 0.75rem; -} - -.pr-3\.5 { - padding-right: 0.875rem; -} - -.pr-4 { - padding-right: 1rem; -} - -.pr-6 { - padding-right: 1.5rem; -} - -.pr-8 { - padding-right: 2rem; -} - -.pr-px { - padding-right: 1px; -} - -.pt-0 { - padding-top: 0px; -} - -.pt-0\.5 { - padding-top: 0.125rem; -} - -.pt-1 { - padding-top: 0.25rem; -} - -.pt-1\.5 { - padding-top: 0.375rem; -} - -.pt-2 { - padding-top: 0.5rem; -} - -.pt-2\.5 { - padding-top: 0.625rem; -} - -.pt-3 { - padding-top: 0.75rem; -} - -.pt-3\.5 { - padding-top: 0.875rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.pt-6 { - padding-top: 1.5rem; -} - -.pt-8 { - padding-top: 2rem; -} - -.pt-px { - padding-top: 1px; -} - -.text-left { - text-align: left; -} - -.text-center { - text-align: center; -} - -.text-right { - text-align: right; -} - -.text-start { - text-align: start; -} - -.align-top { - vertical-align: top; -} - -.align-middle { - vertical-align: middle; -} - -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} - -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} - -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.font-medium { - font-weight: 500; -} - -.font-normal { - font-weight: 400; -} - -.font-semibold { - font-weight: 600; -} - -.capitalize { - text-transform: capitalize; -} - -.italic { - font-style: italic; -} - -.tabular-nums { - --tw-numeric-spacing: tabular-nums; - font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); -} - -.leading-8 { - line-height: 2rem; -} - -.text-amber-100 { - --tw-text-opacity: 1; - color: rgb(254 243 199 / var(--tw-text-opacity)); -} - -.text-amber-200 { - --tw-text-opacity: 1; - color: rgb(253 230 138 / var(--tw-text-opacity)); -} - -.text-amber-300 { - --tw-text-opacity: 1; - color: rgb(252 211 77 / var(--tw-text-opacity)); -} - -.text-amber-400 { - --tw-text-opacity: 1; - color: rgb(251 191 36 / var(--tw-text-opacity)); -} - -.text-amber-50 { - --tw-text-opacity: 1; - color: rgb(255 251 235 / var(--tw-text-opacity)); -} - -.text-amber-500 { - --tw-text-opacity: 1; - color: rgb(245 158 11 / var(--tw-text-opacity)); -} - -.text-amber-600 { - --tw-text-opacity: 1; - color: rgb(217 119 6 / var(--tw-text-opacity)); -} - -.text-amber-700 { - --tw-text-opacity: 1; - color: rgb(180 83 9 / var(--tw-text-opacity)); -} - -.text-amber-800 { - --tw-text-opacity: 1; - color: rgb(146 64 14 / var(--tw-text-opacity)); -} - -.text-amber-900 { - --tw-text-opacity: 1; - color: rgb(120 53 15 / var(--tw-text-opacity)); -} - -.text-black { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} - -.text-blue-100 { - --tw-text-opacity: 1; - color: rgb(219 234 254 / var(--tw-text-opacity)); -} - -.text-blue-200 { - --tw-text-opacity: 1; - color: rgb(191 219 254 / var(--tw-text-opacity)); -} - -.text-blue-300 { - --tw-text-opacity: 1; - color: rgb(147 197 253 / var(--tw-text-opacity)); -} - -.text-blue-400 { - --tw-text-opacity: 1; - color: rgb(96 165 250 / var(--tw-text-opacity)); -} - -.text-blue-50 { - --tw-text-opacity: 1; - color: rgb(239 246 255 / var(--tw-text-opacity)); -} - -.text-blue-500 { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - -.text-blue-600 { - --tw-text-opacity: 1; - color: rgb(37 99 235 / var(--tw-text-opacity)); -} - -.text-blue-700 { - --tw-text-opacity: 1; - color: rgb(29 78 216 / var(--tw-text-opacity)); -} - -.text-blue-800 { - --tw-text-opacity: 1; - color: rgb(30 64 175 / var(--tw-text-opacity)); -} - -.text-blue-900 { - --tw-text-opacity: 1; - color: rgb(30 58 138 / var(--tw-text-opacity)); -} - -.text-cyan-100 { - --tw-text-opacity: 1; - color: rgb(207 250 254 / var(--tw-text-opacity)); -} - -.text-cyan-200 { - --tw-text-opacity: 1; - color: rgb(165 243 252 / var(--tw-text-opacity)); -} - -.text-cyan-300 { - --tw-text-opacity: 1; - color: rgb(103 232 249 / var(--tw-text-opacity)); -} - -.text-cyan-400 { - --tw-text-opacity: 1; - color: rgb(34 211 238 / var(--tw-text-opacity)); -} - -.text-cyan-50 { - --tw-text-opacity: 1; - color: rgb(236 254 255 / var(--tw-text-opacity)); -} - -.text-cyan-500 { - --tw-text-opacity: 1; - color: rgb(6 182 212 / var(--tw-text-opacity)); -} - -.text-cyan-600 { - --tw-text-opacity: 1; - color: rgb(8 145 178 / var(--tw-text-opacity)); -} - -.text-cyan-700 { - --tw-text-opacity: 1; - color: rgb(14 116 144 / var(--tw-text-opacity)); -} - -.text-cyan-800 { - --tw-text-opacity: 1; - color: rgb(21 94 117 / var(--tw-text-opacity)); -} - -.text-cyan-900 { - --tw-text-opacity: 1; - color: rgb(22 78 99 / var(--tw-text-opacity)); -} - -.text-emerald-100 { - --tw-text-opacity: 1; - color: rgb(209 250 229 / var(--tw-text-opacity)); -} - -.text-emerald-200 { - --tw-text-opacity: 1; - color: rgb(167 243 208 / var(--tw-text-opacity)); -} - -.text-emerald-300 { - --tw-text-opacity: 1; - color: rgb(110 231 183 / var(--tw-text-opacity)); -} - -.text-emerald-400 { - --tw-text-opacity: 1; - color: rgb(52 211 153 / var(--tw-text-opacity)); -} - -.text-emerald-50 { - --tw-text-opacity: 1; - color: rgb(236 253 245 / var(--tw-text-opacity)); -} - -.text-emerald-500 { - --tw-text-opacity: 1; - color: rgb(16 185 129 / var(--tw-text-opacity)); -} - -.text-emerald-600 { - --tw-text-opacity: 1; - color: rgb(5 150 105 / var(--tw-text-opacity)); -} - -.text-emerald-700 { - --tw-text-opacity: 1; - color: rgb(4 120 87 / var(--tw-text-opacity)); -} - -.text-emerald-800 { - --tw-text-opacity: 1; - color: rgb(6 95 70 / var(--tw-text-opacity)); -} - -.text-emerald-900 { - --tw-text-opacity: 1; - color: rgb(6 78 59 / var(--tw-text-opacity)); -} - -.text-fuchsia-100 { - --tw-text-opacity: 1; - color: rgb(250 232 255 / var(--tw-text-opacity)); -} - -.text-fuchsia-200 { - --tw-text-opacity: 1; - color: rgb(245 208 254 / var(--tw-text-opacity)); -} - -.text-fuchsia-300 { - --tw-text-opacity: 1; - color: rgb(240 171 252 / var(--tw-text-opacity)); -} - -.text-fuchsia-400 { - --tw-text-opacity: 1; - color: rgb(232 121 249 / var(--tw-text-opacity)); -} - -.text-fuchsia-50 { - --tw-text-opacity: 1; - color: rgb(253 244 255 / var(--tw-text-opacity)); -} - -.text-fuchsia-500 { - --tw-text-opacity: 1; - color: rgb(217 70 239 / var(--tw-text-opacity)); -} - -.text-fuchsia-600 { - --tw-text-opacity: 1; - color: rgb(192 38 211 / var(--tw-text-opacity)); -} - -.text-fuchsia-700 { - --tw-text-opacity: 1; - color: rgb(162 28 175 / var(--tw-text-opacity)); -} - -.text-fuchsia-800 { - --tw-text-opacity: 1; - color: rgb(134 25 143 / var(--tw-text-opacity)); -} - -.text-fuchsia-900 { - --tw-text-opacity: 1; - color: rgb(112 26 117 / var(--tw-text-opacity)); -} - -.text-gray-100 { - --tw-text-opacity: 1; - color: rgb(243 244 246 / var(--tw-text-opacity)); -} - -.text-gray-200 { - --tw-text-opacity: 1; - color: rgb(229 231 235 / var(--tw-text-opacity)); -} - -.text-gray-300 { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)); -} - -.text-gray-400 { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.text-gray-50 { - --tw-text-opacity: 1; - color: rgb(249 250 251 / var(--tw-text-opacity)); -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.text-gray-600 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)); -} - -.text-gray-700 { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); -} - -.text-gray-800 { - --tw-text-opacity: 1; - color: rgb(31 41 55 / var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} - -.text-green-100 { - --tw-text-opacity: 1; - color: rgb(220 252 231 / var(--tw-text-opacity)); -} - -.text-green-200 { - --tw-text-opacity: 1; - color: rgb(187 247 208 / var(--tw-text-opacity)); -} - -.text-green-300 { - --tw-text-opacity: 1; - color: rgb(134 239 172 / var(--tw-text-opacity)); -} - -.text-green-400 { - --tw-text-opacity: 1; - color: rgb(74 222 128 / var(--tw-text-opacity)); -} - -.text-green-50 { - --tw-text-opacity: 1; - color: rgb(240 253 244 / var(--tw-text-opacity)); -} - -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); -} - -.text-green-600 { - --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity)); -} - -.text-green-700 { - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); -} - -.text-green-800 { - --tw-text-opacity: 1; - color: rgb(22 101 52 / var(--tw-text-opacity)); -} - -.text-green-900 { - --tw-text-opacity: 1; - color: rgb(20 83 45 / var(--tw-text-opacity)); -} - -.text-indigo-100 { - --tw-text-opacity: 1; - color: rgb(224 231 255 / var(--tw-text-opacity)); -} - -.text-indigo-200 { - --tw-text-opacity: 1; - color: rgb(199 210 254 / var(--tw-text-opacity)); -} - -.text-indigo-300 { - --tw-text-opacity: 1; - color: rgb(165 180 252 / var(--tw-text-opacity)); -} - -.text-indigo-400 { - --tw-text-opacity: 1; - color: rgb(129 140 248 / var(--tw-text-opacity)); -} - -.text-indigo-50 { - --tw-text-opacity: 1; - color: rgb(238 242 255 / var(--tw-text-opacity)); -} - -.text-indigo-500 { - --tw-text-opacity: 1; - color: rgb(99 102 241 / var(--tw-text-opacity)); -} - -.text-indigo-600 { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); -} - -.text-indigo-700 { - --tw-text-opacity: 1; - color: rgb(67 56 202 / var(--tw-text-opacity)); -} - -.text-indigo-800 { - --tw-text-opacity: 1; - color: rgb(55 48 163 / var(--tw-text-opacity)); -} - -.text-indigo-900 { - --tw-text-opacity: 1; - color: rgb(49 46 129 / var(--tw-text-opacity)); -} - -.text-inherit { - color: inherit; -} - -.text-lime-100 { - --tw-text-opacity: 1; - color: rgb(236 252 203 / var(--tw-text-opacity)); -} - -.text-lime-200 { - --tw-text-opacity: 1; - color: rgb(217 249 157 / var(--tw-text-opacity)); -} - -.text-lime-300 { - --tw-text-opacity: 1; - color: rgb(190 242 100 / var(--tw-text-opacity)); -} - -.text-lime-400 { - --tw-text-opacity: 1; - color: rgb(163 230 53 / var(--tw-text-opacity)); -} - -.text-lime-50 { - --tw-text-opacity: 1; - color: rgb(247 254 231 / var(--tw-text-opacity)); -} - -.text-lime-500 { - --tw-text-opacity: 1; - color: rgb(132 204 22 / var(--tw-text-opacity)); -} - -.text-lime-600 { - --tw-text-opacity: 1; - color: rgb(101 163 13 / var(--tw-text-opacity)); -} - -.text-lime-700 { - --tw-text-opacity: 1; - color: rgb(77 124 15 / var(--tw-text-opacity)); -} - -.text-lime-800 { - --tw-text-opacity: 1; - color: rgb(63 98 18 / var(--tw-text-opacity)); -} - -.text-lime-900 { - --tw-text-opacity: 1; - color: rgb(54 83 20 / var(--tw-text-opacity)); -} - -.text-neutral-100 { - --tw-text-opacity: 1; - color: rgb(245 245 245 / var(--tw-text-opacity)); -} - -.text-neutral-200 { - --tw-text-opacity: 1; - color: rgb(229 229 229 / var(--tw-text-opacity)); -} - -.text-neutral-300 { - --tw-text-opacity: 1; - color: rgb(212 212 212 / var(--tw-text-opacity)); -} - -.text-neutral-400 { - --tw-text-opacity: 1; - color: rgb(163 163 163 / var(--tw-text-opacity)); -} - -.text-neutral-50 { - --tw-text-opacity: 1; - color: rgb(250 250 250 / var(--tw-text-opacity)); -} - -.text-neutral-500 { - --tw-text-opacity: 1; - color: rgb(115 115 115 / var(--tw-text-opacity)); -} - -.text-neutral-600 { - --tw-text-opacity: 1; - color: rgb(82 82 82 / var(--tw-text-opacity)); -} - -.text-neutral-700 { - --tw-text-opacity: 1; - color: rgb(64 64 64 / var(--tw-text-opacity)); -} - -.text-neutral-800 { - --tw-text-opacity: 1; - color: rgb(38 38 38 / var(--tw-text-opacity)); -} - -.text-neutral-900 { - --tw-text-opacity: 1; - color: rgb(23 23 23 / var(--tw-text-opacity)); -} - -.text-orange-100 { - --tw-text-opacity: 1; - color: rgb(255 237 213 / var(--tw-text-opacity)); -} - -.text-orange-200 { - --tw-text-opacity: 1; - color: rgb(254 215 170 / var(--tw-text-opacity)); -} - -.text-orange-300 { - --tw-text-opacity: 1; - color: rgb(253 186 116 / var(--tw-text-opacity)); -} - -.text-orange-400 { - --tw-text-opacity: 1; - color: rgb(251 146 60 / var(--tw-text-opacity)); -} - -.text-orange-50 { - --tw-text-opacity: 1; - color: rgb(255 247 237 / var(--tw-text-opacity)); -} - -.text-orange-500 { - --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); -} - -.text-orange-600 { - --tw-text-opacity: 1; - color: rgb(234 88 12 / var(--tw-text-opacity)); -} - -.text-orange-700 { - --tw-text-opacity: 1; - color: rgb(194 65 12 / var(--tw-text-opacity)); -} - -.text-orange-800 { - --tw-text-opacity: 1; - color: rgb(154 52 18 / var(--tw-text-opacity)); -} - -.text-orange-900 { - --tw-text-opacity: 1; - color: rgb(124 45 18 / var(--tw-text-opacity)); -} - -.text-pink-100 { - --tw-text-opacity: 1; - color: rgb(252 231 243 / var(--tw-text-opacity)); -} - -.text-pink-200 { - --tw-text-opacity: 1; - color: rgb(251 207 232 / var(--tw-text-opacity)); -} - -.text-pink-300 { - --tw-text-opacity: 1; - color: rgb(249 168 212 / var(--tw-text-opacity)); -} - -.text-pink-400 { - --tw-text-opacity: 1; - color: rgb(244 114 182 / var(--tw-text-opacity)); -} - -.text-pink-50 { - --tw-text-opacity: 1; - color: rgb(253 242 248 / var(--tw-text-opacity)); -} - -.text-pink-500 { - --tw-text-opacity: 1; - color: rgb(236 72 153 / var(--tw-text-opacity)); -} - -.text-pink-600 { - --tw-text-opacity: 1; - color: rgb(219 39 119 / var(--tw-text-opacity)); -} - -.text-pink-700 { - --tw-text-opacity: 1; - color: rgb(190 24 93 / var(--tw-text-opacity)); -} - -.text-pink-900 { - --tw-text-opacity: 1; - color: rgb(131 24 67 / var(--tw-text-opacity)); -} - -.text-purple-100 { - --tw-text-opacity: 1; - color: rgb(243 232 255 / var(--tw-text-opacity)); -} - -.text-purple-200 { - --tw-text-opacity: 1; - color: rgb(233 213 255 / var(--tw-text-opacity)); -} - -.text-purple-300 { - --tw-text-opacity: 1; - color: rgb(216 180 254 / var(--tw-text-opacity)); -} - -.text-purple-400 { - --tw-text-opacity: 1; - color: rgb(192 132 252 / var(--tw-text-opacity)); -} - -.text-purple-50 { - --tw-text-opacity: 1; - color: rgb(250 245 255 / var(--tw-text-opacity)); -} - -.text-purple-500 { - --tw-text-opacity: 1; - color: rgb(168 85 247 / var(--tw-text-opacity)); -} - -.text-purple-600 { - --tw-text-opacity: 1; - color: rgb(147 51 234 / var(--tw-text-opacity)); -} - -.text-purple-700 { - --tw-text-opacity: 1; - color: rgb(126 34 206 / var(--tw-text-opacity)); -} - -.text-purple-800 { - --tw-text-opacity: 1; - color: rgb(107 33 168 / var(--tw-text-opacity)); -} - -.text-purple-900 { - --tw-text-opacity: 1; - color: rgb(88 28 135 / var(--tw-text-opacity)); -} - -.text-red-100 { - --tw-text-opacity: 1; - color: rgb(254 226 226 / var(--tw-text-opacity)); -} - -.text-red-200 { - --tw-text-opacity: 1; - color: rgb(254 202 202 / var(--tw-text-opacity)); -} - -.text-red-300 { - --tw-text-opacity: 1; - color: rgb(252 165 165 / var(--tw-text-opacity)); -} - -.text-red-400 { - --tw-text-opacity: 1; - color: rgb(248 113 113 / var(--tw-text-opacity)); -} - -.text-red-50 { - --tw-text-opacity: 1; - color: rgb(254 242 242 / var(--tw-text-opacity)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} - -.text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} - -.text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} - -.text-red-800 { - --tw-text-opacity: 1; - color: rgb(153 27 27 / var(--tw-text-opacity)); -} - -.text-red-900 { - --tw-text-opacity: 1; - color: rgb(127 29 29 / var(--tw-text-opacity)); -} - -.text-rose-100 { - --tw-text-opacity: 1; - color: rgb(255 228 230 / var(--tw-text-opacity)); -} - -.text-rose-200 { - --tw-text-opacity: 1; - color: rgb(254 205 211 / var(--tw-text-opacity)); -} - -.text-rose-300 { - --tw-text-opacity: 1; - color: rgb(253 164 175 / var(--tw-text-opacity)); -} - -.text-rose-400 { - --tw-text-opacity: 1; - color: rgb(251 113 133 / var(--tw-text-opacity)); -} - -.text-rose-50 { - --tw-text-opacity: 1; - color: rgb(255 241 242 / var(--tw-text-opacity)); -} - -.text-rose-500 { - --tw-text-opacity: 1; - color: rgb(244 63 94 / var(--tw-text-opacity)); -} - -.text-rose-600 { - --tw-text-opacity: 1; - color: rgb(225 29 72 / var(--tw-text-opacity)); -} - -.text-rose-700 { - --tw-text-opacity: 1; - color: rgb(190 18 60 / var(--tw-text-opacity)); -} - -.text-rose-800 { - --tw-text-opacity: 1; - color: rgb(159 18 57 / var(--tw-text-opacity)); -} - -.text-rose-900 { - --tw-text-opacity: 1; - color: rgb(136 19 55 / var(--tw-text-opacity)); -} - -.text-sky-100 { - --tw-text-opacity: 1; - color: rgb(224 242 254 / var(--tw-text-opacity)); -} - -.text-sky-200 { - --tw-text-opacity: 1; - color: rgb(186 230 253 / var(--tw-text-opacity)); -} - -.text-sky-300 { - --tw-text-opacity: 1; - color: rgb(125 211 252 / var(--tw-text-opacity)); -} - -.text-sky-400 { - --tw-text-opacity: 1; - color: rgb(56 189 248 / var(--tw-text-opacity)); -} - -.text-sky-50 { - --tw-text-opacity: 1; - color: rgb(240 249 255 / var(--tw-text-opacity)); -} - -.text-sky-500 { - --tw-text-opacity: 1; - color: rgb(14 165 233 / var(--tw-text-opacity)); -} - -.text-sky-600 { - --tw-text-opacity: 1; - color: rgb(2 132 199 / var(--tw-text-opacity)); -} - -.text-sky-700 { - --tw-text-opacity: 1; - color: rgb(3 105 161 / var(--tw-text-opacity)); -} - -.text-sky-800 { - --tw-text-opacity: 1; - color: rgb(7 89 133 / var(--tw-text-opacity)); -} - -.text-sky-900 { - --tw-text-opacity: 1; - color: rgb(12 74 110 / var(--tw-text-opacity)); -} - -.text-slate-100 { - --tw-text-opacity: 1; - color: rgb(241 245 249 / var(--tw-text-opacity)); -} - -.text-slate-200 { - --tw-text-opacity: 1; - color: rgb(226 232 240 / var(--tw-text-opacity)); -} - -.text-slate-300 { - --tw-text-opacity: 1; - color: rgb(203 213 225 / var(--tw-text-opacity)); -} - -.text-slate-400 { - --tw-text-opacity: 1; - color: rgb(148 163 184 / var(--tw-text-opacity)); -} - -.text-slate-50 { - --tw-text-opacity: 1; - color: rgb(248 250 252 / var(--tw-text-opacity)); -} - -.text-slate-500 { - --tw-text-opacity: 1; - color: rgb(100 116 139 / var(--tw-text-opacity)); -} - -.text-slate-600 { - --tw-text-opacity: 1; - color: rgb(71 85 105 / var(--tw-text-opacity)); -} - -.text-slate-700 { - --tw-text-opacity: 1; - color: rgb(51 65 85 / var(--tw-text-opacity)); -} - -.text-slate-800 { - --tw-text-opacity: 1; - color: rgb(30 41 59 / var(--tw-text-opacity)); -} - -.text-slate-900 { - --tw-text-opacity: 1; - color: rgb(15 23 42 / var(--tw-text-opacity)); -} - -.text-stone-100 { - --tw-text-opacity: 1; - color: rgb(245 245 244 / var(--tw-text-opacity)); -} - -.text-stone-200 { - --tw-text-opacity: 1; - color: rgb(231 229 228 / var(--tw-text-opacity)); -} - -.text-stone-300 { - --tw-text-opacity: 1; - color: rgb(214 211 209 / var(--tw-text-opacity)); -} - -.text-stone-400 { - --tw-text-opacity: 1; - color: rgb(168 162 158 / var(--tw-text-opacity)); -} - -.text-stone-50 { - --tw-text-opacity: 1; - color: rgb(250 250 249 / var(--tw-text-opacity)); -} - -.text-stone-500 { - --tw-text-opacity: 1; - color: rgb(120 113 108 / var(--tw-text-opacity)); -} - -.text-stone-600 { - --tw-text-opacity: 1; - color: rgb(87 83 78 / var(--tw-text-opacity)); -} - -.text-stone-700 { - --tw-text-opacity: 1; - color: rgb(68 64 60 / var(--tw-text-opacity)); -} - -.text-stone-800 { - --tw-text-opacity: 1; - color: rgb(41 37 36 / var(--tw-text-opacity)); -} - -.text-stone-900 { - --tw-text-opacity: 1; - color: rgb(28 25 23 / var(--tw-text-opacity)); -} - -.text-teal-100 { - --tw-text-opacity: 1; - color: rgb(204 251 241 / var(--tw-text-opacity)); -} - -.text-teal-200 { - --tw-text-opacity: 1; - color: rgb(153 246 228 / var(--tw-text-opacity)); -} - -.text-teal-300 { - --tw-text-opacity: 1; - color: rgb(94 234 212 / var(--tw-text-opacity)); -} - -.text-teal-400 { - --tw-text-opacity: 1; - color: rgb(45 212 191 / var(--tw-text-opacity)); -} - -.text-teal-50 { - --tw-text-opacity: 1; - color: rgb(240 253 250 / var(--tw-text-opacity)); -} - -.text-teal-500 { - --tw-text-opacity: 1; - color: rgb(20 184 166 / var(--tw-text-opacity)); -} - -.text-teal-600 { - --tw-text-opacity: 1; - color: rgb(13 148 136 / var(--tw-text-opacity)); -} - -.text-teal-700 { - --tw-text-opacity: 1; - color: rgb(15 118 110 / var(--tw-text-opacity)); -} - -.text-teal-800 { - --tw-text-opacity: 1; - color: rgb(17 94 89 / var(--tw-text-opacity)); -} - -.text-teal-900 { - --tw-text-opacity: 1; - color: rgb(19 78 74 / var(--tw-text-opacity)); -} - -.text-transparent { - color: transparent; -} - -.text-violet-100 { - --tw-text-opacity: 1; - color: rgb(237 233 254 / var(--tw-text-opacity)); -} - -.text-violet-200 { - --tw-text-opacity: 1; - color: rgb(221 214 254 / var(--tw-text-opacity)); -} - -.text-violet-300 { - --tw-text-opacity: 1; - color: rgb(196 181 253 / var(--tw-text-opacity)); -} - -.text-violet-400 { - --tw-text-opacity: 1; - color: rgb(167 139 250 / var(--tw-text-opacity)); -} - -.text-violet-50 { - --tw-text-opacity: 1; - color: rgb(245 243 255 / var(--tw-text-opacity)); -} - -.text-violet-500 { - --tw-text-opacity: 1; - color: rgb(139 92 246 / var(--tw-text-opacity)); -} - -.text-violet-600 { - --tw-text-opacity: 1; - color: rgb(124 58 237 / var(--tw-text-opacity)); -} - -.text-violet-700 { - --tw-text-opacity: 1; - color: rgb(109 40 217 / var(--tw-text-opacity)); -} - -.text-violet-800 { - --tw-text-opacity: 1; - color: rgb(91 33 182 / var(--tw-text-opacity)); -} - -.text-violet-900 { - --tw-text-opacity: 1; - color: rgb(76 29 149 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.text-yellow-100 { - --tw-text-opacity: 1; - color: rgb(254 249 195 / var(--tw-text-opacity)); -} - -.text-yellow-200 { - --tw-text-opacity: 1; - color: rgb(254 240 138 / var(--tw-text-opacity)); -} - -.text-yellow-300 { - --tw-text-opacity: 1; - color: rgb(253 224 71 / var(--tw-text-opacity)); -} - -.text-yellow-400 { - --tw-text-opacity: 1; - color: rgb(250 204 21 / var(--tw-text-opacity)); -} - -.text-yellow-50 { - --tw-text-opacity: 1; - color: rgb(254 252 232 / var(--tw-text-opacity)); -} - -.text-yellow-500 { - --tw-text-opacity: 1; - color: rgb(234 179 8 / var(--tw-text-opacity)); -} - -.text-yellow-600 { - --tw-text-opacity: 1; - color: rgb(202 138 4 / var(--tw-text-opacity)); -} - -.text-yellow-700 { - --tw-text-opacity: 1; - color: rgb(161 98 7 / var(--tw-text-opacity)); -} - -.text-yellow-800 { - --tw-text-opacity: 1; - color: rgb(133 77 14 / var(--tw-text-opacity)); -} - -.text-yellow-900 { - --tw-text-opacity: 1; - color: rgb(113 63 18 / var(--tw-text-opacity)); -} - -.text-zinc-100 { - --tw-text-opacity: 1; - color: rgb(244 244 245 / var(--tw-text-opacity)); -} - -.text-zinc-200 { - --tw-text-opacity: 1; - color: rgb(228 228 231 / var(--tw-text-opacity)); -} - -.text-zinc-300 { - --tw-text-opacity: 1; - color: rgb(212 212 216 / var(--tw-text-opacity)); -} - -.text-zinc-400 { - --tw-text-opacity: 1; - color: rgb(161 161 170 / var(--tw-text-opacity)); -} - -.text-zinc-50 { - --tw-text-opacity: 1; - color: rgb(250 250 250 / var(--tw-text-opacity)); -} - -.text-zinc-500 { - --tw-text-opacity: 1; - color: rgb(113 113 122 / var(--tw-text-opacity)); -} - -.text-zinc-600 { - --tw-text-opacity: 1; - color: rgb(82 82 91 / var(--tw-text-opacity)); -} - -.text-zinc-700 { - --tw-text-opacity: 1; - color: rgb(63 63 70 / var(--tw-text-opacity)); -} - -.text-zinc-800 { - --tw-text-opacity: 1; - color: rgb(39 39 42 / var(--tw-text-opacity)); -} - -.text-zinc-900 { - --tw-text-opacity: 1; - color: rgb(24 24 27 / var(--tw-text-opacity)); -} - -.no-underline { - text-decoration-line: none; -} - -.opacity-50 { - opacity: 0.5; -} - -.opacity-70 { - opacity: 0.7; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-none { - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.outline-none { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.outline { - outline-style: solid; -} - -.outline-amber-100 { - outline-color: #fef3c7; -} - -.outline-amber-200 { - outline-color: #fde68a; -} - -.outline-amber-300 { - outline-color: #fcd34d; -} - -.outline-amber-400 { - outline-color: #fbbf24; -} - -.outline-amber-50 { - outline-color: #fffbeb; -} - -.outline-amber-500 { - outline-color: #f59e0b; -} - -.outline-amber-600 { - outline-color: #d97706; -} - -.outline-amber-700 { - outline-color: #b45309; -} - -.outline-amber-800 { - outline-color: #92400e; -} - -.outline-amber-900 { - outline-color: #78350f; -} - -.outline-black { - outline-color: #000; -} - -.outline-blue-100 { - outline-color: #dbeafe; -} - -.outline-blue-200 { - outline-color: #bfdbfe; -} - -.outline-blue-300 { - outline-color: #93c5fd; -} - -.outline-blue-400 { - outline-color: #60a5fa; -} - -.outline-blue-50 { - outline-color: #eff6ff; -} - -.outline-blue-500 { - outline-color: #3b82f6; -} - -.outline-blue-600 { - outline-color: #2563eb; -} - -.outline-blue-700 { - outline-color: #1d4ed8; -} - -.outline-blue-800 { - outline-color: #1e40af; -} - -.outline-blue-900 { - outline-color: #1e3a8a; -} - -.outline-cyan-100 { - outline-color: #cffafe; -} - -.outline-cyan-200 { - outline-color: #a5f3fc; -} - -.outline-cyan-300 { - outline-color: #67e8f9; -} - -.outline-cyan-400 { - outline-color: #22d3ee; -} - -.outline-cyan-50 { - outline-color: #ecfeff; -} - -.outline-cyan-500 { - outline-color: #06b6d4; -} - -.outline-cyan-600 { - outline-color: #0891b2; -} - -.outline-cyan-700 { - outline-color: #0e7490; -} - -.outline-cyan-800 { - outline-color: #155e75; -} - -.outline-cyan-900 { - outline-color: #164e63; -} - -.outline-emerald-100 { - outline-color: #d1fae5; -} - -.outline-emerald-200 { - outline-color: #a7f3d0; -} - -.outline-emerald-300 { - outline-color: #6ee7b7; -} - -.outline-emerald-400 { - outline-color: #34d399; -} - -.outline-emerald-50 { - outline-color: #ecfdf5; -} - -.outline-emerald-500 { - outline-color: #10b981; -} - -.outline-emerald-600 { - outline-color: #059669; -} - -.outline-emerald-700 { - outline-color: #047857; -} - -.outline-emerald-800 { - outline-color: #065f46; -} - -.outline-emerald-900 { - outline-color: #064e3b; -} - -.outline-fuchsia-100 { - outline-color: #fae8ff; -} - -.outline-fuchsia-200 { - outline-color: #f5d0fe; -} - -.outline-fuchsia-300 { - outline-color: #f0abfc; -} - -.outline-fuchsia-400 { - outline-color: #e879f9; -} - -.outline-fuchsia-50 { - outline-color: #fdf4ff; -} - -.outline-fuchsia-500 { - outline-color: #d946ef; -} - -.outline-fuchsia-600 { - outline-color: #c026d3; -} - -.outline-fuchsia-700 { - outline-color: #a21caf; -} - -.outline-fuchsia-800 { - outline-color: #86198f; -} - -.outline-fuchsia-900 { - outline-color: #701a75; -} - -.outline-gray-100 { - outline-color: #f3f4f6; -} - -.outline-gray-200 { - outline-color: #e5e7eb; -} - -.outline-gray-300 { - outline-color: #d1d5db; -} - -.outline-gray-400 { - outline-color: #9ca3af; -} - -.outline-gray-50 { - outline-color: #f9fafb; -} - -.outline-gray-500 { - outline-color: #6b7280; -} - -.outline-gray-600 { - outline-color: #4b5563; -} - -.outline-gray-700 { - outline-color: #374151; -} - -.outline-gray-800 { - outline-color: #1f2937; -} - -.outline-gray-900 { - outline-color: #111827; -} - -.outline-green-100 { - outline-color: #dcfce7; -} - -.outline-green-200 { - outline-color: #bbf7d0; -} - -.outline-green-300 { - outline-color: #86efac; -} - -.outline-green-400 { - outline-color: #4ade80; -} - -.outline-green-50 { - outline-color: #f0fdf4; -} - -.outline-green-500 { - outline-color: #22c55e; -} - -.outline-green-600 { - outline-color: #16a34a; -} - -.outline-green-700 { - outline-color: #15803d; -} - -.outline-green-800 { - outline-color: #166534; -} - -.outline-green-900 { - outline-color: #14532d; -} - -.outline-indigo-100 { - outline-color: #e0e7ff; -} - -.outline-indigo-200 { - outline-color: #c7d2fe; -} - -.outline-indigo-300 { - outline-color: #a5b4fc; -} - -.outline-indigo-400 { - outline-color: #818cf8; -} - -.outline-indigo-50 { - outline-color: #eef2ff; -} - -.outline-indigo-500 { - outline-color: #6366f1; -} - -.outline-indigo-600 { - outline-color: #4f46e5; -} - -.outline-indigo-700 { - outline-color: #4338ca; -} - -.outline-indigo-800 { - outline-color: #3730a3; -} - -.outline-indigo-900 { - outline-color: #312e81; -} - -.outline-lime-100 { - outline-color: #ecfccb; -} - -.outline-lime-200 { - outline-color: #d9f99d; -} - -.outline-lime-300 { - outline-color: #bef264; -} - -.outline-lime-400 { - outline-color: #a3e635; -} - -.outline-lime-50 { - outline-color: #f7fee7; -} - -.outline-lime-500 { - outline-color: #84cc16; -} - -.outline-lime-600 { - outline-color: #65a30d; -} - -.outline-lime-700 { - outline-color: #4d7c0f; -} - -.outline-lime-800 { - outline-color: #3f6212; -} - -.outline-lime-900 { - outline-color: #365314; -} - -.outline-neutral-100 { - outline-color: #f5f5f5; -} - -.outline-neutral-200 { - outline-color: #e5e5e5; -} - -.outline-neutral-300 { - outline-color: #d4d4d4; -} - -.outline-neutral-400 { - outline-color: #a3a3a3; -} - -.outline-neutral-50 { - outline-color: #fafafa; -} - -.outline-neutral-500 { - outline-color: #737373; -} - -.outline-neutral-600 { - outline-color: #525252; -} - -.outline-neutral-700 { - outline-color: #404040; -} - -.outline-neutral-800 { - outline-color: #262626; -} - -.outline-neutral-900 { - outline-color: #171717; -} - -.outline-orange-100 { - outline-color: #ffedd5; -} - -.outline-orange-200 { - outline-color: #fed7aa; -} - -.outline-orange-300 { - outline-color: #fdba74; -} - -.outline-orange-400 { - outline-color: #fb923c; -} - -.outline-orange-50 { - outline-color: #fff7ed; -} - -.outline-orange-500 { - outline-color: #f97316; -} - -.outline-orange-600 { - outline-color: #ea580c; -} - -.outline-orange-700 { - outline-color: #c2410c; -} - -.outline-orange-800 { - outline-color: #9a3412; -} - -.outline-orange-900 { - outline-color: #7c2d12; -} - -.outline-pink-100 { - outline-color: #fce7f3; -} - -.outline-pink-200 { - outline-color: #fbcfe8; -} - -.outline-pink-300 { - outline-color: #f9a8d4; -} - -.outline-pink-400 { - outline-color: #f472b6; -} - -.outline-pink-50 { - outline-color: #fdf2f8; -} - -.outline-pink-500 { - outline-color: #ec4899; -} - -.outline-pink-600 { - outline-color: #db2777; -} - -.outline-pink-700 { - outline-color: #be185d; -} - -.outline-pink-900 { - outline-color: #831843; -} - -.outline-purple-100 { - outline-color: #f3e8ff; -} - -.outline-purple-200 { - outline-color: #e9d5ff; -} - -.outline-purple-300 { - outline-color: #d8b4fe; -} - -.outline-purple-400 { - outline-color: #c084fc; -} - -.outline-purple-50 { - outline-color: #faf5ff; -} - -.outline-purple-500 { - outline-color: #a855f7; -} - -.outline-purple-600 { - outline-color: #9333ea; -} - -.outline-purple-700 { - outline-color: #7e22ce; -} - -.outline-purple-800 { - outline-color: #6b21a8; -} - -.outline-purple-900 { - outline-color: #581c87; -} - -.outline-red-100 { - outline-color: #fee2e2; -} - -.outline-red-200 { - outline-color: #fecaca; -} - -.outline-red-300 { - outline-color: #fca5a5; -} - -.outline-red-400 { - outline-color: #f87171; -} - -.outline-red-50 { - outline-color: #fef2f2; -} - -.outline-red-500 { - outline-color: #ef4444; -} - -.outline-red-600 { - outline-color: #dc2626; -} - -.outline-red-700 { - outline-color: #b91c1c; -} - -.outline-red-800 { - outline-color: #991b1b; -} - -.outline-red-900 { - outline-color: #7f1d1d; -} - -.outline-rose-100 { - outline-color: #ffe4e6; -} - -.outline-rose-200 { - outline-color: #fecdd3; -} - -.outline-rose-300 { - outline-color: #fda4af; -} - -.outline-rose-400 { - outline-color: #fb7185; -} - -.outline-rose-50 { - outline-color: #fff1f2; -} - -.outline-rose-500 { - outline-color: #f43f5e; -} - -.outline-rose-600 { - outline-color: #e11d48; -} - -.outline-rose-700 { - outline-color: #be123c; -} - -.outline-rose-800 { - outline-color: #9f1239; -} - -.outline-rose-900 { - outline-color: #881337; -} - -.outline-sky-100 { - outline-color: #e0f2fe; -} - -.outline-sky-200 { - outline-color: #bae6fd; -} - -.outline-sky-300 { - outline-color: #7dd3fc; -} - -.outline-sky-400 { - outline-color: #38bdf8; -} - -.outline-sky-50 { - outline-color: #f0f9ff; -} - -.outline-sky-500 { - outline-color: #0ea5e9; -} - -.outline-sky-600 { - outline-color: #0284c7; -} - -.outline-sky-700 { - outline-color: #0369a1; -} - -.outline-sky-800 { - outline-color: #075985; -} - -.outline-sky-900 { - outline-color: #0c4a6e; -} - -.outline-slate-100 { - outline-color: #f1f5f9; -} - -.outline-slate-200 { - outline-color: #e2e8f0; -} - -.outline-slate-300 { - outline-color: #cbd5e1; -} - -.outline-slate-400 { - outline-color: #94a3b8; -} - -.outline-slate-50 { - outline-color: #f8fafc; -} - -.outline-slate-500 { - outline-color: #64748b; -} - -.outline-slate-600 { - outline-color: #475569; -} - -.outline-slate-700 { - outline-color: #334155; -} - -.outline-slate-800 { - outline-color: #1e293b; -} - -.outline-slate-900 { - outline-color: #0f172a; -} - -.outline-stone-100 { - outline-color: #f5f5f4; -} - -.outline-stone-200 { - outline-color: #e7e5e4; -} - -.outline-stone-300 { - outline-color: #d6d3d1; -} - -.outline-stone-400 { - outline-color: #a8a29e; -} - -.outline-stone-50 { - outline-color: #fafaf9; -} - -.outline-stone-500 { - outline-color: #78716c; -} - -.outline-stone-600 { - outline-color: #57534e; -} - -.outline-stone-700 { - outline-color: #44403c; -} - -.outline-stone-800 { - outline-color: #292524; -} - -.outline-stone-900 { - outline-color: #1c1917; -} - -.outline-teal-100 { - outline-color: #ccfbf1; -} - -.outline-teal-200 { - outline-color: #99f6e4; -} - -.outline-teal-300 { - outline-color: #5eead4; -} - -.outline-teal-400 { - outline-color: #2dd4bf; -} - -.outline-teal-50 { - outline-color: #f0fdfa; -} - -.outline-teal-500 { - outline-color: #14b8a6; -} - -.outline-teal-600 { - outline-color: #0d9488; -} - -.outline-teal-700 { - outline-color: #0f766e; -} - -.outline-teal-800 { - outline-color: #115e59; -} - -.outline-teal-900 { - outline-color: #134e4a; -} - -.outline-transparent { - outline-color: transparent; -} - -.outline-violet-100 { - outline-color: #ede9fe; -} - -.outline-violet-200 { - outline-color: #ddd6fe; -} - -.outline-violet-300 { - outline-color: #c4b5fd; -} - -.outline-violet-400 { - outline-color: #a78bfa; -} - -.outline-violet-50 { - outline-color: #f5f3ff; -} - -.outline-violet-500 { - outline-color: #8b5cf6; -} - -.outline-violet-600 { - outline-color: #7c3aed; -} - -.outline-violet-700 { - outline-color: #6d28d9; -} - -.outline-violet-800 { - outline-color: #5b21b6; -} - -.outline-violet-900 { - outline-color: #4c1d95; -} - -.outline-white { - outline-color: #fff; -} - -.outline-yellow-100 { - outline-color: #fef9c3; -} - -.outline-yellow-200 { - outline-color: #fef08a; -} - -.outline-yellow-300 { - outline-color: #fde047; -} - -.outline-yellow-400 { - outline-color: #facc15; -} - -.outline-yellow-50 { - outline-color: #fefce8; -} - -.outline-yellow-500 { - outline-color: #eab308; -} - -.outline-yellow-600 { - outline-color: #ca8a04; -} - -.outline-yellow-700 { - outline-color: #a16207; -} - -.outline-yellow-800 { - outline-color: #854d0e; -} - -.outline-yellow-900 { - outline-color: #713f12; -} - -.outline-zinc-100 { - outline-color: #f4f4f5; -} - -.outline-zinc-200 { - outline-color: #e4e4e7; -} - -.outline-zinc-300 { - outline-color: #d4d4d8; -} - -.outline-zinc-400 { - outline-color: #a1a1aa; -} - -.outline-zinc-50 { - outline-color: #fafafa; -} - -.outline-zinc-500 { - outline-color: #71717a; -} - -.outline-zinc-600 { - outline-color: #52525b; -} - -.outline-zinc-700 { - outline-color: #3f3f46; -} - -.outline-zinc-800 { - outline-color: #27272a; -} - -.outline-zinc-900 { - outline-color: #18181b; -} - -.ring { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.ring-1 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.ring-2 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.ring-amber-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 243 199 / var(--tw-ring-opacity)); -} - -.ring-amber-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity)); -} - -.ring-amber-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 211 77 / var(--tw-ring-opacity)); -} - -.ring-amber-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity)); -} - -.ring-amber-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 251 235 / var(--tw-ring-opacity)); -} - -.ring-amber-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity)); -} - -.ring-amber-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 119 6 / var(--tw-ring-opacity)); -} - -.ring-amber-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(180 83 9 / var(--tw-ring-opacity)); -} - -.ring-amber-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(146 64 14 / var(--tw-ring-opacity)); -} - -.ring-amber-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(120 53 15 / var(--tw-ring-opacity)); -} - -.ring-black { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); -} - -.ring-blue-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(219 234 254 / var(--tw-ring-opacity)); -} - -.ring-blue-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity)); -} - -.ring-blue-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); -} - -.ring-blue-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity)); -} - -.ring-blue-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 246 255 / var(--tw-ring-opacity)); -} - -.ring-blue-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); -} - -.ring-blue-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); -} - -.ring-blue-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(29 78 216 / var(--tw-ring-opacity)); -} - -.ring-blue-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity)); -} - -.ring-blue-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 58 138 / var(--tw-ring-opacity)); -} - -.ring-cyan-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(207 250 254 / var(--tw-ring-opacity)); -} - -.ring-cyan-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(165 243 252 / var(--tw-ring-opacity)); -} - -.ring-cyan-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(103 232 249 / var(--tw-ring-opacity)); -} - -.ring-cyan-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(34 211 238 / var(--tw-ring-opacity)); -} - -.ring-cyan-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 254 255 / var(--tw-ring-opacity)); -} - -.ring-cyan-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 182 212 / var(--tw-ring-opacity)); -} - -.ring-cyan-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(8 145 178 / var(--tw-ring-opacity)); -} - -.ring-cyan-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(14 116 144 / var(--tw-ring-opacity)); -} - -.ring-cyan-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(21 94 117 / var(--tw-ring-opacity)); -} - -.ring-cyan-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 78 99 / var(--tw-ring-opacity)); -} - -.ring-emerald-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 250 229 / var(--tw-ring-opacity)); -} - -.ring-emerald-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(167 243 208 / var(--tw-ring-opacity)); -} - -.ring-emerald-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(110 231 183 / var(--tw-ring-opacity)); -} - -.ring-emerald-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(52 211 153 / var(--tw-ring-opacity)); -} - -.ring-emerald-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 253 245 / var(--tw-ring-opacity)); -} - -.ring-emerald-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(16 185 129 / var(--tw-ring-opacity)); -} - -.ring-emerald-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(5 150 105 / var(--tw-ring-opacity)); -} - -.ring-emerald-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(4 120 87 / var(--tw-ring-opacity)); -} - -.ring-emerald-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 95 70 / var(--tw-ring-opacity)); -} - -.ring-emerald-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 78 59 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 232 255 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 208 254 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 171 252 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(232 121 249 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 244 255 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 70 239 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(192 38 211 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(162 28 175 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(134 25 143 / var(--tw-ring-opacity)); -} - -.ring-fuchsia-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(112 26 117 / var(--tw-ring-opacity)); -} - -.ring-gray-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity)); -} - -.ring-gray-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); -} - -.ring-gray-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} - -.ring-gray-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity)); -} - -.ring-gray-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 250 251 / var(--tw-ring-opacity)); -} - -.ring-gray-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); -} - -.ring-gray-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity)); -} - -.ring-gray-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity)); -} - -.ring-gray-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity)); -} - -.ring-gray-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(17 24 39 / var(--tw-ring-opacity)); -} - -.ring-green-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(220 252 231 / var(--tw-ring-opacity)); -} - -.ring-green-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(187 247 208 / var(--tw-ring-opacity)); -} - -.ring-green-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(134 239 172 / var(--tw-ring-opacity)); -} - -.ring-green-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(74 222 128 / var(--tw-ring-opacity)); -} - -.ring-green-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 253 244 / var(--tw-ring-opacity)); -} - -.ring-green-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity)); -} - -.ring-green-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity)); -} - -.ring-green-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(21 128 61 / var(--tw-ring-opacity)); -} - -.ring-green-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity)); -} - -.ring-green-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(20 83 45 / var(--tw-ring-opacity)); -} - -.ring-indigo-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(224 231 255 / var(--tw-ring-opacity)); -} - -.ring-indigo-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(199 210 254 / var(--tw-ring-opacity)); -} - -.ring-indigo-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(165 180 252 / var(--tw-ring-opacity)); -} - -.ring-indigo-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(129 140 248 / var(--tw-ring-opacity)); -} - -.ring-indigo-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(238 242 255 / var(--tw-ring-opacity)); -} - -.ring-indigo-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); -} - -.ring-indigo-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); -} - -.ring-indigo-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(67 56 202 / var(--tw-ring-opacity)); -} - -.ring-indigo-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(55 48 163 / var(--tw-ring-opacity)); -} - -.ring-indigo-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(49 46 129 / var(--tw-ring-opacity)); -} - -.ring-lime-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 252 203 / var(--tw-ring-opacity)); -} - -.ring-lime-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 249 157 / var(--tw-ring-opacity)); -} - -.ring-lime-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 242 100 / var(--tw-ring-opacity)); -} - -.ring-lime-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(163 230 53 / var(--tw-ring-opacity)); -} - -.ring-lime-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(247 254 231 / var(--tw-ring-opacity)); -} - -.ring-lime-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(132 204 22 / var(--tw-ring-opacity)); -} - -.ring-lime-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(101 163 13 / var(--tw-ring-opacity)); -} - -.ring-lime-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(77 124 15 / var(--tw-ring-opacity)); -} - -.ring-lime-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(63 98 18 / var(--tw-ring-opacity)); -} - -.ring-lime-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(54 83 20 / var(--tw-ring-opacity)); -} - -.ring-neutral-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 245 245 / var(--tw-ring-opacity)); -} - -.ring-neutral-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 229 229 / var(--tw-ring-opacity)); -} - -.ring-neutral-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(212 212 212 / var(--tw-ring-opacity)); -} - -.ring-neutral-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(163 163 163 / var(--tw-ring-opacity)); -} - -.ring-neutral-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - -.ring-neutral-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(115 115 115 / var(--tw-ring-opacity)); -} - -.ring-neutral-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(82 82 82 / var(--tw-ring-opacity)); -} - -.ring-neutral-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(64 64 64 / var(--tw-ring-opacity)); -} - -.ring-neutral-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(38 38 38 / var(--tw-ring-opacity)); -} - -.ring-neutral-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(23 23 23 / var(--tw-ring-opacity)); -} - -.ring-orange-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 237 213 / var(--tw-ring-opacity)); -} - -.ring-orange-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 215 170 / var(--tw-ring-opacity)); -} - -.ring-orange-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 186 116 / var(--tw-ring-opacity)); -} - -.ring-orange-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 146 60 / var(--tw-ring-opacity)); -} - -.ring-orange-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 247 237 / var(--tw-ring-opacity)); -} - -.ring-orange-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity)); -} - -.ring-orange-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(234 88 12 / var(--tw-ring-opacity)); -} - -.ring-orange-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(194 65 12 / var(--tw-ring-opacity)); -} - -.ring-orange-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(154 52 18 / var(--tw-ring-opacity)); -} - -.ring-orange-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(124 45 18 / var(--tw-ring-opacity)); -} - -.ring-pink-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 231 243 / var(--tw-ring-opacity)); -} - -.ring-pink-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 207 232 / var(--tw-ring-opacity)); -} - -.ring-pink-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 168 212 / var(--tw-ring-opacity)); -} - -.ring-pink-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 114 182 / var(--tw-ring-opacity)); -} - -.ring-pink-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 242 248 / var(--tw-ring-opacity)); -} - -.ring-pink-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 72 153 / var(--tw-ring-opacity)); -} - -.ring-pink-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(219 39 119 / var(--tw-ring-opacity)); -} - -.ring-pink-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 24 93 / var(--tw-ring-opacity)); -} - -.ring-pink-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(131 24 67 / var(--tw-ring-opacity)); -} - -.ring-purple-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(243 232 255 / var(--tw-ring-opacity)); -} - -.ring-purple-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(233 213 255 / var(--tw-ring-opacity)); -} - -.ring-purple-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(216 180 254 / var(--tw-ring-opacity)); -} - -.ring-purple-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(192 132 252 / var(--tw-ring-opacity)); -} - -.ring-purple-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 245 255 / var(--tw-ring-opacity)); -} - -.ring-purple-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity)); -} - -.ring-purple-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 51 234 / var(--tw-ring-opacity)); -} - -.ring-purple-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(126 34 206 / var(--tw-ring-opacity)); -} - -.ring-purple-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 33 168 / var(--tw-ring-opacity)); -} - -.ring-purple-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(88 28 135 / var(--tw-ring-opacity)); -} - -.ring-red-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 226 226 / var(--tw-ring-opacity)); -} - -.ring-red-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity)); -} - -.ring-red-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity)); -} - -.ring-red-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity)); -} - -.ring-red-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 242 242 / var(--tw-ring-opacity)); -} - -.ring-red-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity)); -} - -.ring-red-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(220 38 38 / var(--tw-ring-opacity)); -} - -.ring-red-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(185 28 28 / var(--tw-ring-opacity)); -} - -.ring-red-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity)); -} - -.ring-red-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(127 29 29 / var(--tw-ring-opacity)); -} - -.ring-rose-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 228 230 / var(--tw-ring-opacity)); -} - -.ring-rose-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 205 211 / var(--tw-ring-opacity)); -} - -.ring-rose-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 164 175 / var(--tw-ring-opacity)); -} - -.ring-rose-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 113 133 / var(--tw-ring-opacity)); -} - -.ring-rose-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 241 242 / var(--tw-ring-opacity)); -} - -.ring-rose-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 63 94 / var(--tw-ring-opacity)); -} - -.ring-rose-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(225 29 72 / var(--tw-ring-opacity)); -} - -.ring-rose-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 18 60 / var(--tw-ring-opacity)); -} - -.ring-rose-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(159 18 57 / var(--tw-ring-opacity)); -} - -.ring-rose-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(136 19 55 / var(--tw-ring-opacity)); -} - -.ring-sky-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(224 242 254 / var(--tw-ring-opacity)); -} - -.ring-sky-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(186 230 253 / var(--tw-ring-opacity)); -} - -.ring-sky-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(125 211 252 / var(--tw-ring-opacity)); -} - -.ring-sky-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(56 189 248 / var(--tw-ring-opacity)); -} - -.ring-sky-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 249 255 / var(--tw-ring-opacity)); -} - -.ring-sky-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity)); -} - -.ring-sky-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(2 132 199 / var(--tw-ring-opacity)); -} - -.ring-sky-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(3 105 161 / var(--tw-ring-opacity)); -} - -.ring-sky-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(7 89 133 / var(--tw-ring-opacity)); -} - -.ring-sky-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(12 74 110 / var(--tw-ring-opacity)); -} - -.ring-slate-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(241 245 249 / var(--tw-ring-opacity)); -} - -.ring-slate-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(226 232 240 / var(--tw-ring-opacity)); -} - -.ring-slate-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(203 213 225 / var(--tw-ring-opacity)); -} - -.ring-slate-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(148 163 184 / var(--tw-ring-opacity)); -} - -.ring-slate-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(248 250 252 / var(--tw-ring-opacity)); -} - -.ring-slate-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(100 116 139 / var(--tw-ring-opacity)); -} - -.ring-slate-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(71 85 105 / var(--tw-ring-opacity)); -} - -.ring-slate-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity)); -} - -.ring-slate-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 41 59 / var(--tw-ring-opacity)); -} - -.ring-slate-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(15 23 42 / var(--tw-ring-opacity)); -} - -.ring-stone-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 245 244 / var(--tw-ring-opacity)); -} - -.ring-stone-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(231 229 228 / var(--tw-ring-opacity)); -} - -.ring-stone-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(214 211 209 / var(--tw-ring-opacity)); -} - -.ring-stone-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 162 158 / var(--tw-ring-opacity)); -} - -.ring-stone-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 249 / var(--tw-ring-opacity)); -} - -.ring-stone-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(120 113 108 / var(--tw-ring-opacity)); -} - -.ring-stone-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(87 83 78 / var(--tw-ring-opacity)); -} - -.ring-stone-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(68 64 60 / var(--tw-ring-opacity)); -} - -.ring-stone-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(41 37 36 / var(--tw-ring-opacity)); -} - -.ring-stone-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(28 25 23 / var(--tw-ring-opacity)); -} - -.ring-teal-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(204 251 241 / var(--tw-ring-opacity)); -} - -.ring-teal-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(153 246 228 / var(--tw-ring-opacity)); -} - -.ring-teal-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(94 234 212 / var(--tw-ring-opacity)); -} - -.ring-teal-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(45 212 191 / var(--tw-ring-opacity)); -} - -.ring-teal-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 253 250 / var(--tw-ring-opacity)); -} - -.ring-teal-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity)); -} - -.ring-teal-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(13 148 136 / var(--tw-ring-opacity)); -} - -.ring-teal-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(15 118 110 / var(--tw-ring-opacity)); -} - -.ring-teal-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(17 94 89 / var(--tw-ring-opacity)); -} - -.ring-teal-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(19 78 74 / var(--tw-ring-opacity)); -} - -.ring-transparent { - --tw-ring-color: transparent; -} - -.ring-violet-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(237 233 254 / var(--tw-ring-opacity)); -} - -.ring-violet-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(221 214 254 / var(--tw-ring-opacity)); -} - -.ring-violet-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(196 181 253 / var(--tw-ring-opacity)); -} - -.ring-violet-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(167 139 250 / var(--tw-ring-opacity)); -} - -.ring-violet-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 243 255 / var(--tw-ring-opacity)); -} - -.ring-violet-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(139 92 246 / var(--tw-ring-opacity)); -} - -.ring-violet-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(124 58 237 / var(--tw-ring-opacity)); -} - -.ring-violet-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(109 40 217 / var(--tw-ring-opacity)); -} - -.ring-violet-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(91 33 182 / var(--tw-ring-opacity)); -} - -.ring-violet-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(76 29 149 / var(--tw-ring-opacity)); -} - -.ring-white { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity)); -} - -.ring-yellow-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 249 195 / var(--tw-ring-opacity)); -} - -.ring-yellow-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 240 138 / var(--tw-ring-opacity)); -} - -.ring-yellow-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 224 71 / var(--tw-ring-opacity)); -} - -.ring-yellow-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 204 21 / var(--tw-ring-opacity)); -} - -.ring-yellow-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 252 232 / var(--tw-ring-opacity)); -} - -.ring-yellow-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(234 179 8 / var(--tw-ring-opacity)); -} - -.ring-yellow-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(202 138 4 / var(--tw-ring-opacity)); -} - -.ring-yellow-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(161 98 7 / var(--tw-ring-opacity)); -} - -.ring-yellow-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(133 77 14 / var(--tw-ring-opacity)); -} - -.ring-yellow-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(113 63 18 / var(--tw-ring-opacity)); -} - -.ring-zinc-100 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 244 245 / var(--tw-ring-opacity)); -} - -.ring-zinc-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(228 228 231 / var(--tw-ring-opacity)); -} - -.ring-zinc-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(212 212 216 / var(--tw-ring-opacity)); -} - -.ring-zinc-400 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(161 161 170 / var(--tw-ring-opacity)); -} - -.ring-zinc-50 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - -.ring-zinc-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(113 113 122 / var(--tw-ring-opacity)); -} - -.ring-zinc-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(82 82 91 / var(--tw-ring-opacity)); -} - -.ring-zinc-700 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(63 63 70 / var(--tw-ring-opacity)); -} - -.ring-zinc-800 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(39 39 42 / var(--tw-ring-opacity)); -} - -.ring-zinc-900 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(24 24 27 / var(--tw-ring-opacity)); -} - -.blur { - --tw-blur: blur(8px); - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition { - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-all { - transition-property: all; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.placeholder\:text-gray-400::-moz-placeholder { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.placeholder\:text-gray-400::placeholder { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.placeholder\:text-gray-500::-moz-placeholder { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.placeholder\:text-gray-500::placeholder { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.visited\:text-blue-500:visited { - color: rgb(59 130 246 ); -} - -.hover\:border-b-2:hover { - border-bottom-width: 2px; -} - -.hover\:border-amber-100:hover { - --tw-border-opacity: 1; - border-color: rgb(254 243 199 / var(--tw-border-opacity)); -} - -.hover\:border-amber-200:hover { - --tw-border-opacity: 1; - border-color: rgb(253 230 138 / var(--tw-border-opacity)); -} - -.hover\:border-amber-300:hover { - --tw-border-opacity: 1; - border-color: rgb(252 211 77 / var(--tw-border-opacity)); -} - -.hover\:border-amber-400:hover { - --tw-border-opacity: 1; - border-color: rgb(251 191 36 / var(--tw-border-opacity)); -} - -.hover\:border-amber-50:hover { - --tw-border-opacity: 1; - border-color: rgb(255 251 235 / var(--tw-border-opacity)); -} - -.hover\:border-amber-500:hover { - --tw-border-opacity: 1; - border-color: rgb(245 158 11 / var(--tw-border-opacity)); -} - -.hover\:border-amber-600:hover { - --tw-border-opacity: 1; - border-color: rgb(217 119 6 / var(--tw-border-opacity)); -} - -.hover\:border-amber-700:hover { - --tw-border-opacity: 1; - border-color: rgb(180 83 9 / var(--tw-border-opacity)); -} - -.hover\:border-amber-800:hover { - --tw-border-opacity: 1; - border-color: rgb(146 64 14 / var(--tw-border-opacity)); -} - -.hover\:border-amber-900:hover { - --tw-border-opacity: 1; - border-color: rgb(120 53 15 / var(--tw-border-opacity)); -} - -.hover\:border-black:hover { - --tw-border-opacity: 1; - border-color: rgb(0 0 0 / var(--tw-border-opacity)); -} - -.hover\:border-blue-100:hover { - --tw-border-opacity: 1; - border-color: rgb(219 234 254 / var(--tw-border-opacity)); -} - -.hover\:border-blue-200:hover { - --tw-border-opacity: 1; - border-color: rgb(191 219 254 / var(--tw-border-opacity)); -} - -.hover\:border-blue-300:hover { - --tw-border-opacity: 1; - border-color: rgb(147 197 253 / var(--tw-border-opacity)); -} - -.hover\:border-blue-400:hover { - --tw-border-opacity: 1; - border-color: rgb(96 165 250 / var(--tw-border-opacity)); -} - -.hover\:border-blue-50:hover { - --tw-border-opacity: 1; - border-color: rgb(239 246 255 / var(--tw-border-opacity)); -} - -.hover\:border-blue-500:hover { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} - -.hover\:border-blue-600:hover { - --tw-border-opacity: 1; - border-color: rgb(37 99 235 / var(--tw-border-opacity)); -} - -.hover\:border-blue-700:hover { - --tw-border-opacity: 1; - border-color: rgb(29 78 216 / var(--tw-border-opacity)); -} - -.hover\:border-blue-800:hover { - --tw-border-opacity: 1; - border-color: rgb(30 64 175 / var(--tw-border-opacity)); -} - -.hover\:border-blue-900:hover { - --tw-border-opacity: 1; - border-color: rgb(30 58 138 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-100:hover { - --tw-border-opacity: 1; - border-color: rgb(207 250 254 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-200:hover { - --tw-border-opacity: 1; - border-color: rgb(165 243 252 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-300:hover { - --tw-border-opacity: 1; - border-color: rgb(103 232 249 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-400:hover { - --tw-border-opacity: 1; - border-color: rgb(34 211 238 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-50:hover { - --tw-border-opacity: 1; - border-color: rgb(236 254 255 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-500:hover { - --tw-border-opacity: 1; - border-color: rgb(6 182 212 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-600:hover { - --tw-border-opacity: 1; - border-color: rgb(8 145 178 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-700:hover { - --tw-border-opacity: 1; - border-color: rgb(14 116 144 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-800:hover { - --tw-border-opacity: 1; - border-color: rgb(21 94 117 / var(--tw-border-opacity)); -} - -.hover\:border-cyan-900:hover { - --tw-border-opacity: 1; - border-color: rgb(22 78 99 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-100:hover { - --tw-border-opacity: 1; - border-color: rgb(209 250 229 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-200:hover { - --tw-border-opacity: 1; - border-color: rgb(167 243 208 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-300:hover { - --tw-border-opacity: 1; - border-color: rgb(110 231 183 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-400:hover { - --tw-border-opacity: 1; - border-color: rgb(52 211 153 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-50:hover { - --tw-border-opacity: 1; - border-color: rgb(236 253 245 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-500:hover { - --tw-border-opacity: 1; - border-color: rgb(16 185 129 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-600:hover { - --tw-border-opacity: 1; - border-color: rgb(5 150 105 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-700:hover { - --tw-border-opacity: 1; - border-color: rgb(4 120 87 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-800:hover { - --tw-border-opacity: 1; - border-color: rgb(6 95 70 / var(--tw-border-opacity)); -} - -.hover\:border-emerald-900:hover { - --tw-border-opacity: 1; - border-color: rgb(6 78 59 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-100:hover { - --tw-border-opacity: 1; - border-color: rgb(250 232 255 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-200:hover { - --tw-border-opacity: 1; - border-color: rgb(245 208 254 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-300:hover { - --tw-border-opacity: 1; - border-color: rgb(240 171 252 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-400:hover { - --tw-border-opacity: 1; - border-color: rgb(232 121 249 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-50:hover { - --tw-border-opacity: 1; - border-color: rgb(253 244 255 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-500:hover { - --tw-border-opacity: 1; - border-color: rgb(217 70 239 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-600:hover { - --tw-border-opacity: 1; - border-color: rgb(192 38 211 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-700:hover { - --tw-border-opacity: 1; - border-color: rgb(162 28 175 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-800:hover { - --tw-border-opacity: 1; - border-color: rgb(134 25 143 / var(--tw-border-opacity)); -} - -.hover\:border-fuchsia-900:hover { - --tw-border-opacity: 1; - border-color: rgb(112 26 117 / var(--tw-border-opacity)); -} - -.hover\:border-gray-100:hover { - --tw-border-opacity: 1; - border-color: rgb(243 244 246 / var(--tw-border-opacity)); -} - -.hover\:border-gray-200:hover { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity)); -} - -.hover\:border-gray-300:hover { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} - -.hover\:border-gray-400:hover { - --tw-border-opacity: 1; - border-color: rgb(156 163 175 / var(--tw-border-opacity)); -} - -.hover\:border-gray-50:hover { - --tw-border-opacity: 1; - border-color: rgb(249 250 251 / var(--tw-border-opacity)); -} - -.hover\:border-gray-500:hover { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); -} - -.hover\:border-gray-600:hover { - --tw-border-opacity: 1; - border-color: rgb(75 85 99 / var(--tw-border-opacity)); -} - -.hover\:border-gray-700:hover { - --tw-border-opacity: 1; - border-color: rgb(55 65 81 / var(--tw-border-opacity)); -} - -.hover\:border-gray-800:hover { - --tw-border-opacity: 1; - border-color: rgb(31 41 55 / var(--tw-border-opacity)); -} - -.hover\:border-gray-900:hover { - --tw-border-opacity: 1; - border-color: rgb(17 24 39 / var(--tw-border-opacity)); -} - -.hover\:border-green-100:hover { - --tw-border-opacity: 1; - border-color: rgb(220 252 231 / var(--tw-border-opacity)); -} - -.hover\:border-green-200:hover { - --tw-border-opacity: 1; - border-color: rgb(187 247 208 / var(--tw-border-opacity)); -} - -.hover\:border-green-300:hover { - --tw-border-opacity: 1; - border-color: rgb(134 239 172 / var(--tw-border-opacity)); -} - -.hover\:border-green-400:hover { - --tw-border-opacity: 1; - border-color: rgb(74 222 128 / var(--tw-border-opacity)); -} - -.hover\:border-green-50:hover { - --tw-border-opacity: 1; - border-color: rgb(240 253 244 / var(--tw-border-opacity)); -} - -.hover\:border-green-500:hover { - --tw-border-opacity: 1; - border-color: rgb(34 197 94 / var(--tw-border-opacity)); -} - -.hover\:border-green-600:hover { - --tw-border-opacity: 1; - border-color: rgb(22 163 74 / var(--tw-border-opacity)); -} - -.hover\:border-green-700:hover { - --tw-border-opacity: 1; - border-color: rgb(21 128 61 / var(--tw-border-opacity)); -} - -.hover\:border-green-800:hover { - --tw-border-opacity: 1; - border-color: rgb(22 101 52 / var(--tw-border-opacity)); -} - -.hover\:border-green-900:hover { - --tw-border-opacity: 1; - border-color: rgb(20 83 45 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-100:hover { - --tw-border-opacity: 1; - border-color: rgb(224 231 255 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-200:hover { - --tw-border-opacity: 1; - border-color: rgb(199 210 254 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-300:hover { - --tw-border-opacity: 1; - border-color: rgb(165 180 252 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-400:hover { - --tw-border-opacity: 1; - border-color: rgb(129 140 248 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-50:hover { - --tw-border-opacity: 1; - border-color: rgb(238 242 255 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-500:hover { - --tw-border-opacity: 1; - border-color: rgb(99 102 241 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-600:hover { - --tw-border-opacity: 1; - border-color: rgb(79 70 229 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-700:hover { - --tw-border-opacity: 1; - border-color: rgb(67 56 202 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-800:hover { - --tw-border-opacity: 1; - border-color: rgb(55 48 163 / var(--tw-border-opacity)); -} - -.hover\:border-indigo-900:hover { - --tw-border-opacity: 1; - border-color: rgb(49 46 129 / var(--tw-border-opacity)); -} - -.hover\:border-lime-100:hover { - --tw-border-opacity: 1; - border-color: rgb(236 252 203 / var(--tw-border-opacity)); -} - -.hover\:border-lime-200:hover { - --tw-border-opacity: 1; - border-color: rgb(217 249 157 / var(--tw-border-opacity)); -} - -.hover\:border-lime-300:hover { - --tw-border-opacity: 1; - border-color: rgb(190 242 100 / var(--tw-border-opacity)); -} - -.hover\:border-lime-400:hover { - --tw-border-opacity: 1; - border-color: rgb(163 230 53 / var(--tw-border-opacity)); -} - -.hover\:border-lime-50:hover { - --tw-border-opacity: 1; - border-color: rgb(247 254 231 / var(--tw-border-opacity)); -} - -.hover\:border-lime-500:hover { - --tw-border-opacity: 1; - border-color: rgb(132 204 22 / var(--tw-border-opacity)); -} - -.hover\:border-lime-600:hover { - --tw-border-opacity: 1; - border-color: rgb(101 163 13 / var(--tw-border-opacity)); -} - -.hover\:border-lime-700:hover { - --tw-border-opacity: 1; - border-color: rgb(77 124 15 / var(--tw-border-opacity)); -} - -.hover\:border-lime-800:hover { - --tw-border-opacity: 1; - border-color: rgb(63 98 18 / var(--tw-border-opacity)); -} - -.hover\:border-lime-900:hover { - --tw-border-opacity: 1; - border-color: rgb(54 83 20 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-100:hover { - --tw-border-opacity: 1; - border-color: rgb(245 245 245 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-200:hover { - --tw-border-opacity: 1; - border-color: rgb(229 229 229 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-300:hover { - --tw-border-opacity: 1; - border-color: rgb(212 212 212 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-400:hover { - --tw-border-opacity: 1; - border-color: rgb(163 163 163 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-50:hover { - --tw-border-opacity: 1; - border-color: rgb(250 250 250 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-500:hover { - --tw-border-opacity: 1; - border-color: rgb(115 115 115 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-600:hover { - --tw-border-opacity: 1; - border-color: rgb(82 82 82 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-700:hover { - --tw-border-opacity: 1; - border-color: rgb(64 64 64 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-800:hover { - --tw-border-opacity: 1; - border-color: rgb(38 38 38 / var(--tw-border-opacity)); -} - -.hover\:border-neutral-900:hover { - --tw-border-opacity: 1; - border-color: rgb(23 23 23 / var(--tw-border-opacity)); -} - -.hover\:border-orange-100:hover { - --tw-border-opacity: 1; - border-color: rgb(255 237 213 / var(--tw-border-opacity)); -} - -.hover\:border-orange-200:hover { - --tw-border-opacity: 1; - border-color: rgb(254 215 170 / var(--tw-border-opacity)); -} - -.hover\:border-orange-300:hover { - --tw-border-opacity: 1; - border-color: rgb(253 186 116 / var(--tw-border-opacity)); -} - -.hover\:border-orange-400:hover { - --tw-border-opacity: 1; - border-color: rgb(251 146 60 / var(--tw-border-opacity)); -} - -.hover\:border-orange-50:hover { - --tw-border-opacity: 1; - border-color: rgb(255 247 237 / var(--tw-border-opacity)); -} - -.hover\:border-orange-500:hover { - --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); -} - -.hover\:border-orange-600:hover { - --tw-border-opacity: 1; - border-color: rgb(234 88 12 / var(--tw-border-opacity)); -} - -.hover\:border-orange-700:hover { - --tw-border-opacity: 1; - border-color: rgb(194 65 12 / var(--tw-border-opacity)); -} - -.hover\:border-orange-800:hover { - --tw-border-opacity: 1; - border-color: rgb(154 52 18 / var(--tw-border-opacity)); -} - -.hover\:border-orange-900:hover { - --tw-border-opacity: 1; - border-color: rgb(124 45 18 / var(--tw-border-opacity)); -} - -.hover\:border-pink-100:hover { - --tw-border-opacity: 1; - border-color: rgb(252 231 243 / var(--tw-border-opacity)); -} - -.hover\:border-pink-200:hover { - --tw-border-opacity: 1; - border-color: rgb(251 207 232 / var(--tw-border-opacity)); -} - -.hover\:border-pink-300:hover { - --tw-border-opacity: 1; - border-color: rgb(249 168 212 / var(--tw-border-opacity)); -} - -.hover\:border-pink-400:hover { - --tw-border-opacity: 1; - border-color: rgb(244 114 182 / var(--tw-border-opacity)); -} - -.hover\:border-pink-50:hover { - --tw-border-opacity: 1; - border-color: rgb(253 242 248 / var(--tw-border-opacity)); -} - -.hover\:border-pink-500:hover { - --tw-border-opacity: 1; - border-color: rgb(236 72 153 / var(--tw-border-opacity)); -} - -.hover\:border-pink-600:hover { - --tw-border-opacity: 1; - border-color: rgb(219 39 119 / var(--tw-border-opacity)); -} - -.hover\:border-pink-700:hover { - --tw-border-opacity: 1; - border-color: rgb(190 24 93 / var(--tw-border-opacity)); -} - -.hover\:border-pink-900:hover { - --tw-border-opacity: 1; - border-color: rgb(131 24 67 / var(--tw-border-opacity)); -} - -.hover\:border-purple-100:hover { - --tw-border-opacity: 1; - border-color: rgb(243 232 255 / var(--tw-border-opacity)); -} - -.hover\:border-purple-200:hover { - --tw-border-opacity: 1; - border-color: rgb(233 213 255 / var(--tw-border-opacity)); -} - -.hover\:border-purple-300:hover { - --tw-border-opacity: 1; - border-color: rgb(216 180 254 / var(--tw-border-opacity)); -} - -.hover\:border-purple-400:hover { - --tw-border-opacity: 1; - border-color: rgb(192 132 252 / var(--tw-border-opacity)); -} - -.hover\:border-purple-50:hover { - --tw-border-opacity: 1; - border-color: rgb(250 245 255 / var(--tw-border-opacity)); -} - -.hover\:border-purple-500:hover { - --tw-border-opacity: 1; - border-color: rgb(168 85 247 / var(--tw-border-opacity)); -} - -.hover\:border-purple-600:hover { - --tw-border-opacity: 1; - border-color: rgb(147 51 234 / var(--tw-border-opacity)); -} - -.hover\:border-purple-700:hover { - --tw-border-opacity: 1; - border-color: rgb(126 34 206 / var(--tw-border-opacity)); -} - -.hover\:border-purple-800:hover { - --tw-border-opacity: 1; - border-color: rgb(107 33 168 / var(--tw-border-opacity)); -} - -.hover\:border-purple-900:hover { - --tw-border-opacity: 1; - border-color: rgb(88 28 135 / var(--tw-border-opacity)); -} - -.hover\:border-red-100:hover { - --tw-border-opacity: 1; - border-color: rgb(254 226 226 / var(--tw-border-opacity)); -} - -.hover\:border-red-200:hover { - --tw-border-opacity: 1; - border-color: rgb(254 202 202 / var(--tw-border-opacity)); -} - -.hover\:border-red-300:hover { - --tw-border-opacity: 1; - border-color: rgb(252 165 165 / var(--tw-border-opacity)); -} - -.hover\:border-red-400:hover { - --tw-border-opacity: 1; - border-color: rgb(248 113 113 / var(--tw-border-opacity)); -} - -.hover\:border-red-50:hover { - --tw-border-opacity: 1; - border-color: rgb(254 242 242 / var(--tw-border-opacity)); -} - -.hover\:border-red-500:hover { - --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); -} - -.hover\:border-red-600:hover { - --tw-border-opacity: 1; - border-color: rgb(220 38 38 / var(--tw-border-opacity)); -} - -.hover\:border-red-700:hover { - --tw-border-opacity: 1; - border-color: rgb(185 28 28 / var(--tw-border-opacity)); -} - -.hover\:border-red-800:hover { - --tw-border-opacity: 1; - border-color: rgb(153 27 27 / var(--tw-border-opacity)); -} - -.hover\:border-red-900:hover { - --tw-border-opacity: 1; - border-color: rgb(127 29 29 / var(--tw-border-opacity)); -} - -.hover\:border-rose-100:hover { - --tw-border-opacity: 1; - border-color: rgb(255 228 230 / var(--tw-border-opacity)); -} - -.hover\:border-rose-200:hover { - --tw-border-opacity: 1; - border-color: rgb(254 205 211 / var(--tw-border-opacity)); -} - -.hover\:border-rose-300:hover { - --tw-border-opacity: 1; - border-color: rgb(253 164 175 / var(--tw-border-opacity)); -} - -.hover\:border-rose-400:hover { - --tw-border-opacity: 1; - border-color: rgb(251 113 133 / var(--tw-border-opacity)); -} - -.hover\:border-rose-50:hover { - --tw-border-opacity: 1; - border-color: rgb(255 241 242 / var(--tw-border-opacity)); -} - -.hover\:border-rose-500:hover { - --tw-border-opacity: 1; - border-color: rgb(244 63 94 / var(--tw-border-opacity)); -} - -.hover\:border-rose-600:hover { - --tw-border-opacity: 1; - border-color: rgb(225 29 72 / var(--tw-border-opacity)); -} - -.hover\:border-rose-700:hover { - --tw-border-opacity: 1; - border-color: rgb(190 18 60 / var(--tw-border-opacity)); -} - -.hover\:border-rose-800:hover { - --tw-border-opacity: 1; - border-color: rgb(159 18 57 / var(--tw-border-opacity)); -} - -.hover\:border-rose-900:hover { - --tw-border-opacity: 1; - border-color: rgb(136 19 55 / var(--tw-border-opacity)); -} - -.hover\:border-sky-100:hover { - --tw-border-opacity: 1; - border-color: rgb(224 242 254 / var(--tw-border-opacity)); -} - -.hover\:border-sky-200:hover { - --tw-border-opacity: 1; - border-color: rgb(186 230 253 / var(--tw-border-opacity)); -} - -.hover\:border-sky-300:hover { - --tw-border-opacity: 1; - border-color: rgb(125 211 252 / var(--tw-border-opacity)); -} - -.hover\:border-sky-400:hover { - --tw-border-opacity: 1; - border-color: rgb(56 189 248 / var(--tw-border-opacity)); -} - -.hover\:border-sky-50:hover { - --tw-border-opacity: 1; - border-color: rgb(240 249 255 / var(--tw-border-opacity)); -} - -.hover\:border-sky-500:hover { - --tw-border-opacity: 1; - border-color: rgb(14 165 233 / var(--tw-border-opacity)); -} - -.hover\:border-sky-600:hover { - --tw-border-opacity: 1; - border-color: rgb(2 132 199 / var(--tw-border-opacity)); -} - -.hover\:border-sky-700:hover { - --tw-border-opacity: 1; - border-color: rgb(3 105 161 / var(--tw-border-opacity)); -} - -.hover\:border-sky-800:hover { - --tw-border-opacity: 1; - border-color: rgb(7 89 133 / var(--tw-border-opacity)); -} - -.hover\:border-sky-900:hover { - --tw-border-opacity: 1; - border-color: rgb(12 74 110 / var(--tw-border-opacity)); -} - -.hover\:border-slate-100:hover { - --tw-border-opacity: 1; - border-color: rgb(241 245 249 / var(--tw-border-opacity)); -} - -.hover\:border-slate-200:hover { - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)); -} - -.hover\:border-slate-300:hover { - --tw-border-opacity: 1; - border-color: rgb(203 213 225 / var(--tw-border-opacity)); -} - -.hover\:border-slate-400:hover { - --tw-border-opacity: 1; - border-color: rgb(148 163 184 / var(--tw-border-opacity)); -} - -.hover\:border-slate-50:hover { - --tw-border-opacity: 1; - border-color: rgb(248 250 252 / var(--tw-border-opacity)); -} - -.hover\:border-slate-500:hover { - --tw-border-opacity: 1; - border-color: rgb(100 116 139 / var(--tw-border-opacity)); -} - -.hover\:border-slate-600:hover { - --tw-border-opacity: 1; - border-color: rgb(71 85 105 / var(--tw-border-opacity)); -} - -.hover\:border-slate-700:hover { - --tw-border-opacity: 1; - border-color: rgb(51 65 85 / var(--tw-border-opacity)); -} - -.hover\:border-slate-800:hover { - --tw-border-opacity: 1; - border-color: rgb(30 41 59 / var(--tw-border-opacity)); -} - -.hover\:border-slate-900:hover { - --tw-border-opacity: 1; - border-color: rgb(15 23 42 / var(--tw-border-opacity)); -} - -.hover\:border-stone-100:hover { - --tw-border-opacity: 1; - border-color: rgb(245 245 244 / var(--tw-border-opacity)); -} - -.hover\:border-stone-200:hover { - --tw-border-opacity: 1; - border-color: rgb(231 229 228 / var(--tw-border-opacity)); -} - -.hover\:border-stone-300:hover { - --tw-border-opacity: 1; - border-color: rgb(214 211 209 / var(--tw-border-opacity)); -} - -.hover\:border-stone-400:hover { - --tw-border-opacity: 1; - border-color: rgb(168 162 158 / var(--tw-border-opacity)); -} - -.hover\:border-stone-50:hover { - --tw-border-opacity: 1; - border-color: rgb(250 250 249 / var(--tw-border-opacity)); -} - -.hover\:border-stone-500:hover { - --tw-border-opacity: 1; - border-color: rgb(120 113 108 / var(--tw-border-opacity)); -} - -.hover\:border-stone-600:hover { - --tw-border-opacity: 1; - border-color: rgb(87 83 78 / var(--tw-border-opacity)); -} - -.hover\:border-stone-700:hover { - --tw-border-opacity: 1; - border-color: rgb(68 64 60 / var(--tw-border-opacity)); -} - -.hover\:border-stone-800:hover { - --tw-border-opacity: 1; - border-color: rgb(41 37 36 / var(--tw-border-opacity)); -} - -.hover\:border-stone-900:hover { - --tw-border-opacity: 1; - border-color: rgb(28 25 23 / var(--tw-border-opacity)); -} - -.hover\:border-teal-100:hover { - --tw-border-opacity: 1; - border-color: rgb(204 251 241 / var(--tw-border-opacity)); -} - -.hover\:border-teal-200:hover { - --tw-border-opacity: 1; - border-color: rgb(153 246 228 / var(--tw-border-opacity)); -} - -.hover\:border-teal-300:hover { - --tw-border-opacity: 1; - border-color: rgb(94 234 212 / var(--tw-border-opacity)); -} - -.hover\:border-teal-400:hover { - --tw-border-opacity: 1; - border-color: rgb(45 212 191 / var(--tw-border-opacity)); -} - -.hover\:border-teal-50:hover { - --tw-border-opacity: 1; - border-color: rgb(240 253 250 / var(--tw-border-opacity)); -} - -.hover\:border-teal-500:hover { - --tw-border-opacity: 1; - border-color: rgb(20 184 166 / var(--tw-border-opacity)); -} - -.hover\:border-teal-600:hover { - --tw-border-opacity: 1; - border-color: rgb(13 148 136 / var(--tw-border-opacity)); -} - -.hover\:border-teal-700:hover { - --tw-border-opacity: 1; - border-color: rgb(15 118 110 / var(--tw-border-opacity)); -} - -.hover\:border-teal-800:hover { - --tw-border-opacity: 1; - border-color: rgb(17 94 89 / var(--tw-border-opacity)); -} - -.hover\:border-teal-900:hover { - --tw-border-opacity: 1; - border-color: rgb(19 78 74 / var(--tw-border-opacity)); -} - -.hover\:border-transparent:hover { - border-color: transparent; -} - -.hover\:border-violet-100:hover { - --tw-border-opacity: 1; - border-color: rgb(237 233 254 / var(--tw-border-opacity)); -} - -.hover\:border-violet-200:hover { - --tw-border-opacity: 1; - border-color: rgb(221 214 254 / var(--tw-border-opacity)); -} - -.hover\:border-violet-300:hover { - --tw-border-opacity: 1; - border-color: rgb(196 181 253 / var(--tw-border-opacity)); -} - -.hover\:border-violet-400:hover { - --tw-border-opacity: 1; - border-color: rgb(167 139 250 / var(--tw-border-opacity)); -} - -.hover\:border-violet-50:hover { - --tw-border-opacity: 1; - border-color: rgb(245 243 255 / var(--tw-border-opacity)); -} - -.hover\:border-violet-500:hover { - --tw-border-opacity: 1; - border-color: rgb(139 92 246 / var(--tw-border-opacity)); -} - -.hover\:border-violet-600:hover { - --tw-border-opacity: 1; - border-color: rgb(124 58 237 / var(--tw-border-opacity)); -} - -.hover\:border-violet-700:hover { - --tw-border-opacity: 1; - border-color: rgb(109 40 217 / var(--tw-border-opacity)); -} - -.hover\:border-violet-800:hover { - --tw-border-opacity: 1; - border-color: rgb(91 33 182 / var(--tw-border-opacity)); -} - -.hover\:border-violet-900:hover { - --tw-border-opacity: 1; - border-color: rgb(76 29 149 / var(--tw-border-opacity)); -} - -.hover\:border-white:hover { - --tw-border-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-100:hover { - --tw-border-opacity: 1; - border-color: rgb(254 249 195 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-200:hover { - --tw-border-opacity: 1; - border-color: rgb(254 240 138 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-300:hover { - --tw-border-opacity: 1; - border-color: rgb(253 224 71 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-400:hover { - --tw-border-opacity: 1; - border-color: rgb(250 204 21 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-50:hover { - --tw-border-opacity: 1; - border-color: rgb(254 252 232 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-500:hover { - --tw-border-opacity: 1; - border-color: rgb(234 179 8 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-600:hover { - --tw-border-opacity: 1; - border-color: rgb(202 138 4 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-700:hover { - --tw-border-opacity: 1; - border-color: rgb(161 98 7 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-800:hover { - --tw-border-opacity: 1; - border-color: rgb(133 77 14 / var(--tw-border-opacity)); -} - -.hover\:border-yellow-900:hover { - --tw-border-opacity: 1; - border-color: rgb(113 63 18 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-100:hover { - --tw-border-opacity: 1; - border-color: rgb(244 244 245 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-200:hover { - --tw-border-opacity: 1; - border-color: rgb(228 228 231 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-300:hover { - --tw-border-opacity: 1; - border-color: rgb(212 212 216 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-400:hover { - --tw-border-opacity: 1; - border-color: rgb(161 161 170 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-50:hover { - --tw-border-opacity: 1; - border-color: rgb(250 250 250 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-500:hover { - --tw-border-opacity: 1; - border-color: rgb(113 113 122 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-600:hover { - --tw-border-opacity: 1; - border-color: rgb(82 82 91 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-700:hover { - --tw-border-opacity: 1; - border-color: rgb(63 63 70 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-800:hover { - --tw-border-opacity: 1; - border-color: rgb(39 39 42 / var(--tw-border-opacity)); -} - -.hover\:border-zinc-900:hover { - --tw-border-opacity: 1; - border-color: rgb(24 24 27 / var(--tw-border-opacity)); -} - -.hover\:bg-amber-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 243 199 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(253 230 138 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(252 211 77 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(251 191 36 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(255 251 235 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(245 158 11 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(217 119 6 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(180 83 9 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(146 64 14 / var(--tw-bg-opacity)); -} - -.hover\:bg-amber-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(120 53 15 / var(--tw-bg-opacity)); -} - -.hover\:bg-black:hover { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(219 234 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(191 219 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(147 197 253 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(96 165 250 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(239 246 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(59 130 246 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(29 78 216 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(30 64 175 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(30 58 138 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(207 250 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(165 243 252 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(103 232 249 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(34 211 238 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(236 254 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(6 182 212 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(8 145 178 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(14 116 144 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(21 94 117 / var(--tw-bg-opacity)); -} - -.hover\:bg-cyan-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(22 78 99 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(209 250 229 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(167 243 208 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(110 231 183 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(52 211 153 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(236 253 245 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(16 185 129 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(5 150 105 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(4 120 87 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(6 95 70 / var(--tw-bg-opacity)); -} - -.hover\:bg-emerald-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(6 78 59 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 232 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(245 208 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(240 171 252 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(232 121 249 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(253 244 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(217 70 239 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(192 38 211 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(162 28 175 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(134 25 143 / var(--tw-bg-opacity)); -} - -.hover\:bg-fuchsia-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(112 26 117 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(229 231 235 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(209 213 219 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(156 163 175 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(107 114 128 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(75 85 99 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(55 65 81 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(31 41 55 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(17 24 39 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(220 252 231 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(187 247 208 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(134 239 172 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(74 222 128 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(240 253 244 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(34 197 94 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(22 163 74 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(21 128 61 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(22 101 52 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(20 83 45 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(224 231 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(199 210 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(165 180 252 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(129 140 248 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(238 242 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(99 102 241 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(79 70 229 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(67 56 202 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(55 48 163 / var(--tw-bg-opacity)); -} - -.hover\:bg-indigo-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(49 46 129 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(236 252 203 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(217 249 157 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(190 242 100 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(163 230 53 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(247 254 231 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(132 204 22 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(101 163 13 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(77 124 15 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(63 98 18 / var(--tw-bg-opacity)); -} - -.hover\:bg-lime-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(54 83 20 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(245 245 245 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(229 229 229 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(212 212 212 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(163 163 163 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(115 115 115 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(82 82 82 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(64 64 64 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(38 38 38 / var(--tw-bg-opacity)); -} - -.hover\:bg-neutral-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(23 23 23 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(255 237 213 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 215 170 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(253 186 116 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(251 146 60 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(255 247 237 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(249 115 22 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(234 88 12 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(194 65 12 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(154 52 18 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(124 45 18 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(252 231 243 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(251 207 232 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(249 168 212 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(244 114 182 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(253 242 248 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(236 72 153 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(219 39 119 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(190 24 93 / var(--tw-bg-opacity)); -} - -.hover\:bg-pink-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(131 24 67 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(243 232 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(233 213 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(216 180 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(192 132 252 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 245 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(168 85 247 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(147 51 234 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(126 34 206 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(107 33 168 / var(--tw-bg-opacity)); -} - -.hover\:bg-purple-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(88 28 135 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 202 202 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(252 165 165 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(248 113 113 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(239 68 68 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(185 28 28 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(153 27 27 / var(--tw-bg-opacity)); -} - -.hover\:bg-red-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(127 29 29 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(255 228 230 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 205 211 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(253 164 175 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(251 113 133 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(255 241 242 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(244 63 94 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(225 29 72 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(190 18 60 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(159 18 57 / var(--tw-bg-opacity)); -} - -.hover\:bg-rose-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(136 19 55 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(224 242 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(186 230 253 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(125 211 252 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(56 189 248 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(240 249 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(14 165 233 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(2 132 199 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(3 105 161 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(7 89 133 / var(--tw-bg-opacity)); -} - -.hover\:bg-sky-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(12 74 110 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(241 245 249 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(226 232 240 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(203 213 225 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(148 163 184 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(248 250 252 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(100 116 139 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(71 85 105 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(51 65 85 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(30 41 59 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(15 23 42 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(245 245 244 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(231 229 228 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(214 211 209 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(168 162 158 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 250 249 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(120 113 108 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(87 83 78 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(68 64 60 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(41 37 36 / var(--tw-bg-opacity)); -} - -.hover\:bg-stone-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(28 25 23 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(204 251 241 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(153 246 228 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(94 234 212 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(45 212 191 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(240 253 250 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(20 184 166 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(13 148 136 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(15 118 110 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(17 94 89 / var(--tw-bg-opacity)); -} - -.hover\:bg-teal-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(19 78 74 / var(--tw-bg-opacity)); -} - -.hover\:bg-transparent:hover { - background-color: transparent; -} - -.hover\:bg-violet-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(237 233 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(221 214 254 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(196 181 253 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(167 139 250 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(245 243 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(139 92 246 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(124 58 237 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(109 40 217 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(91 33 182 / var(--tw-bg-opacity)); -} - -.hover\:bg-violet-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(76 29 149 / var(--tw-bg-opacity)); -} - -.hover\:bg-white:hover { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 249 195 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 240 138 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(253 224 71 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 204 21 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(254 252 232 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(234 179 8 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(202 138 4 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(161 98 7 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(133 77 14 / var(--tw-bg-opacity)); -} - -.hover\:bg-yellow-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(113 63 18 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(244 244 245 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(228 228 231 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(212 212 216 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(161 161 170 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(250 250 250 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(113 113 122 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(82 82 91 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(63 63 70 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(39 39 42 / var(--tw-bg-opacity)); -} - -.hover\:bg-zinc-900:hover { - --tw-bg-opacity: 1; - background-color: rgb(24 24 27 / var(--tw-bg-opacity)); -} - -.hover\:text-amber-100:hover { - --tw-text-opacity: 1; - color: rgb(254 243 199 / var(--tw-text-opacity)); -} - -.hover\:text-amber-200:hover { - --tw-text-opacity: 1; - color: rgb(253 230 138 / var(--tw-text-opacity)); -} - -.hover\:text-amber-300:hover { - --tw-text-opacity: 1; - color: rgb(252 211 77 / var(--tw-text-opacity)); -} - -.hover\:text-amber-400:hover { - --tw-text-opacity: 1; - color: rgb(251 191 36 / var(--tw-text-opacity)); -} - -.hover\:text-amber-50:hover { - --tw-text-opacity: 1; - color: rgb(255 251 235 / var(--tw-text-opacity)); -} - -.hover\:text-amber-500:hover { - --tw-text-opacity: 1; - color: rgb(245 158 11 / var(--tw-text-opacity)); -} - -.hover\:text-amber-600:hover { - --tw-text-opacity: 1; - color: rgb(217 119 6 / var(--tw-text-opacity)); -} - -.hover\:text-amber-700:hover { - --tw-text-opacity: 1; - color: rgb(180 83 9 / var(--tw-text-opacity)); -} - -.hover\:text-amber-800:hover { - --tw-text-opacity: 1; - color: rgb(146 64 14 / var(--tw-text-opacity)); -} - -.hover\:text-amber-900:hover { - --tw-text-opacity: 1; - color: rgb(120 53 15 / var(--tw-text-opacity)); -} - -.hover\:text-black:hover { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} - -.hover\:text-blue-100:hover { - --tw-text-opacity: 1; - color: rgb(219 234 254 / var(--tw-text-opacity)); -} - -.hover\:text-blue-200:hover { - --tw-text-opacity: 1; - color: rgb(191 219 254 / var(--tw-text-opacity)); -} - -.hover\:text-blue-300:hover { - --tw-text-opacity: 1; - color: rgb(147 197 253 / var(--tw-text-opacity)); -} - -.hover\:text-blue-400:hover { - --tw-text-opacity: 1; - color: rgb(96 165 250 / var(--tw-text-opacity)); -} - -.hover\:text-blue-50:hover { - --tw-text-opacity: 1; - color: rgb(239 246 255 / var(--tw-text-opacity)); -} - -.hover\:text-blue-500:hover { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - -.hover\:text-blue-600:hover { - --tw-text-opacity: 1; - color: rgb(37 99 235 / var(--tw-text-opacity)); -} - -.hover\:text-blue-700:hover { - --tw-text-opacity: 1; - color: rgb(29 78 216 / var(--tw-text-opacity)); -} - -.hover\:text-blue-800:hover { - --tw-text-opacity: 1; - color: rgb(30 64 175 / var(--tw-text-opacity)); -} - -.hover\:text-blue-900:hover { - --tw-text-opacity: 1; - color: rgb(30 58 138 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-100:hover { - --tw-text-opacity: 1; - color: rgb(207 250 254 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-200:hover { - --tw-text-opacity: 1; - color: rgb(165 243 252 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-300:hover { - --tw-text-opacity: 1; - color: rgb(103 232 249 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-400:hover { - --tw-text-opacity: 1; - color: rgb(34 211 238 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-50:hover { - --tw-text-opacity: 1; - color: rgb(236 254 255 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-500:hover { - --tw-text-opacity: 1; - color: rgb(6 182 212 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-600:hover { - --tw-text-opacity: 1; - color: rgb(8 145 178 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-700:hover { - --tw-text-opacity: 1; - color: rgb(14 116 144 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-800:hover { - --tw-text-opacity: 1; - color: rgb(21 94 117 / var(--tw-text-opacity)); -} - -.hover\:text-cyan-900:hover { - --tw-text-opacity: 1; - color: rgb(22 78 99 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-100:hover { - --tw-text-opacity: 1; - color: rgb(209 250 229 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-200:hover { - --tw-text-opacity: 1; - color: rgb(167 243 208 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-300:hover { - --tw-text-opacity: 1; - color: rgb(110 231 183 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-400:hover { - --tw-text-opacity: 1; - color: rgb(52 211 153 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-50:hover { - --tw-text-opacity: 1; - color: rgb(236 253 245 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-500:hover { - --tw-text-opacity: 1; - color: rgb(16 185 129 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-600:hover { - --tw-text-opacity: 1; - color: rgb(5 150 105 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-700:hover { - --tw-text-opacity: 1; - color: rgb(4 120 87 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-800:hover { - --tw-text-opacity: 1; - color: rgb(6 95 70 / var(--tw-text-opacity)); -} - -.hover\:text-emerald-900:hover { - --tw-text-opacity: 1; - color: rgb(6 78 59 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-100:hover { - --tw-text-opacity: 1; - color: rgb(250 232 255 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-200:hover { - --tw-text-opacity: 1; - color: rgb(245 208 254 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-300:hover { - --tw-text-opacity: 1; - color: rgb(240 171 252 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-400:hover { - --tw-text-opacity: 1; - color: rgb(232 121 249 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-50:hover { - --tw-text-opacity: 1; - color: rgb(253 244 255 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-500:hover { - --tw-text-opacity: 1; - color: rgb(217 70 239 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-600:hover { - --tw-text-opacity: 1; - color: rgb(192 38 211 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-700:hover { - --tw-text-opacity: 1; - color: rgb(162 28 175 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-800:hover { - --tw-text-opacity: 1; - color: rgb(134 25 143 / var(--tw-text-opacity)); -} - -.hover\:text-fuchsia-900:hover { - --tw-text-opacity: 1; - color: rgb(112 26 117 / var(--tw-text-opacity)); -} - -.hover\:text-gray-100:hover { - --tw-text-opacity: 1; - color: rgb(243 244 246 / var(--tw-text-opacity)); -} - -.hover\:text-gray-200:hover { - --tw-text-opacity: 1; - color: rgb(229 231 235 / var(--tw-text-opacity)); -} - -.hover\:text-gray-300:hover { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)); -} - -.hover\:text-gray-400:hover { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.hover\:text-gray-50:hover { - --tw-text-opacity: 1; - color: rgb(249 250 251 / var(--tw-text-opacity)); -} - -.hover\:text-gray-500:hover { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.hover\:text-gray-600:hover { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)); -} - -.hover\:text-gray-700:hover { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); -} - -.hover\:text-gray-800:hover { - --tw-text-opacity: 1; - color: rgb(31 41 55 / var(--tw-text-opacity)); -} - -.hover\:text-gray-900:hover { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} - -.hover\:text-green-100:hover { - --tw-text-opacity: 1; - color: rgb(220 252 231 / var(--tw-text-opacity)); -} - -.hover\:text-green-200:hover { - --tw-text-opacity: 1; - color: rgb(187 247 208 / var(--tw-text-opacity)); -} - -.hover\:text-green-300:hover { - --tw-text-opacity: 1; - color: rgb(134 239 172 / var(--tw-text-opacity)); -} - -.hover\:text-green-400:hover { - --tw-text-opacity: 1; - color: rgb(74 222 128 / var(--tw-text-opacity)); -} - -.hover\:text-green-50:hover { - --tw-text-opacity: 1; - color: rgb(240 253 244 / var(--tw-text-opacity)); -} - -.hover\:text-green-500:hover { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); -} - -.hover\:text-green-600:hover { - --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity)); -} - -.hover\:text-green-700:hover { - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); -} - -.hover\:text-green-800:hover { - --tw-text-opacity: 1; - color: rgb(22 101 52 / var(--tw-text-opacity)); -} - -.hover\:text-green-900:hover { - --tw-text-opacity: 1; - color: rgb(20 83 45 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-100:hover { - --tw-text-opacity: 1; - color: rgb(224 231 255 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-200:hover { - --tw-text-opacity: 1; - color: rgb(199 210 254 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-300:hover { - --tw-text-opacity: 1; - color: rgb(165 180 252 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-400:hover { - --tw-text-opacity: 1; - color: rgb(129 140 248 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-50:hover { - --tw-text-opacity: 1; - color: rgb(238 242 255 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-500:hover { - --tw-text-opacity: 1; - color: rgb(99 102 241 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-600:hover { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-700:hover { - --tw-text-opacity: 1; - color: rgb(67 56 202 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-800:hover { - --tw-text-opacity: 1; - color: rgb(55 48 163 / var(--tw-text-opacity)); -} - -.hover\:text-indigo-900:hover { - --tw-text-opacity: 1; - color: rgb(49 46 129 / var(--tw-text-opacity)); -} - -.hover\:text-lime-100:hover { - --tw-text-opacity: 1; - color: rgb(236 252 203 / var(--tw-text-opacity)); -} - -.hover\:text-lime-200:hover { - --tw-text-opacity: 1; - color: rgb(217 249 157 / var(--tw-text-opacity)); -} - -.hover\:text-lime-300:hover { - --tw-text-opacity: 1; - color: rgb(190 242 100 / var(--tw-text-opacity)); -} - -.hover\:text-lime-400:hover { - --tw-text-opacity: 1; - color: rgb(163 230 53 / var(--tw-text-opacity)); -} - -.hover\:text-lime-50:hover { - --tw-text-opacity: 1; - color: rgb(247 254 231 / var(--tw-text-opacity)); -} - -.hover\:text-lime-500:hover { - --tw-text-opacity: 1; - color: rgb(132 204 22 / var(--tw-text-opacity)); -} - -.hover\:text-lime-600:hover { - --tw-text-opacity: 1; - color: rgb(101 163 13 / var(--tw-text-opacity)); -} - -.hover\:text-lime-700:hover { - --tw-text-opacity: 1; - color: rgb(77 124 15 / var(--tw-text-opacity)); -} - -.hover\:text-lime-800:hover { - --tw-text-opacity: 1; - color: rgb(63 98 18 / var(--tw-text-opacity)); -} - -.hover\:text-lime-900:hover { - --tw-text-opacity: 1; - color: rgb(54 83 20 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-100:hover { - --tw-text-opacity: 1; - color: rgb(245 245 245 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-200:hover { - --tw-text-opacity: 1; - color: rgb(229 229 229 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-300:hover { - --tw-text-opacity: 1; - color: rgb(212 212 212 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-400:hover { - --tw-text-opacity: 1; - color: rgb(163 163 163 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-50:hover { - --tw-text-opacity: 1; - color: rgb(250 250 250 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-500:hover { - --tw-text-opacity: 1; - color: rgb(115 115 115 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-600:hover { - --tw-text-opacity: 1; - color: rgb(82 82 82 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-700:hover { - --tw-text-opacity: 1; - color: rgb(64 64 64 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-800:hover { - --tw-text-opacity: 1; - color: rgb(38 38 38 / var(--tw-text-opacity)); -} - -.hover\:text-neutral-900:hover { - --tw-text-opacity: 1; - color: rgb(23 23 23 / var(--tw-text-opacity)); -} - -.hover\:text-orange-100:hover { - --tw-text-opacity: 1; - color: rgb(255 237 213 / var(--tw-text-opacity)); -} - -.hover\:text-orange-200:hover { - --tw-text-opacity: 1; - color: rgb(254 215 170 / var(--tw-text-opacity)); -} - -.hover\:text-orange-300:hover { - --tw-text-opacity: 1; - color: rgb(253 186 116 / var(--tw-text-opacity)); -} - -.hover\:text-orange-400:hover { - --tw-text-opacity: 1; - color: rgb(251 146 60 / var(--tw-text-opacity)); -} - -.hover\:text-orange-50:hover { - --tw-text-opacity: 1; - color: rgb(255 247 237 / var(--tw-text-opacity)); -} - -.hover\:text-orange-500:hover { - --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); -} - -.hover\:text-orange-600:hover { - --tw-text-opacity: 1; - color: rgb(234 88 12 / var(--tw-text-opacity)); -} - -.hover\:text-orange-700:hover { - --tw-text-opacity: 1; - color: rgb(194 65 12 / var(--tw-text-opacity)); -} - -.hover\:text-orange-800:hover { - --tw-text-opacity: 1; - color: rgb(154 52 18 / var(--tw-text-opacity)); -} - -.hover\:text-orange-900:hover { - --tw-text-opacity: 1; - color: rgb(124 45 18 / var(--tw-text-opacity)); -} - -.hover\:text-pink-100:hover { - --tw-text-opacity: 1; - color: rgb(252 231 243 / var(--tw-text-opacity)); -} - -.hover\:text-pink-200:hover { - --tw-text-opacity: 1; - color: rgb(251 207 232 / var(--tw-text-opacity)); -} - -.hover\:text-pink-300:hover { - --tw-text-opacity: 1; - color: rgb(249 168 212 / var(--tw-text-opacity)); -} - -.hover\:text-pink-400:hover { - --tw-text-opacity: 1; - color: rgb(244 114 182 / var(--tw-text-opacity)); -} - -.hover\:text-pink-50:hover { - --tw-text-opacity: 1; - color: rgb(253 242 248 / var(--tw-text-opacity)); -} - -.hover\:text-pink-500:hover { - --tw-text-opacity: 1; - color: rgb(236 72 153 / var(--tw-text-opacity)); -} - -.hover\:text-pink-600:hover { - --tw-text-opacity: 1; - color: rgb(219 39 119 / var(--tw-text-opacity)); -} - -.hover\:text-pink-700:hover { - --tw-text-opacity: 1; - color: rgb(190 24 93 / var(--tw-text-opacity)); -} - -.hover\:text-pink-900:hover { - --tw-text-opacity: 1; - color: rgb(131 24 67 / var(--tw-text-opacity)); -} - -.hover\:text-purple-100:hover { - --tw-text-opacity: 1; - color: rgb(243 232 255 / var(--tw-text-opacity)); -} - -.hover\:text-purple-200:hover { - --tw-text-opacity: 1; - color: rgb(233 213 255 / var(--tw-text-opacity)); -} - -.hover\:text-purple-300:hover { - --tw-text-opacity: 1; - color: rgb(216 180 254 / var(--tw-text-opacity)); -} - -.hover\:text-purple-400:hover { - --tw-text-opacity: 1; - color: rgb(192 132 252 / var(--tw-text-opacity)); -} - -.hover\:text-purple-50:hover { - --tw-text-opacity: 1; - color: rgb(250 245 255 / var(--tw-text-opacity)); -} - -.hover\:text-purple-500:hover { - --tw-text-opacity: 1; - color: rgb(168 85 247 / var(--tw-text-opacity)); -} - -.hover\:text-purple-600:hover { - --tw-text-opacity: 1; - color: rgb(147 51 234 / var(--tw-text-opacity)); -} - -.hover\:text-purple-700:hover { - --tw-text-opacity: 1; - color: rgb(126 34 206 / var(--tw-text-opacity)); -} - -.hover\:text-purple-800:hover { - --tw-text-opacity: 1; - color: rgb(107 33 168 / var(--tw-text-opacity)); -} - -.hover\:text-purple-900:hover { - --tw-text-opacity: 1; - color: rgb(88 28 135 / var(--tw-text-opacity)); -} - -.hover\:text-red-100:hover { - --tw-text-opacity: 1; - color: rgb(254 226 226 / var(--tw-text-opacity)); -} - -.hover\:text-red-200:hover { - --tw-text-opacity: 1; - color: rgb(254 202 202 / var(--tw-text-opacity)); -} - -.hover\:text-red-300:hover { - --tw-text-opacity: 1; - color: rgb(252 165 165 / var(--tw-text-opacity)); -} - -.hover\:text-red-400:hover { - --tw-text-opacity: 1; - color: rgb(248 113 113 / var(--tw-text-opacity)); -} - -.hover\:text-red-50:hover { - --tw-text-opacity: 1; - color: rgb(254 242 242 / var(--tw-text-opacity)); -} - -.hover\:text-red-500:hover { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} - -.hover\:text-red-600:hover { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} - -.hover\:text-red-700:hover { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} - -.hover\:text-red-800:hover { - --tw-text-opacity: 1; - color: rgb(153 27 27 / var(--tw-text-opacity)); -} - -.hover\:text-red-900:hover { - --tw-text-opacity: 1; - color: rgb(127 29 29 / var(--tw-text-opacity)); -} - -.hover\:text-rose-100:hover { - --tw-text-opacity: 1; - color: rgb(255 228 230 / var(--tw-text-opacity)); -} - -.hover\:text-rose-200:hover { - --tw-text-opacity: 1; - color: rgb(254 205 211 / var(--tw-text-opacity)); -} - -.hover\:text-rose-300:hover { - --tw-text-opacity: 1; - color: rgb(253 164 175 / var(--tw-text-opacity)); -} - -.hover\:text-rose-400:hover { - --tw-text-opacity: 1; - color: rgb(251 113 133 / var(--tw-text-opacity)); -} - -.hover\:text-rose-50:hover { - --tw-text-opacity: 1; - color: rgb(255 241 242 / var(--tw-text-opacity)); -} - -.hover\:text-rose-500:hover { - --tw-text-opacity: 1; - color: rgb(244 63 94 / var(--tw-text-opacity)); -} - -.hover\:text-rose-600:hover { - --tw-text-opacity: 1; - color: rgb(225 29 72 / var(--tw-text-opacity)); -} - -.hover\:text-rose-700:hover { - --tw-text-opacity: 1; - color: rgb(190 18 60 / var(--tw-text-opacity)); -} - -.hover\:text-rose-800:hover { - --tw-text-opacity: 1; - color: rgb(159 18 57 / var(--tw-text-opacity)); -} - -.hover\:text-rose-900:hover { - --tw-text-opacity: 1; - color: rgb(136 19 55 / var(--tw-text-opacity)); -} - -.hover\:text-sky-100:hover { - --tw-text-opacity: 1; - color: rgb(224 242 254 / var(--tw-text-opacity)); -} - -.hover\:text-sky-200:hover { - --tw-text-opacity: 1; - color: rgb(186 230 253 / var(--tw-text-opacity)); -} - -.hover\:text-sky-300:hover { - --tw-text-opacity: 1; - color: rgb(125 211 252 / var(--tw-text-opacity)); -} - -.hover\:text-sky-400:hover { - --tw-text-opacity: 1; - color: rgb(56 189 248 / var(--tw-text-opacity)); -} - -.hover\:text-sky-50:hover { - --tw-text-opacity: 1; - color: rgb(240 249 255 / var(--tw-text-opacity)); -} - -.hover\:text-sky-500:hover { - --tw-text-opacity: 1; - color: rgb(14 165 233 / var(--tw-text-opacity)); -} - -.hover\:text-sky-600:hover { - --tw-text-opacity: 1; - color: rgb(2 132 199 / var(--tw-text-opacity)); -} - -.hover\:text-sky-700:hover { - --tw-text-opacity: 1; - color: rgb(3 105 161 / var(--tw-text-opacity)); -} - -.hover\:text-sky-800:hover { - --tw-text-opacity: 1; - color: rgb(7 89 133 / var(--tw-text-opacity)); -} - -.hover\:text-sky-900:hover { - --tw-text-opacity: 1; - color: rgb(12 74 110 / var(--tw-text-opacity)); -} - -.hover\:text-slate-100:hover { - --tw-text-opacity: 1; - color: rgb(241 245 249 / var(--tw-text-opacity)); -} - -.hover\:text-slate-200:hover { - --tw-text-opacity: 1; - color: rgb(226 232 240 / var(--tw-text-opacity)); -} - -.hover\:text-slate-300:hover { - --tw-text-opacity: 1; - color: rgb(203 213 225 / var(--tw-text-opacity)); -} - -.hover\:text-slate-400:hover { - --tw-text-opacity: 1; - color: rgb(148 163 184 / var(--tw-text-opacity)); -} - -.hover\:text-slate-50:hover { - --tw-text-opacity: 1; - color: rgb(248 250 252 / var(--tw-text-opacity)); -} - -.hover\:text-slate-500:hover { - --tw-text-opacity: 1; - color: rgb(100 116 139 / var(--tw-text-opacity)); -} - -.hover\:text-slate-600:hover { - --tw-text-opacity: 1; - color: rgb(71 85 105 / var(--tw-text-opacity)); -} - -.hover\:text-slate-700:hover { - --tw-text-opacity: 1; - color: rgb(51 65 85 / var(--tw-text-opacity)); -} - -.hover\:text-slate-800:hover { - --tw-text-opacity: 1; - color: rgb(30 41 59 / var(--tw-text-opacity)); -} - -.hover\:text-slate-900:hover { - --tw-text-opacity: 1; - color: rgb(15 23 42 / var(--tw-text-opacity)); -} - -.hover\:text-stone-100:hover { - --tw-text-opacity: 1; - color: rgb(245 245 244 / var(--tw-text-opacity)); -} - -.hover\:text-stone-200:hover { - --tw-text-opacity: 1; - color: rgb(231 229 228 / var(--tw-text-opacity)); -} - -.hover\:text-stone-300:hover { - --tw-text-opacity: 1; - color: rgb(214 211 209 / var(--tw-text-opacity)); -} - -.hover\:text-stone-400:hover { - --tw-text-opacity: 1; - color: rgb(168 162 158 / var(--tw-text-opacity)); -} - -.hover\:text-stone-50:hover { - --tw-text-opacity: 1; - color: rgb(250 250 249 / var(--tw-text-opacity)); -} - -.hover\:text-stone-500:hover { - --tw-text-opacity: 1; - color: rgb(120 113 108 / var(--tw-text-opacity)); -} - -.hover\:text-stone-600:hover { - --tw-text-opacity: 1; - color: rgb(87 83 78 / var(--tw-text-opacity)); -} - -.hover\:text-stone-700:hover { - --tw-text-opacity: 1; - color: rgb(68 64 60 / var(--tw-text-opacity)); -} - -.hover\:text-stone-800:hover { - --tw-text-opacity: 1; - color: rgb(41 37 36 / var(--tw-text-opacity)); -} - -.hover\:text-stone-900:hover { - --tw-text-opacity: 1; - color: rgb(28 25 23 / var(--tw-text-opacity)); -} - -.hover\:text-teal-100:hover { - --tw-text-opacity: 1; - color: rgb(204 251 241 / var(--tw-text-opacity)); -} - -.hover\:text-teal-200:hover { - --tw-text-opacity: 1; - color: rgb(153 246 228 / var(--tw-text-opacity)); -} - -.hover\:text-teal-300:hover { - --tw-text-opacity: 1; - color: rgb(94 234 212 / var(--tw-text-opacity)); -} - -.hover\:text-teal-400:hover { - --tw-text-opacity: 1; - color: rgb(45 212 191 / var(--tw-text-opacity)); -} - -.hover\:text-teal-50:hover { - --tw-text-opacity: 1; - color: rgb(240 253 250 / var(--tw-text-opacity)); -} - -.hover\:text-teal-500:hover { - --tw-text-opacity: 1; - color: rgb(20 184 166 / var(--tw-text-opacity)); -} - -.hover\:text-teal-600:hover { - --tw-text-opacity: 1; - color: rgb(13 148 136 / var(--tw-text-opacity)); -} - -.hover\:text-teal-700:hover { - --tw-text-opacity: 1; - color: rgb(15 118 110 / var(--tw-text-opacity)); -} - -.hover\:text-teal-800:hover { - --tw-text-opacity: 1; - color: rgb(17 94 89 / var(--tw-text-opacity)); -} - -.hover\:text-teal-900:hover { - --tw-text-opacity: 1; - color: rgb(19 78 74 / var(--tw-text-opacity)); -} - -.hover\:text-transparent:hover { - color: transparent; -} - -.hover\:text-violet-100:hover { - --tw-text-opacity: 1; - color: rgb(237 233 254 / var(--tw-text-opacity)); -} - -.hover\:text-violet-200:hover { - --tw-text-opacity: 1; - color: rgb(221 214 254 / var(--tw-text-opacity)); -} - -.hover\:text-violet-300:hover { - --tw-text-opacity: 1; - color: rgb(196 181 253 / var(--tw-text-opacity)); -} - -.hover\:text-violet-400:hover { - --tw-text-opacity: 1; - color: rgb(167 139 250 / var(--tw-text-opacity)); -} - -.hover\:text-violet-50:hover { - --tw-text-opacity: 1; - color: rgb(245 243 255 / var(--tw-text-opacity)); -} - -.hover\:text-violet-500:hover { - --tw-text-opacity: 1; - color: rgb(139 92 246 / var(--tw-text-opacity)); -} - -.hover\:text-violet-600:hover { - --tw-text-opacity: 1; - color: rgb(124 58 237 / var(--tw-text-opacity)); -} - -.hover\:text-violet-700:hover { - --tw-text-opacity: 1; - color: rgb(109 40 217 / var(--tw-text-opacity)); -} - -.hover\:text-violet-800:hover { - --tw-text-opacity: 1; - color: rgb(91 33 182 / var(--tw-text-opacity)); -} - -.hover\:text-violet-900:hover { - --tw-text-opacity: 1; - color: rgb(76 29 149 / var(--tw-text-opacity)); -} - -.hover\:text-white:hover { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-100:hover { - --tw-text-opacity: 1; - color: rgb(254 249 195 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-200:hover { - --tw-text-opacity: 1; - color: rgb(254 240 138 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-300:hover { - --tw-text-opacity: 1; - color: rgb(253 224 71 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-400:hover { - --tw-text-opacity: 1; - color: rgb(250 204 21 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-50:hover { - --tw-text-opacity: 1; - color: rgb(254 252 232 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-500:hover { - --tw-text-opacity: 1; - color: rgb(234 179 8 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-600:hover { - --tw-text-opacity: 1; - color: rgb(202 138 4 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-700:hover { - --tw-text-opacity: 1; - color: rgb(161 98 7 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-800:hover { - --tw-text-opacity: 1; - color: rgb(133 77 14 / var(--tw-text-opacity)); -} - -.hover\:text-yellow-900:hover { - --tw-text-opacity: 1; - color: rgb(113 63 18 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-100:hover { - --tw-text-opacity: 1; - color: rgb(244 244 245 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-200:hover { - --tw-text-opacity: 1; - color: rgb(228 228 231 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-300:hover { - --tw-text-opacity: 1; - color: rgb(212 212 216 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-400:hover { - --tw-text-opacity: 1; - color: rgb(161 161 170 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-50:hover { - --tw-text-opacity: 1; - color: rgb(250 250 250 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-500:hover { - --tw-text-opacity: 1; - color: rgb(113 113 122 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-600:hover { - --tw-text-opacity: 1; - color: rgb(82 82 91 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-700:hover { - --tw-text-opacity: 1; - color: rgb(63 63 70 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-800:hover { - --tw-text-opacity: 1; - color: rgb(39 39 42 / var(--tw-text-opacity)); -} - -.hover\:text-zinc-900:hover { - --tw-text-opacity: 1; - color: rgb(24 24 27 / var(--tw-text-opacity)); -} - -.hover\:underline:hover { - text-decoration-line: underline; -} - -.hover\:ring-amber-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 243 199 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 211 77 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 251 235 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 119 6 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(180 83 9 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(146 64 14 / var(--tw-ring-opacity)); -} - -.hover\:ring-amber-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(120 53 15 / var(--tw-ring-opacity)); -} - -.hover\:ring-black:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(219 234 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 246 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(29 78 216 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity)); -} - -.hover\:ring-blue-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 58 138 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(207 250 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(165 243 252 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(103 232 249 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(34 211 238 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 254 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 182 212 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(8 145 178 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(14 116 144 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(21 94 117 / var(--tw-ring-opacity)); -} - -.hover\:ring-cyan-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 78 99 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 250 229 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(167 243 208 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(110 231 183 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(52 211 153 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 253 245 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(16 185 129 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(5 150 105 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(4 120 87 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 95 70 / var(--tw-ring-opacity)); -} - -.hover\:ring-emerald-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 78 59 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 232 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 208 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 171 252 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(232 121 249 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 244 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 70 239 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(192 38 211 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(162 28 175 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(134 25 143 / var(--tw-ring-opacity)); -} - -.hover\:ring-fuchsia-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(112 26 117 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 250 251 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity)); -} - -.hover\:ring-gray-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(17 24 39 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(220 252 231 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(187 247 208 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(134 239 172 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(74 222 128 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 253 244 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(21 128 61 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity)); -} - -.hover\:ring-green-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(20 83 45 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(224 231 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(199 210 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(165 180 252 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(129 140 248 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(238 242 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(67 56 202 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(55 48 163 / var(--tw-ring-opacity)); -} - -.hover\:ring-indigo-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(49 46 129 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 252 203 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 249 157 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 242 100 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(163 230 53 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(247 254 231 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(132 204 22 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(101 163 13 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(77 124 15 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(63 98 18 / var(--tw-ring-opacity)); -} - -.hover\:ring-lime-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(54 83 20 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 245 245 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 229 229 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(212 212 212 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(163 163 163 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(115 115 115 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(82 82 82 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(64 64 64 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(38 38 38 / var(--tw-ring-opacity)); -} - -.hover\:ring-neutral-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(23 23 23 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 237 213 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 215 170 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 186 116 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 146 60 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 247 237 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(234 88 12 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(194 65 12 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(154 52 18 / var(--tw-ring-opacity)); -} - -.hover\:ring-orange-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(124 45 18 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 231 243 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 207 232 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 168 212 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 114 182 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 242 248 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 72 153 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(219 39 119 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 24 93 / var(--tw-ring-opacity)); -} - -.hover\:ring-pink-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(131 24 67 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(243 232 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(233 213 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(216 180 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(192 132 252 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 245 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 51 234 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(126 34 206 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 33 168 / var(--tw-ring-opacity)); -} - -.hover\:ring-purple-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(88 28 135 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 226 226 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 242 242 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(220 38 38 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(185 28 28 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity)); -} - -.hover\:ring-red-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(127 29 29 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 228 230 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 205 211 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 164 175 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 113 133 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 241 242 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 63 94 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(225 29 72 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 18 60 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(159 18 57 / var(--tw-ring-opacity)); -} - -.hover\:ring-rose-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(136 19 55 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(224 242 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(186 230 253 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(125 211 252 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(56 189 248 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 249 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(2 132 199 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(3 105 161 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(7 89 133 / var(--tw-ring-opacity)); -} - -.hover\:ring-sky-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(12 74 110 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(241 245 249 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(226 232 240 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(203 213 225 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(148 163 184 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(248 250 252 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(100 116 139 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(71 85 105 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 41 59 / var(--tw-ring-opacity)); -} - -.hover\:ring-slate-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(15 23 42 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 245 244 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(231 229 228 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(214 211 209 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 162 158 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 249 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(120 113 108 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(87 83 78 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(68 64 60 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(41 37 36 / var(--tw-ring-opacity)); -} - -.hover\:ring-stone-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(28 25 23 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(204 251 241 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(153 246 228 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(94 234 212 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(45 212 191 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 253 250 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(13 148 136 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(15 118 110 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(17 94 89 / var(--tw-ring-opacity)); -} - -.hover\:ring-teal-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(19 78 74 / var(--tw-ring-opacity)); -} - -.hover\:ring-transparent:hover { - --tw-ring-color: transparent; -} - -.hover\:ring-violet-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(237 233 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(221 214 254 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(196 181 253 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(167 139 250 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 243 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(139 92 246 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(124 58 237 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(109 40 217 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(91 33 182 / var(--tw-ring-opacity)); -} - -.hover\:ring-violet-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(76 29 149 / var(--tw-ring-opacity)); -} - -.hover\:ring-white:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 249 195 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 240 138 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 224 71 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 204 21 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 252 232 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(234 179 8 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(202 138 4 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(161 98 7 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(133 77 14 / var(--tw-ring-opacity)); -} - -.hover\:ring-yellow-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(113 63 18 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-100:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 244 245 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-200:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(228 228 231 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-300:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(212 212 216 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-400:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(161 161 170 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-50:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(113 113 122 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-600:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(82 82 91 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-700:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(63 63 70 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-800:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(39 39 42 / var(--tw-ring-opacity)); -} - -.hover\:ring-zinc-900:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(24 24 27 / var(--tw-ring-opacity)); -} - -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.focus\:ring-0:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\:ring-amber-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 243 199 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 211 77 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 251 235 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 119 6 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(180 83 9 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(146 64 14 / var(--tw-ring-opacity)); -} - -.focus\:ring-amber-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(120 53 15 / var(--tw-ring-opacity)); -} - -.focus\:ring-black:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(219 234 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 246 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(29 78 216 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 58 138 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(207 250 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(165 243 252 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(103 232 249 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(34 211 238 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 254 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 182 212 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(8 145 178 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(14 116 144 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(21 94 117 / var(--tw-ring-opacity)); -} - -.focus\:ring-cyan-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 78 99 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 250 229 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(167 243 208 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(110 231 183 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(52 211 153 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 253 245 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(16 185 129 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(5 150 105 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(4 120 87 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 95 70 / var(--tw-ring-opacity)); -} - -.focus\:ring-emerald-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(6 78 59 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 232 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 208 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 171 252 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(232 121 249 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 244 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 70 239 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(192 38 211 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(162 28 175 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(134 25 143 / var(--tw-ring-opacity)); -} - -.focus\:ring-fuchsia-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(112 26 117 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 250 251 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity)); -} - -.focus\:ring-gray-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(17 24 39 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(220 252 231 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(187 247 208 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(134 239 172 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(74 222 128 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 253 244 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(21 128 61 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity)); -} - -.focus\:ring-green-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(20 83 45 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(224 231 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(199 210 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(165 180 252 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(129 140 248 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(238 242 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(67 56 202 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(55 48 163 / var(--tw-ring-opacity)); -} - -.focus\:ring-indigo-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(49 46 129 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 252 203 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(217 249 157 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 242 100 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(163 230 53 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(247 254 231 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(132 204 22 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(101 163 13 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(77 124 15 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(63 98 18 / var(--tw-ring-opacity)); -} - -.focus\:ring-lime-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(54 83 20 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 245 245 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 229 229 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(212 212 212 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(163 163 163 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(115 115 115 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(82 82 82 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(64 64 64 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(38 38 38 / var(--tw-ring-opacity)); -} - -.focus\:ring-neutral-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(23 23 23 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 237 213 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 215 170 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 186 116 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 146 60 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 247 237 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(234 88 12 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(194 65 12 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(154 52 18 / var(--tw-ring-opacity)); -} - -.focus\:ring-orange-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(124 45 18 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 231 243 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 207 232 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(249 168 212 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 114 182 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 242 248 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(236 72 153 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(219 39 119 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 24 93 / var(--tw-ring-opacity)); -} - -.focus\:ring-pink-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(131 24 67 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(243 232 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(233 213 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(216 180 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(192 132 252 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 245 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 51 234 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(126 34 206 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 33 168 / var(--tw-ring-opacity)); -} - -.focus\:ring-purple-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(88 28 135 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 226 226 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 242 242 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(220 38 38 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(185 28 28 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity)); -} - -.focus\:ring-red-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(127 29 29 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 228 230 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 205 211 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 164 175 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(251 113 133 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 241 242 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 63 94 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(225 29 72 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(190 18 60 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(159 18 57 / var(--tw-ring-opacity)); -} - -.focus\:ring-rose-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(136 19 55 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(224 242 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(186 230 253 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(125 211 252 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(56 189 248 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 249 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(2 132 199 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(3 105 161 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(7 89 133 / var(--tw-ring-opacity)); -} - -.focus\:ring-sky-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(12 74 110 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(241 245 249 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(226 232 240 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(203 213 225 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(148 163 184 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(248 250 252 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(100 116 139 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(71 85 105 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(30 41 59 / var(--tw-ring-opacity)); -} - -.focus\:ring-slate-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(15 23 42 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 245 244 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(231 229 228 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(214 211 209 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(168 162 158 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 249 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(120 113 108 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(87 83 78 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(68 64 60 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(41 37 36 / var(--tw-ring-opacity)); -} - -.focus\:ring-stone-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(28 25 23 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(204 251 241 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(153 246 228 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(94 234 212 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(45 212 191 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(240 253 250 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(13 148 136 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(15 118 110 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(17 94 89 / var(--tw-ring-opacity)); -} - -.focus\:ring-teal-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(19 78 74 / var(--tw-ring-opacity)); -} - -.focus\:ring-transparent:focus { - --tw-ring-color: transparent; -} - -.focus\:ring-violet-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(237 233 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(221 214 254 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(196 181 253 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(167 139 250 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(245 243 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(139 92 246 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(124 58 237 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(109 40 217 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(91 33 182 / var(--tw-ring-opacity)); -} - -.focus\:ring-violet-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(76 29 149 / var(--tw-ring-opacity)); -} - -.focus\:ring-white:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 249 195 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 240 138 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(253 224 71 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 204 21 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(254 252 232 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(234 179 8 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(202 138 4 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(161 98 7 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(133 77 14 / var(--tw-ring-opacity)); -} - -.focus\:ring-yellow-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(113 63 18 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-100:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(244 244 245 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(228 228 231 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(212 212 216 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-400:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(161 161 170 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-50:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(250 250 250 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(113 113 122 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(82 82 91 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-700:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(63 63 70 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-800:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(39 39 42 / var(--tw-ring-opacity)); -} - -.focus\:ring-zinc-900:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(24 24 27 / var(--tw-ring-opacity)); -} - -.focus\:ring-offset-2:focus { - --tw-ring-offset-width: 2px; -} - -@media (min-width: 640px) { - .sm\:col-span-1 { - grid-column: span 1 / span 1; - } - - .sm\:col-span-10 { - grid-column: span 10 / span 10; - } - - .sm\:col-span-11 { - grid-column: span 11 / span 11; - } - - .sm\:col-span-12 { - grid-column: span 12 / span 12; - } - - .sm\:col-span-2 { - grid-column: span 2 / span 2; - } - - .sm\:col-span-3 { - grid-column: span 3 / span 3; - } - - .sm\:col-span-4 { - grid-column: span 4 / span 4; - } - - .sm\:col-span-5 { - grid-column: span 5 / span 5; - } - - .sm\:col-span-6 { - grid-column: span 6 / span 6; - } - - .sm\:col-span-7 { - grid-column: span 7 / span 7; - } - - .sm\:col-span-8 { - grid-column: span 8 / span 8; - } - - .sm\:col-span-9 { - grid-column: span 9 / span 9; - } - - .sm\:grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); - } - - .sm\:grid-cols-10 { - grid-template-columns: repeat(10, minmax(0, 1fr)); - } - - .sm\:grid-cols-11 { - grid-template-columns: repeat(11, minmax(0, 1fr)); - } - - .sm\:grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); - } - - .sm\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .sm\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .sm\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .sm\:grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); - } - - .sm\:grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); - } - - .sm\:grid-cols-7 { - grid-template-columns: repeat(7, minmax(0, 1fr)); - } - - .sm\:grid-cols-8 { - grid-template-columns: repeat(8, minmax(0, 1fr)); - } - - .sm\:grid-cols-9 { - grid-template-columns: repeat(9, minmax(0, 1fr)); - } - - .sm\:grid-cols-none { - grid-template-columns: none; - } -} - -@media (min-width: 768px) { - .md\:col-span-1 { - grid-column: span 1 / span 1; - } - - .md\:col-span-10 { - grid-column: span 10 / span 10; - } - - .md\:col-span-11 { - grid-column: span 11 / span 11; - } - - .md\:col-span-12 { - grid-column: span 12 / span 12; - } - - .md\:col-span-2 { - grid-column: span 2 / span 2; - } - - .md\:col-span-3 { - grid-column: span 3 / span 3; - } - - .md\:col-span-4 { - grid-column: span 4 / span 4; - } - - .md\:col-span-5 { - grid-column: span 5 / span 5; - } - - .md\:col-span-6 { - grid-column: span 6 / span 6; - } - - .md\:col-span-7 { - grid-column: span 7 / span 7; - } - - .md\:col-span-8 { - grid-column: span 8 / span 8; - } - - .md\:col-span-9 { - grid-column: span 9 / span 9; - } - - .md\:grid { - display: grid; - } - - .md\:w-96 { - width: 24rem; - } - - .md\:grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); - } - - .md\:grid-cols-10 { - grid-template-columns: repeat(10, minmax(0, 1fr)); - } - - .md\:grid-cols-11 { - grid-template-columns: repeat(11, minmax(0, 1fr)); - } - - .md\:grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); - } - - .md\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .md\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .md\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .md\:grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); - } - - .md\:grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); - } - - .md\:grid-cols-7 { - grid-template-columns: repeat(7, minmax(0, 1fr)); - } - - .md\:grid-cols-8 { - grid-template-columns: repeat(8, minmax(0, 1fr)); - } - - .md\:grid-cols-9 { - grid-template-columns: repeat(9, minmax(0, 1fr)); - } - - .md\:grid-cols-none { - grid-template-columns: none; - } - - .md\:gap-4 { - gap: 1rem; - } - - .md\:text-center { - text-align: center; - } -} - -@media (min-width: 1024px) { - .lg\:col-span-1 { - grid-column: span 1 / span 1; - } - - .lg\:col-span-10 { - grid-column: span 10 / span 10; - } - - .lg\:col-span-11 { - grid-column: span 11 / span 11; - } - - .lg\:col-span-12 { - grid-column: span 12 / span 12; - } - - .lg\:col-span-2 { - grid-column: span 2 / span 2; - } - - .lg\:col-span-3 { - grid-column: span 3 / span 3; - } - - .lg\:col-span-4 { - grid-column: span 4 / span 4; - } - - .lg\:col-span-5 { - grid-column: span 5 / span 5; - } - - .lg\:col-span-6 { - grid-column: span 6 / span 6; - } - - .lg\:col-span-7 { - grid-column: span 7 / span 7; - } - - .lg\:col-span-8 { - grid-column: span 8 / span 8; - } - - .lg\:col-span-9 { - grid-column: span 9 / span 9; - } - - .lg\:grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); - } - - .lg\:grid-cols-10 { - grid-template-columns: repeat(10, minmax(0, 1fr)); - } - - .lg\:grid-cols-11 { - grid-template-columns: repeat(11, minmax(0, 1fr)); - } - - .lg\:grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); - } - - .lg\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .lg\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .lg\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .lg\:grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); - } - - .lg\:grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); - } - - .lg\:grid-cols-7 { - grid-template-columns: repeat(7, minmax(0, 1fr)); - } - - .lg\:grid-cols-8 { - grid-template-columns: repeat(8, minmax(0, 1fr)); - } - - .lg\:grid-cols-9 { - grid-template-columns: repeat(9, minmax(0, 1fr)); - } - - .lg\:grid-cols-none { - grid-template-columns: none; - } -} diff --git a/tsconfig.json b/tsconfig.json index 2eb8a96..fd900fd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,6 +23,6 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".old/useChart.ts"], - "exclude": ["node_modules"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules", ".old"] } From cf10b699166635011cfb6a082520ce81faf4ff78 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 9 Sep 2023 11:45:55 -0300 Subject: [PATCH 11/46] feat(sidebar): add hide/show menu --- src/@types/ContextTypes.d.ts | 5 +++++ src/app/layout.tsx | 23 ++++++++++------------- src/components/layout/HeaderMobile.tsx | 12 ++++++++---- src/components/layout/Main.tsx | 26 +++++++++++++++++++++----- src/components/layout/Sidebar.tsx | 12 +++++++++++- src/hooks/useSidebar.ts | 14 ++++++++++++++ src/providers/AppProvider.tsx | 17 +++++++++++++++++ src/providers/SidebarProvider.tsx | 22 ++++++++++++++++++++++ 8 files changed, 108 insertions(+), 23 deletions(-) create mode 100644 src/hooks/useSidebar.ts create mode 100644 src/providers/AppProvider.tsx create mode 100644 src/providers/SidebarProvider.tsx diff --git a/src/@types/ContextTypes.d.ts b/src/@types/ContextTypes.d.ts index b47890c..a3f417d 100644 --- a/src/@types/ContextTypes.d.ts +++ b/src/@types/ContextTypes.d.ts @@ -22,3 +22,8 @@ export interface PortfolioContextType { portfolioId: string tickers: Ticker[] } + +export interface SidebarContextType { + isOpen: boolean + toggleSidebar: () => void +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 74a4520..61b456b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -4,11 +4,10 @@ import { Inter } from 'next/font/google' import { config } from '@/config' import { Sidebar } from '@/components/layout/Sidebar' import { Main } from '@/components/layout/Main' -import { DataProvider } from '@/providers/DataProvider' +import { AppProvider } from '@/providers/AppProvider' import '../styles/output.css' import Loading from './loading' -import { PortfolioProvider } from '@/providers/PortfolioProvider' import { HeaderMobile } from '@/components/layout/HeaderMobile' const inter = Inter({ @@ -27,17 +26,15 @@ export default function RootLayout({ children }: { children: ReactNode }) { suppressHydrationWarning={true} > - - - -
    - -
    - }>{children} -
    -
    -
    -
    + + +
    + +
    + }>{children} +
    +
    +
    ) diff --git a/src/components/layout/HeaderMobile.tsx b/src/components/layout/HeaderMobile.tsx index 2a178e0..66af02d 100644 --- a/src/components/layout/HeaderMobile.tsx +++ b/src/components/layout/HeaderMobile.tsx @@ -1,13 +1,17 @@ 'use client' -import { List } from '@phosphor-icons/react' -import { Logo } from '../common/Logo' + import { Button } from '@tremor/react' +import { Logo } from '../common/Logo' +import { List } from '@phosphor-icons/react' +import { useSidebar } from '@/hooks/useSidebar' export function HeaderMobile() { + const { toggleSidebar } = useSidebar() + return (
    -
    diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index db0649d..253c2c3 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -1,11 +1,27 @@ -import { ReactNode } from 'react' +'use client' -// flex flex-col flex-grow lg:-ml-64 +import { cn } from '@/helpers/utils' +import { useSidebar } from '@/hooks/useSidebar' +import { ReactNode } from 'react' export function Main({ children }: { children: ReactNode }) { + const { isOpen, toggleSidebar } = useSidebar() + return ( -
    -
    {children}
    -
    + <> + {isOpen && ( +
    + )} +
    +
    + {children} +
    +
    + ) } diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index b909de5..3449c47 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -3,10 +3,20 @@ import { Calculator, Question, Wallet } from '@phosphor-icons/react' import { SidebarMenuItem } from './SidebarMenu' import { Logo } from '../common/Logo' +import { useSidebar } from '@/hooks/useSidebar' +import { cn } from '@/helpers/utils' export function Sidebar() { + const { isOpen } = useSidebar() + return ( -
    diff --git a/src/components/common/Card.tsx b/src/components/common/Card.tsx new file mode 100644 index 0000000..15b5b6a --- /dev/null +++ b/src/components/common/Card.tsx @@ -0,0 +1,21 @@ +import { ReactElement, ReactNode } from 'react' +import { Card as CardTremor } from '@tremor/react' +import { Title } from '@/components/common/Title' + +interface Props { + children: ReactNode + subtitle?: string | ReactElement + title: string +} + +export function Card({ title, subtitle, children, ...props }: Props) { + return ( + + + <span>{title}</span> + <span className="text-gray-500 text-sm">{subtitle}</span> + + {children} + + ) +} diff --git a/src/components/pages/home/dividend-history-chart/Card.tsx b/src/components/pages/home/dividend-history-chart/Card.tsx deleted file mode 100644 index 6ef0744..0000000 --- a/src/components/pages/home/dividend-history-chart/Card.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { ReactNode } from 'react' -import { TickersCard } from '../tickers-card' -import { Title } from '@/components/common/Title' -import { Text } from '@tremor/react' - -export function Card({ children }: { children: ReactNode }) { - return ( - - - Histórico de dividendos - <Text>Últimos 12 meses</Text> - - {children} - - ) -} diff --git a/src/components/pages/home/dividend-history-chart/index.tsx b/src/components/pages/home/dividend-history-chart/index.tsx deleted file mode 100644 index 9931b71..0000000 --- a/src/components/pages/home/dividend-history-chart/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -'use client' - -import { usePortfolioFetch } from '@/hooks/usePortfolioFetch' -import { usePortfolios } from '@/hooks/usePortfolios' -import { Card } from './Card' - -export function DividendHistoryCard() { - const { tickers } = usePortfolios() - const { data, error, isLoading } = usePortfolioFetch(tickers) - - if (isLoading || !data) { - return Carregando... - } - - if (error) { - return Erro... - } - - return ok -} diff --git a/src/components/pages/home/form-card/index.tsx b/src/components/pages/home/form-card/index.tsx index 5eb4894..82e9eec 100644 --- a/src/components/pages/home/form-card/index.tsx +++ b/src/components/pages/home/form-card/index.tsx @@ -1,11 +1,11 @@ 'use client' -import { Button, Card } from '@tremor/react' +import { Button } from '@tremor/react' import { useState } from 'react' import { SelectTickers } from './SelectTickers' import { useTickers } from '@/hooks/useTickers' import { portfoliosInitialState } from '@/storage/portfoliosInitialState' -import { Title } from '@/components/common/Title' +import { Card } from '@/components/common/Card' export function FormCard() { const { addTickers } = useTickers() @@ -19,9 +19,7 @@ export function FormCard() { } return ( - - Análise de Fundos Imobiliários - +
    diff --git a/src/components/pages/home/history-chart/index.tsx b/src/components/pages/home/history-chart/index.tsx new file mode 100644 index 0000000..0baa5e3 --- /dev/null +++ b/src/components/pages/home/history-chart/index.tsx @@ -0,0 +1,38 @@ +'use client' + +import { usePortfolioFetch } from '@/hooks/usePortfolioFetch' +import { usePortfolios } from '@/hooks/usePortfolios' +import { Card } from '../../../common/Card' + +interface Props { + report: 'dailyPriceHistory' | 'monthlyPriceHistory' | 'dividendHistory' + subtitle: string + title: string +} + +export function HistoryCard({ title, subtitle }: Props) { + const { tickers } = usePortfolios() + const { data, error, isLoading } = usePortfolioFetch(tickers) + + if (isLoading || !data) { + return ( + + Carregando... + + ) + } + + if (error) { + return ( + + Erro... + + ) + } + + return ( + + ok + + ) +} diff --git a/src/components/pages/home/price-history-card/index.tsx b/src/components/pages/home/price-history-card/index.tsx deleted file mode 100644 index bfcc423..0000000 --- a/src/components/pages/home/price-history-card/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -'use client' - -import { TickersCard } from '../tickers-card' -import { Title } from '@/components/common/Title' - -export function PriceHistoryCard() { - // const { tickers } = usePortfolios() - - return ( - - - <span>Histórico de valorização</span> - <span className="text-gray-500 text-sm">Últimos 20 dias</span> - - - ) -} diff --git a/src/components/pages/home/suggestions-card/index.tsx b/src/components/pages/home/suggestions-card/index.tsx index e33c881..db661d7 100644 --- a/src/components/pages/home/suggestions-card/index.tsx +++ b/src/components/pages/home/suggestions-card/index.tsx @@ -1,12 +1,12 @@ 'use client' -import { Button, Card, ListItem, List } from '@tremor/react' +import { Button, ListItem, List } from '@tremor/react' import { useEffect, useState } from 'react' import { Suggestion } from '@/@types/SuggestionsTypes' import { usePortfolios } from '@/hooks/usePortfolios' import { ArrowsClockwise } from '@phosphor-icons/react' import { useTickers } from '@/hooks/useTickers' -import { Title } from '@/components/common/Title' +import { Card } from '@/components/common/Card' export function SuggestionsCard() { const { addTickers } = useTickers() @@ -17,9 +17,6 @@ export function SuggestionsCard() { setSuggestions(getSuggestions()) } - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(onReload, []) - const addTicker = (ticker: string) => { addTickers([ticker], [portfolioId]) @@ -32,19 +29,21 @@ export function SuggestionsCard() { onReload() } + const ReloadBottom = () => ( + + ) + + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(onReload, []) + return ( - - - Talvez te interesse! - <Button className="" size="xs" onClick={onReload} variant="secondary"> - <ArrowsClockwise /> - </Button> - + }> {suggestions.map((suggestion) => ( {suggestion.ticker} -
    - + ) } diff --git a/src/storage/tickersInitialState.ts b/src/storage/tickersInitialState.ts index 17b9dce..e112b54 100644 --- a/src/storage/tickersInitialState.ts +++ b/src/storage/tickersInitialState.ts @@ -5,6 +5,6 @@ const portfolioId = '5a31ee47-6b2f-4586-8fb9-983010149ec7' export const tickersInitialState: Ticker[] = [ { ...config.defaults.ticker, portfolioId, ticker: 'XPLG11' }, - { ...config.defaults.ticker, portfolioId, ticker: 'VISC11' }, - { ...config.defaults.ticker, portfolioId, ticker: 'SARE11' }, + // { ...config.defaults.ticker, portfolioId, ticker: 'VISC11' }, + // { ...config.defaults.ticker, portfolioId, ticker: 'SARE11' }, ] From c4bee9666546e3325a7f2e2aa012db8885132495 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 13 Sep 2023 23:32:26 -0300 Subject: [PATCH 18/46] add history chats --- package-lock.json | 457 ++++++++++-------- src/@types/TickerServiceTypes.d.ts | 12 +- src/@types/TickersTypes.d.ts | 7 +- src/app/page.tsx | 25 +- src/components/common/Card.tsx | 2 +- .../pages/home/history-chart/Chart.tsx | 47 ++ .../pages/home/history-chart/index.tsx | 59 ++- .../pages/home/suggestions-card/index.tsx | 23 +- .../pages/home/tickers-card/index.tsx | 19 - src/helpers/utils.ts | 33 ++ src/hooks/usePortfolioFetch.ts | 2 +- src/services/TickerService.ts | 117 ++--- src/storage/tickersInitialState.ts | 4 +- 13 files changed, 464 insertions(+), 343 deletions(-) create mode 100644 src/components/pages/home/history-chart/Chart.tsx delete mode 100644 src/components/pages/home/tickers-card/index.tsx diff --git a/package-lock.json b/package-lock.json index 6b88fa3..2f03099 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,9 +65,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -90,9 +90,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -120,9 +120,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -136,9 +136,9 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.2.tgz", + "integrity": "sha512-6ArmenS6qJEWmwzczWyhvrXRdI/rI78poBcW0h/456+onlabit+2G+QxHx5xTOX60NBJQXjsCLFbW2CmsXpUog==", "dependencies": { "@floating-ui/core": "^1.4.1", "@floating-ui/utils": "^0.1.1" @@ -171,9 +171,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", + "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" }, "node_modules/@heroicons/react": { "version": "1.0.6", @@ -184,9 +184,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -540,9 +540,9 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", - "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.7.tgz", + "integrity": "sha512-4/Q0FckQ8TBjsB0VdGFemJOG8BLXUB2KKlL0VmZ+eOYeOnTb/wDRQqYWpBmQ6IlvWkXwkYiot+n9Px2aTJ7zGQ==" }, "node_modules/@types/d3-color": { "version": "3.1.0", @@ -568,17 +568,17 @@ "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" }, "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.4.tgz", + "integrity": "sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-shape": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.2.tgz", + "integrity": "sha512-NN4CXr3qeOUNyK5WasVUV8NCSAx/CRVcwcb0BuuS1PiTqwIm6ABi1SyasLZ/vsVCFDArF+W4QiGzSry1eKYQ7w==", "dependencies": { "@types/d3-path": "*" } @@ -594,9 +594,9 @@ "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" }, "node_modules/@types/jsdom": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.1.tgz", - "integrity": "sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.2.tgz", + "integrity": "sha512-bGj+7TaCkOwkJfx7HtS9p22Ij0A2aKMuz8a1+owpkxa1wU/HUBy/WAXhdv90uDdVI9rSjGvUrXmLSeA9VP3JeA==", "dev": true, "dependencies": { "@types/node": "*", @@ -616,9 +616,9 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/lodash": { - "version": "4.14.197", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", - "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" }, "node_modules/@types/node": { "version": "18.15.11", @@ -654,15 +654,15 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/uuid": { @@ -1026,14 +1026,14 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -1052,15 +1052,15 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -1070,13 +1070,13 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1087,13 +1087,13 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1104,25 +1104,26 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -1201,9 +1202,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", + "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", "engines": { "node": ">=4" } @@ -1345,9 +1346,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001521", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", - "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "funding": [ { "type": "opencollective", @@ -1568,9 +1569,9 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.1.tgz", + "integrity": "sha512-nVraf3aXOpIcNud5pB9M82p1tynmZkrSGQ1p6X/VY8cJ+2LMVqAgXsJxYYefACSHbTYlm92O1xuhdGTjwoEvbQ==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -1856,11 +1857,25 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2006,9 +2021,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.496", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", - "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", + "version": "1.4.520", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz", + "integrity": "sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==", "dev": true }, "node_modules/emoji-regex": { @@ -2092,14 +2107,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", - "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.3", + "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.2.1", @@ -2190,15 +2205,15 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -2891,15 +2906,16 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -2929,16 +2945,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fs-minipass": { @@ -2969,9 +2985,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2988,14 +3004,14 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -3718,21 +3734,21 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dependencies": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jiti": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", - "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -3798,6 +3814,11 @@ } } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3833,6 +3854,14 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -4077,9 +4106,9 @@ } }, "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, "node_modules/nanoid": { "version": "3.3.6", @@ -4179,9 +4208,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4332,26 +4361,26 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -4361,36 +4390,36 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -4557,9 +4586,9 @@ } }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "dev": true, "funding": [ { @@ -4815,9 +4844,9 @@ } }, "node_modules/react-smooth": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz", - "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.4.tgz", + "integrity": "sha512-OkFsrrMBTvQUwEJthE1KXSOj79z57yvEWeFefeXPib+RmQEI9B1Ub1PgzlzzUyBOvl/TjXt5nF2hmD4NsgAh8A==", "dependencies": { "fast-equals": "^5.0.0", "react-transition-group": "2.9.0" @@ -4913,9 +4942,9 @@ } }, "node_modules/recharts": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.7.3.tgz", - "integrity": "sha512-cKoO9jUZRQavn06H6Ih2EcG82zUNdQH3OEGWVCmluSDyp3d7fIpDAsbMTd8hE8+T+MD8P76iicv/J4pJspDP7A==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.8.0.tgz", + "integrity": "sha512-nciXqQDh3aW8abhwUlA4EBOBusRHLNiKHfpRZiG/yjups1x+auHb2zWPuEcTn/IMiN47vVMMuF8Sr+vcQJtsmw==", "dependencies": { "classnames": "^2.2.5", "eventemitter3": "^4.0.1", @@ -4959,14 +4988,14 @@ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, "node_modules/reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -4983,13 +5012,13 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -5116,12 +5145,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -5207,6 +5236,19 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5348,17 +5390,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -5366,13 +5409,13 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -5382,26 +5425,26 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5604,9 +5647,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -6125,9 +6168,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "engines": { "node": ">=10.0.0" }, @@ -6180,9 +6223,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, "engines": { "node": ">= 14" diff --git a/src/@types/TickerServiceTypes.d.ts b/src/@types/TickerServiceTypes.d.ts index 7780af2..a86c1c4 100644 --- a/src/@types/TickerServiceTypes.d.ts +++ b/src/@types/TickerServiceTypes.d.ts @@ -1,4 +1,4 @@ -export interface DividendHistory { +export interface DividendsHistory { amount: number isinCode: string paymentAt: number @@ -9,14 +9,10 @@ export interface ResultsPriceHistory { [key: string]: Record> } -export interface DailyPriceHistory { - date: number +export interface PriceHistory { + timestamp: number + date: string avg: number min: number max: number } - -export interface PriceHistory { - date: number - price: number -} diff --git a/src/@types/TickersTypes.d.ts b/src/@types/TickersTypes.d.ts index 09acbe6..1a34a4e 100644 --- a/src/@types/TickersTypes.d.ts +++ b/src/@types/TickersTypes.d.ts @@ -8,13 +8,12 @@ export interface Ticker { export interface TickerData { ticker: string dy12: number - dividend12: number pvp: number price: number + dividend12: number lastDividend: number - dividendHistory: any[] - dailyPriceHistory: any[] - monthlyPriceHistory: any[] + pricesHistory: any[] + dividendsHistory: any[] } export interface TickerResult extends Ticker { diff --git a/src/app/page.tsx b/src/app/page.tsx index a346672..447f19d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,5 @@ import { FormCard } from '@/components/pages/home/form-card' import { HistoryCard } from '@/components/pages/home/history-chart' -import { StocksCards } from '@/components/pages/home/stocks-cards' import { SuggestionsCard } from '@/components/pages/home/suggestions-card' import { TickersTable } from '@/components/pages/home/tickers-table' @@ -8,27 +7,35 @@ export default function Home() { return ( <>
    -
    +
    -
    +
    diff --git a/src/components/common/Card.tsx b/src/components/common/Card.tsx index 15b5b6a..359440f 100644 --- a/src/components/common/Card.tsx +++ b/src/components/common/Card.tsx @@ -11,7 +11,7 @@ interface Props { export function Card({ title, subtitle, children, ...props }: Props) { return ( - + <Title className="justify-between"> <span>{title}</span> <span className="text-gray-500 text-sm">{subtitle}</span> diff --git a/src/components/pages/home/history-chart/Chart.tsx b/src/components/pages/home/history-chart/Chart.tsx new file mode 100644 index 0000000..fa3a60e --- /dev/null +++ b/src/components/pages/home/history-chart/Chart.tsx @@ -0,0 +1,47 @@ +import { toCurrency } from '@/helpers/currency' +import { AreaChart, LineChart } from '@tremor/react' + +interface Props { + data: any[] + categories: string[] +} + +export function Chart({ data = [], categories = [] }: Props) { + if (!data.length || !categories.length) { + return null + } + + return ( + + ) +} diff --git a/src/components/pages/home/history-chart/index.tsx b/src/components/pages/home/history-chart/index.tsx index 0baa5e3..e6bbfe6 100644 --- a/src/components/pages/home/history-chart/index.tsx +++ b/src/components/pages/home/history-chart/index.tsx @@ -3,18 +3,64 @@ import { usePortfolioFetch } from '@/hooks/usePortfolioFetch' import { usePortfolios } from '@/hooks/usePortfolios' import { Card } from '../../../common/Card' +import { TickerData } from '@/@types/TickersTypes' +import { Chart } from './Chart' +import { + getLastDays, + getLastMonths, + mergeArrayOfObjects, +} from '@/helpers/utils' + +type Report = 'pricesHistory' | 'dividendsHistory' interface Props { - report: 'dailyPriceHistory' | 'monthlyPriceHistory' | 'dividendHistory' + report: Report + metric: string subtitle: string title: string } +const convertData = ( + dateList: string[], + tickers: TickerData[], + report: Report, + metric: string, +) => { + const data = dateList.map((date) => { + const rowData = tickers.map((ticker) => { + const reportData = ticker[report] + const result = reportData.find((history) => { + return history.date === date + }) + + const value = result ? result[metric] : 0 + return { date, [ticker.ticker]: value } + }) + + return mergeArrayOfObjects(rowData) + }) + + return data.reverse() +} -export function HistoryCard({ title, subtitle }: Props) { +const getCategories = (tickers: TickerData[]) => { + return tickers.map((ticker) => { + return ticker.ticker + }) +} + +export function HistoryCard({ report, title, subtitle, metric }: Props) { const { tickers } = usePortfolios() - const { data, error, isLoading } = usePortfolioFetch(tickers) - if (isLoading || !data) { + const dateList = + report === 'dividendsHistory' ? getLastMonths(12) : getLastDays(20) + + const { + error, + isLoading, + data: tickersData, + } = usePortfolioFetch(tickers.filter((t) => !t.isHidden)) + + if (isLoading || !tickersData) { return ( Carregando... @@ -30,9 +76,12 @@ export function HistoryCard({ title, subtitle }: Props) { ) } + const data = convertData(dateList, tickersData, report, metric) + const categories = getCategories(tickersData) + return ( - ok + ) } diff --git a/src/components/pages/home/suggestions-card/index.tsx b/src/components/pages/home/suggestions-card/index.tsx index db661d7..db8d05b 100644 --- a/src/components/pages/home/suggestions-card/index.tsx +++ b/src/components/pages/home/suggestions-card/index.tsx @@ -1,12 +1,12 @@ 'use client' -import { Button, ListItem, List } from '@tremor/react' +import { Button, ListItem, List, Card } from '@tremor/react' import { useEffect, useState } from 'react' import { Suggestion } from '@/@types/SuggestionsTypes' import { usePortfolios } from '@/hooks/usePortfolios' import { ArrowsClockwise } from '@phosphor-icons/react' import { useTickers } from '@/hooks/useTickers' -import { Card } from '@/components/common/Card' +import { Title } from '@/components/common/Title' export function SuggestionsCard() { const { addTickers } = useTickers() @@ -29,17 +29,22 @@ export function SuggestionsCard() { onReload() } - const ReloadBottom = () => ( - - ) - // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(onReload, []) return ( - }> + + + <span>Talvez te interesse</span> + <Button + size="xs" + onClick={onReload} + variant="secondary" + className="text-gray-500 text-sm" + > + <ArrowsClockwise /> + </Button> + {suggestions.map((suggestion) => ( diff --git a/src/components/pages/home/tickers-card/index.tsx b/src/components/pages/home/tickers-card/index.tsx deleted file mode 100644 index 9d63170..0000000 --- a/src/components/pages/home/tickers-card/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -'use client' - -import { ReactNode } from 'react' -import { Card } from '@tremor/react' -import { usePortfolios } from '@/hooks/usePortfolios' - -export function TickersCard({ children }: { children: ReactNode }) { - const { tickers } = usePortfolios() - - if (!tickers.length) { - return ( - -

    Sem ativos nesta carteira

    -
    - ) - } - - return {children} -} diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index d32b0fe..f01b183 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -1,6 +1,39 @@ import { type ClassValue, clsx } from 'clsx' import { twMerge } from 'tailwind-merge' +import moment from 'moment' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } + +export function getLastMonths(count = 12): string[] { + const today = moment() + const months = [] + + for (let i = 0; i < count; i++) { + const currentMonth = today.clone().subtract(i, 'months') + const monthStr = currentMonth.format('MMM/YY') + months.push(monthStr) + } + + return months +} + +export function getLastDays(count = 20): string[] { + const today = moment() + const days = [] + + for (let i = 0; i < count; i++) { + const currentDay = today.clone().subtract(i, 'days') + const dayStr = currentDay.format('DD/MMM') + days.push(dayStr) + } + + return days +} + +export function mergeArrayOfObjects(arr: object[]): object { + return arr.reduce((mergedObj, currentObj) => { + return { ...mergedObj, ...currentObj } + }, {}) +} diff --git a/src/hooks/usePortfolioFetch.ts b/src/hooks/usePortfolioFetch.ts index e954746..0ee95ae 100644 --- a/src/hooks/usePortfolioFetch.ts +++ b/src/hooks/usePortfolioFetch.ts @@ -6,7 +6,7 @@ import { Ticker, TickerData } from '@/@types/TickersTypes' export const usePortfolioFetch = (tickers: Ticker[]) => { const symbols = tickers.map((ticker) => ticker.ticker).join(',') - const data = useSWR(`/api/tickers/${symbols}`, () => { + const data = useSWR(`/api/tickers/${symbols}`, () => { return fetch(`/api/tickers?tickers=${symbols}`).then((res) => res.json()) }) diff --git a/src/services/TickerService.ts b/src/services/TickerService.ts index 10448ce..48eedfc 100644 --- a/src/services/TickerService.ts +++ b/src/services/TickerService.ts @@ -1,12 +1,11 @@ import moment from 'moment' -import { round } from 'lodash' +import { min, max, mean, round, last } from 'lodash' import { config } from '@/config' import { TickerData } from '@/@types/TickersTypes' import { - DividendHistory, + DividendsHistory, ResultsPriceHistory, - DailyPriceHistory, PriceHistory, } from '@/@types/TickerServiceTypes' @@ -51,13 +50,12 @@ export class TickerService { } public async fetch(): Promise { - const { price, pvp } = await this.fetchData(this.ticker) - const { dividendHistory } = await this.fetchDividends(this.ticker) - const { dailyPriceHistory, monthlyPriceHistory } = await this.fetchPrices( - this.ticker, - ) - const { dividend12, dy12, lastDividend } = this.getDividends( - dividendHistory, + const { price, pvp } = await this.fetchTicker(this.ticker) + const pricesHistory = await this.fetchPricesHistory(this.ticker) + const dividendsHistory = await this.fetchDividendsHistory(this.ticker) + + const { dividend12, dy12, lastDividend } = this.getDividendsByHistory( + dividendsHistory, price, ) @@ -67,14 +65,13 @@ export class TickerService { price, dividend12, lastDividend, - dailyPriceHistory, - dividendHistory: [], - monthlyPriceHistory, + dividendsHistory, + pricesHistory, ticker: this.ticker, } } - private async fetchData(symbol: string) { + private async fetchTicker(symbol: string) { const url = this.getURL('finance/stock_price', { symbol }) const response = await fetch(url, this.fetchConfig) @@ -83,12 +80,12 @@ export class TickerService { const result = data.results[symbol] return { - price: Number(result.price), + price: round(Number(result.price), 2), pvp: round(result.financials.price_to_book_ratio, 2), } } - private async fetchDividends(symbol: string) { + private async fetchDividendsHistory(symbol: string) { const url = this.getURL('finance/stock_dividends', { symbol }) const response = await fetch(url, this.fetchConfig) @@ -102,93 +99,57 @@ export class TickerService { ) }) .map((result: any) => { - const paymentAt = new Date( + const timestamp = new Date( result.payment_date + ' 00:00:00 GMT-0300', ).getTime() - const isinCode = result.isin_code - const amount = Number(result.amount) - const monthPaymentAt = moment(paymentAt) - .startOf('month') - .format('YYYY-MM-DD') - - return { - amount, - isinCode, - paymentAt, - monthPaymentAt, - } + + const date = moment(timestamp).format('MMM/YY') + const amount = round(Number(result.amount), 2) + + return { timestamp, amount, date } }) - return { - dividendHistory: dividends.splice(0, 12).reverse(), - } + return dividends.splice(0, 12) } - private async fetchPrices(symbol: string) { + private async fetchPricesHistory(symbol: string) { const url = this.getURL('finance/historical/stocks', { - symbol, days_ago: '20', + symbol, }) const response = await fetch(url, this.fetchConfig) const data = await response.json() - const monthlyPriceHistory = this.getPriceHistory(data.results) - const dailyPriceHistory = this.getDailyPriceHistory(data.results) - - return { - monthlyPriceHistory, - dailyPriceHistory, - } + return this.getPricesHistory(data.results) } - private getPriceHistory(prices: ResultsPriceHistory): PriceHistory[] { + private getPricesHistory(prices: ResultsPriceHistory): PriceHistory[] { const history: PriceHistory[] = [] for (const day in prices) { - const date = new Date(`${day} 00:00:00 GMT-0300`).getTime() - - const priceAverage = Object.values(prices[day][this.ticker]).reduce( - (acc, price) => { - return acc + price - }, - 0, - ) - - history.push({ date, price: round(priceAverage, 2) }) - } - - return history - } - - private getDailyPriceHistory( - prices: ResultsPriceHistory, - ): DailyPriceHistory[] { - const history: DailyPriceHistory[] = [] - - for (const day in prices) { - Object.keys(prices[day][this.ticker]).map((hour) => { - const date = new Date(`${day} ${hour}:00 GMT-0300`).getTime() - const price = prices[day][this.ticker][hour] - - history.push({ - date, - avg: round(price, 2), - max: 0, - min: 0, - }) - - return hour + const pricesDaily = Object.values(prices[day][this.ticker]) + const timestamp = new Date(`${day} 00:00:00 GMT-0300`).getTime() + + history.push({ + timestamp, + avg: round(mean(pricesDaily) || 0, 2), + min: round(min(pricesDaily) || 0, 2), + max: round(max(pricesDaily) || 0, 2), + date: moment(timestamp).format('DD/MMM'), }) } return history } - private getDividends(dividendHistory: DividendHistory[], price: number) { - const lastDividend = dividendHistory[dividendHistory.length - 1].amount + private getDividendsByHistory( + dividendsHistory: DividendsHistory[], + price: number, + ) { + const lastDividend = last(dividendsHistory)?.amount || 0 - const dividend12 = dividendHistory.reduce((acc, dividend) => { + const dividend12 = dividendsHistory.reduce((acc, dividend) => { return acc + dividend.amount }, 0) diff --git a/src/storage/tickersInitialState.ts b/src/storage/tickersInitialState.ts index e112b54..70cdcdb 100644 --- a/src/storage/tickersInitialState.ts +++ b/src/storage/tickersInitialState.ts @@ -5,6 +5,6 @@ const portfolioId = '5a31ee47-6b2f-4586-8fb9-983010149ec7' export const tickersInitialState: Ticker[] = [ { ...config.defaults.ticker, portfolioId, ticker: 'XPLG11' }, - // { ...config.defaults.ticker, portfolioId, ticker: 'VISC11' }, - // { ...config.defaults.ticker, portfolioId, ticker: 'SARE11' }, + { ...config.defaults.ticker, portfolioId, ticker: 'XPML11' }, + { ...config.defaults.ticker, portfolioId, ticker: 'SARE11' }, ] From cceb29b9fbf9bb91153f4b03375c7223897b7044 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sun, 17 Sep 2023 22:35:56 -0300 Subject: [PATCH 19/46] add toastify --- src/actions/tickersActions.ts | 5 +++++ src/app/layout.tsx | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/actions/tickersActions.ts b/src/actions/tickersActions.ts index 57901a4..3dec840 100644 --- a/src/actions/tickersActions.ts +++ b/src/actions/tickersActions.ts @@ -1,12 +1,14 @@ import { Ticker } from '@/@types/TickersTypes' import { uniqWith } from 'lodash' import { config } from '@/config' +import { toast } from 'react-toastify' export const tickersActions = { insert: (state: Ticker[], { tickersList, portfoliosList }: any): Ticker[] => { const newTickers: Ticker[] = [] portfoliosList.forEach((portfolioId: string) => { tickersList.forEach((ticker: string) => { + toast(`${ticker} adicionado com sucesso!`, { type: 'success' }) newTickers.push({ ...config.defaults.ticker, ticker, portfolioId }) }) }) @@ -19,9 +21,12 @@ export const tickersActions = { }, remove: (state: Ticker[], { ticker, portfolioId }: any): Ticker[] => { + toast(`${ticker} removido com sucesso!`, { type: 'success' }) + const tickers = state.filter( (i) => i.ticker !== ticker || i.portfolioId !== portfolioId, ) + return [...tickers] }, diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 61b456b..66cf5eb 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,8 @@ import { ReactNode, Suspense } from 'react' import { Inter } from 'next/font/google' +import { ToastContainer, ToastContainerProps } from 'react-toastify' + +import 'react-toastify/dist/ReactToastify.css' import { config } from '@/config' import { Sidebar } from '@/components/layout/Sidebar' @@ -18,6 +21,19 @@ const inter = Inter({ export const metadata = config.app.metadata +const toastConfig: ToastContainerProps = { + position: 'bottom-right', + autoClose: 3000, + hideProgressBar: false, + newestOnTop: false, + rtl: false, + pauseOnFocusLoss: true, + draggable: true, + closeOnClick: true, + pauseOnHover: true, + theme: 'light', +} + export default function RootLayout({ children }: { children: ReactNode }) { return ( }>{children}
    + From 410f3386b1c84b8737e9ee6fff6108fdc679d115 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sun, 17 Sep 2023 22:37:00 -0300 Subject: [PATCH 20/46] fix remove sab and dom --- src/components/pages/home/history-chart/Chart.tsx | 2 +- src/helpers/utils.ts | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/pages/home/history-chart/Chart.tsx b/src/components/pages/home/history-chart/Chart.tsx index fa3a60e..8a7eb6d 100644 --- a/src/components/pages/home/history-chart/Chart.tsx +++ b/src/components/pages/home/history-chart/Chart.tsx @@ -1,5 +1,5 @@ import { toCurrency } from '@/helpers/currency' -import { AreaChart, LineChart } from '@tremor/react' +import { LineChart } from '@tremor/react' interface Props { data: any[] diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index f01b183..b711b1a 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -23,10 +23,13 @@ export function getLastDays(count = 20): string[] { const today = moment() const days = [] - for (let i = 0; i < count; i++) { + for (let i = 0; days.length < count; i++) { const currentDay = today.clone().subtract(i, 'days') - const dayStr = currentDay.format('DD/MMM') - days.push(dayStr) + + if (currentDay.isoWeekday() !== 6 && currentDay.isoWeekday() !== 7) { + const dayStr = currentDay.format('DD/MMM') + days.push(dayStr) + } } return days From 2770efd17be3202255dccce4314ca41d24b851d2 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 20 Sep 2023 16:49:00 -0300 Subject: [PATCH 21/46] add modal with helper buttom --- src/@types/ContextTypes.d.ts | 9 +++ src/app/layout.tsx | 2 + src/components/common/Modal.tsx | 33 +++++++++++ src/components/common/TooltipHelper.tsx | 22 +++++++ .../pages/home/tickers-table/HeaderCell.tsx | 19 +++++++ .../pages/home/tickers-table/Table.tsx | 57 +++++++++++++++---- src/hooks/useModal.ts | 14 +++++ src/providers/AppProvider.tsx | 15 +++-- src/providers/ModalProvider.tsx | 34 +++++++++++ 9 files changed, 189 insertions(+), 16 deletions(-) create mode 100644 src/components/common/Modal.tsx create mode 100644 src/components/common/TooltipHelper.tsx create mode 100644 src/components/pages/home/tickers-table/HeaderCell.tsx create mode 100644 src/hooks/useModal.ts create mode 100644 src/providers/ModalProvider.tsx diff --git a/src/@types/ContextTypes.d.ts b/src/@types/ContextTypes.d.ts index a3f417d..865f59d 100644 --- a/src/@types/ContextTypes.d.ts +++ b/src/@types/ContextTypes.d.ts @@ -1,5 +1,6 @@ import { Portfolio } from '@/@types/PortfoliosTypes' import { Ticker } from '@/@types/TickersTypes' +import { ReactNode } from 'react' export interface TickerActionType { type: 'INSERT' | 'REMOVE' | 'SET_VISIBILITY' @@ -27,3 +28,11 @@ export interface SidebarContextType { isOpen: boolean toggleSidebar: () => void } + +export interface ModalContextType { + showModal: boolean + title: string | null + content: ReactNode | null + closeModal: () => void + openModal: ({ title: string, content: ReactNode }) => void +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 66cf5eb..4ff2c78 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -12,6 +12,7 @@ import { AppProvider } from '@/providers/AppProvider' import '../styles/output.css' import Loading from './loading' import { HeaderMobile } from '@/components/layout/HeaderMobile' +import Modal from '@/components/common/Modal' const inter = Inter({ weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'], @@ -51,6 +52,7 @@ export default function RootLayout({ children }: { children: ReactNode }) { + diff --git a/src/components/common/Modal.tsx b/src/components/common/Modal.tsx new file mode 100644 index 0000000..af86def --- /dev/null +++ b/src/components/common/Modal.tsx @@ -0,0 +1,33 @@ +'use client' + +import { useModal } from '@/hooks/useModal' +import { Button, Title } from '@tremor/react' + +export default function Modal() { + const { showModal, title, content, closeModal } = useModal() + + return ( + <> + {showModal ? ( + <> +
    +
    +
    +
    + {title} +
    +
    + {content} +
    +
    + +
    +
    +
    +
    +
    + + ) : null} + + ) +} diff --git a/src/components/common/TooltipHelper.tsx b/src/components/common/TooltipHelper.tsx new file mode 100644 index 0000000..910f3d0 --- /dev/null +++ b/src/components/common/TooltipHelper.tsx @@ -0,0 +1,22 @@ +'use client' + +import { ReactNode } from 'react' +import { useModal } from '@/hooks/useModal' +import { Question } from '@phosphor-icons/react' + +type Props = { + title: string + children: ReactNode +} + +export function TooltipHelper({ title, children }: Props) { + const { openModal } = useModal() + + return ( +
    + +
    + ) +} diff --git a/src/components/pages/home/tickers-table/HeaderCell.tsx b/src/components/pages/home/tickers-table/HeaderCell.tsx new file mode 100644 index 0000000..88ae868 --- /dev/null +++ b/src/components/pages/home/tickers-table/HeaderCell.tsx @@ -0,0 +1,19 @@ +import { TooltipHelper } from '@/components/common/TooltipHelper' +import { TableHeaderCell } from '@tremor/react' +import { ReactNode } from 'react' + +type Props = { + title: string + helper?: ReactNode +} + +export function HeaderCell({ title, helper }: Props) { + return ( + +
    + {title} + {helper && {helper}} +
    +
    + ) +} diff --git a/src/components/pages/home/tickers-table/Table.tsx b/src/components/pages/home/tickers-table/Table.tsx index 7a2a257..9fd2153 100644 --- a/src/components/pages/home/tickers-table/Table.tsx +++ b/src/components/pages/home/tickers-table/Table.tsx @@ -4,12 +4,51 @@ import { Table as TremorTable, TableBody, TableHead, - TableHeaderCell, TableRow, + TableHeaderCell, } from '@tremor/react' import { usePortfolios } from '@/hooks/usePortfolios' import { Row } from './Row' +import { HeaderCell } from './HeaderCell' + +const HelperPVP = () => { + return ( + <> +

    Preço sobre o Valor Patrimonial

    +

    + Essa métrica reflete o montante que o mercado está disposto a investir + no patrimônio da empresa. Quando é inferior a 1, sugere que a empresa + está sendo comercializada por um valor inferior ao seu valor patrimonial + real. +

    +

    Cálculo: Preço atual do ativo / Valor patrimonial da ação (VPA)

    + + ) +} + +const HelperDY = () => { + return ( + <> +

    Dividend Yield

    +

    + Mostra o rendimento obtido por uma ação através dos proventos + distribuídos pela empresa nos últimos 12 meses +

    +

    + Cálculo: Rendimentos pagos no período de 12 meses / Preço atual da ação +

    + + ) +} + +const HelperLastDividend = () => { + return

    Último redimento pago

    +} + +const HelperSumDividends = () => { + return

    Soma dos redimentos pagos dos últimos 12 meses

    +} export function Table() { const { tickers } = usePortfolios() @@ -18,15 +57,13 @@ export function Table() { - - Papel - Valor Atual - PV/P - DY - Últ. Rend. - - Rend. Últ. 12M - + + + + } /> + } /> + } /> + } /> diff --git a/src/hooks/useModal.ts b/src/hooks/useModal.ts new file mode 100644 index 0000000..4e91b5f --- /dev/null +++ b/src/hooks/useModal.ts @@ -0,0 +1,14 @@ +import { useContext } from 'react' + +import { ModalContextType } from '@/@types/ContextTypes' +import { ModalContext } from '@/providers/ModalProvider' + +export const useModal = () => { + const context = useContext(ModalContext) as ModalContextType + + if (!context) { + throw new Error('useModal must be used within a ModalProvider') + } + + return context +} diff --git a/src/providers/AppProvider.tsx b/src/providers/AppProvider.tsx index 5fb16b9..c2356e6 100644 --- a/src/providers/AppProvider.tsx +++ b/src/providers/AppProvider.tsx @@ -1,18 +1,21 @@ import { ReactNode } from 'react' +import { SwrProvider } from './SwrProvider' +import { ModalProvider } from './ModalProvider' import { DataProvider } from '@/providers/DataProvider' import { SidebarProvider } from '@/providers/SidebarProvider' import { PortfolioProvider } from '@/providers/PortfolioProvider' -import { SwrProvider } from './SwrProvider' export function AppProvider({ children }: { children: ReactNode }) { return ( - - - {children} - - + + + + {children} + + + ) } diff --git a/src/providers/ModalProvider.tsx b/src/providers/ModalProvider.tsx new file mode 100644 index 0000000..78b1dce --- /dev/null +++ b/src/providers/ModalProvider.tsx @@ -0,0 +1,34 @@ +'use client' + +import { ReactNode, createContext, useState } from 'react' +import { ModalContextType } from '@/@types/ContextTypes' + +export const ModalContext = createContext( + {} as ModalContextType, +) + +export function ModalProvider({ children }: { children: ReactNode }) { + const [showModal, setShowModal] = useState(false) + const [title, setTitle] = useState(null) + const [content, setContent] = useState(null) + + const closeModal: ModalContextType['closeModal'] = () => { + setTitle(null) + setContent(null) + setShowModal(false) + } + + const openModal: ModalContextType['openModal'] = ({ title, content }) => { + setTitle(title) + setContent(content) + setShowModal(true) + } + + return ( + + {children} + + ) +} From 76a4f0cc12b633e8ea2b43fc8f1e5fb834aa4cab Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Mon, 13 Nov 2023 20:16:19 -0300 Subject: [PATCH 22/46] feat: add layout improvements --- src/@types/ContextTypes.d.ts | 13 ++- src/app/layout.tsx | 6 +- src/components/common/Modal.tsx | 18 ++-- src/components/common/Term.tsx | 46 ++++++++++ src/components/common/TooltipHelper.tsx | 27 ++++-- src/components/layout/Sidebar.tsx | 3 +- .../pages/home/tickers-table/HeaderCell.tsx | 2 +- .../pages/home/tickers-table/Helpers.tsx | 88 +++++++++++++++++++ .../pages/home/tickers-table/Row.tsx | 4 +- .../pages/home/tickers-table/Table.tsx | 54 +++--------- src/providers/ModalProvider.tsx | 31 +++++-- 11 files changed, 220 insertions(+), 72 deletions(-) create mode 100644 src/components/common/Term.tsx create mode 100644 src/components/pages/home/tickers-table/Helpers.tsx diff --git a/src/@types/ContextTypes.d.ts b/src/@types/ContextTypes.d.ts index 865f59d..786793d 100644 --- a/src/@types/ContextTypes.d.ts +++ b/src/@types/ContextTypes.d.ts @@ -29,10 +29,17 @@ export interface SidebarContextType { toggleSidebar: () => void } +interface ModalConfig { + title: ReactNode + content: ReactNode + closeBtnTitle?: string +} + export interface ModalContextType { showModal: boolean - title: string | null - content: ReactNode | null + title: ReactNode + content?: ReactNode + closeBtnTitle?: string closeModal: () => void - openModal: ({ title: string, content: ReactNode }) => void + openModal: (config: ModalConfig) => void } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4ff2c78..5b5158b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -13,6 +13,7 @@ import '../styles/output.css' import Loading from './loading' import { HeaderMobile } from '@/components/layout/HeaderMobile' import Modal from '@/components/common/Modal' +import { Term } from '@/components/common/Term' const inter = Inter({ weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'], @@ -42,8 +43,10 @@ export default function RootLayout({ children }: { children: ReactNode }) { className={inter.className} suppressHydrationWarning={true} > - + + +
    @@ -52,7 +55,6 @@ export default function RootLayout({ children }: { children: ReactNode }) {
    -
    diff --git a/src/components/common/Modal.tsx b/src/components/common/Modal.tsx index af86def..86b852a 100644 --- a/src/components/common/Modal.tsx +++ b/src/components/common/Modal.tsx @@ -4,23 +4,23 @@ import { useModal } from '@/hooks/useModal' import { Button, Title } from '@tremor/react' export default function Modal() { - const { showModal, title, content, closeModal } = useModal() + const { showModal, title, content, closeBtnTitle, closeModal } = useModal() return ( <> {showModal ? ( <>
    -
    +
    -
    - {title} +
    +
    + {title} +
    -
    - {content} -
    -
    - +
    {content}
    +
    +
    diff --git a/src/components/common/Term.tsx b/src/components/common/Term.tsx new file mode 100644 index 0000000..beea64b --- /dev/null +++ b/src/components/common/Term.tsx @@ -0,0 +1,46 @@ +'use client' + +import { useModal } from '@/hooks/useModal' +import { useEffect } from 'react' + +const TermContent = () => { + return ( + <> +

    Prezado usuário,

    + +

    + gostaríamos de informar que nosso site utiliza cookies e tecnologias + semelhantes do seu navegador para aprimorar sua experiência de navegação + e fornecer funcionalidades personalizadas. +

    + +

    + Os dados armazenados não contém informações pessoais sensíveis, como + nome, endereço ou alguma outra informação de indentificação. Nosso + compromisso com a privacidade é reforçado pela conformidade com a Lei + Geral de Proteção de Dados (LGPD), que garanta a proteção de suas + informações pessoais. +

    + +

    + Ao continuar navegando em nosso site, você está concordando com o uso + destas tecnologias. +

    + + ) +} + +export function Term() { + const { openModal } = useModal() + + useEffect(() => { + openModal({ + content: , + title: 'Termos de uso', + closeBtnTitle: 'Aceito e continuar navegando', + }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return <> +} diff --git a/src/components/common/TooltipHelper.tsx b/src/components/common/TooltipHelper.tsx index 910f3d0..76f2dbb 100644 --- a/src/components/common/TooltipHelper.tsx +++ b/src/components/common/TooltipHelper.tsx @@ -2,20 +2,35 @@ import { ReactNode } from 'react' import { useModal } from '@/hooks/useModal' -import { Question } from '@phosphor-icons/react' +import { QuestionMarkCircleIcon } from '@heroicons/react/solid' -type Props = { +type HelperTitleProps = { title: string - children: ReactNode } -export function TooltipHelper({ title, children }: Props) { +export function HelperTitle({ title }: HelperTitleProps) { + return ( +
    + {title} + +
    + ) +} + +type TooltipHelperProps = { + title: string + content: ReactNode +} + +export function TooltipHelper({ title, content }: TooltipHelperProps) { const { openModal } = useModal() return (
    -
    ) diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 3449c47..72b38e4 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -12,7 +12,7 @@ export function Sidebar() { return (
    diff --git a/src/components/pages/home/tickers-table/HeaderCell.tsx b/src/components/pages/home/tickers-table/HeaderCell.tsx index 88ae868..f9766fc 100644 --- a/src/components/pages/home/tickers-table/HeaderCell.tsx +++ b/src/components/pages/home/tickers-table/HeaderCell.tsx @@ -12,7 +12,7 @@ export function HeaderCell({ title, helper }: Props) {
    {title} - {helper && {helper}} + {helper && }
    ) diff --git a/src/components/pages/home/tickers-table/Helpers.tsx b/src/components/pages/home/tickers-table/Helpers.tsx new file mode 100644 index 0000000..c6e677c --- /dev/null +++ b/src/components/pages/home/tickers-table/Helpers.tsx @@ -0,0 +1,88 @@ +import { Callout } from '@tremor/react' +import { ReactNode } from 'react' + +import { ExclamationCircleIcon } from '@heroicons/react/solid' + +interface HelperContentProps { + formula?: string + children: ReactNode +} + +export const HelperContent = ({ children, formula }: HelperContentProps) => { + return ( + <> +
    {children}
    + {formula && ( +
    + Cálculo: + {formula} +
    + )} + + ) +} + +export const HelperPVP = () => { + return ( + + Essa métrica reflete o montante que o mercado está disposto a investir no + patrimônio da empresa. Quando é inferior a 1, sugere que a empresa está + sendo comercializada por um valor inferior ao seu valor patrimonial real. + + ) +} + +export const HelperDY = () => { + return ( + + O Dividend Yield é uma métrica financeira que representa a porcentagem do + dividendo distribuídos pela empresa nos últimos 12 meses em relação ao seu + preço de mercado por ação. É usado por investidores para avaliar o retorno + de dividendos potencial de um investimento em ações. Quanto maior o + Dividend Yield, maior o potencial de renda gerada pelos dividendos. + + ) +} + +export const HelperLastDividend = () => { + return ( + + Último redimento pago + + ) +} + +export const HelperSumDividends = () => { + return ( + + Soma dos redimentos pagos dos últimos 12 meses + + ) +} + +export const HelperTicker = () => { + return ( + + Nome do indetificador do ativo da empresa, também conhecido como papel, + symbol, ticker, ticket, etc... + + ) +} + +export const HelperPrice = () => { + return ( + + Valor atual do ativo + + Por favor, esteja ciente de que os preços das ações exibidos podem ter + um atraso de até 15 minutos. Recomendamos consultar fontes financeiras + em tempo real para informações atualizadas. + + + ) +} diff --git a/src/components/pages/home/tickers-table/Row.tsx b/src/components/pages/home/tickers-table/Row.tsx index 6a56d52..d0c1857 100644 --- a/src/components/pages/home/tickers-table/Row.tsx +++ b/src/components/pages/home/tickers-table/Row.tsx @@ -23,7 +23,9 @@ export function Row({ ticker }: Props) { - ... + + Carregando... + ) diff --git a/src/components/pages/home/tickers-table/Table.tsx b/src/components/pages/home/tickers-table/Table.tsx index 9fd2153..c6f319c 100644 --- a/src/components/pages/home/tickers-table/Table.tsx +++ b/src/components/pages/home/tickers-table/Table.tsx @@ -9,46 +9,16 @@ import { } from '@tremor/react' import { usePortfolios } from '@/hooks/usePortfolios' -import { Row } from './Row' import { HeaderCell } from './HeaderCell' - -const HelperPVP = () => { - return ( - <> -

    Preço sobre o Valor Patrimonial

    -

    - Essa métrica reflete o montante que o mercado está disposto a investir - no patrimônio da empresa. Quando é inferior a 1, sugere que a empresa - está sendo comercializada por um valor inferior ao seu valor patrimonial - real. -

    -

    Cálculo: Preço atual do ativo / Valor patrimonial da ação (VPA)

    - - ) -} - -const HelperDY = () => { - return ( - <> -

    Dividend Yield

    -

    - Mostra o rendimento obtido por uma ação através dos proventos - distribuídos pela empresa nos últimos 12 meses -

    -

    - Cálculo: Rendimentos pagos no período de 12 meses / Preço atual da ação -

    - - ) -} - -const HelperLastDividend = () => { - return

    Último redimento pago

    -} - -const HelperSumDividends = () => { - return

    Soma dos redimentos pagos dos últimos 12 meses

    -} +import { Row } from './Row' +import { + HelperDY, + HelperLastDividend, + HelperPVP, + HelperPrice, + HelperSumDividends, + HelperTicker, +} from './Helpers' export function Table() { const { tickers } = usePortfolios() @@ -57,9 +27,9 @@ export function Table() { - - - + + } /> + } /> } /> } /> } /> diff --git a/src/providers/ModalProvider.tsx b/src/providers/ModalProvider.tsx index 78b1dce..2d4bbdb 100644 --- a/src/providers/ModalProvider.tsx +++ b/src/providers/ModalProvider.tsx @@ -9,16 +9,28 @@ export const ModalContext = createContext( export function ModalProvider({ children }: { children: ReactNode }) { const [showModal, setShowModal] = useState(false) - const [title, setTitle] = useState(null) - const [content, setContent] = useState(null) + const [title, setTitle] = useState() + const [content, setContent] = useState() + const [closeBtnTitle, setCloseBtnTitle] = useState() const closeModal: ModalContextType['closeModal'] = () => { - setTitle(null) - setContent(null) + document.body.classList.remove('overflow-hidden') + + setCloseBtnTitle(undefined) + setTitle(undefined) + setContent(undefined) + setShowModal(false) } - const openModal: ModalContextType['openModal'] = ({ title, content }) => { + const openModal: ModalContextType['openModal'] = ({ + title, + content, + closeBtnTitle, + }) => { + document.body.classList.add('overflow-hidden') + + setCloseBtnTitle(closeBtnTitle || 'Fechar') setTitle(title) setContent(content) setShowModal(true) @@ -26,7 +38,14 @@ export function ModalProvider({ children }: { children: ReactNode }) { return ( {children} From a2ab2cd42a7c772dd40c023eb4ec1b1ae338cca9 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Mon, 13 Nov 2023 20:47:55 -0300 Subject: [PATCH 23/46] fix: add throw error from API data --- src/services/TickerService.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/services/TickerService.ts b/src/services/TickerService.ts index 48eedfc..bd9c7b5 100644 --- a/src/services/TickerService.ts +++ b/src/services/TickerService.ts @@ -77,11 +77,14 @@ export class TickerService { const response = await fetch(url, this.fetchConfig) const data = await response.json() - const result = data.results[symbol] + const result = data.results[symbol] || { + financials: { price_to_book_ratio: 0 }, + price: 0, + } return { - price: round(Number(result.price), 2), - pvp: round(result.financials.price_to_book_ratio, 2), + price: round(Number(result.price || 0), 2), + pvp: round(result.financials?.price_to_book_ratio || 0, 2), } } @@ -92,6 +95,12 @@ export class TickerService { const data = await response.json() const dividends = data.results[symbol] + + if (dividends.error) { + throw new Error(dividends.message) + } + + dividends .filter((result: any) => { const tickerCode = `BR${symbol.substring(0, 4)}CTF` return ( From 4942cc8d9a13d2cd07ac399e9e315e72193c2635 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 22 Nov 2023 13:03:43 -0300 Subject: [PATCH 24/46] test: config vitest and mock-server --- .env.example | 1 + docker-compose.yml | 11 + mock-server/config/initializer.json | 718 ++++++ mock-server/config/mockserver.properties | 8 + package-lock.json | 2713 ++++++++++++++++++---- package.json | 8 +- src/config.ts | 4 +- tsconfig.json | 2 +- vitest.config.mjs | 18 + vitest.setup.ts | 6 + 10 files changed, 3020 insertions(+), 469 deletions(-) create mode 100644 docker-compose.yml create mode 100644 mock-server/config/initializer.json create mode 100644 mock-server/config/mockserver.properties create mode 100644 vitest.config.mjs create mode 100644 vitest.setup.ts diff --git a/.env.example b/.env.example index 43be46f..e03a956 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ NEXT_PUBLIC_API_KEY= NEXT_PUBLIC_API_URL=https://api.hgbrasil.com +NEXT_PUBLIC_API_CACHE=force-cache NEXT_PUBLIC_API_REVALIDATE=3600 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3e34b62 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: "3" +services: + mock-server: + image: mockserver/mockserver:5.15.0 + ports: + - 1080:1080 + environment: + MOCKSERVER_PROPERTY_FILE: /config/mockserver.properties + MOCKSERVER_INITIALIZATION_JSON_PATH: /config/initializer.json + volumes: + - "./mock-server/config:/config" \ No newline at end of file diff --git a/mock-server/config/initializer.json b/mock-server/config/initializer.json new file mode 100644 index 0000000..7e406ce --- /dev/null +++ b/mock-server/config/initializer.json @@ -0,0 +1,718 @@ +[ + { + "httpRequest": { + "method": "GET", + "path": "/finance/stock_price", + "queryStringParameters": { + "symbol": ["XPLG11"], + "key": ["abcd123456"], + "format": ["json-cors"] + } + }, + "httpResponse": { + "statusCode": 200, + "headers" : { + "Content-Type" : [ "application/json" ] + }, + "body": { + "by": "symbol", + "valid_key": true, + "results": { + "XPLG11": { + "kind": "fii", + "symbol": "XPLG11", + "name": "XP Log", + "company_name": "Fundo Investimento Imobiliario FII", + "document": "00.000.000/0001-00", + "description": "Financeiro e Outros/Fundos/Fundos Imobiliários", + "website": "https://vortx.com.br/", + "sector": "Imóveis Industriais e Logísticos", + "financials": { + "equity": 3017112409, + "quota_count": 29614675, + "equity_per_share": 101.879, + "price_to_book_ratio": 1.05, + "dividends": { + "yield_12m": 8.505, + "yield_12m_sum": 9.1 + } + }, + "region": "Brazil/Sao Paulo", + "currency": "BRL", + "market_time": { + "open": "10:00", + "close": "17:30", + "timezone": -3 + }, + "logo": null, + "market_cap": 3168.77, + "price": 107.0, + "change_percent": -0.66, + "change_price": -0.71, + "updated_at": "2023-11-21 18:06:00" + } + }, + "execution_time": 0.01, + "from_cache": false + } + } + }, + { + "httpRequest": { + "method": "GET", + "path": "/finance/historical/stocks", + "queryStringParameters": { + "days_ago": ["20"], + "symbol": ["XPLG11"], + "key": ["abcd123456"], + "format": ["json-cors"] + } + }, + "httpResponse": { + "statusCode": 200, + "headers" : { + "Content-Type" : [ "application/json" ] + }, + "body": { + "by": "days_ago", + "mode": "all", + "valid_key": true, + "results": { + "2023-11-21": { + "XPLG11": { + "10:22": 108.06, + "10:39": 108.56, + "11:10": 108.28, + "11:31": 107.99, + "11:51": 107.75, + "12:11": 107.75, + "12:30": 107.8, + "12:50": 107.59, + "13:10": 107.66, + "13:31": 107.75, + "13:51": 107.88, + "14:11": 107.78, + "14:31": 107.75, + "14:50": 107.65, + "14:55": 107.65, + "15:31": 107.78, + "15:51": 107.66, + "16:11": 107.58, + "16:30": 107.78, + "16:51": 107.47, + "17:10": 107.43, + "17:30": 107.24, + "17:51": 107, + "18:06": 107 + } + }, + "2023-11-20": { + "XPLG11": { + "10:10": 108.48, + "10:30": 108.78, + "10:50": 108.45, + "11:11": 108.32, + "11:30": 107.84, + "11:50": 107.79, + "12:11": 107.91, + "12:29": 108.05, + "12:50": 107.95, + "13:10": 107.96, + "13:14": 107.99, + "13:51": 108, + "14:10": 107.97, + "14:31": 107.96, + "14:50": 108.01, + "15:11": 107.91, + "15:30": 107.91, + "15:50": 107.87, + "16:10": 107.58, + "16:31": 107.79, + "16:34": 107.71, + "17:11": 107.8, + "17:31": 107.76, + "17:50": 107.71, + "18:00": 107.71 + } + }, + "2023-11-17": { + "XPLG11": { + "10:10": 108.08, + "10:30": 108.38, + "10:50": 108.99, + "11:10": 108.87, + "11:31": 108.89, + "11:50": 108.84, + "12:10": 108.64, + "12:30": 108.44, + "12:34": 108.38, + "13:10": 108.24, + "13:31": 108.23, + "13:35": 108.24, + "14:11": 108.28, + "14:31": 108.18, + "14:50": 108.28, + "14:55": 108.22, + "15:31": 108.46, + "15:51": 108.33, + "16:10": 108.24, + "16:31": 108.29, + "16:35": 108.26, + "17:10": 108.2, + "17:14": 108.24, + "17:34": 108.21, + "17:54": 108.48, + "18:05": 108.48 + } + }, + "2023-11-16": { + "XPLG11": { + "10:11": 108.19, + "10:31": 108.37, + "10:50": 108.15, + "11:10": 108.14, + "11:30": 108.16, + "11:35": 108.16, + "12:10": 108.14, + "12:31": 108.12, + "12:50": 108.14, + "13:10": 108.11, + "13:14": 108.17, + "13:51": 108.14, + "14:11": 108.17, + "14:50": 108.14, + "15:10": 108.09, + "15:31": 108.1, + "15:50": 108.08, + "16:10": 108.14, + "16:31": 108.15, + "16:51": 108.16, + "17:31": 108.14, + "17:50": 108.13, + "18:06": 108.15 + } + }, + "2023-11-14": { + "XPLG11": { + "10:10": 108.03, + "10:31": 108.18, + "10:51": 108.13, + "11:10": 108.2, + "11:31": 108.25, + "11:50": 108.27, + "12:10": 108.13, + "12:30": 108.08, + "12:51": 108.27, + "13:11": 108.26, + "13:30": 108.09, + "13:51": 108.09, + "14:10": 108.23, + "14:30": 108.21, + "14:51": 108.29, + "15:10": 108.22, + "15:30": 108.24, + "15:50": 108.3, + "16:10": 108.27, + "16:31": 108.24, + "16:50": 108.29, + "17:11": 108.23, + "17:15": 108.18, + "17:51": 108.19, + "18:05": 108 + } + }, + "2023-11-13": { + "XPLG11": { + "10:11": 108.13, + "10:31": 107.9, + "10:51": 107.81, + "11:11": 107.89, + "11:30": 107.83, + "11:51": 107.83, + "12:11": 107.85, + "12:30": 108.02, + "12:50": 108, + "13:10": 108.06, + "13:30": 108.21, + "13:51": 108.17, + "14:10": 108.02, + "14:32": 108.18, + "14:51": 108.07, + "15:11": 108.04, + "15:30": 108.03, + "15:50": 108.05, + "15:54": 108.04, + "16:30": 108.21, + "16:51": 108.23, + "17:10": 108.01, + "17:31": 108.04, + "17:51": 107.89, + "17:54": 107.95, + "18:05": 107.95 + } + }, + "2023-11-10": { + "XPLG11": { + "10:30": 108.99, + "10:51": 108.98, + "11:11": 108.96, + "11:31": 107.7, + "11:51": 107.6, + "12:11": 107.7, + "12:30": 107.81, + "12:51": 107.8, + "13:10": 107.77, + "13:30": 107.69, + "13:50": 107.64, + "14:11": 107.68, + "14:15": 107.67, + "14:50": 107.53, + "15:11": 107.39, + "15:30": 107.15, + "15:51": 107.13, + "16:10": 107.39, + "16:30": 107.55, + "16:51": 107.54, + "17:11": 107.5, + "17:30": 107.64, + "17:50": 107.6, + "18:06": 107.87 + } + }, + "2023-11-09": { + "XPLG11": { + "10:10": 109.25, + "10:14": 109.45, + "10:50": 108.99, + "11:10": 109.01, + "11:30": 109.11, + "11:34": 109.21, + "11:54": 109.11, + "12:30": 109.09, + "12:50": 109.09, + "13:10": 108.95, + "13:31": 109.04, + "13:50": 109, + "14:11": 109.1, + "14:31": 109.1, + "14:50": 109.17, + "14:55": 109.17, + "15:30": 109.16, + "15:51": 108.99, + "16:11": 109.11, + "16:30": 109.18, + "16:34": 109.26, + "17:10": 109.09, + "17:31": 108.82, + "17:51": 108.95, + "18:06": 108.9 + } + }, + "2023-11-08": { + "XPLG11": { + "10:10": 108.99, + "10:30": 109.01, + "10:51": 108.99, + "11:11": 109.03, + "11:14": 109, + "11:51": 109.03, + "12:11": 109.06, + "12:31": 109.04, + "12:35": 109.08, + "13:10": 109.07, + "13:31": 109.07, + "13:51": 109.06, + "14:11": 109.15, + "14:31": 109.12, + "14:50": 109.07, + "15:11": 109.08, + "15:30": 109.08, + "15:51": 109.06, + "16:11": 109.07, + "16:31": 109.07, + "16:50": 109.13, + "17:10": 109.02, + "17:30": 108.93, + "17:51": 108.94, + "18:05": 108.99 + } + }, + "2023-11-07": { + "XPLG11": { + "10:10": 108.38, + "10:30": 108.19, + "10:51": 108.2, + "10:54": 108.09, + "11:31": 108.44, + "11:51": 108.57, + "12:10": 108.82, + "12:14": 108.77, + "12:34": 108.72, + "13:11": 108.47, + "13:30": 108.61, + "13:51": 108.54, + "14:10": 108.42, + "14:30": 108.43, + "14:51": 108.14, + "15:10": 108.28, + "15:31": 108.25, + "15:35": 108.29, + "16:10": 108.37, + "16:15": 108.37, + "16:51": 108.44, + "16:55": 108.45, + "17:31": 108.73, + "17:50": 108.71, + "18:06": 109 + } + }, + "2023-11-06": { + "XPLG11": { + "10:11": 108.45, + "10:30": 108, + "10:50": 108.01, + "11:10": 107.98, + "11:31": 108.04, + "11:50": 108.13, + "12:11": 108.17, + "12:30": 108.2, + "12:51": 108.22, + "13:10": 108.25, + "13:30": 108.12, + "13:51": 108.26, + "13:54": 108.36, + "14:30": 108.42, + "14:51": 108.34, + "15:10": 108.13, + "15:31": 108.26, + "15:50": 108.26, + "16:11": 108.07, + "16:30": 107.99, + "16:51": 107.98, + "17:11": 108.05, + "17:30": 108.1, + "17:50": 108.15, + "18:06": 108.15 + } + }, + "2023-11-03": { + "XPLG11": { + "10:11": 108.2, + "10:31": 108.69, + "10:51": 108.55, + "11:10": 108.46, + "11:31": 108.49, + "11:51": 108.54, + "12:11": 108.55, + "12:30": 108.55, + "12:50": 108.79, + "13:11": 108.52, + "13:30": 108.62, + "13:50": 108.51, + "14:11": 108.6, + "14:31": 108.52, + "14:50": 108.5, + "15:11": 108.49, + "15:30": 108.5, + "15:50": 108.69, + "16:10": 108.59, + "16:31": 108.56, + "16:50": 108.47, + "17:06": 108.45 + } + }, + "2023-11-01": { + "XPLG11": { + "10:11": 108, + "10:30": 108.07, + "10:50": 108.01, + "11:11": 108.08, + "11:30": 107.86, + "11:50": 108.06, + "11:55": 108.05, + "12:30": 107.94, + "12:50": 107.87, + "13:30": 107.98, + "13:51": 107.97, + "14:10": 108.04, + "14:30": 108.07, + "14:51": 107.74, + "15:11": 107.66, + "15:30": 107.78, + "15:50": 107.61, + "16:11": 107.64, + "16:30": 107.99, + "16:51": 108.15, + "17:07": 108.15 + } + }, + "2023-10-31": { + "XPLG11": { + "10:10": 109.17, + "10:14": 109.05, + "10:35": 109.03, + "11:10": 108.92, + "11:31": 108.99, + "11:50": 109, + "12:10": 108.98, + "12:30": 108.99, + "12:50": 108.9, + "12:54": 109, + "13:30": 108.98, + "13:50": 109, + "13:54": 108.98, + "14:30": 108.92, + "14:35": 108.96, + "15:11": 108.9, + "15:30": 108.96, + "15:35": 108.97, + "16:10": 108.9, + "16:15": 109.01, + "16:50": 108.98, + "17:07": 108.95 + } + }, + "2023-10-30": { + "XPLG11": { + "10:11": 107.9, + "10:30": 108.62, + "10:51": 108.58, + "11:30": 108.76, + "11:50": 109.15, + "11:54": 108.98, + "12:15": 108.95, + "12:50": 108.69, + "13:11": 108.5, + "13:31": 108.89, + "13:51": 108.85, + "14:11": 108.83, + "14:30": 108.72, + "14:51": 108.81, + "15:10": 108.8, + "15:30": 108.66, + "15:51": 108.75, + "16:10": 108.76, + "16:15": 108.87, + "16:35": 108.86, + "17:06": 108.51 + } + }, + "2023-10-27": { + "XPLG11": { + "10:15": 107.03, + "10:50": 107.26, + "11:10": 107.2, + "11:17": 107.32, + "11:51": 107.18, + "12:11": 107.17, + "12:30": 107.18, + "12:50": 107.29, + "13:10": 107.3, + "13:30": 107.32, + "13:51": 107.99, + "14:10": 108.09, + "14:30": 107.99, + "14:51": 107.84, + "15:10": 107.7, + "15:31": 107.63, + "15:50": 107.7, + "15:54": 107.7, + "16:30": 107.68, + "16:50": 107.77, + "17:05": 107.51 + } + } + }, + "execution_time": 0.52, + "from_cache": false + } + } + }, + { + "httpRequest": { + "method": "GET", + "path": "/finance/stock_dividends", + "queryStringParameters": { + "symbol": ["XPLG11"], + "key": ["abcd123456"], + "format": ["json-cors"] + } + }, + "httpResponse": { + "statusCode": 200, + "headers" : { + "Content-Type" : [ "application/json" ] + }, + "body": { + "by": "symbol_dividends", + "valid_key": true, + "results": { + "XPLG11": [ + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-10-31", + "traded_until": "2023-10-31", + "payment_date": "2023-11-16" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGR15M19", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-10-31", + "traded_until": "2023-10-31", + "payment_date": "2023-11-16" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGR16M18", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-10-31", + "traded_until": "2023-10-31", + "payment_date": "2023-11-16" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGR17M17", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-10-31", + "traded_until": "2023-10-31", + "payment_date": "2023-11-16" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-09-29", + "traded_until": "2023-09-29", + "payment_date": "2023-10-16" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGR15M19", + "label": "Rendimento", + "amount": 0.31, + "approved_in": "2023-09-29", + "traded_until": "2023-09-29", + "payment_date": "2023-10-16" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-08-31", + "traded_until": "2023-08-31", + "payment_date": "2023-09-15" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.78, + "approved_in": "2023-07-31", + "traded_until": "2023-07-31", + "payment_date": "2023-08-14" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.79, + "approved_in": "2023-06-30", + "traded_until": "2023-06-30", + "payment_date": "2023-07-14" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.75, + "approved_in": "2023-05-31", + "traded_until": "2023-05-31", + "payment_date": "2023-06-15" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.74, + "approved_in": "2023-04-28", + "traded_until": "2023-04-28", + "payment_date": "2023-05-15" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.74, + "approved_in": "2023-03-31", + "traded_until": "2023-03-31", + "payment_date": "2023-04-17" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.74, + "approved_in": "2023-02-28", + "traded_until": "2023-02-28", + "payment_date": "2023-03-14" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.74, + "approved_in": "2023-01-31", + "traded_until": "2023-01-31", + "payment_date": "2023-02-14" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.74, + "approved_in": "2022-12-29", + "traded_until": "2022-12-29", + "payment_date": "2023-01-13" + }, + { + "kind": "cash", + "currency": "brl", + "isin_code": "BRXPLGCTF002", + "label": "Rendimento", + "amount": 0.74, + "approved_in": "2022-11-30", + "traded_until": "2022-11-30", + "payment_date": "2022-12-14" + } + ] + }, + "execution_time": 0.13, + "from_cache": false + } + } + } +] \ No newline at end of file diff --git a/mock-server/config/mockserver.properties b/mock-server/config/mockserver.properties new file mode 100644 index 0000000..84ac39c --- /dev/null +++ b/mock-server/config/mockserver.properties @@ -0,0 +1,8 @@ +############################### +# MockServer & Proxy Settings # +############################### + +# Socket & Port Settings +mockserver.logLevel = INFO +mockserver.serverPort = 1080 +mockserver.maxSocketTimeout=120000 diff --git a/package-lock.json b/package-lock.json index 2f03099..edcc002 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,15 +33,19 @@ "xpath": "^0.0.32" }, "devDependencies": { + "@edge-runtime/vm": "^3.1.7", "@next/eslint-plugin-next": "^13.4.13", "@rocketseat/eslint-config": "^1.2.0", "@types/jsdom": "^21.1.1", + "@vitejs/plugin-react": "^4.2.0", "autoprefixer": "^10.4.14", "concurrently": "^8.2.0", + "dotenv": "^16.3.1", "eslint": "^8.37.0", "postcss": "^8.4.21", "postcss-import": "^15.1.0", - "tailwindcss": "^3.3.1" + "tailwindcss": "^3.3.1", + "vitest": "^0.34.6" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -64,15 +68,924 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/runtime": { + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", + "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@edge-runtime/primitives": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz", + "integrity": "sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/vm": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.7.tgz", + "integrity": "sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g==", + "dev": true, + "dependencies": { + "@edge-runtime/primitives": "4.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.7.tgz", + "integrity": "sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.7.tgz", + "integrity": "sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.7.tgz", + "integrity": "sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.7.tgz", + "integrity": "sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.7.tgz", + "integrity": "sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.7.tgz", + "integrity": "sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.7.tgz", + "integrity": "sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.7.tgz", + "integrity": "sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.7.tgz", + "integrity": "sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.7.tgz", + "integrity": "sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.7.tgz", + "integrity": "sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.7.tgz", + "integrity": "sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.7.tgz", + "integrity": "sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.7.tgz", + "integrity": "sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.7.tgz", + "integrity": "sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.7.tgz", + "integrity": "sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.7.tgz", + "integrity": "sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.7.tgz", + "integrity": "sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.7.tgz", + "integrity": "sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.7.tgz", + "integrity": "sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.7.tgz", + "integrity": "sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.7.tgz", + "integrity": "sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { @@ -90,17 +1003,17 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -120,28 +1033,28 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.2.tgz", - "integrity": "sha512-6ArmenS6qJEWmwzczWyhvrXRdI/rI78poBcW0h/456+onlabit+2G+QxHx5xTOX60NBJQXjsCLFbW2CmsXpUog==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react": { @@ -171,9 +1084,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", - "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@heroicons/react": { "version": "1.0.6", @@ -184,11 +1097,11 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -209,9 +1122,21 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", @@ -252,9 +1177,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -281,22 +1206,22 @@ } }, "node_modules/@next/env": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz", - "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==" + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz", + "integrity": "sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", - "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.6.tgz", + "integrity": "sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg==", "dependencies": { "glob": "7.1.7" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz", - "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz", + "integrity": "sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==", "cpu": [ "arm64" ], @@ -309,9 +1234,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz", - "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", + "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", "cpu": [ "x64" ], @@ -324,9 +1249,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz", - "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", + "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", "cpu": [ "arm64" ], @@ -339,9 +1264,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz", - "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", + "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", "cpu": [ "arm64" ], @@ -354,9 +1279,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz", - "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", + "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", "cpu": [ "x64" ], @@ -369,9 +1294,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz", - "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", + "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", "cpu": [ "x64" ], @@ -384,9 +1309,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz", - "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", + "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", "cpu": [ "arm64" ], @@ -399,9 +1324,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz", - "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", + "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", "cpu": [ "ia32" ], @@ -414,9 +1339,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz", - "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", + "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", "cpu": [ "x64" ], @@ -461,9 +1386,9 @@ } }, "node_modules/@phosphor-icons/react": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.0.10.tgz", - "integrity": "sha512-q5ITPNFhmEiYZLZOvEhjo2phlfxoOmit7vE1tBYMxcMqnZX2vdbMw3deDE7wCegpBKM/q/p39BJmhhoPcjZyCg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.0.14.tgz", + "integrity": "sha512-VaZ7/JEQ7dW+Up23l7t6lqJ3dPJupM03916Pat+ZOLX1vex9OeX9t8RZLJWt0oVrdc/GcrAyRD5FESDeP+M4tQ==", "engines": { "node": ">=10" }, @@ -502,15 +1427,177 @@ } } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.0.tgz", + "integrity": "sha512-OINaBGY+Wc++U0rdr7BLuFClxcoWaVW3vQYqmQq6B3bqQ/2olkaoz+K8+af/Mmka/C2yN5j+L9scBkv4BtKsDA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.0.tgz", + "integrity": "sha512-UdMf1pOQc4ZmUA/NTmKhgJTBimbSKnhPS2zJqucqFyBRFPnPDtwA8MzrGNTjDeQbIAWfpJVAlxejw+/lQyBK/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.0.tgz", + "integrity": "sha512-L0/CA5p/idVKI+c9PcAPGorH6CwXn6+J0Ys7Gg1axCbTPgI8MeMlhA6fLM9fK+ssFhqogMHFC8HDvZuetOii7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.0.tgz", + "integrity": "sha512-QZCbVqU26mNlLn8zi/XDDquNmvcr4ON5FYAHQQsyhrHx8q+sQi/6xduoznYXwk/KmKIXG5dLfR0CvY+NAWpFYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.0.tgz", + "integrity": "sha512-VpSQ+xm93AeV33QbYslgf44wc5eJGYfYitlQzAi3OObu9iwrGXEnmu5S3ilkqE3Pr/FkgOiJKV/2p0ewf4Hrtg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.0.tgz", + "integrity": "sha512-OrEyIfpxSsMal44JpEVx9AEcGpdBQG1ZuWISAanaQTSMeStBW+oHWwOkoqR54bw3x8heP8gBOyoJiGg+fLY8qQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.0.tgz", + "integrity": "sha512-1H7wBbQuE6igQdxMSTjtFfD+DGAudcYWhp106z/9zBA8OQhsJRnemO4XGavdzHpGhRtRxbgmUGdO3YQgrWf2RA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.0.tgz", + "integrity": "sha512-FVyFI13tXw5aE65sZdBpNjPVIi4Q5mARnL/39UIkxvSgRAIqCo5sCpCELk0JtXHGee2owZz5aNLbWNfBHzr71Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.0.tgz", + "integrity": "sha512-eBPYl2sLpH/o8qbSz6vPwWlDyThnQjJfcDOGFbNjmjb44XKC1F5dQfakOsADRVrXCNzM6ZsSIPDG5dc6HHLNFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.0.tgz", + "integrity": "sha512-xaOHIfLOZypoQ5U2I6rEaugS4IYtTgP030xzvrBf5js7p9WI9wik07iHmsKaej8Z83ZDxN5GyypfoyKV5O5TJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.0.tgz", + "integrity": "sha512-Al6quztQUrHwcOoU2TuFblUQ5L+/AmPBXFR6dUvyo4nRj2yQRK0WIUaGMF/uwKulvRcXkpHe3k9A8Vf93VDktA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.0.tgz", + "integrity": "sha512-8kdW+brNhI/NzJ4fxDufuJUjepzINqJKLGHuxyAtpPG9bMbn8P5mtaCcbOm0EzLJ+atg+kF9dwg8jpclkVqx5w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rushstack/eslint-patch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz", - "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", + "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", "dependencies": { "tslib": "^2.4.0" } @@ -539,64 +1626,120 @@ "react-dom": ">=16.6.0" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/chai": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", + "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/d3-array": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.7.tgz", - "integrity": "sha512-4/Q0FckQ8TBjsB0VdGFemJOG8BLXUB2KKlL0VmZ+eOYeOnTb/wDRQqYWpBmQ6IlvWkXwkYiot+n9Px2aTJ7zGQ==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" }, "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" }, "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" }, "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" }, "node_modules/@types/d3-scale": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.4.tgz", - "integrity": "sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-shape": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.2.tgz", - "integrity": "sha512-NN4CXr3qeOUNyK5WasVUV8NCSAx/CRVcwcb0BuuS1PiTqwIm6ABi1SyasLZ/vsVCFDArF+W4QiGzSry1eKYQ7w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" }, "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, "node_modules/@types/jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-bGj+7TaCkOwkJfx7HtS9p22Ij0A2aKMuz8a1+owpkxa1wU/HUBy/WAXhdv90uDdVI9rSjGvUrXmLSeA9VP3JeA==", + "version": "21.1.6", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.6.tgz", + "integrity": "sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==", "dev": true, "dependencies": { "@types/node": "*", @@ -605,9 +1748,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -616,9 +1759,9 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/lodash": { - "version": "4.14.198", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", - "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" }, "node_modules/@types/node": { "version": "18.15.11", @@ -626,9 +1769,9 @@ "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { "version": "18.0.31", @@ -649,20 +1792,20 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.7.tgz", + "integrity": "sha512-8g25Nl3AuB1KulTlSUsUhUo/oBgBU6XIXQ+XURpeioEbEJvkO7qI4vDfREv3vJYHHzqXjcAHvoJy4pTtSQNZtA==" }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, "node_modules/@types/uuid": { @@ -853,6 +1996,125 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz", + "integrity": "sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.4", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", + "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", + "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.6", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", + "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", + "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", + "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -864,9 +2126,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -892,9 +2154,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "engines": { "node": ">=0.4.0" } @@ -1135,10 +2397,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", @@ -1154,9 +2425,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -1174,8 +2445,8 @@ ], "dependencies": { "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -1202,9 +2473,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", - "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "engines": { "node": ">=4" } @@ -1265,9 +2536,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -1284,10 +2555,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1316,13 +2587,23 @@ "node": ">=10.16.0" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1346,9 +2627,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001563", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", + "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", "funding": [ { "type": "opencollective", @@ -1378,6 +2659,24 @@ "node": ">=6" } }, + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1404,6 +2703,18 @@ "node": ">=8" } }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -1487,11 +2798,6 @@ "node": ">=10" } }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -1569,9 +2875,9 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concurrently": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.1.tgz", - "integrity": "sha512-nVraf3aXOpIcNud5pB9M82p1tynmZkrSGQ1p6X/VY8cJ+2LMVqAgXsJxYYefACSHbTYlm92O1xuhdGTjwoEvbQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -1600,6 +2906,12 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1628,11 +2940,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-unit-converter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", - "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" - }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -1852,15 +3159,27 @@ "node": ">=8" } }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -1921,6 +3240,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2020,10 +3348,22 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.520", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz", - "integrity": "sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==", + "version": "1.4.589", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.589.tgz", + "integrity": "sha512-zF6y5v/YfoFIgwf2dDfAqVlPPsyQeWNpEWXbAlDUS8Ax4Z2VoiiZpAPC0Jm9hXEkJm2vIZpwB6rc4KnLTQffbQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2055,25 +3395,25 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -2081,23 +3421,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -2107,13 +3447,13 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -2123,29 +3463,29 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -2164,6 +3504,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.7.tgz", + "integrity": "sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.7", + "@esbuild/android-arm64": "0.19.7", + "@esbuild/android-x64": "0.19.7", + "@esbuild/darwin-arm64": "0.19.7", + "@esbuild/darwin-x64": "0.19.7", + "@esbuild/freebsd-arm64": "0.19.7", + "@esbuild/freebsd-x64": "0.19.7", + "@esbuild/linux-arm": "0.19.7", + "@esbuild/linux-arm64": "0.19.7", + "@esbuild/linux-ia32": "0.19.7", + "@esbuild/linux-loong64": "0.19.7", + "@esbuild/linux-mips64el": "0.19.7", + "@esbuild/linux-ppc64": "0.19.7", + "@esbuild/linux-riscv64": "0.19.7", + "@esbuild/linux-s390x": "0.19.7", + "@esbuild/linux-x64": "0.19.7", + "@esbuild/netbsd-x64": "0.19.7", + "@esbuild/openbsd-x64": "0.19.7", + "@esbuild/sunos-x64": "0.19.7", + "@esbuild/win32-arm64": "0.19.7", + "@esbuild/win32-ia32": "0.19.7", + "@esbuild/win32-x64": "0.19.7" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2205,17 +3582,18 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2258,18 +3636,18 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", - "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.6.tgz", + "integrity": "sha512-o8pQsUHTo9aHqJ2YiZDym5gQAMRf7O2HndHo/JZeY7TDD+W4hk6Ma8Vw54RHiBeb7OWWO5dPirQB+Is/aVQ7Kg==", "dependencies": { - "@next/eslint-plugin-next": "13.4.19", - "@rushstack/eslint-patch": "^1.1.3", + "@next/eslint-plugin-next": "13.5.6", + "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { @@ -2342,9 +3720,9 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", - "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -2433,25 +3811,25 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -2490,26 +3868,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -2518,14 +3896,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-n": { "version": "15.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", @@ -2636,11 +4006,11 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2825,9 +4195,9 @@ } }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2906,22 +4276,22 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/for-each": { "version": "0.3.3", @@ -2945,9 +4315,9 @@ } }, "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" @@ -2999,9 +4369,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -3047,6 +4420,15 @@ "node": ">=10" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3056,15 +4438,24 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3086,9 +4477,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -3132,9 +4523,9 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dependencies": { "type-fest": "^0.20.2" }, @@ -3199,17 +4590,6 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3227,11 +4607,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3278,6 +4658,17 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -3344,9 +4735,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "engines": { "node": ">= 4" } @@ -3389,12 +4780,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -3486,11 +4877,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3746,9 +5137,9 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -3814,6 +5205,18 @@ } } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -3840,6 +5243,12 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -3855,9 +5264,9 @@ } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dependencies": { "json-buffer": "3.0.1" } @@ -3868,11 +5277,14 @@ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/levn": { @@ -3902,6 +5314,18 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3937,6 +5361,15 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3948,6 +5381,18 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4081,6 +5526,18 @@ "node": ">=10" } }, + "node_modules/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -4111,9 +5568,9 @@ "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -4139,35 +5596,34 @@ "dev": true }, "node_modules/next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz", - "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==", + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.6.tgz", + "integrity": "sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==", "dependencies": { - "@next/env": "13.4.19", - "@swc/helpers": "0.5.1", + "@next/env": "13.5.6", + "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", + "postcss": "8.4.31", "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "watchpack": "2.4.0" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=16.14.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.19", - "@next/swc-darwin-x64": "13.4.19", - "@next/swc-linux-arm64-gnu": "13.4.19", - "@next/swc-linux-arm64-musl": "13.4.19", - "@next/swc-linux-x64-gnu": "13.4.19", - "@next/swc-linux-x64-musl": "13.4.19", - "@next/swc-win32-arm64-msvc": "13.4.19", - "@next/swc-win32-ia32-msvc": "13.4.19", - "@next/swc-win32-x64-msvc": "13.4.19" + "@next/swc-darwin-arm64": "13.5.6", + "@next/swc-darwin-x64": "13.5.6", + "@next/swc-linux-arm64-gnu": "13.5.6", + "@next/swc-linux-arm64-musl": "13.5.6", + "@next/swc-linux-x64-gnu": "13.5.6", + "@next/swc-linux-x64-musl": "13.5.6", + "@next/swc-win32-arm64-msvc": "13.5.6", + "@next/swc-win32-ia32-msvc": "13.5.6", + "@next/swc-win32-x64-msvc": "13.5.6" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -4184,29 +5640,6 @@ } } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -4328,9 +5761,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4551,6 +5984,21 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4585,11 +6033,21 @@ "node": ">= 6" } }, - "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -4650,21 +6108,27 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -4678,6 +6142,15 @@ } } }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/postcss-nested": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", @@ -4751,6 +6224,38 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4767,9 +6272,9 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -4831,22 +6336,19 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/react-resize-detector": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", - "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", - "dependencies": { - "lodash": "^4.17.21" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/react-smooth": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.4.tgz", - "integrity": "sha512-OkFsrrMBTvQUwEJthE1KXSOj79z57yvEWeFefeXPib+RmQEI9B1Ub1PgzlzzUyBOvl/TjXt5nF2hmD4NsgAh8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz", + "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==", "dependencies": { "fast-equals": "^5.0.0", "react-transition-group": "2.9.0" @@ -4942,22 +6444,21 @@ } }, "node_modules/recharts": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.8.0.tgz", - "integrity": "sha512-nciXqQDh3aW8abhwUlA4EBOBusRHLNiKHfpRZiG/yjups1x+auHb2zWPuEcTn/IMiN47vVMMuF8Sr+vcQJtsmw==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.1.tgz", + "integrity": "sha512-9bi0jIzxOTfEda+oYqgimKuYfApmBr0zKnAX8r4Iw56k3Saz/IQyBD4zohZL0eyzfz0oGFRH7alpJBgH1eC57g==", "dependencies": { - "classnames": "^2.2.5", + "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.19", "react-is": "^16.10.2", - "react-resize-detector": "^8.0.4", - "react-smooth": "^2.0.2", + "react-smooth": "^2.0.5", "recharts-scale": "^0.4.4", - "reduce-css-calc": "^2.1.8", + "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { "prop-types": "^15.6.0", @@ -4973,20 +6474,14 @@ "decimal.js-light": "^2.4.1" } }, - "node_modules/reduce-css-calc": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", - "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", - "dependencies": { - "css-unit-converter": "^1.1.1", - "postcss-value-parser": "^3.3.0" + "node_modules/recharts/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" } }, - "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", @@ -5054,9 +6549,9 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5108,6 +6603,34 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.5.0.tgz", + "integrity": "sha512-41xsWhzxqjMDASCxH5ibw1mXk+3c4TNI2UjKbLxe6iEzrSQnqOzmmK8/3mufCPbzHNJ2e04Fc1ddI35hHy+8zg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.5.0", + "@rollup/rollup-android-arm64": "4.5.0", + "@rollup/rollup-darwin-arm64": "4.5.0", + "@rollup/rollup-darwin-x64": "4.5.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.5.0", + "@rollup/rollup-linux-arm64-gnu": "4.5.0", + "@rollup/rollup-linux-arm64-musl": "4.5.0", + "@rollup/rollup-linux-x64-gnu": "4.5.0", + "@rollup/rollup-linux-x64-musl": "4.5.0", + "@rollup/rollup-win32-arm64-msvc": "4.5.0", + "@rollup/rollup-win32-ia32-msvc": "4.5.0", + "@rollup/rollup-win32-x64-msvc": "4.5.0", + "fsevents": "~2.3.2" + } + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -5236,6 +6759,20 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -5290,6 +6827,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -5355,6 +6898,18 @@ "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.5.0.tgz", + "integrity": "sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==", + "dev": true + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -5480,6 +7035,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -5571,9 +7138,9 @@ } }, "node_modules/swr": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.2.tgz", - "integrity": "sha512-CbR41AoMD4TQBQw9ic3GTXspgfM9Y8Mdhb5Ob4uIKXhWqnRLItwA5fpGvB7SmSw3+zEjb0PdhiEumtUvYoQ+bQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.4.tgz", + "integrity": "sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ==", "dependencies": { "client-only": "^0.0.1", "use-sync-external-store": "^1.2.0" @@ -5602,9 +7169,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -5612,10 +7179,10 @@ "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.18.2", + "jiti": "^1.19.1", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -5688,6 +7255,44 @@ "node": ">=0.8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", + "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5785,6 +7390,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5869,6 +7483,12 @@ "node": ">=12.20" } }, + "node_modules/ufo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", + "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -5892,9 +7512,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -5969,9 +7589,9 @@ } }, "node_modules/victory-vendor": { - "version": "36.6.11", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz", - "integrity": "sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==", + "version": "36.6.12", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.12.tgz", + "integrity": "sha512-pJrTkNHln+D83vDCCSUf0ZfxBvIaVrFHmrBOsnnLAbdqfudRACAj51He2zU94/IWq9464oTADcPVkmWAfNMwgA==", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -5989,6 +7609,161 @@ "d3-timer": "^3.0.1" } }, + "node_modules/vite": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.2.tgz", + "integrity": "sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.31", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", + "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", + "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.6", + "@vitest/runner": "0.34.6", + "@vitest/snapshot": "0.34.6", + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.6", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -6120,12 +7895,12 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -6137,6 +7912,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -6168,9 +7959,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "engines": { "node": ">=10.0.0" }, @@ -6223,9 +8014,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -6268,14 +8059,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/package.json b/package.json index e01d106..9df28bd 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,8 @@ "dev": "next dev", "css": "tailwindcss --input ./src/styles/globals.css --output ./src/styles/output.css --watch", "build": "tailwindcss ./src/styles/globals.css --output ./src/styles/output.css && next build", + "test:watch": "vitest watch", + "test": "vitest run", "start": "next start", "lint": "next lint" }, @@ -35,14 +37,18 @@ "xpath": "^0.0.32" }, "devDependencies": { + "@edge-runtime/vm": "^3.1.7", "@next/eslint-plugin-next": "^13.4.13", "@rocketseat/eslint-config": "^1.2.0", "@types/jsdom": "^21.1.1", + "@vitejs/plugin-react": "^4.2.0", "autoprefixer": "^10.4.14", "concurrently": "^8.2.0", + "dotenv": "^16.3.1", "eslint": "^8.37.0", "postcss": "^8.4.21", "postcss-import": "^15.1.0", - "tailwindcss": "^3.3.1" + "tailwindcss": "^3.3.1", + "vitest": "^0.34.6" } } diff --git a/src/config.ts b/src/config.ts index 7c607b4..63f0a47 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,8 +10,8 @@ const getConfigAPI = () => { return { key: process.env.NEXT_PUBLIC_API_KEY, url: process.env.NEXT_PUBLIC_API_URL, - cache: 'force-cache' as RequestCache, - revalidate: parseInt(process.env.NEXT_PUBLIC_API_REVALIDATE ?? '900'), + cache: process.env.NEXT_PUBLIC_API_CACHE as RequestCache, + revalidate: parseInt(process.env.NEXT_PUBLIC_API_REVALIDATE || '3600'), } } diff --git a/tsconfig.json b/tsconfig.json index fd900fd..9abbf10 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,6 +23,6 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "vitest.config.mjs"], "exclude": ["node_modules", ".old"] } diff --git a/vitest.config.mjs b/vitest.config.mjs new file mode 100644 index 0000000..35dbade --- /dev/null +++ b/vitest.config.mjs @@ -0,0 +1,18 @@ +// +import { defineConfig } from 'vitest/config' +import react from '@vitejs/plugin-react' +import path from 'path' + +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'edge-runtime', + setupFiles: ['dotenv/config', './vitest.setup.ts'], + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, +}) diff --git a/vitest.setup.ts b/vitest.setup.ts new file mode 100644 index 0000000..04a6f37 --- /dev/null +++ b/vitest.setup.ts @@ -0,0 +1,6 @@ +Object.assign(process.env, { + NEXT_PUBLIC_API_KEY: 'abcd123456', + NEXT_PUBLIC_API_URL: 'http://localhost:1080', + NEXT_PUBLIC_API_REVALIDATE: '60', + NEXT_PUBLIC_API_CACHE: 'no-cache', +}) From 586d6eb728915cc3ddda8c86102250ef08cf990e Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 22 Nov 2023 15:10:34 -0300 Subject: [PATCH 25/46] feat: add unit tests --- src/actions/portfoliosActions.test.ts | 48 +++++++++++ src/actions/tickersActions.test.ts | 68 +++++++++++++++ src/components/common/Title.tsx | 2 +- src/components/layout/Main.tsx | 2 +- src/components/layout/Sidebar.tsx | 4 +- .../pages/home/history-chart/index.tsx | 8 +- .../pages/home/stocks-cards/StockCard.tsx | 2 +- src/config.test.ts | 73 ++++++++++++++++ src/config.ts | 4 +- src/helpers/cn.test.ts | 9 ++ src/helpers/cn.ts | 6 ++ src/helpers/currency.test.ts | 12 +++ src/helpers/fetchStocks.ts | 26 ------ src/helpers/getLastDays.test.ts | 14 +++ src/helpers/getLastDays.ts | 17 ++++ src/helpers/getLastMonths.test.ts | 14 +++ src/helpers/getLastMonths.ts | 14 +++ src/helpers/mergeArrayOfObjects.test.ts | 10 +++ src/helpers/mergeArrayOfObjects.ts | 5 ++ src/helpers/utils.ts | 42 --------- src/services/TickerService.test.ts | 85 +++++++++++++++++++ src/services/TickerService.ts | 51 ++++++----- 22 files changed, 414 insertions(+), 102 deletions(-) create mode 100644 src/actions/portfoliosActions.test.ts create mode 100644 src/actions/tickersActions.test.ts create mode 100644 src/config.test.ts create mode 100644 src/helpers/cn.test.ts create mode 100644 src/helpers/cn.ts create mode 100644 src/helpers/currency.test.ts delete mode 100644 src/helpers/fetchStocks.ts create mode 100644 src/helpers/getLastDays.test.ts create mode 100644 src/helpers/getLastDays.ts create mode 100644 src/helpers/getLastMonths.test.ts create mode 100644 src/helpers/getLastMonths.ts create mode 100644 src/helpers/mergeArrayOfObjects.test.ts create mode 100644 src/helpers/mergeArrayOfObjects.ts delete mode 100644 src/helpers/utils.ts create mode 100644 src/services/TickerService.test.ts diff --git a/src/actions/portfoliosActions.test.ts b/src/actions/portfoliosActions.test.ts new file mode 100644 index 0000000..9ed7300 --- /dev/null +++ b/src/actions/portfoliosActions.test.ts @@ -0,0 +1,48 @@ +import { describe, expect, test } from 'vitest' +import { portfoliosActions } from './portfoliosActions' +import { Portfolio } from '@/@types/PortfoliosTypes' + +describe('portfoliosActions', () => { + const initialState: Portfolio[] = [ + { id: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', name: 'Portfolio 1' }, + { id: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', name: 'Portfolio 2' }, + { id: 'b33c91c4-2661-462c-8cbd-a4501f629351', name: 'Portfolio 3' }, + ] + + test('should update the portfolio with the given payload', () => { + const newState = portfoliosActions.update(initialState, { + id: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', + name: 'Portfolio Edited', + }) + + expect(newState).toEqual([ + { id: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', name: 'Portfolio 1' }, + { id: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', name: 'Portfolio Edited' }, + { id: 'b33c91c4-2661-462c-8cbd-a4501f629351', name: 'Portfolio 3' }, + ]) + }) + + test('should insert a new portfolio into the state', () => { + const newState = portfoliosActions.insert(initialState, { + name: 'Portfolio New', + }) + + expect(newState).toEqual([ + { id: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', name: 'Portfolio 1' }, + { id: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', name: 'Portfolio 2' }, + { id: 'b33c91c4-2661-462c-8cbd-a4501f629351', name: 'Portfolio 3' }, + { id: expect.any(String), name: 'Portfolio New' }, + ]) + }) + + test('should remove the specified portfolio from the state', () => { + const newState = portfoliosActions.remove(initialState, { + id: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', + }) + + expect(newState).toEqual([ + { id: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', name: 'Portfolio 1' }, + { id: 'b33c91c4-2661-462c-8cbd-a4501f629351', name: 'Portfolio 3' }, + ]) + }) +}) diff --git a/src/actions/tickersActions.test.ts b/src/actions/tickersActions.test.ts new file mode 100644 index 0000000..1f1eb8b --- /dev/null +++ b/src/actions/tickersActions.test.ts @@ -0,0 +1,68 @@ +/* eslint-disable prettier/prettier */ +import { describe, expect, test } from 'vitest' +import { Ticker } from '@/@types/TickersTypes' +import { tickersActions } from './tickersActions' + +describe('tickersActions', () => { + const initialState: Ticker[] = [ + { ticker: 'AABB11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + { ticker: 'AABB11', portfolioId: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', isHidden: false, quantity: 1 }, + { ticker: 'AAXX11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + ] + + describe('insert', () => { + test('should insert new tickers into the state', () => { + const tickersList = ['AABB11', 'AAXX11'] + const portfoliosList = [ + 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', + 'bdcfe013-ae51-4f79-b8a1-791f745e9116', + ] + + const newState = tickersActions.insert(initialState, { + tickersList, + portfoliosList, + }) + + expect(newState).toEqual([ + { ticker: 'AABB11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + { ticker: 'AABB11', portfolioId: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', isHidden: false, quantity: 1 }, + { ticker: 'AAXX11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + { ticker: 'AAXX11', portfolioId: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', isHidden: false, quantity: 1 }, + ]) + }) + }) + + describe('remove', () => { + test('should remove the specified ticker from the state', () => { + const ticker = 'AAXX11' + const portfolioId = 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b' + + const newState = tickersActions.remove(initialState, { + ticker, + portfolioId, + }) + + expect(newState).toEqual([ + { ticker: 'AABB11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + { ticker: 'AABB11', portfolioId: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', isHidden: false, quantity: 1 }, + ]) + }) + }) + + describe('update', () => { + test('should update the specified ticker in the state', () => { + const newState = tickersActions.update(initialState, { + ticker: 'AABB11', + portfolioId: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', + isHidden: true, + quantity: 5, + }) + + expect(newState).toEqual([ + { ticker: 'AABB11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + { ticker: 'AABB11', portfolioId: 'bdcfe013-ae51-4f79-b8a1-791f745e9116', isHidden: true, quantity: 5 }, + { ticker: 'AAXX11', portfolioId: 'e5d46968-3a05-46d1-b5ec-a003c2a38a3b', isHidden: false, quantity: 1 }, + ]) + }) + }) +}) diff --git a/src/components/common/Title.tsx b/src/components/common/Title.tsx index 2d41682..cb82f74 100644 --- a/src/components/common/Title.tsx +++ b/src/components/common/Title.tsx @@ -1,6 +1,6 @@ 'use client' -import { cn } from '@/helpers/utils' +import { cn } from '@/helpers/cn' import { TitleProps, Title as TitleTremor } from '@tremor/react' export function Title({ children, ...props }: TitleProps) { diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index 253c2c3..9ca3b3b 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -1,6 +1,6 @@ 'use client' -import { cn } from '@/helpers/utils' +import { cn } from '@/helpers/cn' import { useSidebar } from '@/hooks/useSidebar' import { ReactNode } from 'react' diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 72b38e4..d1ccca3 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -1,10 +1,10 @@ 'use client' -import { Calculator, Question, Wallet } from '@phosphor-icons/react' +import { Calculator, Wallet } from '@phosphor-icons/react' import { SidebarMenuItem } from './SidebarMenu' import { Logo } from '../common/Logo' import { useSidebar } from '@/hooks/useSidebar' -import { cn } from '@/helpers/utils' +import { cn } from '@/helpers/cn' export function Sidebar() { const { isOpen } = useSidebar() diff --git a/src/components/pages/home/history-chart/index.tsx b/src/components/pages/home/history-chart/index.tsx index e6bbfe6..d03767b 100644 --- a/src/components/pages/home/history-chart/index.tsx +++ b/src/components/pages/home/history-chart/index.tsx @@ -5,11 +5,9 @@ import { usePortfolios } from '@/hooks/usePortfolios' import { Card } from '../../../common/Card' import { TickerData } from '@/@types/TickersTypes' import { Chart } from './Chart' -import { - getLastDays, - getLastMonths, - mergeArrayOfObjects, -} from '@/helpers/utils' +import { getLastDays } from '@/helpers/getLastDays' +import { getLastMonths } from '@/helpers/getLastMonths' +import { mergeArrayOfObjects } from '@/helpers/mergeArrayOfObjects' type Report = 'pricesHistory' | 'dividendsHistory' diff --git a/src/components/pages/home/stocks-cards/StockCard.tsx b/src/components/pages/home/stocks-cards/StockCard.tsx index 533ce8f..6d8a60e 100644 --- a/src/components/pages/home/stocks-cards/StockCard.tsx +++ b/src/components/pages/home/stocks-cards/StockCard.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/helpers/utils' +import { cn } from '@/helpers/cn' import { Card, Text, BadgeDelta, Metric, CardProps } from '@tremor/react' interface Props extends CardProps { diff --git a/src/config.test.ts b/src/config.test.ts new file mode 100644 index 0000000..a8fe99d --- /dev/null +++ b/src/config.test.ts @@ -0,0 +1,73 @@ +import { afterEach, beforeEach, describe, expect, test } from 'vitest' +import { getConfigAPI } from './config' + +describe('getConfigAPI', () => { + beforeEach(() => { + process.env.NEXT_PUBLIC_API_KEY = 'test-key' + process.env.NEXT_PUBLIC_API_URL = 'https://api.example.com' + process.env.NEXT_PUBLIC_API_CACHE = 'no-cache' + process.env.NEXT_PUBLIC_API_REVALIDATE = '3600' + }) + + afterEach(() => { + delete process.env.NEXT_PUBLIC_API_KEY + delete process.env.NEXT_PUBLIC_API_URL + delete process.env.NEXT_PUBLIC_API_CACHE + delete process.env.NEXT_PUBLIC_API_REVALIDATE + }) + + test('should return config object with valid environment variables', () => { + const expectedConfig = { + key: 'test-key', + url: 'https://api.example.com', + cache: 'no-cache', + revalidate: 3600, + } + + const config = getConfigAPI() + + expect(config).toEqual(expectedConfig) + }) + + test('should throw an error if NEXT_PUBLIC_API_KEY is not found', () => { + delete process.env.NEXT_PUBLIC_API_KEY + + expect(getConfigAPI).toThrowError('NEXT_PUBLIC_API_KEY not found') + }) + + test('should throw an error if NEXT_PUBLIC_API_URL is not found', () => { + delete process.env.NEXT_PUBLIC_API_URL + + expect(getConfigAPI).toThrowError('NEXT_PUBLIC_API_URL not found') + }) + + test('should return default values if NEXT_PUBLIC_API_CACHE is not found', () => { + delete process.env.NEXT_PUBLIC_API_CACHE + + const expectedConfig = { + key: 'test-key', + url: 'https://api.example.com', + cache: 'force-cache', + revalidate: 3600, + } + + const config = getConfigAPI() + + expect(config).toEqual(expectedConfig) + }) + + test('should return default values if NEXT_PUBLIC_API_REVALIDATE is not found', () => { + delete process.env.NEXT_PUBLIC_API_REVALIDATE + + const expectedConfig = { + key: 'test-key', + url: 'https://api.example.com', + cache: 'no-cache', + revalidate: 3600, + } + + const config = getConfigAPI() + + expect(config).toEqual(expectedConfig) + }) +}) diff --git a/src/config.ts b/src/config.ts index 63f0a47..979f4f3 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,4 @@ -const getConfigAPI = () => { +export const getConfigAPI = () => { if (!process.env.NEXT_PUBLIC_API_KEY) { throw new Error('NEXT_PUBLIC_API_KEY not found') } @@ -10,7 +10,7 @@ const getConfigAPI = () => { return { key: process.env.NEXT_PUBLIC_API_KEY, url: process.env.NEXT_PUBLIC_API_URL, - cache: process.env.NEXT_PUBLIC_API_CACHE as RequestCache, + cache: (process.env.NEXT_PUBLIC_API_CACHE || 'force-cache') as RequestCache, revalidate: parseInt(process.env.NEXT_PUBLIC_API_REVALIDATE || '3600'), } } diff --git a/src/helpers/cn.test.ts b/src/helpers/cn.test.ts new file mode 100644 index 0000000..f8ace2b --- /dev/null +++ b/src/helpers/cn.test.ts @@ -0,0 +1,9 @@ +import { describe, expect, test } from 'vitest' +import { cn } from './cn' + +describe('cn', () => { + test('should return string with merged values', () => { + const result = cn('a', 'b', 'c') + expect(result).toBe('a b c') + }) +}) diff --git a/src/helpers/cn.ts b/src/helpers/cn.ts new file mode 100644 index 0000000..d32b0fe --- /dev/null +++ b/src/helpers/cn.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/src/helpers/currency.test.ts b/src/helpers/currency.test.ts new file mode 100644 index 0000000..1446f2a --- /dev/null +++ b/src/helpers/currency.test.ts @@ -0,0 +1,12 @@ +import { describe, test, expect } from 'vitest' +import { toCurrency } from './currency' + +describe('toCurrency', () => { + test('should return the correct currency format for a given number', () => { + const number = 1234.56 + const expected = 'R$ 1.234,56' + + const result = toCurrency(number) + expect(result).toBe(expected) + }) +}) diff --git a/src/helpers/fetchStocks.ts b/src/helpers/fetchStocks.ts deleted file mode 100644 index a7bcb2b..0000000 --- a/src/helpers/fetchStocks.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { StockResult } from '@/@types/StocksTypes' -import { config } from '@/config' - -export const fetchStocks = async (): Promise => { - const { key, url } = config.api - - const response = await fetch(`${url}/finance?key=${key}&format=json-cors`, { - method: 'GET', - cache: 'force-cache', - next: { - revalidate: 3600, - }, - }) - - if (!response.ok) { - throw new Error('Something went wrong') - } - - const { results } = await response.json() - - if (!results) { - throw new Error('No results found') - } - - return results.stocks as StockResult -} diff --git a/src/helpers/getLastDays.test.ts b/src/helpers/getLastDays.test.ts new file mode 100644 index 0000000..20ad4da --- /dev/null +++ b/src/helpers/getLastDays.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, test } from 'vitest' +import { getLastDays } from './getLastDays' + +describe('getLastDays', () => { + test('should return array with last 20 days', () => { + const days = getLastDays() + expect(days.length).toBe(20) + }) + + test('should return array with custom days', () => { + const days = getLastDays(10) + expect(days.length).toBe(10) + }) +}) diff --git a/src/helpers/getLastDays.ts b/src/helpers/getLastDays.ts new file mode 100644 index 0000000..d960149 --- /dev/null +++ b/src/helpers/getLastDays.ts @@ -0,0 +1,17 @@ +import moment from 'moment' + +export function getLastDays(count = 20): string[] { + const today = moment() + const days = [] + + for (let i = 0; days.length < count; i++) { + const currentDay = today.clone().subtract(i, 'days') + + if (currentDay.isoWeekday() !== 6 && currentDay.isoWeekday() !== 7) { + const dayStr = currentDay.format('DD/MMM') + days.push(dayStr) + } + } + + return days +} diff --git a/src/helpers/getLastMonths.test.ts b/src/helpers/getLastMonths.test.ts new file mode 100644 index 0000000..e9f02a8 --- /dev/null +++ b/src/helpers/getLastMonths.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, test } from 'vitest' +import { getLastMonths } from './getLastMonths' + +describe('getLastMonths', () => { + test('should return array with last 12 months', () => { + const months = getLastMonths() + expect(months.length).toBe(12) + }) + + test('should return array with custom months', () => { + const months = getLastMonths(10) + expect(months.length).toBe(10) + }) +}) diff --git a/src/helpers/getLastMonths.ts b/src/helpers/getLastMonths.ts new file mode 100644 index 0000000..8cd85af --- /dev/null +++ b/src/helpers/getLastMonths.ts @@ -0,0 +1,14 @@ +import moment from 'moment' + +export function getLastMonths(count = 12): string[] { + const today = moment() + const months = [] + + for (let i = 0; i < count; i++) { + const currentMonth = today.clone().subtract(i, 'months') + const monthStr = currentMonth.format('MMM/YY') + months.push(monthStr) + } + + return months +} diff --git a/src/helpers/mergeArrayOfObjects.test.ts b/src/helpers/mergeArrayOfObjects.test.ts new file mode 100644 index 0000000..7218c91 --- /dev/null +++ b/src/helpers/mergeArrayOfObjects.test.ts @@ -0,0 +1,10 @@ +import { describe, expect, test } from 'vitest' +import { mergeArrayOfObjects } from './mergeArrayOfObjects' + +describe('mergeArrayOfObjects', () => { + test('should return object with merged values', () => { + const arr = [{ a: 1 }, { b: 2 }, { c: 3 }, { a: 4 }] + const result = mergeArrayOfObjects(arr) + expect(result).toEqual({ a: 4, b: 2, c: 3 }) + }) +}) diff --git a/src/helpers/mergeArrayOfObjects.ts b/src/helpers/mergeArrayOfObjects.ts new file mode 100644 index 0000000..5caf9ba --- /dev/null +++ b/src/helpers/mergeArrayOfObjects.ts @@ -0,0 +1,5 @@ +export function mergeArrayOfObjects(arr: object[]): object { + return arr.reduce((mergedObj, currentObj) => { + return { ...mergedObj, ...currentObj } + }, {}) +} diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts deleted file mode 100644 index b711b1a..0000000 --- a/src/helpers/utils.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { type ClassValue, clsx } from 'clsx' -import { twMerge } from 'tailwind-merge' -import moment from 'moment' - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} - -export function getLastMonths(count = 12): string[] { - const today = moment() - const months = [] - - for (let i = 0; i < count; i++) { - const currentMonth = today.clone().subtract(i, 'months') - const monthStr = currentMonth.format('MMM/YY') - months.push(monthStr) - } - - return months -} - -export function getLastDays(count = 20): string[] { - const today = moment() - const days = [] - - for (let i = 0; days.length < count; i++) { - const currentDay = today.clone().subtract(i, 'days') - - if (currentDay.isoWeekday() !== 6 && currentDay.isoWeekday() !== 7) { - const dayStr = currentDay.format('DD/MMM') - days.push(dayStr) - } - } - - return days -} - -export function mergeArrayOfObjects(arr: object[]): object { - return arr.reduce((mergedObj, currentObj) => { - return { ...mergedObj, ...currentObj } - }, {}) -} diff --git a/src/services/TickerService.test.ts b/src/services/TickerService.test.ts new file mode 100644 index 0000000..d1bf2d1 --- /dev/null +++ b/src/services/TickerService.test.ts @@ -0,0 +1,85 @@ +import { describe, expect, test } from 'vitest' +import { TickerService } from './TickerService' + +const ticker = 'XPLG11' + +describe('TickerService', () => { + test('should return result with success', async () => { + const service = new TickerService(ticker) + const result = await service.fetch() + + expect(result).toBeDefined() + expect(result.ticker).toBe(ticker) + expect(result.pvp).toBe(1.05) + expect(result.dy12).toBe(8.21) + expect(result.price).toBe(107) + expect(result.dividend12).toBe(8.79) + expect(result.lastDividend).toBe(0.74) + expect(result.dividendsHistory.length).toBe(12) + expect(result.pricesHistory.length).toBeTruthy() + }) + + test('should return error when ticker is invalid', async () => { + await expect(async () => { + return new TickerService('invalid').fetch() + }).rejects.toThrowError('Ocorreu um erro ao buscar o ticker') + }) + + test('should return error when ticker is empty', async () => { + await expect(async () => { + return new TickerService('').fetch() + }).rejects.toThrowError('Ocorreu um erro ao buscar o ticker') + }) + + test('should return error when ticker is null', async () => { + await expect(async () => { + return new TickerService(null as any).fetch() + }).rejects.toThrowError('Ocorreu um erro ao buscar o ticker') + }) + + test('should return dividendsHistory with array of object', async () => { + const service = new TickerService(ticker) + const result = await service.fetch() + + expect(result).toBeDefined() + expect(result.dividendsHistory.length).toBe(12) + + expect(result.dividendsHistory[0]).toEqual({ + kind: 'cash', + currency: 'brl', + isin_code: 'BRXPLGCTF002', + label: 'Rendimento', + amount: 0.78, + approved_in: '2023-10-31', + traded_until: '2023-10-31', + payment_date: '2023-11-16', + }) + + expect(result.dividendsHistory[11]).toEqual({ + kind: 'cash', + currency: 'brl', + isin_code: 'BRXPLGCTF002', + label: 'Rendimento', + amount: 0.74, + approved_in: '2023-03-31', + traded_until: '2023-03-31', + payment_date: '2023-04-17', + }) + }) + + test('should return pricesHistory with array of object', async () => { + const service = new TickerService(ticker) + const result = await service.fetch() + + expect(result).toBeDefined() + expect(result.pricesHistory.length).toBeTruthy() + + expect(result.pricesHistory[0]).toEqual({ + timestamp: 1700535600000, + avg: 107.7, + min: 107, + max: 108.56, + date: '21/Nov', + }) + }) +}) diff --git a/src/services/TickerService.ts b/src/services/TickerService.ts index bd9c7b5..f8023b1 100644 --- a/src/services/TickerService.ts +++ b/src/services/TickerService.ts @@ -50,24 +50,28 @@ export class TickerService { } public async fetch(): Promise { - const { price, pvp } = await this.fetchTicker(this.ticker) - const pricesHistory = await this.fetchPricesHistory(this.ticker) - const dividendsHistory = await this.fetchDividendsHistory(this.ticker) - - const { dividend12, dy12, lastDividend } = this.getDividendsByHistory( - dividendsHistory, - price, - ) - - return { - pvp, - dy12, - price, - dividend12, - lastDividend, - dividendsHistory, - pricesHistory, - ticker: this.ticker, + try { + const { price, pvp } = await this.fetchTicker(this.ticker) + const pricesHistory = await this.fetchPricesHistory(this.ticker) + const dividendsHistory = await this.fetchDividendsHistory(this.ticker) + + const { dividend12, dy12, lastDividend } = this.getDividendsByHistory( + dividendsHistory, + price, + ) + + return { + pvp, + dy12, + price, + dividend12, + lastDividend, + dividendsHistory, + pricesHistory, + ticker: this.ticker, + } + } catch (_err) { + throw new Error('Ocorreu um erro ao buscar o ticker') } } @@ -156,11 +160,14 @@ export class TickerService { dividendsHistory: DividendsHistory[], price: number, ) { - const lastDividend = last(dividendsHistory)?.amount || 0 + const lastDividend = round(last(dividendsHistory)?.amount || 0, 2) - const dividend12 = dividendsHistory.reduce((acc, dividend) => { - return acc + dividend.amount - }, 0) + const dividend12 = round( + dividendsHistory.reduce((acc, dividend) => { + return acc + dividend.amount + }, 0), + 2, + ) const dy12 = round((dividend12 / price) * 100, 2) From e0dd5c383cb479170c58d5b2c12c4160aaf2fefb Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 22 Nov 2023 15:16:48 -0300 Subject: [PATCH 26/46] test: add vitest/coverage-v8 --- package-lock.json | 160 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index edcc002..8f76f48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "@rocketseat/eslint-config": "^1.2.0", "@types/jsdom": "^21.1.1", "@vitejs/plugin-react": "^4.2.0", + "@vitest/coverage-v8": "^0.34.6", "autoprefixer": "^10.4.14", "concurrently": "^8.2.0", "dotenv": "^16.3.1", @@ -615,6 +616,12 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "node_modules/@edge-runtime/primitives": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz", @@ -1126,6 +1133,15 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -1736,6 +1752,12 @@ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, "node_modules/@types/jsdom": { "version": "21.1.6", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.6.tgz", @@ -2020,6 +2042,31 @@ "vite": "^4.2.0 || ^5.0.0" } }, + "node_modules/@vitest/coverage-v8": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz", + "integrity": "sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.32.0 <1" + } + }, "node_modules/@vitest/expect": { "version": "0.34.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", @@ -4680,6 +4727,12 @@ "node": ">=12" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -5124,6 +5177,83 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/iterator.prototype": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", @@ -6879,7 +7009,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -7229,6 +7359,20 @@ "node": ">=10" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7588,6 +7732,20 @@ "uuid": "8.3.2" } }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/victory-vendor": { "version": "36.6.12", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.12.tgz", diff --git a/package.json b/package.json index 9df28bd..1d9ddda 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@rocketseat/eslint-config": "^1.2.0", "@types/jsdom": "^21.1.1", "@vitejs/plugin-react": "^4.2.0", + "@vitest/coverage-v8": "^0.34.6", "autoprefixer": "^10.4.14", "concurrently": "^8.2.0", "dotenv": "^16.3.1", From 8f0b334dabad5d818e8e680c808388f07dc919f1 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 22 Nov 2023 15:19:15 -0300 Subject: [PATCH 27/46] fix: lint remove vars defined but never used --- src/components/common/Modal.tsx | 2 +- src/components/pages/home/tickers-table/Table.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/common/Modal.tsx b/src/components/common/Modal.tsx index 86b852a..a600df4 100644 --- a/src/components/common/Modal.tsx +++ b/src/components/common/Modal.tsx @@ -1,7 +1,7 @@ 'use client' import { useModal } from '@/hooks/useModal' -import { Button, Title } from '@tremor/react' +import { Button } from '@tremor/react' export default function Modal() { const { showModal, title, content, closeBtnTitle, closeModal } = useModal() diff --git a/src/components/pages/home/tickers-table/Table.tsx b/src/components/pages/home/tickers-table/Table.tsx index c6f319c..8273191 100644 --- a/src/components/pages/home/tickers-table/Table.tsx +++ b/src/components/pages/home/tickers-table/Table.tsx @@ -5,7 +5,6 @@ import { TableBody, TableHead, TableRow, - TableHeaderCell, } from '@tremor/react' import { usePortfolios } from '@/hooks/usePortfolios' From d1acb4c4566da7a38213c59405648ca635603b9a Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Wed, 22 Nov 2023 18:55:40 -0300 Subject: [PATCH 28/46] feat: add package @testing-library --- package-lock.json | 328 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + vitest.config.mjs | 3 +- vitest.setup.ts | 2 + 4 files changed, 334 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 8f76f48..7d256d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,9 @@ "@edge-runtime/vm": "^3.1.7", "@next/eslint-plugin-next": "^13.4.13", "@rocketseat/eslint-config": "^1.2.0", + "@testing-library/react": "^14.1.2", "@types/jsdom": "^21.1.1", + "@types/testing-library__jest-dom": "^6.0.0", "@vitejs/plugin-react": "^4.2.0", "@vitest/coverage-v8": "^0.34.6", "autoprefixer": "^10.4.14", @@ -57,6 +59,12 @@ "node": ">=0.10.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", + "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", + "dev": true + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -1618,6 +1626,150 @@ "tslib": "^2.4.0" } }, + "node_modules/@testing-library/dom": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz", + "integrity": "sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.3.1", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.1.2.tgz", + "integrity": "sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -1642,6 +1794,12 @@ "react-dom": ">=16.6.0" } }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1824,6 +1982,16 @@ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, + "node_modules/@types/testing-library__jest-dom": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-6.0.0.tgz", + "integrity": "sha512-bnreXCgus6IIadyHNlN/oI5FfX4dWgvGhOPvpr7zzCYDGAPIfvyIoAozMBINmhmsVuqV0cncejF2y5KC7ScqOg==", + "deprecated": "This is a stub types definition. @testing-library/jest-dom provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "@testing-library/jest-dom": "*" + } + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -2998,6 +3166,12 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3218,6 +3392,38 @@ "node": ">=6" } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3324,6 +3530,12 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -3493,6 +3705,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-iterator-helpers": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", @@ -4818,6 +5050,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4853,6 +5094,22 @@ "node": ">=12" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5511,6 +5768,15 @@ "node": ">=10" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", @@ -5595,6 +5861,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5898,6 +6173,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -6612,6 +6903,19 @@ "node": ">=6" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", @@ -7040,6 +7344,18 @@ "integrity": "sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==", "dev": true }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -7154,6 +7470,18 @@ "node": ">=4" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", diff --git a/package.json b/package.json index 1d9ddda..2394f1e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,9 @@ "@edge-runtime/vm": "^3.1.7", "@next/eslint-plugin-next": "^13.4.13", "@rocketseat/eslint-config": "^1.2.0", + "@testing-library/react": "^14.1.2", "@types/jsdom": "^21.1.1", + "@types/testing-library__jest-dom": "^6.0.0", "@vitejs/plugin-react": "^4.2.0", "@vitest/coverage-v8": "^0.34.6", "autoprefixer": "^10.4.14", diff --git a/vitest.config.mjs b/vitest.config.mjs index 35dbade..749a697 100644 --- a/vitest.config.mjs +++ b/vitest.config.mjs @@ -7,8 +7,9 @@ export default defineConfig({ plugins: [react()], test: { globals: true, - environment: 'edge-runtime', + environment: 'jsdom', setupFiles: ['dotenv/config', './vitest.setup.ts'], + threads: false, }, resolve: { alias: { diff --git a/vitest.setup.ts b/vitest.setup.ts index 04a6f37..0d11365 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1,3 +1,5 @@ +import '@testing-library/jest-dom/vitest' + Object.assign(process.env, { NEXT_PUBLIC_API_KEY: 'abcd123456', NEXT_PUBLIC_API_URL: 'http://localhost:1080', From ca1e885d3f8bc41e89e0f925b61df247882186c1 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Thu, 23 Nov 2023 10:45:43 -0300 Subject: [PATCH 29/46] feat: add tests common componets --- package.json | 2 +- src/components/common/Card.test.tsx | 25 ++++++++++ src/components/common/Card.tsx | 6 ++- src/components/common/Logo.test.tsx | 17 +++++++ src/components/common/Modal.test.tsx | 52 ++++++++++++++++++++ src/components/common/Modal.tsx | 16 ++++-- src/components/common/Term.test.tsx | 21 ++++++++ src/components/common/Title.test.tsx | 27 ++++++++++ src/components/common/TooltipHelper.test.tsx | 33 +++++++++++++ src/components/common/TooltipHelper.tsx | 3 +- tsconfig.json | 4 +- 11 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 src/components/common/Card.test.tsx create mode 100644 src/components/common/Logo.test.tsx create mode 100644 src/components/common/Modal.test.tsx create mode 100644 src/components/common/Term.test.tsx create mode 100644 src/components/common/Title.test.tsx create mode 100644 src/components/common/TooltipHelper.test.tsx diff --git a/package.json b/package.json index 2394f1e..c2cf666 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "css": "tailwindcss --input ./src/styles/globals.css --output ./src/styles/output.css --watch", "build": "tailwindcss ./src/styles/globals.css --output ./src/styles/output.css && next build", "test:watch": "vitest watch", - "test": "vitest run", + "test": "vitest run --coverage", "start": "next start", "lint": "next lint" }, diff --git a/src/components/common/Card.test.tsx b/src/components/common/Card.test.tsx new file mode 100644 index 0000000..d185df4 --- /dev/null +++ b/src/components/common/Card.test.tsx @@ -0,0 +1,25 @@ +import { beforeEach, describe, expect, test } from 'vitest' +import { cleanup, render } from '@testing-library/react' +import React from 'react' +import { Card } from './Card' + +describe('Card', () => { + beforeEach(cleanup) + + test('renders the card correctly', () => { + const { getByTestId } = render( + +
    Content
    +
    , + ) + + expect(getByTestId('title')).toBeInTheDocument() + expect(getByTestId('title').textContent).toBe('Title') + + expect(getByTestId('subtitle')).toBeInTheDocument() + expect(getByTestId('subtitle').textContent).toBe('Subtitle') + + expect(getByTestId('children')).toBeInTheDocument() + expect(getByTestId('children').textContent).toBe('Content') + }) +}) diff --git a/src/components/common/Card.tsx b/src/components/common/Card.tsx index 359440f..d55c15d 100644 --- a/src/components/common/Card.tsx +++ b/src/components/common/Card.tsx @@ -12,8 +12,10 @@ export function Card({ title, subtitle, children, ...props }: Props) { return ( - <span>{title}</span> - <span className="text-gray-500 text-sm">{subtitle}</span> + <span data-testid="title">{title}</span> + <span data-testid="subtitle" className="text-gray-500 text-sm"> + {subtitle} + </span> {children} diff --git a/src/components/common/Logo.test.tsx b/src/components/common/Logo.test.tsx new file mode 100644 index 0000000..8995588 --- /dev/null +++ b/src/components/common/Logo.test.tsx @@ -0,0 +1,17 @@ +import { beforeEach, describe, expect, test } from 'vitest' +import { cleanup, render } from '@testing-library/react' +import React from 'react' +import { Logo } from './Logo' +import { config } from '@/config' + +describe('Logo', () => { + beforeEach(cleanup) + + test('renders the logo correctly', () => { + const { getByText } = render() + const title = config.app.metadata.title.default + + expect(getByText(title)).toBeInTheDocument() + expect(getByText(title).textContent).toBe(title) + }) +}) diff --git a/src/components/common/Modal.test.tsx b/src/components/common/Modal.test.tsx new file mode 100644 index 0000000..ec44bfe --- /dev/null +++ b/src/components/common/Modal.test.tsx @@ -0,0 +1,52 @@ +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { cleanup, fireEvent, render } from '@testing-library/react' +import Modal from './Modal' +import React from 'react' + +const closeModalMock = vi.fn() + +const useModalMock = { + title: 'Title', + content: 'content...', + showModal: true, + closeBtnTitle: 'close', + closeModal: closeModalMock, +} + +vi.mock('@/hooks/useModal', () => ({ + useModal: () => useModalMock, +})) + +describe('Modal', () => { + beforeEach(cleanup) + + test('renders the modal correctly', () => { + const { getByRole, getByTestId } = render() + + const buttom = getByRole('button', { name: /close/i }) + expect(buttom).toBeInTheDocument() + + const title = getByTestId('title') + expect(title).toBeInTheDocument() + expect(title.textContent).toBe('Title') + + const content = getByTestId('content') + expect(content).toBeInTheDocument() + expect(content.textContent).toBe('content...') + }) + + test('calls closeModal when the close button is clicked', () => { + const { getByTestId } = render() + + fireEvent.click(getByTestId('close-btn')) + + expect(closeModalMock).toHaveBeenCalled() + }) + + test('does not render the modal when showModal is false', () => { + useModalMock.showModal = false + + const { container } = render() + expect(container).toBeEmptyDOMElement() + }) +}) diff --git a/src/components/common/Modal.tsx b/src/components/common/Modal.tsx index a600df4..ad7b5ed 100644 --- a/src/components/common/Modal.tsx +++ b/src/components/common/Modal.tsx @@ -14,13 +14,23 @@ export default function Modal() {
    -
    +
    {title}
    -
    {content}
    +
    + {content} +
    - +
    diff --git a/src/components/common/Term.test.tsx b/src/components/common/Term.test.tsx new file mode 100644 index 0000000..b0fe977 --- /dev/null +++ b/src/components/common/Term.test.tsx @@ -0,0 +1,21 @@ +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { cleanup, render } from '@testing-library/react' +import { Term } from './Term' +import React from 'react' + +const openModalMock = vi.fn() + +vi.mock('@/hooks/useModal', () => ({ + useModal: () => ({ + openModal: openModalMock, + }), +})) + +describe('Term', () => { + beforeEach(cleanup) + + test('calls openModal when the term is rendered', () => { + render() + expect(openModalMock).toHaveBeenCalled() + }) +}) diff --git a/src/components/common/Title.test.tsx b/src/components/common/Title.test.tsx new file mode 100644 index 0000000..99423aa --- /dev/null +++ b/src/components/common/Title.test.tsx @@ -0,0 +1,27 @@ +import { beforeEach, describe, expect, test } from 'vitest' +import { cleanup, render } from '@testing-library/react' +import { Title } from './Title' +import React from 'react' + +describe('Title', () => { + beforeEach(cleanup) + + test('renders the title correctly', () => { + const { getByTestId } = render( + + <span data-testid="children">Title Text</span> + , + ) + + expect(getByTestId('children')).toBeInTheDocument() + expect(getByTestId('children').textContent).toBe('Title Text') + }) + + test('applies additional class names correctly', () => { + const { getByText } = render( + Title Text, + ) + + expect(getByText('Title Text')).toHaveClass('custom-class') + }) +}) diff --git a/src/components/common/TooltipHelper.test.tsx b/src/components/common/TooltipHelper.test.tsx new file mode 100644 index 0000000..7ba384a --- /dev/null +++ b/src/components/common/TooltipHelper.test.tsx @@ -0,0 +1,33 @@ +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { cleanup, fireEvent, render } from '@testing-library/react' +import { TooltipHelper } from './TooltipHelper' +import React from 'react' + +const openModalMock = vi.fn() +vi.mock('@/hooks/useModal', () => ({ + useModal: () => ({ + openModal: openModalMock, + }), +})) + +describe('TooltipHelper', () => { + beforeEach(cleanup) + + test('renders the tooltip correctly', () => { + const { getByTestId } = render( + , + ) + + expect(getByTestId('tooltip-button')).toBeInTheDocument() + }) + + test('opens the modal when the button is clicked', () => { + const { getByTestId } = render( + , + ) + + fireEvent.click(getByTestId('tooltip-button')) + + expect(openModalMock).toHaveBeenCalled() + }) +}) diff --git a/src/components/common/TooltipHelper.tsx b/src/components/common/TooltipHelper.tsx index 76f2dbb..2aab1d5 100644 --- a/src/components/common/TooltipHelper.tsx +++ b/src/components/common/TooltipHelper.tsx @@ -8,7 +8,7 @@ type HelperTitleProps = { title: string } -export function HelperTitle({ title }: HelperTitleProps) { +function HelperTitle({ title }: HelperTitleProps) { return (
    {title} @@ -28,6 +28,7 @@ export function TooltipHelper({ title, content }: TooltipHelperProps) { return (
    diff --git a/src/components/layout/Main.test.tsx b/src/components/layout/Main.test.tsx new file mode 100644 index 0000000..d1c95a8 --- /dev/null +++ b/src/components/layout/Main.test.tsx @@ -0,0 +1,38 @@ +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { cleanup, fireEvent, render } from '@testing-library/react' +import React from 'react' +import { Main } from './Main' + +const sideBarMock = { + toggleSidebar: vi.fn(), + isOpen: true, +} + +vi.mock('@/hooks/useSidebar', () => ({ + useSidebar: () => sideBarMock, +})) + +describe('Main', () => { + beforeEach(cleanup) + + test('renders the card correctly', () => { + const { findAllByText } = render(
    main content
    ) + expect(findAllByText('main content')).toBeTruthy() + }) + + test('calls toggleSidebar on button click', () => { + const { getByTestId } = render(
    main content
    ) + + fireEvent.click(getByTestId('button')) + + expect(sideBarMock.toggleSidebar).toHaveBeenCalled() + }) + + test('renders the backdrop when sidebar is open', () => { + sideBarMock.isOpen = false + const { queryByTestId, getByText } = render(
    main content
    ) + + expect(getByText('main content')).toBeTruthy() + expect(queryByTestId('button')).toBeNull() + }) +}) diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index 9ca3b3b..7d4b5b6 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -11,6 +11,7 @@ export function Main({ children }: { children: ReactNode }) { <> {isOpen && (
    ({ + useSidebar: () => sideBarMock, +})) + +describe('Sidebar', () => { + beforeEach(cleanup) + + test('renders the sidebar correctly', () => { + const { getAllByTestId } = render() + const items = getAllByTestId('sidebar-menu-item') + + expect(items.length).toBe(2) + expect(items[0]).toHaveTextContent('Minha Carteira') + expect(items[1]).toHaveTextContent('Calculadora') + }) + + test('renders the sidebar correctly when it is closed', () => { + sideBarMock.isOpen = false + const { getByTestId } = render() + expect(getByTestId('sidebar')).not.toHaveClass('left-0') + }) + + test('renders the sidebar correctly when it is open', () => { + sideBarMock.isOpen = true + const { getByTestId } = render() + expect(getByTestId('sidebar')).toHaveClass('left-0') + }) +}) diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index d1ccca3..baef957 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -1,7 +1,7 @@ 'use client' import { Calculator, Wallet } from '@phosphor-icons/react' -import { SidebarMenuItem } from './SidebarMenu' +import { SidebarMenuItem } from './SidebarMenuItem' import { Logo } from '../common/Logo' import { useSidebar } from '@/hooks/useSidebar' import { cn } from '@/helpers/cn' @@ -11,6 +11,7 @@ export function Sidebar() { return (
    + + + + ) +} diff --git a/src/components/layout/Sidebar.test.tsx b/src/components/layout/Sidebar.test.tsx index 88262d4..89bf43a 100644 --- a/src/components/layout/Sidebar.test.tsx +++ b/src/components/layout/Sidebar.test.tsx @@ -20,7 +20,7 @@ describe('Sidebar', () => { expect(items.length).toBe(2) expect(items[0]).toHaveTextContent('Minha Carteira') - expect(items[1]).toHaveTextContent('Calculadora') + expect(items[1]).toHaveTextContent('Simulador') }) test('renders the sidebar correctly when it is closed', () => { diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index baef957..810b468 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -26,9 +26,9 @@ export function Sidebar() {
    diff --git a/src/components/layout/SidebarMenuItem.tsx b/src/components/layout/SidebarMenuItem.tsx index a8bc66b..7d4b8a9 100644 --- a/src/components/layout/SidebarMenuItem.tsx +++ b/src/components/layout/SidebarMenuItem.tsx @@ -1,4 +1,5 @@ import { Icon } from '@phosphor-icons/react' +import Link from 'next/link' interface MenuItemProps { icon: Icon @@ -6,17 +7,17 @@ interface MenuItemProps { href: string } -export function SidebarMenuItem({ label, icon: Icon }: MenuItemProps) { +export function SidebarMenuItem({ label, icon: Icon, href }: MenuItemProps) { return (
  • - {label} - +
  • ) } diff --git a/src/components/pages/simulator/chart/index.tsx b/src/components/pages/simulator/chart/index.tsx new file mode 100644 index 0000000..fa49207 --- /dev/null +++ b/src/components/pages/simulator/chart/index.tsx @@ -0,0 +1,30 @@ +import { toCurrency } from '@/helpers/currency' +import { SimulatorResult } from '@/helpers/simulatorCalculate' +import { LineChart } from '@tremor/react' + +interface Props { + results: SimulatorResult[] +} + +export function Chart({ results = [] }: Props) { + if (!results.length) { + return null + } + + const data = results.map((result) => ({ + Mês: result.mes, + 'Total Acumulado': result.totalAccumulated, + 'Total Investido': result.totalInvested, + })) + + return ( + + ) +} diff --git a/src/components/pages/simulator/table/HeaderCell.tsx b/src/components/pages/simulator/table/HeaderCell.tsx new file mode 100644 index 0000000..f9766fc --- /dev/null +++ b/src/components/pages/simulator/table/HeaderCell.tsx @@ -0,0 +1,19 @@ +import { TooltipHelper } from '@/components/common/TooltipHelper' +import { TableHeaderCell } from '@tremor/react' +import { ReactNode } from 'react' + +type Props = { + title: string + helper?: ReactNode +} + +export function HeaderCell({ title, helper }: Props) { + return ( + +
    + {title} + {helper && } +
    +
    + ) +} diff --git a/src/components/pages/simulator/table/Row.tsx b/src/components/pages/simulator/table/Row.tsx new file mode 100644 index 0000000..aaed34f --- /dev/null +++ b/src/components/pages/simulator/table/Row.tsx @@ -0,0 +1,30 @@ +'use client' + +import { TableCell, TableRow } from '@tremor/react' +import { SimulatorResult } from '@/helpers/simulatorCalculate' +import { toCurrency } from '@/helpers/currency' +import { round } from 'lodash' + +interface Props { + result: SimulatorResult +} + +export function Row({ result }: Props) { + return ( + + {result.mes} + + {round(result.interest, 2)}% + + + {toCurrency(result.totalInvested)} + + + {toCurrency(result.totalInterest)} + + + {toCurrency(result.totalAccumulated)} + + + ) +} diff --git a/src/components/pages/simulator/table/index.tsx b/src/components/pages/simulator/table/index.tsx new file mode 100644 index 0000000..8e755a8 --- /dev/null +++ b/src/components/pages/simulator/table/index.tsx @@ -0,0 +1,35 @@ +import { + Table as TremorTable, + TableBody, + TableHead, + TableRow, +} from '@tremor/react' + +import { HeaderCell } from './HeaderCell' +import { Row } from './Row' +import { SimulatorResult } from '@/helpers/simulatorCalculate' + +export interface TableProps { + results: SimulatorResult[] +} + +export function Table({ results }: TableProps) { + return ( + + + + + + + + + + + + {results.map((result) => ( + + ))} + + + ) +} diff --git a/src/helpers/simulatorCalculate.test.ts b/src/helpers/simulatorCalculate.test.ts new file mode 100644 index 0000000..20a5b1b --- /dev/null +++ b/src/helpers/simulatorCalculate.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, test } from 'vitest' +import { simulatorCalculate } from './simulatorCalculate' + +describe('simulatorCalculate', () => { + test('should calculate the correct result', () => { + const params = { + initialAmount: 1000, + investmentAmount: 100, + periodInMonths: 12, + taxePerYear: 5, + } + + const result = simulatorCalculate(params) + + expect(result.length).toBe(params.periodInMonths + 1) + + expect(result[0].mes).toBe(0) + expect(result[0].interest).toBe(0) + expect(result[0].totalInterest).toBe(0) + expect(result[0].totalInvested).toBe(params.initialAmount) + expect(result[0].totalAccumulated).toBe(params.initialAmount) + + expect(result[1].mes).toBe(1) + expect(result[1].interest).toBe(4.0741237836483535) + expect(result[1].totalInterest).toBe(4.0741237836483535) + expect(result[1].totalInvested).toBe(1100) + expect(result[1].totalAccumulated).toBe(1104.0741237836482) + + expect(result[12].mes).toBe(12) + expect(result[12].interest).toBe(8.834425053241732) + expect(result[12].totalInterest).toBe(77.25775295972907) + expect(result[12].totalInvested).toBe(2200) + expect(result[12].totalAccumulated).toBe(2277.2577529597293) + }) +}) diff --git a/src/helpers/simulatorCalculate.ts b/src/helpers/simulatorCalculate.ts new file mode 100644 index 0000000..59d6fe3 --- /dev/null +++ b/src/helpers/simulatorCalculate.ts @@ -0,0 +1,59 @@ +export interface SimulatorResult { + mes: number + interest: number + totalInvested: number + totalInterest: number + totalAccumulated: number +} + +export interface SimulatorParams { + initialAmount: number + investmentAmount: number + taxePerYear: number + periodInMonths: number +} + +function annualToMonthlyRate(annualRate: number): number { + return Math.pow(1 + annualRate / 100, 1 / 12) - 1 +} + +export const simulatorCalculate = ({ + initialAmount, + investmentAmount, + periodInMonths, + taxePerYear, +}: SimulatorParams): SimulatorResult[] => { + const result: SimulatorResult[] = [] + + let totalAccumulated = initialAmount + let totalInterest = 0 + + for (let mes = 0; mes <= periodInMonths; mes++) { + if (mes === 0) { + result.push({ + mes, + interest: 0, + totalInterest: 0, + totalInvested: initialAmount, + totalAccumulated: initialAmount, + }) + continue + } + + const monthlyRate = annualToMonthlyRate(taxePerYear) + + const interest = monthlyRate * totalAccumulated + totalAccumulated += investmentAmount + interest + totalInterest += interest + + result.push({ + mes, + interest, + totalInterest, + totalAccumulated, + totalInvested: investmentAmount * mes + initialAmount, + }) + } + + return result +} diff --git a/src/providers/ModalProvider.tsx b/src/providers/ModalProvider.tsx index b284257..cef2b37 100644 --- a/src/providers/ModalProvider.tsx +++ b/src/providers/ModalProvider.tsx @@ -12,6 +12,8 @@ export function ModalProvider({ children }: { children: ReactNode }) { const [title, setTitle] = useState() const [content, setContent] = useState() const [closeBtnTitle, setCloseBtnTitle] = useState() + + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [closeModalFn, setCloseModalFn] = useState<() => void | undefined>() const closeModal: ModalContextType['closeModal'] = () => { From a1679de506337ec5bf434104ebdc9cce8818d666 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 25 Nov 2023 14:45:41 -0300 Subject: [PATCH 36/46] feat: add e2e tests --- cypress/e2e/sidebar.spec.cy.ts | 23 +++++ cypress/e2e/simulator.spec.cy.ts | 20 ++++ cypress/support/commands.ts | 24 +++++ cypress/support/index.d.ts | 1 + src/app/simulator/page.tsx | 97 +++++++++---------- .../pages/simulator/chart/index.tsx | 2 +- .../pages/simulator/input/index.tsx | 26 +++++ .../pages/simulator/metric/index.tsx | 17 ++++ src/components/pages/simulator/table/Row.tsx | 7 +- .../pages/simulator/table/index.tsx | 2 +- src/helpers/simulatorCalculate.ts | 34 ++++--- 11 files changed, 182 insertions(+), 71 deletions(-) create mode 100644 cypress/e2e/sidebar.spec.cy.ts create mode 100644 cypress/e2e/simulator.spec.cy.ts create mode 100644 src/components/pages/simulator/input/index.tsx create mode 100644 src/components/pages/simulator/metric/index.tsx diff --git a/cypress/e2e/sidebar.spec.cy.ts b/cypress/e2e/sidebar.spec.cy.ts new file mode 100644 index 0000000..974e00e --- /dev/null +++ b/cypress/e2e/sidebar.spec.cy.ts @@ -0,0 +1,23 @@ +describe('sidebar', () => { + it('test menu link to home', () => { + cy.visit('/simulator') + cy.acceptTermsOfUse() + + cy.get('[href="/"][data-testid="sidebar-menu-item"]') + .should('be.visible') + .click() + + cy.url().should('eq', Cypress.config().baseUrl + '/') + }) + + it('test menu link to simulator', () => { + cy.visit('/') + cy.acceptTermsOfUse() + + cy.get('[href="/simulator"][data-testid="sidebar-menu-item"]') + .should('be.visible') + .click() + + cy.url().should('eq', Cypress.config().baseUrl + '/simulator') + }) +}) diff --git a/cypress/e2e/simulator.spec.cy.ts b/cypress/e2e/simulator.spec.cy.ts new file mode 100644 index 0000000..526f928 --- /dev/null +++ b/cypress/e2e/simulator.spec.cy.ts @@ -0,0 +1,20 @@ +describe('simulator', () => { + it('execute simulation with successfully', () => { + cy.visit('/simulator') + cy.acceptTermsOfUse() + + cy.simulate() + + cy.get('[data-testid="simulator-total-invested"]') + .should('be.visible') + .should('contain', 'R$ 185.000,00') + + cy.get('[data-testid="simulator-total-received"]') + .should('be.visible') + .should('contain', 'R$ 569.588,58') + + cy.get('[data-testid="simulator-total-accumulated"]') + .should('be.visible') + .should('contain', 'R$ 754.588,58') + }) +}) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index aec6058..d8260a9 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -15,3 +15,27 @@ Cypress.Commands.add('addTicker' as any, (ticker) => { cy.get('[data-testid="button-add-ticker"]').click() cy.get(`[data-testid="row-ticker-${ticker as string}"]`).should('be.visible') }) + +Cypress.Commands.add('simulate' as any, () => { + cy.get('[data-testid^="simulator-input"]').each(($el) => { + cy.wrap($el).clear() + const field = $el.attr('data-testid')?.replace('simulator-input-', '') + + switch (field) { + case 'initial': + cy.wrap($el).type('5000.00') + break + case 'investment': + cy.wrap($el).type('500.00') + break + case 'taxes': + cy.wrap($el).type('8.00') + break + case 'months': + cy.wrap($el).type('360') + break + } + }) + + cy.get('[data-testid="simulator-submit"]').click() +}) diff --git a/cypress/support/index.d.ts b/cypress/support/index.d.ts index 2de06f6..7012326 100644 --- a/cypress/support/index.d.ts +++ b/cypress/support/index.d.ts @@ -4,6 +4,7 @@ export {} declare global { namespace Cypress { interface Chainable { + simulate(): Chainable acceptTermsOfUse(): Chainable addTicker(ticker: string): Chainable } diff --git a/src/app/simulator/page.tsx b/src/app/simulator/page.tsx index 582d923..e9cc758 100644 --- a/src/app/simulator/page.tsx +++ b/src/app/simulator/page.tsx @@ -1,5 +1,5 @@ 'use client' -import { Button, Text, TextInput } from '@tremor/react' +import { Button } from '@tremor/react' import { useRef, useState } from 'react' import { Card } from '@/components/common/Card' import { @@ -9,6 +9,8 @@ import { import { Table } from '@/components/pages/simulator/table' import { Chart } from '@/components/pages/simulator/chart' import { toCurrency } from '@/helpers/currency' +import { Metric } from '@/components/pages/simulator/metric' +import { Input } from '@/components/pages/simulator/input' export default function Simulator() { const initialAmountRef = useRef(null) @@ -18,7 +20,7 @@ export default function Simulator() { const [results, setResults] = useState([]) const [totalInvested, setTotalInvested] = useState('R$ 0,00') - const [totalInterest, setTotalInterest] = useState('R$ 0,00') + const [totalReceived, setTotalReceived] = useState('R$ 0,00') const [totalAccumulated, setTotalAccumulated] = useState('R$ 0,00') const onSubmit = () => { @@ -33,7 +35,7 @@ export default function Simulator() { const lastResult = simulatorResults[params.periodInMonths] setTotalInvested(toCurrency(lastResult.totalInvested)) - setTotalInterest(toCurrency(lastResult.totalInterest)) + setTotalReceived(toCurrency(lastResult.totalReceived)) setTotalAccumulated(toCurrency(lastResult.totalAccumulated)) setResults(simulatorResults) @@ -44,53 +46,50 @@ export default function Simulator() {
    -
    -

    Valor inicial

    - -
    -
    -

    Valor mensal

    - -
    -
    -

    Taxa de juros

    - -
    -
    -

    Período (meses)

    - -
    + + + + - - - Total Investido: {totalInvested} - - - Total Juros: {totalInterest} - - - Total Acumulado: {totalAccumulated} - + + + + +
    diff --git a/src/components/pages/simulator/chart/index.tsx b/src/components/pages/simulator/chart/index.tsx index fa49207..4a69389 100644 --- a/src/components/pages/simulator/chart/index.tsx +++ b/src/components/pages/simulator/chart/index.tsx @@ -12,7 +12,7 @@ export function Chart({ results = [] }: Props) { } const data = results.map((result) => ({ - Mês: result.mes, + Mês: result.month, 'Total Acumulado': result.totalAccumulated, 'Total Investido': result.totalInvested, })) diff --git a/src/components/pages/simulator/input/index.tsx b/src/components/pages/simulator/input/index.tsx new file mode 100644 index 0000000..9a0938d --- /dev/null +++ b/src/components/pages/simulator/input/index.tsx @@ -0,0 +1,26 @@ +/* eslint-disable react/display-name */ +import { Text, TextInput } from '@tremor/react' +import React, { ForwardedRef, forwardRef } from 'react' + +interface Props { + testid: string + title: string + defaultValue?: string + placeholder?: string +} + +export const Input = forwardRef( + (props: Props, ref: ForwardedRef) => { + return ( +
    + {props.title} + +
    + ) + }, +) diff --git a/src/components/pages/simulator/metric/index.tsx b/src/components/pages/simulator/metric/index.tsx new file mode 100644 index 0000000..b1f4f1b --- /dev/null +++ b/src/components/pages/simulator/metric/index.tsx @@ -0,0 +1,17 @@ +import { Metric as MetricTremor, Text } from '@tremor/react' +import React from 'react' + +interface Props { + testid: string + title: string + metric: string +} + +export function Metric({ title, metric, testid }: Props) { + return ( +
    + {title} + {metric} +
    + ) +} diff --git a/src/components/pages/simulator/table/Row.tsx b/src/components/pages/simulator/table/Row.tsx index aaed34f..a424b6b 100644 --- a/src/components/pages/simulator/table/Row.tsx +++ b/src/components/pages/simulator/table/Row.tsx @@ -3,7 +3,6 @@ import { TableCell, TableRow } from '@tremor/react' import { SimulatorResult } from '@/helpers/simulatorCalculate' import { toCurrency } from '@/helpers/currency' -import { round } from 'lodash' interface Props { result: SimulatorResult @@ -12,15 +11,15 @@ interface Props { export function Row({ result }: Props) { return ( - {result.mes} + {result.month} - {round(result.interest, 2)}% + {toCurrency(result.valueReceived)} {toCurrency(result.totalInvested)} - {toCurrency(result.totalInterest)} + {toCurrency(result.totalReceived)} {toCurrency(result.totalAccumulated)} diff --git a/src/components/pages/simulator/table/index.tsx b/src/components/pages/simulator/table/index.tsx index 8e755a8..b888f86 100644 --- a/src/components/pages/simulator/table/index.tsx +++ b/src/components/pages/simulator/table/index.tsx @@ -27,7 +27,7 @@ export function Table({ results }: TableProps) { {results.map((result) => ( - + ))} diff --git a/src/helpers/simulatorCalculate.ts b/src/helpers/simulatorCalculate.ts index 59d6fe3..e5f2eeb 100644 --- a/src/helpers/simulatorCalculate.ts +++ b/src/helpers/simulatorCalculate.ts @@ -1,8 +1,8 @@ export interface SimulatorResult { - mes: number - interest: number + month: number + valueReceived: number + totalReceived: number totalInvested: number - totalInterest: number totalAccumulated: number } @@ -26,14 +26,14 @@ export const simulatorCalculate = ({ const result: SimulatorResult[] = [] let totalAccumulated = initialAmount - let totalInterest = 0 + let totalReceived = 0 - for (let mes = 0; mes <= periodInMonths; mes++) { - if (mes === 0) { + for (let month = 0; month <= periodInMonths; month++) { + if (month === 0) { result.push({ - mes, - interest: 0, - totalInterest: 0, + month, + valueReceived: 0, + totalReceived: 0, totalInvested: initialAmount, totalAccumulated: initialAmount, }) @@ -42,16 +42,18 @@ export const simulatorCalculate = ({ const monthlyRate = annualToMonthlyRate(taxePerYear) - const interest = monthlyRate * totalAccumulated - totalAccumulated += investmentAmount + interest - totalInterest += interest + const valueReceived = monthlyRate * totalAccumulated + totalAccumulated += investmentAmount + valueReceived + totalReceived += valueReceived + + const totalInvested = investmentAmount * month + initialAmount result.push({ - mes, - interest, - totalInterest, + month, + valueReceived, + totalReceived, + totalInvested, totalAccumulated, - totalInvested: investmentAmount * mes + initialAmount, }) } From 7c5efd07648e5f8dcdfffb2a88aac43a37acc984 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 25 Nov 2023 14:47:43 -0300 Subject: [PATCH 37/46] fix: test simulator --- src/helpers/simulatorCalculate.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/helpers/simulatorCalculate.test.ts b/src/helpers/simulatorCalculate.test.ts index 20a5b1b..72cf5e8 100644 --- a/src/helpers/simulatorCalculate.test.ts +++ b/src/helpers/simulatorCalculate.test.ts @@ -14,21 +14,21 @@ describe('simulatorCalculate', () => { expect(result.length).toBe(params.periodInMonths + 1) - expect(result[0].mes).toBe(0) - expect(result[0].interest).toBe(0) - expect(result[0].totalInterest).toBe(0) + expect(result[0].month).toBe(0) + expect(result[0].valueReceived).toBe(0) + expect(result[0].totalReceived).toBe(0) expect(result[0].totalInvested).toBe(params.initialAmount) expect(result[0].totalAccumulated).toBe(params.initialAmount) - expect(result[1].mes).toBe(1) - expect(result[1].interest).toBe(4.0741237836483535) - expect(result[1].totalInterest).toBe(4.0741237836483535) + expect(result[1].month).toBe(1) + expect(result[1].valueReceived).toBe(4.0741237836483535) + expect(result[1].totalReceived).toBe(4.0741237836483535) expect(result[1].totalInvested).toBe(1100) expect(result[1].totalAccumulated).toBe(1104.0741237836482) - expect(result[12].mes).toBe(12) - expect(result[12].interest).toBe(8.834425053241732) - expect(result[12].totalInterest).toBe(77.25775295972907) + expect(result[12].month).toBe(12) + expect(result[12].valueReceived).toBe(8.834425053241732) + expect(result[12].totalReceived).toBe(77.25775295972907) expect(result[12].totalInvested).toBe(2200) expect(result[12].totalAccumulated).toBe(2277.2577529597293) }) From 95f6b53a0495fe0e4ee4dbfbc599c2935ea8f596 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 25 Nov 2023 14:51:52 -0300 Subject: [PATCH 38/46] fix: Update closeModal prop in ModalConfig interface --- src/@types/ContextTypes.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/@types/ContextTypes.d.ts b/src/@types/ContextTypes.d.ts index c44e40f..de0c0c6 100644 --- a/src/@types/ContextTypes.d.ts +++ b/src/@types/ContextTypes.d.ts @@ -33,7 +33,7 @@ interface ModalConfig { title: ReactNode content: ReactNode closeBtnTitle?: string - closeModal: () => void + closeModal?: () => void } export interface ModalContextType { From a0ba2e8c8c0ce7d5862dc5a41e627af9e363a591 Mon Sep 17 00:00:00 2001 From: Elias da Rosa Date: Sat, 25 Nov 2023 15:29:29 -0300 Subject: [PATCH 39/46] fix: sidebar overlay button --- next.config.js | 2 +- src/components/layout/HeaderMobile.test.tsx | 4 ++-- src/components/layout/HeaderMobile.tsx | 2 +- src/components/layout/Main.test.tsx | 2 +- src/components/layout/Main.tsx | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/next.config.js b/next.config.js index 9e438a9..1ed5ece 100644 --- a/next.config.js +++ b/next.config.js @@ -2,7 +2,7 @@ const nextConfig = { experimental: { - serverComponentsExternalPackages: ['@tremor/react'], + // serverComponentsExternalPackages: ['@tremor/react'], }, } diff --git a/src/components/layout/HeaderMobile.test.tsx b/src/components/layout/HeaderMobile.test.tsx index 2a3e9a5..211f724 100644 --- a/src/components/layout/HeaderMobile.test.tsx +++ b/src/components/layout/HeaderMobile.test.tsx @@ -15,13 +15,13 @@ describe('HeaderMobile', () => { test('renders the card correctly', () => { const { getByTestId } = render() - expect(getByTestId('button')).toBeInTheDocument() + expect(getByTestId('sidebar-button-overlay')).toBeInTheDocument() }) test('calls toggleSidebar on button click', () => { const { getByTestId } = render() - fireEvent.click(getByTestId('button')) + fireEvent.click(getByTestId('sidebar-button-overlay')) expect(useSidebarMock).toHaveBeenCalled() }) diff --git a/src/components/layout/HeaderMobile.tsx b/src/components/layout/HeaderMobile.tsx index 0290a88..65045c7 100644 --- a/src/components/layout/HeaderMobile.tsx +++ b/src/components/layout/HeaderMobile.tsx @@ -11,7 +11,7 @@ export function HeaderMobile() { return (