From bb1b2f6677351610b4e6ba872d66de61fdf2d970 Mon Sep 17 00:00:00 2001 From: luisdralves Date: Thu, 5 Oct 2023 01:28:42 +0100 Subject: [PATCH] Add untile eslint and prettier config --- .eslintrc.cjs | 20 +- bin/async-spawn.ts | 14 +- bin/db.ts | 4 +- bin/fetch-textures.ts | 30 +- bin/get-type.ts | 30 +- bin/insert.ts | 122 +- bun.lockb | Bin 221975 -> 262484 bytes next.config.mjs | 8 +- package.json | 6 +- src/api/countries/get-countries.ts | 8 +- src/api/countries/get-country-counts.ts | 60 +- src/api/currencies/get-currencies.ts | 14 +- src/api/index.ts | 2 +- src/api/types/get-type.ts | 10 +- src/api/types/get-types.ts | 124 +- src/api/types/relations.ts | 10 +- src/components/banknote/index.tsx | 58 +- .../coin/custom/bahamas-cents-10.tsx | 12 +- .../coin/custom/bahamas-cents-15.tsx | 12 +- src/components/coin/custom/euro-cents-20.tsx | 12 +- src/components/coin/custom/tostao-furado.tsx | 12 +- src/components/coin/index.tsx | 90 +- src/components/filters/index.tsx | 293 ++-- .../filters/multi-select-countries.tsx | 59 +- .../filters/multi-select-currencies.tsx | 27 +- src/components/filters/multi-toggle.tsx | 17 +- src/components/header/index.tsx | 71 +- src/components/pile/coin-instances.tsx | 31 +- src/components/pile/index.tsx | 75 +- src/components/pile/stage-light-model.tsx | 26 +- src/components/showcase/index.tsx | 53 +- src/components/showcase/info-box.tsx | 97 +- src/components/showcase/row.tsx | 61 +- src/components/showcase/store.ts | 76 +- src/core/hooks/use-media-query.ts | 17 +- src/core/hooks/use-previous.ts | 2 +- src/core/hooks/use-types.ts | 19 +- src/core/utils/flags.ts | 16 +- src/core/utils/numista.ts | 11 +- src/pages/_app.tsx | 22 +- src/pages/_document.tsx | 4 +- src/pages/api/countries.ts | 11 +- src/pages/api/country-counts.ts | 7 +- src/pages/api/currencies.ts | 11 +- src/pages/api/merge-textures/[id].ts | 118 +- src/pages/api/types.ts | 67 +- src/pages/index.tsx | 70 +- src/pages/pile.tsx | 43 +- src/pages/showcase.tsx | 45 +- src/styles/theme.css | 1543 ++++------------- src/types/numista.ts | 234 +-- 51 files changed, 1453 insertions(+), 2331 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 07d133e..0ff1d6e 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,13 +1,17 @@ module.exports = { - root: true, env: { browser: true, es2020: true }, extends: [ - "next/core-web-vitals", - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react-hooks/recommended", - "plugin:@tanstack/eslint-plugin-query/recommended", + 'plugin:@next/next/recommended', + 'plugin:@tanstack/eslint-plugin-query/recommended', + '@untile/eslint-config-typescript-react' ], - parser: "@typescript-eslint/parser", - plugins: ["@tanstack/query"], + parser: '@typescript-eslint/parser', + plugins: ['@tanstack/query'], + rules: { + 'id-length': 'off', + 'id-match': ['error', '^_$|^_?[a-zA-Z][_a-zA-Z0-9]*$|^[A-Z][_A-Z0-9]+[A-Z0-9]$'], + 'no-underscore-dangle': 'off', + 'react/no-unknown-property': 'off', + 'react/react-in-jsx-scope': 'off' + } }; diff --git a/bin/async-spawn.ts b/bin/async-spawn.ts index 4d3b06b..7e9bcc5 100644 --- a/bin/async-spawn.ts +++ b/bin/async-spawn.ts @@ -1,16 +1,16 @@ -import process from "process"; -import { spawn } from "child_process"; +import process from 'process'; +import { spawn } from 'child_process'; export const asyncSpawn = (command: string, args: string[]) => { return new Promise((resolve, reject) => { const child = spawn(command, args, { - stdio: "inherit", + stdio: 'inherit' }); - child.on("error", reject); - child.stdout?.on("data", process.stdout.write); - child.stderr?.on("data", process.stderr.write); - child.on("close", (code) => { + child.on('error', reject); + child.stdout?.on('data', process.stdout.write); + child.stderr?.on('data', process.stderr.write); + child.on('close', code => { if (code === 0) { resolve(code); } else { diff --git a/bin/db.ts b/bin/db.ts index 6c89fe8..ff68833 100644 --- a/bin/db.ts +++ b/bin/db.ts @@ -1,3 +1,3 @@ -import { Database } from "bun:sqlite"; +import { Database } from 'bun:sqlite'; -export const db = new Database("./prisma/main.db"); +export const db = new Database('./prisma/main.db'); diff --git a/bin/fetch-textures.ts b/bin/fetch-textures.ts index dc06191..d82067e 100644 --- a/bin/fetch-textures.ts +++ b/bin/fetch-textures.ts @@ -1,20 +1,20 @@ -import path from "path"; -import Vibrant from "node-vibrant"; -import { NumistaType } from "@/types/numista"; -import { asyncSpawn } from "./async-spawn"; -import puppeteer, { Page } from "puppeteer"; -import { writeFile } from "fs/promises"; +import path from 'path'; +import Vibrant from 'node-vibrant'; +import { NumistaType } from '@/types/numista'; +import { asyncSpawn } from './async-spawn'; +import puppeteer, { Page } from 'puppeteer'; +import { writeFile } from 'fs/promises'; -const baseDir = "./public"; +const baseDir = './public'; export const downloadFile = async (page: Page, url: string) => { - const filepath = url.split("catalogue")[1]; - const folder = path.join(baseDir, filepath.split("/").slice(0, -1).join("/")); + const filepath = url.split('catalogue')[1]; + const folder = path.join(baseDir, filepath.split('/').slice(0, -1).join('/')); console.log(url); - await asyncSpawn("mkdir", ["-p", folder]); + await asyncSpawn('mkdir', ['-p', folder]); const destination = path.join(baseDir, filepath); - const pageRes = await page.goto(url, { waitUntil: "load" }); + const pageRes = await page.goto(url, { waitUntil: 'load' }); if (pageRes) { await writeFile(destination, await pageRes.buffer()); @@ -31,22 +31,22 @@ export const fetchTextures = async (type: NumistaType) => { if (type?.obverse?.picture) { const destination = await downloadFile(page, type.obverse.picture); - type.obverse.picture = destination.split("public")[1]; + type.obverse.picture = destination.split('public')[1]; const palette = await Vibrant.from(destination).getPalette(); if (palette.Vibrant) { - type.color = "rgb(" + palette.Vibrant.rgb.join(",") + ")"; + type.color = 'rgb(' + palette.Vibrant.rgb.join(',') + ')'; } } if (type?.reverse?.picture) { const destination = await downloadFile(page, type.reverse.picture); - type.reverse.picture = destination.split("public")[1]; + type.reverse.picture = destination.split('public')[1]; } if (type?.edge?.picture) { const destination = await downloadFile(page, type.edge.picture); - type.edge.picture = destination.split("public")[1]; + type.edge.picture = destination.split('public')[1]; } await browser.close(); diff --git a/bin/get-type.ts b/bin/get-type.ts index 26c56c4..4ca0c33 100644 --- a/bin/get-type.ts +++ b/bin/get-type.ts @@ -1,22 +1,22 @@ -import { NumistaType } from "@/types/numista"; -import { asyncSpawn } from "./async-spawn"; -import { fetchTextures } from "./fetch-textures"; -import { db } from "./db"; -import { handleInsertType, handleUpdateTypeCount } from "./insert"; -import { readFile, rm } from "fs/promises"; +import { NumistaType } from '@/types/numista'; +import { asyncSpawn } from './async-spawn'; +import { fetchTextures } from './fetch-textures'; +import { db } from './db'; +import { handleInsertType, handleUpdateTypeCount } from './insert'; +import { readFile, rm } from 'fs/promises'; // eslint-disable-next-line prefer-const -let [id, count] = process.argv.slice(2, 4).map((value) => Number(value)); +let [id, count] = process.argv.slice(2, 4).map(value => Number(value)); if (!id) { - throw new Error("Invalid id " + id); + throw new Error('Invalid id ' + id); } if (!count) { count = 1; } -const query = db.query("SELECT * FROM NumistaType WHERE id = " + id + ";"); +const query = db.query('SELECT * FROM NumistaType WHERE id = ' + id + ';'); let type = query.get() as NumistaType | null; if (type) { @@ -24,15 +24,15 @@ if (type) { type.count = (type.count ?? 1) + count; handleUpdateTypeCount(type); } else { - await asyncSpawn("sh", [ - "-c", - `curl https://api.numista.com/api/v3/types/${id} -H Numista-API-Key:egr10utzWmYztFrZhJSRGF7Tv64RA3b2S4xdz4di | jq '.count='${count} > tmp-${id}.json`, + await asyncSpawn('sh', [ + '-c', + `curl https://api.numista.com/api/v3/types/${id} -H Numista-API-Key:egr10utzWmYztFrZhJSRGF7Tv64RA3b2S4xdz4di | jq '.count='${count} > tmp-${id}.json` ]); - type = JSON.parse(await readFile(`tmp-${id}.json`, { encoding: "utf-8" })); + type = JSON.parse(await readFile(`tmp-${id}.json`, { encoding: 'utf-8' })); if (!type) { - throw new Error("Invalid response for id " + id); + throw new Error('Invalid response for id ' + id); } console.log(type.title); @@ -42,7 +42,7 @@ if (type) { type = await fetchTextures(type); if (!type) { - throw new Error("Error processing textures for id " + id); + throw new Error('Error processing textures for id ' + id); } handleInsertType(type); diff --git a/bin/insert.ts b/bin/insert.ts index bd6ad05..c8070c5 100644 --- a/bin/insert.ts +++ b/bin/insert.ts @@ -1,28 +1,20 @@ -import { NumistaType } from "@/types/numista"; -import { db } from "./db"; +import { NumistaType } from '@/types/numista'; +import { db } from './db'; const omit = (data: object, keys: string[] = []) => Object.fromEntries( Object.entries(data).filter( - ([key, value]) => - !keys.includes(key) && - (typeof value === "number" || typeof value === "boolean" || !!value), - ), + ([key, value]) => !keys.includes(key) && (typeof value === 'number' || typeof value === 'boolean' || !!value) + ) ); const exists = (table: string, primaryKey: string, value: unknown) => { - const stmt = `SELECT * FROM ${table} WHERE ${primaryKey}=${ - typeof value === "string" ? `'${value}'` : value - }`; + const stmt = `SELECT * FROM ${table} WHERE ${primaryKey}=${typeof value === 'string' ? `'${value}'` : value}`; return !!db.prepare(stmt).get(); }; -const inserter = ( - table: string, - data: Record, - primaryKey?: string, -) => { +const inserter = (table: string, data: Record, primaryKey?: string) => { if (primaryKey && exists(table, primaryKey, data[primaryKey])) { console.error(`${table} ${data[primaryKey]} already exists`); return; @@ -30,19 +22,17 @@ const inserter = ( const entries = Object.entries(data); - const stmt = `INSERT INTO ${table} (${entries - .map(([key]) => key) - .join(", ")}) VALUES (${entries + const stmt = `INSERT INTO ${table} (${entries.map(([key]) => key).join(', ')}) VALUES (${entries .map(([, value]) => { if (Array.isArray(value)) { - return `'${value.join(", ").replaceAll("'", "''")}'`; + return `'${value.join(', ').replaceAll("'", "''")}'`; } - if (typeof value === "string") { + if (typeof value === 'string') { return `'${value.replaceAll("'", "''")}'`; } return value; }) - .join(", ")});`; + .join(', ')});`; console.log(stmt); db.exec(stmt); @@ -50,54 +40,50 @@ const inserter = ( export const handleInsertType = (type: NumistaType) => { if (type.issuer) { - inserter("Issuer", omit(type.issuer), "code"); + inserter('Issuer', omit(type.issuer), 'code'); } if (type.value) { if (type.value.currency) { - inserter("Currency", omit(type.value.currency), "id"); + inserter('Currency', omit(type.value.currency), 'id'); } inserter( - "Value", + 'Value', omit( { ...type.value, currency_id: type.value.currency?.id, - id: type.id, + id: type.id }, - ["currency"], + ['currency'] ), - "id", + 'id' ); } if (type.demonetization) { - inserter( - "Demonetization", - omit({ ...type.demonetization, id: type.id }), - "id", - ); + inserter('Demonetization', omit({ ...type.demonetization, id: type.id }), 'id'); } if (type.composition) { - inserter("Composition", omit({ ...type.composition, id: type.id }), "id"); + inserter('Composition', omit({ ...type.composition, id: type.id }), 'id'); } if (type.technique) { - inserter("Technique", omit({ ...type.technique, id: type.id }), "id"); + inserter('Technique', omit({ ...type.technique, id: type.id }), 'id'); } if (type.obverse) { - inserter("Obverse", omit({ ...type.obverse, id: type.id }), "id"); + inserter('Obverse', omit({ ...type.obverse, id: type.id }), 'id'); } if (type.reverse) { - inserter("Reverse", omit({ ...type.reverse, id: type.id }), "id"); + inserter('Reverse', omit({ ...type.reverse, id: type.id }), 'id'); } if (type.edge) { - inserter("Edge", omit({ ...type.edge, id: type.id }), "id"); + inserter('Edge', omit({ ...type.edge, id: type.id }), 'id'); } if (type.watermark) { - inserter("Watermark", omit({ ...type.watermark, id: type.id }), "id"); + inserter('Watermark', omit({ ...type.watermark, id: type.id }), 'id'); } inserter( - "NumistaType", + 'NumistaType', omit( { ...type, @@ -110,51 +96,51 @@ export const handleInsertType = (type: NumistaType) => { ...(type.obverse && { obverse_id: type.id }), ...(type.reverse && { reverse_id: type.id }), ...(type.edge && { edge_id: type.id }), - ...(type.watermark && { watermark_id: type.id }), + ...(type.watermark && { watermark_id: type.id }) }, [ - "issuer", - "value", - "ruler", - "obverse", - "reverse", - "edge", - "watermark", - "tags", - "references", - "mints", - "printers", - "demonetization", - "composition", - "technique", - "related_types", - ], + 'issuer', + 'value', + 'ruler', + 'obverse', + 'reverse', + 'edge', + 'watermark', + 'tags', + 'references', + 'mints', + 'printers', + 'demonetization', + 'composition', + 'technique', + 'related_types' + ] ), - "id", + 'id' ); if (type.ruler?.length) { for (const ruler of type.ruler) { if (ruler.group) { - inserter("RulerGroup", omit(ruler.group), "id"); + inserter('RulerGroup', omit(ruler.group), 'id'); } inserter( - "Ruler", + 'Ruler', omit( { ...ruler, - group_id: ruler.group?.id, + group_id: ruler.group?.id }, - ["group"], + ['group'] ), - "id", + 'id' ); try { - inserter("TypeRuler", { + inserter('TypeRuler', { type_id: type.id, - ruler_id: ruler.id, + ruler_id: ruler.id }); } catch { //ok @@ -164,7 +150,7 @@ export const handleInsertType = (type: NumistaType) => { }; export const handleUpdateTypeCount = (type: NumistaType) => { - if (!exists("NumistaType", "id", type.id)) { + if (!exists('NumistaType', 'id', type.id)) { console.error(`id ${type.id} does not exist`); return; } @@ -178,13 +164,13 @@ export const handleUpdateTypeCount = (type: NumistaType) => { export const handleRelated = (type: NumistaType) => { if (type.related_types?.length) { for (const related_type of type.related_types) { - if (exists("NumistaType", "id", related_type.id)) { + if (exists('NumistaType', 'id', related_type.id)) { inserter( - "TypeRelated", + 'TypeRelated', omit({ type1_id: type.id, - type2_id: related_type.id, - }), + type2_id: related_type.id + }) ); } } diff --git a/bun.lockb b/bun.lockb index 68904266b4de3fb415cc3afb925e107efe5e7e4f..c8e33a1118c6f5773145f77bc72693dd608cba46 100755 GIT binary patch delta 67081 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
9c;hzc3GcIpj6Ew6r} zc>hN*11uSeoJ1+*tV#)f50ZrKvTwEK>c_z!AgjZM6<9Or+9jo7E7x9&2yiZ_mO`hw zY5GOQyHy3!V8q>wLVKiNV5V($fimB!Y@M~B0_&EX;>?2F98S~p#hHbfl{8>nQBIoJ z{v30*eT!5kGICMN(-)fyGR>)37W-Cb=%nft<{|0QBW+^;GuDFO2>qhdqqHHkq?xu} zFg!DdE4b!}wj3b^TdE8>RE7{Q#!m_rOOYSMLO300OcO6EbvnD91={K)DtCOaKC{iy zRbLn^Pb9>xcUh8yiVMI+yr9#R>YvTg7ZqeWlajsxEW%4czi4-$ zwqcZme-|+3a_ND85MdosZsAPVX*vvYy3?b2j4ZvAGqRJEfb4W9)?##BN}@ zZE4;=ivNn!O8M#S#h;YA8mS}Wo$G7k64kG zQIMORS(Kdv%|;0(%Yy8;uqY24S@acXjZLN9HMGIq+=4K%`!OOk;%yADfK#G)eiJE7 zIIO~i7+>L@Q&rj>q-|_)$1AYibqg~yMN_C2x%>2Qm8Ph3|NI%$cE&};w}q50hN>~e zRqpDZm2Z8Gkn#<~AgAq#@;dlx|#dp`P zo<@d=@}Ohkr#^dP>D-3`Lfvwd09sbs zMgy=^*2(8_rk`!l-(A(L}!E)EhgbXv4kn TlLhRF`Oi63_yaz^O>6ug{~H6) delta 38939 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 diff --git a/next.config.mjs b/next.config.mjs index c227914..218c3f9 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -2,12 +2,12 @@ const nextConfig = { redirects: () => [ { - destination: "/", + destination: '/', permanent: true, - source: "/showcase-banknotes", - }, + source: '/showcase-banknotes' + } ], - reactStrictMode: true, + reactStrictMode: true }; export default nextConfig; diff --git a/package.json b/package.json index 85a426f..ce59c04 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "zustand": "^4.4.1" }, "devDependencies": { + "@next/eslint-plugin-next": "^13.5.4", "@tanstack/eslint-plugin-query": "^4.34.1", "@types/node": "20.6.0", "@types/react": "18.2.21", @@ -37,11 +38,14 @@ "@types/three": "0.152.0", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", + "@untile/eslint-config-typescript-react": "^2.0.1", + "@untile/prettier-config": "^2.0.1", "bun-types": "^1.0.3", "eslint": "8.49.0", "eslint-config-next": "13.4.19", "eslint-plugin-react-hooks": "^4.6.0", "node-vibrant": "^3.2.1-alpha.1", "typescript": "5.2.2" - } + }, + "prettier": "@untile/prettier-config" } diff --git a/src/api/countries/get-countries.ts b/src/api/countries/get-countries.ts index 37c96dd..fc8bb2e 100644 --- a/src/api/countries/get-countries.ts +++ b/src/api/countries/get-countries.ts @@ -1,11 +1,11 @@ -import { prisma } from "@/api"; +import { prisma } from '@/api'; export const getCountries = async (filter?: string) => { return await prisma.issuer.findMany({ ...(filter && { where: { - name: { contains: filter }, - }, - }), + name: { contains: filter } + } + }) }); }; diff --git a/src/api/countries/get-country-counts.ts b/src/api/countries/get-country-counts.ts index 59574b5..839d881 100644 --- a/src/api/countries/get-country-counts.ts +++ b/src/api/countries/get-country-counts.ts @@ -1,66 +1,62 @@ -import { prisma } from "@/api"; +import { prisma } from '@/api'; -export const getCountryCounts = async (category?: "coins" | "banknotes") => { +export const getCountryCounts = async (category?: 'coins' | 'banknotes') => { const countryBanknoteCounts = - category !== "coins" + category !== 'coins' ? await prisma.numistaType.groupBy({ - by: ["issuer_code"], - _sum: { - count: true, - }, _count: true, + _sum: { + count: true + }, + by: ['issuer_code'], where: { category: { - equals: "banknote", - }, - }, + equals: 'banknote' + } + } }) : []; const countryCoinCounts = - category !== "banknotes" + category !== 'banknotes' ? await prisma.numistaType.groupBy({ - by: ["issuer_code"], - _sum: { - count: true, - }, _count: true, + _sum: { + count: true + }, + by: ['issuer_code'], where: { category: { - not: "banknote", - }, - }, + not: 'banknote' + } + } }) : []; const countries = await prisma.issuer.findMany({ orderBy: { - name: "asc", - }, + name: 'asc' + } }); - const map = countries.map((country) => { - const banknoteCounts = countryBanknoteCounts.find( - ({ issuer_code }) => issuer_code === country.code, - ); - const coinCounts = countryCoinCounts.find( - ({ issuer_code }) => issuer_code === country.code, - ); + const map = countries.map(country => { + const banknoteCounts = countryBanknoteCounts.find(({ issuer_code }) => issuer_code === country.code); + const coinCounts = countryCoinCounts.find(({ issuer_code }) => issuer_code === country.code); return { ...country, ...(banknoteCounts && { banknotes: { - sum: banknoteCounts?._sum?.count, count: banknoteCounts?._count, - }, + sum: banknoteCounts?._sum?.count + } }), ...(coinCounts && { coins: { - sum: coinCounts?._sum?.count, count: coinCounts?._count, - }, - }), + sum: coinCounts?._sum?.count + } + }) }; }); diff --git a/src/api/currencies/get-currencies.ts b/src/api/currencies/get-currencies.ts index fd865c6..c04984e 100644 --- a/src/api/currencies/get-currencies.ts +++ b/src/api/currencies/get-currencies.ts @@ -1,19 +1,19 @@ -import { prisma } from "@/api"; +import { prisma } from '@/api'; export const getCurrencies = async (filter?: string) => { return ( await prisma.currency.groupBy({ - by: "name", + by: 'name', ...(filter && { where: { OR: [ { full_name: { contains: filter }, - name: { contains: filter }, - }, - ], - }, - }), + name: { contains: filter } + } + ] + } + }) }) ).map(({ name }) => name); }; diff --git a/src/api/index.ts b/src/api/index.ts index 901f3a0..9b6c4ce 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,3 +1,3 @@ -import { PrismaClient } from "@prisma/client"; +import { PrismaClient } from '@prisma/client'; export const prisma = new PrismaClient(); diff --git a/src/api/types/get-type.ts b/src/api/types/get-type.ts index d089701..e726b51 100644 --- a/src/api/types/get-type.ts +++ b/src/api/types/get-type.ts @@ -1,13 +1,13 @@ -import { NumistaType } from "@/types/numista"; -import { prisma } from "@/api"; -import { include } from "./relations"; +import { NumistaType } from '@/types/numista'; +import { include } from './relations'; +import { prisma } from '@/api'; export const getType = async (id: number) => { const type = await prisma.numistaType.findUnique({ include, where: { - id, - }, + id + } }); return type as unknown as NumistaType | null; diff --git a/src/api/types/get-types.ts b/src/api/types/get-types.ts index 8d3892f..06e430d 100644 --- a/src/api/types/get-types.ts +++ b/src/api/types/get-types.ts @@ -1,70 +1,62 @@ -import { NumistaType } from "@/types/numista"; -import { Prisma } from "@prisma/client"; -import { prisma } from "@/api"; -import { include } from "./relations"; +import { NumistaType } from '@/types/numista'; +import { Prisma } from '@prisma/client'; +import { include } from './relations'; +import { prisma } from '@/api'; type Props = { - search?: string; - category?: "coins" | "banknotes"; + category?: 'coins' | 'banknotes'; countries?: string[]; currencies?: string[]; faceValue?: number; + search?: string; + special?: 'yes' | 'no' | 'both'; yearRange?: [number, number]; - special?: "yes" | "no" | "both"; }; -export const getTypes = async ({ - search, - category, - countries, - currencies, - faceValue, - yearRange, - special, -}: Props) => { +export const getTypes = async ({ category, countries, currencies, faceValue, search, special, yearRange }: Props) => { const AND: Prisma.NumistaTypeWhereInput[] = []; const OR: Prisma.NumistaTypeWhereInput[] = []; - if (category === "banknotes") { + if (category === 'banknotes') { AND.push({ - category: "banknote", + category: 'banknote' }); } - if (category === "coins") { + if (category === 'coins') { AND.push({ category: { - not: "banknote", - }, + not: 'banknote' + } }); } if (currencies?.length) { AND.push({ value: { - OR: currencies.map((currency) => ({ + OR: currencies.map(currency => ({ currency: { - OR: [{ name: currency }, { full_name: currency }], - }, - })), - }, + OR: [{ name: currency }, { full_name: currency }] + } + })) + } }); } if (countries?.length) { AND.push({ issuer: { - OR: countries.map((country) => ({ + OR: countries.map(country => ({ OR: [ { - code: country, + code: country }, { - name: country, - }, - ], - })), - }, + name: country + } + ] + })) + } }); } @@ -72,40 +64,40 @@ export const getTypes = async ({ AND.push({ value: { numeric_value: { - equals: faceValue, - }, - }, + equals: faceValue + } + } }); } if (yearRange?.length === 2) { AND.push({ AND: { - min_year: { - gte: yearRange[0], - }, max_year: { - lte: yearRange[1], + lte: yearRange[1] }, - }, + min_year: { + gte: yearRange[0] + } + } }); } - if (special === "yes") { + if (special === 'yes') { AND.push({ NOT: { type: { - contains: "Standard", - }, - }, + contains: 'Standard' + } + } }); } - if (special === "no") { + if (special === 'no') { AND.push({ type: { - contains: "Standard", - }, + contains: 'Standard' + } }); } @@ -115,23 +107,21 @@ export const getTypes = async ({ issuer: { OR: [ { - code: { contains: search }, + code: { contains: search } }, { - name: { contains: search }, - }, - ], - }, + name: { contains: search } + } + ] + } }); + OR.push({ value: { currency: { - OR: [ - { name: { contains: search } }, - { full_name: { contains: search } }, - ], - }, - }, + OR: [{ name: { contains: search } }, { full_name: { contains: search } }] + } + } }); } @@ -144,23 +134,23 @@ export const getTypes = async ({ ...(OR.length > 0 ? { where: { - OR, - }, + OR + } } : {}), orderBy: [ { - min_year: "asc", + min_year: 'asc' }, { - max_year: "asc", + max_year: 'asc' }, { value: { - numeric_value: "asc", - }, - }, - ], + numeric_value: 'asc' + } + } + ] }); return types as unknown as NumistaType[]; diff --git a/src/api/types/relations.ts b/src/api/types/relations.ts index d2aa665..6613b7d 100644 --- a/src/api/types/relations.ts +++ b/src/api/types/relations.ts @@ -1,13 +1,13 @@ -import { Prisma } from "@prisma/client"; +import { Prisma } from '@prisma/client'; export const include: Prisma.NumistaTypeInclude = { + edge: true, issuer: true, obverse: true, reverse: true, - edge: true, value: { include: { - currency: true, - }, - }, + currency: true + } + } }; diff --git a/src/components/banknote/index.tsx b/src/components/banknote/index.tsx index 03f0ab1..48d0960 100644 --- a/src/components/banknote/index.tsx +++ b/src/components/banknote/index.tsx @@ -1,24 +1,24 @@ -import * as THREE from "three"; -import { useLoader } from "@react-three/fiber"; -import { NumistaType } from "@/types/numista"; -import { Dispatch, SetStateAction, useEffect, useMemo, useState } from "react"; +import * as THREE from 'three'; +import { Dispatch, SetStateAction, useEffect, useMemo, useState } from 'react'; +import { NumistaType } from '@/types/numista'; +import { useLoader } from '@react-three/fiber'; const SafeMaterial = ({ - url, bumpMap, setWidth, side, + url }: { - url: string; bumpMap: THREE.Texture; setWidth?: Dispatch>; - side: "obverse" | "reverse"; + side: 'obverse' | 'reverse'; + url: string; }) => { const texture: THREE.Texture = useLoader(THREE.TextureLoader, url); const index = useMemo(() => { switch (side) { - case "obverse": + case 'obverse': return 4; default: @@ -42,13 +42,13 @@ const SafeMaterial = ({ return ( ); }; @@ -56,10 +56,7 @@ const SafeMaterial = ({ export const BanknoteInstance = ({ obverse, reverse }: NumistaType) => { const [width, setWidth] = useState(0); - const obverseBumpTexture: THREE.Texture = useLoader( - THREE.TextureLoader, - "/photos/seamless-paper-normal-map.jpg", - ); + const obverseBumpTexture: THREE.Texture = useLoader(THREE.TextureLoader, '/photos/seamless-paper-normal-map.jpg'); obverseBumpTexture.repeat = new THREE.Vector2(1, 0.25); obverseBumpTexture.wrapS = THREE.RepeatWrapping; @@ -71,50 +68,35 @@ export const BanknoteInstance = ({ obverse, reverse }: NumistaType) => { return ( <> - + {Array.from({ length: 4 }, (_, index) => ( - + ))} {obverse?.picture ? ( - + ) : ( )} {reverse?.picture ? ( - + ) : ( )} diff --git a/src/components/coin/custom/bahamas-cents-10.tsx b/src/components/coin/custom/bahamas-cents-10.tsx index 8c1bc74..e23fb06 100644 --- a/src/components/coin/custom/bahamas-cents-10.tsx +++ b/src/components/coin/custom/bahamas-cents-10.tsx @@ -1,17 +1,17 @@ -import { useGLTF, useTexture } from "@react-three/drei"; -import { NumistaType } from "@/types/numista"; +import { NumistaType } from '@/types/numista'; +import { useGLTF, useTexture } from '@react-three/drei'; export function BahamasCents10(coin: NumistaType) { // @ts-expect-error property `nodes` actually exists - const { nodes } = useGLTF("/models/bahamas-cents-10.gltf"); - const texture = useTexture("/api/merge-textures/" + coin.id); + const { nodes } = useGLTF('/models/bahamas-cents-10.gltf'); + const texture = useTexture(`/api/merge-textures/${coin.id}`); return ( <> - + ); } -useGLTF.preload("/models/bahamas-cents-10.gltf"); +useGLTF.preload('/models/bahamas-cents-10.gltf'); diff --git a/src/components/coin/custom/bahamas-cents-15.tsx b/src/components/coin/custom/bahamas-cents-15.tsx index 58be101..6d6f563 100644 --- a/src/components/coin/custom/bahamas-cents-15.tsx +++ b/src/components/coin/custom/bahamas-cents-15.tsx @@ -1,17 +1,17 @@ -import { useGLTF, useTexture } from "@react-three/drei"; -import { NumistaType } from "@/types/numista"; +import { NumistaType } from '@/types/numista'; +import { useGLTF, useTexture } from '@react-three/drei'; export function BahamasCents15(coin: NumistaType) { // @ts-expect-error property `nodes` actually exists - const { nodes } = useGLTF("/models/bahamas-cents-15.gltf"); - const texture = useTexture("/api/merge-textures/" + coin.id); + const { nodes } = useGLTF('/models/bahamas-cents-15.gltf'); + const texture = useTexture(`/api/merge-textures/${coin.id}`); return ( <> - + ); } -useGLTF.preload("/models/bahamas-cents-15.gltf"); +useGLTF.preload('/models/bahamas-cents-15.gltf'); diff --git a/src/components/coin/custom/euro-cents-20.tsx b/src/components/coin/custom/euro-cents-20.tsx index ad7dfe2..9b92a9f 100644 --- a/src/components/coin/custom/euro-cents-20.tsx +++ b/src/components/coin/custom/euro-cents-20.tsx @@ -1,17 +1,17 @@ -import { useGLTF, useTexture } from "@react-three/drei"; -import { NumistaType } from "@/types/numista"; +import { NumistaType } from '@/types/numista'; +import { useGLTF, useTexture } from '@react-three/drei'; export function EuroCents20(coin: NumistaType) { // @ts-expect-error property `nodes` actually exists - const { nodes } = useGLTF("/models/euro-cents-20.gltf"); - const texture = useTexture("/api/merge-textures/" + coin.id); + const { nodes } = useGLTF('/models/euro-cents-20.gltf'); + const texture = useTexture(`/api/merge-textures/${coin.id}`); return ( <> - + ); } -useGLTF.preload("/models/euro-cents-20.gltf"); +useGLTF.preload('/models/euro-cents-20.gltf'); diff --git a/src/components/coin/custom/tostao-furado.tsx b/src/components/coin/custom/tostao-furado.tsx index e5670ea..d507a10 100644 --- a/src/components/coin/custom/tostao-furado.tsx +++ b/src/components/coin/custom/tostao-furado.tsx @@ -1,17 +1,17 @@ -import { useGLTF, useTexture } from "@react-three/drei"; -import { NumistaType } from "@/types/numista"; +import { NumistaType } from '@/types/numista'; +import { useGLTF, useTexture } from '@react-three/drei'; export function TostaoFurado(coin: NumistaType) { // @ts-expect-error property `nodes` actually exists - const { nodes } = useGLTF("/models/tostao-furado.gltf"); - const texture = useTexture("/api/merge-textures/" + coin.id); + const { nodes } = useGLTF('/models/tostao-furado.gltf'); + const texture = useTexture(`/api/merge-textures/${coin.id}`); return ( <> - + ); } -useGLTF.preload("/models/tostao-furado.gltf"); +useGLTF.preload('/models/tostao-furado.gltf'); diff --git a/src/components/coin/index.tsx b/src/components/coin/index.tsx index 92b562a..2b8ceb0 100644 --- a/src/components/coin/index.tsx +++ b/src/components/coin/index.tsx @@ -1,28 +1,28 @@ -import * as THREE from "three"; -import { useLoader } from "@react-three/fiber"; -import { NumistaType } from "@/types/numista"; -import { useEffect, useMemo } from "react"; -import { EuroCents20 } from "./custom/euro-cents-20"; -import { BahamasCents15 } from "./custom/bahamas-cents-15"; -import { BahamasCents10 } from "./custom/bahamas-cents-10"; -import { TostaoFurado } from "./custom/tostao-furado"; +import * as THREE from 'three'; +import { BahamasCents10 } from './custom/bahamas-cents-10'; +import { BahamasCents15 } from './custom/bahamas-cents-15'; +import { EuroCents20 } from './custom/euro-cents-20'; +import { NumistaType } from '@/types/numista'; +import { TostaoFurado } from './custom/tostao-furado'; +import { useEffect, useMemo } from 'react'; +import { useLoader } from '@react-three/fiber'; const SafeMaterial = ({ - url, orientation, side, -}: Pick & { + url +}: Pick & { + side: 'edge' | 'obverse' | 'reverse'; url: string; - side: "edge" | "obverse" | "reverse"; }) => { const texture: THREE.Texture = useLoader(THREE.TextureLoader, url); const index = useMemo(() => { switch (side) { - case "edge": + case 'edge': return 0; - case "obverse": + case 'obverse': return 1; default: @@ -32,18 +32,19 @@ const SafeMaterial = ({ useEffect(() => { switch (side) { - case "edge": + case 'edge': texture.repeat = new THREE.Vector2(4, 1); texture.offset = new THREE.Vector2(0.5, 0); texture.wrapS = THREE.MirroredRepeatWrapping; texture.wrapT = THREE.MirroredRepeatWrapping; break; - case "reverse": - if (orientation === "medal") { + case 'reverse': + if (orientation === 'medal') { texture.center = new THREE.Vector2(0.5, 0.5); texture.rotation = Math.PI; } + break; default: @@ -51,59 +52,42 @@ const SafeMaterial = ({ } }, [orientation, texture, side]); - return ( - - ); + return ; }; -export const BaseCoin = ({ - orientation, - color, - obverse, - reverse, - edge, -}: NumistaType) => { +export const BaseCoin = ({ color, edge, obverse, orientation, reverse }: NumistaType) => { const sides = useMemo(() => { - //const parsed = Number(/(\d+)/.exec(shape)?.[0]); - //return Math.min(32, Math.max(4, isNaN(parsed) ? 32 : parsed)); + // Const parsed = Number(/(\d+)/.exec(shape)?.[0]); + // return Math.min(32, Math.max(4, isNaN(parsed) ? 32 : parsed)); return 32; }, []); const defaultProps = { - metalness: 1, - roughness: 0.5, color, + metalness: 1, + roughness: 0.5 }; return ( <> - + {edge?.picture ? ( - + ) : ( - + )} {obverse?.picture ? ( - + ) : ( - + )} {reverse?.picture ? ( - + ) : ( - + )} ); @@ -111,10 +95,9 @@ export const BaseCoin = ({ export const CoinInstance = (coin: NumistaType) => { if ( - (coin.value?.numeric_value === 0.2 && - coin.value?.currency?.name === "Euro") || + (coin.value?.numeric_value === 0.2 && coin.value?.currency?.name === 'Euro') || (coin.value?.numeric_value === 50 && - coin.value?.currency?.name === "Peseta" && + coin.value?.currency?.name === 'Peseta' && coin.min_year && coin.min_year >= 1990) ) { @@ -123,22 +106,21 @@ export const CoinInstance = (coin: NumistaType) => { if ( coin.value?.numeric_value === 25 && - coin.value?.currency?.name === "Peseta" && + coin.value?.currency?.name === 'Peseta' && coin.min_year && coin.min_year >= 1990 ) { return ; } - if ( - coin.value?.currency?.name === "Dollar" && - coin.issuer?.code === "bahamas" - ) { + if (coin.value?.currency?.name === 'Dollar' && coin.issuer?.code === 'bahamas') { switch (coin.value?.numeric_value) { case 0.15: return ; + case 0.1: return ; + default: break; } diff --git a/src/components/filters/index.tsx b/src/components/filters/index.tsx index 1784140..40df893 100644 --- a/src/components/filters/index.tsx +++ b/src/components/filters/index.tsx @@ -1,12 +1,12 @@ -import { useEffect, useMemo, useReducer } from "react"; -import { Slider } from "primereact/slider"; -import { InputNumber } from "primereact/inputnumber"; -import { useRouter } from "next/router"; -import { ParsedUrlQuery } from "querystring"; -import { MultiToggleFilter } from "@/components/filters/multi-toggle"; -import { Sidebar, SidebarProps } from "primereact/sidebar"; -import { MultiSelectCurrenciesFilter } from "@/components/filters/multi-select-currencies"; -import { MultiSelectCountriesFilter } from "./multi-select-countries"; +import { InputNumber } from 'primereact/inputnumber'; +import { MultiSelectCountriesFilter } from './multi-select-countries'; +import { MultiSelectCurrenciesFilter } from '@/components/filters/multi-select-currencies'; +import { MultiToggleFilter } from '@/components/filters/multi-toggle'; +import { ParsedUrlQuery } from 'querystring'; +import { Sidebar, SidebarProps } from 'primereact/sidebar'; +import { Slider } from 'primereact/slider'; +import { useEffect, useMemo, useReducer } from 'react'; +import { useRouter } from 'next/router'; type Props = SidebarProps & { filterBanknotes?: boolean; @@ -14,92 +14,99 @@ type Props = SidebarProps & { }; type State = { - search: string; - faceValue?: number; + banknotes: boolean; + coins: boolean; countries: string[]; currencies: string[]; + faceValue?: number; + search: string; special: boolean; standard: boolean; - coins: boolean; - banknotes: boolean; yearRange: [number, number]; }; type Action = | { - key: "currency"; + key: 'currency'; payload: string; } | { - key: "country"; + key: 'country'; payload: string; } | { - key: "special" | "standard" | "coins" | "banknotes"; + key: 'special' | 'standard' | 'coins' | 'banknotes'; payload?: boolean; } | { - key: "yearRange"; + key: 'yearRange'; payload?: number | [number, number]; } | { - key: "faceValue"; + key: 'faceValue'; payload?: number | [number, number] | null; }; const validFaceValues = [ - 0.01, 0.02, 0.05, 0.1, 0.2, 0.25, 0.5, 1, 1.5, 2, 2.5, 3, 4, 5, 10, 15, 20, - 25, 50, 100, 200, 250, 500, 1000, + 0.01, 0.02, 0.05, 0.1, 0.2, 0.25, 0.5, 1, 1.5, 2, 2.5, 3, 4, 5, 10, 15, 20, 25, 50, 100, 200, 250, 500, 1000 ]; const currentYear = new Date().getFullYear(); -const arrayToggle = (array: T[], value: T) => { +const arrayToggle = (array: T[], value: T) => { if (array.includes(value)) { - return array.filter((inner) => inner !== value); + return array.filter(inner => inner !== value); } + return [...array, value]; }; const reducer = (state: State, { key, payload }: Action) => { switch (key) { - case "currency": + case 'currency': return { ...state, - currencies: arrayToggle(state.currencies, payload), + currencies: arrayToggle(state.currencies, payload) }; - case "country": + + case 'country': return { ...state, - countries: arrayToggle(state.countries, payload), + countries: arrayToggle(state.countries, payload) }; - case "special": - case "standard": - case "coins": - case "banknotes": + + case 'special': + case 'standard': + case 'coins': + case 'banknotes': return { ...state, - [key]: !!payload, + [key]: !!payload }; - case "yearRange": + + case 'yearRange': return { ...state, - ...(Array.isArray(payload) && { yearRange: payload }), + ...(Array.isArray(payload) && { yearRange: payload }) }; - case "faceValue": + + case 'faceValue': if (Array.isArray(payload)) { return state; } + if (!payload) { return { ...state, - faceValue: undefined, + faceValue: undefined }; } + return { ...state, - faceValue: payload, + faceValue: payload }; + default: return state; } @@ -107,218 +114,218 @@ const reducer = (state: State, { key, payload }: Action) => { const stringifyState = (state: State) => { const searchParams = new URLSearchParams(); + if (state.search.length) { - searchParams.set("search", state.search); + searchParams.set('search', state.search); } - state.currencies.forEach((currency) => { - searchParams.append("currencies", currency); + + state.currencies.forEach(currency => { + searchParams.append('currencies', currency); }); - state.countries.forEach((country) => { - searchParams.append("countries", country); + + state.countries.forEach(country => { + searchParams.append('countries', country); }); + if (state.faceValue) { - searchParams.set("faceValue", String(state.faceValue)); + searchParams.set('faceValue', String(state.faceValue)); } + if (state.special && !state.standard) { - searchParams.set("special", "yes"); + searchParams.set('special', 'yes'); } + if (!state.special && state.standard) { - searchParams.set("special", "no"); + searchParams.set('special', 'no'); } + if (state.coins && !state.banknotes) { - searchParams.set("category", "coins"); + searchParams.set('category', 'coins'); } + if (!state.coins && state.banknotes) { - searchParams.set("category", "banknotes"); + searchParams.set('category', 'banknotes'); } if (state.yearRange[0] !== 1800 || state.yearRange[1] !== currentYear) { - searchParams.append("yearRange", String(state.yearRange[0])); - searchParams.append("yearRange", String(state.yearRange[1])); + searchParams.append('yearRange', String(state.yearRange[0])); + searchParams.append('yearRange', String(state.yearRange[1])); } + return searchParams.toString(); }; +const parseArray = (value?: string | string[]) => { + if (Array.isArray(value)) { + return value; + } + + return value ? [value] : []; +}; + const getDefaultParams = (query: ParsedUrlQuery) => { return { + banknotes: !query.category || query.category === 'banknotes', + coins: !query.category || query.category === 'coins', + countries: parseArray(query.countries), + currencies: parseArray(query.currencies), + faceValue: validFaceValues.includes(Number(query.faceValue)) + ? (101 * validFaceValues.indexOf(Number(query.faceValue))) / validFaceValues.length + : undefined, + search: typeof query.search === 'string' ? query.search : '', + special: !query.special || query.special === 'yes', + standard: !query.special || query.special === 'no', yearRange: (() => { if (Array.isArray(query.yearRange)) { return [ Math.max(1800, Math.min(currentYear, Number(query.yearRange[0]))), - Math.min(currentYear, Math.max(1800, Number(query.yearRange[1]))), + Math.min(currentYear, Math.max(1800, Number(query.yearRange[1]))) ]; } return [1800, currentYear]; - })() as [number, number], - standard: !query.special || query.special === "no", - special: !query.special || query.special === "yes", - coins: !query.category || query.category === "coins", - banknotes: !query.category || query.category === "banknotes", - currencies: Array.isArray(query.currencies) - ? query.currencies - : query.currencies - ? [query.currencies] - : [], - countries: Array.isArray(query.countries) - ? query.countries - : query.countries - ? [query.countries] - : [], - search: typeof query.search === "string" ? query.search : "", - faceValue: validFaceValues.includes(Number(query.faceValue)) - ? (101 * validFaceValues.indexOf(Number(query.faceValue))) / - validFaceValues.length - : undefined, + })() as [number, number] }; }; -export const Filters = ({ query, filterBanknotes, ...sidebarProps }: Props) => { +export const Filters = ({ filterBanknotes, query, ...sidebarProps }: Props) => { const router = useRouter(); const [state, dispatch] = useReducer(reducer, getDefaultParams(query)); const [validFaceValue, stringifiedState] = useMemo(() => { const validFaceValue = state.faceValue - ? validFaceValues[ - Math.floor((validFaceValues.length * state.faceValue) / 101) - ] + ? validFaceValues[Math.floor((validFaceValues.length * state.faceValue) / 101)] : undefined; - return [ - validFaceValue, - stringifyState({ ...state, faceValue: validFaceValue }), - ]; + + return [validFaceValue, stringifyState({ ...state, faceValue: validFaceValue })]; }, [state]); useEffect(() => { - if (router.asPath !== router.pathname + "?" + stringifiedState) { - router.replace(router.pathname + "?" + stringifiedState, undefined, { - shallow: true, + if (router.asPath !== `${router.pathname}?${stringifiedState}`) { + router.replace(`${router.pathname}?${stringifiedState}`, undefined, { + shallow: true }); } }, [router, stringifiedState]); return ( - -
+ +
{!filterBanknotes && ( -
+
dispatch({ key: "coins", payload }), + name: 'coins', + set: payload => dispatch({ key: 'coins', payload }), + value: state.coins }, { - name: "banknotes", - value: state.banknotes, - set: (payload) => dispatch({ key: "banknotes", payload }), - }, + name: 'banknotes', + set: payload => dispatch({ key: 'banknotes', payload }), + value: state.banknotes + } ]} />
)} -
+
dispatch({ key: "country", payload })} + toggleValue={payload => dispatch({ key: 'country', payload })} />
-
+
dispatch({ key: "currency", payload })} + toggleValue={payload => dispatch({ key: 'currency', payload })} />
-
- +
+ null} pt={{ input: { - root: { style: { width: "100%", pointerEvents: "none" } }, - }, + root: { style: { pointerEvents: 'none', width: '100%' } } + } }} - minFractionDigits={2} + style={{ cursor: 'not-allowed', marginBottom: 8, width: '100%' }} value={validFaceValue} - onChange={() => null} /> dispatch({ key: 'faceValue', payload: value })} value={state.faceValue} - onChange={({ value }) => - dispatch({ key: "faceValue", payload: value }) - } />
-
+
dispatch({ key: "special", payload }), + name: 'special', + set: payload => dispatch({ key: 'special', payload }), + value: state.special }, { - name: "standard", - value: state.standard, - set: (payload) => dispatch({ key: "standard", payload }), - }, + name: 'standard', + set: payload => dispatch({ key: 'standard', payload }), + value: state.standard + } ]} />
-
- +
+
null} pt={{ input: { - root: { style: { width: "100%", pointerEvents: "none" } }, - }, + root: { style: { pointerEvents: 'none', width: '100%' } } + } }} - format={false} + style={{ cursor: 'not-allowed' }} value={state.yearRange[0]} - onChange={() => null} /> - {"-"} + {'-'} null} pt={{ input: { root: { style: { - width: "100%", - textAlign: "right", - pointerEvents: "none", - }, - }, - }, + pointerEvents: 'none', + textAlign: 'right', + width: '100%' + } + } + } }} - format={false} + style={{ cursor: 'not-allowed' }} value={state.yearRange[1]} - onChange={() => null} />
- dispatch({ key: "yearRange", payload: value }) - } - range - min={1800} max={currentYear} + min={1800} + name={'years'} + onChange={({ value }) => dispatch({ key: 'yearRange', payload: value })} + range + value={state.yearRange} />
diff --git a/src/components/filters/multi-select-countries.tsx b/src/components/filters/multi-select-countries.tsx index 831a76f..0ffd2c4 100644 --- a/src/components/filters/multi-select-countries.tsx +++ b/src/components/filters/multi-select-countries.tsx @@ -1,8 +1,8 @@ -import { getFlagEmoji } from "@/core/utils/flags"; -import { Issuer } from "@prisma/client"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { MultiSelect, MultiSelectProps } from "primereact/multiselect"; -import { useMemo } from "react"; +import { Issuer } from '@prisma/client'; +import { MultiSelect, MultiSelectProps } from 'primereact/multiselect'; +import { getFlagEmoji } from '@/core/utils/flags'; +import { useMemo } from 'react'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; type Props = MultiSelectProps & { selectedValues: string[]; @@ -11,56 +11,47 @@ type Props = MultiSelectProps & { const Option = (name: string) => { const queryClient = useQueryClient(); - const country = queryClient - .getQueryData(["countries"]) - ?.find((country) => country.name === name); + const country = queryClient.getQueryData(['countries'])?.find(country => country.name === name); - return getFlagEmoji(country?.iso) + " " + name; + return `${getFlagEmoji(country?.iso)} ${name}`; }; -export const MultiSelectCountriesFilter = ({ - selectedValues, - toggleValue, - ...props -}: Props) => { +export const MultiSelectCountriesFilter = ({ selectedValues, toggleValue, ...props }: Props) => { const { data } = useQuery({ - queryKey: ["countries"], queryFn: async () => { - const res = await fetch("/api/countries"); + const res = await fetch('/api/countries'); + return await res.json(); }, + queryKey: ['countries'] }); - const countries = useMemo( - () => data?.map(({ iso, name }) => getFlagEmoji(iso) + " " + name), - [data], - ); + const countries = useMemo(() => data?.map(({ iso, name }) => `${getFlagEmoji(iso)} ${name}`), [data]); const selectedWithFlags = useMemo( () => selectedValues.map( - (name) => { - const country = data?.find((country) => country.name === name); - return getFlagEmoji(country?.iso) + " " + name; + name => { + const country = data?.find(country => country.name === name); + + return `${getFlagEmoji(country?.iso)} ${name}`; }, - [data], + [data] ), - [data, selectedValues], + [data, selectedValues] ); return ( <> - + - toggleValue(e.selectedOption.split(" ").slice(1).join(" ")) - } - itemTemplate={Option} - options={countries ?? selectedValues} + display={'chip'} filter + itemTemplate={Option} maxSelectedLabels={4} + name={'countries'} + onChange={e => toggleValue(e.selectedOption.split(' ').slice(1).join(' '))} + options={countries ?? selectedValues} + value={selectedWithFlags} {...props} /> diff --git a/src/components/filters/multi-select-currencies.tsx b/src/components/filters/multi-select-currencies.tsx index f1aa6f7..12eeefb 100644 --- a/src/components/filters/multi-select-currencies.tsx +++ b/src/components/filters/multi-select-currencies.tsx @@ -1,35 +1,32 @@ -import { useQuery } from "@tanstack/react-query"; -import { MultiSelect, MultiSelectProps } from "primereact/multiselect"; +import { MultiSelect, MultiSelectProps } from 'primereact/multiselect'; +import { useQuery } from '@tanstack/react-query'; export type Props = MultiSelectProps & { selectedValues: string[]; toggleValue: (value: string) => void; }; -export const MultiSelectCurrenciesFilter = ({ - selectedValues, - toggleValue, - ...props -}: Props) => { +export const MultiSelectCurrenciesFilter = ({ selectedValues, toggleValue, ...props }: Props) => { const { data } = useQuery({ - queryKey: ["currencies"], queryFn: async () => { - const res = await fetch("/api/currencies"); + const res = await fetch('/api/currencies'); + return await res.json(); }, + queryKey: ['currencies'] }); return ( <> - + toggleValue(e.selectedOption)} - options={data ?? selectedValues} + display={'chip'} filter maxSelectedLabels={4} + name={'currencies'} + onChange={e => toggleValue(e.selectedOption)} + options={data ?? selectedValues} + value={selectedValues} {...props} /> diff --git a/src/components/filters/multi-toggle.tsx b/src/components/filters/multi-toggle.tsx index 75ea3d1..bb48ca2 100644 --- a/src/components/filters/multi-toggle.tsx +++ b/src/components/filters/multi-toggle.tsx @@ -1,11 +1,11 @@ -import { Checkbox } from "primereact/checkbox"; +import { Checkbox } from 'primereact/checkbox'; type Props = { baseName: string; items: Array<{ name: string; - value: boolean; set: (value?: boolean) => void; + value: boolean; }>; }; @@ -13,18 +13,15 @@ export const MultiToggleFilter = ({ baseName, items }: Props) => { return ( <> -
- {items.map(({ name, value, set }) => ( -
+
+ {items.map(({ name, set, value }) => ( +
set(target.checked)} - checked={value} + value={name} />
diff --git a/src/components/header/index.tsx b/src/components/header/index.tsx index d951153..0d72fb7 100644 --- a/src/components/header/index.tsx +++ b/src/components/header/index.tsx @@ -1,63 +1,64 @@ -import Link from "next/link"; -import { useRouter } from "next/router"; -import { Button } from "primereact/button"; +import { Button } from 'primereact/button'; +import { useRouter } from 'next/router'; +import Link from 'next/link'; type Props = { - route: "pile" | "showcase"; onOpenDrawer?: () => void; + route: 'pile' | 'showcase'; }; -export const Header = ({ route, onOpenDrawer }: Props) => { +export const Header = ({ onOpenDrawer, route }: Props) => { const router = useRouter(); - const searchParams = router.asPath.split("?")[1] ?? ""; + const searchParams = router.asPath.split('?')[1] ?? ''; + return (
- - + +
- {route !== "pile" && ( + {route !== 'pile' && ( - {"Pile"} - - )} - {route !== "showcase" && ( - - {"Showcase"} + {'Pile'} )} -
); diff --git a/src/components/pile/coin-instances.tsx b/src/components/pile/coin-instances.tsx index 43ec1fb..c47e74b 100644 --- a/src/components/pile/coin-instances.tsx +++ b/src/components/pile/coin-instances.tsx @@ -1,8 +1,8 @@ -import { NumistaType } from "@/types/numista"; -import { CoinInstance } from "../coin"; -import { useEffect, useRef } from "react"; -import { InstancedMesh } from "three"; -import { useCylinder } from "@react-three/cannon"; +import { CoinInstance } from '../coin'; +import { InstancedMesh } from 'three'; +import { NumistaType } from '@/types/numista'; +import { useCylinder } from '@react-three/cannon'; +import { useEffect, useRef } from 'react'; export const CoinInstances = (coinProps: NumistaType) => { const didInit = useRef(false); @@ -15,38 +15,31 @@ export const CoinInstances = (coinProps: NumistaType) => { () => ({ args: [(1 + size) / 16, (1 + size) / 16, thickness / 16, 6], mass: weight, - position: [0, -3, 0], + position: [0, -3, 0] }), - useRef(null), + useRef(null) ); useEffect(() => { if (didInit.current) { return; } + didInit.current = true; Array.from({ length: count }).forEach((_, index) => { - at(index).position.set( - 8 * (Math.random() * 2 - 1), - Math.random() * 8 + 16, - 8 * (Math.random() * 2 - 1), - ); + at(index).position.set(8 * (Math.random() * 2 - 1), Math.random() * 8 + 16, 8 * (Math.random() * 2 - 1)); at(index).rotation.set( Math.PI * (Math.random() * 2 - 1), Math.PI * (Math.random() * 2 - 1), - Math.PI * (Math.random() * 2 - 1), + Math.PI * (Math.random() * 2 - 1) ); + at(index).scaleOverride([size / 16, thickness / 16, size / 16]); }); }, [at, count, size, thickness]); return ( - + ); diff --git a/src/components/pile/index.tsx b/src/components/pile/index.tsx index b33f7be..bfdada7 100644 --- a/src/components/pile/index.tsx +++ b/src/components/pile/index.tsx @@ -1,13 +1,13 @@ -import { Canvas, SpotLightProps } from "@react-three/fiber"; -import { OrbitControls } from "@react-three/drei"; -import { Suspense, useMemo, useRef } from "react"; -import { CoinInstances } from "./coin-instances"; -import { PlaneProps, Physics, usePlane } from "@react-three/cannon"; -import { Mesh, Vector3 } from "three"; -import styles from "./index.module.css"; -import { StageLightModel } from "./stage-light-model"; -import { useNumistaTypes } from "@/core/hooks/use-types"; -import { Message } from "primereact/message"; +import { Canvas, SpotLightProps } from '@react-three/fiber'; +import { CoinInstances } from './coin-instances'; +import { Mesh, Vector3 } from 'three'; +import { Message } from 'primereact/message'; +import { OrbitControls } from '@react-three/drei'; +import { Physics, PlaneProps, usePlane } from '@react-three/cannon'; +import { StageLightModel } from './stage-light-model'; +import { Suspense, useMemo, useRef } from 'react'; +import { useNumistaTypes } from '@/core/hooks/use-types'; +import styles from './index.module.css'; const Plane = (props: PlaneProps) => { const [ref] = usePlane(() => ({ ...props }), useRef(null)); @@ -15,15 +15,15 @@ const Plane = (props: PlaneProps) => { return ( - + ); }; const StageLight = ( - props: Omit & { + props: Omit & { position: readonly [x: number, y: number, z: number]; - }, + } ) => { const pos = new Vector3(...props.position); @@ -31,15 +31,9 @@ const StageLight = ( <> - + - + ); @@ -56,55 +50,46 @@ export const Pile = () => { {count > 200 && (
- {"Existem " + count + " moedas que cumprem estes requisitos."} -
{"Faz uma pesquisa mais específica."} + {`Existem ${count} moedas que cumprem estes requisitos.`} +
{'Faz uma pesquisa mais específica.'} } />
)} - + - + {count < 200 && - coins?.map((coinProps) => ( + coins?.map(coinProps => ( ))} - + ); diff --git a/src/components/pile/stage-light-model.tsx b/src/components/pile/stage-light-model.tsx index 8a10312..522fb1a 100644 --- a/src/components/pile/stage-light-model.tsx +++ b/src/components/pile/stage-light-model.tsx @@ -1,40 +1,36 @@ -import { GroupProps } from "@react-three/fiber"; -import { useGLTF } from "@react-three/drei"; -import { useLayoutEffect, useRef } from "react"; -import { Group } from "three"; +import { Group } from 'three'; +import { GroupProps } from '@react-three/fiber'; +import { useGLTF } from '@react-three/drei'; +import { useLayoutEffect, useRef } from 'react'; export function StageLightModel(props: GroupProps) { // @ts-expect-error properties `nodes` and `materials` actually exist - const { nodes, materials } = useGLTF("/models/stage-light.gltf"); + const { materials, nodes } = useGLTF('/models/stage-light.gltf'); const ref = useRef(null!); useLayoutEffect(() => { - ref.current.lookAt( - 32 * (Math.random() - 0.5), - 32 * (Math.random() - 0.5), - 32 * (Math.random() - 0.5), - ); + ref.current.lookAt(32 * (Math.random() - 0.5), 32 * (Math.random() - 0.5), 32 * (Math.random() - 0.5)); ref.current.rotateY(-Math.PI / 2); }, []); return ( ); } -useGLTF.preload("/models/stage-light.gltf"); +useGLTF.preload('/models/stage-light.gltf'); diff --git a/src/components/showcase/index.tsx b/src/components/showcase/index.tsx index 46ec305..f083fec 100644 --- a/src/components/showcase/index.tsx +++ b/src/components/showcase/index.tsx @@ -1,37 +1,42 @@ -import styles from "./index.module.css"; -import { Canvas } from "@react-three/fiber"; -import { useEffect } from "react"; -import { InfoBox } from "./info-box"; -import { OrbitControls } from "@react-three/drei"; -import { Row } from "./row"; -import { useShowcaseStore } from "./store"; -import { useNumistaTypes } from "@/core/hooks/use-types"; +import { Canvas } from '@react-three/fiber'; +import { InfoBox } from './info-box'; +import { OrbitControls } from '@react-three/drei'; +import { Row } from './row'; +import { useEffect } from 'react'; +import { useNumistaTypes } from '@/core/hooks/use-types'; +import { useShowcaseStore } from './store'; +import styles from './index.module.css'; export const Showcase = () => { - const setTypes = useShowcaseStore((state) => state.setTypes); - const isSpinning = useShowcaseStore((state) => state.isSpinning); - const nextIndex = useShowcaseStore((state) => state.nextIndex); - const previousIndex = useShowcaseStore((state) => state.previousIndex); - const toggleSpin = useShowcaseStore((state) => state.toggleSpin); - const setOrbitControlsRef = useShowcaseStore( - (state) => state.setOrbitControlsRef, - ); + const setTypes = useShowcaseStore(state => state.setTypes); + const isSpinning = useShowcaseStore(state => state.isSpinning); + const nextIndex = useShowcaseStore(state => state.nextIndex); + const previousIndex = useShowcaseStore(state => state.previousIndex); + const toggleSpin = useShowcaseStore(state => state.toggleSpin); + const setOrbitControlsRef = useShowcaseStore(state => state.setOrbitControlsRef); useNumistaTypes({ onSuccess: setTypes }); useEffect(() => { const onKeyDown = ({ key }: KeyboardEvent) => { switch (key) { - case "ArrowLeft": + case 'ArrowLeft': return previousIndex(); - case "ArrowRight": + + case 'ArrowRight': return nextIndex(); - case " ": + + case ' ': return toggleSpin(); + + default: + return; } }; - document.addEventListener("keydown", onKeyDown); - return () => document.removeEventListener("keydown", onKeyDown); + + document.addEventListener('keydown', onKeyDown); + + return () => document.removeEventListener('keydown', onKeyDown); }, [nextIndex, previousIndex, toggleSpin]); return ( @@ -42,11 +47,11 @@ export const Showcase = () => { diff --git a/src/components/showcase/info-box.tsx b/src/components/showcase/info-box.tsx index fe2a38c..bbb8d46 100644 --- a/src/components/showcase/info-box.tsx +++ b/src/components/showcase/info-box.tsx @@ -1,103 +1,94 @@ -import { Button } from "primereact/button"; -import { useShowcaseStore } from "./store"; -import { getFlagEmoji } from "@/core/utils/flags"; +import { Button } from 'primereact/button'; +import { getFlagEmoji } from '@/core/utils/flags'; +import { useShowcaseStore } from './store'; export const InfoBox = () => { - const isSpinning = useShowcaseStore((state) => state.isSpinning); - const getType = useShowcaseStore((state) => state.getType); - const toggleSpin = useShowcaseStore((state) => state.toggleSpin); - const currentIndex = useShowcaseStore((state) => state.currentIndex); - const nextIndex = useShowcaseStore((state) => state.nextIndex); - const previousIndex = useShowcaseStore((state) => state.previousIndex); - const total = useShowcaseStore((state) => state.types.length); + const isSpinning = useShowcaseStore(state => state.isSpinning); + const getType = useShowcaseStore(state => state.getType); + const toggleSpin = useShowcaseStore(state => state.toggleSpin); + const currentIndex = useShowcaseStore(state => state.currentIndex); + const nextIndex = useShowcaseStore(state => state.nextIndex); + const previousIndex = useShowcaseStore(state => state.previousIndex); + const total = useShowcaseStore(state => state.types.length); const currentType = getType(); + if (!currentType) { return; } - const { - issuer, - category, - title, - min_year, - max_year, - count = 1, - weight, - size, - thickness, - } = currentType; + const { category, count = 1, issuer, max_year, min_year, size, thickness, title, weight } = currentType; return (
- {getFlagEmoji(issuer?.iso) + " "} + {`${getFlagEmoji(issuer?.iso)} `} {issuer?.name} -

{title}

-

{min_year !== max_year ? min_year + " - " + max_year : min_year}

- {(count ?? 1) + " in collection"} - {category === "coin" && ( +

{title}

+

{min_year !== max_year ? `${min_year} - ${max_year}` : min_year}

+ {`${count ?? 1} in collection`} + {category === 'coin' && ( <> - {weight &&

{weight + "g"}

} - {size &&

{size + "mm"}

} - {thickness &&

{thickness + "mm"}

} + {weight &&

{`${weight}g`}

} + {size &&

{`${size}mm`}

} + {thickness &&

{`${thickness}mm`}

} )}
diff --git a/src/components/showcase/row.tsx b/src/components/showcase/row.tsx index 22ee085..2fa9c66 100644 --- a/src/components/showcase/row.tsx +++ b/src/components/showcase/row.tsx @@ -1,38 +1,38 @@ -import { MeshProps, useFrame } from "@react-three/fiber"; -import { Suspense, useEffect, useRef, useState } from "react"; -import { CoinInstance } from "@/components/coin"; -import { Mesh } from "three"; -import { BanknoteInstance } from "@/components/banknote"; -import { useShowcaseStore } from "./store"; -import { NumistaType } from "@/types/numista"; -import { usePrevious } from "@/core/hooks/use-previous"; +import { BanknoteInstance } from '@/components/banknote'; +import { CoinInstance } from '@/components/coin'; +import { Mesh } from 'three'; +import { MeshProps, useFrame } from '@react-three/fiber'; +import { NumistaType } from '@/types/numista'; +import { Suspense, useEffect, useRef, useState } from 'react'; +import { usePrevious } from '@/core/hooks/use-previous'; +import { useShowcaseStore } from './store'; const SpinninType = ({ - typeProps, isSelected, + typeProps, ...props }: MeshProps & { - typeProps?: NumistaType; isSelected?: boolean; + typeProps?: NumistaType; }) => { const ref = useRef(null!); - const isSpinning = useShowcaseStore((state) => state.isSpinning); - const isTransitioning = useShowcaseStore((state) => state.isTransitioning); - const Instance = - typeProps?.category === "banknote" ? BanknoteInstance : CoinInstance; + const isSpinning = useShowcaseStore(state => state.isSpinning); + const isTransitioning = useShowcaseStore(state => state.isTransitioning); + const Instance = typeProps?.category === 'banknote' ? BanknoteInstance : CoinInstance; useFrame((_state, delta) => { if (!isSelected || !isSpinning || !typeProps) { return; } - if (typeProps.category === "banknote") { + if (typeProps.category === 'banknote') { ref.current.rotation.x += delta; + return; } switch (typeProps.orientation) { - case "medal": + case 'medal': ref.current.rotation.x += delta; break; @@ -53,14 +53,14 @@ const SpinninType = ({ @@ -71,12 +71,12 @@ const SpinninType = ({ export const Row = () => { const ref = useRef(null!); - const currentIndex = useShowcaseStore((state) => state.currentIndex); - const getType = useShowcaseStore((state) => state.getType); - const isTransitioning = useShowcaseStore((state) => state.isTransitioning); - const endTransition = useShowcaseStore((state) => state.endTransition); - const beginTransition = useShowcaseStore((state) => state.beginTransition); - const types = useShowcaseStore((state) => state.types); + const currentIndex = useShowcaseStore(state => state.currentIndex); + const getType = useShowcaseStore(state => state.getType); + const isTransitioning = useShowcaseStore(state => state.isTransitioning); + const endTransition = useShowcaseStore(state => state.endTransition); + const beginTransition = useShowcaseStore(state => state.beginTransition); + const types = useShowcaseStore(state => state.types); const [spacing, setSpacing] = useState(0); const delayedIndex = usePrevious(currentIndex); @@ -85,11 +85,12 @@ export const Row = () => { setSpacing(Math.sqrt((48 * window.innerWidth) / window.innerHeight)); beginTransition(); }; + updateSpacing(); - window.addEventListener("resize", updateSpacing); + window.addEventListener('resize', updateSpacing); - return () => window.removeEventListener("resize", updateSpacing); + return () => window.removeEventListener('resize', updateSpacing); }, [beginTransition]); useFrame(() => { @@ -112,15 +113,15 @@ export const Row = () => { {types?.map( (type, index) => Math.abs(index - delayedIndex) <= 2 && ( - + - ), + ) )} ); diff --git a/src/components/showcase/store.ts b/src/components/showcase/store.ts index 16cc945..6332f9a 100644 --- a/src/components/showcase/store.ts +++ b/src/components/showcase/store.ts @@ -1,79 +1,81 @@ -import { create } from "zustand"; -import { OrbitControls } from "three-stdlib"; -import { NumistaType } from "@/types/numista"; -import { MutableRefObject, createRef } from "react"; +import { MutableRefObject, createRef } from 'react'; +import { NumistaType } from '@/types/numista'; +import { OrbitControls } from 'three-stdlib'; +import { create } from 'zustand'; interface ShowcaseStore { + beginTransition: () => void; currentIndex: number; endTransition: () => void; - beginTransition: () => void; + getType: (index?: number) => NumistaType | undefined; isSpinning: boolean; isTransitioning: boolean; nextIndex: () => void; - previousIndex: () => void; orbitControlsRef: MutableRefObject; + previousIndex: () => void; setOrbitControlsRef: (ref: OrbitControls | null) => void; + setTypes: (types?: NumistaType[] | null) => void; toggleSpin: () => void; types: NumistaType[]; - setTypes: (types?: NumistaType[] | null) => void; - getType: (index?: number) => NumistaType | undefined; } export const useShowcaseStore = create((set, get) => ({ + beginTransition: () => set(() => ({ isTransitioning: true })), + currentIndex: 0, + endTransition: () => set(() => ({ isTransitioning: false })), + getType: index => { + const { currentIndex, types } = get(); + + return types[index ?? currentIndex]; + }, isSpinning: true, isTransitioning: false, - currentIndex: 0, - types: [], - setTypes: (types) => - set(() => ({ - isSpinning: true, - isTransitioning: true, - currentIndex: 0, - types: Array.isArray(types) ? types : [], - })), - orbitControlsRef: createRef(), nextIndex: () => - set((state) => { + set(state => { state.orbitControlsRef.current?.setAzimuthalAngle(0); state.orbitControlsRef.current?.setPolarAngle(Math.PI / 2); - const currentIndex = Math.min( - state.currentIndex + 1, - state.types.length - 1, - ); + const currentIndex = Math.min(state.currentIndex + 1, state.types.length - 1); + return { currentIndex, - isTransitioning: true, currentType: state.types[currentIndex], + isTransitioning: true }; }), + orbitControlsRef: createRef(), previousIndex: () => - set((state) => { + set(state => { state.orbitControlsRef.current?.setAzimuthalAngle(0); state.orbitControlsRef.current?.setPolarAngle(Math.PI / 2); const currentIndex = Math.max(state.currentIndex - 1, 0); + return { currentIndex, - isTransitioning: true, currentType: state.types[currentIndex], + isTransitioning: true }; }), + setOrbitControlsRef: instance => + set(() => ({ + orbitControlsRef: { current: instance } + })), + setTypes: types => + set(() => ({ + currentIndex: 0, + isSpinning: true, + isTransitioning: true, + types: Array.isArray(types) ? types : [] + })), toggleSpin: () => - set((state) => { + set(state => { if (!state.isSpinning) { state.orbitControlsRef.current?.setAzimuthalAngle(0); state.orbitControlsRef.current?.setPolarAngle(Math.PI / 2); + return { isSpinning: true }; } + return { isSpinning: false }; }), - endTransition: () => set(() => ({ isTransitioning: false })), - beginTransition: () => set(() => ({ isTransitioning: true })), - getType: (index) => { - const { types, currentIndex } = get(); - return types[index ?? currentIndex]; - }, - setOrbitControlsRef: (instance) => - set(() => ({ - orbitControlsRef: { current: instance }, - })), + types: [] })); diff --git a/src/core/hooks/use-media-query.ts b/src/core/hooks/use-media-query.ts index 46c9801..038453b 100644 --- a/src/core/hooks/use-media-query.ts +++ b/src/core/hooks/use-media-query.ts @@ -1,30 +1,25 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState } from 'react'; const breakpoints = { md: 992, ms: 768, - sm: 576, + sm: 576 } as const; type Breakpoint = keyof typeof breakpoints; -export function useMediaQuery( - which: "max" | "min", - breakpoint: Breakpoint, -): boolean { +export function useMediaQuery(which: 'max' | 'min', breakpoint: Breakpoint): boolean { const [matches, setMatches] = useState(false); useEffect(() => { - const media = window.matchMedia( - `(${which}-width: ${breakpoints[breakpoint]}px)`, - ); + const media = window.matchMedia(`(${which}-width: ${breakpoints[breakpoint]}px)`); const listener = () => setMatches(media.matches); listener(); - media.addEventListener("change", listener); + media.addEventListener('change', listener); return () => { - media.removeEventListener("change", listener); + media.removeEventListener('change', listener); }; }, [breakpoint, which]); diff --git a/src/core/hooks/use-previous.ts b/src/core/hooks/use-previous.ts index 72ff0a8..aa2dfdc 100644 --- a/src/core/hooks/use-previous.ts +++ b/src/core/hooks/use-previous.ts @@ -1,4 +1,4 @@ -import { useEffect, useRef } from "react"; +import { useEffect, useRef } from 'react'; export function usePrevious(value: T): T { const ref = useRef(value); diff --git a/src/core/hooks/use-types.ts b/src/core/hooks/use-types.ts index a3a94da..b0903b4 100644 --- a/src/core/hooks/use-types.ts +++ b/src/core/hooks/use-types.ts @@ -1,28 +1,29 @@ -import { NumistaType } from "@/types/numista"; -import { useQuery } from "@tanstack/react-query"; -import { useRouter } from "next/router"; +import { NumistaType } from '@/types/numista'; +import { useQuery } from '@tanstack/react-query'; +import { useRouter } from 'next/router'; export const useNumistaTypes = (options?: { filterBanknotes?: boolean; onSuccess?: (value?: NumistaType[] | null) => void; }) => { const router = useRouter(); - const searchParams = router.asPath.split("?")[1]; + const searchParams = router.asPath.split('?')[1]; const { data: coins } = useQuery({ - queryKey: ["types", searchParams], + keepPreviousData: true, queryFn: async () => { - const res = await fetch("/api/types?" + searchParams ?? ""); + const res = await fetch(`/api/types?${searchParams}` ?? ''); const types = await res.json(); options?.onSuccess?.(types); + return types; }, - keepPreviousData: true, - refetchOnWindowFocus: false, + queryKey: ['types', searchParams], refetchOnReconnect: false, + refetchOnWindowFocus: false }); if (options?.filterBanknotes) { - return coins?.filter(({ category }) => category !== "banknote"); + return coins?.filter(({ category }) => category !== 'banknote'); } return coins; diff --git a/src/core/utils/flags.ts b/src/core/utils/flags.ts index 54cca56..06cdecb 100644 --- a/src/core/utils/flags.ts +++ b/src/core/utils/flags.ts @@ -1,19 +1,21 @@ export function getFlagEmoji(countryCode?: string | null) { if (!countryCode?.length) { - return ""; + return ''; } switch (countryCode) { - case "GB-ENG": - return "🏴󠁧󠁢󠁥󠁮󠁧󠁿"; - case "SUHH": - return "☭"; + case 'GB-ENG': + return '🏴󠁧󠁢󠁥󠁮󠁧󠁿'; + + case 'SUHH': + return '☭'; + default: return String.fromCodePoint( ...countryCode .toUpperCase() - .split("") - .map((char) => 127397 + char.charCodeAt(0)), + .split('') + .map(char => 127397 + char.charCodeAt(0)) ); } } diff --git a/src/core/utils/numista.ts b/src/core/utils/numista.ts index a5915fe..12ff157 100644 --- a/src/core/utils/numista.ts +++ b/src/core/utils/numista.ts @@ -1,4 +1,4 @@ -import { NumistaType } from "@/types/numista"; +import { NumistaType } from '@/types/numista'; export const sortTypes = (types: NumistaType[]) => types @@ -6,31 +6,34 @@ export const sortTypes = (types: NumistaType[]) => if (a.value?.numeric_value && b.value?.numeric_value) { return a.value.numeric_value - b.value.numeric_value; } + return 0; }) .sort((a, b) => { if (a.value?.currency?.full_name && b.value?.currency?.full_name) { - return a.value.currency.full_name.localeCompare( - b.value.currency.full_name, - ); + return a.value.currency.full_name.localeCompare(b.value.currency.full_name); } + return 0; }) .sort((a, b) => { if (a.issuer && b.issuer) { return a.issuer.name.localeCompare(b.issuer.name); } + return 0; }) .sort((a, b) => { if (a.max_year && b.max_year) { return a.max_year - b.max_year; } + return 0; }) .sort((a, b) => { if (a.min_year && b.min_year) { return a.min_year - b.min_year; } + return 0; }); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 27ea458..09fcaff 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,13 +1,12 @@ -import "@/styles/globals.css"; -import "@/styles/theme.css"; -import "primereact/resources/primereact.min.css"; -import "primeicons/primeicons.css"; -import type { AppContext, AppProps } from "next/app"; -import App from "next/app"; -import Div100vh from "react-div-100vh"; -import { PrimeReactProvider } from "primereact/api"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import '@/styles/globals.css'; +import '@/styles/theme.css'; +import 'primeicons/primeicons.css'; +import 'primereact/resources/primereact.min.css'; +import { PrimeReactProvider } from 'primereact/api'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import App, { AppContext, AppProps } from 'next/app'; +import Div100vh from 'react-div-100vh'; const queryClient = new QueryClient(); @@ -28,8 +27,9 @@ MyApp.getInitialProps = async (appContext: AppContext) => { const appProps = await App.getInitialProps(appContext); if (appContext.ctx.res?.statusCode === 404) { - appContext.ctx.res.writeHead(302, { Location: "/" }); + appContext.ctx.res.writeHead(302, { Location: '/' }); appContext.ctx.res.end(); + return; } diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index b2fff8b..32dc903 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -1,8 +1,8 @@ -import { Html, Head, Main, NextScript } from "next/document"; +import { Head, Html, Main, NextScript } from 'next/document'; export default function Document() { return ( - +
diff --git a/src/pages/api/countries.ts b/src/pages/api/countries.ts index cb5f452..6dad18e 100644 --- a/src/pages/api/countries.ts +++ b/src/pages/api/countries.ts @@ -1,13 +1,16 @@ -import { getCountries } from "@/api/countries/get-countries"; -import type { NextApiHandler } from "next"; +/* eslint-disable no-console */ +import { NextApiHandler } from 'next'; +import { getCountries } from '@/api/countries/get-countries'; const handler: NextApiHandler = async ({ query }, res) => { if (Array.isArray(query.filter)) { res.status(400).json({ - message: `Invalid filter ${JSON.stringify(query.filter)}`, + message: `Invalid filter ${JSON.stringify(query.filter)}` }); + return; } + try { const countries = await getCountries(query.filter); @@ -15,8 +18,8 @@ const handler: NextApiHandler = async ({ query }, res) => { } catch (error) { console.error(error); res.status(500).json({ - message: `Something went wrong`, error: String(error), + message: `Something went wrong` }); } }; diff --git a/src/pages/api/country-counts.ts b/src/pages/api/country-counts.ts index 45f2f9a..2155ff1 100644 --- a/src/pages/api/country-counts.ts +++ b/src/pages/api/country-counts.ts @@ -1,5 +1,6 @@ -import { getCountryCounts } from "@/api/countries/get-country-counts"; -import type { NextApiHandler } from "next"; +/* eslint-disable no-console */ +import { NextApiHandler } from 'next'; +import { getCountryCounts } from '@/api/countries/get-country-counts'; const handler: NextApiHandler = async (_req, res) => { try { @@ -9,8 +10,8 @@ const handler: NextApiHandler = async (_req, res) => { } catch (error) { console.error(error); res.status(500).json({ - message: `Something went wrong`, error: String(error), + message: `Something went wrong` }); } }; diff --git a/src/pages/api/currencies.ts b/src/pages/api/currencies.ts index a2adc2f..7e19df7 100644 --- a/src/pages/api/currencies.ts +++ b/src/pages/api/currencies.ts @@ -1,13 +1,16 @@ -import { getCurrencies } from "@/api/currencies/get-currencies"; -import type { NextApiHandler } from "next"; +/* eslint-disable no-console */ +import { NextApiHandler } from 'next'; +import { getCurrencies } from '@/api/currencies/get-currencies'; const handler: NextApiHandler = async ({ query }, res) => { if (Array.isArray(query.filter)) { res.status(400).json({ - message: `Invalid filter ${JSON.stringify(query.filter)}`, + message: `Invalid filter ${JSON.stringify(query.filter)}` }); + return; } + try { const currencies = await getCurrencies(query.filter); @@ -15,8 +18,8 @@ const handler: NextApiHandler = async ({ query }, res) => { } catch (error) { console.error(error); res.status(500).json({ - message: `Something went wrong`, error: String(error), + message: `Something went wrong` }); } }; diff --git a/src/pages/api/merge-textures/[id].ts b/src/pages/api/merge-textures/[id].ts index 28b76ad..cce6e6f 100644 --- a/src/pages/api/merge-textures/[id].ts +++ b/src/pages/api/merge-textures/[id].ts @@ -1,19 +1,20 @@ -import type { NextApiHandler } from "next"; -import { readFile } from "fs/promises"; -import path from "path"; -import { spawn } from "child_process"; -import { getType } from "@/api/types/get-type"; +/* eslint-disable no-console */ +import { NextApiHandler } from 'next'; +import { getType } from '@/api/types/get-type'; +import { readFile } from 'fs/promises'; +import { spawn } from 'child_process'; +import path from 'path'; const asyncSpawn = (command: string, args: string[]) => { return new Promise((resolve, reject) => { const child = spawn(command, args, { - stdio: "inherit", + stdio: 'inherit' }); - child.on("error", reject); - child.stdout?.on("data", process.stdout.write); - child.stderr?.on("data", process.stderr.write); - child.on("close", (code) => { + child.on('error', reject); + child.stdout?.on('data', process.stdout.write); + child.stderr?.on('data', process.stderr.write); + child.on('close', code => { if (code === 0) { resolve(code); } else { @@ -25,7 +26,7 @@ const asyncSpawn = (command: string, args: string[]) => { const getPreviousResult = async (id: number) => { try { - return await readFile(path.join("./public/photos/joined", id + ".jpg")); + return await readFile(path.join('./public/photos/joined', `${id}.jpg`)); } catch { return; } @@ -45,78 +46,79 @@ const generateImage = async (id: number) => { } if (coin.obverse?.picture) { - await asyncSpawn("convert", [ - path.join("./public", coin.obverse.picture), - "-resize", - "256x256!", - path.join("./public/photos/joined", id + "-obverse.jpg"), + await asyncSpawn('convert', [ + path.join('./public', coin.obverse.picture), + '-resize', + '256x256!', + path.join('./public/photos/joined', `${id}-obverse.jpg`) ]); } else { - await asyncSpawn("convert", [ - "-size", - "512x64", - "xc:" + coin.color, - path.join("./public/photos/joined", id + "-edge.jpg"), + await asyncSpawn('convert', [ + '-size', + '512x64', + `xc:${coin.color}`, + path.join('./public/photos/joined', `${id}-edge.jpg`) ]); } if (coin.reverse?.picture) { - await asyncSpawn("convert", [ - path.join("./public", coin.reverse.picture), - "-resize", - "256x256!", - ...(coin.orientation === "coin" ? ["-rotate", "180"] : []), - path.join("./public/photos/joined", id + "-reverse.jpg"), + await asyncSpawn('convert', [ + path.join('./public', coin.reverse.picture), + '-resize', + '256x256!', + ...(coin.orientation === 'coin' ? ['-rotate', '180'] : []), + path.join('./public/photos/joined', `${id}-reverse.jpg`) ]); } else { - await asyncSpawn("convert", [ - "-size", - "512x64", - "xc:" + coin.color, - path.join("./public/photos/joined", id + "-edge.jpg"), + await asyncSpawn('convert', [ + '-size', + '512x64', + `xc:${coin.color}`, + path.join('./public/photos/joined', `${id}-edge.jpg`) ]); } if (coin.edge?.picture) { - await asyncSpawn("convert", [ - path.join("./public", coin.edge.picture), - "-resize", - "512x64!", - path.join("./public/photos/joined", id + "-edge.jpg"), + await asyncSpawn('convert', [ + path.join('./public', coin.edge.picture), + '-resize', + '512x64!', + path.join('./public/photos/joined', `${id}-edge.jpg`) ]); } else { - await asyncSpawn("convert", [ - "-size", - "512x64", - "xc:" + coin.color, - path.join("./public/photos/joined", id + "-edge.jpg"), + await asyncSpawn('convert', [ + '-size', + '512x64', + `xc:${coin.color}`, + path.join('./public/photos/joined', `${id}-edge.jpg`) ]); } - await asyncSpawn("convert", [ - path.join("./public/photos/joined", id + "-obverse.jpg"), - path.join("./public/photos/joined", id + "-reverse.jpg"), - "+append", - path.join("./public/photos/joined", id + ".jpg"), + await asyncSpawn('convert', [ + path.join('./public/photos/joined', `${id}-obverse.jpg`), + path.join('./public/photos/joined', `${id}-reverse.jpg`), + '+append', + path.join('./public/photos/joined', `${id}.jpg`) ]); for (let index = 0; index < 4; index++) { - await asyncSpawn("convert", [ - path.join("./public/photos/joined", id + ".jpg"), - path.join("./public/photos/joined", id + "-edge.jpg"), - "-append", - path.join("./public/photos/joined", id + ".jpg"), + await asyncSpawn('convert', [ + path.join('./public/photos/joined', `${id}.jpg`), + path.join('./public/photos/joined', `${id}-edge.jpg`), + '-append', + path.join('./public/photos/joined', `${id}.jpg`) ]); } - return await readFile(path.join("./public/photos/joined", id + ".jpg")); + return await readFile(path.join('./public/photos/joined', `${id}.jpg`)); }; const handler: NextApiHandler = async ({ query }, res) => { if (!Number(query.id)) { res.status(400).json({ - message: `Invalid id ${JSON.stringify(query.id)}`, + message: `Invalid id ${JSON.stringify(query.id)}` }); + return; } @@ -125,17 +127,19 @@ const handler: NextApiHandler = async ({ query }, res) => { if (!image) { res.status(404).json({ - message: `Coin ${JSON.stringify(query.id)} not found`, + message: `Coin ${JSON.stringify(query.id)} not found` }); + return; } - res.setHeader("Content-Type", "image/jpg"); + + res.setHeader('Content-Type', 'image/jpg'); res.status(200).send(image); } catch (error) { console.error(error); res.status(500).json({ - message: `Something went wrong`, error: String(error), + message: `Something went wrong` }); } }; diff --git a/src/pages/api/types.ts b/src/pages/api/types.ts index b4b0573..8147e28 100644 --- a/src/pages/api/types.ts +++ b/src/pages/api/types.ts @@ -1,70 +1,61 @@ -import { getTypes } from "@/api/types/get-types"; -import type { NextApiHandler } from "next"; +/* eslint-disable no-console */ +import { NextApiHandler } from 'next'; +import { getTypes } from '@/api/types/get-types'; const handler: NextApiHandler = async ({ query }, res) => { if (Array.isArray(query.search)) { res.status(400).json({ - message: `Invalid search ${JSON.stringify(query.search)}`, + message: `Invalid search ${JSON.stringify(query.search)}` }); + return; } - if ( - Array.isArray(query.faceValue) || - (query.faceValue && !Number(query.faceValue)) - ) { + + if (Array.isArray(query.faceValue) || (query.faceValue && !Number(query.faceValue))) { res.status(400).json({ - message: `Invalid faceValue ${JSON.stringify(query.faceValue)}`, + message: `Invalid faceValue ${JSON.stringify(query.faceValue)}` }); + return; } - if ( - Array.isArray(query.category) || - (query.category && !["coins", "banknotes"].includes(query.category)) - ) { + + if (Array.isArray(query.category) || (query.category && !['coins', 'banknotes'].includes(query.category))) { res.status(400).json({ - message: `Invalid category ${JSON.stringify(query.category)}`, + message: `Invalid category ${JSON.stringify(query.category)}` }); + return; } - if ( - Array.isArray(query.special) || - (query.special && !["yes", "no", "both"].includes(query.special)) - ) { + + if (Array.isArray(query.special) || (query.special && !['yes', 'no', 'both'].includes(query.special))) { res.status(400).json({ - message: `Invalid special filter ${JSON.stringify(query.special)}`, + message: `Invalid special filter ${JSON.stringify(query.special)}` }); + return; } - if ( - Array.isArray(query.yearRange) && - (query.yearRange.length !== 2 || - query.yearRange.some((year) => !Number(year))) - ) { + + if (Array.isArray(query.yearRange) && (query.yearRange.length !== 2 || query.yearRange.some(year => !Number(year)))) { res.status(400).json({ - message: `Invalid year range ${JSON.stringify(query.yearRange)}`, + message: `Invalid year range ${JSON.stringify(query.yearRange)}` }); + return; } try { const coins = await getTypes({ - search: query.search, - category: query.category as "coins" | "banknotes" | undefined, + category: query.category as 'coins' | 'banknotes' | undefined, faceValue: query.faceValue ? Number(query.faceValue) : undefined, - special: query.special as "yes" | "no" | "both" | undefined, - yearRange: Array.isArray(query.yearRange) - ? (query.yearRange.map(Number) as [number, number]) - : undefined, + search: query.search, + special: query.special as 'yes' | 'no' | 'both' | undefined, + yearRange: Array.isArray(query.yearRange) ? (query.yearRange.map(Number) as [number, number]) : undefined, ...(query.currencies && { - currencies: Array.isArray(query.currencies) - ? query.currencies - : [query.currencies], + currencies: Array.isArray(query.currencies) ? query.currencies : [query.currencies] }), ...(query.countries && { - countries: Array.isArray(query.countries) - ? query.countries - : [query.countries], - }), + countries: Array.isArray(query.countries) ? query.countries : [query.countries] + }) }); if (!coins.length) { @@ -75,8 +66,8 @@ const handler: NextApiHandler = async ({ query }, res) => { } catch (error) { console.error(error); res.status(500).json({ - message: `Something went wrong`, error: String(error), + message: `Something went wrong` }); } }; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 32d2206..6689bab 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,8 +1,8 @@ -import Head from "next/head"; -import { GetStaticProps, NextPage } from "next"; -import { getCountryCounts } from "@/api/countries/get-country-counts"; -import Link from "next/link"; -import { getFlagEmoji } from "@/core/utils/flags"; +import { GetStaticProps, NextPage } from 'next'; +import { getCountryCounts } from '@/api/countries/get-country-counts'; +import { getFlagEmoji } from '@/core/utils/flags'; +import Head from 'next/head'; +import Link from 'next/link'; type Props = { countryCounts: Awaited>; @@ -12,47 +12,41 @@ const CountriesPage: NextPage = ({ countryCounts }) => { return ( <> - Coins - - - + {'Coins'} + + +
- {countryCounts.map((country) => ( -
- - {getFlagEmoji(country.iso) + " " + country.name} - + {countryCounts.map(country => ( +
+ {`${getFlagEmoji(country.iso)} ${country.name}`}
{country.coins?.count ? ( <> - - {"pile (" + country.coins.sum + ")"} - - - {"coins (" + country.coins.count + ")"} + {`pile (${country.coins.sum})`} + + {`coins (${country.coins.count})`} ) : ( @@ -63,12 +57,8 @@ const CountriesPage: NextPage = ({ countryCounts }) => { )} {country.banknotes?.count ? ( - - {"banknotes (" + country.banknotes.count + ")"} + + {`banknotes (${country.banknotes.count})`} ) : (
@@ -86,8 +76,8 @@ export const getStaticProps: GetStaticProps = async () => { return { props: { - countryCounts, - }, + countryCounts + } }; }; diff --git a/src/pages/pile.tsx b/src/pages/pile.tsx index 6ecd317..6ebd93c 100644 --- a/src/pages/pile.tsx +++ b/src/pages/pile.tsx @@ -1,35 +1,34 @@ -import Head from "next/head"; -import { Pile } from "@/components/pile"; -import { GetServerSideProps, NextPage } from "next"; -import { Header } from "@/components/header"; -import { ParsedUrlQuery } from "querystring"; -import styles from "@/styles/search.module.css"; -import { Filters } from "@/components/filters"; -import { useState } from "react"; +import { Filters } from '@/components/filters'; +import { GetServerSidePropsContext, GetServerSidePropsResult, NextPage } from 'next'; +import { Header } from '@/components/header'; +import { ParsedUrlQuery } from 'querystring'; +import { Pile } from '@/components/pile'; +import { useState } from 'react'; +import Head from 'next/head'; +import styles from '@/styles/search.module.css'; -const PilePage: NextPage<{ query: ParsedUrlQuery }> = ({ query }) => { +type Props = { query: ParsedUrlQuery }; + +const PilePage: NextPage = ({ query }) => { const [drawerVisible, setDrawerVisible] = useState(false); return ( <> - Coin pile - - - + {'Coin pile'} + + + -
setDrawerVisible(true)} /> +
setDrawerVisible(true)} route={'pile'} /> setDrawerVisible(false)} className={styles.sidebar} filterBanknotes + onHide={() => setDrawerVisible(false)} query={query} + visible={drawerVisible} /> @@ -37,10 +36,10 @@ const PilePage: NextPage<{ query: ParsedUrlQuery }> = ({ query }) => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ query }) => ({ +export const getServerSideProps = ({ query }: GetServerSidePropsContext): GetServerSidePropsResult => ({ props: { - query, - }, + query + } }); export default PilePage; diff --git a/src/pages/showcase.tsx b/src/pages/showcase.tsx index adc94ef..98c6380 100644 --- a/src/pages/showcase.tsx +++ b/src/pages/showcase.tsx @@ -1,34 +1,33 @@ -import styles from "@/styles/search.module.css"; -import Head from "next/head"; -import { GetServerSideProps, NextPage } from "next"; -import { Showcase } from "@/components/showcase"; -import { Header } from "@/components/header"; -import { useState } from "react"; -import { ParsedUrlQuery } from "querystring"; -import { Filters } from "@/components/filters"; +import { Filters } from '@/components/filters'; +import { GetServerSidePropsContext, GetServerSidePropsResult, NextPage } from 'next'; +import { Header } from '@/components/header'; +import { ParsedUrlQuery } from 'querystring'; +import { Showcase } from '@/components/showcase'; +import { useState } from 'react'; +import Head from 'next/head'; +import styles from '@/styles/search.module.css'; -const CoinsPage: NextPage<{ query: ParsedUrlQuery }> = ({ query }) => { +type Props = { query: ParsedUrlQuery }; + +const ShowcasePage: NextPage = ({ query }) => { const [drawerVisible, setDrawerVisible] = useState(false); return ( <> - Coins - - - + {'Showcase'} + + + -
setDrawerVisible(true)} /> +
setDrawerVisible(true)} route={'showcase'} /> setDrawerVisible(false)} className={styles.sidebar} + onHide={() => setDrawerVisible(false)} query={query} + visible={drawerVisible} /> @@ -36,10 +35,10 @@ const CoinsPage: NextPage<{ query: ParsedUrlQuery }> = ({ query }) => { ); }; -export const getServerSideProps: GetServerSideProps = async ({ query }) => ({ +export const getServerSideProps = ({ query }: GetServerSidePropsContext): GetServerSidePropsResult => ({ props: { - query, - }, + query + } }); -export default CoinsPage; +export default ShowcasePage; diff --git a/src/styles/theme.css b/src/styles/theme.css index e184f46..fade2cc 100644 --- a/src/styles/theme.css +++ b/src/styles/theme.css @@ -9,8 +9,8 @@ --text-color-secondary: rgba(255, 255, 255, 0.6); --primary-color: #e5a50a; --primary-color-text: #1c2127; - --font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, - Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; + --font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, + Segoe UI Emoji, Segoe UI Symbol; --surface-0: #040d19; --surface-50: #1d2530; --surface-100: #363d47; @@ -51,8 +51,8 @@ box-sizing: border-box; } .p-component { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, - Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 1rem; font-weight: normal; } @@ -79,8 +79,8 @@ } .p-link { font-size: 1rem; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, - Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; border-radius: 8px; } .p-link:focus { @@ -253,12 +253,9 @@ .p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-input-token { padding: 0.375rem 0; } -.p-autocomplete - .p-autocomplete-multiple-container - .p-autocomplete-input-token - input { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, - Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-input-token input { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 1rem; color: rgba(255, 255, 255, 0.87); padding: 0; @@ -271,10 +268,7 @@ color: rgba(255, 255, 255, 0.87); border-radius: 8px; } -.p-autocomplete - .p-autocomplete-multiple-container - .p-autocomplete-token - .p-autocomplete-token-icon { +.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-token .p-autocomplete-token-icon { margin-left: 0.5rem; } .p-autocomplete.p-invalid.p-component > .p-inputtext { @@ -386,14 +380,8 @@ font-weight: 700; padding: 0.5rem; } -.p-datepicker - .p-datepicker-header - .p-datepicker-title - .p-datepicker-year:enabled:hover, -.p-datepicker - .p-datepicker-header - .p-datepicker-title - .p-datepicker-month:enabled:hover { +.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year:enabled:hover, +.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month:enabled:hover { color: #e5a50a; } .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month { @@ -521,40 +509,26 @@ padding-right: 0; border-left: 0 none; } -.p-datepicker:not(.p-disabled) - table - td - span:not(.p-highlight):not(.p-disabled):hover { +.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); } -.p-datepicker:not(.p-disabled) - table - td - span:not(.p-highlight):not(.p-disabled):focus { +.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled):focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); } -.p-datepicker:not(.p-disabled) - .p-monthpicker - .p-monthpicker-month:not(.p-disabled):not(.p-highlight):hover { +.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled):not(.p-highlight):hover { background: rgba(255, 255, 255, 0.03); } -.p-datepicker:not(.p-disabled) - .p-monthpicker - .p-monthpicker-month:not(.p-disabled):focus { +.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled):focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); } -.p-datepicker:not(.p-disabled) - .p-yearpicker - .p-yearpicker-year:not(.p-disabled):not(.p-highlight):hover { +.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled):not(.p-highlight):hover { background: rgba(255, 255, 255, 0.03); } -.p-datepicker:not(.p-disabled) - .p-yearpicker - .p-yearpicker-year:not(.p-disabled):focus { +.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled):focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); @@ -627,42 +601,26 @@ transition: box-shadow 0.2s; border-radius: 0; } -.p-cascadeselect-panel - .p-cascadeselect-items - .p-cascadeselect-item - .p-cascadeselect-item-content { +.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-item-content { padding: 0.75rem 1.25rem; } -.p-cascadeselect-panel - .p-cascadeselect-items - .p-cascadeselect-item - .p-cascadeselect-item-content:focus { +.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-item-content:focus { outline: 0 none; outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); } -.p-cascadeselect-panel - .p-cascadeselect-items - .p-cascadeselect-item.p-highlight { +.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item.p-highlight { color: rgba(255, 255, 255, 0.87); background: rgba(165, 180, 252, 0.16); } -.p-cascadeselect-panel - .p-cascadeselect-items - .p-cascadeselect-item:not(.p-highlight):not(.p-disabled):hover { +.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:not(.p-highlight):not(.p-disabled):hover { color: rgba(255, 255, 255, 0.87); background: rgba(255, 255, 255, 0.03); } -.p-cascadeselect-panel - .p-cascadeselect-items - .p-cascadeselect-item - .p-cascadeselect-group-icon { +.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-group-icon { font-size: 0.875rem; } -.p-cascadeselect-panel - .p-cascadeselect-items - .p-cascadeselect-item - .p-cascadeselect-group-icon.p-icon { +.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-group-icon.p-icon { width: 0.875rem; height: 0.875rem; } @@ -736,9 +694,7 @@ .p-input-filled .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover { background-color: #0b213f; } -.p-input-filled - .p-checkbox:not(.p-checkbox-disabled) - .p-checkbox-box.p-highlight:hover { +.p-input-filled .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box.p-highlight:hover { background: #ce9509; } .p-chips .p-chips-multiple-container { @@ -767,8 +723,8 @@ padding: 0.375rem 0; } .p-chips .p-chips-multiple-container .p-chips-input-token input { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, - Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 1rem; color: rgba(255, 255, 255, 0.87); padding: 0; @@ -869,17 +825,11 @@ right: 0.75rem; color: rgba(255, 255, 255, 0.6); } -.p-dropdown-panel - .p-dropdown-header - .p-dropdown-clearable-filter - .p-dropdown-filter { +.p-dropdown-panel .p-dropdown-header .p-dropdown-clearable-filter .p-dropdown-filter { padding-right: 3.5rem; margin-right: -3.5rem; } -.p-dropdown-panel - .p-dropdown-header - .p-dropdown-clearable-filter - .p-dropdown-filter-clear-icon { +.p-dropdown-panel .p-dropdown-header .p-dropdown-clearable-filter .p-dropdown-filter-clear-icon { right: 2.5rem; } .p-dropdown-panel .p-dropdown-items { @@ -898,9 +848,7 @@ color: rgba(255, 255, 255, 0.87); background: rgba(165, 180, 252, 0.16); } -.p-dropdown-panel - .p-dropdown-items - .p-dropdown-item:not(.p-highlight):not(.p-disabled):hover { +.p-dropdown-panel .p-dropdown-items .p-dropdown-item:not(.p-highlight):not(.p-disabled):hover { color: rgba(255, 255, 255, 0.87); background: rgba(255, 255, 255, 0.03); } @@ -946,50 +894,25 @@ border: 0 none; color: rgba(255, 255, 255, 0.6); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker - .ql-picker-label:hover { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label:hover { color: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker - .ql-picker-label:hover - .ql-stroke { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label:hover .ql-stroke { stroke: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker - .ql-picker-label:hover - .ql-fill { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label:hover .ql-fill { fill: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded - .ql-picker-label { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { color: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded - .ql-picker-label - .ql-stroke { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { stroke: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded - .ql-picker-label - .ql-fill { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { fill: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded - .ql-picker-options { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { background: #071426; border: 1px solid #0b213f; box-shadow: @@ -999,25 +922,14 @@ border-radius: 8px; padding: 0.75rem 0; } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded - .ql-picker-options - .ql-picker-item { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options .ql-picker-item { color: rgba(255, 255, 255, 0.87); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded - .ql-picker-options - .ql-picker-item:hover { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options .ql-picker-item:hover { color: rgba(255, 255, 255, 0.87); background: rgba(255, 255, 255, 0.03); } -.p-editor-container - .p-editor-toolbar.ql-snow - .ql-picker.ql-expanded:not(.ql-icon-picker) - .ql-picker-item { +.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded:not(.ql-icon-picker) .ql-picker-item { padding: 0.75rem 1.25rem; } .p-editor-container .p-editor-content { @@ -1061,14 +973,8 @@ fill: #e5a50a; } .p-editor-container .ql-snow.ql-toolbar button.ql-active .ql-picker-label, -.p-editor-container - .ql-snow.ql-toolbar - .ql-picker-label.ql-active - .ql-picker-label, -.p-editor-container - .ql-snow.ql-toolbar - .ql-picker-item.ql-selected - .ql-picker-label { +.p-editor-container .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-picker-label, +.p-editor-container .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-picker-label { color: #e5a50a; } .p-inputgroup-addon { @@ -1176,16 +1082,15 @@ .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before { background: rgba(255, 255, 255, 0.87); } -.p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover - .p-inputswitch-slider { +.p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider { background: #da9d0a; } .p-inputswitch.p-invalid .p-inputswitch-slider { border-color: #fca5a5; } .p-inputtext { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, - Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 1rem; color: rgba(255, 255, 255, 0.87); background: #040d19; @@ -1331,8 +1236,7 @@ color: rgba(255, 255, 255, 0.87); background: rgba(0, 0, 0, 0); } -.p-listbox:not(.p-disabled) - .p-listbox-item:not(.p-highlight):not(.p-disabled):hover { +.p-listbox:not(.p-disabled) .p-listbox-item:not(.p-highlight):not(.p-disabled):hover { color: rgba(255, 255, 255, 0.87); background: rgba(255, 255, 255, 0.03); } @@ -1409,9 +1313,7 @@ color: rgba(255, 255, 255, 0.87); border-radius: 16px; } -.p-multiselect.p-multiselect-chip - .p-multiselect-token - .p-multiselect-token-icon { +.p-multiselect.p-multiselect-chip .p-multiselect-token .p-multiselect-token-icon { margin-left: 0.5rem; } .p-multiselect .p-multiselect-trigger { @@ -1431,12 +1333,10 @@ .p-inputwrapper-filled.p-multiselect.p-multiselect-chip .p-multiselect-label { padding: 0.375rem 0.75rem; } -.p-inputwrapper-filled.p-multiselect.p-multiselect-chip - .p-multiselect-label.p-multiselect-items-label { +.p-inputwrapper-filled.p-multiselect.p-multiselect-chip .p-multiselect-label.p-multiselect-items-label { padding: 0.75rem 0.75rem; } -.p-inputwrapper-filled.p-multiselect.p-multiselect-clearable - .p-multiselect-label { +.p-inputwrapper-filled.p-multiselect.p-multiselect-clearable .p-multiselect-label { padding-right: 1.75rem; } .p-multiselect-panel { @@ -1461,16 +1361,10 @@ .p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container { margin: 0 0.5rem; } -.p-multiselect-panel - .p-multiselect-header - .p-multiselect-filter-container - .p-inputtext { +.p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container .p-inputtext { padding-right: 1.75rem; } -.p-multiselect-panel - .p-multiselect-header - .p-multiselect-filter-container - .p-multiselect-filter-icon { +.p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container .p-multiselect-filter-icon { right: 0.75rem; color: rgba(255, 255, 255, 0.6); } @@ -1512,9 +1406,7 @@ color: rgba(255, 255, 255, 0.87); background: rgba(165, 180, 252, 0.16); } -.p-multiselect-panel - .p-multiselect-items - .p-multiselect-item:not(.p-highlight):not(.p-disabled):hover { +.p-multiselect-panel .p-multiselect-items .p-multiselect-item:not(.p-highlight):not(.p-disabled):hover { color: rgba(255, 255, 255, 0.87); background: rgba(255, 255, 255, 0.03); } @@ -1630,9 +1522,7 @@ .p-input-filled .p-radiobutton .p-radiobutton-box.p-highlight { background: #e5a50a; } -.p-input-filled - .p-radiobutton - .p-radiobutton-box.p-highlight:not(.p-disabled):hover { +.p-input-filled .p-radiobutton .p-radiobutton-box.p-highlight:not(.p-disabled):hover { background: #ce9509; } .p-rating { @@ -1662,14 +1552,10 @@ .p-rating .p-rating-item.p-rating-item-active .p-rating-icon { color: #e5a50a; } -.p-rating:not(.p-disabled):not(.p-readonly) - .p-rating-item:hover - .p-rating-icon { +.p-rating:not(.p-disabled):not(.p-readonly) .p-rating-item:hover .p-rating-icon { color: #e5a50a; } -.p-rating:not(.p-disabled):not(.p-readonly) - .p-rating-item:hover - .p-rating-icon.p-rating-cancel { +.p-rating:not(.p-disabled):not(.p-readonly) .p-rating-item:hover .p-rating-icon.p-rating-cancel { color: #f48fb1; } .p-selectbutton .p-button { @@ -1691,12 +1577,8 @@ border-color: #0b213f; color: rgba(255, 255, 255, 0.87); } -.p-selectbutton - .p-button:not(.p-disabled):not(.p-highlight):hover - .p-button-icon-left, -.p-selectbutton - .p-button:not(.p-disabled):not(.p-highlight):hover - .p-button-icon-right { +.p-selectbutton .p-button:not(.p-disabled):not(.p-highlight):hover .p-button-icon-left, +.p-selectbutton .p-button:not(.p-disabled):not(.p-highlight):hover .p-button-icon-right { color: rgba(255, 255, 255, 0.6); } .p-selectbutton .p-button.p-highlight { @@ -1835,16 +1717,10 @@ .p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container { margin-right: 0.5rem; } -.p-treeselect-panel - .p-treeselect-header - .p-treeselect-filter-container - .p-treeselect-filter { +.p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container .p-treeselect-filter { padding-right: 1.75rem; } -.p-treeselect-panel - .p-treeselect-header - .p-treeselect-filter-container - .p-treeselect-filter-icon { +.p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container .p-treeselect-filter-icon { right: 0.75rem; color: rgba(255, 255, 255, 0.6); } @@ -1918,10 +1794,8 @@ border-color: #0b213f; color: rgba(255, 255, 255, 0.87); } -.p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover - .p-button-icon-left, -.p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover - .p-button-icon-right { +.p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover .p-button-icon-left, +.p-togglebutton.p-button:not(.p-disabled):not(.p-highlight):hover .p-button-icon-right { color: rgba(255, 255, 255, 0.6); } .p-togglebutton.p-button.p-highlight { @@ -1992,16 +1866,12 @@ border-color: rgba(255, 255, 255, 0.6); } .p-button.p-button-outlined.p-button-plain:enabled:hover, -.p-button.p-button-outlined.p-button-plain:not(button):not(a):not( - .p-disabled - ):hover { +.p-button.p-button-outlined.p-button-plain:not(button):not(a):not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.6); } .p-button.p-button-outlined.p-button-plain:enabled:active, -.p-button.p-button-outlined.p-button-plain:not(button):not(a):not( - .p-disabled - ):active { +.p-button.p-button-outlined.p-button-plain:not(button):not(a):not(.p-disabled):active { background: rgba(255, 255, 255, 0.16); color: rgba(255, 255, 255, 0.6); } @@ -2026,16 +1896,12 @@ color: rgba(255, 255, 255, 0.6); } .p-button.p-button-text.p-button-plain:enabled:hover, -.p-button.p-button-text.p-button-plain:not(button):not(a):not( - .p-disabled - ):hover { +.p-button.p-button-text.p-button-plain:not(button):not(a):not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.6); } .p-button.p-button-text.p-button-plain:enabled:active, -.p-button.p-button-text.p-button-plain:not(button):not(a):not( - .p-disabled - ):active { +.p-button.p-button-text.p-button-plain:not(button):not(a):not(.p-disabled):active { background: rgba(255, 255, 255, 0.16); color: rgba(255, 255, 255, 0.6); } @@ -2140,15 +2006,11 @@ .p-button.p-button-secondary:enabled:hover, .p-button.p-button-secondary:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-secondary > .p-button:enabled:hover, -.p-buttonset.p-button-secondary - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-secondary > .p-button:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-secondary > .p-button:enabled:hover, -.p-splitbutton.p-button-secondary - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-secondary > .p-button:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-secondary:enabled:hover, -.p-fileupload-choose.p-button-secondary:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-secondary:not(button):not(a):not(.p-disabled):hover { background: #b0bfd1; color: #1c2127; border-color: #b0bfd1; @@ -2156,29 +2018,21 @@ .p-button.p-button-secondary:enabled:focus, .p-button.p-button-secondary:not(button):not(a):not(.p-disabled):focus, .p-buttonset.p-button-secondary > .p-button:enabled:focus, -.p-buttonset.p-button-secondary - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-buttonset.p-button-secondary > .p-button:not(button):not(a):not(.p-disabled):focus, .p-splitbutton.p-button-secondary > .p-button:enabled:focus, -.p-splitbutton.p-button-secondary - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-splitbutton.p-button-secondary > .p-button:not(button):not(a):not(.p-disabled):focus, .p-fileupload-choose.p-button-secondary:enabled:focus, -.p-fileupload-choose.p-button-secondary:not(button):not(a):not( - .p-disabled - ):focus { +.p-fileupload-choose.p-button-secondary:not(button):not(a):not(.p-disabled):focus { box-shadow: 0 0 0 1px #dbe2ea; } .p-button.p-button-secondary:enabled:active, .p-button.p-button-secondary:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-secondary > .p-button:enabled:active, -.p-buttonset.p-button-secondary - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-secondary > .p-button:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-secondary > .p-button:enabled:active, -.p-splitbutton.p-button-secondary - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-secondary > .p-button:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-secondary:enabled:active, -.p-fileupload-choose.p-button-secondary:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-secondary:not(button):not(a):not(.p-disabled):active { background: #95a9c2; color: #1c2127; border-color: #95a9c2; @@ -2192,37 +2046,25 @@ border: 1px solid; } .p-button.p-button-secondary.p-button-outlined:enabled:hover, -.p-button.p-button-secondary.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-secondary.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-secondary > .p-button.p-button-outlined:enabled:hover, -.p-buttonset.p-button-secondary - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-secondary > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-secondary > .p-button.p-button-outlined:enabled:hover, -.p-splitbutton.p-button-secondary - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-secondary > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-secondary.p-button-outlined:enabled:hover, -.p-fileupload-choose.p-button-secondary.p-button-outlined:not(button):not( - a - ):not(.p-disabled):hover { +.p-fileupload-choose.p-button-secondary.p-button-outlined:not(button):not(a):not(.p-disabled):hover { background: rgba(203, 213, 225, 0.04); color: #cbd5e1; border: 1px solid; } .p-button.p-button-secondary.p-button-outlined:enabled:active, -.p-button.p-button-secondary.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-secondary.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-secondary > .p-button.p-button-outlined:enabled:active, -.p-buttonset.p-button-secondary - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-secondary > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-secondary > .p-button.p-button-outlined:enabled:active, -.p-splitbutton.p-button-secondary - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-secondary > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-secondary.p-button-outlined:enabled:active, -.p-fileupload-choose.p-button-secondary.p-button-outlined:not(button):not( - a - ):not(.p-disabled):active { +.p-fileupload-choose.p-button-secondary.p-button-outlined:not(button):not(a):not(.p-disabled):active { background: rgba(203, 213, 225, 0.16); color: #cbd5e1; border: 1px solid; @@ -2236,37 +2078,25 @@ border-color: rgba(0, 0, 0, 0); } .p-button.p-button-secondary.p-button-text:enabled:hover, -.p-button.p-button-secondary.p-button-text:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-secondary.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-secondary > .p-button.p-button-text:enabled:hover, -.p-buttonset.p-button-secondary - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-secondary > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-secondary > .p-button.p-button-text:enabled:hover, -.p-splitbutton.p-button-secondary - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-secondary > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-secondary.p-button-text:enabled:hover, -.p-fileupload-choose.p-button-secondary.p-button-text:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-secondary.p-button-text:not(button):not(a):not(.p-disabled):hover { background: rgba(203, 213, 225, 0.04); border-color: rgba(0, 0, 0, 0); color: #cbd5e1; } .p-button.p-button-secondary.p-button-text:enabled:active, -.p-button.p-button-secondary.p-button-text:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-secondary.p-button-text:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-secondary > .p-button.p-button-text:enabled:active, -.p-buttonset.p-button-secondary - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-secondary > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-secondary > .p-button.p-button-text:enabled:active, -.p-splitbutton.p-button-secondary - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-secondary > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-secondary.p-button-text:enabled:active, -.p-fileupload-choose.p-button-secondary.p-button-text:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-secondary.p-button-text:not(button):not(a):not(.p-disabled):active { background: rgba(203, 213, 225, 0.16); border-color: rgba(0, 0, 0, 0); color: #cbd5e1; @@ -2282,11 +2112,9 @@ .p-button.p-button-info:enabled:hover, .p-button.p-button-info:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-info > .p-button:enabled:hover, -.p-buttonset.p-button-info - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-info > .p-button:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-info > .p-button:enabled:hover, -.p-splitbutton.p-button-info - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-info > .p-button:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-info:enabled:hover, .p-fileupload-choose.p-button-info:not(button):not(a):not(.p-disabled):hover { background: #6cb0fc; @@ -2296,11 +2124,9 @@ .p-button.p-button-info:enabled:focus, .p-button.p-button-info:not(button):not(a):not(.p-disabled):focus, .p-buttonset.p-button-info > .p-button:enabled:focus, -.p-buttonset.p-button-info - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-buttonset.p-button-info > .p-button:not(button):not(a):not(.p-disabled):focus, .p-splitbutton.p-button-info > .p-button:enabled:focus, -.p-splitbutton.p-button-info - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-splitbutton.p-button-info > .p-button:not(button):not(a):not(.p-disabled):focus, .p-fileupload-choose.p-button-info:enabled:focus, .p-fileupload-choose.p-button-info:not(button):not(a):not(.p-disabled):focus { box-shadow: 0 0 0 1px #b3d6fe; @@ -2308,11 +2134,9 @@ .p-button.p-button-info:enabled:active, .p-button.p-button-info:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-info > .p-button:enabled:active, -.p-buttonset.p-button-info - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-info > .p-button:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-info > .p-button:enabled:active, -.p-splitbutton.p-button-info - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-info > .p-button:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-info:enabled:active, .p-fileupload-choose.p-button-info:not(button):not(a):not(.p-disabled):active { background: #449bfc; @@ -2328,37 +2152,25 @@ border: 1px solid; } .p-button.p-button-info.p-button-outlined:enabled:hover, -.p-button.p-button-info.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-info.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-info > .p-button.p-button-outlined:enabled:hover, -.p-buttonset.p-button-info - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-info > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-info > .p-button.p-button-outlined:enabled:hover, -.p-splitbutton.p-button-info - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-info > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-info.p-button-outlined:enabled:hover, -.p-fileupload-choose.p-button-info.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-info.p-button-outlined:not(button):not(a):not(.p-disabled):hover { background: rgba(147, 197, 253, 0.04); color: #93c5fd; border: 1px solid; } .p-button.p-button-info.p-button-outlined:enabled:active, -.p-button.p-button-info.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-info.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-info > .p-button.p-button-outlined:enabled:active, -.p-buttonset.p-button-info - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-info > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-info > .p-button.p-button-outlined:enabled:active, -.p-splitbutton.p-button-info - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-info > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-info.p-button-outlined:enabled:active, -.p-fileupload-choose.p-button-info.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-info.p-button-outlined:not(button):not(a):not(.p-disabled):active { background: rgba(147, 197, 253, 0.16); color: #93c5fd; border: 1px solid; @@ -2374,33 +2186,23 @@ .p-button.p-button-info.p-button-text:enabled:hover, .p-button.p-button-info.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-info > .p-button.p-button-text:enabled:hover, -.p-buttonset.p-button-info - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-info > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-info > .p-button.p-button-text:enabled:hover, -.p-splitbutton.p-button-info - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-info > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-info.p-button-text:enabled:hover, -.p-fileupload-choose.p-button-info.p-button-text:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-info.p-button-text:not(button):not(a):not(.p-disabled):hover { background: rgba(147, 197, 253, 0.04); border-color: rgba(0, 0, 0, 0); color: #93c5fd; } .p-button.p-button-info.p-button-text:enabled:active, -.p-button.p-button-info.p-button-text:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-info.p-button-text:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-info > .p-button.p-button-text:enabled:active, -.p-buttonset.p-button-info - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-info > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-info > .p-button.p-button-text:enabled:active, -.p-splitbutton.p-button-info - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-info > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-info.p-button-text:enabled:active, -.p-fileupload-choose.p-button-info.p-button-text:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-info.p-button-text:not(button):not(a):not(.p-disabled):active { background: rgba(147, 197, 253, 0.16); border-color: rgba(0, 0, 0, 0); color: #93c5fd; @@ -2416,15 +2218,11 @@ .p-button.p-button-success:enabled:hover, .p-button.p-button-success:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-success > .p-button:enabled:hover, -.p-buttonset.p-button-success - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-success > .p-button:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-success > .p-button:enabled:hover, -.p-splitbutton.p-button-success - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-success > .p-button:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-success:enabled:hover, -.p-fileupload-choose.p-button-success:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-success:not(button):not(a):not(.p-disabled):hover { background: #65eb95; color: #1c2127; border-color: #65eb95; @@ -2432,29 +2230,21 @@ .p-button.p-button-success:enabled:focus, .p-button.p-button-success:not(button):not(a):not(.p-disabled):focus, .p-buttonset.p-button-success > .p-button:enabled:focus, -.p-buttonset.p-button-success - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-buttonset.p-button-success > .p-button:not(button):not(a):not(.p-disabled):focus, .p-splitbutton.p-button-success > .p-button:enabled:focus, -.p-splitbutton.p-button-success - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-splitbutton.p-button-success > .p-button:not(button):not(a):not(.p-disabled):focus, .p-fileupload-choose.p-button-success:enabled:focus, -.p-fileupload-choose.p-button-success:not(button):not(a):not( - .p-disabled - ):focus { +.p-fileupload-choose.p-button-success:not(button):not(a):not(.p-disabled):focus { box-shadow: 0 0 0 1px #aaf4c5; } .p-button.p-button-success:enabled:active, .p-button.p-button-success:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-success > .p-button:enabled:active, -.p-buttonset.p-button-success - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-success > .p-button:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-success > .p-button:enabled:active, -.p-splitbutton.p-button-success - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-success > .p-button:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-success:enabled:active, -.p-fileupload-choose.p-button-success:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-success:not(button):not(a):not(.p-disabled):active { background: #44e67f; color: #1c2127; border-color: #44e67f; @@ -2468,37 +2258,25 @@ border: 1px solid; } .p-button.p-button-success.p-button-outlined:enabled:hover, -.p-button.p-button-success.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-success.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-success > .p-button.p-button-outlined:enabled:hover, -.p-buttonset.p-button-success - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-success > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-success > .p-button.p-button-outlined:enabled:hover, -.p-splitbutton.p-button-success - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-success > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-success.p-button-outlined:enabled:hover, -.p-fileupload-choose.p-button-success.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-success.p-button-outlined:not(button):not(a):not(.p-disabled):hover { background: rgba(134, 239, 172, 0.04); color: #86efac; border: 1px solid; } .p-button.p-button-success.p-button-outlined:enabled:active, -.p-button.p-button-success.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-success.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-success > .p-button.p-button-outlined:enabled:active, -.p-buttonset.p-button-success - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-success > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-success > .p-button.p-button-outlined:enabled:active, -.p-splitbutton.p-button-success - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-success > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-success.p-button-outlined:enabled:active, -.p-fileupload-choose.p-button-success.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-success.p-button-outlined:not(button):not(a):not(.p-disabled):active { background: rgba(134, 239, 172, 0.16); color: #86efac; border: 1px solid; @@ -2512,37 +2290,25 @@ border-color: rgba(0, 0, 0, 0); } .p-button.p-button-success.p-button-text:enabled:hover, -.p-button.p-button-success.p-button-text:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-success.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-success > .p-button.p-button-text:enabled:hover, -.p-buttonset.p-button-success - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-success > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-success > .p-button.p-button-text:enabled:hover, -.p-splitbutton.p-button-success - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-success > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-success.p-button-text:enabled:hover, -.p-fileupload-choose.p-button-success.p-button-text:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-success.p-button-text:not(button):not(a):not(.p-disabled):hover { background: rgba(134, 239, 172, 0.04); border-color: rgba(0, 0, 0, 0); color: #86efac; } .p-button.p-button-success.p-button-text:enabled:active, -.p-button.p-button-success.p-button-text:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-success.p-button-text:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-success > .p-button.p-button-text:enabled:active, -.p-buttonset.p-button-success - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-success > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-success > .p-button.p-button-text:enabled:active, -.p-splitbutton.p-button-success - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-success > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-success.p-button-text:enabled:active, -.p-fileupload-choose.p-button-success.p-button-text:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-success.p-button-text:not(button):not(a):not(.p-disabled):active { background: rgba(134, 239, 172, 0.16); border-color: rgba(0, 0, 0, 0); color: #86efac; @@ -2558,15 +2324,11 @@ .p-button.p-button-warning:enabled:hover, .p-button.p-button-warning:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-warning > .p-button:enabled:hover, -.p-buttonset.p-button-warning - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-warning > .p-button:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-warning > .p-button:enabled:hover, -.p-splitbutton.p-button-warning - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-warning > .p-button:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-warning:enabled:hover, -.p-fileupload-choose.p-button-warning:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-warning:not(button):not(a):not(.p-disabled):hover { background: #fbcb2d; color: #1c2127; border-color: #fbcb2d; @@ -2574,29 +2336,21 @@ .p-button.p-button-warning:enabled:focus, .p-button.p-button-warning:not(button):not(a):not(.p-disabled):focus, .p-buttonset.p-button-warning > .p-button:enabled:focus, -.p-buttonset.p-button-warning - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-buttonset.p-button-warning > .p-button:not(button):not(a):not(.p-disabled):focus, .p-splitbutton.p-button-warning > .p-button:enabled:focus, -.p-splitbutton.p-button-warning - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-splitbutton.p-button-warning > .p-button:not(button):not(a):not(.p-disabled):focus, .p-fileupload-choose.p-button-warning:enabled:focus, -.p-fileupload-choose.p-button-warning:not(button):not(a):not( - .p-disabled - ):focus { +.p-fileupload-choose.p-button-warning:not(button):not(a):not(.p-disabled):focus { box-shadow: 0 0 0 1px #fde082; } .p-button.p-button-warning:enabled:active, .p-button.p-button-warning:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-warning > .p-button:enabled:active, -.p-buttonset.p-button-warning - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-warning > .p-button:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-warning > .p-button:enabled:active, -.p-splitbutton.p-button-warning - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-warning > .p-button:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-warning:enabled:active, -.p-fileupload-choose.p-button-warning:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-warning:not(button):not(a):not(.p-disabled):active { background: #fbc30c; color: #1c2127; border-color: #fbc30c; @@ -2610,37 +2364,25 @@ border: 1px solid; } .p-button.p-button-warning.p-button-outlined:enabled:hover, -.p-button.p-button-warning.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-warning.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-warning > .p-button.p-button-outlined:enabled:hover, -.p-buttonset.p-button-warning - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-warning > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-warning > .p-button.p-button-outlined:enabled:hover, -.p-splitbutton.p-button-warning - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-warning > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-warning.p-button-outlined:enabled:hover, -.p-fileupload-choose.p-button-warning.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-warning.p-button-outlined:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 211, 77, 0.04); color: #fcd34d; border: 1px solid; } .p-button.p-button-warning.p-button-outlined:enabled:active, -.p-button.p-button-warning.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-warning.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-warning > .p-button.p-button-outlined:enabled:active, -.p-buttonset.p-button-warning - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-warning > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-warning > .p-button.p-button-outlined:enabled:active, -.p-splitbutton.p-button-warning - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-warning > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-warning.p-button-outlined:enabled:active, -.p-fileupload-choose.p-button-warning.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-warning.p-button-outlined:not(button):not(a):not(.p-disabled):active { background: rgba(252, 211, 77, 0.16); color: #fcd34d; border: 1px solid; @@ -2654,37 +2396,25 @@ border-color: rgba(0, 0, 0, 0); } .p-button.p-button-warning.p-button-text:enabled:hover, -.p-button.p-button-warning.p-button-text:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-warning.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-warning > .p-button.p-button-text:enabled:hover, -.p-buttonset.p-button-warning - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-warning > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-warning > .p-button.p-button-text:enabled:hover, -.p-splitbutton.p-button-warning - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-warning > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-warning.p-button-text:enabled:hover, -.p-fileupload-choose.p-button-warning.p-button-text:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-warning.p-button-text:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 211, 77, 0.04); border-color: rgba(0, 0, 0, 0); color: #fcd34d; } .p-button.p-button-warning.p-button-text:enabled:active, -.p-button.p-button-warning.p-button-text:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-warning.p-button-text:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-warning > .p-button.p-button-text:enabled:active, -.p-buttonset.p-button-warning - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-warning > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-warning > .p-button.p-button-text:enabled:active, -.p-splitbutton.p-button-warning - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-warning > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-warning.p-button-text:enabled:active, -.p-fileupload-choose.p-button-warning.p-button-text:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-warning.p-button-text:not(button):not(a):not(.p-disabled):active { background: rgba(252, 211, 77, 0.16); border-color: rgba(0, 0, 0, 0); color: #fcd34d; @@ -2700,11 +2430,9 @@ .p-button.p-button-help:enabled:hover, .p-button.p-button-help:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-help > .p-button:enabled:hover, -.p-buttonset.p-button-help - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-help > .p-button:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-help > .p-button:enabled:hover, -.p-splitbutton.p-button-help - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-help > .p-button:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-help:enabled:hover, .p-fileupload-choose.p-button-help:not(button):not(a):not(.p-disabled):hover { background: #c289fd; @@ -2714,11 +2442,9 @@ .p-button.p-button-help:enabled:focus, .p-button.p-button-help:not(button):not(a):not(.p-disabled):focus, .p-buttonset.p-button-help > .p-button:enabled:focus, -.p-buttonset.p-button-help - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-buttonset.p-button-help > .p-button:not(button):not(a):not(.p-disabled):focus, .p-splitbutton.p-button-help > .p-button:enabled:focus, -.p-splitbutton.p-button-help - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-splitbutton.p-button-help > .p-button:not(button):not(a):not(.p-disabled):focus, .p-fileupload-choose.p-button-help:enabled:focus, .p-fileupload-choose.p-button-help:not(button):not(a):not(.p-disabled):focus { box-shadow: 0 0 0 1px #e4cbfe; @@ -2726,11 +2452,9 @@ .p-button.p-button-help:enabled:active, .p-button.p-button-help:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-help > .p-button:enabled:active, -.p-buttonset.p-button-help - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-help > .p-button:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-help > .p-button:enabled:active, -.p-splitbutton.p-button-help - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-help > .p-button:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-help:enabled:active, .p-fileupload-choose.p-button-help:not(button):not(a):not(.p-disabled):active { background: #ab5efd; @@ -2746,37 +2470,25 @@ border: 1px solid; } .p-button.p-button-help.p-button-outlined:enabled:hover, -.p-button.p-button-help.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-help.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-help > .p-button.p-button-outlined:enabled:hover, -.p-buttonset.p-button-help - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-help > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-help > .p-button.p-button-outlined:enabled:hover, -.p-splitbutton.p-button-help - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-help > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-help.p-button-outlined:enabled:hover, -.p-fileupload-choose.p-button-help.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-help.p-button-outlined:not(button):not(a):not(.p-disabled):hover { background: rgba(216, 180, 254, 0.04); color: #d8b4fe; border: 1px solid; } .p-button.p-button-help.p-button-outlined:enabled:active, -.p-button.p-button-help.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-help.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-help > .p-button.p-button-outlined:enabled:active, -.p-buttonset.p-button-help - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-help > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-help > .p-button.p-button-outlined:enabled:active, -.p-splitbutton.p-button-help - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-help > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-help.p-button-outlined:enabled:active, -.p-fileupload-choose.p-button-help.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-help.p-button-outlined:not(button):not(a):not(.p-disabled):active { background: rgba(216, 180, 254, 0.16); color: #d8b4fe; border: 1px solid; @@ -2792,33 +2504,23 @@ .p-button.p-button-help.p-button-text:enabled:hover, .p-button.p-button-help.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-help > .p-button.p-button-text:enabled:hover, -.p-buttonset.p-button-help - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-help > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-help > .p-button.p-button-text:enabled:hover, -.p-splitbutton.p-button-help - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-help > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-help.p-button-text:enabled:hover, -.p-fileupload-choose.p-button-help.p-button-text:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-help.p-button-text:not(button):not(a):not(.p-disabled):hover { background: rgba(216, 180, 254, 0.04); border-color: rgba(0, 0, 0, 0); color: #d8b4fe; } .p-button.p-button-help.p-button-text:enabled:active, -.p-button.p-button-help.p-button-text:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-help.p-button-text:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-help > .p-button.p-button-text:enabled:active, -.p-buttonset.p-button-help - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-help > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-help > .p-button.p-button-text:enabled:active, -.p-splitbutton.p-button-help - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-help > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-help.p-button-text:enabled:active, -.p-fileupload-choose.p-button-help.p-button-text:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-help.p-button-text:not(button):not(a):not(.p-disabled):active { background: rgba(216, 180, 254, 0.16); border-color: rgba(0, 0, 0, 0); color: #d8b4fe; @@ -2834,11 +2536,9 @@ .p-button.p-button-danger:enabled:hover, .p-button.p-button-danger:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-danger > .p-button:enabled:hover, -.p-buttonset.p-button-danger - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-danger > .p-button:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-danger > .p-button:enabled:hover, -.p-splitbutton.p-button-danger - > .p-button:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-danger > .p-button:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-danger:enabled:hover, .p-fileupload-choose.p-button-danger:not(button):not(a):not(.p-disabled):hover { background: #fb7d7d; @@ -2848,11 +2548,9 @@ .p-button.p-button-danger:enabled:focus, .p-button.p-button-danger:not(button):not(a):not(.p-disabled):focus, .p-buttonset.p-button-danger > .p-button:enabled:focus, -.p-buttonset.p-button-danger - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-buttonset.p-button-danger > .p-button:not(button):not(a):not(.p-disabled):focus, .p-splitbutton.p-button-danger > .p-button:enabled:focus, -.p-splitbutton.p-button-danger - > .p-button:not(button):not(a):not(.p-disabled):focus, +.p-splitbutton.p-button-danger > .p-button:not(button):not(a):not(.p-disabled):focus, .p-fileupload-choose.p-button-danger:enabled:focus, .p-fileupload-choose.p-button-danger:not(button):not(a):not(.p-disabled):focus { box-shadow: 0 0 0 1px #fdc0c0; @@ -2860,15 +2558,11 @@ .p-button.p-button-danger:enabled:active, .p-button.p-button-danger:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-danger > .p-button:enabled:active, -.p-buttonset.p-button-danger - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-danger > .p-button:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-danger > .p-button:enabled:active, -.p-splitbutton.p-button-danger - > .p-button:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-danger > .p-button:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-danger:enabled:active, -.p-fileupload-choose.p-button-danger:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-danger:not(button):not(a):not(.p-disabled):active { background: #f95454; color: #1c2127; border-color: #f95454; @@ -2882,37 +2576,25 @@ border: 1px solid; } .p-button.p-button-danger.p-button-outlined:enabled:hover, -.p-button.p-button-danger.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-danger.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-danger > .p-button.p-button-outlined:enabled:hover, -.p-buttonset.p-button-danger - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-danger > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-danger > .p-button.p-button-outlined:enabled:hover, -.p-splitbutton.p-button-danger - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-danger > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-danger.p-button-outlined:enabled:hover, -.p-fileupload-choose.p-button-danger.p-button-outlined:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-danger.p-button-outlined:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 165, 165, 0.04); color: #fca5a5; border: 1px solid; } .p-button.p-button-danger.p-button-outlined:enabled:active, -.p-button.p-button-danger.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-danger.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-danger > .p-button.p-button-outlined:enabled:active, -.p-buttonset.p-button-danger - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-danger > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-danger > .p-button.p-button-outlined:enabled:active, -.p-splitbutton.p-button-danger - > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-danger > .p-button.p-button-outlined:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-danger.p-button-outlined:enabled:active, -.p-fileupload-choose.p-button-danger.p-button-outlined:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-danger.p-button-outlined:not(button):not(a):not(.p-disabled):active { background: rgba(252, 165, 165, 0.16); color: #fca5a5; border: 1px solid; @@ -2926,37 +2608,25 @@ border-color: rgba(0, 0, 0, 0); } .p-button.p-button-danger.p-button-text:enabled:hover, -.p-button.p-button-danger.p-button-text:not(button):not(a):not( - .p-disabled - ):hover, +.p-button.p-button-danger.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-buttonset.p-button-danger > .p-button.p-button-text:enabled:hover, -.p-buttonset.p-button-danger - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-buttonset.p-button-danger > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-splitbutton.p-button-danger > .p-button.p-button-text:enabled:hover, -.p-splitbutton.p-button-danger - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, +.p-splitbutton.p-button-danger > .p-button.p-button-text:not(button):not(a):not(.p-disabled):hover, .p-fileupload-choose.p-button-danger.p-button-text:enabled:hover, -.p-fileupload-choose.p-button-danger.p-button-text:not(button):not(a):not( - .p-disabled - ):hover { +.p-fileupload-choose.p-button-danger.p-button-text:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 165, 165, 0.04); border-color: rgba(0, 0, 0, 0); color: #fca5a5; } .p-button.p-button-danger.p-button-text:enabled:active, -.p-button.p-button-danger.p-button-text:not(button):not(a):not( - .p-disabled - ):active, +.p-button.p-button-danger.p-button-text:not(button):not(a):not(.p-disabled):active, .p-buttonset.p-button-danger > .p-button.p-button-text:enabled:active, -.p-buttonset.p-button-danger - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-buttonset.p-button-danger > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-splitbutton.p-button-danger > .p-button.p-button-text:enabled:active, -.p-splitbutton.p-button-danger - > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, +.p-splitbutton.p-button-danger > .p-button.p-button-text:not(button):not(a):not(.p-disabled):active, .p-fileupload-choose.p-button-danger.p-button-text:enabled:active, -.p-fileupload-choose.p-button-danger.p-button-text:not(button):not(a):not( - .p-disabled - ):active { +.p-fileupload-choose.p-button-danger.p-button-text:not(button):not(a):not(.p-disabled):active { background: rgba(252, 165, 165, 0.16); border-color: rgba(0, 0, 0, 0); color: #fca5a5; @@ -2973,8 +2643,7 @@ border-color: rgba(0, 0, 0, 0); } .p-button.p-button-link:enabled:hover .p-button-label, -.p-button.p-button-link:not(button):not(a):not(.p-disabled):hover - .p-button-label { +.p-button.p-button-link:not(button):not(a):not(.p-disabled):hover .p-button-label { text-decoration: underline; } .p-button.p-button-link:enabled:focus, @@ -2998,14 +2667,12 @@ border: 1px solid; } .p-splitbutton.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(229, 165, 10, 0.04); color: #e5a50a; } .p-splitbutton.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(229, 165, 10, 0.16); color: #e5a50a; } @@ -3014,14 +2681,12 @@ border-color: rgba(255, 255, 255, 0.6); } .p-splitbutton.p-button-outlined.p-button-plain > .p-button:enabled:hover, -.p-splitbutton.p-button-outlined.p-button-plain - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-outlined.p-button-plain > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.6); } .p-splitbutton.p-button-outlined.p-button-plain > .p-button:enabled:active, -.p-splitbutton.p-button-outlined.p-button-plain - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-outlined.p-button-plain > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(255, 255, 255, 0.16); color: rgba(255, 255, 255, 0.6); } @@ -3031,15 +2696,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(229, 165, 10, 0.04); color: #e5a50a; border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(229, 165, 10, 0.16); color: #e5a50a; border-color: rgba(0, 0, 0, 0); @@ -3048,14 +2711,12 @@ color: rgba(255, 255, 255, 0.6); } .p-splitbutton.p-button-text.p-button-plain > .p-button:enabled:hover, -.p-splitbutton.p-button-text.p-button-plain - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-text.p-button-plain > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.6); } .p-splitbutton.p-button-text.p-button-plain > .p-button:enabled:active, -.p-splitbutton.p-button-text.p-button-plain - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-text.p-button-plain > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(255, 255, 255, 0.16); color: rgba(255, 255, 255, 0.6); } @@ -3091,14 +2752,12 @@ border: 1px solid; } .p-splitbutton.p-button-secondary.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-secondary.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-secondary.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(203, 213, 225, 0.04); color: #cbd5e1; } .p-splitbutton.p-button-secondary.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-secondary.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-secondary.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(203, 213, 225, 0.16); color: #cbd5e1; } @@ -3108,15 +2767,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-secondary.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-secondary.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-secondary.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(203, 213, 225, 0.04); border-color: rgba(0, 0, 0, 0); color: #cbd5e1; } .p-splitbutton.p-button-secondary.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-secondary.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-secondary.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(203, 213, 225, 0.16); border-color: rgba(0, 0, 0, 0); color: #cbd5e1; @@ -3127,14 +2784,12 @@ border: 1px solid; } .p-splitbutton.p-button-info.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-info.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-info.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(147, 197, 253, 0.04); color: #93c5fd; } .p-splitbutton.p-button-info.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-info.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-info.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(147, 197, 253, 0.16); color: #93c5fd; } @@ -3144,15 +2799,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-info.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-info.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-info.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(147, 197, 253, 0.04); border-color: rgba(0, 0, 0, 0); color: #93c5fd; } .p-splitbutton.p-button-info.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-info.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-info.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(147, 197, 253, 0.16); border-color: rgba(0, 0, 0, 0); color: #93c5fd; @@ -3163,14 +2816,12 @@ border: 1px solid; } .p-splitbutton.p-button-success.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-success.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-success.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(134, 239, 172, 0.04); color: #86efac; } .p-splitbutton.p-button-success.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-success.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-success.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(134, 239, 172, 0.16); color: #86efac; } @@ -3180,15 +2831,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-success.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-success.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-success.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(134, 239, 172, 0.04); border-color: rgba(0, 0, 0, 0); color: #86efac; } .p-splitbutton.p-button-success.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-success.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-success.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(134, 239, 172, 0.16); border-color: rgba(0, 0, 0, 0); color: #86efac; @@ -3199,14 +2848,12 @@ border: 1px solid; } .p-splitbutton.p-button-warning.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-warning.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-warning.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 211, 77, 0.04); color: #fcd34d; } .p-splitbutton.p-button-warning.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-warning.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-warning.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(252, 211, 77, 0.16); color: #fcd34d; } @@ -3216,15 +2863,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-warning.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-warning.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-warning.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 211, 77, 0.04); border-color: rgba(0, 0, 0, 0); color: #fcd34d; } .p-splitbutton.p-button-warning.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-warning.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-warning.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(252, 211, 77, 0.16); border-color: rgba(0, 0, 0, 0); color: #fcd34d; @@ -3235,14 +2880,12 @@ border: 1px solid; } .p-splitbutton.p-button-help.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-help.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-help.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(216, 180, 254, 0.04); color: #d8b4fe; } .p-splitbutton.p-button-help.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-help.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-help.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(216, 180, 254, 0.16); color: #d8b4fe; } @@ -3252,15 +2895,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-help.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-help.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-help.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(216, 180, 254, 0.04); border-color: rgba(0, 0, 0, 0); color: #d8b4fe; } .p-splitbutton.p-button-help.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-help.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-help.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(216, 180, 254, 0.16); border-color: rgba(0, 0, 0, 0); color: #d8b4fe; @@ -3271,14 +2912,12 @@ border: 1px solid; } .p-splitbutton.p-button-danger.p-button-outlined > .p-button:enabled:hover, -.p-splitbutton.p-button-danger.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-danger.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 165, 165, 0.04); color: #fca5a5; } .p-splitbutton.p-button-danger.p-button-outlined > .p-button:enabled:active, -.p-splitbutton.p-button-danger.p-button-outlined - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-danger.p-button-outlined > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(252, 165, 165, 0.16); color: #fca5a5; } @@ -3288,15 +2927,13 @@ border-color: rgba(0, 0, 0, 0); } .p-splitbutton.p-button-danger.p-button-text > .p-button:enabled:hover, -.p-splitbutton.p-button-danger.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):hover { +.p-splitbutton.p-button-danger.p-button-text > .p-button:not(button):not(a):not(.p-disabled):hover { background: rgba(252, 165, 165, 0.04); border-color: rgba(0, 0, 0, 0); color: #fca5a5; } .p-splitbutton.p-button-danger.p-button-text > .p-button:enabled:active, -.p-splitbutton.p-button-danger.p-button-text - > .p-button:not(button):not(a):not(.p-disabled):active { +.p-splitbutton.p-button-danger.p-button-text > .p-button:not(button):not(a):not(.p-disabled):active { background: rgba(252, 165, 165, 0.16); border-color: rgba(0, 0, 0, 0); color: #fca5a5; @@ -3468,14 +3105,11 @@ background: rgba(165, 180, 252, 0.16); margin-left: 0.5rem; } -.p-datatable - .p-sortable-column:not(.p-highlight):not(.p-sortable-disabled):hover { +.p-datatable .p-sortable-column:not(.p-highlight):not(.p-sortable-disabled):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } -.p-datatable - .p-sortable-column:not(.p-highlight):not(.p-sortable-disabled):hover - .p-sortable-column-icon { +.p-datatable .p-sortable-column:not(.p-highlight):not(.p-sortable-disabled):hover .p-sortable-column-icon { color: rgba(255, 255, 255, 0.87); } .p-datatable .p-sortable-column.p-highlight { @@ -3489,9 +3123,7 @@ background: rgba(165, 180, 252, 0.16); color: rgba(255, 255, 255, 0.87); } -.p-datatable - .p-sortable-column.p-highlight:not(.p-sortable-disabled):hover - .p-sortable-column-icon { +.p-datatable .p-sortable-column.p-highlight:not(.p-sortable-disabled):hover .p-sortable-column-icon { color: rgba(255, 255, 255, 0.87); } .p-datatable .p-sortable-column:focus { @@ -3566,9 +3198,7 @@ background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } -.p-datatable.p-datatable-selectable - .p-datatable-tbody - > tr.p-selectable-row:focus { +.p-datatable.p-datatable-selectable .p-datatable-tbody > tr.p-selectable-row:focus { outline: 0.15rem solid rgba(165, 180, 252, 0.5); outline-offset: -0.15rem; } @@ -3579,16 +3209,11 @@ background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } -.p-datatable.p-datatable-selectable-cell - .p-datatable-tbody - > tr.p-selectable-row - > td.p-selectable-cell:focus { +.p-datatable.p-datatable-selectable-cell .p-datatable-tbody > tr.p-selectable-row > td.p-selectable-cell:focus { outline: 0.15rem solid rgba(165, 180, 252, 0.5); outline-offset: -0.15rem; } -.p-datatable.p-datatable-hoverable-rows - .p-datatable-tbody - > tr:not(.p-highlight):not(.p-datatable-emptymessage):hover { +.p-datatable.p-datatable-hoverable-rows .p-datatable-tbody > tr:not(.p-highlight):not(.p-datatable-emptymessage):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } @@ -3599,14 +3224,8 @@ .p-datatable .p-datatable-scrollable-footer { background: #071426; } -.p-datatable.p-datatable-scrollable - > .p-datatable-wrapper - > .p-datatable-table - > .p-datatable-thead, -.p-datatable.p-datatable-scrollable - > .p-datatable-wrapper - > .p-datatable-table - > .p-datatable-tfoot, +.p-datatable.p-datatable-scrollable > .p-datatable-wrapper > .p-datatable-table > .p-datatable-thead, +.p-datatable.p-datatable-scrollable > .p-datatable-wrapper > .p-datatable-table > .p-datatable-tfoot, .p-datatable.p-datatable-scrollable > .p-datatable-wrapper > .p-virtualscroller @@ -3653,10 +3272,7 @@ .p-datatable.p-datatable-gridlines .p-datatable-tbody > tr:last-child > td { border-width: 1px 0 1px 1px; } -.p-datatable.p-datatable-gridlines - .p-datatable-tbody - > tr:last-child - > td:last-child { +.p-datatable.p-datatable-gridlines .p-datatable-tbody > tr:last-child > td:last-child { border-width: 1px; } .p-datatable.p-datatable-gridlines .p-datatable-tfoot > tr > td { @@ -3665,47 +3281,28 @@ .p-datatable.p-datatable-gridlines .p-datatable-tfoot > tr > td:last-child { border-width: 1px 1px 1px 1px; } -.p-datatable.p-datatable-gridlines - .p-datatable-thead - + .p-datatable-tfoot - > tr - > td { +.p-datatable.p-datatable-gridlines .p-datatable-thead + .p-datatable-tfoot > tr > td { border-width: 0 0 1px 1px; } -.p-datatable.p-datatable-gridlines - .p-datatable-thead - + .p-datatable-tfoot - > tr - > td:last-child { +.p-datatable.p-datatable-gridlines .p-datatable-thead + .p-datatable-tfoot > tr > td:last-child { border-width: 0 1px 1px 1px; } -.p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has( - .p-datatable-tbody - ) - .p-datatable-tbody - > tr - > td { +.p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has(.p-datatable-tbody) .p-datatable-tbody > tr > td { border-width: 0 0 1px 1px; } -.p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has( - .p-datatable-tbody - ) +.p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has(.p-datatable-tbody) .p-datatable-tbody > tr > td:last-child { border-width: 0 1px 1px 1px; } -.p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has( - .p-datatable-tfoot - ) +.p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has(.p-datatable-tfoot) .p-datatable-tbody > tr:last-child > td { border-width: 0 0 0 1px; } -.p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has( - .p-datatable-tfoot - ) +.p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has(.p-datatable-tfoot) .p-datatable-tbody > tr:last-child > td:last-child { @@ -3718,22 +3315,13 @@ background: rgba(165, 180, 252, 0.16); color: rgba(255, 255, 255, 0.87); } -.p-datatable.p-datatable-striped - .p-datatable-tbody - > tr.p-row-odd.p-highlight - .p-row-toggler { +.p-datatable.p-datatable-striped .p-datatable-tbody > tr.p-row-odd.p-highlight .p-row-toggler { color: rgba(255, 255, 255, 0.87); } -.p-datatable.p-datatable-striped - .p-datatable-tbody - > tr.p-row-odd.p-highlight - .p-row-toggler:hover { +.p-datatable.p-datatable-striped .p-datatable-tbody > tr.p-row-odd.p-highlight .p-row-toggler:hover { color: rgba(255, 255, 255, 0.87); } -.p-datatable.p-datatable-striped - .p-datatable-tbody - > tr.p-row-odd - + .p-row-expanded { +.p-datatable.p-datatable-striped .p-datatable-tbody > tr.p-row-odd + .p-row-expanded { background: rgba(255, 255, 255, 0.01); } .p-datatable.p-datatable-sm .p-datatable-header { @@ -3929,21 +3517,15 @@ transition: box-shadow 0.2s; border-radius: 0; } -.p-column-filter-overlay - .p-column-filter-row-items - .p-column-filter-row-item.p-highlight { +.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item.p-highlight { color: rgba(255, 255, 255, 0.87); background: rgba(165, 180, 252, 0.16); } -.p-column-filter-overlay - .p-column-filter-row-items - .p-column-filter-row-item:not(.p-highlight):not(.p-disabled):hover { +.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:not(.p-highlight):not(.p-disabled):hover { color: rgba(255, 255, 255, 0.87); background: rgba(255, 255, 255, 0.03); } -.p-column-filter-overlay - .p-column-filter-row-items - .p-column-filter-row-item:focus { +.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:focus { outline: 0 none; outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); @@ -3965,14 +3547,10 @@ padding: 1.25rem; border-bottom: 1px solid #0b213f; } -.p-column-filter-overlay-menu - .p-column-filter-constraint - .p-column-filter-matchmode-dropdown { +.p-column-filter-overlay-menu .p-column-filter-constraint .p-column-filter-matchmode-dropdown { margin-bottom: 0.5rem; } -.p-column-filter-overlay-menu - .p-column-filter-constraint - .p-column-filter-remove-button { +.p-column-filter-overlay-menu .p-column-filter-constraint .p-column-filter-remove-button { margin-top: 0.5rem; } .p-column-filter-overlay-menu .p-column-filter-constraint:last-child { @@ -4041,20 +3619,20 @@ box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); } .fc.fc-unthemed .fc-toolbar .fc-button .fc-icon-chevron-left { - font-family: "PrimeIcons" !important; + font-family: 'PrimeIcons' !important; text-indent: 0; font-size: 1rem; } .fc.fc-unthemed .fc-toolbar .fc-button .fc-icon-chevron-left:before { - content: ""; + content: ''; } .fc.fc-unthemed .fc-toolbar .fc-button .fc-icon-chevron-right { - font-family: "PrimeIcons" !important; + font-family: 'PrimeIcons' !important; text-indent: 0; font-size: 1rem; } .fc.fc-unthemed .fc-toolbar .fc-button .fc-icon-chevron-right:before { - content: ""; + content: ''; } .fc.fc-unthemed .fc-toolbar .fc-button:focus { outline: 0 none; @@ -4087,15 +3665,9 @@ border-color: #e5a50a; color: #1c2127; } -.fc.fc-unthemed - .fc-toolbar - .fc-button.fc-dayGridMonth-button.fc-button-active:hover, -.fc.fc-unthemed - .fc-toolbar - .fc-button.fc-timeGridWeek-button.fc-button-active:hover, -.fc.fc-unthemed - .fc-toolbar - .fc-button.fc-timeGridDay-button.fc-button-active:hover { +.fc.fc-unthemed .fc-toolbar .fc-button.fc-dayGridMonth-button.fc-button-active:hover, +.fc.fc-unthemed .fc-toolbar .fc-button.fc-timeGridWeek-button.fc-button-active:hover, +.fc.fc-unthemed .fc-toolbar .fc-button.fc-timeGridDay-button.fc-button-active:hover { background: #da9d0a; border-color: #da9d0a; color: #1c2127; @@ -4144,17 +3716,13 @@ background: #071426; color: rgba(255, 255, 255, 0.87); } -.fc.fc-theme-standard - .fc-view-harness - .fc-popover - .fc-popover-header - .fc-popover-close { +.fc.fc-theme-standard .fc-view-harness .fc-popover .fc-popover-header .fc-popover-close { opacity: 1; display: flex; align-items: center; justify-content: center; overflow: hidden; - font-family: "PrimeIcons" !important; + font-family: 'PrimeIcons' !important; font-size: 1rem; width: 2rem; height: 2rem; @@ -4167,27 +3735,15 @@ color 0.2s, box-shadow 0.2s; } -.fc.fc-theme-standard - .fc-view-harness - .fc-popover - .fc-popover-header - .fc-popover-close:before { - content: ""; +.fc.fc-theme-standard .fc-view-harness .fc-popover .fc-popover-header .fc-popover-close:before { + content: ''; } -.fc.fc-theme-standard - .fc-view-harness - .fc-popover - .fc-popover-header - .fc-popover-close:hover { +.fc.fc-theme-standard .fc-view-harness .fc-popover .fc-popover-header .fc-popover-close:hover { color: rgba(255, 255, 255, 0.87); border-color: rgba(0, 0, 0, 0); background: rgba(255, 255, 255, 0.03); } -.fc.fc-theme-standard - .fc-view-harness - .fc-popover - .fc-popover-header - .fc-popover-close:focus { +.fc.fc-theme-standard .fc-view-harness .fc-popover .fc-popover-header .fc-popover-close:focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); @@ -4204,16 +3760,10 @@ background: #da9d0a; border-color: #da9d0a; } -.fc.fc-theme-standard - .fc-view-harness - .fc-event.fc-daygrid-block-event - .fc-event-main { +.fc.fc-theme-standard .fc-view-harness .fc-event.fc-daygrid-block-event .fc-event-main { color: #1c2127; } -.fc.fc-theme-standard - .fc-view-harness - .fc-event.fc-daygrid-dot-event - .fc-daygrid-event-dot { +.fc.fc-theme-standard .fc-view-harness .fc-event.fc-daygrid-dot-event .fc-daygrid-event-dot { background: #da9d0a; border-color: #da9d0a; } @@ -4258,20 +3808,20 @@ border: 1px solid #e5a50a; } .fc.fc-theme-standard .fc-toolbar .fc-button .fc-icon-chevron-left { - font-family: "PrimeIcons" !important; + font-family: 'PrimeIcons' !important; text-indent: 0; font-size: 1rem; } .fc.fc-theme-standard .fc-toolbar .fc-button .fc-icon-chevron-left:before { - content: ""; + content: ''; } .fc.fc-theme-standard .fc-toolbar .fc-button .fc-icon-chevron-right { - font-family: "PrimeIcons" !important; + font-family: 'PrimeIcons' !important; text-indent: 0; font-size: 1rem; } .fc.fc-theme-standard .fc-toolbar .fc-button .fc-icon-chevron-right:before { - content: ""; + content: ''; } .fc.fc-theme-standard .fc-toolbar .fc-button:focus { outline: 0 none; @@ -4297,41 +3847,23 @@ border-color: #0b213f; color: rgba(255, 255, 255, 0.87); } -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-dayGridMonth-button.fc-button-active, -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-timeGridWeek-button.fc-button-active, -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-timeGridDay-button.fc-button-active { +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-dayGridMonth-button.fc-button-active, +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-timeGridWeek-button.fc-button-active, +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-timeGridDay-button.fc-button-active { background: #e5a50a; border-color: #e5a50a; color: #1c2127; } -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-dayGridMonth-button.fc-button-active:hover, -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-timeGridWeek-button.fc-button-active:hover, -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-timeGridDay-button.fc-button-active:hover { +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-dayGridMonth-button.fc-button-active:hover, +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-timeGridWeek-button.fc-button-active:hover, +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-timeGridDay-button.fc-button-active:hover { background: #da9d0a; border-color: #da9d0a; color: #1c2127; } -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-dayGridMonth-button:not(:disabled):focus, -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-timeGridWeek-button:not(:disabled):focus, -.fc.fc-theme-standard - .fc-toolbar - .fc-button.fc-timeGridDay-button:not(:disabled):focus { +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-dayGridMonth-button:not(:disabled):focus, +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-timeGridWeek-button:not(:disabled):focus, +.fc.fc-theme-standard .fc-toolbar .fc-button.fc-timeGridDay-button:not(:disabled):focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); @@ -4412,20 +3944,13 @@ color: rgba(255, 255, 255, 0.87); background: rgba(165, 180, 252, 0.16); } -.p-orderlist.p-orderlist-striped - .p-orderlist-list - .p-orderlist-item:nth-child(even) { +.p-orderlist.p-orderlist-striped .p-orderlist-list .p-orderlist-item:nth-child(even) { background: rgba(255, 255, 255, 0.01); } -.p-orderlist.p-orderlist-striped - .p-orderlist-list - .p-orderlist-item:nth-child(even):hover { +.p-orderlist.p-orderlist-striped .p-orderlist-list .p-orderlist-item:nth-child(even):hover { background: rgba(255, 255, 255, 0.03); } -.p-organizationchart - .p-organizationchart-node-content.p-organizationchart-selectable-node:not( - .p-highlight - ):hover { +.p-organizationchart .p-organizationchart-node-content.p-organizationchart-selectable-node:not(.p-highlight):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } @@ -4433,10 +3958,7 @@ background: rgba(165, 180, 252, 0.16); color: rgba(255, 255, 255, 0.87); } -.p-organizationchart - .p-organizationchart-node-content.p-highlight - .p-node-toggler - i { +.p-organizationchart .p-organizationchart-node-content.p-highlight .p-node-toggler i { color: rgba(42, 77, 248, 0.16); } .p-organizationchart .p-organizationchart-line-down { @@ -4634,20 +4156,12 @@ color 0.2s, box-shadow 0.2s; } -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content - .p-tree-toggler:enabled:hover { +.p-tree .p-tree-container .p-treenode .p-treenode-content .p-tree-toggler:enabled:hover { color: rgba(255, 255, 255, 0.87); border-color: rgba(0, 0, 0, 0); background: rgba(255, 255, 255, 0.03); } -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content - .p-tree-toggler:focus { +.p-tree .p-tree-container .p-treenode .p-treenode-content .p-tree-toggler:focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); @@ -4659,13 +4173,7 @@ .p-tree .p-tree-container .p-treenode .p-treenode-content .p-checkbox { margin-right: 0.5rem; } -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content - .p-checkbox - .p-indeterminate - .p-checkbox-icon { +.p-tree .p-tree-container .p-treenode .p-treenode-content .p-checkbox .p-indeterminate .p-checkbox-icon { color: rgba(255, 255, 255, 0.87); } .p-tree .p-tree-container .p-treenode .p-treenode-content:focus { @@ -4677,34 +4185,15 @@ background: rgba(165, 180, 252, 0.16); color: rgba(255, 255, 255, 0.87); } -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content.p-highlight - .p-tree-toggler, -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content.p-highlight - .p-treenode-icon { +.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-tree-toggler, +.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-treenode-icon { color: rgba(255, 255, 255, 0.87); } -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content.p-highlight - .p-tree-toggler:hover, -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content.p-highlight - .p-treenode-icon:hover { +.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-tree-toggler:hover, +.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-treenode-icon:hover { color: rgba(255, 255, 255, 0.87); } -.p-tree - .p-tree-container - .p-treenode - .p-treenode-content.p-treenode-selectable:not(.p-highlight):hover { +.p-tree .p-tree-container .p-treenode .p-treenode-content.p-treenode-selectable:not(.p-highlight):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } @@ -4802,9 +4291,7 @@ background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } -.p-treetable - .p-sortable-column:not(.p-highlight):hover - .p-sortable-column-icon { +.p-treetable .p-sortable-column:not(.p-highlight):hover .p-sortable-column-icon { color: rgba(255, 255, 255, 0.87); } .p-treetable .p-sortable-column.p-highlight { @@ -4851,14 +4338,7 @@ .p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler + .p-checkbox { margin-right: 0.5rem; } -.p-treetable - .p-treetable-tbody - > tr - > td - .p-treetable-toggler - + .p-checkbox - .p-indeterminate - .p-checkbox-icon { +.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler + .p-checkbox .p-indeterminate .p-checkbox-icon { color: rgba(255, 255, 255, 0.87); } .p-treetable .p-treetable-tbody > tr:focus { @@ -4875,23 +4355,13 @@ .p-treetable .p-treetable-tbody > tr.p-highlight .p-treetable-toggler:hover { color: rgba(255, 255, 255, 0.87); } -.p-treetable.p-treetable-selectable - .p-treetable-tbody - > tr:not(.p-highlight):hover, -.p-treetable.p-treetable-hoverable-rows - .p-treetable-tbody - > tr:not(.p-highlight):hover { +.p-treetable.p-treetable-selectable .p-treetable-tbody > tr:not(.p-highlight):hover, +.p-treetable.p-treetable-hoverable-rows .p-treetable-tbody > tr:not(.p-highlight):hover { background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); } -.p-treetable.p-treetable-selectable - .p-treetable-tbody - > tr:not(.p-highlight):hover - .p-treetable-toggler, -.p-treetable.p-treetable-hoverable-rows - .p-treetable-tbody - > tr:not(.p-highlight):hover - .p-treetable-toggler { +.p-treetable.p-treetable-selectable .p-treetable-tbody > tr:not(.p-highlight):hover .p-treetable-toggler, +.p-treetable.p-treetable-hoverable-rows .p-treetable-tbody > tr:not(.p-highlight):hover .p-treetable-toggler { color: rgba(255, 255, 255, 0.87); } .p-treetable .p-column-resizer-helper { @@ -4992,38 +4462,27 @@ border-radius: 8px; transition: box-shadow 0.2s; } -.p-accordion - .p-accordion-header - .p-accordion-header-link - .p-accordion-toggle-icon { +.p-accordion .p-accordion-header .p-accordion-header-link .p-accordion-toggle-icon { margin-right: 0.5rem; } -.p-accordion - .p-accordion-header:not(.p-disabled) - .p-accordion-header-link:focus { +.p-accordion .p-accordion-header:not(.p-disabled) .p-accordion-header-link:focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); } -.p-accordion - .p-accordion-header:not(.p-highlight):not(.p-disabled):hover - .p-accordion-header-link { +.p-accordion .p-accordion-header:not(.p-highlight):not(.p-disabled):hover .p-accordion-header-link { background: rgba(255, 255, 255, 0.03); border-color: #0b213f; color: rgba(255, 255, 255, 0.87); } -.p-accordion - .p-accordion-header:not(.p-disabled).p-highlight - .p-accordion-header-link { +.p-accordion .p-accordion-header:not(.p-disabled).p-highlight .p-accordion-header-link { background: #071426; border-color: #0b213f; color: rgba(255, 255, 255, 0.87); border-bottom-right-radius: 0; border-bottom-left-radius: 0; } -.p-accordion - .p-accordion-header:not(.p-disabled).p-highlight:hover - .p-accordion-header-link { +.p-accordion .p-accordion-header:not(.p-disabled).p-highlight:hover .p-accordion-header-link { border-color: #0b213f; background: rgba(255, 255, 255, 0.03); color: rgba(255, 255, 255, 0.87); @@ -5237,10 +4696,7 @@ outline-offset: 0; box-shadow: inset 0 0 0 0.2rem rgba(165, 180, 252, 0.5); } -.p-tabview - .p-tabview-nav - li:not(.p-highlight):not(.p-disabled):hover - .p-tabview-nav-link { +.p-tabview .p-tabview-nav li:not(.p-highlight):not(.p-disabled):hover .p-tabview-nav-link { background: #071426; border-color: #e5a50a; color: rgba(255, 255, 255, 0.87); @@ -5646,20 +5102,11 @@ .p-contextmenu .p-menuitem.p-menuitem-active > .p-menuitem-link { background: rgba(165, 180, 252, 0.16); } -.p-contextmenu - .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-text { +.p-contextmenu .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-contextmenu - .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-icon, -.p-contextmenu - .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-submenu-icon { +.p-contextmenu .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-icon, +.p-contextmenu .p-menuitem.p-menuitem-active > .p-menuitem-link .p-submenu-icon { color: rgba(255, 255, 255, 0.87); } .p-contextmenu .p-menu-separator { @@ -5776,54 +5223,27 @@ transition: box-shadow 0.2s; user-select: none; } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-text { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-icon { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-icon { color: rgba(255, 255, 255, 0.6); margin-right: 0.5rem; } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - .p-submenu-icon { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link .p-submenu-icon { color: rgba(255, 255, 255, 0.6); margin-left: 0.5rem; } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-text { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-icon { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-menuitem-icon { color: rgba(255, 255, 255, 0.87); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-submenu-icon { +.p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-submenu-icon { color: rgba(255, 255, 255, 0.87); } .p-megamenu .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:focus { @@ -5831,21 +5251,11 @@ outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link, -.p-megamenu - .p-megamenu-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link:not(.p-disabled):hover { +.p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link, +.p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link:not(.p-disabled):hover { background: rgba(165, 180, 252, 0.16); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-text, +.p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-text, .p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active @@ -5853,11 +5263,7 @@ .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-icon, +.p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-icon, .p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active @@ -5865,11 +5271,7 @@ .p-menuitem-icon { color: rgba(255, 255, 255, 0.87); } -.p-megamenu - .p-megamenu-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-submenu-icon, +.p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link .p-submenu-icon, .p-megamenu .p-megamenu-root-list > .p-menuitem.p-menuitem-active @@ -5989,9 +5391,7 @@ .p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list .p-submenu-icon { font-size: 0.875rem; } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - .p-submenu-icon.p-icon { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list .p-submenu-icon.p-icon { width: 0.875rem; height: 0.875rem; } @@ -5999,42 +5399,24 @@ width: 100%; position: static; } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link { padding: 0.75rem 1.25rem; color: rgba(255, 255, 255, 0.87); border-radius: 0; transition: box-shadow 0.2s; user-select: none; } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-text { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-icon { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-icon { color: rgba(255, 255, 255, 0.6); margin-right: 0.5rem; } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - .p-submenu-icon { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link .p-submenu-icon { color: rgba(255, 255, 255, 0.6); } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); } .p-megamenu.p-megamenu-mobile-active @@ -6058,19 +5440,12 @@ .p-submenu-icon { color: rgba(255, 255, 255, 0.87); } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link:focus { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link:focus { outline: 0 none; outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - > .p-menuitem - > .p-menuitem-link - > .p-submenu-icon { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list > .p-menuitem > .p-menuitem-link > .p-submenu-icon { margin-left: auto; } .p-megamenu.p-megamenu-mobile-active @@ -6086,10 +5461,7 @@ box-shadow: none; border: 0 none; } -.p-megamenu.p-megamenu-mobile-active - .p-megamenu-root-list - .p-submenu-list - .p-submenu-icon { +.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list .p-submenu-list .p-submenu-icon { transition: transform 0.2s; transform: rotate(90deg); } @@ -6216,54 +5588,27 @@ transition: box-shadow 0.2s; user-select: none; } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-text { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-icon { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-icon { color: rgba(255, 255, 255, 0.6); margin-right: 0.5rem; } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - .p-submenu-icon { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link .p-submenu-icon { color: rgba(255, 255, 255, 0.6); margin-left: 0.5rem; } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-text { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-icon { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-menuitem-icon { color: rgba(255, 255, 255, 0.87); } -.p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-submenu-icon { +.p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-submenu-icon { color: rgba(255, 255, 255, 0.87); } .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:focus { @@ -6271,21 +5616,11 @@ outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); } -.p-menubar - .p-menubar-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link, -.p-menubar - .p-menubar-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link:not(.p-disabled):hover { +.p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link, +.p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link:not(.p-disabled):hover { background: rgba(165, 180, 252, 0.16); } -.p-menubar - .p-menubar-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-text, +.p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-text, .p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active @@ -6293,11 +5628,7 @@ .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-menubar - .p-menubar-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-icon, +.p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-icon, .p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active @@ -6305,11 +5636,7 @@ .p-menuitem-icon { color: rgba(255, 255, 255, 0.87); } -.p-menubar - .p-menubar-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-submenu-icon, +.p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link .p-submenu-icon, .p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active @@ -6406,53 +5733,26 @@ transition: box-shadow 0.2s; user-select: none; } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-text { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - .p-menuitem-icon { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link .p-menuitem-icon { color: rgba(255, 255, 255, 0.6); margin-right: 0.5rem; } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - .p-submenu-icon { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link .p-submenu-icon { color: rgba(255, 255, 255, 0.6); } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-text { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-icon { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-menuitem-icon { color: rgba(255, 255, 255, 0.87); } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link:not(.p-disabled):hover - .p-submenu-icon { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:not(.p-disabled):hover .p-submenu-icon { color: rgba(255, 255, 255, 0.87); } .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link:focus { @@ -6460,19 +5760,11 @@ outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); } - .p-menubar - .p-menubar-root-list - > .p-menuitem - > .p-menuitem-link - > .p-submenu-icon { + .p-menubar .p-menubar-root-list > .p-menuitem > .p-menuitem-link > .p-submenu-icon { margin-left: auto; transition: transform 0.2s; } - .p-menubar - .p-menubar-root-list - > .p-menuitem.p-menuitem-active - > .p-menuitem-link - > .p-submenu-icon { + .p-menubar .p-menubar-root-list > .p-menuitem.p-menuitem-active > .p-menuitem-link > .p-submenu-icon { transform: rotate(-180deg); } .p-menubar .p-menubar-root-list .p-submenu-list { @@ -6485,12 +5777,7 @@ transition: transform 0.2s; transform: rotate(90deg); } - .p-menubar - .p-menubar-root-list - .p-submenu-list - .p-menuitem-active - > .p-menuitem-link - > .p-submenu-icon { + .p-menubar .p-menubar-root-list .p-submenu-list .p-menuitem-active > .p-menuitem-link > .p-submenu-icon { transform: rotate(-90deg); } .p-menubar .p-menubar-root-list .p-menuitem { @@ -6578,49 +5865,26 @@ transition: box-shadow 0.2s; user-select: none; } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link - .p-menuitem-text { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link - .p-menuitem-icon { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link .p-menuitem-icon { color: rgba(255, 255, 255, 0.6); margin-right: 0.5rem; } .p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link .p-submenu-icon { color: rgba(255, 255, 255, 0.6); } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link:not(.p-disabled):hover { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link:not(.p-disabled):hover { background: rgba(255, 255, 255, 0.03); } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-text { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link:not(.p-disabled):hover .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link:not(.p-disabled):hover - .p-menuitem-icon { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link:not(.p-disabled):hover .p-menuitem-icon { color: rgba(255, 255, 255, 0.87); } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link:not(.p-disabled):hover - .p-submenu-icon { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link:not(.p-disabled):hover .p-submenu-icon { color: rgba(255, 255, 255, 0.87); } .p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link:focus { @@ -6628,16 +5892,10 @@ outline-offset: 0; box-shadow: inset 0 0 0 0.15rem rgba(165, 180, 252, 0.5); } -.p-panelmenu - .p-panelmenu-content - .p-menuitem - .p-menuitem-link - .p-panelmenu-icon { +.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-link .p-panelmenu-icon { margin-right: 0.5rem; } -.p-panelmenu - .p-panelmenu-content - .p-submenu-list:not(.p-panelmenu-root-submenu) { +.p-panelmenu .p-panelmenu-content .p-submenu-list:not(.p-panelmenu-root-submenu) { padding: 0 0 0 1rem; } .p-panelmenu .p-panelmenu-panel { @@ -6705,20 +5963,11 @@ .p-slidemenu .p-slidemenu.p-slidemenu-active > .p-slidemenu-link { background: rgba(165, 180, 252, 0.16); } -.p-slidemenu - .p-slidemenu.p-slidemenu-active - > .p-slidemenu-link - .p-slidemenu-text { +.p-slidemenu .p-slidemenu.p-slidemenu-active > .p-slidemenu-link .p-slidemenu-text { color: rgba(255, 255, 255, 0.87); } -.p-slidemenu - .p-slidemenu.p-slidemenu-active - > .p-slidemenu-link - .p-slidemenu-icon, -.p-slidemenu - .p-slidemenu.p-slidemenu-active - > .p-slidemenu-link - .p-slidemenu-icon { +.p-slidemenu .p-slidemenu.p-slidemenu-active > .p-slidemenu-link .p-slidemenu-icon, +.p-slidemenu .p-slidemenu.p-slidemenu-active > .p-slidemenu-link .p-slidemenu-icon { color: rgba(255, 255, 255, 0.87); } .p-slidemenu .p-slidemenu-separator { @@ -6771,7 +6020,7 @@ color: rgba(255, 255, 255, 0.87); } .p-steps .p-steps-item:before { - content: " "; + content: ' '; border-top: 1px solid #0b213f; width: 100%; top: 50%; @@ -6805,18 +6054,12 @@ .p-tabmenu .p-tabmenu-nav .p-tabmenuitem .p-menuitem-link .p-menuitem-icon { margin-right: 0.5rem; } -.p-tabmenu - .p-tabmenu-nav - .p-tabmenuitem - .p-menuitem-link:not(.p-disabled):focus { +.p-tabmenu .p-tabmenu-nav .p-tabmenuitem .p-menuitem-link:not(.p-disabled):focus { outline: 0 none; outline-offset: 0; box-shadow: inset 0 0 0 0.2rem rgba(165, 180, 252, 0.5); } -.p-tabmenu - .p-tabmenu-nav - .p-tabmenuitem:not(.p-highlight):not(.p-disabled):hover - .p-menuitem-link { +.p-tabmenu .p-tabmenu-nav .p-tabmenuitem:not(.p-highlight):not(.p-disabled):hover .p-menuitem-link { background: #071426; border-color: #e5a50a; color: rgba(255, 255, 255, 0.87); @@ -6888,10 +6131,7 @@ .p-tieredmenu .p-menuitem.p-menuitem-active > .p-menuitem-link { background: rgba(165, 180, 252, 0.16); } -.p-tieredmenu - .p-menuitem.p-menuitem-active - > .p-menuitem-link - .p-menuitem-text { +.p-tieredmenu .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-text { color: rgba(255, 255, 255, 0.87); } .p-tieredmenu .p-menuitem.p-menuitem-active > .p-menuitem-link .p-menuitem-icon, @@ -7068,10 +6308,7 @@ .p-toast .p-toast-message .p-toast-message-content .p-toast-message-icon { font-size: 2rem; } -.p-toast - .p-toast-message - .p-toast-message-content - .p-toast-message-icon.p-icon { +.p-toast .p-toast-message .p-toast-message-content .p-toast-message-icon.p-icon { width: 2rem; height: 2rem; } @@ -7223,22 +6460,13 @@ .p-galleria.p-galleria-indicator-onitem .p-galleria-indicators { background: rgba(0, 0, 0, 0.5); } -.p-galleria.p-galleria-indicator-onitem - .p-galleria-indicators - .p-galleria-indicator - button { +.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators .p-galleria-indicator button { background: rgba(255, 255, 255, 0.4); } -.p-galleria.p-galleria-indicator-onitem - .p-galleria-indicators - .p-galleria-indicator - button:hover { +.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators .p-galleria-indicator button:hover { background: rgba(255, 255, 255, 0.6); } -.p-galleria.p-galleria-indicator-onitem - .p-galleria-indicators - .p-galleria-indicator.p-highlight - button { +.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators .p-galleria-indicator.p-highlight button { background: rgba(165, 180, 252, 0.16); color: rgba(255, 255, 255, 0.87); } @@ -7267,9 +6495,7 @@ .p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-item-content { transition: box-shadow 0.2s; } -.p-galleria - .p-galleria-thumbnail-container - .p-galleria-thumbnail-item-content:focus { +.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-item-content:focus { outline: 0 none; outline-offset: 0; box-shadow: 0 0 0 0.2rem rgba(165, 180, 252, 0.5); @@ -7412,12 +6638,7 @@ border-radius: 8px; } .p-skeleton:after { - background: linear-gradient( - 90deg, - rgba(255, 255, 255, 0), - rgba(255, 255, 255, 0.04), - rgba(255, 255, 255, 0) - ); + background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0)); } .p-tag { background: #e5a50a; @@ -7492,8 +6713,8 @@ } .p-terminal .p-terminal-input { font-size: 1rem; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, - Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; } .p-badge { background: #e5a50a; diff --git a/src/types/numista.ts b/src/types/numista.ts index 8ac8450..0113e71 100644 --- a/src/types/numista.ts +++ b/src/types/numista.ts @@ -1,101 +1,42 @@ -export type NumistaCategory = "coin" | "banknote" | "exonumia"; +export type NumistaCategory = 'coin' | 'banknote' | 'exonumia'; export interface NumistaType { - /** @description Unique ID of the type on Numista */ - id: number; - /** @description URL to the type on Numista */ - url?: string; - /** @description Title of the type */ - title: string; /** * @description Category * @enum {string} */ category: NumistaCategory; - issuer?: Issuer; - /** @description First year the type was produced (in the Gregorian calendar). */ - min_year?: number; - /** @description Last year the type was produced (in the Gregorian calendar). */ - max_year?: number; - /** @description Type */ - type?: string; - /** @description Face value */ - value?: { - /** @description Face value in text format */ - text?: string; - /** - * Format: float - * @description Face value as a floating number. - */ - numeric_value?: number; - /** @description If the value is better described as a fraction, this is the numerator of the fraction */ - numerator?: number; - /** @description If the value is better described as a fraction, this is the denominator of the fraction */ - denominator?: number; - currency?: Currency; - }; - /** @description Ruling authorities (emperor, queen, period, etc.) */ - ruler?: { - /** @description Unique ID of the ruling authority on Numista */ - id: number; - /** @description Name of the ruling authority */ - name: string; - /** @description Identifier of the ruling authority at Wikidata, starting with a "Q" */ - wikidata_id?: string; - /** @description Dynasty, house, extended period, or any other group of ruling authorities */ - group?: { - /** @description Unique ID of the ruling authority group on Numista */ - id: number; - /** @description Name of the ruling authority group */ - name: string; - }; - }[]; - /** @description Information about the demonetization of the coin or banknote */ - demonetization?: { - /** @description True if the type is demonetized, false if it is not demonetized */ - is_demonetized: boolean; - /** - * Format: date - * @description Date of demonetisation (YYYY-MM-DD) - */ - demonetization_date?: string; - }; - /** @description Shape */ - shape?: string; + /** @description Dominant color calculated from the pictures */ + color: string; + /** @description For commemorated types, short description of the commemorated topic (event, person, etc.) */ + commemorated_topic?: string; + /** @description General comments about the type (HTML format) */ + comments?: string; /** @description Composition (metallic content) */ composition?: { /** @description Description of the composition */ text?: string; }; - /** @description Manufacturing technique */ - technique?: { - /** @description Description of the technique */ - text?: string; + /** @description How many of this type are included in my personal collection */ + count?: number; + /** @description Information about the demonetization of the coin or banknote */ + demonetization?: { + /** + * Format: date + * @description Date of demonetisation (YYYY-MM-DD) + */ + demonetization_date?: string; + /** @description True if the type is demonetized, false if it is not demonetized */ + is_demonetized: boolean; }; - /** - * Format: float - * @description Weight in grams - */ - weight?: number; - /** - * Format: float - * @description Size (diameter) in millimeters - */ - size?: number; - /** - * Format: float - * @description Thickness of the coin in millimeters - */ - thickness?: number; - /** - * @description Orientation of the coin ("coin", "medal", "three" (3 o'clock), "nine" (9 o'clock), or "variable") - * @enum {string} - */ - orientation?: "coin" | "medal" | "variable" | "three" | "nine"; - obverse?: CoinSide; - reverse?: CoinSide; edge?: CoinSide; - watermark?: CoinSide; + /** @description Unique ID of the type on Numista */ + id: number; + issuer?: Issuer; + /** @description Last year the type was produced (in the Gregorian calendar). */ + max_year?: number; + /** @description First year the type was produced (in the Gregorian calendar). */ + min_year?: number; /** @description Mints where the coin was minted */ mints?: { /** @description Unique ID of the mint on Numista */ @@ -103,6 +44,12 @@ export interface NumistaType { /** @description Name of the mint */ name: string; }[]; + obverse?: CoinSide; + /** + * @description Orientation of the coin ("coin", "medal", "three" (3 o'clock), "nine" (9 o'clock), or "variable") + * @enum {string} + */ + orientation?: 'coin' | 'medal' | 'variable' | 'three' | 'nine'; /** @description Printers where the banknote was printed */ printers?: { /** @description Unique ID of the printer on Numista */ @@ -110,76 +57,129 @@ export interface NumistaType { /** @description Name of the printer */ name: string; }[]; - /** @description For types which are part of a series, the name of the series */ - series?: string; - /** @description For commemorated types, short description of the commemorated topic (event, person, etc.) */ - commemorated_topic?: string; - /** @description General comments about the type (HTML format) */ - comments?: string; + /** @description References of the type in other catalogues */ + references?: Reference[]; /** @description List of related types */ related_types?: { - /** @description Unique ID of the type on Numista */ - id: number; - /** @description Title of the type */ - title: string; /** * @description Category * @enum {string} */ - category?: "coin" | "banknote" | "exonumia"; + category?: 'coin' | 'banknote' | 'exonumia'; + /** @description Unique ID of the type on Numista */ + id: number; issuer?: Issuer; - /** @description First year the type was producted (in the Gregorian calendar). */ - min_year?: number; /** @description Last year the type was producted (in the Gregorian calendar). */ max_year?: number; + /** @description First year the type was producted (in the Gregorian calendar). */ + min_year?: number; + /** @description Title of the type */ + title: string; }[]; + reverse?: CoinSide; + /** @description Ruling authorities (emperor, queen, period, etc.) */ + ruler?: { + /** @description Dynasty, house, extended period, or any other group of ruling authorities */ + group?: { + /** @description Unique ID of the ruling authority group on Numista */ + id: number; + /** @description Name of the ruling authority group */ + name: string; + }; + /** @description Unique ID of the ruling authority on Numista */ + id: number; + /** @description Name of the ruling authority */ + name: string; + /** @description Identifier of the ruling authority at Wikidata, starting with a "Q" */ + wikidata_id?: string; + }[]; + /** @description For types which are part of a series, the name of the series */ + series?: string; + /** @description Shape */ + shape?: string; + /** + * Format: float + * @description Size (diameter) in millimeters + */ + size?: number; /** @description List of tags */ tags?: string[]; - /** @description References of the type in other catalogues */ - references?: Reference[]; - /** @description How many of this type are included in my personal collection */ - count?: number; - /** @description Dominant color calculated from the pictures */ - color: string; + /** @description Manufacturing technique */ + technique?: { + /** @description Description of the technique */ + text?: string; + }; + /** + * Format: float + * @description Thickness of the coin in millimeters + */ + thickness?: number; + /** @description Title of the type */ + title: string; + /** @description Type */ + type?: string; + /** @description URL to the type on Numista */ + url?: string; + /** @description Face value */ + value?: { + currency?: Currency; + /** @description If the value is better described as a fraction, this is the denominator of the fraction */ + denominator?: number; + /** @description If the value is better described as a fraction, this is the numerator of the fraction */ + numerator?: number; + /** + * Format: float + * @description Face value as a floating number. + */ + numeric_value?: number; + /** @description Face value in text format */ + text?: string; + }; + watermark?: CoinSide; + /** + * Format: float + * @description Weight in grams + */ + weight?: number; } interface Issuer { - /** @description ISO 3166-1 code of the issuer, sometimes -2 or -3 */ - iso: string; /** @description Unique ID of the issuer on Numista */ code: string; + /** @description ISO 3166-1 code of the issuer, sometimes -2 or -3 */ + iso: string; /** @description Name of the issuer */ name: string; } interface Currency { + /** @description Full name of the currency, including dates */ + full_name: string; /** @description Unique ID of the currency on Numista */ id: number; /** @description Name of the currency */ name: string; - /** @description Full name of the currency, including dates */ - full_name: string; } interface Reference { /** @description The catalogue in which the reference can be found */ catalogue: { - /** @description ID of the catalogue in Numista */ - id: number; /** @description Code identifying the catalogue */ code: string; + /** @description ID of the catalogue in Numista */ + id: number; }; /** @description Number of the coin in the catalogue */ number: string; } export interface CoinSide { - /** @description Name of the engraver(s) */ - engravers?: string[]; - /** @description Name of the designer(s) */ - designers?: string[]; /** @description Description of the side of the coin */ description?: string; + /** @description Name of the designer(s) */ + designers?: string[]; + /** @description Name of the engraver(s) */ + engravers?: string[]; /** @description Lettering visible on the side of the coin */ lettering?: string; /** @description Scripts used to write the lettering on the side of the coins */ @@ -187,14 +187,10 @@ export interface CoinSide { /** @description Name of the script */ name: string; }[]; - /** @description Legend visible on the side of the coin with abbreviations replaced by full words */ - unabridged_legend?: string; /** @description Translation of the lettering visible on the side of the coin */ lettering_translation?: string; /** @description URL to the picture of the side of the coin */ picture?: string; - /** @description URL to the thumbnail of the picture of the side of the coin */ - thumbnail?: string; /** @description Name of the owner of the picture. Pictures should not be used without consent from their owner. */ picture_copyright?: string; /** @description URL to the website of the owner of the picture. Pictures should not be used without consent from their owner. */ @@ -203,4 +199,8 @@ export interface CoinSide { picture_license_name?: string; /** @description URL to the license of the picture, if the owner of the picture specified a license. */ picture_license_url?: string; + /** @description URL to the thumbnail of the picture of the side of the coin */ + thumbnail?: string; + /** @description Legend visible on the side of the coin with abbreviations replaced by full words */ + unabridged_legend?: string; }