This commit is contained in:
‘Liammcl’
2025-01-19 16:59:17 +08:00
parent ec73e51a2d
commit 12bda4ab8f
19 changed files with 561 additions and 354 deletions

View File

@@ -16,26 +16,32 @@
"@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0", "@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2", "@dnd-kit/utilities": "^3.2.2",
"@heroicons/react": "^2.2.0",
"@mantine/code-highlight": "^7.15.2", "@mantine/code-highlight": "^7.15.2",
"@mantine/core": "^7.15.2", "@mantine/core": "^7.15.2",
"@mantine/hooks": "^7.15.2", "@mantine/hooks": "^7.15.2",
"@material-tailwind/react": "^2.1.10",
"@monaco-editor/react": "^4.6.0", "@monaco-editor/react": "^4.6.0",
"@supabase/supabase-js": "^2.38.4", "@supabase/supabase-js": "^2.38.4",
"ai": "^4.0.22", "ai": "^4.0.22",
"antd": "^5.11.0", "antd": "^5.11.0",
"apexcharts": "^4.3.0",
"code-highlight": "^1.0.0", "code-highlight": "^1.0.0",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"dnd-kit": "^0.0.2", "dnd-kit": "^0.0.2",
"heroicons": "^2.2.0",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"jspdf": "^2.5.2", "jspdf": "^2.5.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"react": "^18.2.0", "react": "^18.2.0",
"react-apexcharts": "^1.7.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-icons": "^5.4.0", "react-icons": "^5.4.0",
"react-infinite-scroll-component": "^6.1.0", "react-infinite-scroll-component": "^6.1.0",
"react-router-dom": "^6.18.0", "react-router-dom": "^6.18.0",
"react-use": "^17.6.0", "react-use": "^17.6.0",
"recharts": "^2.9.0", "recharts": "^2.15.0",
"remixicon": "^4.6.0",
"styled-components": "^6.1.0", "styled-components": "^6.1.0",
"uuid": "^11.0.3", "uuid": "^11.0.3",
"zod": "^3.24.1" "zod": "^3.24.1"

View File

@@ -0,0 +1,111 @@
import {
Card,
CardBody,
CardHeader,
Typography,
} from "@material-tailwind/react";
import Chart from "react-apexcharts";
const chartConfig = {
type: "bar",
height: 240,
series: [
{
name: "Sales",
data: [50, 40, 300, 320, 500, 350, 200, 230, 500],
},
],
options: {
chart: {
toolbar: {
show: false,
},
},
title: {
show: "",
},
dataLabels: {
enabled: false,
},
colors: ["#020617"],
plotOptions: {
bar: {
columnWidth: "40%",
borderRadius: 2,
},
},
xaxis: {
axisTicks: {
show: false,
},
axisBorder: {
show: false,
},
labels: {
style: {
colors: "#616161",
fontSize: "12px",
fontFamily: "inherit",
fontWeight: 400,
},
},
categories: [
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
],
},
yaxis: {
labels: {
style: {
colors: "#616161",
fontSize: "12px",
fontFamily: "inherit",
fontWeight: 400,
},
},
},
grid: {
show: true,
borderColor: "#dddddd",
strokeDashArray: 5,
xaxis: {
lines: {
show: true,
},
},
padding: {
top: 5,
right: 20,
},
},
fill: {
opacity: 0.8,
},
tooltip: {
theme: "dark",
},
},
};
export default function Example(props) {
return (
<Card {...props}>
<CardHeader
floated={false}
shadow={false}
color="transparent"
className="flex flex-col gap-4 rounded-none md:flex-row md:items-center"
>
</CardHeader>
<CardBody className="px-2 pb-0">
<Chart {...chartConfig} />
</CardBody>
</Card>
);
}

View File

@@ -1,220 +0,0 @@
import { Button, Drawer, Input, Space, message } from 'antd';
import { useChat } from "ai/react";
import { CodeHighlight } from "@mantine/code-highlight";
import { DownloadOutlined, EditOutlined, CheckOutlined, CloseOutlined } from '@ant-design/icons';
import { useRef, useEffect, useState } from 'react';
import { useSessionStorage } from 'react-use';
import Editor from "@monaco-editor/react";
export default function ChatAIDrawer({ open, onClose, onExport }) {
const STORAGE_KEY = 'chat_history';
const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, []);
const { messages, input, handleSubmit, handleInputChange, isLoading, setMessages } = useChat({
api: "https://test-ai-quirkyai.vercel.app/api/chat",
initialMessages: storedMessages.length>0? JSON.parse(storedMessages):[],
});
const messagesEndRef = useRef(null);
useEffect(() => {
setStoredMessages(JSON.stringify(messages));
}, [messages, setStoredMessages]);
// 新消息时自动滚动到底部
useEffect(() => {
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
}, [messages]);
// 修改导出函数,接收单条消息内容
const handleExport = (content) => {
try {
const jsonContent = JSON.parse(content);
onExport?.(jsonContent);
} catch (error) {
console.log(error);
message.error('导出失败,请重试');
}
};
const [editingMessageId, setEditingMessageId] = useState(null);
const [editingContent, setEditingContent] = useState('');
// 优化编辑处理函数
const handleEdit = (message) => {
if(isLoading) return;
setEditingContent(message.content);
setEditingMessageId(message.id);
};
const handleSaveEdit = () => {
try {
JSON.parse(editingContent);
setMessages(messages.map(msg =>
msg.id === editingMessageId
? { ...msg, content: editingContent }
: msg
));
setEditingMessageId(null);
message.success('编辑成功');
} catch (error) {
message.error('请输入有效的 JSON 格式');
}
};
const handleCancelEdit = () => {
setEditingMessageId(null);
setEditingContent('');
};
return (
<Drawer
title={
<div className="flex justify-between items-center">
<span className="text-lg font-medium text-gray-800">AI 助手</span>
<Button
size="small"
className="hover:bg-gray-100"
onClick={() => {
setMessages([]);
setStoredMessages('[]');
message.success('历史记录已清空');
}}
>
清空历史
</Button>
</div>
}
placement="right"
width={800}
open={open}
onClose={onClose}
>
<div className="flex flex-col h-[calc(100vh-108px)]">
<div className="flex-1 overflow-y-auto px-4 space-y-6">
{messages.map((message) => (
<div
key={message.id}
className={`rounded-lg p-4 transition-all ${
message.role === 'assistant'
? 'bg-blue-50 hover:bg-blue-100'
: 'bg-gray-50 hover:bg-gray-100'
}`}
>
<div className="flex justify-between items-center mb-3">
<span className={`font-medium ${
message.role === 'assistant' ? 'text-blue-600' : 'text-gray-600'
}`}>
{message.role === 'assistant' ? 'AI 助手' : '用户'}
</span>
{message.role === 'assistant' && (
<Space>
<Button
type="text"
size="small"
icon={<EditOutlined />}
disabled={isLoading}
onClick={() => handleEdit(message)}
className="text-gray-500 hover:text-blue-600"
>
编辑
</Button>
<Button
type="text"
size="small"
icon={<DownloadOutlined />}
onClick={() => handleExport(message.content)}
className="text-gray-500 hover:text-blue-600"
>
导出
</Button>
</Space>
)}
</div>
{message.role === "assistant" ? (
<div className="relative">
{editingMessageId === message.id ? (
<div className="rounded-lg border border-blue-200">
<Editor
height="300px"
defaultLanguage="json"
value={editingContent}
theme="vs-light"
options={{
minimap: { enabled: false },
scrollBeyondLastLine: false,
fontSize: 14,
lineNumbers: 'on',
renderLineHighlight: 'none',
roundedSelection: true,
}}
onChange={setEditingContent}
onMount={(editor) => {
editor.getModel()?.updateOptions({ tabSize: 2 });
editor.focus();
}}
/>
<div className="flex justify-end gap-2 p-2 bg-gray-50 border-t">
<Button
size="small"
icon={<CloseOutlined />}
onClick={handleCancelEdit}
className="hover:bg-gray-200"
>
取消
</Button>
<Button
type="primary"
size="small"
icon={<CheckOutlined />}
onClick={handleSaveEdit}
className="bg-blue-600 hover:bg-blue-700"
>
保存
</Button>
</div>
</div>
) : (
<CodeHighlight
code={message.content}
language="json"
copyLabel="复制代码"
copiedLabel="已复制!"
withLineNumbers
className="rounded-lg"
/>
)}
</div>
) : (
<div className="text-gray-700 whitespace-pre-wrap break-words">
{message.content}
</div>
)}
</div>
))}
<div ref={messagesEndRef} />
</div>
<div className="border-t bg-white p-4">
<form onSubmit={handleSubmit} className="flex gap-2">
<Input
value={input}
placeholder="请输入您的问题..."
onChange={handleInputChange}
disabled={isLoading}
className="flex-1 rounded-md "
/>
<Button
type="primary"
htmlType="submit"
loading={isLoading}
className="rounded-md"
>
发送
</Button>
</form>
</div>
</div>
</Drawer>
);
}

View File

@@ -66,11 +66,7 @@ const Sidebar = ({ collapsed }) => {
<Menu <Menu
theme={isDarkMode ? "dark" : "light"} theme={isDarkMode ? "dark" : "light"}
mode="inline" mode="inline"
<<<<<<< HEAD
selectedKeys={getSelectedKeys}
=======
selectedKeys={[selectedKey]} selectedKeys={[selectedKey]}
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
defaultOpenKeys={defaultOpenKeys} defaultOpenKeys={defaultOpenKeys}
items={menuClient} items={menuClient}
onClick={handleMenuClick} onClick={handleMenuClick}

View File

@@ -0,0 +1,49 @@
import React from 'react'
import {
Card,
CardBody,
CardHeader,
Typography,
} from "@material-tailwind/react";
import Chart from "react-apexcharts";
export default function index(props) {
const chartConfig = {
type: "pie",
width: 280,
height: 280,
series: [44, 55, 13, 43, 22],
options: {
chart: {
toolbar: {
show: false,
},
},
title: {
show: "",
},
dataLabels: {
enabled: false,
},
colors: ["#020617", "#ff8f00", "#00897b", "#1e88e5", "#d81b60"],
legend: {
show: false,
},
},
};
return (
<Card {...props}>
<CardHeader
floated={false}
shadow={false}
color="transparent"
className="flex flex-col gap-4 rounded-none md:flex-row md:items-center"
>
</CardHeader>
<CardBody className="px-2 pb-0">
<Chart {...chartConfig} />
</CardBody>
</Card>
)
}

View File

@@ -29,7 +29,7 @@ export const ProtectedRoute = ({ children }) => {
}); });
if (!hasPermission) { if (!hasPermission) {
return <Navigate to="/home" replace />; return <Navigate to="/dashboard" replace />;
} }
return children; return children;

View File

@@ -8,16 +8,17 @@ const StatCard = ({ icon, title, count, amount, color = '#1677ff' }) => {
<Card <Card
styles={{ styles={{
body: { body: {
padding: '20px', padding: '0',
height: '100%', height: '100%',
background: 'var(--color-bg-container)', background: 'var(--color-bg-container)',
} }
}} }}
className="h-full hover:shadow-md transition-shadow duration-300" className="h-full hover:shadow-md transition-shadow duration-300"
> >
<div className="flex items-start gap-4"> <div className="p-3 sm:p-5">
<div className="flex items-start gap-2 sm:gap-4">
<div <div
className="w-12 h-12 rounded-full flex items-center justify-center text-lg" className="w-10 h-10 sm:w-12 sm:h-12 rounded-full flex items-center justify-center text-base sm:text-lg"
style={{ style={{
backgroundColor: `${color}15`, backgroundColor: `${color}15`,
}} }}
@@ -25,17 +26,18 @@ const StatCard = ({ icon, title, count, amount, color = '#1677ff' }) => {
<span style={{ color }}>{icon}</span> <span style={{ color }}>{icon}</span>
</div> </div>
<div className="flex-1"> <div className="flex-1">
<h3 className="text-base text-gray-500 dark:text-gray-400 m-0"> <h3 className="text-sm sm:text-base text-gray-500 dark:text-gray-400 m-0">
{title} {title}
</h3> </h3>
<div className="text-sm text-gray-400 dark:text-gray-500 mt-1"> <div className="text-xs sm:text-sm text-gray-400 dark:text-gray-500 mt-0.5 sm:mt-1">
{count} invoices {count} invoices
</div> </div>
<div className="text-xl font-semibold mt-2 dark:text-white"> <div className="text-lg sm:text-xl font-semibold mt-1 sm:mt-2 dark:text-white">
{formatCurrency(amount)} {formatCurrency(amount)}
</div> </div>
</div> </div>
</div> </div>
</div>
</Card> </Card>
</div> </div>
); );

View File

@@ -42,7 +42,7 @@ const stats = [
const StatisticsOverview = () => { const StatisticsOverview = () => {
return ( return (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4"> <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-5 gap-4">
{stats.map((stat, index) => ( {stats.map((stat, index) => (
<StatCard key={index} {...stat} /> <StatCard key={index} {...stat} />
))} ))}

View File

@@ -29,8 +29,6 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
useEffect(() => { useEffect(() => {
if (storedMessages && storedMessages.length > 0) { if (storedMessages && storedMessages.length > 0) {
console.log(storedMessages,'storedMessages');
setMessages(storedMessages); setMessages(storedMessages);
} }
}, []); }, []);
@@ -106,6 +104,7 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
width={800} width={800}
open={open} open={open}
onClose={onClose} onClose={onClose}
className="rounded-l-xl"
> >
<div className="flex flex-col h-[calc(100vh-108px)]"> <div className="flex flex-col h-[calc(100vh-108px)]">
<div className="flex-1 overflow-y-auto px-4 space-y-6"> <div className="flex-1 overflow-y-auto px-4 space-y-6">
@@ -215,20 +214,20 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
<div ref={messagesEndRef} /> <div ref={messagesEndRef} />
</div> </div>
<div className="border-t dark:border-gray-700 p-4"> <div className="border-t dark:border-gray-700 bg-white dark:bg-gray-800 p-4">
<form onSubmit={handleSendMessage} className="flex gap-2"> <form onSubmit={handleSendMessage} className="flex gap-2">
<Input <Input
value={input} value={input}
placeholder="请输入您的问题..." placeholder="请输入您的问题..."
onChange={(e) => setInput(e.target.value)} onChange={(e) => setInput(e.target.value)}
disabled={isLoading} disabled={isLoading}
className="flex-1 rounded-md " className="flex-1 rounded-lg border-gray-300 dark:border-gray-600 hover:border-blue-400 dark:hover:border-blue-500 focus:border-blue-600 dark:focus:border-blue-500 focus:shadow-blue-100 dark:focus:shadow-blue-900 dark:bg-gray-700 dark:text-gray-200"
/> />
<Button <Button
type="primary" type="primary"
htmlType="submit" htmlType="submit"
loading={isLoading} loading={isLoading}
className="rounded-md " className="rounded-lg bg-blue-600 hover:bg-blue-700 dark:bg-blue-700 dark:hover:bg-blue-800"
> >
发送 发送
</Button> </Button>

View File

@@ -126,8 +126,7 @@ export const AuthProvider = ({ children }) => {
// 如果有重定向路径,则导航到该路径 // 如果有重定向路径,则导航到该路径
navigate(decodeURIComponent(redirectTo), { replace: true }); navigate(decodeURIComponent(redirectTo), { replace: true });
} else { } else {
// 如果没有重定向路径,则导航到首页 navigate("/dashboard", { replace: true });
navigate("/home", { replace: true });
} }
return data; return data;
@@ -142,7 +141,7 @@ export const AuthProvider = ({ children }) => {
const signInWithGoogle = async () => { const signInWithGoogle = async () => {
try { try {
setLoading(true); setLoading(true);
const redirectTo = searchParams.get("redirectTo") || "/home"; const redirectTo = searchParams.get("redirectTo") || "/dashboard";
const { data, error } = await supabase.auth.signInWithOAuth({ const { data, error } = await supabase.auth.signInWithOAuth({
provider: "google", provider: "google",

View File

@@ -9,7 +9,7 @@ const STORAGE_KEY = 'dify_chat_history';
const CONVERSATION_ID_KEY = 'dify_conversation_id'; const CONVERSATION_ID_KEY = 'dify_conversation_id';
export function useDifyChat() { export function useDifyChat() {
const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, []); const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, '[]');
const [conversationId, setConversationId] = useSessionStorage(CONVERSATION_ID_KEY, ''); const [conversationId, setConversationId] = useSessionStorage(CONVERSATION_ID_KEY, '');
const [messages, setMessages] = useState([]); const [messages, setMessages] = useState([]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
@@ -18,7 +18,7 @@ export function useDifyChat() {
const clearHistory = () => { const clearHistory = () => {
setMessages([]); setMessages([]);
setStoredMessages([]); setStoredMessages('[]');
setConversationId(''); setConversationId('');
message.success('历史记录已清空'); message.success('历史记录已清空');
}; };

View File

@@ -1,8 +1,10 @@
import React from 'react'; import React from 'react';
import { Card } from 'antd'; import { Card } from 'antd';
import StatisticsOverview from '@/components/dashboard/StatisticsOverview'; import StatisticsOverview from '@/components/dashboard/StatisticsOverview';
import Bar from '@/components/Barchart'
import Pie from '@/components/Piechart'
const Dashboard = () => { const Dashboard = () => {
return ( return (
<div className="space-y-6"> <div className="space-y-6">
<Card <Card
@@ -14,8 +16,13 @@ const Dashboard = () => {
} }
}} }}
> >
<div>测试member可见最低权限</div> <StatisticsOverview />
{/* <StatisticsOverview /> */} <div className='flex w-full mt-20 gap-5'>
<Bar className="flex-1 flex justify-center items-center"/>
<Pie className="flex-1 flex justify-center items-center"/>
</div>
</Card> </Card>
</div> </div>
); );

View File

@@ -22,7 +22,6 @@ import { useNavigate, useParams, useSearchParams } from "react-router-dom";
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import SectionList from '@/components/SectionList' import SectionList from '@/components/SectionList'
import DifyChatDrawer from '@/components/difyChatAi'; import DifyChatDrawer from '@/components/difyChatAi';
import ChatAIDrawer from '@/components/ChatAi';
const { Title } = Typography; const { Title } = Typography;
// 添加货币符号映射 // 添加货币符号映射
@@ -59,8 +58,7 @@ const QuotationForm = () => {
// 计算小节总额 // 计算小节总额
const calculateSectionTotal = useMemo( const calculateSectionTotal = useMemo(
() => () => (items = []) => {
(items = []) => {
if (!Array.isArray(items)) return 0; if (!Array.isArray(items)) return 0;
return items.reduce((sum, item) => { return items.reduce((sum, item) => {
if (!item) return sum; if (!item) return sum;
@@ -72,11 +70,10 @@ const QuotationForm = () => {
// 计算总金额 // 计算总金额
const calculateTotalAmount = useMemo( const calculateTotalAmount = useMemo(
() => () => (sections = []) => {
(sections = []) => { if (!sections || !Array.isArray(sections)) return 0;
if (!Array.isArray(sections)) return 0;
return sections.reduce((sum, section) => { return sections.reduce((sum, section) => {
if (!section) return sum; if (!section || !section.items) return sum;
return sum + calculateSectionTotal(section.items); return sum + calculateSectionTotal(section.items);
}, 0); }, 0);
}, },
@@ -318,36 +315,40 @@ const QuotationForm = () => {
const [vercelOpen, setVercelOpen] = useState(false); const [vercelOpen, setVercelOpen] = useState(false);
const handleExport = (data) => { const handleExport = (data) => {
if(data?.activityName&&data?.currency){ try {
const jsonData = typeof data === 'string' ? JSON.parse(data) : data;
if (jsonData?.quataName && jsonData?.currency) {
const quotationData = { const quotationData = {
quataName: data.activityName, quataName: jsonData.quataName,
description: data.description, description: jsonData.description || '',
currency: data.currency || "TWD", currency: jsonData.currency || "TWD",
sections: data.sections.map((section) => ({ sections: jsonData.sections.map((section) => ({
key: uuidv4(), key: uuidv4(),
sectionName: section.sectionName, sectionName: section.sectionName,
items: section.items.map((item) => ({ items: section.items.map((item) => ({
key: uuidv4(), key: uuidv4(),
name: item.name, name: item.name,
quantity: item.quantity, quantity: Number(item.quantity) || 0,
price: item.price, price: Number(item.price) || 0,
description: item.description, description: item.description || "",
unit: item.unit, unit: item.unit || "",
})), })),
})), })),
}; };
setCurrentCurrency(data.currency || "TWD"); setCurrentCurrency(jsonData.currency || "TWD");
form.setFieldsValue(quotationData); form.setFieldsValue(quotationData);
setFormValues(quotationData); setFormValues(quotationData);
setTaxRate(data.taxRate || 0); setTaxRate(Number(jsonData.taxRate) || 0);
message.success('已添加报价单'); message.success('已添加报价单');
} else { } else {
const _data={ const newSection = {
...data, ...jsonData,
key: uuidv4(), key: uuidv4(),
} };
const newSections = [...formValues.sections, _data]; const currentSections = form.getFieldValue('sections') || [];
const newSections = [...currentSections, newSection];
form.setFieldValue('sections', newSections); form.setFieldValue('sections', newSections);
const currentFormValues = form.getFieldsValue(); const currentFormValues = form.getFieldsValue();
setFormValues({ setFormValues({
@@ -359,6 +360,10 @@ const QuotationForm = () => {
setDifyOpen(false); setDifyOpen(false);
setVercelOpen(false); setVercelOpen(false);
} catch (error) {
console.error('Export error:', error);
message.error('导出失败:数据格式错误');
}
}; };
return ( return (
@@ -401,9 +406,9 @@ const QuotationForm = () => {
<Button onClick={() => setDifyOpen(true)}> <Button onClick={() => setDifyOpen(true)}>
AI for Dify AI for Dify
</Button> </Button>
<Button onClick={() => setVercelOpen(true)}> {/* <Button onClick={() => setVercelOpen(true)}>
AI for Vercel AI for Vercel
</Button> </Button> */}
</> </>
)} )}
@@ -511,11 +516,7 @@ const QuotationForm = () => {
onClose={() => setDifyOpen(false)} onClose={() => setDifyOpen(false)}
onExport={handleExport} onExport={handleExport}
/> />
<ChatAIDrawer
open={vercelOpen}
onClose={() => setVercelOpen(false)}
onExport={handleExport}
/>
</div> </div>
); );
}; };

View File

@@ -0,0 +1 @@

View File

@@ -69,7 +69,7 @@ const AppRoutes = () => {
path="/login" path="/login"
element={ element={
user?.id ? ( user?.id ? (
<Navigate to="/home" replace /> <Navigate to="/dashboard" replace />
) : ( ) : (
<Login /> <Login />
) )
@@ -86,7 +86,7 @@ const AppRoutes = () => {
> >
<Route <Route
index index
element={<Navigate to="/home" replace />} element={<Navigate to="/dashboard" replace />}
/> />
{renderRoutes(allRoutes)} {renderRoutes(allRoutes)}
<Route path="*" element={<NotFound />} /> <Route path="*" element={<NotFound />} />

View File

@@ -82,23 +82,14 @@ export const allRoutes = [
key: "company/quotaInfo", key: "company/quotaInfo",
}, },
{ {
<<<<<<< HEAD
path: "quotaInfo/preview/:id?", // 添加可选的 id 参数
=======
path: "quotaInfo/preview/:id?", path: "quotaInfo/preview/:id?",
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
hidden: true, hidden: true,
component: lazy(() => import("@/pages/company/quotation/view")), component: lazy(() => import("@/pages/company/quotation/view")),
name: "报价单预览", name: "报价单预览",
icon: "file", icon: "file",
<<<<<<< HEAD
key:'company/quotaInfo/preview'
},
=======
key: "company/quotaInfo/preview", key: "company/quotaInfo/preview",
}, },
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
{ {
path: "project", path: "project",
component: lazy(() => import("@/pages/company/project")), component: lazy(() => import("@/pages/company/project")),
@@ -135,10 +126,6 @@ export const allRoutes = [
name: "服务模版详情", name: "服务模版详情",
icon: "container", icon: "container",
key: "company/serviceTemplateInfo", key: "company/serviceTemplateInfo",
<<<<<<< HEAD
=======
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
}, },
{ {
path: "supplier", path: "supplier",
@@ -176,11 +163,7 @@ export const allRoutes = [
component: lazy(() => import("@/pages/company/service/itemsManange")), component: lazy(() => import("@/pages/company/service/itemsManange")),
name: "资源类型", name: "资源类型",
icon: "container", icon: "container",
<<<<<<< HEAD
key:'company/templateItemManage'
=======
key: "company/templateItem", key: "company/templateItem",
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
}, },
] ]
} }

View File

@@ -1,5 +1,7 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
export default { const withMT = require("@material-tailwind/react/utils/withMT");
module.exports = withMT({
content: [ content: [
"./index.html", "./index.html",
"./src/**/*.{js,ts,jsx,tsx}", "./src/**/*.{js,ts,jsx,tsx}",
@@ -133,4 +135,4 @@ export default {
corePlugins: { corePlugins: {
preflight: false, preflight: false,
}, },
} })

View File

@@ -1,9 +1,8 @@
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react';
import path from 'path'; import path from 'path';
// 使用 __dirname 需要添加 import.meta.url 的支持
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);
@@ -19,13 +18,13 @@ export default defineConfig({
'@contexts': path.resolve(__dirname, 'src/contexts'), '@contexts': path.resolve(__dirname, 'src/contexts'),
'@assets': path.resolve(__dirname, 'src/assets'), '@assets': path.resolve(__dirname, 'src/assets'),
}, },
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'] // 添加文件扩展名自动解析 extensions: ['.js', '.jsx', '.ts', '.tsx', '.json']
},
optimizeDeps: {
include: ['react-apexcharts', 'apexcharts'],
esbuildOptions: {
target: 'es2020',
}, },
server: {
port: 3000,
open: true,
host: true,
strictPort: true,
}, },
build: { build: {
outDir: 'dist', outDir: 'dist',
@@ -34,8 +33,19 @@ export default defineConfig({
output: { output: {
manualChunks: { manualChunks: {
vendor: ['react', 'react-dom', 'react-router-dom', 'antd'], vendor: ['react', 'react-dom', 'react-router-dom', 'antd'],
charts: ['react-apexcharts', 'apexcharts'],
}, },
}, },
}, },
target: 'es2020',
commonjsOptions: {
include: [/node_modules/],
},
},
server: {
port: 3000,
open: true,
host: true,
strictPort: true,
}, },
}); });

273
yarn.lock
View File

@@ -537,6 +537,18 @@
dependencies: dependencies:
"@emotion/memoize" "^0.8.1" "@emotion/memoize" "^0.8.1"
"@emotion/is-prop-valid@^0.8.2":
version "0.8.8"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
dependencies:
"@emotion/memoize" "0.7.4"
"@emotion/memoize@0.7.4":
version "0.7.4"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
"@emotion/memoize@^0.8.1": "@emotion/memoize@^0.8.1":
version "0.8.1" version "0.8.1"
resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
@@ -709,6 +721,21 @@
"@floating-ui/core" "^1.6.0" "@floating-ui/core" "^1.6.0"
"@floating-ui/utils" "^0.2.8" "@floating-ui/utils" "^0.2.8"
"@floating-ui/dom@^1.2.1":
version "1.6.13"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34"
integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==
dependencies:
"@floating-ui/core" "^1.6.0"
"@floating-ui/utils" "^0.2.9"
"@floating-ui/react-dom@^1.2.2":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-1.3.0.tgz#4d35d416eb19811c2b0e9271100a6aa18c1579b3"
integrity sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==
dependencies:
"@floating-ui/dom" "^1.2.1"
"@floating-ui/react-dom@^2.1.2": "@floating-ui/react-dom@^2.1.2":
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31"
@@ -716,6 +743,15 @@
dependencies: dependencies:
"@floating-ui/dom" "^1.0.0" "@floating-ui/dom" "^1.0.0"
"@floating-ui/react@0.19.0":
version "0.19.0"
resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.19.0.tgz#d8e19a3fcfaa0684d5ec3f335232b4e0ac0c87e1"
integrity sha512-fgYvN4ksCi5OvmPXkyOT8o5a8PSKHMzPHt+9mR6KYWdF16IAjWRLZPAAziI2sznaWT23drRFrYw64wdvYqqaQw==
dependencies:
"@floating-ui/react-dom" "^1.2.2"
aria-hidden "^1.1.3"
tabbable "^6.0.1"
"@floating-ui/react@^0.26.28": "@floating-ui/react@^0.26.28":
version "0.26.28" version "0.26.28"
resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7"
@@ -730,6 +766,16 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62"
integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
"@floating-ui/utils@^0.2.9":
version "0.2.9"
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
"@heroicons/react@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.2.0.tgz#0c05124af50434a800773abec8d3af6a297d904b"
integrity sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==
"@humanwhocodes/config-array@^0.13.0": "@humanwhocodes/config-array@^0.13.0":
version "0.13.0" version "0.13.0"
resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
@@ -818,6 +864,21 @@
resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.15.2.tgz#f583ecfb7b92cad17c67f7825f20f23b72e6d7ff" resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.15.2.tgz#f583ecfb7b92cad17c67f7825f20f23b72e6d7ff"
integrity sha512-p8dsW0fdJxzYhULbm1noFYRHuBvJHleYviC0BlwbkVySC8AsvFI8AmC3sMssWV3dQ3yQ/SidYo9U+K/czpDpZw== integrity sha512-p8dsW0fdJxzYhULbm1noFYRHuBvJHleYviC0BlwbkVySC8AsvFI8AmC3sMssWV3dQ3yQ/SidYo9U+K/czpDpZw==
"@material-tailwind/react@^2.1.10":
version "2.1.10"
resolved "https://registry.yarnpkg.com/@material-tailwind/react/-/react-2.1.10.tgz#e4ff8b8a5cf1a39209d408dda3217f632c080e9a"
integrity sha512-xGU/mLDKDBp/qZ8Dp2XR7fKcTpDuFeZEBqoL9Bk/29kakKxNxjUGYSRHEFLsyOFf4VIhU6WGHdIS7tOA3QGJHA==
dependencies:
"@floating-ui/react" "0.19.0"
classnames "2.3.2"
deepmerge "4.2.2"
framer-motion "6.5.1"
material-ripple-effects "2.0.1"
prop-types "15.8.1"
react "18.2.0"
react-dom "18.2.0"
tailwind-merge "1.8.1"
"@monaco-editor/loader@^1.4.0": "@monaco-editor/loader@^1.4.0":
version "1.4.0" version "1.4.0"
resolved "https://registry.npmmirror.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" resolved "https://registry.npmmirror.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558"
@@ -832,6 +893,59 @@
dependencies: dependencies:
"@monaco-editor/loader" "^1.4.0" "@monaco-editor/loader" "^1.4.0"
"@motionone/animation@^10.12.0":
version "10.18.0"
resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.18.0.tgz#868d00b447191816d5d5cf24b1cafa144017922b"
integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==
dependencies:
"@motionone/easing" "^10.18.0"
"@motionone/types" "^10.17.1"
"@motionone/utils" "^10.18.0"
tslib "^2.3.1"
"@motionone/dom@10.12.0":
version "10.12.0"
resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.12.0.tgz#ae30827fd53219efca4e1150a5ff2165c28351ed"
integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==
dependencies:
"@motionone/animation" "^10.12.0"
"@motionone/generators" "^10.12.0"
"@motionone/types" "^10.12.0"
"@motionone/utils" "^10.12.0"
hey-listen "^1.0.8"
tslib "^2.3.1"
"@motionone/easing@^10.18.0":
version "10.18.0"
resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.18.0.tgz#7b82f6010dfee3a1bb0ee83abfbaff6edae0c708"
integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==
dependencies:
"@motionone/utils" "^10.18.0"
tslib "^2.3.1"
"@motionone/generators@^10.12.0":
version "10.18.0"
resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.18.0.tgz#fe09ab5cfa0fb9a8884097feb7eb60abeb600762"
integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==
dependencies:
"@motionone/types" "^10.17.1"
"@motionone/utils" "^10.18.0"
tslib "^2.3.1"
"@motionone/types@^10.12.0", "@motionone/types@^10.17.1":
version "10.17.1"
resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.1.tgz#cf487badbbdc9da0c2cb86ffc1e5d11147c6e6fb"
integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==
"@motionone/utils@^10.12.0", "@motionone/utils@^10.18.0":
version "10.18.0"
resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.18.0.tgz#a59ff8932ed9009624bca07c56b28ef2bb2f885e"
integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==
dependencies:
"@motionone/types" "^10.17.1"
hey-listen "^1.0.8"
tslib "^2.3.1"
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -1096,6 +1210,33 @@
"@supabase/realtime-js" "2.11.2" "@supabase/realtime-js" "2.11.2"
"@supabase/storage-js" "2.7.1" "@supabase/storage-js" "2.7.1"
"@svgdotjs/svg.draggable.js@^3.0.4":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.5.tgz#804fa627cbe850a137350009bd03d2c8423b39a7"
integrity sha512-ljL/fB0tAjRfFOJGhXpr7rEx9DJ6D7Pxt3AXvgxjEM17g6wK3Ho9nXhntraOMx8JLZdq4NBMjokeXMvnQzJVYA==
"@svgdotjs/svg.filter.js@^3.0.8":
version "3.0.8"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.8.tgz#998cb2481a871fa70d7dbaa891c886b335c562d7"
integrity sha512-YshF2YDaeRA2StyzAs5nUPrev7npQ38oWD0eTRwnsciSL2KrRPMoUw8BzjIXItb3+dccKGTX3IQOd2NFzmHkog==
dependencies:
"@svgdotjs/svg.js" "^3.1.1"
"@svgdotjs/svg.js@^3.1.1", "@svgdotjs/svg.js@^3.2.4":
version "3.2.4"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz#4716be92a64c66b29921b63f7235fcfb953fb13a"
integrity sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==
"@svgdotjs/svg.resize.js@^2.0.2":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz#732e4cae15d09ad3021adeac63bc9fad0dc7255a"
integrity sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==
"@svgdotjs/svg.select.js@^4.0.1":
version "4.0.2"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz#80a10409e6c73206218690eac5c9f94f8c8909b5"
integrity sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==
"@types/babel__core@^7.20.5": "@types/babel__core@^7.20.5":
version "7.20.5" version "7.20.5"
resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
@@ -1268,6 +1409,11 @@
resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d"
integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==
"@yr/monotone-cubic-spline@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz#7272d89f8e4f6fb7a1600c28c378cc18d3b577b9"
integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==
acorn-jsx@^5.3.2: acorn-jsx@^5.3.2:
version "5.3.2" version "5.3.2"
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@@ -1398,6 +1544,18 @@ anymatch@~3.1.2:
normalize-path "^3.0.0" normalize-path "^3.0.0"
picomatch "^2.0.4" picomatch "^2.0.4"
apexcharts@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-4.3.0.tgz#eccf28e830ce1b5e018cfc0e99d1c6af0076c9c7"
integrity sha512-PfvZQpv91T68hzry9l5zP3Gip7sQvF0nFK91uCBrswIKX7rbIdbVNS4fOks9m9yP3Ppgs6LHgU2M/mjoG4NM0A==
dependencies:
"@svgdotjs/svg.draggable.js" "^3.0.4"
"@svgdotjs/svg.filter.js" "^3.0.8"
"@svgdotjs/svg.js" "^3.2.4"
"@svgdotjs/svg.resize.js" "^2.0.2"
"@svgdotjs/svg.select.js" "^4.0.1"
"@yr/monotone-cubic-spline" "^1.0.3"
arg@^5.0.2: arg@^5.0.2:
version "5.0.2" version "5.0.2"
resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
@@ -1408,6 +1566,13 @@ argparse@^2.0.1:
resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
aria-hidden@^1.1.3:
version "1.2.4"
resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522"
integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==
dependencies:
tslib "^2.0.0"
array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b"
@@ -1655,6 +1820,11 @@ chokidar@^4.0.0:
dependencies: dependencies:
readdirp "^4.0.1" readdirp "^4.0.1"
classnames@2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1:
version "2.5.1" version "2.5.1"
resolved "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" resolved "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
@@ -1889,6 +2059,11 @@ deep-is@^0.1.3:
resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
define-data-property@^1.0.1, define-data-property@^1.1.4: define-data-property@^1.0.1, define-data-property@^1.1.4:
version "1.1.4" version "1.1.4"
resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
@@ -2403,6 +2578,27 @@ fraction.js@^4.3.7:
resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
framer-motion@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.5.1.tgz#802448a16a6eb764124bf36d8cbdfa6dd6b931a7"
integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==
dependencies:
"@motionone/dom" "10.12.0"
framesync "6.0.1"
hey-listen "^1.0.8"
popmotion "11.0.3"
style-value-types "5.0.0"
tslib "^2.1.0"
optionalDependencies:
"@emotion/is-prop-valid" "^0.8.2"
framesync@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.0.1.tgz#5e32fc01f1c42b39c654c35b16440e07a25d6f20"
integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==
dependencies:
tslib "^2.1.0"
fs.realpath@^1.0.0: fs.realpath@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -2581,6 +2777,16 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
dependencies: dependencies:
function-bind "^1.1.2" function-bind "^1.1.2"
heroicons@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-2.2.0.tgz#f1f554155152b4ec4d1b7165363d7c583690f77d"
integrity sha512-yOwvztmNiBWqR946t+JdgZmyzEmnRMC2nxvHFC90bF1SUttwB6yJKYeme1JeEcBfobdOs827nCyiWBS2z/brog==
hey-listen@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68"
integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==
highlight.js@^11.10.0: highlight.js@^11.10.0:
version "11.11.1" version "11.11.1"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.11.1.tgz#fca06fa0e5aeecf6c4d437239135fabc15213585" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.11.1.tgz#fca06fa0e5aeecf6c4d437239135fabc15213585"
@@ -3033,6 +3239,11 @@ lru-cache@^5.1.1:
dependencies: dependencies:
yallist "^3.0.2" yallist "^3.0.2"
material-ripple-effects@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/material-ripple-effects/-/material-ripple-effects-2.0.1.tgz#47803d2ab1561698d930e2524a7a9a19fb2829b7"
integrity sha512-hHlUkZAuXbP94lu02VgrPidbZ3hBtgXBtjlwR8APNqOIgDZMV8MCIcsclL8FmGJQHvnORyvoQgC965vPsiyXLQ==
math-intrinsics@^1.0.0, math-intrinsics@^1.1.0: math-intrinsics@^1.0.0, math-intrinsics@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
@@ -3302,6 +3513,16 @@ pirates@^4.0.1:
resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
popmotion@11.0.3:
version "11.0.3"
resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.3.tgz#565c5f6590bbcddab7a33a074bb2ba97e24b0cc9"
integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==
dependencies:
framesync "6.0.1"
hey-listen "^1.0.8"
style-value-types "5.0.0"
tslib "^2.1.0"
possible-typed-array-names@^1.0.0: possible-typed-array-names@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
@@ -3374,7 +3595,7 @@ prelude-ls@^1.2.1:
resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.8.1: prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.8.1:
version "15.8.1" version "15.8.1"
resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -3771,6 +3992,21 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2:
rc-resize-observer "^1.0.0" rc-resize-observer "^1.0.0"
rc-util "^5.36.0" rc-util "^5.36.0"
react-apexcharts@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/react-apexcharts/-/react-apexcharts-1.7.0.tgz#bbd08425674224adb27c9f2c62477d43bd5de539"
integrity sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==
dependencies:
prop-types "^15.8.1"
react-dom@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
dependencies:
loose-envify "^1.1.0"
scheduler "^0.23.0"
react-dom@^18.2.0: react-dom@^18.2.0:
version "18.3.1" version "18.3.1"
resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
@@ -3911,6 +4147,13 @@ react-use@^17.6.0:
ts-easing "^0.2.0" ts-easing "^0.2.0"
tslib "^2.1.0" tslib "^2.1.0"
react@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
react@^18.2.0: react@^18.2.0:
version "18.3.1" version "18.3.1"
resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
@@ -3951,9 +4194,9 @@ recharts-scale@^0.4.4:
dependencies: dependencies:
decimal.js-light "^2.4.1" decimal.js-light "^2.4.1"
recharts@^2.9.0: recharts@^2.15.0:
version "2.15.0" version "2.15.0"
resolved "https://registry.npmmirror.com/recharts/-/recharts-2.15.0.tgz#0b77bff57a43885df9769ae649a14cb1a7fe19aa" resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.15.0.tgz#0b77bff57a43885df9769ae649a14cb1a7fe19aa"
integrity sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw== integrity sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==
dependencies: dependencies:
clsx "^2.0.0" clsx "^2.0.0"
@@ -3999,6 +4242,11 @@ regexp.prototype.flags@^1.5.3:
es-errors "^1.3.0" es-errors "^1.3.0"
set-function-name "^2.0.2" set-function-name "^2.0.2"
remixicon@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/remixicon/-/remixicon-4.6.0.tgz#f2adafd18aaa983d61f8c9f7274fa17706da4ddc"
integrity sha512-bKM5odjqE1yzVxEZGJE7F79WHhNrJFIKHXR+GG+P1IWXn8AnJZhl8SbIRDJsNAvIqx4VPkNwjuHfc42tutMDpQ==
resize-observer-polyfill@^1.5.1: resize-observer-polyfill@^1.5.1:
version "1.5.1" version "1.5.1"
resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
@@ -4101,7 +4349,7 @@ sass@^1.69.5:
optionalDependencies: optionalDependencies:
"@parcel/watcher" "^2.4.1" "@parcel/watcher" "^2.4.1"
scheduler@^0.23.2: scheduler@^0.23.0, scheduler@^0.23.2:
version "0.23.2" version "0.23.2"
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
@@ -4390,6 +4638,14 @@ strip-json-comments@^3.1.1:
resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
style-value-types@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.0.0.tgz#76c35f0e579843d523187989da866729411fc8ad"
integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==
dependencies:
hey-listen "^1.0.8"
tslib "^2.1.0"
styled-components@^6.1.0: styled-components@^6.1.0:
version "6.1.13" version "6.1.13"
resolved "https://registry.npmmirror.com/styled-components/-/styled-components-6.1.13.tgz#2d777750b773b31469bd79df754a32479e9f475e" resolved "https://registry.npmmirror.com/styled-components/-/styled-components-6.1.13.tgz#2d777750b773b31469bd79df754a32479e9f475e"
@@ -4453,11 +4709,16 @@ swr@^2.0.0, swr@^2.2.5:
dequal "^2.0.3" dequal "^2.0.3"
use-sync-external-store "^1.4.0" use-sync-external-store "^1.4.0"
tabbable@^6.0.0: tabbable@^6.0.0, tabbable@^6.0.1:
version "6.2.0" version "6.2.0"
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
tailwind-merge@1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.8.1.tgz#0e56c8afbab2491f72e06381043ffec8b720ba04"
integrity sha512-+fflfPxvHFr81hTJpQ3MIwtqgvefHZFUHFiIHpVIRXvG/nX9+gu2P7JNlFu2bfDMJ+uHhi/pUgzaYacMoXv+Ww==
tailwindcss@^3.3.5: tailwindcss@^3.3.5:
version "3.4.17" version "3.4.17"
resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63" resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63"
@@ -4574,7 +4835,7 @@ tslib@2.6.2:
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
tslib@^2.0.0, tslib@^2.1.0: tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1:
version "2.8.1" version "2.8.1"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==