├── .env.example
├── .gitignore
├── README-zh.md
├── README.md
├── app
├── admin
│ ├── api
│ │ ├── ka
│ │ │ └── route.ts
│ │ └── manual
│ │ │ └── route.ts
│ ├── ka-list
│ │ ├── form.tsx
│ │ ├── list.tsx
│ │ └── page.tsx
│ ├── manual-list
│ │ ├── form.tsx
│ │ ├── list.tsx
│ │ └── page.tsx
│ ├── navbar.tsx
│ ├── order-list
│ │ └── page.tsx
│ └── page.tsx
├── api
│ ├── check-pay
│ │ └── route.ts
│ ├── check
│ │ └── [hash]
│ │ │ └── route.ts
│ ├── job
│ │ └── route.ts
│ └── order
│ │ └── route.ts
├── favicon.ico
├── globals.css
├── layout.tsx
├── order
│ └── [hash]
│ │ ├── copy-button.tsx
│ │ ├── countdown.tsx
│ │ ├── loop.tsx
│ │ └── page.tsx
├── page.tsx
└── shop
│ ├── cart.tsx
│ ├── orders.tsx
│ └── page.tsx
├── components.json
├── components
├── app
│ └── container.tsx
└── ui
│ ├── alert-dialog.tsx
│ ├── alert.tsx
│ ├── button.tsx
│ ├── drawer.tsx
│ ├── input.tsx
│ ├── label.tsx
│ ├── menubar.tsx
│ ├── radio-group.tsx
│ ├── toast.tsx
│ ├── toaster.tsx
│ └── use-toast.ts
├── cron.js
├── lib
├── chain.ts
├── prisma.ts
└── utils.ts
├── messages
└── zh.json
├── middleware.ts
├── next.config.mjs
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── prisma
└── schema.prisma
├── tailwind.config.ts
└── tsconfig.json
/.env.example:
--------------------------------------------------------------------------------
1 | #数据库地址
2 | DATABASE_URL=prisma://xxxx
3 | #trx链API地址,如果也是同样的链,可以不用修改
4 | TRXSCAN_ENDPOINT=https://apilist.tronscanapi.com/api/new/token_trc20/transfers
5 | #trx链的USDT的协议地址,如果也是同样的链同样的币,可以不用修改
6 | TRX_USDT_TOKEN=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
7 | #trx链的钱包地址
8 | TRX_WALLET=xxxx
9 | #admin 管理页面的账号密码
10 | HTTP_BASIC_AUTH=admin:lumimaPay
11 | #当前服务的域名
12 | HOST=http://localhost:3000
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 | /.idea/
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
38 | .env
39 |
--------------------------------------------------------------------------------
/README-zh.md:
--------------------------------------------------------------------------------
1 | # LuminaPay 项目介绍 📄
2 | LuminaPay 是一个创新的加密货币支付平台,旨在为企业和个人用户提供全方位的支付解决方案
3 |
4 | - **Welcome to the LuminaPay project! Please select your preferred language:**:
5 | - **欢迎来到 LuminaPay 项目!请选择您喜欢的语言:**:
6 |
7 |
8 | - [English](README.md)
9 | - [中文](README-zh.md)
10 |
11 | ## 功能特点 🌟
12 | - ✅ 支持虚拟货币支付(暂时仅支持TRON链的币种/合约支付)
13 | - ❎ 支持动态增加支持的币种/合约/链
14 | - ❎ 数据分析与管理,详细的财务报表统计
15 | - ❎ 钱包黑名单管理
16 | - ❎ 使用最新版本nextjs
17 | - ❎ 支持多语言
18 | -
19 | ## 演示 🌟
20 | - [客户端](https://lumima-pay.vercel.app/shop)
21 | - [管理端](https://lumima-pay.vercel.app/admin)
22 | - 账号:admin
23 | - 密码:LuminaPay
24 |
25 | ## 为什么选择开源? 🤔
26 |
27 | 1. 个人开发者,没有太多时间维护开发
28 | 2. 开源项目,只靠[赞助打赏](https://lumima-pay.vercel.app/shop),没有太多动力
29 |
30 | ### 如何部署? 🚀
31 |
32 | **(1) 克隆项目代码:**
33 | ```bash
34 | git clone https://github.com/kawikahoney/LuminaPay.git
35 | cd LuminaPay/
36 | ```
37 |
38 | **(2) 安装核心依赖:**
39 | ```bash
40 | npm install
41 | ```
42 |
43 | **(3) 修改配置:**
44 | 配置文件的模板在根目录的`.env.example`中,需复制该模板创建最终生效的 `.env` 文件:
45 | ```bash
46 | cp .env.example .env
47 | ```
48 |
49 | 然后在`.env`中填入配置,以下是对默认配置的说明,可根据需要进行自定义修改:
50 |
51 | ```bash
52 | #数据库地址
53 | DATABASE_URL=prisma://xxxx
54 | #trx链API地址,如果也是同样的链,可以不用修改
55 | TRXSCAN_ENDPOINT=https://apilist.tronscanapi.com/api/new/token_trc20/transfers
56 | #trx链的USDT的协议地址,如果也是同样的链同样的币,可以不用修改
57 | TRX_USDT_TOKEN=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
58 | #trx链的钱包地址
59 | TRX_WALLET=xxxx
60 | #admin 管理页面的账号密码
61 | HTTP_BASIC_AUTH=admin:LuminaPay
62 | #当前服务的域名
63 | HOST=http://localhost:3000
64 | ```
65 |
66 | **(4) 配置数据库:**
67 | > 该项目使用[supabase](https://supabase.com/)作为数据库,有疑问联系作者赞助支持
68 |
69 | ```bash
70 | npx prisma db push
71 | ```
72 |
73 | **(5) 运行:**
74 |
75 | ```bash
76 | npx run dev
77 | ```
78 |
79 | **(6) 检查链上状态:**
80 | > 需要定时检查哦,如果你的客户量不大可以用到C端,如果客户量大记得改成定时执行
81 | ```bash
82 | curl http://127.0.0.1:3000/api/job
83 | ```
84 |
85 | ## 联系我们 📞
86 |
87 | 如果你有任何问题或建议,欢迎通过以下方式联系我们:
88 | - 邮件:[workautoman@proton.me](mailto:workautoman@proton.me)
89 |
90 | 我们期待与你一起,共同打造一个安全、高效、便捷的支付平台! 🚀
91 |
92 | ## 参考项目 🙏
93 | [uka](https://github.com/tans/uka) 当前仅支持BSC链的币/合约
94 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LuminaPay Project Introduction 📄
2 | LuminaPay is an innovative cryptocurrency payment platform designed to provide comprehensive payment solutions for businesses and individual users.
3 |
4 | - **Welcome to the LuminaPay project! Please select your preferred language:**:
5 | - **欢迎来到 LuminaPay 项目!请选择您喜欢的语言:**:
6 |
7 | - [English](README.md)
8 | - [中文](README-zh.md)
9 |
10 | ## Features 🌟
11 | - ✅ Supports cryptocurrency payments (currently only supports TRON chain tokens/contracts)
12 | - ❎ Supports dynamic addition of supported tokens/contracts/chains
13 | - ❎ Data analysis and management with detailed financial report statistics
14 | - ❎ Wallet blacklist management
15 | - ❎ Use the latest version of nextjs
16 | - ❎ Support multiple languages
17 |
18 |
19 | ## 演示 🌟
20 | - [User Client](https://lumima-pay.vercel.app/shop)
21 | - [Management Client](https://lumima-pay.vercel.app/admin)
22 | - account:admin
23 | - passwork:LuminaPay
24 |
25 | ## Why Choose Open Source? 🤔
26 |
27 | 1. Personal developer, not much time for maintenance and development
28 | 2. Open source project, relies only on [sponsorship donations](https://lumima-pay.vercel.app/shop), lacks motivation
29 |
30 | ### How to Deploy? 🚀
31 |
32 |
33 | **(1) Clone the project code:**
34 | ```bash
35 | git clone https://github.com/kawikahoney/LuminaPay.git
36 | cd LuminaPay/
37 | ```
38 |
39 | **(2) Install core dependencies:**
40 | ```bash
41 | npm install
42 | ```
43 |
44 | **(3) Modify configuration:**
45 | The template for the configuration file is located in the root directory as `.env.example`. Copy this template to create the final effective `.env` file:
46 | ```bash
47 | cp .env.example .env
48 | ```
49 |
50 | Then fill in the configuration in `.env`. Below are explanations for the default configurations, which can be customized as needed:
51 |
52 | ```bash
53 | # Database URL
54 | DATABASE_URL=prisma://xxxx
55 | # TRX chain API endpoint, if using the same chain, no need to modify
56 | TRXSCAN_ENDPOINT=https://apilist.tronscanapi.com/api/new/token_trc20/transfers
57 | # Protocol address for USDT on the TRX chain, if using the same chain and token, no need to modify
58 | TRX_USDT_TOKEN=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
59 | # Wallet address on the TRX chain
60 | TRX_WALLET=xxxx
61 | # Admin page username and password
62 | HTTP_BASIC_AUTH=admin:LuminaPay
63 | # Current service domain
64 | HOST=http://localhost:3000
65 | ```
66 |
67 | **(4) Configure the database:**
68 | > This project uses [supabase](https://supabase.com/) as the database. If you have questions, contact the author for support.
69 |
70 | ```bash
71 | npx prisma db push
72 | ```
73 |
74 | **(5) Run:**
75 |
76 | ```bash
77 | npx run dev
78 | ```
79 |
80 | ## Contact Us 📞
81 |
82 | If you have any questions or suggestions, feel free to contact us via:
83 | - Email: [workautoman@proton.me](mailto:workautoman@proton.me)
84 |
85 | We look forward to working with you to create a safe, efficient, and convenient payment platform! 🚀
86 |
87 | ## Source Code Reference and Thanks for the Support 🙏
88 | [uka](https://github.com/tans/uka) Currently, only BSC chain coins/contracts are supported
89 |
--------------------------------------------------------------------------------
/app/admin/api/ka/route.ts:
--------------------------------------------------------------------------------
1 | import prisma from "@/lib/prisma";
2 | import { NextRequest } from "next/server";
3 | import _ from "lodash";
4 |
5 | export async function GET(request) {
6 | let list = await prisma.ka.findMany({ orderBy: { price: "asc" } });
7 | return Response.json({ status: true, list });
8 | }
9 |
10 | export async function POST(request: NextRequest) {
11 | let json = await request.json();
12 |
13 | let data = {
14 | title: json.title,
15 | price: parseFloat(json.price),
16 | quota: parseInt(json.quota),
17 | };
18 | if (json.id) {
19 | await prisma.ka.update({
20 | where: { id: json.id },
21 | data,
22 | });
23 | } else {
24 | await prisma.ka.create({
25 | data,
26 | });
27 | }
28 |
29 | return Response.json({ status: true });
30 | }
31 |
32 | export async function DELETE(request: NextRequest) {
33 | let json = await request.json();
34 | let list = await prisma.ka.findMany({ orderBy: { price: "asc" } });
35 | if (list.length <= 1) {
36 | return Response.json({ status: false, message: "没有套餐" });
37 | }
38 | if (json.id) {
39 | await prisma.ka.delete({
40 | where: { id: json.id },
41 | });
42 | }
43 | return Response.json({ status: true });
44 | }
45 |
--------------------------------------------------------------------------------
/app/admin/api/manual/route.ts:
--------------------------------------------------------------------------------
1 | import prisma from "@/lib/prisma";
2 | import { NextRequest } from "next/server";
3 | import _ from "lodash";
4 | import {gen_nonid} from "@/lib/utils";
5 |
6 |
7 | export async function GET(request) {
8 | let list = await prisma.manual.findMany({ orderBy: { id: "desc" } });
9 | return Response.json({ status: true, list });
10 | }
11 |
12 | export async function POST(request: NextRequest) {
13 | let json = await request.json();
14 |
15 | let data = {
16 | quota: parseInt(json.quota),
17 | hash: gen_nonid(),
18 | log: json.log,
19 | };
20 |
21 | if (json.id) {
22 | await prisma.manual.update({
23 | where: { id: json.id },
24 | data,
25 | });
26 | } else {
27 | await prisma.manual.create({ data });
28 | }
29 |
30 | return Response.json({ status: true });
31 | }
32 |
--------------------------------------------------------------------------------
/app/admin/ka-list/form.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Button } from "@/components/ui/button";
4 | import { Input } from "@/components/ui/input";
5 |
6 | import {
7 | Drawer,
8 | DrawerClose,
9 | DrawerContent,
10 | DrawerDescription,
11 | DrawerFooter,
12 | DrawerHeader,
13 | DrawerTitle,
14 | DrawerTrigger,
15 | } from "@/components/ui/drawer";
16 | import { useState } from "react";
17 |
18 | export default function KaForm(props) {
19 | let [form, setForm] = useState(
20 | props.ka || {
21 | price: 1,
22 | title: "",
23 | },
24 | );
25 | return (
26 | <>
27 |
28 | {props.children}
29 |
30 |
31 | {form.id ? "修改商品" : "创建商品"}
32 |
33 |
34 |
套餐标题
35 |
{
39 | form.title = e.target.value;
40 | setForm({ ...form });
41 | }}
42 | >
43 |
套餐价格
44 |
{
48 | form.price = e.target.value;
49 | setForm({ ...form });
50 | }}
51 | >
52 |
额度
53 |
{
57 | form.quota = e.target.value;
58 | setForm({ ...form });
59 | }}
60 | >
61 |
62 |
63 |
64 |
65 |
78 |
79 |
80 |
81 |
82 |
83 |
84 | >
85 | );
86 | }
87 |
--------------------------------------------------------------------------------
/app/admin/ka-list/list.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect, useState } from "react";
4 | import KaForm from "./form";
5 | import { Button, buttonVariants } from "@/components/ui/button";
6 |
7 | export default function KaList(props) {
8 | let [list, setList] = useState([]);
9 | useEffect(function () {
10 | (async function () {
11 | let { list } = await (await fetch("/admin/api/ka")).json();
12 | setList(list);
13 | })();
14 | }, []);
15 |
16 |
17 | function removeKa(id){
18 | return async function(){
19 | await fetch("/admin/api/ka",{
20 | method: "DELETE",
21 | body: JSON.stringify({id:id})
22 | });
23 | let { list } = await (await fetch("/admin/api/ka")).json();
24 | setList(list);
25 | }
26 | }
27 |
28 | return (
29 | <>
30 | {list.map((item) => (
31 |
35 |
{item.title}
36 |
37 | {item.quota}/{item.price}u
38 |
39 |
40 | 修改
41 |
42 |
删除
43 |
44 | ))}
45 | >
46 | );
47 | }
48 |
--------------------------------------------------------------------------------
/app/admin/ka-list/page.tsx:
--------------------------------------------------------------------------------
1 | import Container from "@/components/app/container";
2 | import KaForm from "./form";
3 | import KaList from "./list";
4 | import { Button, buttonVariants } from "@/components/ui/button";
5 | import Navbar from "../navbar";
6 | export default async function (props) {
7 | return (
8 | <>
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
21 |
22 |
23 | >
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/app/admin/manual-list/form.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Button } from "@/components/ui/button";
4 | import { Input } from "@/components/ui/input";
5 |
6 | import {
7 | Drawer,
8 | DrawerClose,
9 | DrawerContent,
10 | DrawerDescription,
11 | DrawerFooter,
12 | DrawerHeader,
13 | DrawerTitle,
14 | DrawerTrigger,
15 | } from "@/components/ui/drawer";
16 | import { useState } from "react";
17 |
18 | export default function (props) {
19 | let [form, setForm] = useState(
20 | props.manual || {
21 | quota: 1,
22 | log: "",
23 | },
24 | );
25 | return (
26 | <>
27 |
28 | {props.children}
29 |
30 |
31 |
32 |
33 |
备注
34 |
{
38 | form.log = e.target.value;
39 | setForm({ ...form });
40 | }}
41 | >
42 |
额度
43 |
{
47 | form.quota = e.target.value;
48 | setForm({ ...form });
49 | }}
50 | >
51 |
52 |
53 |
54 |
55 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | >
75 | );
76 | }
77 |
--------------------------------------------------------------------------------
/app/admin/manual-list/list.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect, useState } from "react";
4 | import ManualForm from "./form";
5 | import { Button, buttonVariants } from "@/components/ui/button";
6 | import CopyButton from "@/app/order/[hash]/copy-button";
7 | import { CopyIcon } from "@radix-ui/react-icons";
8 |
9 | export default function (props) {
10 | let [list, setList] = useState([]);
11 | useEffect(function () {
12 | (async function () {
13 | let { list } = await (await fetch("/admin/api/manual")).json();
14 | setList(list);
15 | })();
16 | }, []);
17 | return (
18 | <>
19 | {list.map((item) => (
20 |
24 |
{item.log}
25 |
{item.quota}
26 |
m-{item.hash}
27 |
28 | {item.used && }
29 |
30 |
31 | 修改
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | ))}
41 | >
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/app/admin/manual-list/page.tsx:
--------------------------------------------------------------------------------
1 | import Container from "@/components/app/container";
2 | import ManualForm from "./form";
3 | import ManualList from "./list";
4 | import { Button, buttonVariants } from "@/components/ui/button";
5 | import Navbar from "../navbar";
6 | export default async function (props) {
7 | return (
8 | <>
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
21 |
22 |
23 | >
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/app/admin/navbar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import {
3 | Menubar,
4 | MenubarContent,
5 | MenubarItem,
6 | MenubarMenu,
7 | MenubarSeparator,
8 | MenubarShortcut,
9 | MenubarTrigger,
10 | } from "@/components/ui/menubar";
11 | import { Link } from "next-view-transitions";
12 | export default function (props) {
13 | let { id, current } = props;
14 |
15 | return (
16 |
17 |
18 |
19 | 首页
20 |
21 |
22 | 订单
23 |
24 |
25 | 套餐
26 |
27 |
28 | 兑换码
29 |
30 |
31 |
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/app/admin/order-list/page.tsx:
--------------------------------------------------------------------------------
1 | import Container from "@/components/app/container";
2 | import Navbar from "../navbar";
3 | import prisma from "@/lib/prisma";
4 | import { CheckIcon } from "@radix-ui/react-icons";
5 | import dayjs from "dayjs";
6 |
7 | export default async function OrderList(props) {
8 | let orders = await prisma.order.findMany({
9 | where: {},
10 | include: { ka: true },
11 | orderBy: { id: "desc" },
12 | take: 1000,
13 | });
14 | return (
15 | <>
16 |
17 |
18 |
38 |
39 | >
40 | );
41 | }
42 |
--------------------------------------------------------------------------------
/app/admin/page.tsx:
--------------------------------------------------------------------------------
1 | import Container from "@/components/app/container";
2 | import Navbar from "./navbar";
3 | import prisma from "@/lib/prisma";
4 | import { buttonVariants } from "@/components/ui/button";
5 |
6 | export default async function (props) {
7 | let kaCount = await prisma.ka.count();
8 | let orderCount = await prisma.order.count();
9 | let payedCount = await prisma.order.count({ where: { payed: true } });
10 | let orders = await prisma.order.findMany({ where: { payed: true } });
11 | let payedAmount = 0;
12 | orders.map((o) => {
13 | payedAmount = o.price * 1 + payedAmount;
14 | });
15 | let usedCount = await prisma.order.count({ where: { used: true } });
16 | return (
17 | <>
18 |
19 |
20 |
21 |
数据汇总:
22 |
23 |
销售额:{payedAmount}
24 |
成交数:{payedCount}
25 |
下单数:{orderCount}
26 |
兑换数:{usedCount}
27 |
套餐数:{kaCount}
28 |
29 |
30 |
31 | 收银台
32 |
33 |
34 | >
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/app/api/check-pay/route.ts:
--------------------------------------------------------------------------------
1 | import prisma from "@/lib/prisma";
2 |
3 | export async function POST(request) {
4 | let { hash } = await request.json();
5 | let order = await prisma.order.findUnique({
6 | where: {
7 | hash,
8 | },
9 | });
10 |
11 | return Response.json({
12 | payed: order?.payed,
13 | });
14 | }
15 |
--------------------------------------------------------------------------------
/app/api/check/[hash]/route.ts:
--------------------------------------------------------------------------------
1 | import prisma from "@/lib/prisma";
2 |
3 | export async function GET(request, ctx) {
4 | let { hash } = ctx.params;
5 |
6 | hash = hash.replace("key-", "");
7 | if (hash.startsWith("m-")) {
8 | hash = hash.replace("m-", "");
9 | let manual = await prisma.manual.findFirst({
10 | where: {
11 | hash: hash,
12 | },
13 | });
14 |
15 | if (!manual) {
16 | return Response.json({ status: true, result: "nokey" });
17 | }
18 | if (manual.used) {
19 | return Response.json({ status: true, result: "used" });
20 | }
21 |
22 | await prisma.manual.update({
23 | where: { id: manual.id },
24 | data: {
25 | used: true,
26 | usedAt: new Date(),
27 | },
28 | });
29 | }
30 | let order = await prisma.order.findFirst({
31 | where: { hash },
32 | include: { ka: true },
33 | });
34 | if (!order) {
35 | return Response.json({ status: true, result: "nokey" });
36 | }
37 | if (!order.payed) {
38 | return Response.json({ status: true, result: "nopay" });
39 | }
40 | if (order.used) {
41 | return Response.json({ status: true, result: "used" });
42 | }
43 | await prisma.order.update({
44 | where: { id: order.id },
45 | data: {
46 | used: true,
47 | usedAt: new Date(),
48 | },
49 | });
50 | return Response.json({
51 | status: true,
52 | quota: order.ka.quota,
53 | result: "success",
54 | });
55 | }
56 |
--------------------------------------------------------------------------------
/app/api/job/route.ts:
--------------------------------------------------------------------------------
1 | import { fetchTransactions } from "@/lib/chain";
2 | import prisma from "@/lib/prisma";
3 |
4 | import BigNumber from "bignumber.js";
5 | import dayjs from "dayjs";
6 |
7 | export const dynamic = "force-dynamic";
8 |
9 | interface Tx {
10 | quant: String;
11 | transaction_id: String;
12 | }
13 | let checkTx = async (tx: Tx) => {
14 | let price = new BigNumber(tx.quant)
15 | .dividedBy("1000000")
16 | .toString();
17 | let _tx = await prisma.tx.findFirst({
18 | where: {
19 | hash: tx.transaction_id,
20 | },
21 | });
22 | if (_tx?.checked) {
23 | return;
24 | }
25 |
26 | let order = await prisma.order.findFirst({
27 | where: {
28 | price: price,
29 | createdAt: {
30 | gt: dayjs().add(-30, "minute").toDate(),
31 | },
32 | },
33 | });
34 |
35 | if (!order) {
36 | return;
37 | }
38 | if (order.payed) {
39 | console.log("order checked ", order);
40 | }
41 |
42 | await prisma.order.update({
43 | where: { id: order.id },
44 | data: {
45 | payed: true,
46 | },
47 | });
48 |
49 | await prisma.tx.create({
50 | data: {
51 | checked: true,
52 | orderId: order.id,
53 | hash: tx.transaction_id,
54 | },
55 | });
56 | };
57 |
58 | export async function GET(request) {
59 | let result = await fetchTransactions();
60 | if (result.total<1){
61 | return Response.json({ status: false });
62 | }
63 | for (let tx of result.token_transfers) {
64 | await checkTx(tx);
65 | }
66 | return Response.json({ status: true });
67 | }
68 |
--------------------------------------------------------------------------------
/app/api/order/route.ts:
--------------------------------------------------------------------------------
1 | import prisma from "@/lib/prisma";
2 |
3 |
4 |
5 | import dayjs from "dayjs";
6 | import {gen_nonid} from "@/lib/utils";
7 |
8 | let getPrice = async function (ka) {
9 | let currentHour = dayjs().format("YYYYMMDDHH");
10 | let no = 1;
11 |
12 | if (ka.currentHour == currentHour) {
13 | no = ka.currentNo + 1;
14 | }
15 | //不能以0结尾
16 | if (no % 10 == 0) {
17 | no += 1;
18 | }
19 |
20 | await prisma.ka.update({
21 | where: { id: ka.id },
22 | data: {
23 | currentNo: no,
24 | currentHour: currentHour,
25 | },
26 | });
27 | let price = `${ka.price.toFixed(2)}${no}`;
28 | let order = await prisma.order.findFirst({
29 | where: {
30 | createdAt: {
31 | gt: dayjs().add(-30, "minute").toDate(),
32 | },
33 | price: price,
34 | },
35 | });
36 | if (order) {
37 | return await getPrice(ka);
38 | }
39 | return [price, currentHour];
40 | };
41 |
42 | export async function POST(request) {
43 | let json = await request.json();
44 | let { kaId } = json;
45 | kaId = parseInt(kaId);
46 | console.log(kaId);
47 | let ka = await prisma.ka.findFirst({ where: { id: kaId } });
48 | if (!ka) {
49 | return Response.json({
50 | status: false,
51 | message: "套餐不存在",
52 | });
53 | }
54 | let [price, hours] = await getPrice(ka);
55 | if (!process.env.TRX_WALLET) {
56 | return Response.json({
57 | status: false,
58 | message: "未设定收款地址",
59 | });
60 | }
61 | let order = await prisma.order.create({
62 | data: {
63 | kaId: kaId,
64 | price: price,
65 | hash: gen_nonid(),
66 | hours: hours,
67 | address: process.env.TRX_WALLET,
68 | },
69 | });
70 |
71 | return Response.json({ status: true, order });
72 | }
73 |
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Victor-Sava/LuminaPay/537c290d148973da9fbce03a2e71336116f006d3/app/favicon.ico
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @layer base {
6 | :root {
7 | --background: 0 0% 100%;
8 | --foreground: 222.2 84% 4.9%;
9 |
10 | --card: 0 0% 100%;
11 | --card-foreground: 222.2 84% 4.9%;
12 |
13 | --popover: 0 0% 100%;
14 | --popover-foreground: 222.2 84% 4.9%;
15 |
16 | --primary: 222.2 47.4% 11.2%;
17 | --primary-foreground: 210 40% 98%;
18 |
19 | --secondary: 210 40% 96.1%;
20 | --secondary-foreground: 222.2 47.4% 11.2%;
21 |
22 | --muted: 210 40% 96.1%;
23 | --muted-foreground: 215.4 16.3% 46.9%;
24 |
25 | --accent: 210 40% 96.1%;
26 | --accent-foreground: 222.2 47.4% 11.2%;
27 |
28 | --destructive: 0 84.2% 60.2%;
29 | --destructive-foreground: 210 40% 98%;
30 |
31 | --border: 214.3 31.8% 91.4%;
32 | --input: 214.3 31.8% 91.4%;
33 | --ring: 222.2 84% 4.9%;
34 |
35 | --radius: 0.5rem;
36 | }
37 |
38 | .dark {
39 | --background: 222.2 84% 4.9%;
40 | --foreground: 210 40% 98%;
41 |
42 | --card: 222.2 84% 4.9%;
43 | --card-foreground: 210 40% 98%;
44 |
45 | --popover: 222.2 84% 4.9%;
46 | --popover-foreground: 210 40% 98%;
47 |
48 | --primary: 210 40% 98%;
49 | --primary-foreground: 222.2 47.4% 11.2%;
50 |
51 | --secondary: 217.2 32.6% 17.5%;
52 | --secondary-foreground: 210 40% 98%;
53 |
54 | --muted: 217.2 32.6% 17.5%;
55 | --muted-foreground: 215 20.2% 65.1%;
56 |
57 | --accent: 217.2 32.6% 17.5%;
58 | --accent-foreground: 210 40% 98%;
59 |
60 | --destructive: 0 62.8% 30.6%;
61 | --destructive-foreground: 210 40% 98%;
62 |
63 | --border: 217.2 32.6% 17.5%;
64 | --input: 217.2 32.6% 17.5%;
65 | --ring: 212.7 26.8% 83.9%;
66 | }
67 | }
68 |
69 | @layer base {
70 | * {
71 | @apply border-border;
72 | }
73 | body {
74 | @apply bg-background text-foreground;
75 | }
76 | }
--------------------------------------------------------------------------------
/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import "./globals.css";
3 | import { ViewTransitions } from "next-view-transitions";
4 | import { Toaster } from "@/components/ui/toaster";
5 | export const metadata: Metadata = {
6 | title: "luminaPay - 第四方支付平台",
7 | description: "为您提供全方位的支付解决方案,支持虚拟货币",
8 | };
9 |
10 | export default function RootLayout({
11 | children,
12 | }: Readonly<{
13 | children: React.ReactNode;
14 | }>) {
15 | return (
16 |
17 |
18 |
19 | {children}
20 |
21 |
22 |
23 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/app/order/[hash]/copy-button.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Button } from "@/components/ui/button";
3 | import { toast } from "@/components/ui/use-toast";
4 | import { CopyToClipboard } from "react-copy-to-clipboard";
5 |
6 | export default function ({ text, children }) {
7 | return (
8 | <>
9 |
10 |
17 |
18 | >
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/app/order/[hash]/countdown.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import FlipClockCountdown from "@leenguyen/react-flip-clock-countdown";
3 | import "@leenguyen/react-flip-clock-countdown/dist/index.css";
4 |
5 | export default function ({ endTime, children }) {
6 | return (
7 |
8 | {children}
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/app/order/[hash]/loop.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect } from "react";
4 |
5 | export default function ({ payed, hash }) {
6 | useEffect(function () {
7 | if (!payed) {
8 | setInterval(function () {
9 | fetch("/api/check-pay", {
10 | method: "POST",
11 | body: JSON.stringify({
12 | hash,
13 | }),
14 | })
15 | .then(function (res) {
16 | return res.json();
17 | })
18 | .then(function (json) {
19 | if (json.payed) {
20 | location.reload();
21 | }
22 | });
23 | }, 5000);
24 | }
25 | }, []);
26 | return <>>;
27 | }
28 |
--------------------------------------------------------------------------------
/app/order/[hash]/page.tsx:
--------------------------------------------------------------------------------
1 | import Container from "@/components/app/container";
2 | import prisma from "@/lib/prisma";
3 | import Countdown from "./countdown";
4 | import dayjs from "dayjs";
5 | import { BNB, USDT } from "ccy-icons";
6 | import CopyButton from "./copy-button";
7 | import {
8 | CheckIcon,
9 | CopyIcon,
10 | InfoCircledIcon,
11 | UpdateIcon,
12 | } from "@radix-ui/react-icons";
13 | import Loop from "./loop";
14 |
15 | export default async function ({ searchParams, params }) {
16 | let { hash } = params;
17 | let order = await prisma.order.findFirst({
18 | where: {
19 | hash: hash,
20 | },
21 | include: {
22 | ka: true,
23 | },
24 | });
25 | if (!order) {
26 | return <>没有找到订单数据:{hash}>;
27 | }
28 | return (
29 | <>
30 |
31 |
32 | {!order.payed && (
33 | <>
34 |
35 | 订单截止支付时间
36 |
37 |
47 | >
48 | )}
49 |
50 |
51 |
注意事项:
52 |
1. 复制金额和地址到钱包进行转账
53 |
2. 请确认小数准确, 否则无法自动确认交易。
54 |
55 | 3. 使用Tron链的USDT
56 |
57 |
58 |
59 |
60 |
61 |
62 | 收款地址:
63 |
64 |
65 | {order.address}
66 |
67 |
68 | {!order.payed && (
69 |
70 |
71 | 复制
72 |
73 | )}
74 |
75 |
76 |
77 |
支付金额:
78 |
79 |
套餐:
80 |
{order.ka.title}
81 |
82 |
83 |
84 |
{order.price} U
85 |
86 | {!order.payed && (
87 |
88 |
89 | 复制
90 |
91 | )}
92 |
93 |
94 | {!order.payed && (
95 |
96 |
97 |
自动检查链上交易数据中
98 |
99 | )}
100 |
101 | {order.payed && (
102 |
103 |
104 |
105 |
106 | 支付成功,兑换码:
107 |
108 |
{"key-" + order.hash}
109 |
110 |
111 | 复制
112 |
113 |
114 |
115 |
116 | 复制兑换码到商务客服发送兑换
117 |
118 |
119 | )}
120 |
121 | >
122 | );
123 | }
124 |
--------------------------------------------------------------------------------
/app/page.tsx:
--------------------------------------------------------------------------------
1 | // pages/index.js
2 | import Head from 'next/head'
3 | import {Link} from "next-view-transitions";
4 |
5 | export default function Home() {
6 | return (
7 |
8 |
9 |
LuminaPay
10 |
11 |
12 |
13 |
14 | {/* 标题部分 */}
15 |
16 |
17 |
欢迎来到 LuminaPay
18 |
一个创新的第四方支付平台,为您提供全方位的支付解决方案。
19 |
20 | 赞助
21 |
22 |
23 |
24 |
25 | {/* 功能特点部分 */}
26 |
27 |
28 |
功能特点 🌟
29 |
30 |
31 |
USDT支付
32 |
支持TRX链的USDT支付,提供安全、便捷的支付方式。
33 |
34 |
35 |
综合支付服务
36 |
支持银行卡、移动支付、电子钱包、跨境支付等多种支付方式。
37 |
38 |
39 |
用户自定义收款渠道
40 |
自由绑定银行账户、第三方支付平台或电子钱包,实现个性化支付管理。
41 |
42 |
43 |
数据分析与管理
44 |
利用大数据和AI技术,对交易数据进行深度分析,提供详细的财务报表和用户行为分析。
45 |
46 |
47 |
风险控制
48 |
通过先进的风控系统,对支付交易进行实时监控,识别并预防潜在的欺诈行为。
49 |
50 |
51 |
资金管理
52 |
提供账户管理、资金结算、对账服务等全方位的资金管理服务。
53 |
54 |
55 |
56 |
57 |
58 | {/* 未来计划部分 */}
59 |
60 |
61 |
未来计划 🌟
62 |
63 |
64 |
定制化解决方案
65 |
根据不同行业和企业的特定需求,提供个性化的支付解决方案。
66 |
67 |
68 |
跨境支付支持
69 |
支持多种货币和跨境支付渠道,帮助企业开拓国际市场,实现全球化经营。
70 |
71 |
72 |
73 |
74 |
75 | {/* 开源理念部分 */}
76 |
77 |
78 |
开源理念 👐
79 |
LuminaPay 致力于开源,推动技术创新,吸引更多开发者和企业参与,共同打造一个强大的支付平台。
80 |
83 |
84 |
85 |
86 | {/* 参与共创部分 */}
87 |
88 |
89 |
如何参与共创 🤝
90 |
欢迎所有对支付技术感兴趣的开发者和企业参与 LuminaPay 的共创。通过代码贡献、文档编写、社区支持和功能建议,共同定义平台的发展方向。
91 |
94 |
95 |
96 |
97 | {/* 联系我们部分 */}
98 |
99 |
100 |
联系我们 📞
101 |
如果你有任何问题或建议,欢迎通过以下方式联系我们:
102 |
103 | - 邮件:workautoman@proton.me
104 | - Github:Issues
105 |
106 |
107 |
108 |
109 |
110 | {/* 尾部部分 */}
111 |
116 |
117 | )
118 | }
119 |
--------------------------------------------------------------------------------
/app/shop/cart.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Button } from "@/components/ui/button";
3 | import { Label } from "@/components/ui/label";
4 | import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
5 | import { BNB, USDT } from "ccy-icons";
6 | import { useState } from "react";
7 | export default function ({ kaList }) {
8 | let [kaId, setKaId] = useState(kaList[0].id);
9 |
10 | let submitOrder = async () => {
11 | let { order } = await (
12 | await fetch("/api/order", {
13 | method: "POST",
14 | body: JSON.stringify({
15 | kaId: kaId,
16 | }),
17 | })
18 | ).json();
19 | let orders = localStorage.getItem("orders");
20 | orders = JSON.parse(orders || "[]");
21 | orders.push(order);
22 | localStorage.setItem("orders", JSON.stringify(orders));
23 | location.href = "/order/" + order.hash;
24 | };
25 |
26 | return (
27 | <>
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | 选择套餐
37 | {
40 | setKaId(value);
41 | }}
42 | >
43 | {kaList.map((item) => (
44 |
48 |
49 |
55 |
56 | ))}
57 |
58 |
59 |
60 |
61 |
62 | >
63 | );
64 | }
65 |
--------------------------------------------------------------------------------
/app/shop/orders.tsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Victor-Sava/LuminaPay/537c290d148973da9fbce03a2e71336116f006d3/app/shop/orders.tsx
--------------------------------------------------------------------------------
/app/shop/page.tsx:
--------------------------------------------------------------------------------
1 | import prisma from "@/lib/prisma";
2 | import Cart from "./cart";
3 | import Container from "@/components/app/container";
4 |
5 | export default async function Shop(props) {
6 | let kaList = await prisma.ka.findMany({
7 | where: { show: true },
8 | orderBy: { price: "asc" },
9 | });
10 |
11 | return (
12 | <>
13 |
14 |
15 |
16 | >
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "app/globals.css",
9 | "baseColor": "slate",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils"
16 | }
17 | }
--------------------------------------------------------------------------------
/components/app/container.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | export default function ({ children, ...props }) {
3 | let { className } = props;
4 | return (
5 |
6 | {children}
7 |
8 | );
9 | }
10 |
--------------------------------------------------------------------------------
/components/ui/alert-dialog.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
5 |
6 | import { cn } from "@/lib/utils"
7 | import { buttonVariants } from "@/components/ui/button"
8 |
9 | const AlertDialog = AlertDialogPrimitive.Root
10 |
11 | const AlertDialogTrigger = AlertDialogPrimitive.Trigger
12 |
13 | const AlertDialogPortal = AlertDialogPrimitive.Portal
14 |
15 | const AlertDialogOverlay = React.forwardRef<
16 | React.ElementRef,
17 | React.ComponentPropsWithoutRef
18 | >(({ className, ...props }, ref) => (
19 |
27 | ))
28 | AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
29 |
30 | const AlertDialogContent = React.forwardRef<
31 | React.ElementRef,
32 | React.ComponentPropsWithoutRef
33 | >(({ className, ...props }, ref) => (
34 |
35 |
36 |
44 |
45 | ))
46 | AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
47 |
48 | const AlertDialogHeader = ({
49 | className,
50 | ...props
51 | }: React.HTMLAttributes) => (
52 |
59 | )
60 | AlertDialogHeader.displayName = "AlertDialogHeader"
61 |
62 | const AlertDialogFooter = ({
63 | className,
64 | ...props
65 | }: React.HTMLAttributes) => (
66 |
73 | )
74 | AlertDialogFooter.displayName = "AlertDialogFooter"
75 |
76 | const AlertDialogTitle = React.forwardRef<
77 | React.ElementRef,
78 | React.ComponentPropsWithoutRef
79 | >(({ className, ...props }, ref) => (
80 |
85 | ))
86 | AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
87 |
88 | const AlertDialogDescription = React.forwardRef<
89 | React.ElementRef,
90 | React.ComponentPropsWithoutRef
91 | >(({ className, ...props }, ref) => (
92 |
97 | ))
98 | AlertDialogDescription.displayName =
99 | AlertDialogPrimitive.Description.displayName
100 |
101 | const AlertDialogAction = React.forwardRef<
102 | React.ElementRef,
103 | React.ComponentPropsWithoutRef
104 | >(({ className, ...props }, ref) => (
105 |
110 | ))
111 | AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
112 |
113 | const AlertDialogCancel = React.forwardRef<
114 | React.ElementRef,
115 | React.ComponentPropsWithoutRef
116 | >(({ className, ...props }, ref) => (
117 |
126 | ))
127 | AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
128 |
129 | export {
130 | AlertDialog,
131 | AlertDialogPortal,
132 | AlertDialogOverlay,
133 | AlertDialogTrigger,
134 | AlertDialogContent,
135 | AlertDialogHeader,
136 | AlertDialogFooter,
137 | AlertDialogTitle,
138 | AlertDialogDescription,
139 | AlertDialogAction,
140 | AlertDialogCancel,
141 | }
142 |
--------------------------------------------------------------------------------
/components/ui/alert.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { cva, type VariantProps } from "class-variance-authority"
3 |
4 | import { cn } from "@/lib/utils"
5 |
6 | const alertVariants = cva(
7 | "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
8 | {
9 | variants: {
10 | variant: {
11 | default: "bg-background text-foreground",
12 | destructive:
13 | "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
14 | },
15 | },
16 | defaultVariants: {
17 | variant: "default",
18 | },
19 | }
20 | )
21 |
22 | const Alert = React.forwardRef<
23 | HTMLDivElement,
24 | React.HTMLAttributes & VariantProps
25 | >(({ className, variant, ...props }, ref) => (
26 |
32 | ))
33 | Alert.displayName = "Alert"
34 |
35 | const AlertTitle = React.forwardRef<
36 | HTMLParagraphElement,
37 | React.HTMLAttributes
38 | >(({ className, ...props }, ref) => (
39 |
44 | ))
45 | AlertTitle.displayName = "AlertTitle"
46 |
47 | const AlertDescription = React.forwardRef<
48 | HTMLParagraphElement,
49 | React.HTMLAttributes
50 | >(({ className, ...props }, ref) => (
51 |
56 | ))
57 | AlertDescription.displayName = "AlertDescription"
58 |
59 | export { Alert, AlertTitle, AlertDescription }
60 |
--------------------------------------------------------------------------------
/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { Slot } from "@radix-ui/react-slot"
3 | import { cva, type VariantProps } from "class-variance-authority"
4 |
5 | import { cn } from "@/lib/utils"
6 |
7 | const buttonVariants = cva(
8 | "mx-1 inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
9 | {
10 | variants: {
11 | variant: {
12 | default:
13 | "bg-primary text-primary-foreground shadow hover:bg-primary/90",
14 | destructive:
15 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
16 | outline:
17 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
18 | secondary:
19 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
20 | ghost: "hover:bg-accent hover:text-accent-foreground",
21 | link: "text-primary underline-offset-4 hover:underline",
22 | },
23 | size: {
24 | default: "h-9 px-4 py-2",
25 | sm: "h-8 rounded-md px-3 text-xs",
26 | lg: "h-10 rounded-md px-8",
27 | icon: "h-9 w-9",
28 | },
29 | },
30 | defaultVariants: {
31 | variant: "default",
32 | size: "default",
33 | },
34 | }
35 | )
36 |
37 | export interface ButtonProps
38 | extends React.ButtonHTMLAttributes,
39 | VariantProps {
40 | asChild?: boolean
41 | }
42 |
43 | const Button = React.forwardRef(
44 | ({ className, variant, size, asChild = false, ...props }, ref) => {
45 | const Comp = asChild ? Slot : "button"
46 | return (
47 |
52 | )
53 | }
54 | )
55 | Button.displayName = "Button"
56 |
57 | export { Button, buttonVariants }
58 |
--------------------------------------------------------------------------------
/components/ui/drawer.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import { Drawer as DrawerPrimitive } from "vaul"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Drawer = ({
9 | shouldScaleBackground = true,
10 | ...props
11 | }: React.ComponentProps) => (
12 |
16 | )
17 | Drawer.displayName = "Drawer"
18 |
19 | const DrawerTrigger = DrawerPrimitive.Trigger
20 |
21 | const DrawerPortal = DrawerPrimitive.Portal
22 |
23 | const DrawerClose = DrawerPrimitive.Close
24 |
25 | const DrawerOverlay = React.forwardRef<
26 | React.ElementRef,
27 | React.ComponentPropsWithoutRef
28 | >(({ className, ...props }, ref) => (
29 |
34 | ))
35 | DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName
36 |
37 | const DrawerContent = React.forwardRef<
38 | React.ElementRef,
39 | React.ComponentPropsWithoutRef
40 | >(({ className, children, ...props }, ref) => (
41 |
42 |
43 |
51 |
52 | {children}
53 |
54 |
55 | ))
56 | DrawerContent.displayName = "DrawerContent"
57 |
58 | const DrawerHeader = ({
59 | className,
60 | ...props
61 | }: React.HTMLAttributes) => (
62 |
66 | )
67 | DrawerHeader.displayName = "DrawerHeader"
68 |
69 | const DrawerFooter = ({
70 | className,
71 | ...props
72 | }: React.HTMLAttributes) => (
73 |
77 | )
78 | DrawerFooter.displayName = "DrawerFooter"
79 |
80 | const DrawerTitle = React.forwardRef<
81 | React.ElementRef,
82 | React.ComponentPropsWithoutRef
83 | >(({ className, ...props }, ref) => (
84 |
92 | ))
93 | DrawerTitle.displayName = DrawerPrimitive.Title.displayName
94 |
95 | const DrawerDescription = React.forwardRef<
96 | React.ElementRef,
97 | React.ComponentPropsWithoutRef
98 | >(({ className, ...props }, ref) => (
99 |
104 | ))
105 | DrawerDescription.displayName = DrawerPrimitive.Description.displayName
106 |
107 | export {
108 | Drawer,
109 | DrawerPortal,
110 | DrawerOverlay,
111 | DrawerTrigger,
112 | DrawerClose,
113 | DrawerContent,
114 | DrawerHeader,
115 | DrawerFooter,
116 | DrawerTitle,
117 | DrawerDescription,
118 | }
119 |
--------------------------------------------------------------------------------
/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | )
21 | }
22 | )
23 | Input.displayName = "Input"
24 |
25 | export { Input }
26 |
--------------------------------------------------------------------------------
/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as LabelPrimitive from "@radix-ui/react-label"
5 | import { cva, type VariantProps } from "class-variance-authority"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/components/ui/menubar.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import {
5 | CheckIcon,
6 | ChevronRightIcon,
7 | DotFilledIcon,
8 | } from "@radix-ui/react-icons"
9 | import * as MenubarPrimitive from "@radix-ui/react-menubar"
10 |
11 | import { cn } from "@/lib/utils"
12 |
13 | const MenubarMenu = MenubarPrimitive.Menu
14 |
15 | const MenubarGroup = MenubarPrimitive.Group
16 |
17 | const MenubarPortal = MenubarPrimitive.Portal
18 |
19 | const MenubarSub = MenubarPrimitive.Sub
20 |
21 | const MenubarRadioGroup = MenubarPrimitive.RadioGroup
22 |
23 | const Menubar = React.forwardRef<
24 | React.ElementRef,
25 | React.ComponentPropsWithoutRef
26 | >(({ className, ...props }, ref) => (
27 |
35 | ))
36 | Menubar.displayName = MenubarPrimitive.Root.displayName
37 |
38 | const MenubarTrigger = React.forwardRef<
39 | React.ElementRef,
40 | React.ComponentPropsWithoutRef
41 | >(({ className, ...props }, ref) => (
42 |
50 | ))
51 | MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName
52 |
53 | const MenubarSubTrigger = React.forwardRef<
54 | React.ElementRef,
55 | React.ComponentPropsWithoutRef & {
56 | inset?: boolean
57 | }
58 | >(({ className, inset, children, ...props }, ref) => (
59 |
68 | {children}
69 |
70 |
71 | ))
72 | MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName
73 |
74 | const MenubarSubContent = React.forwardRef<
75 | React.ElementRef,
76 | React.ComponentPropsWithoutRef
77 | >(({ className, ...props }, ref) => (
78 |
86 | ))
87 | MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName
88 |
89 | const MenubarContent = React.forwardRef<
90 | React.ElementRef,
91 | React.ComponentPropsWithoutRef
92 | >(
93 | (
94 | { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
95 | ref
96 | ) => (
97 |
98 |
109 |
110 | )
111 | )
112 | MenubarContent.displayName = MenubarPrimitive.Content.displayName
113 |
114 | const MenubarItem = React.forwardRef<
115 | React.ElementRef,
116 | React.ComponentPropsWithoutRef & {
117 | inset?: boolean
118 | }
119 | >(({ className, inset, ...props }, ref) => (
120 |
129 | ))
130 | MenubarItem.displayName = MenubarPrimitive.Item.displayName
131 |
132 | const MenubarCheckboxItem = React.forwardRef<
133 | React.ElementRef,
134 | React.ComponentPropsWithoutRef
135 | >(({ className, children, checked, ...props }, ref) => (
136 |
145 |
146 |
147 |
148 |
149 |
150 | {children}
151 |
152 | ))
153 | MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName
154 |
155 | const MenubarRadioItem = React.forwardRef<
156 | React.ElementRef,
157 | React.ComponentPropsWithoutRef
158 | >(({ className, children, ...props }, ref) => (
159 |
167 |
168 |
169 |
170 |
171 |
172 | {children}
173 |
174 | ))
175 | MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName
176 |
177 | const MenubarLabel = React.forwardRef<
178 | React.ElementRef,
179 | React.ComponentPropsWithoutRef & {
180 | inset?: boolean
181 | }
182 | >(({ className, inset, ...props }, ref) => (
183 |
192 | ))
193 | MenubarLabel.displayName = MenubarPrimitive.Label.displayName
194 |
195 | const MenubarSeparator = React.forwardRef<
196 | React.ElementRef,
197 | React.ComponentPropsWithoutRef
198 | >(({ className, ...props }, ref) => (
199 |
204 | ))
205 | MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName
206 |
207 | const MenubarShortcut = ({
208 | className,
209 | ...props
210 | }: React.HTMLAttributes) => {
211 | return (
212 |
219 | )
220 | }
221 | MenubarShortcut.displayname = "MenubarShortcut"
222 |
223 | export {
224 | Menubar,
225 | MenubarMenu,
226 | MenubarTrigger,
227 | MenubarContent,
228 | MenubarItem,
229 | MenubarSeparator,
230 | MenubarLabel,
231 | MenubarCheckboxItem,
232 | MenubarRadioGroup,
233 | MenubarRadioItem,
234 | MenubarPortal,
235 | MenubarSubContent,
236 | MenubarSubTrigger,
237 | MenubarGroup,
238 | MenubarSub,
239 | MenubarShortcut,
240 | }
241 |
--------------------------------------------------------------------------------
/components/ui/radio-group.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import { CheckIcon } from "@radix-ui/react-icons"
5 | import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const RadioGroup = React.forwardRef<
10 | React.ElementRef,
11 | React.ComponentPropsWithoutRef
12 | >(({ className, ...props }, ref) => {
13 | return (
14 |
19 | )
20 | })
21 | RadioGroup.displayName = RadioGroupPrimitive.Root.displayName
22 |
23 | const RadioGroupItem = React.forwardRef<
24 | React.ElementRef,
25 | React.ComponentPropsWithoutRef
26 | >(({ className, ...props }, ref) => {
27 | return (
28 |
36 |
37 |
38 |
39 |
40 | )
41 | })
42 | RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName
43 |
44 | export { RadioGroup, RadioGroupItem }
45 |
--------------------------------------------------------------------------------
/components/ui/toast.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import { Cross2Icon } from "@radix-ui/react-icons"
5 | import * as ToastPrimitives from "@radix-ui/react-toast"
6 | import { cva, type VariantProps } from "class-variance-authority"
7 |
8 | import { cn } from "@/lib/utils"
9 |
10 | const ToastProvider = ToastPrimitives.Provider
11 |
12 | const ToastViewport = React.forwardRef<
13 | React.ElementRef,
14 | React.ComponentPropsWithoutRef
15 | >(({ className, ...props }, ref) => (
16 |
24 | ))
25 | ToastViewport.displayName = ToastPrimitives.Viewport.displayName
26 |
27 | const toastVariants = cva(
28 | "group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
29 | {
30 | variants: {
31 | variant: {
32 | default: "border bg-background text-foreground",
33 | destructive:
34 | "destructive group border-destructive bg-destructive text-destructive-foreground",
35 | },
36 | },
37 | defaultVariants: {
38 | variant: "default",
39 | },
40 | }
41 | )
42 |
43 | const Toast = React.forwardRef<
44 | React.ElementRef,
45 | React.ComponentPropsWithoutRef &
46 | VariantProps
47 | >(({ className, variant, ...props }, ref) => {
48 | return (
49 |
54 | )
55 | })
56 | Toast.displayName = ToastPrimitives.Root.displayName
57 |
58 | const ToastAction = React.forwardRef<
59 | React.ElementRef,
60 | React.ComponentPropsWithoutRef
61 | >(({ className, ...props }, ref) => (
62 |
70 | ))
71 | ToastAction.displayName = ToastPrimitives.Action.displayName
72 |
73 | const ToastClose = React.forwardRef<
74 | React.ElementRef,
75 | React.ComponentPropsWithoutRef
76 | >(({ className, ...props }, ref) => (
77 |
86 |
87 |
88 | ))
89 | ToastClose.displayName = ToastPrimitives.Close.displayName
90 |
91 | const ToastTitle = React.forwardRef<
92 | React.ElementRef,
93 | React.ComponentPropsWithoutRef
94 | >(({ className, ...props }, ref) => (
95 |
100 | ))
101 | ToastTitle.displayName = ToastPrimitives.Title.displayName
102 |
103 | const ToastDescription = React.forwardRef<
104 | React.ElementRef,
105 | React.ComponentPropsWithoutRef
106 | >(({ className, ...props }, ref) => (
107 |
112 | ))
113 | ToastDescription.displayName = ToastPrimitives.Description.displayName
114 |
115 | type ToastProps = React.ComponentPropsWithoutRef
116 |
117 | type ToastActionElement = React.ReactElement
118 |
119 | export {
120 | type ToastProps,
121 | type ToastActionElement,
122 | ToastProvider,
123 | ToastViewport,
124 | Toast,
125 | ToastTitle,
126 | ToastDescription,
127 | ToastClose,
128 | ToastAction,
129 | }
130 |
--------------------------------------------------------------------------------
/components/ui/toaster.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import {
4 | Toast,
5 | ToastClose,
6 | ToastDescription,
7 | ToastProvider,
8 | ToastTitle,
9 | ToastViewport,
10 | } from "@/components/ui/toast"
11 | import { useToast } from "@/components/ui/use-toast"
12 |
13 | export function Toaster() {
14 | const { toasts } = useToast()
15 |
16 | return (
17 |
18 | {toasts.map(function ({ id, title, description, action, ...props }) {
19 | return (
20 |
21 |
22 | {title && {title}}
23 | {description && (
24 | {description}
25 | )}
26 |
27 | {action}
28 |
29 |
30 | )
31 | })}
32 |
33 |
34 | )
35 | }
36 |
--------------------------------------------------------------------------------
/components/ui/use-toast.ts:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | // Inspired by react-hot-toast library
4 | import * as React from "react"
5 |
6 | import type {
7 | ToastActionElement,
8 | ToastProps,
9 | } from "@/components/ui/toast"
10 |
11 | const TOAST_LIMIT = 1
12 | const TOAST_REMOVE_DELAY = 1000000
13 |
14 | type ToasterToast = ToastProps & {
15 | id: string
16 | title?: React.ReactNode
17 | description?: React.ReactNode
18 | action?: ToastActionElement
19 | }
20 |
21 | const actionTypes = {
22 | ADD_TOAST: "ADD_TOAST",
23 | UPDATE_TOAST: "UPDATE_TOAST",
24 | DISMISS_TOAST: "DISMISS_TOAST",
25 | REMOVE_TOAST: "REMOVE_TOAST",
26 | } as const
27 |
28 | let count = 0
29 |
30 | function genId() {
31 | count = (count + 1) % Number.MAX_SAFE_INTEGER
32 | return count.toString()
33 | }
34 |
35 | type ActionType = typeof actionTypes
36 |
37 | type Action =
38 | | {
39 | type: ActionType["ADD_TOAST"]
40 | toast: ToasterToast
41 | }
42 | | {
43 | type: ActionType["UPDATE_TOAST"]
44 | toast: Partial
45 | }
46 | | {
47 | type: ActionType["DISMISS_TOAST"]
48 | toastId?: ToasterToast["id"]
49 | }
50 | | {
51 | type: ActionType["REMOVE_TOAST"]
52 | toastId?: ToasterToast["id"]
53 | }
54 |
55 | interface State {
56 | toasts: ToasterToast[]
57 | }
58 |
59 | const toastTimeouts = new Map>()
60 |
61 | const addToRemoveQueue = (toastId: string) => {
62 | if (toastTimeouts.has(toastId)) {
63 | return
64 | }
65 |
66 | const timeout = setTimeout(() => {
67 | toastTimeouts.delete(toastId)
68 | dispatch({
69 | type: "REMOVE_TOAST",
70 | toastId: toastId,
71 | })
72 | }, TOAST_REMOVE_DELAY)
73 |
74 | toastTimeouts.set(toastId, timeout)
75 | }
76 |
77 | export const reducer = (state: State, action: Action): State => {
78 | switch (action.type) {
79 | case "ADD_TOAST":
80 | return {
81 | ...state,
82 | toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
83 | }
84 |
85 | case "UPDATE_TOAST":
86 | return {
87 | ...state,
88 | toasts: state.toasts.map((t) =>
89 | t.id === action.toast.id ? { ...t, ...action.toast } : t
90 | ),
91 | }
92 |
93 | case "DISMISS_TOAST": {
94 | const { toastId } = action
95 |
96 | // ! Side effects ! - This could be extracted into a dismissToast() action,
97 | // but I'll keep it here for simplicity
98 | if (toastId) {
99 | addToRemoveQueue(toastId)
100 | } else {
101 | state.toasts.forEach((toast) => {
102 | addToRemoveQueue(toast.id)
103 | })
104 | }
105 |
106 | return {
107 | ...state,
108 | toasts: state.toasts.map((t) =>
109 | t.id === toastId || toastId === undefined
110 | ? {
111 | ...t,
112 | open: false,
113 | }
114 | : t
115 | ),
116 | }
117 | }
118 | case "REMOVE_TOAST":
119 | if (action.toastId === undefined) {
120 | return {
121 | ...state,
122 | toasts: [],
123 | }
124 | }
125 | return {
126 | ...state,
127 | toasts: state.toasts.filter((t) => t.id !== action.toastId),
128 | }
129 | }
130 | }
131 |
132 | const listeners: Array<(state: State) => void> = []
133 |
134 | let memoryState: State = { toasts: [] }
135 |
136 | function dispatch(action: Action) {
137 | memoryState = reducer(memoryState, action)
138 | listeners.forEach((listener) => {
139 | listener(memoryState)
140 | })
141 | }
142 |
143 | type Toast = Omit
144 |
145 | function toast({ ...props }: Toast) {
146 | const id = genId()
147 |
148 | const update = (props: ToasterToast) =>
149 | dispatch({
150 | type: "UPDATE_TOAST",
151 | toast: { ...props, id },
152 | })
153 | const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
154 |
155 | dispatch({
156 | type: "ADD_TOAST",
157 | toast: {
158 | ...props,
159 | id,
160 | open: true,
161 | onOpenChange: (open) => {
162 | if (!open) dismiss()
163 | },
164 | },
165 | })
166 |
167 | return {
168 | id: id,
169 | dismiss,
170 | update,
171 | }
172 | }
173 |
174 | function useToast() {
175 | const [state, setState] = React.useState(memoryState)
176 |
177 | React.useEffect(() => {
178 | listeners.push(setState)
179 | return () => {
180 | const index = listeners.indexOf(setState)
181 | if (index > -1) {
182 | listeners.splice(index, 1)
183 | }
184 | }
185 | }, [state])
186 |
187 | return {
188 | ...state,
189 | toast,
190 | dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
191 | }
192 | }
193 |
194 | export { useToast, toast }
195 |
--------------------------------------------------------------------------------
/cron.js:
--------------------------------------------------------------------------------
1 | const cron = require("node-cron");
2 |
3 | cron.schedule("*/5 * * * * *", function () {
4 | try {
5 | console.log(new Date());
6 | fetch(process.env.HOST + "/api/job").then();
7 | } catch (err) {}
8 | });
9 |
--------------------------------------------------------------------------------
/lib/chain.ts:
--------------------------------------------------------------------------------
1 | export async function fetchTransactions() {
2 | const trx_wallet = process.env.TRX_WALLET;
3 | const trx_scan_endpoint = process.env.TRXSCAN_ENDPOINT;
4 | const trx_scan_key = process.env.TRXSCAN_KEY;
5 | const trx_scan_usdt_contract_address = process.env.TRX_USDT_TOKEN;
6 |
7 | if (!trx_wallet || !trx_scan_endpoint || !trx_scan_key || !trx_scan_usdt_contract_address) {
8 | throw new Error("Missing required environment variables.");
9 | }
10 |
11 |
12 | let url = `${trx_scan_endpoint}?limit=20&start=0&contract_address=${trx_scan_usdt_contract_address}&toAddress=${trx_wallet}`;
13 | console.log(url)
14 | console.log(url);
15 |
16 | const headers = new Headers();
17 | headers.append("TRON-PRO-API-KEY", trx_scan_key);
18 |
19 | const requestdata = await fetch(url, { cache: "no-cache", headers: headers });
20 |
21 | if (!requestdata.ok) {
22 | throw new Error(`Error fetching data: ${requestdata.statusText}`);
23 | }
24 |
25 | const result = await requestdata.json();
26 | console.log(result);
27 |
28 | return result;
29 | }
30 |
--------------------------------------------------------------------------------
/lib/prisma.ts:
--------------------------------------------------------------------------------
1 | // ts-ignore 7017 is used to ignore the error that the global object is not
2 | // defined in the global scope. This is because the global object is only
3 | // defined in the global scope in Node.js and not in the browser.
4 |
5 | import { PrismaClient } from "@prisma/client";
6 |
7 | // PrismaClient is attached to the `global` object in development to prevent
8 | // exhausting your database connection limit.
9 | //
10 | // Learn more:
11 | // https://pris.ly/d/help/next-js-best-practices
12 |
13 | const globalForPrisma = global as unknown as { prisma: PrismaClient };
14 |
15 | export const prisma = globalForPrisma.prisma || new PrismaClient();
16 |
17 | if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
18 |
19 | export default prisma;
20 |
--------------------------------------------------------------------------------
/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 | //这段代码的目的是生成一个长度为8的随机字符串,使用自定义字母表 alphabet。alphabet 包含了 34 个字符:数字和字母,排除了易混淆的字符,比如 1, 2, 5, 0, I, O, S, Z 等。这样可以减少用户在输入或阅读时的错误。
4 | let alphabet = "346789ABCDEFGHJKLMNPQRTUVWXYabcdefghijkmnpqrtwxyz";
5 |
6 | import { customAlphabet } from "nanoid";
7 | export function cn(...inputs: ClassValue[]) {
8 | return twMerge(clsx(inputs))
9 | }
10 |
11 |
12 |
13 |
14 | export function gen_nonid() {
15 | const nanoid = customAlphabet(alphabet, 8);
16 | return nanoid()
17 | }
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/messages/zh.json:
--------------------------------------------------------------------------------
1 | {
2 | "KaForm": {
3 | "div_789-821_C": "套餐标题",
4 | "div_1112-1144_E": "套餐价格",
5 | "div_1437-1467_v": "额度",
6 | "Button_1865-2247_m": "提交",
7 | "Button_2290-2327_N": "取消",
8 | "div_807-839_g": "套餐标题",
9 | "div_1072-1104_C": "套餐价格",
10 | "div_1339-1369_a": "额度",
11 | "Button_1709-2013_H": "提交",
12 | "Button_2056-2093_z": "取消",
13 | "div_1072-1104_S": "套餐价格",
14 | "div_1339-1369_o": "额度",
15 | "Button_2049-2086_Z": "取消",
16 | "div_807-839_m": "套餐标题",
17 | "div_1072-1104_l": "套餐价格",
18 | "div_1339-1369_s": "额度",
19 | "Button_2049-2086_j": "取消"
20 | },
21 | "KaList": {
22 | "div_787-829_x": "修改",
23 | "div_818-860_j": "修改",
24 | "div_818-860_N": "修改",
25 | "div_818-860_y": "修改"
26 | }
27 | }
--------------------------------------------------------------------------------
/middleware.ts:
--------------------------------------------------------------------------------
1 | import { NextResponse } from "next/server";
2 | import type { NextRequest } from "next/server";
3 |
4 | const [AUTH_USER, AUTH_PASS] = (
5 | process.env.HTTP_BASIC_AUTH || "admin:123456"
6 | ).split(":");
7 |
8 | // Step 1. HTTP Basic Auth Middleware for Challenge
9 | export function middleware(req: NextRequest) {
10 | if (!isAuthenticated(req)) {
11 | return new NextResponse("Authentication required", {
12 | status: 401,
13 | headers: { "WWW-Authenticate": "Basic" },
14 | });
15 | }
16 |
17 | return NextResponse.next();
18 | }
19 |
20 | // Step 2. Check HTTP Basic Auth header if present
21 | function isAuthenticated(req: NextRequest) {
22 | const authheader =
23 | req.headers.get("authorization") || req.headers.get("Authorization");
24 |
25 | if (!authheader) {
26 | return false;
27 | }
28 |
29 | const auth = Buffer.from(authheader.split(" ")[1], "base64")
30 | .toString()
31 | .split(":");
32 | const user = auth[0];
33 | const pass = auth[1];
34 |
35 | if (user == AUTH_USER && pass == AUTH_PASS) {
36 | return true;
37 | } else {
38 | return false;
39 | }
40 | }
41 |
42 | // Step 3. Configure "Matching Paths" below to protect routes with HTTP Basic Auth
43 | export const config = {
44 | matcher: "/admin/:path*",
45 | };
46 |
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | typescript: {
4 | ignoreBuildErrors: true,
5 | },
6 | };
7 |
8 | export default nextConfig;
9 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luminapay",
3 | "version": "0.1.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "luminapay",
9 | "version": "0.1.0",
10 | "hasInstallScript": true,
11 | "dependencies": {
12 | "@leenguyen/react-flip-clock-countdown": "^1.5.2",
13 | "@prisma/client": "^5.13.0",
14 | "@radix-ui/react-alert-dialog": "^1.0.5",
15 | "@radix-ui/react-dialog": "^1.0.5",
16 | "@radix-ui/react-icons": "^1.3.0",
17 | "@radix-ui/react-label": "^2.0.2",
18 | "@radix-ui/react-menubar": "^1.0.4",
19 | "@radix-ui/react-radio-group": "^1.1.3",
20 | "@radix-ui/react-slot": "^1.0.2",
21 | "@radix-ui/react-toast": "^1.1.5",
22 | "bignumber.js": "^9.1.2",
23 | "ccy-icons": "^1.0.4",
24 | "class-variance-authority": "^0.7.0",
25 | "clsx": "^2.1.1",
26 | "dayjs": "^1.11.11",
27 | "dotenv": "^16.4.5",
28 | "lodash": "^4.17.21",
29 | "next": "14.2.3",
30 | "next-view-transitions": "^0.1.1",
31 | "node-cron": "^3.0.3",
32 | "react": "^18",
33 | "react-copy-to-clipboard": "^5.1.0",
34 | "react-dom": "^18",
35 | "tailwind-merge": "^2.3.0",
36 | "tailwindcss-animate": "^1.0.7",
37 | "vaul": "^0.9.0"
38 | },
39 | "devDependencies": {
40 | "@types/node": "^20",
41 | "@types/react": "^18",
42 | "@types/react-dom": "^18",
43 | "postcss": "^8",
44 | "prisma": "^5.13.0",
45 | "tailwindcss": "^3.4.1",
46 | "typescript": "^5"
47 | }
48 | },
49 | "node_modules/@alloc/quick-lru": {
50 | "version": "5.2.0",
51 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
52 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
53 | "engines": {
54 | "node": ">=10"
55 | },
56 | "funding": {
57 | "url": "https://github.com/sponsors/sindresorhus"
58 | }
59 | },
60 | "node_modules/@babel/runtime": {
61 | "version": "7.24.5",
62 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
63 | "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
64 | "dependencies": {
65 | "regenerator-runtime": "^0.14.0"
66 | },
67 | "engines": {
68 | "node": ">=6.9.0"
69 | }
70 | },
71 | "node_modules/@floating-ui/core": {
72 | "version": "1.6.1",
73 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz",
74 | "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==",
75 | "dependencies": {
76 | "@floating-ui/utils": "^0.2.0"
77 | }
78 | },
79 | "node_modules/@floating-ui/dom": {
80 | "version": "1.6.4",
81 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.4.tgz",
82 | "integrity": "sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==",
83 | "dependencies": {
84 | "@floating-ui/core": "^1.0.0",
85 | "@floating-ui/utils": "^0.2.0"
86 | }
87 | },
88 | "node_modules/@floating-ui/react-dom": {
89 | "version": "2.0.9",
90 | "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz",
91 | "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==",
92 | "dependencies": {
93 | "@floating-ui/dom": "^1.0.0"
94 | },
95 | "peerDependencies": {
96 | "react": ">=16.8.0",
97 | "react-dom": ">=16.8.0"
98 | }
99 | },
100 | "node_modules/@floating-ui/utils": {
101 | "version": "0.2.2",
102 | "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
103 | "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
104 | },
105 | "node_modules/@isaacs/cliui": {
106 | "version": "8.0.2",
107 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
108 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
109 | "dependencies": {
110 | "string-width": "^5.1.2",
111 | "string-width-cjs": "npm:string-width@^4.2.0",
112 | "strip-ansi": "^7.0.1",
113 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
114 | "wrap-ansi": "^8.1.0",
115 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
116 | },
117 | "engines": {
118 | "node": ">=12"
119 | }
120 | },
121 | "node_modules/@jridgewell/gen-mapping": {
122 | "version": "0.3.5",
123 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
124 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
125 | "dependencies": {
126 | "@jridgewell/set-array": "^1.2.1",
127 | "@jridgewell/sourcemap-codec": "^1.4.10",
128 | "@jridgewell/trace-mapping": "^0.3.24"
129 | },
130 | "engines": {
131 | "node": ">=6.0.0"
132 | }
133 | },
134 | "node_modules/@jridgewell/resolve-uri": {
135 | "version": "3.1.2",
136 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
137 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
138 | "engines": {
139 | "node": ">=6.0.0"
140 | }
141 | },
142 | "node_modules/@jridgewell/set-array": {
143 | "version": "1.2.1",
144 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
145 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
146 | "engines": {
147 | "node": ">=6.0.0"
148 | }
149 | },
150 | "node_modules/@jridgewell/sourcemap-codec": {
151 | "version": "1.4.15",
152 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
153 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
154 | },
155 | "node_modules/@jridgewell/trace-mapping": {
156 | "version": "0.3.25",
157 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
158 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
159 | "dependencies": {
160 | "@jridgewell/resolve-uri": "^3.1.0",
161 | "@jridgewell/sourcemap-codec": "^1.4.14"
162 | }
163 | },
164 | "node_modules/@leenguyen/react-flip-clock-countdown": {
165 | "version": "1.5.2",
166 | "resolved": "https://registry.npmjs.org/@leenguyen/react-flip-clock-countdown/-/react-flip-clock-countdown-1.5.2.tgz",
167 | "integrity": "sha512-1wZ+3XBH62uYELVqisc2PiWnLN5bZF+VmXfFqEg4HBhoT0QRcM/nITOTfAXYvjPhnQ1GcZJJfAbgxnsCdGlqAw==",
168 | "dependencies": {
169 | "clsx": "^1.1.1"
170 | },
171 | "engines": {
172 | "node": ">=12"
173 | },
174 | "peerDependencies": {
175 | "react": ">= 16.13.0"
176 | }
177 | },
178 | "node_modules/@leenguyen/react-flip-clock-countdown/node_modules/clsx": {
179 | "version": "1.2.1",
180 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
181 | "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
182 | "engines": {
183 | "node": ">=6"
184 | }
185 | },
186 | "node_modules/@next/env": {
187 | "version": "14.2.3",
188 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz",
189 | "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA=="
190 | },
191 | "node_modules/@next/swc-darwin-arm64": {
192 | "version": "14.2.3",
193 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz",
194 | "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==",
195 | "cpu": [
196 | "arm64"
197 | ],
198 | "optional": true,
199 | "os": [
200 | "darwin"
201 | ],
202 | "engines": {
203 | "node": ">= 10"
204 | }
205 | },
206 | "node_modules/@next/swc-darwin-x64": {
207 | "version": "14.2.3",
208 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz",
209 | "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==",
210 | "cpu": [
211 | "x64"
212 | ],
213 | "optional": true,
214 | "os": [
215 | "darwin"
216 | ],
217 | "engines": {
218 | "node": ">= 10"
219 | }
220 | },
221 | "node_modules/@next/swc-linux-arm64-gnu": {
222 | "version": "14.2.3",
223 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz",
224 | "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==",
225 | "cpu": [
226 | "arm64"
227 | ],
228 | "optional": true,
229 | "os": [
230 | "linux"
231 | ],
232 | "engines": {
233 | "node": ">= 10"
234 | }
235 | },
236 | "node_modules/@next/swc-linux-arm64-musl": {
237 | "version": "14.2.3",
238 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz",
239 | "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==",
240 | "cpu": [
241 | "arm64"
242 | ],
243 | "optional": true,
244 | "os": [
245 | "linux"
246 | ],
247 | "engines": {
248 | "node": ">= 10"
249 | }
250 | },
251 | "node_modules/@next/swc-linux-x64-gnu": {
252 | "version": "14.2.3",
253 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz",
254 | "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==",
255 | "cpu": [
256 | "x64"
257 | ],
258 | "optional": true,
259 | "os": [
260 | "linux"
261 | ],
262 | "engines": {
263 | "node": ">= 10"
264 | }
265 | },
266 | "node_modules/@next/swc-linux-x64-musl": {
267 | "version": "14.2.3",
268 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz",
269 | "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==",
270 | "cpu": [
271 | "x64"
272 | ],
273 | "optional": true,
274 | "os": [
275 | "linux"
276 | ],
277 | "engines": {
278 | "node": ">= 10"
279 | }
280 | },
281 | "node_modules/@next/swc-win32-arm64-msvc": {
282 | "version": "14.2.3",
283 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz",
284 | "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==",
285 | "cpu": [
286 | "arm64"
287 | ],
288 | "optional": true,
289 | "os": [
290 | "win32"
291 | ],
292 | "engines": {
293 | "node": ">= 10"
294 | }
295 | },
296 | "node_modules/@next/swc-win32-ia32-msvc": {
297 | "version": "14.2.3",
298 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz",
299 | "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==",
300 | "cpu": [
301 | "ia32"
302 | ],
303 | "optional": true,
304 | "os": [
305 | "win32"
306 | ],
307 | "engines": {
308 | "node": ">= 10"
309 | }
310 | },
311 | "node_modules/@next/swc-win32-x64-msvc": {
312 | "version": "14.2.3",
313 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz",
314 | "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==",
315 | "cpu": [
316 | "x64"
317 | ],
318 | "optional": true,
319 | "os": [
320 | "win32"
321 | ],
322 | "engines": {
323 | "node": ">= 10"
324 | }
325 | },
326 | "node_modules/@nodelib/fs.scandir": {
327 | "version": "2.1.5",
328 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
329 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
330 | "dependencies": {
331 | "@nodelib/fs.stat": "2.0.5",
332 | "run-parallel": "^1.1.9"
333 | },
334 | "engines": {
335 | "node": ">= 8"
336 | }
337 | },
338 | "node_modules/@nodelib/fs.stat": {
339 | "version": "2.0.5",
340 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
341 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
342 | "engines": {
343 | "node": ">= 8"
344 | }
345 | },
346 | "node_modules/@nodelib/fs.walk": {
347 | "version": "1.2.8",
348 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
349 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
350 | "dependencies": {
351 | "@nodelib/fs.scandir": "2.1.5",
352 | "fastq": "^1.6.0"
353 | },
354 | "engines": {
355 | "node": ">= 8"
356 | }
357 | },
358 | "node_modules/@pkgjs/parseargs": {
359 | "version": "0.11.0",
360 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
361 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
362 | "optional": true,
363 | "engines": {
364 | "node": ">=14"
365 | }
366 | },
367 | "node_modules/@prisma/client": {
368 | "version": "5.13.0",
369 | "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.13.0.tgz",
370 | "integrity": "sha512-uYdfpPncbZ/syJyiYBwGZS8Gt1PTNoErNYMuqHDa2r30rNSFtgTA/LXsSk55R7pdRTMi5pHkeP9B14K6nHmwkg==",
371 | "hasInstallScript": true,
372 | "engines": {
373 | "node": ">=16.13"
374 | },
375 | "peerDependencies": {
376 | "prisma": "*"
377 | },
378 | "peerDependenciesMeta": {
379 | "prisma": {
380 | "optional": true
381 | }
382 | }
383 | },
384 | "node_modules/@prisma/debug": {
385 | "version": "5.13.0",
386 | "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.13.0.tgz",
387 | "integrity": "sha512-699iqlEvzyCj9ETrXhs8o8wQc/eVW+FigSsHpiskSFydhjVuwTJEfj/nIYqTaWFYuxiWQRfm3r01meuW97SZaQ==",
388 | "devOptional": true
389 | },
390 | "node_modules/@prisma/engines": {
391 | "version": "5.13.0",
392 | "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.13.0.tgz",
393 | "integrity": "sha512-hIFLm4H1boj6CBZx55P4xKby9jgDTeDG0Jj3iXtwaaHmlD5JmiDkZhh8+DYWkTGchu+rRF36AVROLnk0oaqhHw==",
394 | "devOptional": true,
395 | "hasInstallScript": true,
396 | "dependencies": {
397 | "@prisma/debug": "5.13.0",
398 | "@prisma/engines-version": "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b",
399 | "@prisma/fetch-engine": "5.13.0",
400 | "@prisma/get-platform": "5.13.0"
401 | }
402 | },
403 | "node_modules/@prisma/engines-version": {
404 | "version": "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b",
405 | "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b.tgz",
406 | "integrity": "sha512-AyUuhahTINGn8auyqYdmxsN+qn0mw3eg+uhkp8zwknXYIqoT3bChG4RqNY/nfDkPvzWAPBa9mrDyBeOnWSgO6A==",
407 | "devOptional": true
408 | },
409 | "node_modules/@prisma/fetch-engine": {
410 | "version": "5.13.0",
411 | "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.13.0.tgz",
412 | "integrity": "sha512-Yh4W+t6YKyqgcSEB3odBXt7QyVSm0OQlBSldQF2SNXtmOgMX8D7PF/fvH6E6qBCpjB/yeJLy/FfwfFijoHI6sA==",
413 | "devOptional": true,
414 | "dependencies": {
415 | "@prisma/debug": "5.13.0",
416 | "@prisma/engines-version": "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b",
417 | "@prisma/get-platform": "5.13.0"
418 | }
419 | },
420 | "node_modules/@prisma/get-platform": {
421 | "version": "5.13.0",
422 | "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.13.0.tgz",
423 | "integrity": "sha512-B/WrQwYTzwr7qCLifQzYOmQhZcFmIFhR81xC45gweInSUn2hTEbfKUPd2keAog+y5WI5xLAFNJ3wkXplvSVkSw==",
424 | "devOptional": true,
425 | "dependencies": {
426 | "@prisma/debug": "5.13.0"
427 | }
428 | },
429 | "node_modules/@radix-ui/primitive": {
430 | "version": "1.0.1",
431 | "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz",
432 | "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==",
433 | "dependencies": {
434 | "@babel/runtime": "^7.13.10"
435 | }
436 | },
437 | "node_modules/@radix-ui/react-alert-dialog": {
438 | "version": "1.0.5",
439 | "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz",
440 | "integrity": "sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==",
441 | "dependencies": {
442 | "@babel/runtime": "^7.13.10",
443 | "@radix-ui/primitive": "1.0.1",
444 | "@radix-ui/react-compose-refs": "1.0.1",
445 | "@radix-ui/react-context": "1.0.1",
446 | "@radix-ui/react-dialog": "1.0.5",
447 | "@radix-ui/react-primitive": "1.0.3",
448 | "@radix-ui/react-slot": "1.0.2"
449 | },
450 | "peerDependencies": {
451 | "@types/react": "*",
452 | "@types/react-dom": "*",
453 | "react": "^16.8 || ^17.0 || ^18.0",
454 | "react-dom": "^16.8 || ^17.0 || ^18.0"
455 | },
456 | "peerDependenciesMeta": {
457 | "@types/react": {
458 | "optional": true
459 | },
460 | "@types/react-dom": {
461 | "optional": true
462 | }
463 | }
464 | },
465 | "node_modules/@radix-ui/react-arrow": {
466 | "version": "1.0.3",
467 | "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
468 | "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==",
469 | "dependencies": {
470 | "@babel/runtime": "^7.13.10",
471 | "@radix-ui/react-primitive": "1.0.3"
472 | },
473 | "peerDependencies": {
474 | "@types/react": "*",
475 | "@types/react-dom": "*",
476 | "react": "^16.8 || ^17.0 || ^18.0",
477 | "react-dom": "^16.8 || ^17.0 || ^18.0"
478 | },
479 | "peerDependenciesMeta": {
480 | "@types/react": {
481 | "optional": true
482 | },
483 | "@types/react-dom": {
484 | "optional": true
485 | }
486 | }
487 | },
488 | "node_modules/@radix-ui/react-collection": {
489 | "version": "1.0.3",
490 | "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz",
491 | "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==",
492 | "dependencies": {
493 | "@babel/runtime": "^7.13.10",
494 | "@radix-ui/react-compose-refs": "1.0.1",
495 | "@radix-ui/react-context": "1.0.1",
496 | "@radix-ui/react-primitive": "1.0.3",
497 | "@radix-ui/react-slot": "1.0.2"
498 | },
499 | "peerDependencies": {
500 | "@types/react": "*",
501 | "@types/react-dom": "*",
502 | "react": "^16.8 || ^17.0 || ^18.0",
503 | "react-dom": "^16.8 || ^17.0 || ^18.0"
504 | },
505 | "peerDependenciesMeta": {
506 | "@types/react": {
507 | "optional": true
508 | },
509 | "@types/react-dom": {
510 | "optional": true
511 | }
512 | }
513 | },
514 | "node_modules/@radix-ui/react-compose-refs": {
515 | "version": "1.0.1",
516 | "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
517 | "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
518 | "dependencies": {
519 | "@babel/runtime": "^7.13.10"
520 | },
521 | "peerDependencies": {
522 | "@types/react": "*",
523 | "react": "^16.8 || ^17.0 || ^18.0"
524 | },
525 | "peerDependenciesMeta": {
526 | "@types/react": {
527 | "optional": true
528 | }
529 | }
530 | },
531 | "node_modules/@radix-ui/react-context": {
532 | "version": "1.0.1",
533 | "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz",
534 | "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==",
535 | "dependencies": {
536 | "@babel/runtime": "^7.13.10"
537 | },
538 | "peerDependencies": {
539 | "@types/react": "*",
540 | "react": "^16.8 || ^17.0 || ^18.0"
541 | },
542 | "peerDependenciesMeta": {
543 | "@types/react": {
544 | "optional": true
545 | }
546 | }
547 | },
548 | "node_modules/@radix-ui/react-dialog": {
549 | "version": "1.0.5",
550 | "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz",
551 | "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==",
552 | "dependencies": {
553 | "@babel/runtime": "^7.13.10",
554 | "@radix-ui/primitive": "1.0.1",
555 | "@radix-ui/react-compose-refs": "1.0.1",
556 | "@radix-ui/react-context": "1.0.1",
557 | "@radix-ui/react-dismissable-layer": "1.0.5",
558 | "@radix-ui/react-focus-guards": "1.0.1",
559 | "@radix-ui/react-focus-scope": "1.0.4",
560 | "@radix-ui/react-id": "1.0.1",
561 | "@radix-ui/react-portal": "1.0.4",
562 | "@radix-ui/react-presence": "1.0.1",
563 | "@radix-ui/react-primitive": "1.0.3",
564 | "@radix-ui/react-slot": "1.0.2",
565 | "@radix-ui/react-use-controllable-state": "1.0.1",
566 | "aria-hidden": "^1.1.1",
567 | "react-remove-scroll": "2.5.5"
568 | },
569 | "peerDependencies": {
570 | "@types/react": "*",
571 | "@types/react-dom": "*",
572 | "react": "^16.8 || ^17.0 || ^18.0",
573 | "react-dom": "^16.8 || ^17.0 || ^18.0"
574 | },
575 | "peerDependenciesMeta": {
576 | "@types/react": {
577 | "optional": true
578 | },
579 | "@types/react-dom": {
580 | "optional": true
581 | }
582 | }
583 | },
584 | "node_modules/@radix-ui/react-direction": {
585 | "version": "1.0.1",
586 | "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz",
587 | "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==",
588 | "dependencies": {
589 | "@babel/runtime": "^7.13.10"
590 | },
591 | "peerDependencies": {
592 | "@types/react": "*",
593 | "react": "^16.8 || ^17.0 || ^18.0"
594 | },
595 | "peerDependenciesMeta": {
596 | "@types/react": {
597 | "optional": true
598 | }
599 | }
600 | },
601 | "node_modules/@radix-ui/react-dismissable-layer": {
602 | "version": "1.0.5",
603 | "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz",
604 | "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==",
605 | "dependencies": {
606 | "@babel/runtime": "^7.13.10",
607 | "@radix-ui/primitive": "1.0.1",
608 | "@radix-ui/react-compose-refs": "1.0.1",
609 | "@radix-ui/react-primitive": "1.0.3",
610 | "@radix-ui/react-use-callback-ref": "1.0.1",
611 | "@radix-ui/react-use-escape-keydown": "1.0.3"
612 | },
613 | "peerDependencies": {
614 | "@types/react": "*",
615 | "@types/react-dom": "*",
616 | "react": "^16.8 || ^17.0 || ^18.0",
617 | "react-dom": "^16.8 || ^17.0 || ^18.0"
618 | },
619 | "peerDependenciesMeta": {
620 | "@types/react": {
621 | "optional": true
622 | },
623 | "@types/react-dom": {
624 | "optional": true
625 | }
626 | }
627 | },
628 | "node_modules/@radix-ui/react-focus-guards": {
629 | "version": "1.0.1",
630 | "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz",
631 | "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==",
632 | "dependencies": {
633 | "@babel/runtime": "^7.13.10"
634 | },
635 | "peerDependencies": {
636 | "@types/react": "*",
637 | "react": "^16.8 || ^17.0 || ^18.0"
638 | },
639 | "peerDependenciesMeta": {
640 | "@types/react": {
641 | "optional": true
642 | }
643 | }
644 | },
645 | "node_modules/@radix-ui/react-focus-scope": {
646 | "version": "1.0.4",
647 | "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz",
648 | "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==",
649 | "dependencies": {
650 | "@babel/runtime": "^7.13.10",
651 | "@radix-ui/react-compose-refs": "1.0.1",
652 | "@radix-ui/react-primitive": "1.0.3",
653 | "@radix-ui/react-use-callback-ref": "1.0.1"
654 | },
655 | "peerDependencies": {
656 | "@types/react": "*",
657 | "@types/react-dom": "*",
658 | "react": "^16.8 || ^17.0 || ^18.0",
659 | "react-dom": "^16.8 || ^17.0 || ^18.0"
660 | },
661 | "peerDependenciesMeta": {
662 | "@types/react": {
663 | "optional": true
664 | },
665 | "@types/react-dom": {
666 | "optional": true
667 | }
668 | }
669 | },
670 | "node_modules/@radix-ui/react-icons": {
671 | "version": "1.3.0",
672 | "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz",
673 | "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==",
674 | "peerDependencies": {
675 | "react": "^16.x || ^17.x || ^18.x"
676 | }
677 | },
678 | "node_modules/@radix-ui/react-id": {
679 | "version": "1.0.1",
680 | "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz",
681 | "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==",
682 | "dependencies": {
683 | "@babel/runtime": "^7.13.10",
684 | "@radix-ui/react-use-layout-effect": "1.0.1"
685 | },
686 | "peerDependencies": {
687 | "@types/react": "*",
688 | "react": "^16.8 || ^17.0 || ^18.0"
689 | },
690 | "peerDependenciesMeta": {
691 | "@types/react": {
692 | "optional": true
693 | }
694 | }
695 | },
696 | "node_modules/@radix-ui/react-label": {
697 | "version": "2.0.2",
698 | "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz",
699 | "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==",
700 | "dependencies": {
701 | "@babel/runtime": "^7.13.10",
702 | "@radix-ui/react-primitive": "1.0.3"
703 | },
704 | "peerDependencies": {
705 | "@types/react": "*",
706 | "@types/react-dom": "*",
707 | "react": "^16.8 || ^17.0 || ^18.0",
708 | "react-dom": "^16.8 || ^17.0 || ^18.0"
709 | },
710 | "peerDependenciesMeta": {
711 | "@types/react": {
712 | "optional": true
713 | },
714 | "@types/react-dom": {
715 | "optional": true
716 | }
717 | }
718 | },
719 | "node_modules/@radix-ui/react-menu": {
720 | "version": "2.0.6",
721 | "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz",
722 | "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==",
723 | "dependencies": {
724 | "@babel/runtime": "^7.13.10",
725 | "@radix-ui/primitive": "1.0.1",
726 | "@radix-ui/react-collection": "1.0.3",
727 | "@radix-ui/react-compose-refs": "1.0.1",
728 | "@radix-ui/react-context": "1.0.1",
729 | "@radix-ui/react-direction": "1.0.1",
730 | "@radix-ui/react-dismissable-layer": "1.0.5",
731 | "@radix-ui/react-focus-guards": "1.0.1",
732 | "@radix-ui/react-focus-scope": "1.0.4",
733 | "@radix-ui/react-id": "1.0.1",
734 | "@radix-ui/react-popper": "1.1.3",
735 | "@radix-ui/react-portal": "1.0.4",
736 | "@radix-ui/react-presence": "1.0.1",
737 | "@radix-ui/react-primitive": "1.0.3",
738 | "@radix-ui/react-roving-focus": "1.0.4",
739 | "@radix-ui/react-slot": "1.0.2",
740 | "@radix-ui/react-use-callback-ref": "1.0.1",
741 | "aria-hidden": "^1.1.1",
742 | "react-remove-scroll": "2.5.5"
743 | },
744 | "peerDependencies": {
745 | "@types/react": "*",
746 | "@types/react-dom": "*",
747 | "react": "^16.8 || ^17.0 || ^18.0",
748 | "react-dom": "^16.8 || ^17.0 || ^18.0"
749 | },
750 | "peerDependenciesMeta": {
751 | "@types/react": {
752 | "optional": true
753 | },
754 | "@types/react-dom": {
755 | "optional": true
756 | }
757 | }
758 | },
759 | "node_modules/@radix-ui/react-menubar": {
760 | "version": "1.0.4",
761 | "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.0.4.tgz",
762 | "integrity": "sha512-bHgUo9gayKZfaQcWSSLr++LyS0rgh+MvD89DE4fJ6TkGHvjHgPaBZf44hdka7ogOxIOdj9163J+5xL2Dn4qzzg==",
763 | "dependencies": {
764 | "@babel/runtime": "^7.13.10",
765 | "@radix-ui/primitive": "1.0.1",
766 | "@radix-ui/react-collection": "1.0.3",
767 | "@radix-ui/react-compose-refs": "1.0.1",
768 | "@radix-ui/react-context": "1.0.1",
769 | "@radix-ui/react-direction": "1.0.1",
770 | "@radix-ui/react-id": "1.0.1",
771 | "@radix-ui/react-menu": "2.0.6",
772 | "@radix-ui/react-primitive": "1.0.3",
773 | "@radix-ui/react-roving-focus": "1.0.4",
774 | "@radix-ui/react-use-controllable-state": "1.0.1"
775 | },
776 | "peerDependencies": {
777 | "@types/react": "*",
778 | "@types/react-dom": "*",
779 | "react": "^16.8 || ^17.0 || ^18.0",
780 | "react-dom": "^16.8 || ^17.0 || ^18.0"
781 | },
782 | "peerDependenciesMeta": {
783 | "@types/react": {
784 | "optional": true
785 | },
786 | "@types/react-dom": {
787 | "optional": true
788 | }
789 | }
790 | },
791 | "node_modules/@radix-ui/react-popper": {
792 | "version": "1.1.3",
793 | "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz",
794 | "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==",
795 | "dependencies": {
796 | "@babel/runtime": "^7.13.10",
797 | "@floating-ui/react-dom": "^2.0.0",
798 | "@radix-ui/react-arrow": "1.0.3",
799 | "@radix-ui/react-compose-refs": "1.0.1",
800 | "@radix-ui/react-context": "1.0.1",
801 | "@radix-ui/react-primitive": "1.0.3",
802 | "@radix-ui/react-use-callback-ref": "1.0.1",
803 | "@radix-ui/react-use-layout-effect": "1.0.1",
804 | "@radix-ui/react-use-rect": "1.0.1",
805 | "@radix-ui/react-use-size": "1.0.1",
806 | "@radix-ui/rect": "1.0.1"
807 | },
808 | "peerDependencies": {
809 | "@types/react": "*",
810 | "@types/react-dom": "*",
811 | "react": "^16.8 || ^17.0 || ^18.0",
812 | "react-dom": "^16.8 || ^17.0 || ^18.0"
813 | },
814 | "peerDependenciesMeta": {
815 | "@types/react": {
816 | "optional": true
817 | },
818 | "@types/react-dom": {
819 | "optional": true
820 | }
821 | }
822 | },
823 | "node_modules/@radix-ui/react-portal": {
824 | "version": "1.0.4",
825 | "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz",
826 | "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==",
827 | "dependencies": {
828 | "@babel/runtime": "^7.13.10",
829 | "@radix-ui/react-primitive": "1.0.3"
830 | },
831 | "peerDependencies": {
832 | "@types/react": "*",
833 | "@types/react-dom": "*",
834 | "react": "^16.8 || ^17.0 || ^18.0",
835 | "react-dom": "^16.8 || ^17.0 || ^18.0"
836 | },
837 | "peerDependenciesMeta": {
838 | "@types/react": {
839 | "optional": true
840 | },
841 | "@types/react-dom": {
842 | "optional": true
843 | }
844 | }
845 | },
846 | "node_modules/@radix-ui/react-presence": {
847 | "version": "1.0.1",
848 | "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz",
849 | "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==",
850 | "dependencies": {
851 | "@babel/runtime": "^7.13.10",
852 | "@radix-ui/react-compose-refs": "1.0.1",
853 | "@radix-ui/react-use-layout-effect": "1.0.1"
854 | },
855 | "peerDependencies": {
856 | "@types/react": "*",
857 | "@types/react-dom": "*",
858 | "react": "^16.8 || ^17.0 || ^18.0",
859 | "react-dom": "^16.8 || ^17.0 || ^18.0"
860 | },
861 | "peerDependenciesMeta": {
862 | "@types/react": {
863 | "optional": true
864 | },
865 | "@types/react-dom": {
866 | "optional": true
867 | }
868 | }
869 | },
870 | "node_modules/@radix-ui/react-primitive": {
871 | "version": "1.0.3",
872 | "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
873 | "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==",
874 | "dependencies": {
875 | "@babel/runtime": "^7.13.10",
876 | "@radix-ui/react-slot": "1.0.2"
877 | },
878 | "peerDependencies": {
879 | "@types/react": "*",
880 | "@types/react-dom": "*",
881 | "react": "^16.8 || ^17.0 || ^18.0",
882 | "react-dom": "^16.8 || ^17.0 || ^18.0"
883 | },
884 | "peerDependenciesMeta": {
885 | "@types/react": {
886 | "optional": true
887 | },
888 | "@types/react-dom": {
889 | "optional": true
890 | }
891 | }
892 | },
893 | "node_modules/@radix-ui/react-radio-group": {
894 | "version": "1.1.3",
895 | "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz",
896 | "integrity": "sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==",
897 | "dependencies": {
898 | "@babel/runtime": "^7.13.10",
899 | "@radix-ui/primitive": "1.0.1",
900 | "@radix-ui/react-compose-refs": "1.0.1",
901 | "@radix-ui/react-context": "1.0.1",
902 | "@radix-ui/react-direction": "1.0.1",
903 | "@radix-ui/react-presence": "1.0.1",
904 | "@radix-ui/react-primitive": "1.0.3",
905 | "@radix-ui/react-roving-focus": "1.0.4",
906 | "@radix-ui/react-use-controllable-state": "1.0.1",
907 | "@radix-ui/react-use-previous": "1.0.1",
908 | "@radix-ui/react-use-size": "1.0.1"
909 | },
910 | "peerDependencies": {
911 | "@types/react": "*",
912 | "@types/react-dom": "*",
913 | "react": "^16.8 || ^17.0 || ^18.0",
914 | "react-dom": "^16.8 || ^17.0 || ^18.0"
915 | },
916 | "peerDependenciesMeta": {
917 | "@types/react": {
918 | "optional": true
919 | },
920 | "@types/react-dom": {
921 | "optional": true
922 | }
923 | }
924 | },
925 | "node_modules/@radix-ui/react-roving-focus": {
926 | "version": "1.0.4",
927 | "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz",
928 | "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==",
929 | "dependencies": {
930 | "@babel/runtime": "^7.13.10",
931 | "@radix-ui/primitive": "1.0.1",
932 | "@radix-ui/react-collection": "1.0.3",
933 | "@radix-ui/react-compose-refs": "1.0.1",
934 | "@radix-ui/react-context": "1.0.1",
935 | "@radix-ui/react-direction": "1.0.1",
936 | "@radix-ui/react-id": "1.0.1",
937 | "@radix-ui/react-primitive": "1.0.3",
938 | "@radix-ui/react-use-callback-ref": "1.0.1",
939 | "@radix-ui/react-use-controllable-state": "1.0.1"
940 | },
941 | "peerDependencies": {
942 | "@types/react": "*",
943 | "@types/react-dom": "*",
944 | "react": "^16.8 || ^17.0 || ^18.0",
945 | "react-dom": "^16.8 || ^17.0 || ^18.0"
946 | },
947 | "peerDependenciesMeta": {
948 | "@types/react": {
949 | "optional": true
950 | },
951 | "@types/react-dom": {
952 | "optional": true
953 | }
954 | }
955 | },
956 | "node_modules/@radix-ui/react-slot": {
957 | "version": "1.0.2",
958 | "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
959 | "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
960 | "dependencies": {
961 | "@babel/runtime": "^7.13.10",
962 | "@radix-ui/react-compose-refs": "1.0.1"
963 | },
964 | "peerDependencies": {
965 | "@types/react": "*",
966 | "react": "^16.8 || ^17.0 || ^18.0"
967 | },
968 | "peerDependenciesMeta": {
969 | "@types/react": {
970 | "optional": true
971 | }
972 | }
973 | },
974 | "node_modules/@radix-ui/react-toast": {
975 | "version": "1.1.5",
976 | "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.5.tgz",
977 | "integrity": "sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==",
978 | "dependencies": {
979 | "@babel/runtime": "^7.13.10",
980 | "@radix-ui/primitive": "1.0.1",
981 | "@radix-ui/react-collection": "1.0.3",
982 | "@radix-ui/react-compose-refs": "1.0.1",
983 | "@radix-ui/react-context": "1.0.1",
984 | "@radix-ui/react-dismissable-layer": "1.0.5",
985 | "@radix-ui/react-portal": "1.0.4",
986 | "@radix-ui/react-presence": "1.0.1",
987 | "@radix-ui/react-primitive": "1.0.3",
988 | "@radix-ui/react-use-callback-ref": "1.0.1",
989 | "@radix-ui/react-use-controllable-state": "1.0.1",
990 | "@radix-ui/react-use-layout-effect": "1.0.1",
991 | "@radix-ui/react-visually-hidden": "1.0.3"
992 | },
993 | "peerDependencies": {
994 | "@types/react": "*",
995 | "@types/react-dom": "*",
996 | "react": "^16.8 || ^17.0 || ^18.0",
997 | "react-dom": "^16.8 || ^17.0 || ^18.0"
998 | },
999 | "peerDependenciesMeta": {
1000 | "@types/react": {
1001 | "optional": true
1002 | },
1003 | "@types/react-dom": {
1004 | "optional": true
1005 | }
1006 | }
1007 | },
1008 | "node_modules/@radix-ui/react-use-callback-ref": {
1009 | "version": "1.0.1",
1010 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
1011 | "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==",
1012 | "dependencies": {
1013 | "@babel/runtime": "^7.13.10"
1014 | },
1015 | "peerDependencies": {
1016 | "@types/react": "*",
1017 | "react": "^16.8 || ^17.0 || ^18.0"
1018 | },
1019 | "peerDependenciesMeta": {
1020 | "@types/react": {
1021 | "optional": true
1022 | }
1023 | }
1024 | },
1025 | "node_modules/@radix-ui/react-use-controllable-state": {
1026 | "version": "1.0.1",
1027 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz",
1028 | "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==",
1029 | "dependencies": {
1030 | "@babel/runtime": "^7.13.10",
1031 | "@radix-ui/react-use-callback-ref": "1.0.1"
1032 | },
1033 | "peerDependencies": {
1034 | "@types/react": "*",
1035 | "react": "^16.8 || ^17.0 || ^18.0"
1036 | },
1037 | "peerDependenciesMeta": {
1038 | "@types/react": {
1039 | "optional": true
1040 | }
1041 | }
1042 | },
1043 | "node_modules/@radix-ui/react-use-escape-keydown": {
1044 | "version": "1.0.3",
1045 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz",
1046 | "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==",
1047 | "dependencies": {
1048 | "@babel/runtime": "^7.13.10",
1049 | "@radix-ui/react-use-callback-ref": "1.0.1"
1050 | },
1051 | "peerDependencies": {
1052 | "@types/react": "*",
1053 | "react": "^16.8 || ^17.0 || ^18.0"
1054 | },
1055 | "peerDependenciesMeta": {
1056 | "@types/react": {
1057 | "optional": true
1058 | }
1059 | }
1060 | },
1061 | "node_modules/@radix-ui/react-use-layout-effect": {
1062 | "version": "1.0.1",
1063 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz",
1064 | "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==",
1065 | "dependencies": {
1066 | "@babel/runtime": "^7.13.10"
1067 | },
1068 | "peerDependencies": {
1069 | "@types/react": "*",
1070 | "react": "^16.8 || ^17.0 || ^18.0"
1071 | },
1072 | "peerDependenciesMeta": {
1073 | "@types/react": {
1074 | "optional": true
1075 | }
1076 | }
1077 | },
1078 | "node_modules/@radix-ui/react-use-previous": {
1079 | "version": "1.0.1",
1080 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz",
1081 | "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==",
1082 | "dependencies": {
1083 | "@babel/runtime": "^7.13.10"
1084 | },
1085 | "peerDependencies": {
1086 | "@types/react": "*",
1087 | "react": "^16.8 || ^17.0 || ^18.0"
1088 | },
1089 | "peerDependenciesMeta": {
1090 | "@types/react": {
1091 | "optional": true
1092 | }
1093 | }
1094 | },
1095 | "node_modules/@radix-ui/react-use-rect": {
1096 | "version": "1.0.1",
1097 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz",
1098 | "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==",
1099 | "dependencies": {
1100 | "@babel/runtime": "^7.13.10",
1101 | "@radix-ui/rect": "1.0.1"
1102 | },
1103 | "peerDependencies": {
1104 | "@types/react": "*",
1105 | "react": "^16.8 || ^17.0 || ^18.0"
1106 | },
1107 | "peerDependenciesMeta": {
1108 | "@types/react": {
1109 | "optional": true
1110 | }
1111 | }
1112 | },
1113 | "node_modules/@radix-ui/react-use-size": {
1114 | "version": "1.0.1",
1115 | "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz",
1116 | "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==",
1117 | "dependencies": {
1118 | "@babel/runtime": "^7.13.10",
1119 | "@radix-ui/react-use-layout-effect": "1.0.1"
1120 | },
1121 | "peerDependencies": {
1122 | "@types/react": "*",
1123 | "react": "^16.8 || ^17.0 || ^18.0"
1124 | },
1125 | "peerDependenciesMeta": {
1126 | "@types/react": {
1127 | "optional": true
1128 | }
1129 | }
1130 | },
1131 | "node_modules/@radix-ui/react-visually-hidden": {
1132 | "version": "1.0.3",
1133 | "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz",
1134 | "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==",
1135 | "dependencies": {
1136 | "@babel/runtime": "^7.13.10",
1137 | "@radix-ui/react-primitive": "1.0.3"
1138 | },
1139 | "peerDependencies": {
1140 | "@types/react": "*",
1141 | "@types/react-dom": "*",
1142 | "react": "^16.8 || ^17.0 || ^18.0",
1143 | "react-dom": "^16.8 || ^17.0 || ^18.0"
1144 | },
1145 | "peerDependenciesMeta": {
1146 | "@types/react": {
1147 | "optional": true
1148 | },
1149 | "@types/react-dom": {
1150 | "optional": true
1151 | }
1152 | }
1153 | },
1154 | "node_modules/@radix-ui/rect": {
1155 | "version": "1.0.1",
1156 | "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz",
1157 | "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==",
1158 | "dependencies": {
1159 | "@babel/runtime": "^7.13.10"
1160 | }
1161 | },
1162 | "node_modules/@swc/counter": {
1163 | "version": "0.1.3",
1164 | "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
1165 | "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
1166 | },
1167 | "node_modules/@swc/helpers": {
1168 | "version": "0.5.5",
1169 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
1170 | "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
1171 | "dependencies": {
1172 | "@swc/counter": "^0.1.3",
1173 | "tslib": "^2.4.0"
1174 | }
1175 | },
1176 | "node_modules/@types/node": {
1177 | "version": "20.12.7",
1178 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
1179 | "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
1180 | "dev": true,
1181 | "dependencies": {
1182 | "undici-types": "~5.26.4"
1183 | }
1184 | },
1185 | "node_modules/@types/prop-types": {
1186 | "version": "15.7.12",
1187 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
1188 | "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
1189 | "devOptional": true
1190 | },
1191 | "node_modules/@types/react": {
1192 | "version": "18.3.1",
1193 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz",
1194 | "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==",
1195 | "devOptional": true,
1196 | "dependencies": {
1197 | "@types/prop-types": "*",
1198 | "csstype": "^3.0.2"
1199 | }
1200 | },
1201 | "node_modules/@types/react-dom": {
1202 | "version": "18.3.0",
1203 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
1204 | "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
1205 | "devOptional": true,
1206 | "dependencies": {
1207 | "@types/react": "*"
1208 | }
1209 | },
1210 | "node_modules/ansi-regex": {
1211 | "version": "6.0.1",
1212 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
1213 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
1214 | "engines": {
1215 | "node": ">=12"
1216 | },
1217 | "funding": {
1218 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1219 | }
1220 | },
1221 | "node_modules/ansi-styles": {
1222 | "version": "6.2.1",
1223 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
1224 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
1225 | "engines": {
1226 | "node": ">=12"
1227 | },
1228 | "funding": {
1229 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1230 | }
1231 | },
1232 | "node_modules/any-promise": {
1233 | "version": "1.3.0",
1234 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1235 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
1236 | },
1237 | "node_modules/anymatch": {
1238 | "version": "3.1.3",
1239 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1240 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1241 | "dependencies": {
1242 | "normalize-path": "^3.0.0",
1243 | "picomatch": "^2.0.4"
1244 | },
1245 | "engines": {
1246 | "node": ">= 8"
1247 | }
1248 | },
1249 | "node_modules/arg": {
1250 | "version": "5.0.2",
1251 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1252 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
1253 | },
1254 | "node_modules/aria-hidden": {
1255 | "version": "1.2.4",
1256 | "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
1257 | "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
1258 | "dependencies": {
1259 | "tslib": "^2.0.0"
1260 | },
1261 | "engines": {
1262 | "node": ">=10"
1263 | }
1264 | },
1265 | "node_modules/balanced-match": {
1266 | "version": "1.0.2",
1267 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1268 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1269 | },
1270 | "node_modules/bignumber.js": {
1271 | "version": "9.1.2",
1272 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz",
1273 | "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==",
1274 | "engines": {
1275 | "node": "*"
1276 | }
1277 | },
1278 | "node_modules/binary-extensions": {
1279 | "version": "2.3.0",
1280 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1281 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1282 | "engines": {
1283 | "node": ">=8"
1284 | },
1285 | "funding": {
1286 | "url": "https://github.com/sponsors/sindresorhus"
1287 | }
1288 | },
1289 | "node_modules/brace-expansion": {
1290 | "version": "2.0.1",
1291 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1292 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1293 | "dependencies": {
1294 | "balanced-match": "^1.0.0"
1295 | }
1296 | },
1297 | "node_modules/braces": {
1298 | "version": "3.0.2",
1299 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1300 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1301 | "dependencies": {
1302 | "fill-range": "^7.0.1"
1303 | },
1304 | "engines": {
1305 | "node": ">=8"
1306 | }
1307 | },
1308 | "node_modules/busboy": {
1309 | "version": "1.6.0",
1310 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
1311 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
1312 | "dependencies": {
1313 | "streamsearch": "^1.1.0"
1314 | },
1315 | "engines": {
1316 | "node": ">=10.16.0"
1317 | }
1318 | },
1319 | "node_modules/camelcase-css": {
1320 | "version": "2.0.1",
1321 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1322 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1323 | "engines": {
1324 | "node": ">= 6"
1325 | }
1326 | },
1327 | "node_modules/caniuse-lite": {
1328 | "version": "1.0.30001614",
1329 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz",
1330 | "integrity": "sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==",
1331 | "funding": [
1332 | {
1333 | "type": "opencollective",
1334 | "url": "https://opencollective.com/browserslist"
1335 | },
1336 | {
1337 | "type": "tidelift",
1338 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1339 | },
1340 | {
1341 | "type": "github",
1342 | "url": "https://github.com/sponsors/ai"
1343 | }
1344 | ]
1345 | },
1346 | "node_modules/ccy-icons": {
1347 | "version": "1.0.4",
1348 | "resolved": "https://registry.npmjs.org/ccy-icons/-/ccy-icons-1.0.4.tgz",
1349 | "integrity": "sha512-e8TnyK+hB3tmMrDttq6cmDV9O3nGR6qofOT4GboL+bRkObec7lWMk5rlMxcrkYTsIGxUJ150lXGSeN09gcWMxQ==",
1350 | "peerDependencies": {
1351 | "react": ">=16.8.0",
1352 | "react-dom": ">=16.8.0"
1353 | }
1354 | },
1355 | "node_modules/chokidar": {
1356 | "version": "3.6.0",
1357 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1358 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1359 | "dependencies": {
1360 | "anymatch": "~3.1.2",
1361 | "braces": "~3.0.2",
1362 | "glob-parent": "~5.1.2",
1363 | "is-binary-path": "~2.1.0",
1364 | "is-glob": "~4.0.1",
1365 | "normalize-path": "~3.0.0",
1366 | "readdirp": "~3.6.0"
1367 | },
1368 | "engines": {
1369 | "node": ">= 8.10.0"
1370 | },
1371 | "funding": {
1372 | "url": "https://paulmillr.com/funding/"
1373 | },
1374 | "optionalDependencies": {
1375 | "fsevents": "~2.3.2"
1376 | }
1377 | },
1378 | "node_modules/chokidar/node_modules/glob-parent": {
1379 | "version": "5.1.2",
1380 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1381 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1382 | "dependencies": {
1383 | "is-glob": "^4.0.1"
1384 | },
1385 | "engines": {
1386 | "node": ">= 6"
1387 | }
1388 | },
1389 | "node_modules/class-variance-authority": {
1390 | "version": "0.7.0",
1391 | "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
1392 | "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
1393 | "dependencies": {
1394 | "clsx": "2.0.0"
1395 | },
1396 | "funding": {
1397 | "url": "https://joebell.co.uk"
1398 | }
1399 | },
1400 | "node_modules/class-variance-authority/node_modules/clsx": {
1401 | "version": "2.0.0",
1402 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
1403 | "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
1404 | "engines": {
1405 | "node": ">=6"
1406 | }
1407 | },
1408 | "node_modules/client-only": {
1409 | "version": "0.0.1",
1410 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
1411 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
1412 | },
1413 | "node_modules/clsx": {
1414 | "version": "2.1.1",
1415 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
1416 | "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
1417 | "engines": {
1418 | "node": ">=6"
1419 | }
1420 | },
1421 | "node_modules/color-convert": {
1422 | "version": "2.0.1",
1423 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1424 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1425 | "dependencies": {
1426 | "color-name": "~1.1.4"
1427 | },
1428 | "engines": {
1429 | "node": ">=7.0.0"
1430 | }
1431 | },
1432 | "node_modules/color-name": {
1433 | "version": "1.1.4",
1434 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1435 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1436 | },
1437 | "node_modules/commander": {
1438 | "version": "4.1.1",
1439 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1440 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1441 | "engines": {
1442 | "node": ">= 6"
1443 | }
1444 | },
1445 | "node_modules/copy-to-clipboard": {
1446 | "version": "3.3.3",
1447 | "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
1448 | "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
1449 | "dependencies": {
1450 | "toggle-selection": "^1.0.6"
1451 | }
1452 | },
1453 | "node_modules/cross-spawn": {
1454 | "version": "7.0.3",
1455 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1456 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1457 | "dependencies": {
1458 | "path-key": "^3.1.0",
1459 | "shebang-command": "^2.0.0",
1460 | "which": "^2.0.1"
1461 | },
1462 | "engines": {
1463 | "node": ">= 8"
1464 | }
1465 | },
1466 | "node_modules/cssesc": {
1467 | "version": "3.0.0",
1468 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1469 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1470 | "bin": {
1471 | "cssesc": "bin/cssesc"
1472 | },
1473 | "engines": {
1474 | "node": ">=4"
1475 | }
1476 | },
1477 | "node_modules/csstype": {
1478 | "version": "3.1.3",
1479 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1480 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1481 | "devOptional": true
1482 | },
1483 | "node_modules/dayjs": {
1484 | "version": "1.11.11",
1485 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz",
1486 | "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
1487 | },
1488 | "node_modules/detect-node-es": {
1489 | "version": "1.1.0",
1490 | "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
1491 | "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
1492 | },
1493 | "node_modules/didyoumean": {
1494 | "version": "1.2.2",
1495 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1496 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
1497 | },
1498 | "node_modules/dlv": {
1499 | "version": "1.1.3",
1500 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1501 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
1502 | },
1503 | "node_modules/dotenv": {
1504 | "version": "16.4.5",
1505 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
1506 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
1507 | "engines": {
1508 | "node": ">=12"
1509 | },
1510 | "funding": {
1511 | "url": "https://dotenvx.com"
1512 | }
1513 | },
1514 | "node_modules/eastasianwidth": {
1515 | "version": "0.2.0",
1516 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1517 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
1518 | },
1519 | "node_modules/emoji-regex": {
1520 | "version": "9.2.2",
1521 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1522 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
1523 | },
1524 | "node_modules/fast-glob": {
1525 | "version": "3.3.2",
1526 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
1527 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
1528 | "dependencies": {
1529 | "@nodelib/fs.stat": "^2.0.2",
1530 | "@nodelib/fs.walk": "^1.2.3",
1531 | "glob-parent": "^5.1.2",
1532 | "merge2": "^1.3.0",
1533 | "micromatch": "^4.0.4"
1534 | },
1535 | "engines": {
1536 | "node": ">=8.6.0"
1537 | }
1538 | },
1539 | "node_modules/fast-glob/node_modules/glob-parent": {
1540 | "version": "5.1.2",
1541 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1542 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1543 | "dependencies": {
1544 | "is-glob": "^4.0.1"
1545 | },
1546 | "engines": {
1547 | "node": ">= 6"
1548 | }
1549 | },
1550 | "node_modules/fastq": {
1551 | "version": "1.17.1",
1552 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
1553 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
1554 | "dependencies": {
1555 | "reusify": "^1.0.4"
1556 | }
1557 | },
1558 | "node_modules/fill-range": {
1559 | "version": "7.0.1",
1560 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1561 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1562 | "dependencies": {
1563 | "to-regex-range": "^5.0.1"
1564 | },
1565 | "engines": {
1566 | "node": ">=8"
1567 | }
1568 | },
1569 | "node_modules/foreground-child": {
1570 | "version": "3.1.1",
1571 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
1572 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
1573 | "dependencies": {
1574 | "cross-spawn": "^7.0.0",
1575 | "signal-exit": "^4.0.1"
1576 | },
1577 | "engines": {
1578 | "node": ">=14"
1579 | },
1580 | "funding": {
1581 | "url": "https://github.com/sponsors/isaacs"
1582 | }
1583 | },
1584 | "node_modules/fsevents": {
1585 | "version": "2.3.3",
1586 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1587 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1588 | "hasInstallScript": true,
1589 | "optional": true,
1590 | "os": [
1591 | "darwin"
1592 | ],
1593 | "engines": {
1594 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1595 | }
1596 | },
1597 | "node_modules/function-bind": {
1598 | "version": "1.1.2",
1599 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1600 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1601 | "funding": {
1602 | "url": "https://github.com/sponsors/ljharb"
1603 | }
1604 | },
1605 | "node_modules/get-nonce": {
1606 | "version": "1.0.1",
1607 | "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
1608 | "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
1609 | "engines": {
1610 | "node": ">=6"
1611 | }
1612 | },
1613 | "node_modules/glob": {
1614 | "version": "10.3.12",
1615 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
1616 | "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
1617 | "dependencies": {
1618 | "foreground-child": "^3.1.0",
1619 | "jackspeak": "^2.3.6",
1620 | "minimatch": "^9.0.1",
1621 | "minipass": "^7.0.4",
1622 | "path-scurry": "^1.10.2"
1623 | },
1624 | "bin": {
1625 | "glob": "dist/esm/bin.mjs"
1626 | },
1627 | "engines": {
1628 | "node": ">=16 || 14 >=14.17"
1629 | },
1630 | "funding": {
1631 | "url": "https://github.com/sponsors/isaacs"
1632 | }
1633 | },
1634 | "node_modules/glob-parent": {
1635 | "version": "6.0.2",
1636 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1637 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1638 | "dependencies": {
1639 | "is-glob": "^4.0.3"
1640 | },
1641 | "engines": {
1642 | "node": ">=10.13.0"
1643 | }
1644 | },
1645 | "node_modules/graceful-fs": {
1646 | "version": "4.2.11",
1647 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1648 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
1649 | },
1650 | "node_modules/hasown": {
1651 | "version": "2.0.2",
1652 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1653 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1654 | "dependencies": {
1655 | "function-bind": "^1.1.2"
1656 | },
1657 | "engines": {
1658 | "node": ">= 0.4"
1659 | }
1660 | },
1661 | "node_modules/invariant": {
1662 | "version": "2.2.4",
1663 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
1664 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
1665 | "dependencies": {
1666 | "loose-envify": "^1.0.0"
1667 | }
1668 | },
1669 | "node_modules/is-binary-path": {
1670 | "version": "2.1.0",
1671 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1672 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1673 | "dependencies": {
1674 | "binary-extensions": "^2.0.0"
1675 | },
1676 | "engines": {
1677 | "node": ">=8"
1678 | }
1679 | },
1680 | "node_modules/is-core-module": {
1681 | "version": "2.13.1",
1682 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
1683 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
1684 | "dependencies": {
1685 | "hasown": "^2.0.0"
1686 | },
1687 | "funding": {
1688 | "url": "https://github.com/sponsors/ljharb"
1689 | }
1690 | },
1691 | "node_modules/is-extglob": {
1692 | "version": "2.1.1",
1693 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1694 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1695 | "engines": {
1696 | "node": ">=0.10.0"
1697 | }
1698 | },
1699 | "node_modules/is-fullwidth-code-point": {
1700 | "version": "3.0.0",
1701 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1702 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1703 | "engines": {
1704 | "node": ">=8"
1705 | }
1706 | },
1707 | "node_modules/is-glob": {
1708 | "version": "4.0.3",
1709 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1710 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1711 | "dependencies": {
1712 | "is-extglob": "^2.1.1"
1713 | },
1714 | "engines": {
1715 | "node": ">=0.10.0"
1716 | }
1717 | },
1718 | "node_modules/is-number": {
1719 | "version": "7.0.0",
1720 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1721 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1722 | "engines": {
1723 | "node": ">=0.12.0"
1724 | }
1725 | },
1726 | "node_modules/isexe": {
1727 | "version": "2.0.0",
1728 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1729 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
1730 | },
1731 | "node_modules/jackspeak": {
1732 | "version": "2.3.6",
1733 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
1734 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
1735 | "dependencies": {
1736 | "@isaacs/cliui": "^8.0.2"
1737 | },
1738 | "engines": {
1739 | "node": ">=14"
1740 | },
1741 | "funding": {
1742 | "url": "https://github.com/sponsors/isaacs"
1743 | },
1744 | "optionalDependencies": {
1745 | "@pkgjs/parseargs": "^0.11.0"
1746 | }
1747 | },
1748 | "node_modules/jiti": {
1749 | "version": "1.21.0",
1750 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
1751 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
1752 | "bin": {
1753 | "jiti": "bin/jiti.js"
1754 | }
1755 | },
1756 | "node_modules/js-tokens": {
1757 | "version": "4.0.0",
1758 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1759 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1760 | },
1761 | "node_modules/lilconfig": {
1762 | "version": "2.1.0",
1763 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
1764 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
1765 | "engines": {
1766 | "node": ">=10"
1767 | }
1768 | },
1769 | "node_modules/lines-and-columns": {
1770 | "version": "1.2.4",
1771 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1772 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
1773 | },
1774 | "node_modules/lodash": {
1775 | "version": "4.17.21",
1776 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1777 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
1778 | },
1779 | "node_modules/loose-envify": {
1780 | "version": "1.4.0",
1781 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1782 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1783 | "dependencies": {
1784 | "js-tokens": "^3.0.0 || ^4.0.0"
1785 | },
1786 | "bin": {
1787 | "loose-envify": "cli.js"
1788 | }
1789 | },
1790 | "node_modules/lru-cache": {
1791 | "version": "10.2.2",
1792 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
1793 | "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
1794 | "engines": {
1795 | "node": "14 || >=16.14"
1796 | }
1797 | },
1798 | "node_modules/merge2": {
1799 | "version": "1.4.1",
1800 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1801 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1802 | "engines": {
1803 | "node": ">= 8"
1804 | }
1805 | },
1806 | "node_modules/micromatch": {
1807 | "version": "4.0.5",
1808 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1809 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1810 | "dependencies": {
1811 | "braces": "^3.0.2",
1812 | "picomatch": "^2.3.1"
1813 | },
1814 | "engines": {
1815 | "node": ">=8.6"
1816 | }
1817 | },
1818 | "node_modules/minimatch": {
1819 | "version": "9.0.4",
1820 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
1821 | "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
1822 | "dependencies": {
1823 | "brace-expansion": "^2.0.1"
1824 | },
1825 | "engines": {
1826 | "node": ">=16 || 14 >=14.17"
1827 | },
1828 | "funding": {
1829 | "url": "https://github.com/sponsors/isaacs"
1830 | }
1831 | },
1832 | "node_modules/minipass": {
1833 | "version": "7.0.4",
1834 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
1835 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
1836 | "engines": {
1837 | "node": ">=16 || 14 >=14.17"
1838 | }
1839 | },
1840 | "node_modules/mz": {
1841 | "version": "2.7.0",
1842 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1843 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1844 | "dependencies": {
1845 | "any-promise": "^1.0.0",
1846 | "object-assign": "^4.0.1",
1847 | "thenify-all": "^1.0.0"
1848 | }
1849 | },
1850 | "node_modules/nanoid": {
1851 | "version": "3.3.7",
1852 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1853 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1854 | "funding": [
1855 | {
1856 | "type": "github",
1857 | "url": "https://github.com/sponsors/ai"
1858 | }
1859 | ],
1860 | "bin": {
1861 | "nanoid": "bin/nanoid.cjs"
1862 | },
1863 | "engines": {
1864 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1865 | }
1866 | },
1867 | "node_modules/next": {
1868 | "version": "14.2.3",
1869 | "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz",
1870 | "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==",
1871 | "dependencies": {
1872 | "@next/env": "14.2.3",
1873 | "@swc/helpers": "0.5.5",
1874 | "busboy": "1.6.0",
1875 | "caniuse-lite": "^1.0.30001579",
1876 | "graceful-fs": "^4.2.11",
1877 | "postcss": "8.4.31",
1878 | "styled-jsx": "5.1.1"
1879 | },
1880 | "bin": {
1881 | "next": "dist/bin/next"
1882 | },
1883 | "engines": {
1884 | "node": ">=18.17.0"
1885 | },
1886 | "optionalDependencies": {
1887 | "@next/swc-darwin-arm64": "14.2.3",
1888 | "@next/swc-darwin-x64": "14.2.3",
1889 | "@next/swc-linux-arm64-gnu": "14.2.3",
1890 | "@next/swc-linux-arm64-musl": "14.2.3",
1891 | "@next/swc-linux-x64-gnu": "14.2.3",
1892 | "@next/swc-linux-x64-musl": "14.2.3",
1893 | "@next/swc-win32-arm64-msvc": "14.2.3",
1894 | "@next/swc-win32-ia32-msvc": "14.2.3",
1895 | "@next/swc-win32-x64-msvc": "14.2.3"
1896 | },
1897 | "peerDependencies": {
1898 | "@opentelemetry/api": "^1.1.0",
1899 | "@playwright/test": "^1.41.2",
1900 | "react": "^18.2.0",
1901 | "react-dom": "^18.2.0",
1902 | "sass": "^1.3.0"
1903 | },
1904 | "peerDependenciesMeta": {
1905 | "@opentelemetry/api": {
1906 | "optional": true
1907 | },
1908 | "@playwright/test": {
1909 | "optional": true
1910 | },
1911 | "sass": {
1912 | "optional": true
1913 | }
1914 | }
1915 | },
1916 | "node_modules/next-view-transitions": {
1917 | "version": "0.1.1",
1918 | "resolved": "https://registry.npmjs.org/next-view-transitions/-/next-view-transitions-0.1.1.tgz",
1919 | "integrity": "sha512-1rpXhWF8j0VJwJG52c8WeeAYpr1K7o3ub82lahbSoUwAry54TEm1d3mqBbSLLIMl85c3OewkZjxncTHwYFk+IA==",
1920 | "peerDependencies": {
1921 | "next": "^14.0.0",
1922 | "react": "^18.2.0",
1923 | "react-dom": "^18.2.0"
1924 | }
1925 | },
1926 | "node_modules/next/node_modules/postcss": {
1927 | "version": "8.4.31",
1928 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
1929 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
1930 | "funding": [
1931 | {
1932 | "type": "opencollective",
1933 | "url": "https://opencollective.com/postcss/"
1934 | },
1935 | {
1936 | "type": "tidelift",
1937 | "url": "https://tidelift.com/funding/github/npm/postcss"
1938 | },
1939 | {
1940 | "type": "github",
1941 | "url": "https://github.com/sponsors/ai"
1942 | }
1943 | ],
1944 | "dependencies": {
1945 | "nanoid": "^3.3.6",
1946 | "picocolors": "^1.0.0",
1947 | "source-map-js": "^1.0.2"
1948 | },
1949 | "engines": {
1950 | "node": "^10 || ^12 || >=14"
1951 | }
1952 | },
1953 | "node_modules/node-cron": {
1954 | "version": "3.0.3",
1955 | "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
1956 | "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
1957 | "dependencies": {
1958 | "uuid": "8.3.2"
1959 | },
1960 | "engines": {
1961 | "node": ">=6.0.0"
1962 | }
1963 | },
1964 | "node_modules/normalize-path": {
1965 | "version": "3.0.0",
1966 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1967 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1968 | "engines": {
1969 | "node": ">=0.10.0"
1970 | }
1971 | },
1972 | "node_modules/object-assign": {
1973 | "version": "4.1.1",
1974 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1975 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1976 | "engines": {
1977 | "node": ">=0.10.0"
1978 | }
1979 | },
1980 | "node_modules/object-hash": {
1981 | "version": "3.0.0",
1982 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1983 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1984 | "engines": {
1985 | "node": ">= 6"
1986 | }
1987 | },
1988 | "node_modules/path-key": {
1989 | "version": "3.1.1",
1990 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1991 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1992 | "engines": {
1993 | "node": ">=8"
1994 | }
1995 | },
1996 | "node_modules/path-parse": {
1997 | "version": "1.0.7",
1998 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1999 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
2000 | },
2001 | "node_modules/path-scurry": {
2002 | "version": "1.10.2",
2003 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
2004 | "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
2005 | "dependencies": {
2006 | "lru-cache": "^10.2.0",
2007 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
2008 | },
2009 | "engines": {
2010 | "node": ">=16 || 14 >=14.17"
2011 | },
2012 | "funding": {
2013 | "url": "https://github.com/sponsors/isaacs"
2014 | }
2015 | },
2016 | "node_modules/picocolors": {
2017 | "version": "1.0.0",
2018 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
2019 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
2020 | },
2021 | "node_modules/picomatch": {
2022 | "version": "2.3.1",
2023 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2024 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2025 | "engines": {
2026 | "node": ">=8.6"
2027 | },
2028 | "funding": {
2029 | "url": "https://github.com/sponsors/jonschlinkert"
2030 | }
2031 | },
2032 | "node_modules/pify": {
2033 | "version": "2.3.0",
2034 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2035 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
2036 | "engines": {
2037 | "node": ">=0.10.0"
2038 | }
2039 | },
2040 | "node_modules/pirates": {
2041 | "version": "4.0.6",
2042 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
2043 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
2044 | "engines": {
2045 | "node": ">= 6"
2046 | }
2047 | },
2048 | "node_modules/postcss": {
2049 | "version": "8.4.38",
2050 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
2051 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
2052 | "funding": [
2053 | {
2054 | "type": "opencollective",
2055 | "url": "https://opencollective.com/postcss/"
2056 | },
2057 | {
2058 | "type": "tidelift",
2059 | "url": "https://tidelift.com/funding/github/npm/postcss"
2060 | },
2061 | {
2062 | "type": "github",
2063 | "url": "https://github.com/sponsors/ai"
2064 | }
2065 | ],
2066 | "dependencies": {
2067 | "nanoid": "^3.3.7",
2068 | "picocolors": "^1.0.0",
2069 | "source-map-js": "^1.2.0"
2070 | },
2071 | "engines": {
2072 | "node": "^10 || ^12 || >=14"
2073 | }
2074 | },
2075 | "node_modules/postcss-import": {
2076 | "version": "15.1.0",
2077 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2078 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
2079 | "dependencies": {
2080 | "postcss-value-parser": "^4.0.0",
2081 | "read-cache": "^1.0.0",
2082 | "resolve": "^1.1.7"
2083 | },
2084 | "engines": {
2085 | "node": ">=14.0.0"
2086 | },
2087 | "peerDependencies": {
2088 | "postcss": "^8.0.0"
2089 | }
2090 | },
2091 | "node_modules/postcss-js": {
2092 | "version": "4.0.1",
2093 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
2094 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
2095 | "dependencies": {
2096 | "camelcase-css": "^2.0.1"
2097 | },
2098 | "engines": {
2099 | "node": "^12 || ^14 || >= 16"
2100 | },
2101 | "funding": {
2102 | "type": "opencollective",
2103 | "url": "https://opencollective.com/postcss/"
2104 | },
2105 | "peerDependencies": {
2106 | "postcss": "^8.4.21"
2107 | }
2108 | },
2109 | "node_modules/postcss-load-config": {
2110 | "version": "4.0.2",
2111 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
2112 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
2113 | "funding": [
2114 | {
2115 | "type": "opencollective",
2116 | "url": "https://opencollective.com/postcss/"
2117 | },
2118 | {
2119 | "type": "github",
2120 | "url": "https://github.com/sponsors/ai"
2121 | }
2122 | ],
2123 | "dependencies": {
2124 | "lilconfig": "^3.0.0",
2125 | "yaml": "^2.3.4"
2126 | },
2127 | "engines": {
2128 | "node": ">= 14"
2129 | },
2130 | "peerDependencies": {
2131 | "postcss": ">=8.0.9",
2132 | "ts-node": ">=9.0.0"
2133 | },
2134 | "peerDependenciesMeta": {
2135 | "postcss": {
2136 | "optional": true
2137 | },
2138 | "ts-node": {
2139 | "optional": true
2140 | }
2141 | }
2142 | },
2143 | "node_modules/postcss-load-config/node_modules/lilconfig": {
2144 | "version": "3.1.1",
2145 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
2146 | "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
2147 | "engines": {
2148 | "node": ">=14"
2149 | },
2150 | "funding": {
2151 | "url": "https://github.com/sponsors/antonk52"
2152 | }
2153 | },
2154 | "node_modules/postcss-nested": {
2155 | "version": "6.0.1",
2156 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
2157 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
2158 | "dependencies": {
2159 | "postcss-selector-parser": "^6.0.11"
2160 | },
2161 | "engines": {
2162 | "node": ">=12.0"
2163 | },
2164 | "funding": {
2165 | "type": "opencollective",
2166 | "url": "https://opencollective.com/postcss/"
2167 | },
2168 | "peerDependencies": {
2169 | "postcss": "^8.2.14"
2170 | }
2171 | },
2172 | "node_modules/postcss-selector-parser": {
2173 | "version": "6.0.16",
2174 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
2175 | "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
2176 | "dependencies": {
2177 | "cssesc": "^3.0.0",
2178 | "util-deprecate": "^1.0.2"
2179 | },
2180 | "engines": {
2181 | "node": ">=4"
2182 | }
2183 | },
2184 | "node_modules/postcss-value-parser": {
2185 | "version": "4.2.0",
2186 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2187 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
2188 | },
2189 | "node_modules/prisma": {
2190 | "version": "5.13.0",
2191 | "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.13.0.tgz",
2192 | "integrity": "sha512-kGtcJaElNRAdAGsCNykFSZ7dBKpL14Cbs+VaQ8cECxQlRPDjBlMHNFYeYt0SKovAVy2Y65JXQwB3A5+zIQwnTg==",
2193 | "devOptional": true,
2194 | "hasInstallScript": true,
2195 | "dependencies": {
2196 | "@prisma/engines": "5.13.0"
2197 | },
2198 | "bin": {
2199 | "prisma": "build/index.js"
2200 | },
2201 | "engines": {
2202 | "node": ">=16.13"
2203 | }
2204 | },
2205 | "node_modules/prop-types": {
2206 | "version": "15.8.1",
2207 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2208 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2209 | "dependencies": {
2210 | "loose-envify": "^1.4.0",
2211 | "object-assign": "^4.1.1",
2212 | "react-is": "^16.13.1"
2213 | }
2214 | },
2215 | "node_modules/queue-microtask": {
2216 | "version": "1.2.3",
2217 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2218 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2219 | "funding": [
2220 | {
2221 | "type": "github",
2222 | "url": "https://github.com/sponsors/feross"
2223 | },
2224 | {
2225 | "type": "patreon",
2226 | "url": "https://www.patreon.com/feross"
2227 | },
2228 | {
2229 | "type": "consulting",
2230 | "url": "https://feross.org/support"
2231 | }
2232 | ]
2233 | },
2234 | "node_modules/react": {
2235 | "version": "18.3.1",
2236 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2237 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2238 | "dependencies": {
2239 | "loose-envify": "^1.1.0"
2240 | },
2241 | "engines": {
2242 | "node": ">=0.10.0"
2243 | }
2244 | },
2245 | "node_modules/react-copy-to-clipboard": {
2246 | "version": "5.1.0",
2247 | "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz",
2248 | "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==",
2249 | "dependencies": {
2250 | "copy-to-clipboard": "^3.3.1",
2251 | "prop-types": "^15.8.1"
2252 | },
2253 | "peerDependencies": {
2254 | "react": "^15.3.0 || 16 || 17 || 18"
2255 | }
2256 | },
2257 | "node_modules/react-dom": {
2258 | "version": "18.3.1",
2259 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2260 | "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2261 | "dependencies": {
2262 | "loose-envify": "^1.1.0",
2263 | "scheduler": "^0.23.2"
2264 | },
2265 | "peerDependencies": {
2266 | "react": "^18.3.1"
2267 | }
2268 | },
2269 | "node_modules/react-is": {
2270 | "version": "16.13.1",
2271 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2272 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
2273 | },
2274 | "node_modules/react-remove-scroll": {
2275 | "version": "2.5.5",
2276 | "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
2277 | "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==",
2278 | "dependencies": {
2279 | "react-remove-scroll-bar": "^2.3.3",
2280 | "react-style-singleton": "^2.2.1",
2281 | "tslib": "^2.1.0",
2282 | "use-callback-ref": "^1.3.0",
2283 | "use-sidecar": "^1.1.2"
2284 | },
2285 | "engines": {
2286 | "node": ">=10"
2287 | },
2288 | "peerDependencies": {
2289 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
2290 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
2291 | },
2292 | "peerDependenciesMeta": {
2293 | "@types/react": {
2294 | "optional": true
2295 | }
2296 | }
2297 | },
2298 | "node_modules/react-remove-scroll-bar": {
2299 | "version": "2.3.6",
2300 | "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
2301 | "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
2302 | "dependencies": {
2303 | "react-style-singleton": "^2.2.1",
2304 | "tslib": "^2.0.0"
2305 | },
2306 | "engines": {
2307 | "node": ">=10"
2308 | },
2309 | "peerDependencies": {
2310 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
2311 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
2312 | },
2313 | "peerDependenciesMeta": {
2314 | "@types/react": {
2315 | "optional": true
2316 | }
2317 | }
2318 | },
2319 | "node_modules/react-style-singleton": {
2320 | "version": "2.2.1",
2321 | "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
2322 | "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
2323 | "dependencies": {
2324 | "get-nonce": "^1.0.0",
2325 | "invariant": "^2.2.4",
2326 | "tslib": "^2.0.0"
2327 | },
2328 | "engines": {
2329 | "node": ">=10"
2330 | },
2331 | "peerDependencies": {
2332 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
2333 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
2334 | },
2335 | "peerDependenciesMeta": {
2336 | "@types/react": {
2337 | "optional": true
2338 | }
2339 | }
2340 | },
2341 | "node_modules/read-cache": {
2342 | "version": "1.0.0",
2343 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2344 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2345 | "dependencies": {
2346 | "pify": "^2.3.0"
2347 | }
2348 | },
2349 | "node_modules/readdirp": {
2350 | "version": "3.6.0",
2351 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2352 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2353 | "dependencies": {
2354 | "picomatch": "^2.2.1"
2355 | },
2356 | "engines": {
2357 | "node": ">=8.10.0"
2358 | }
2359 | },
2360 | "node_modules/regenerator-runtime": {
2361 | "version": "0.14.1",
2362 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
2363 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
2364 | },
2365 | "node_modules/resolve": {
2366 | "version": "1.22.8",
2367 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
2368 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
2369 | "dependencies": {
2370 | "is-core-module": "^2.13.0",
2371 | "path-parse": "^1.0.7",
2372 | "supports-preserve-symlinks-flag": "^1.0.0"
2373 | },
2374 | "bin": {
2375 | "resolve": "bin/resolve"
2376 | },
2377 | "funding": {
2378 | "url": "https://github.com/sponsors/ljharb"
2379 | }
2380 | },
2381 | "node_modules/reusify": {
2382 | "version": "1.0.4",
2383 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2384 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2385 | "engines": {
2386 | "iojs": ">=1.0.0",
2387 | "node": ">=0.10.0"
2388 | }
2389 | },
2390 | "node_modules/run-parallel": {
2391 | "version": "1.2.0",
2392 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2393 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2394 | "funding": [
2395 | {
2396 | "type": "github",
2397 | "url": "https://github.com/sponsors/feross"
2398 | },
2399 | {
2400 | "type": "patreon",
2401 | "url": "https://www.patreon.com/feross"
2402 | },
2403 | {
2404 | "type": "consulting",
2405 | "url": "https://feross.org/support"
2406 | }
2407 | ],
2408 | "dependencies": {
2409 | "queue-microtask": "^1.2.2"
2410 | }
2411 | },
2412 | "node_modules/scheduler": {
2413 | "version": "0.23.2",
2414 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
2415 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
2416 | "dependencies": {
2417 | "loose-envify": "^1.1.0"
2418 | }
2419 | },
2420 | "node_modules/shebang-command": {
2421 | "version": "2.0.0",
2422 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2423 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2424 | "dependencies": {
2425 | "shebang-regex": "^3.0.0"
2426 | },
2427 | "engines": {
2428 | "node": ">=8"
2429 | }
2430 | },
2431 | "node_modules/shebang-regex": {
2432 | "version": "3.0.0",
2433 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2434 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2435 | "engines": {
2436 | "node": ">=8"
2437 | }
2438 | },
2439 | "node_modules/signal-exit": {
2440 | "version": "4.1.0",
2441 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2442 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2443 | "engines": {
2444 | "node": ">=14"
2445 | },
2446 | "funding": {
2447 | "url": "https://github.com/sponsors/isaacs"
2448 | }
2449 | },
2450 | "node_modules/source-map-js": {
2451 | "version": "1.2.0",
2452 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
2453 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
2454 | "engines": {
2455 | "node": ">=0.10.0"
2456 | }
2457 | },
2458 | "node_modules/streamsearch": {
2459 | "version": "1.1.0",
2460 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
2461 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
2462 | "engines": {
2463 | "node": ">=10.0.0"
2464 | }
2465 | },
2466 | "node_modules/string-width": {
2467 | "version": "5.1.2",
2468 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2469 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2470 | "dependencies": {
2471 | "eastasianwidth": "^0.2.0",
2472 | "emoji-regex": "^9.2.2",
2473 | "strip-ansi": "^7.0.1"
2474 | },
2475 | "engines": {
2476 | "node": ">=12"
2477 | },
2478 | "funding": {
2479 | "url": "https://github.com/sponsors/sindresorhus"
2480 | }
2481 | },
2482 | "node_modules/string-width-cjs": {
2483 | "name": "string-width",
2484 | "version": "4.2.3",
2485 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2486 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2487 | "dependencies": {
2488 | "emoji-regex": "^8.0.0",
2489 | "is-fullwidth-code-point": "^3.0.0",
2490 | "strip-ansi": "^6.0.1"
2491 | },
2492 | "engines": {
2493 | "node": ">=8"
2494 | }
2495 | },
2496 | "node_modules/string-width-cjs/node_modules/ansi-regex": {
2497 | "version": "5.0.1",
2498 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2499 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2500 | "engines": {
2501 | "node": ">=8"
2502 | }
2503 | },
2504 | "node_modules/string-width-cjs/node_modules/emoji-regex": {
2505 | "version": "8.0.0",
2506 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2507 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
2508 | },
2509 | "node_modules/string-width-cjs/node_modules/strip-ansi": {
2510 | "version": "6.0.1",
2511 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2512 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2513 | "dependencies": {
2514 | "ansi-regex": "^5.0.1"
2515 | },
2516 | "engines": {
2517 | "node": ">=8"
2518 | }
2519 | },
2520 | "node_modules/strip-ansi": {
2521 | "version": "7.1.0",
2522 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2523 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2524 | "dependencies": {
2525 | "ansi-regex": "^6.0.1"
2526 | },
2527 | "engines": {
2528 | "node": ">=12"
2529 | },
2530 | "funding": {
2531 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2532 | }
2533 | },
2534 | "node_modules/strip-ansi-cjs": {
2535 | "name": "strip-ansi",
2536 | "version": "6.0.1",
2537 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2538 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2539 | "dependencies": {
2540 | "ansi-regex": "^5.0.1"
2541 | },
2542 | "engines": {
2543 | "node": ">=8"
2544 | }
2545 | },
2546 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
2547 | "version": "5.0.1",
2548 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2549 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2550 | "engines": {
2551 | "node": ">=8"
2552 | }
2553 | },
2554 | "node_modules/styled-jsx": {
2555 | "version": "5.1.1",
2556 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
2557 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
2558 | "dependencies": {
2559 | "client-only": "0.0.1"
2560 | },
2561 | "engines": {
2562 | "node": ">= 12.0.0"
2563 | },
2564 | "peerDependencies": {
2565 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
2566 | },
2567 | "peerDependenciesMeta": {
2568 | "@babel/core": {
2569 | "optional": true
2570 | },
2571 | "babel-plugin-macros": {
2572 | "optional": true
2573 | }
2574 | }
2575 | },
2576 | "node_modules/sucrase": {
2577 | "version": "3.35.0",
2578 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
2579 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
2580 | "dependencies": {
2581 | "@jridgewell/gen-mapping": "^0.3.2",
2582 | "commander": "^4.0.0",
2583 | "glob": "^10.3.10",
2584 | "lines-and-columns": "^1.1.6",
2585 | "mz": "^2.7.0",
2586 | "pirates": "^4.0.1",
2587 | "ts-interface-checker": "^0.1.9"
2588 | },
2589 | "bin": {
2590 | "sucrase": "bin/sucrase",
2591 | "sucrase-node": "bin/sucrase-node"
2592 | },
2593 | "engines": {
2594 | "node": ">=16 || 14 >=14.17"
2595 | }
2596 | },
2597 | "node_modules/supports-preserve-symlinks-flag": {
2598 | "version": "1.0.0",
2599 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2600 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2601 | "engines": {
2602 | "node": ">= 0.4"
2603 | },
2604 | "funding": {
2605 | "url": "https://github.com/sponsors/ljharb"
2606 | }
2607 | },
2608 | "node_modules/tailwind-merge": {
2609 | "version": "2.3.0",
2610 | "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz",
2611 | "integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==",
2612 | "dependencies": {
2613 | "@babel/runtime": "^7.24.1"
2614 | },
2615 | "funding": {
2616 | "type": "github",
2617 | "url": "https://github.com/sponsors/dcastil"
2618 | }
2619 | },
2620 | "node_modules/tailwindcss": {
2621 | "version": "3.4.3",
2622 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
2623 | "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
2624 | "dependencies": {
2625 | "@alloc/quick-lru": "^5.2.0",
2626 | "arg": "^5.0.2",
2627 | "chokidar": "^3.5.3",
2628 | "didyoumean": "^1.2.2",
2629 | "dlv": "^1.1.3",
2630 | "fast-glob": "^3.3.0",
2631 | "glob-parent": "^6.0.2",
2632 | "is-glob": "^4.0.3",
2633 | "jiti": "^1.21.0",
2634 | "lilconfig": "^2.1.0",
2635 | "micromatch": "^4.0.5",
2636 | "normalize-path": "^3.0.0",
2637 | "object-hash": "^3.0.0",
2638 | "picocolors": "^1.0.0",
2639 | "postcss": "^8.4.23",
2640 | "postcss-import": "^15.1.0",
2641 | "postcss-js": "^4.0.1",
2642 | "postcss-load-config": "^4.0.1",
2643 | "postcss-nested": "^6.0.1",
2644 | "postcss-selector-parser": "^6.0.11",
2645 | "resolve": "^1.22.2",
2646 | "sucrase": "^3.32.0"
2647 | },
2648 | "bin": {
2649 | "tailwind": "lib/cli.js",
2650 | "tailwindcss": "lib/cli.js"
2651 | },
2652 | "engines": {
2653 | "node": ">=14.0.0"
2654 | }
2655 | },
2656 | "node_modules/tailwindcss-animate": {
2657 | "version": "1.0.7",
2658 | "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
2659 | "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
2660 | "peerDependencies": {
2661 | "tailwindcss": ">=3.0.0 || insiders"
2662 | }
2663 | },
2664 | "node_modules/thenify": {
2665 | "version": "3.3.1",
2666 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2667 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2668 | "dependencies": {
2669 | "any-promise": "^1.0.0"
2670 | }
2671 | },
2672 | "node_modules/thenify-all": {
2673 | "version": "1.6.0",
2674 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2675 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2676 | "dependencies": {
2677 | "thenify": ">= 3.1.0 < 4"
2678 | },
2679 | "engines": {
2680 | "node": ">=0.8"
2681 | }
2682 | },
2683 | "node_modules/to-regex-range": {
2684 | "version": "5.0.1",
2685 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2686 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2687 | "dependencies": {
2688 | "is-number": "^7.0.0"
2689 | },
2690 | "engines": {
2691 | "node": ">=8.0"
2692 | }
2693 | },
2694 | "node_modules/toggle-selection": {
2695 | "version": "1.0.6",
2696 | "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
2697 | "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
2698 | },
2699 | "node_modules/ts-interface-checker": {
2700 | "version": "0.1.13",
2701 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2702 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
2703 | },
2704 | "node_modules/tslib": {
2705 | "version": "2.6.2",
2706 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
2707 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
2708 | },
2709 | "node_modules/typescript": {
2710 | "version": "5.4.5",
2711 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
2712 | "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
2713 | "dev": true,
2714 | "bin": {
2715 | "tsc": "bin/tsc",
2716 | "tsserver": "bin/tsserver"
2717 | },
2718 | "engines": {
2719 | "node": ">=14.17"
2720 | }
2721 | },
2722 | "node_modules/undici-types": {
2723 | "version": "5.26.5",
2724 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
2725 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
2726 | "dev": true
2727 | },
2728 | "node_modules/use-callback-ref": {
2729 | "version": "1.3.2",
2730 | "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
2731 | "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
2732 | "dependencies": {
2733 | "tslib": "^2.0.0"
2734 | },
2735 | "engines": {
2736 | "node": ">=10"
2737 | },
2738 | "peerDependencies": {
2739 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
2740 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
2741 | },
2742 | "peerDependenciesMeta": {
2743 | "@types/react": {
2744 | "optional": true
2745 | }
2746 | }
2747 | },
2748 | "node_modules/use-sidecar": {
2749 | "version": "1.1.2",
2750 | "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
2751 | "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
2752 | "dependencies": {
2753 | "detect-node-es": "^1.1.0",
2754 | "tslib": "^2.0.0"
2755 | },
2756 | "engines": {
2757 | "node": ">=10"
2758 | },
2759 | "peerDependencies": {
2760 | "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
2761 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
2762 | },
2763 | "peerDependenciesMeta": {
2764 | "@types/react": {
2765 | "optional": true
2766 | }
2767 | }
2768 | },
2769 | "node_modules/util-deprecate": {
2770 | "version": "1.0.2",
2771 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2772 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
2773 | },
2774 | "node_modules/uuid": {
2775 | "version": "8.3.2",
2776 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
2777 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
2778 | "bin": {
2779 | "uuid": "dist/bin/uuid"
2780 | }
2781 | },
2782 | "node_modules/vaul": {
2783 | "version": "0.9.0",
2784 | "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.0.tgz",
2785 | "integrity": "sha512-bZSySGbAHiTXmZychprnX/dE0EsSige88xtyyL3/MCRbrFotRPQZo7UdydGXZWw+CKbNOw5Ow8gwAo93/nB/Cg==",
2786 | "dependencies": {
2787 | "@radix-ui/react-dialog": "^1.0.4"
2788 | },
2789 | "peerDependencies": {
2790 | "react": "^16.8 || ^17.0 || ^18.0",
2791 | "react-dom": "^16.8 || ^17.0 || ^18.0"
2792 | }
2793 | },
2794 | "node_modules/which": {
2795 | "version": "2.0.2",
2796 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2797 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2798 | "dependencies": {
2799 | "isexe": "^2.0.0"
2800 | },
2801 | "bin": {
2802 | "node-which": "bin/node-which"
2803 | },
2804 | "engines": {
2805 | "node": ">= 8"
2806 | }
2807 | },
2808 | "node_modules/wrap-ansi": {
2809 | "version": "8.1.0",
2810 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
2811 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
2812 | "dependencies": {
2813 | "ansi-styles": "^6.1.0",
2814 | "string-width": "^5.0.1",
2815 | "strip-ansi": "^7.0.1"
2816 | },
2817 | "engines": {
2818 | "node": ">=12"
2819 | },
2820 | "funding": {
2821 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2822 | }
2823 | },
2824 | "node_modules/wrap-ansi-cjs": {
2825 | "name": "wrap-ansi",
2826 | "version": "7.0.0",
2827 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2828 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2829 | "dependencies": {
2830 | "ansi-styles": "^4.0.0",
2831 | "string-width": "^4.1.0",
2832 | "strip-ansi": "^6.0.0"
2833 | },
2834 | "engines": {
2835 | "node": ">=10"
2836 | },
2837 | "funding": {
2838 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2839 | }
2840 | },
2841 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
2842 | "version": "5.0.1",
2843 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2844 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2845 | "engines": {
2846 | "node": ">=8"
2847 | }
2848 | },
2849 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
2850 | "version": "4.3.0",
2851 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2852 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2853 | "dependencies": {
2854 | "color-convert": "^2.0.1"
2855 | },
2856 | "engines": {
2857 | "node": ">=8"
2858 | },
2859 | "funding": {
2860 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2861 | }
2862 | },
2863 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
2864 | "version": "8.0.0",
2865 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2866 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
2867 | },
2868 | "node_modules/wrap-ansi-cjs/node_modules/string-width": {
2869 | "version": "4.2.3",
2870 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2871 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2872 | "dependencies": {
2873 | "emoji-regex": "^8.0.0",
2874 | "is-fullwidth-code-point": "^3.0.0",
2875 | "strip-ansi": "^6.0.1"
2876 | },
2877 | "engines": {
2878 | "node": ">=8"
2879 | }
2880 | },
2881 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
2882 | "version": "6.0.1",
2883 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2884 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2885 | "dependencies": {
2886 | "ansi-regex": "^5.0.1"
2887 | },
2888 | "engines": {
2889 | "node": ">=8"
2890 | }
2891 | },
2892 | "node_modules/yaml": {
2893 | "version": "2.4.2",
2894 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
2895 | "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
2896 | "bin": {
2897 | "yaml": "bin.mjs"
2898 | },
2899 | "engines": {
2900 | "node": ">= 14"
2901 | }
2902 | }
2903 | }
2904 | }
2905 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "luminapay",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "postinstall": "npx prisma generate",
7 | "dev": "next dev",
8 | "build": "next build",
9 | "start": "next start",
10 | "lint": "next lint"
11 | },
12 | "dependencies": {
13 | "@leenguyen/react-flip-clock-countdown": "^1.5.2",
14 | "@prisma/client": "^5.13.0",
15 | "@radix-ui/react-alert-dialog": "^1.0.5",
16 | "@radix-ui/react-dialog": "^1.0.5",
17 | "@radix-ui/react-icons": "^1.3.0",
18 | "@radix-ui/react-label": "^2.0.2",
19 | "@radix-ui/react-menubar": "^1.0.4",
20 | "@radix-ui/react-radio-group": "^1.1.3",
21 | "@radix-ui/react-slot": "^1.0.2",
22 | "@radix-ui/react-toast": "^1.1.5",
23 | "bignumber.js": "^9.1.2",
24 | "ccy-icons": "^1.0.4",
25 | "class-variance-authority": "^0.7.0",
26 | "clsx": "^2.1.1",
27 | "dayjs": "^1.11.11",
28 | "dotenv": "^16.4.5",
29 | "lodash": "^4.17.21",
30 | "next": "14.2.3",
31 | "next-view-transitions": "^0.1.1",
32 | "node-cron": "^3.0.3",
33 | "react": "^18",
34 | "react-copy-to-clipboard": "^5.1.0",
35 | "react-dom": "^18",
36 | "tailwind-merge": "^2.3.0",
37 | "tailwindcss-animate": "^1.0.7",
38 | "vaul": "^0.9.0"
39 | },
40 | "devDependencies": {
41 | "@types/node": "^20",
42 | "@types/react": "^18",
43 | "@types/react-dom": "^18",
44 | "postcss": "^8",
45 | "prisma": "^5.13.0",
46 | "tailwindcss": "^3.4.1",
47 | "typescript": "^5"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/prisma/schema.prisma:
--------------------------------------------------------------------------------
1 | // This is your Prisma schema file,
2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema
3 |
4 | // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
5 | // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
6 |
7 | generator client {
8 | provider = "prisma-client-js"
9 | }
10 |
11 | datasource db {
12 | provider = "postgresql"
13 | url = env("DATABASE_URL")
14 | }
15 |
16 | model Ka {
17 | id Int @id @default(autoincrement())
18 | title String
19 | price Float
20 | Order Order[]
21 | currentNo Int @default(0)
22 | currentHour String @default("")
23 | show Boolean @default(true)
24 | quota Int @default(0)
25 |
26 | // 商品库中不能有相同价格
27 | @@unique([price])
28 | }
29 |
30 | model Order {
31 | id Int @id @default(autoincrement())
32 | ka Ka @relation(fields: [kaId], references: [id])
33 | kaId Int
34 | hash String
35 | hours String
36 | price String
37 | payed Boolean @default(false)
38 | address String
39 | createdAt DateTime @default(now())
40 | used Boolean @default(false)
41 | usedAt DateTime?
42 | Tx Tx?
43 | txId Int?
44 |
45 | @@unique([hours, price])
46 | @@unique([hash])
47 | }
48 |
49 | model Manual {
50 | id Int @id @default(autoincrement())
51 | hash String
52 | quota Int
53 | createdAt DateTime @default(now())
54 | used Boolean @default(false)
55 | usedAt DateTime?
56 | log String?
57 |
58 | @@unique([hash])
59 | }
60 |
61 | model Tx {
62 | id Int @id @default(autoincrement())
63 | hash String
64 | // meta Json
65 | checked Boolean @default(false)
66 | order Order? @relation(fields: [orderId], references: [id])
67 | orderId Int?
68 |
69 | @@unique([orderId])
70 | @@unique([hash])
71 | }
72 |
--------------------------------------------------------------------------------
/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss"
2 |
3 | const config = {
4 | darkMode: ["class"],
5 | content: [
6 | './pages/**/*.{ts,tsx}',
7 | './components/**/*.{ts,tsx}',
8 | './app/**/*.{ts,tsx}',
9 | './src/**/*.{ts,tsx}',
10 | ],
11 | prefix: "",
12 | theme: {
13 | container: {
14 | center: true,
15 | padding: "2rem",
16 | screens: {
17 | "2xl": "1400px",
18 | },
19 | },
20 | extend: {
21 | colors: {
22 | border: "hsl(var(--border))",
23 | input: "hsl(var(--input))",
24 | ring: "hsl(var(--ring))",
25 | background: "hsl(var(--background))",
26 | foreground: "hsl(var(--foreground))",
27 | primary: {
28 | DEFAULT: "hsl(var(--primary))",
29 | foreground: "hsl(var(--primary-foreground))",
30 | },
31 | secondary: {
32 | DEFAULT: "hsl(var(--secondary))",
33 | foreground: "hsl(var(--secondary-foreground))",
34 | },
35 | destructive: {
36 | DEFAULT: "hsl(var(--destructive))",
37 | foreground: "hsl(var(--destructive-foreground))",
38 | },
39 | muted: {
40 | DEFAULT: "hsl(var(--muted))",
41 | foreground: "hsl(var(--muted-foreground))",
42 | },
43 | accent: {
44 | DEFAULT: "hsl(var(--accent))",
45 | foreground: "hsl(var(--accent-foreground))",
46 | },
47 | popover: {
48 | DEFAULT: "hsl(var(--popover))",
49 | foreground: "hsl(var(--popover-foreground))",
50 | },
51 | card: {
52 | DEFAULT: "hsl(var(--card))",
53 | foreground: "hsl(var(--card-foreground))",
54 | },
55 | },
56 | borderRadius: {
57 | lg: "var(--radius)",
58 | md: "calc(var(--radius) - 2px)",
59 | sm: "calc(var(--radius) - 4px)",
60 | },
61 | keyframes: {
62 | "accordion-down": {
63 | from: { height: "0" },
64 | to: { height: "var(--radix-accordion-content-height)" },
65 | },
66 | "accordion-up": {
67 | from: { height: "var(--radix-accordion-content-height)" },
68 | to: { height: "0" },
69 | },
70 | },
71 | animation: {
72 | "accordion-down": "accordion-down 0.2s ease-out",
73 | "accordion-up": "accordion-up 0.2s ease-out",
74 | },
75 | },
76 | },
77 | plugins: [require("tailwindcss-animate")],
78 | } satisfies Config
79 |
80 | export default config
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["dom", "dom.iterable", "esnext"],
4 | "allowJs": true,
5 | "skipLibCheck": true,
6 | "strict": true,
7 | "noEmit": true,
8 | "esModuleInterop": true,
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "jsx": "preserve",
14 | "incremental": true,
15 | "plugins": [
16 | {
17 | "name": "next"
18 | }
19 | ],
20 | "paths": {
21 | "@/*": ["./*"]
22 | }
23 | },
24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
25 | "exclude": ["node_modules"]
26 | }
27 |
--------------------------------------------------------------------------------