diff --git a/apps/api/src/controllers/merchant/billing.controller.ts b/apps/api/src/controllers/merchant/billing.controller.ts index f2d2b74..419a9f9 100644 --- a/apps/api/src/controllers/merchant/billing.controller.ts +++ b/apps/api/src/controllers/merchant/billing.controller.ts @@ -182,6 +182,11 @@ export const MerchantBillingController = { }; format = (d) => d.toLocaleTimeString([], { hour: "2-digit", hour12: false }) + ":00"; + } else if (period === "90d") { + startTime = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000); + groupBy = { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }; + format = (d) => + d.toLocaleDateString([], { month: "short", day: "numeric" }); } else if (period === "30d") { startTime = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000); groupBy = { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }; @@ -214,7 +219,8 @@ export const MerchantBillingController = { // Fill in zeros for missing periods to ensure smooth chart const chartData: { name: string; volume: number }[] = []; - const steps = period === "24h" ? 24 : period === "30d" ? 30 : 7; + const steps = + period === "24h" ? 24 : period === "90d" ? 90 : period === "30d" ? 30 : 7; const stepMs = period === "24h" ? 3600000 : 86400000; for (let i = 0; i < steps; i++) { diff --git a/apps/api/src/routes/merchants.ts b/apps/api/src/routes/merchants.ts index 0b239ff..f4d0ff9 100644 --- a/apps/api/src/routes/merchants.ts +++ b/apps/api/src/routes/merchants.ts @@ -329,7 +329,7 @@ export async function merchantRoutes(app: FastifyInstance) { preHandler: requireAuth, schema: { querystring: z.object({ - period: z.enum(["24h", "7d", "30d"]).default("7d"), + period: z.enum(["24h", "7d", "30d", "90d"]).default("7d"), }), }, }, diff --git a/apps/checkout/package.json b/apps/checkout/package.json index 0693b3b..32f16a3 100644 --- a/apps/checkout/package.json +++ b/apps/checkout/package.json @@ -23,7 +23,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "socket.io-client": "^4.8.3", - "tailwind-merge": "^3.4.1", + "tailwind-merge": "^3.6.0", "@qodinger/knot-types": "workspace:*" }, "devDependencies": { diff --git a/apps/checkout/src/app/checkout/[invoiceId]/CheckoutPageClient.tsx b/apps/checkout/src/app/checkout/[invoiceId]/CheckoutPageClient.tsx index ed7e181..9ef079e 100644 --- a/apps/checkout/src/app/checkout/[invoiceId]/CheckoutPageClient.tsx +++ b/apps/checkout/src/app/checkout/[invoiceId]/CheckoutPageClient.tsx @@ -79,7 +79,7 @@ export default function CheckoutPageClient({ (data: { status: string; confirmations: number; - txHash: string; + txHash: string | null; cryptoAmountReceived?: number; }) => { setInvoice((prev) => { diff --git a/apps/checkout/src/app/checkout/[invoiceId]/page.tsx b/apps/checkout/src/app/checkout/[invoiceId]/page.tsx index be82cb0..228e8c9 100644 --- a/apps/checkout/src/app/checkout/[invoiceId]/page.tsx +++ b/apps/checkout/src/app/checkout/[invoiceId]/page.tsx @@ -43,7 +43,7 @@ export async function generateMetadata({ description: `Amount: ${amount}. Pay securely with crypto via KnotEngine.`, images: invoice.merchant?.logo_url ? [invoice.merchant.logo_url] - : ["/og-image-checkout.png"], + : undefined, }, twitter: { card: "summary", @@ -51,7 +51,7 @@ export async function generateMetadata({ description: `Securely send ${amount} in crypto.`, images: invoice.merchant?.logo_url ? [invoice.merchant.logo_url] - : ["/og-image-checkout.png"], + : undefined, }, }; } diff --git a/apps/checkout/src/app/layout.tsx b/apps/checkout/src/app/layout.tsx index 293e877..1cfb700 100644 --- a/apps/checkout/src/app/layout.tsx +++ b/apps/checkout/src/app/layout.tsx @@ -34,20 +34,11 @@ export const metadata: Metadata = { siteName: "KnotEngine Checkout", title: "KnotEngine | Secure Crypto Checkout", description: "Accept crypto payments directly into your own wallet.", - images: [ - { - url: "/og-image-checkout.png", - width: 1200, - height: 630, - alt: "KnotEngine Secure Checkout", - }, - ], }, twitter: { card: "summary_large_image", title: "KnotEngine | Secure Crypto Checkout", description: "Accept crypto payments directly into your own wallet.", - images: ["/og-image-checkout.png"], creator: "@knotengine", }, }; diff --git a/apps/checkout/src/components/CheckoutCard.tsx b/apps/checkout/src/components/CheckoutCard.tsx index 2e22718..ca15cb7 100644 --- a/apps/checkout/src/components/CheckoutCard.tsx +++ b/apps/checkout/src/components/CheckoutCard.tsx @@ -5,36 +5,10 @@ import { QRCodeSVG } from "qrcode.react"; import { Copy, Check, Clock, AlertCircle, Wallet } from "lucide-react"; import { cn } from "@/lib/utils"; import { CRYPTO_LOGOS, Currency } from "@qodinger/knot-types"; +import { Invoice } from "@/types/invoice"; interface CheckoutCardProps { - invoice: { - invoice_id: string; - amount_usd: number; - crypto_amount: number; - crypto_amount_received?: number; - crypto_currency: string; - pay_address: string; - status: string; - expires_at: string; - fee_usd: number; - metadata?: { - isTestnet?: boolean; - feeResponsibility?: "client" | "merchant"; - }; - merchant?: { - name: string; - logo_url?: string | null; - return_url?: string | null; - theme?: "light" | "dark" | "system"; - brand_color?: string; - branding_enabled?: boolean; - branding_alignment?: "left" | "center"; - remove_branding?: boolean; - bip21_enabled?: boolean; - plan?: "starter" | "professional" | "enterprise"; - }; - description?: string; - }; + invoice: Invoice; } export function CheckoutCard({ invoice }: CheckoutCardProps) { @@ -278,10 +252,10 @@ export function CheckoutCard({ invoice }: CheckoutCardProps) { USD
{invoice.metadata?.feeResponsibility === "client" && - invoice.fee_usd > 0 && + (invoice.fee_usd ?? 0) > 0 && invoice.status !== "partially_paid" && (- Includes ${invoice.fee_usd.toFixed(2)} Platform Fee + Includes ${(invoice.fee_usd ?? 0).toFixed(2)} Platform Fee
)} diff --git a/apps/checkout/src/types/invoice.ts b/apps/checkout/src/types/invoice.ts index b7da3c3..f899fc6 100644 --- a/apps/checkout/src/types/invoice.ts +++ b/apps/checkout/src/types/invoice.ts @@ -7,12 +7,18 @@ export interface Invoice { pay_address: string; status: string; expires_at: string; - fee_usd: number; - tx_hash?: string; + fee_usd?: number; + fee_crypto?: number; + tx_hash?: string | null; confirmations?: number; + required_confirmations?: number; + paid_at?: string | null; + created_at?: string; metadata?: { isTestnet?: boolean; feeResponsibility?: "client" | "merchant"; + network?: string; + baseAmountUsd?: number; }; merchant?: { name: string; @@ -23,7 +29,9 @@ export interface Invoice { branding_enabled?: boolean; remove_branding?: boolean; bip21_enabled?: boolean; + branding_alignment?: "left" | "center"; plan?: "starter" | "professional" | "enterprise"; }; - description?: string; + description?: string | null; + checkout_url?: string; } diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 42ce360..9f225ff 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -39,7 +39,7 @@ "socket.io-client": "^4.8.3", "sonner": "^2.0.7", "swr": "^2.4.0", - "tailwind-merge": "^3.4.1", + "tailwind-merge": "^3.6.0", "zod": "^3.22.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ad430a..c844feb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -214,8 +214,8 @@ importers: specifier: ^4.8.3 version: 4.8.3 tailwind-merge: - specifier: ^3.4.1 - version: 3.4.1 + specifier: ^3.6.0 + version: 3.6.0 devDependencies: '@tailwindcss/postcss': specifier: ^4 @@ -320,8 +320,8 @@ importers: specifier: ^2.4.0 version: 2.4.0(react@19.2.3) tailwind-merge: - specifier: ^3.4.1 - version: 3.4.1 + specifier: ^3.6.0 + version: 3.6.0 zod: specifier: ^3.22.4 version: 3.25.76 @@ -349,7 +349,7 @@ importers: version: 9.39.2(jiti@2.6.1) eslint-config-next: specifier: 16.1.6 - version: 16.1.6(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 16.1.6(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) shadcn: specifier: ^3.8.5 version: 3.8.5(@types/node@20.19.33)(typescript@5.9.3) @@ -2622,6 +2622,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -4003,6 +4004,7 @@ packages: git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} + deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true glob-parent@5.1.2: @@ -5945,8 +5947,8 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwind-merge@3.4.1: - resolution: {integrity: sha512-2OA0rFqWOkITEAOFWSBSApYkDeH9t2B3XSJuI4YztKBzK3mX0737A2qtxDZ7xkw9Zfh0bWl+r34sF3HXV+Ig7Q==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -6256,6 +6258,7 @@ packages: uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@11.1.0: @@ -9683,33 +9686,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.1.6(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@next/eslint-plugin-next': 16.1.6 - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@2.6.1)) - globals: 16.4.0 - typescript-eslint: 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - eslint-config-next@16.1.6(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.1.6 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@2.6.1)) @@ -9735,21 +9718,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - get-tsconfig: 4.13.6 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.15 - unrs-resolver: 1.11.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -9761,62 +9729,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -9827,7 +9755,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12087,7 +12015,7 @@ snapshots: prompts: 2.4.2 recast: 0.23.11 stringify-object: 5.0.0 - tailwind-merge: 3.4.1 + tailwind-merge: 3.6.0 ts-morph: 26.0.0 tsconfig-paths: 4.2.0 validate-npm-package-name: 7.0.2 @@ -12416,7 +12344,7 @@ snapshots: tagged-tag@1.0.0: {} - tailwind-merge@3.4.1: {} + tailwind-merge@3.6.0: {} tailwindcss@4.1.18: {}