01221924
This commit is contained in:
parent
cac7fea6e4
commit
fe4e6fbf3a
|
@ -67,6 +67,7 @@
|
||||||
"react-resizable": "^3.0.5",
|
"react-resizable": "^3.0.5",
|
||||||
"react-router-dom": "^6.24.1",
|
"react-router-dom": "^6.24.1",
|
||||||
"superjson": "^2.2.1",
|
"superjson": "^2.2.1",
|
||||||
|
"swiper": "^11.2.1",
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "^2.6.0",
|
||||||
"uuid": "^10.0.0",
|
"uuid": "^10.0.0",
|
||||||
"yjs": "^13.6.20",
|
"yjs": "^13.6.20",
|
||||||
|
|
|
@ -39,4 +39,27 @@
|
||||||
|
|
||||||
.ag-root-wrapper {
|
.ag-root-wrapper {
|
||||||
border: 0px;
|
border: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* styles/carousel.css */
|
||||||
|
.swiper-button-next,
|
||||||
|
.swiper-button-prev {
|
||||||
|
@apply text-white opacity-0 transition-opacity duration-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-button-disabled {
|
||||||
|
@apply opacity-0 cursor-not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper:hover .swiper-button-next,
|
||||||
|
.swiper:hover .swiper-button-prev {
|
||||||
|
@apply opacity-70 hover:opacity-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination-bullet {
|
||||||
|
@apply bg-white/70;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination-bullet-active {
|
||||||
|
@apply bg-white;
|
||||||
}
|
}
|
|
@ -1,10 +1,26 @@
|
||||||
import GraphEditor from '@web/src/components/common/editor/graph/GraphEditor';
|
|
||||||
|
import { Carousel } from '@web/src/components/common/element/Carousel';
|
||||||
|
import LeaderCard from '@web/src/components/common/element/LeaderCard';
|
||||||
import React, { useState, useCallback } from 'react';
|
import React, { useState, useCallback } from 'react';
|
||||||
import * as tus from 'tus-js-client';
|
import * as tus from 'tus-js-client';
|
||||||
interface TusUploadProps {
|
interface TusUploadProps {
|
||||||
onSuccess?: (response: any) => void;
|
onSuccess?: (response: any) => void;
|
||||||
onError?: (error: Error) => void;
|
onError?: (error: Error) => void;
|
||||||
}
|
}
|
||||||
|
const carouselItems = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
image: 'https://th.bing.com/th/id/OIP.PEtRTLQwIX54HGFX5xNDYwHaE7?rs=1&pid=ImgDetMain',
|
||||||
|
title: '自然风光',
|
||||||
|
description: '壮丽的山川河流'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
image: 'https://eskipaper.com/images/scenery-pictures-15.jpg',
|
||||||
|
title: '城市景观',
|
||||||
|
description: '现代化的都市风貌'
|
||||||
|
}
|
||||||
|
];
|
||||||
const TusUploader: React.FC<TusUploadProps> = ({
|
const TusUploader: React.FC<TusUploadProps> = ({
|
||||||
onSuccess,
|
onSuccess,
|
||||||
onError
|
onError
|
||||||
|
@ -49,15 +65,21 @@ const TusUploader: React.FC<TusUploadProps> = ({
|
||||||
}, [onSuccess, onError]);
|
}, [onSuccess, onError]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className=' flex flex-col gap-4'>
|
||||||
<div className='w-full' style={{ height: 800 }}>
|
<Carousel
|
||||||
<GraphEditor></GraphEditor>
|
slides={carouselItems}
|
||||||
</div>
|
|
||||||
{/* <div className=' h-screen'>
|
|
||||||
<MindMap></MindMap>
|
|
||||||
</div> */}
|
|
||||||
{/* <MindMapEditor></MindMapEditor> */}
|
|
||||||
|
|
||||||
|
autoplayDelay={5000}
|
||||||
|
className="shadow-xl"
|
||||||
|
/>
|
||||||
|
<LeaderCard
|
||||||
|
name="张三"
|
||||||
|
title="技术总监"
|
||||||
|
description={
|
||||||
|
"负责公司技术战略规划"
|
||||||
|
}
|
||||||
|
imageUrl="https://th.bing.com/th/id/OIP.ea0spF2OAgI4I1KzgZFtTgHaHX?rs=1&pid=ImgDetMain"
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
type="file"
|
type="file"
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
import { useState } from 'react';
|
||||||
|
import {
|
||||||
|
MagnifyingGlassIcon,
|
||||||
|
StarIcon,
|
||||||
|
TrashIcon,
|
||||||
|
EnvelopeIcon,
|
||||||
|
FunnelIcon,
|
||||||
|
} from '@heroicons/react/24/outline';
|
||||||
|
import { StarIcon as StarIconSolid } from '@heroicons/react/24/solid';
|
||||||
|
|
||||||
|
interface Letter {
|
||||||
|
id: string;
|
||||||
|
sender: string;
|
||||||
|
subject: string;
|
||||||
|
date: string;
|
||||||
|
priority: 'high' | 'medium' | 'low';
|
||||||
|
isRead: boolean;
|
||||||
|
isStarred: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function LetterListPage() {
|
||||||
|
const [letters, setLetters] = useState<Letter[]>([
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
sender: 'Gen. Charles Q. Brown Jr.',
|
||||||
|
subject: 'Strategic Force Posture Update',
|
||||||
|
date: '2024-01-22',
|
||||||
|
priority: 'high',
|
||||||
|
isRead: false,
|
||||||
|
isStarred: true,
|
||||||
|
},
|
||||||
|
// ... existing code ...
|
||||||
|
]);
|
||||||
|
|
||||||
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
|
const [selectedFilter, setSelectedFilter] = useState('all');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen bg-gray-50">
|
||||||
|
{/* Header */}
|
||||||
|
<header className="bg-[#00538B] text-white p-4 shadow-lg">
|
||||||
|
<div className="container mx-auto flex items-center gap-2">
|
||||||
|
<EnvelopeIcon className="w-8 h-8" />
|
||||||
|
<h1 className="text-2xl font-bold">USAF Leadership Mailbox</h1>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{/* Main Content */}
|
||||||
|
<main className="container mx-auto py-6 px-4">
|
||||||
|
{/* Search and Filter Bar */}
|
||||||
|
<div className="flex gap-4 mb-6">
|
||||||
|
<div className="flex-1 relative">
|
||||||
|
<MagnifyingGlassIcon className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-5 h-5" />
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Search letters..."
|
||||||
|
className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00538B] focus:border-transparent"
|
||||||
|
value={searchTerm}
|
||||||
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="relative">
|
||||||
|
<FunnelIcon className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-5 h-5" />
|
||||||
|
<select
|
||||||
|
className="pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00538B] appearance-none bg-white"
|
||||||
|
value={selectedFilter}
|
||||||
|
onChange={(e) => setSelectedFilter(e.target.value)}
|
||||||
|
>
|
||||||
|
<option value="all">All Letters</option>
|
||||||
|
<option value="unread">Unread</option>
|
||||||
|
<option value="starred">Starred</option>
|
||||||
|
<option value="high">High Priority</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Letters List */}
|
||||||
|
<div className="bg-white rounded-lg shadow">
|
||||||
|
{letters.map((letter) => (
|
||||||
|
<div
|
||||||
|
key={letter.id}
|
||||||
|
className={`flex items-center p-4 border-b border-gray-100 hover:bg-gray-50 cursor-pointer transition-colors ${!letter.isRead ? 'font-semibold bg-blue-50' : ''
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-4 flex-1">
|
||||||
|
<button
|
||||||
|
className="focus:outline-none"
|
||||||
|
onClick={() => {/* Toggle star */ }}
|
||||||
|
>
|
||||||
|
{letter.isStarred ? (
|
||||||
|
<StarIconSolid className="w-6 h-6 text-yellow-400" />
|
||||||
|
) : (
|
||||||
|
<StarIcon className="w-6 h-6 text-gray-400 hover:text-yellow-400" />
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
<div className="flex-1">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="text-gray-900">{letter.sender}</span>
|
||||||
|
{letter.priority === 'high' && (
|
||||||
|
<span className="px-2 py-1 text-xs bg-red-100 text-red-800 rounded-full">
|
||||||
|
High Priority
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="text-gray-600">{letter.subject}</div>
|
||||||
|
</div>
|
||||||
|
<div className="text-sm text-gray-500">{letter.date}</div>
|
||||||
|
<button className="p-1 rounded-full hover:bg-gray-100 focus:outline-none">
|
||||||
|
<TrashIcon className="w-5 h-5 text-gray-400 hover:text-red-500" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
export default function LetterSearchPage() {
|
||||||
|
return <>Search</>
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import { Leader } from "./types";
|
||||||
|
|
||||||
|
export const leaders: Leader[] = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
name: 'John Mitchell',
|
||||||
|
rank: 'General',
|
||||||
|
division: 'Air Combat Command',
|
||||||
|
imageUrl: 'https://th.bing.com/th/id/OIP.ea0spF2OAgI4I1KzgZFtTgHaHX?rs=1&pid=ImgDetMain',
|
||||||
|
email: 'j.mitchell@af.mil',
|
||||||
|
phone: '(555) 123-4567',
|
||||||
|
office: 'Pentagon, Wing A-123',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
name: 'Sarah Williams',
|
||||||
|
rank: 'Colonel',
|
||||||
|
division: 'Air Force Space Command',
|
||||||
|
imageUrl: 'https://th.bing.com/th/id/OIP.ea0spF2OAgI4I1KzgZFtTgHaHX?rs=1&pid=ImgDetMain',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
name: 'Michael Roberts',
|
||||||
|
rank: 'Major General',
|
||||||
|
division: 'Air Mobility Command',
|
||||||
|
imageUrl: 'https://th.bing.com/th/id/OIP.ea0spF2OAgI4I1KzgZFtTgHaHX?rs=1&pid=ImgDetMain',
|
||||||
|
},
|
||||||
|
];
|
|
@ -0,0 +1,200 @@
|
||||||
|
import { useState, useMemo } from 'react';
|
||||||
|
import { motion } from 'framer-motion';
|
||||||
|
import { FunnelIcon, MagnifyingGlassIcon, PaperAirplaneIcon } from '@heroicons/react/24/outline';
|
||||||
|
import { Leader } from './types';
|
||||||
|
import { leaders } from './mock';
|
||||||
|
|
||||||
|
|
||||||
|
export default function WriteLetterPage() {
|
||||||
|
const [selectedLeader, setSelectedLeader] = useState<Leader | null>(null);
|
||||||
|
const [searchQuery, setSearchQuery] = useState('');
|
||||||
|
const [selectedDivision, setSelectedDivision] = useState<string>('all');
|
||||||
|
|
||||||
|
const divisions = useMemo(() => {
|
||||||
|
return ['all', ...new Set(leaders.map(leader => leader.division))];
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const filteredLeaders = useMemo(() => {
|
||||||
|
return leaders.filter(leader => {
|
||||||
|
const matchesSearch = leader.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
||||||
|
leader.rank.toLowerCase().includes(searchQuery.toLowerCase());
|
||||||
|
const matchesDivision = selectedDivision === 'all' || leader.division === selectedDivision;
|
||||||
|
return matchesSearch && matchesDivision;
|
||||||
|
});
|
||||||
|
}, [searchQuery, selectedDivision]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen bg-gradient-to-b from-slate-100 to-slate-200">
|
||||||
|
{/* Header Banner */}
|
||||||
|
<div className="bg-gradient-to-r from-[#00308F] to-[#0353A4] text-white py-8">
|
||||||
|
<div className="container mx-auto px-4">
|
||||||
|
<div className="flex flex-col space-y-6">
|
||||||
|
{/* 主标题 */}
|
||||||
|
<div>
|
||||||
|
<h1 className="text-3xl font-bold tracking-wider">
|
||||||
|
信件投递入口
|
||||||
|
</h1>
|
||||||
|
<p className="mt-2 text-blue-100 text-lg">
|
||||||
|
保护您隐私的信件传输平台
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 隐私保护说明 */}
|
||||||
|
<div className="flex flex-wrap gap-6 text-sm">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||||
|
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
|
||||||
|
</svg>
|
||||||
|
<span>个人信息严格保密</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||||
|
d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
||||||
|
</svg>
|
||||||
|
<span>支持匿名反映问题</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||||
|
d="M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z" />
|
||||||
|
</svg>
|
||||||
|
<span>网络信息加密存储</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 隐私承诺 */}
|
||||||
|
<div className="text-sm text-blue-100 border-t border-blue-400/30 pt-4">
|
||||||
|
<p>我们承诺:您的个人信息将被严格保密,不向任何第三方透露。您可以选择匿名反映问题,平台会自动过滤可能暴露身份的信息。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{/* 搜索和筛选区域 */}
|
||||||
|
<div className="container mx-auto px-4 py-8">
|
||||||
|
<div className="flex flex-col md:flex-row gap-4 mb-8">
|
||||||
|
<div className="relative flex-1">
|
||||||
|
<MagnifyingGlassIcon className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-5 h-5" />
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Search by name or rank..."
|
||||||
|
className="w-full pl-10 pr-4 py-3 rounded-lg border border-gray-200 focus:ring-2 focus:ring-[#00308F] focus:border-transparent"
|
||||||
|
value={searchQuery}
|
||||||
|
onChange={(e) => setSearchQuery(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="relative">
|
||||||
|
<FunnelIcon className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-5 h-5" />
|
||||||
|
<select
|
||||||
|
className="pl-10 pr-8 py-3 rounded-lg border border-gray-200 focus:ring-2 focus:ring-[#00308F] appearance-none bg-white"
|
||||||
|
value={selectedDivision}
|
||||||
|
onChange={(e) => setSelectedDivision(e.target.value)}
|
||||||
|
>
|
||||||
|
{divisions.map(division => (
|
||||||
|
<option key={division} value={division}>
|
||||||
|
{division === 'all' ? 'All Divisions' : division}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Modified Leader Cards Grid */}
|
||||||
|
<div className="grid grid-cols-1 gap-6">
|
||||||
|
{filteredLeaders.map((leader) => (
|
||||||
|
<motion.div
|
||||||
|
key={leader.id}
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
whileHover={{ scale: 1.005 }}
|
||||||
|
transition={{ duration: 0.2 }}
|
||||||
|
className={`
|
||||||
|
bg-white rounded-xl shadow-sm overflow-hidden border border-gray-100
|
||||||
|
${selectedLeader?.id === leader.id
|
||||||
|
? 'ring-2 ring-[#00308F]'
|
||||||
|
: 'hover:shadow-lg hover:border-blue-100'
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
>
|
||||||
|
<div className="flex flex-col sm:flex-row">
|
||||||
|
{/* Image Container */}
|
||||||
|
<div className="sm:w-48 h-64 sm:h-auto flex-shrink-0">
|
||||||
|
<img
|
||||||
|
src={leader.imageUrl}
|
||||||
|
alt={leader.name}
|
||||||
|
className="w-full h-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Content Container */}
|
||||||
|
<div className="flex-1 p-6">
|
||||||
|
<div className="flex flex-col h-full">
|
||||||
|
<div className="mb-4">
|
||||||
|
<div className="flex items-center justify-between mb-3">
|
||||||
|
<h3 className="text-xl font-semibold text-gray-900">
|
||||||
|
{leader.name}
|
||||||
|
</h3>
|
||||||
|
<span className="px-3 py-1 text-sm font-medium bg-blue-50 text-[#00308F] rounded-full">
|
||||||
|
{leader.rank}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-gray-600 mb-4">{leader.division}</p>
|
||||||
|
|
||||||
|
{/* Contact Information */}
|
||||||
|
<div className="space-y-2 text-sm text-gray-600">
|
||||||
|
<p className="flex items-center">
|
||||||
|
<svg className="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||||
|
d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
||||||
|
</svg>
|
||||||
|
{leader.email}
|
||||||
|
</p>
|
||||||
|
<p className="flex items-center">
|
||||||
|
<svg className="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||||
|
d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
|
||||||
|
</svg>
|
||||||
|
{leader.phone}
|
||||||
|
</p>
|
||||||
|
<p className="flex items-center">
|
||||||
|
<svg className="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2"
|
||||||
|
d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
|
||||||
|
</svg>
|
||||||
|
{leader.office}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={() => setSelectedLeader(leader)}
|
||||||
|
className="mt-auto w-full sm:w-auto flex items-center justify-center gap-2
|
||||||
|
bg-[#00308F] text-white py-3 px-6 rounded-lg
|
||||||
|
hover:bg-[#002070] transition-all duration-300
|
||||||
|
focus:outline-none focus:ring-2 focus:ring-[#00308F] focus:ring-opacity-50
|
||||||
|
transform hover:-translate-y-0.5"
|
||||||
|
>
|
||||||
|
<PaperAirplaneIcon className="w-5 h-5" />
|
||||||
|
Compose Letter
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
{/* 无结果提示 */}
|
||||||
|
{filteredLeaders.length === 0 && (
|
||||||
|
<div className="text-center py-12">
|
||||||
|
<p className="text-gray-600 text-lg">
|
||||||
|
No leaders found matching your search criteria
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
export interface Leader {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
rank: string;
|
||||||
|
division: string;
|
||||||
|
imageUrl: string;
|
||||||
|
email: string; // Added
|
||||||
|
phone: string; // Added
|
||||||
|
office: string; // Added
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
import { motion, AnimatePresence } from 'framer-motion';
|
||||||
|
import { useEffect, useState, useRef } from 'react';
|
||||||
|
import { Swiper, SwiperRef, SwiperSlide } from 'swiper/react';
|
||||||
|
import { Navigation, Pagination, Autoplay } from 'swiper/modules';
|
||||||
|
import 'swiper/css';
|
||||||
|
import 'swiper/css/navigation';
|
||||||
|
import 'swiper/css/pagination';
|
||||||
|
|
||||||
|
interface Slide {
|
||||||
|
id: number;
|
||||||
|
image: string;
|
||||||
|
title?: string;
|
||||||
|
description?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CarouselProps {
|
||||||
|
slides: Slide[];
|
||||||
|
autoplayDelay?: number;
|
||||||
|
className?: string;
|
||||||
|
swiperConfig?: {
|
||||||
|
spaceBetween?: number;
|
||||||
|
slidesPerView?: number;
|
||||||
|
navigation?: boolean;
|
||||||
|
loop?: boolean;
|
||||||
|
pagination?: boolean | { clickable: boolean };
|
||||||
|
autoplayOptions?: {
|
||||||
|
delay: number;
|
||||||
|
disableOnInteraction: boolean;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Carousel = ({
|
||||||
|
slides,
|
||||||
|
autoplayDelay = 3000,
|
||||||
|
className = '',
|
||||||
|
swiperConfig = {},
|
||||||
|
}: CarouselProps) => {
|
||||||
|
const [activeIndex, setActiveIndex] = useState(0);
|
||||||
|
const swiperRef = useRef<any>(null);
|
||||||
|
|
||||||
|
const {
|
||||||
|
spaceBetween = 0,
|
||||||
|
slidesPerView = 1,
|
||||||
|
navigation = true,
|
||||||
|
loop = true,
|
||||||
|
pagination = { clickable: true },
|
||||||
|
autoplayOptions = {
|
||||||
|
delay: autoplayDelay,
|
||||||
|
disableOnInteraction: false,
|
||||||
|
},
|
||||||
|
} = swiperConfig;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={`relative overflow-hidden ${className}`}>
|
||||||
|
<Swiper
|
||||||
|
modules={[Navigation, Pagination, Autoplay]}
|
||||||
|
spaceBetween={spaceBetween}
|
||||||
|
slidesPerView={slidesPerView}
|
||||||
|
navigation={navigation}
|
||||||
|
loop={loop}
|
||||||
|
pagination={pagination}
|
||||||
|
autoplay={autoplayOptions}
|
||||||
|
onSlideChange={(swiper) => setActiveIndex(swiper.realIndex)}
|
||||||
|
onSwiper={(swiper) => (swiperRef.current = swiper)}
|
||||||
|
className="w-full h-full rounded-xl"
|
||||||
|
>
|
||||||
|
{slides.map((slide) => (
|
||||||
|
<SwiperSlide key={slide.id}>
|
||||||
|
<div className="relative w-full h-[400px] md:h-[600px]">
|
||||||
|
<img
|
||||||
|
src={slide.image}
|
||||||
|
alt={slide.title || `Slide ${slide.id}`}
|
||||||
|
className="w-full h-full object-cover"
|
||||||
|
/>
|
||||||
|
<AnimatePresence>
|
||||||
|
{(slide.title || slide.description) && (
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
exit={{ opacity: 0, y: 20 }}
|
||||||
|
className="absolute bottom-0 left-0 right-0 p-6 bg-gradient-to-t from-black/60 to-transparent"
|
||||||
|
>
|
||||||
|
{slide.title && (
|
||||||
|
<h3 className="text-white text-2xl font-semibold mb-2">
|
||||||
|
{slide.title}
|
||||||
|
</h3>
|
||||||
|
)}
|
||||||
|
{slide.description && (
|
||||||
|
<p className="text-white/90 text-sm">
|
||||||
|
{slide.description}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
</div>
|
||||||
|
</SwiperSlide>
|
||||||
|
))}
|
||||||
|
</Swiper>
|
||||||
|
|
||||||
|
<div className="absolute bottom-4 left-1/2 transform -translate-x-1/2 z-10 flex gap-2">
|
||||||
|
{slides.map((_, index) => (
|
||||||
|
<button
|
||||||
|
key={index}
|
||||||
|
className={`w-2 h-2 rounded-full transition-all duration-300 ${index === activeIndex
|
||||||
|
? 'bg-white scale-125'
|
||||||
|
: 'bg-white/50 hover:bg-white/70'
|
||||||
|
}`}
|
||||||
|
onClick={() => {
|
||||||
|
if (swiperRef.current) {
|
||||||
|
swiperRef.current.slideToLoop(index); // 使用 Swiper 的 slideToLoop 方法切换到指定的幻灯片
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,74 @@
|
||||||
|
import React from "react";
|
||||||
|
import { Button } from "./Button";
|
||||||
|
|
||||||
|
type LeaderCardProps = {
|
||||||
|
name: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
imageUrl: string;
|
||||||
|
|
||||||
|
onClick?: () => void; // 添加整个卡片的点击事件
|
||||||
|
};
|
||||||
|
|
||||||
|
const LeaderCard: React.FC<LeaderCardProps> = ({
|
||||||
|
name,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
imageUrl,
|
||||||
|
onClick,
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="group flex bg-white rounded-2xl shadow-md hover:shadow-2xl transition-all duration-300 ease-out max-w-2xl border border-gray-100 hover:border-blue-100 cursor-pointer overflow-hidden"
|
||||||
|
onClick={onClick}
|
||||||
|
role="button"
|
||||||
|
tabIndex={0}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
|
onClick?.();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Image Section */}
|
||||||
|
<div className="relative flex-shrink-0 overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={imageUrl}
|
||||||
|
alt={name}
|
||||||
|
className="w-44 h-64 object-cover transition-transform duration-500 group-hover:scale-105"
|
||||||
|
style={{
|
||||||
|
aspectRatio: "3/4",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Content Section */}
|
||||||
|
<div className="flex flex-col justify-between p-5 flex-1">
|
||||||
|
<div className="space-y-3">
|
||||||
|
{/* Name and Title */}
|
||||||
|
<div className="transform transition-transform duration-300 group-hover:translate-x-2">
|
||||||
|
<h3 className="text-2xl font-semibold text-gray-800 mb-1 tracking-tight group-hover:text-blue-600 transition-colors">
|
||||||
|
{name}
|
||||||
|
</h3>
|
||||||
|
<p className="text-base font-medium text-blue-600 tracking-wide group-hover:text-blue-500">
|
||||||
|
{title}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Description */}
|
||||||
|
<p className="text-gray-600 text-base leading-relaxed line-clamp-4 font-light group-hover:text-gray-700">
|
||||||
|
{description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Decorative Element */}
|
||||||
|
<div className="mt-4">
|
||||||
|
<div className="h-0.5 w-8 bg-blue-600 rounded-full transform origin-left transition-all duration-300 group-hover:w-16 group-hover:bg-gradient-to-r from-blue-600 to-blue-400" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default LeaderCard;
|
|
@ -53,7 +53,7 @@ const FileItem = memo(({ file, progress, onRemove }: {
|
||||||
))
|
))
|
||||||
|
|
||||||
export default function FileUploader({
|
export default function FileUploader({
|
||||||
endpoint='',
|
endpoint = '',
|
||||||
onSuccess,
|
onSuccess,
|
||||||
onError,
|
onError,
|
||||||
maxSize = 100,
|
maxSize = 100,
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
import { PhoneIcon } from '@heroicons/react/24/outline'
|
||||||
|
|
||||||
|
export function Footer() {
|
||||||
|
return (
|
||||||
|
<footer className="bg-gradient-to-b from-[#13294B] to-[#0c1c33] text-gray-300">
|
||||||
|
<div className="container mx-auto px-6 py-10">
|
||||||
|
{/* Main Footer Content */}
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-10 mb-8">
|
||||||
|
{/* Logo and Main Info */}
|
||||||
|
<div className="text-center md:text-left">
|
||||||
|
<div className="flex md:justify-start justify-center mb-4 group">
|
||||||
|
<img
|
||||||
|
src="/usaf-emblem.png"
|
||||||
|
alt="USAF Official Emblem"
|
||||||
|
className="h-16 w-auto transform transition-all duration-300
|
||||||
|
group-hover:scale-105 group-hover:brightness-110
|
||||||
|
drop-shadow-lg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<h3 className="text-white font-bold text-lg tracking-wide mb-2
|
||||||
|
drop-shadow-md">
|
||||||
|
美国空军官方领导机关信箱
|
||||||
|
</h3>
|
||||||
|
<p className="text-gray-400 text-sm">
|
||||||
|
为美国空军提供安全可靠的通信服务
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Technical Support */}
|
||||||
|
<div className="text-center md:text-left md:pl-6 md:border-l border-gray-700">
|
||||||
|
<h4 className="text-white font-semibold mb-4 text-lg tracking-wide
|
||||||
|
drop-shadow-md">
|
||||||
|
技术支持
|
||||||
|
</h4>
|
||||||
|
<div className="space-y-4">
|
||||||
|
<div className="bg-gradient-to-br from-[#1a3a6a] to-[#234785]
|
||||||
|
p-4 rounded-lg shadow-lg hover:shadow-xl
|
||||||
|
transition-all duration-300 transform hover:-translate-y-0.5">
|
||||||
|
<p className="text-white font-medium mb-2">创新高地 软件小组</p>
|
||||||
|
<p className="text-gray-300 text-sm">负责系统开发维护及技术支持</p>
|
||||||
|
<div className="mt-3 flex items-center justify-center md:justify-start gap-2
|
||||||
|
text-sm text-gray-300">
|
||||||
|
<PhoneIcon className="w-4 h-4" />
|
||||||
|
<span>1-800-XXX-XXXX</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p className="text-gray-400 text-sm italic">
|
||||||
|
由软件小组提供 24/7 专业技术支持
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Divider */}
|
||||||
|
<div className="border-t border-gray-700/50 my-6"></div>
|
||||||
|
|
||||||
|
{/* Bottom Section */}
|
||||||
|
<div className="text-center">
|
||||||
|
<div className="flex flex-wrap justify-center gap-x-6 gap-y-2 mb-4 text-sm
|
||||||
|
text-gray-400">
|
||||||
|
<span className="hover:text-gray-300 transition-colors duration-200">
|
||||||
|
美国国防部授权网站
|
||||||
|
</span>
|
||||||
|
<span className="hover:text-gray-300 transition-colors duration-200">
|
||||||
|
所有通信内容受联邦法律保护
|
||||||
|
</span>
|
||||||
|
<span className="hover:text-gray-300 transition-colors duration-200">
|
||||||
|
政府信息系统
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-gray-500 text-sm">
|
||||||
|
© {new Date().getFullYear()} United States Air Force. All rights reserved.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
)
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
import { MagnifyingGlassIcon, UserIcon } from "@heroicons/react/24/outline";
|
||||||
|
import { Link, NavLink } from "react-router-dom";
|
||||||
|
import { memo } from "react";
|
||||||
|
import { NAV_ITEMS } from "./constants";
|
||||||
|
import { SearchBar } from "./SearchBar";
|
||||||
|
import { Logo } from "./Logo";
|
||||||
|
|
||||||
|
interface HeaderProps {
|
||||||
|
onSearch?: (query: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Header = memo(function Header({ onSearch }: HeaderProps) {
|
||||||
|
return (
|
||||||
|
<header className="sticky top-0 z-50 bg-[#13294B] text-white shadow-lg">
|
||||||
|
<div className="container mx-auto px-4">
|
||||||
|
{/* Main Content */}
|
||||||
|
<div className="py-4">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<Logo />
|
||||||
|
<SearchBar onSearch={onSearch} />
|
||||||
|
|
||||||
|
{/* User Actions */}
|
||||||
|
<div className="flex items-center space-x-6">
|
||||||
|
<Link
|
||||||
|
to="/login"
|
||||||
|
className="group flex items-center space-x-2 rounded-lg bg-[#00539B] px-5
|
||||||
|
py-2.5 shadow-lg transition-all duration-300
|
||||||
|
hover:-translate-y-0.5 hover:bg-[#0063B8]
|
||||||
|
hover:shadow-[#00539B]/50 focus:outline-none
|
||||||
|
focus:ring-2 focus:ring-[#8EADD4] focus:ring-offset-2"
|
||||||
|
aria-label="Login"
|
||||||
|
>
|
||||||
|
<UserIcon className="h-5 w-5 transition-transform group-hover:scale-110" />
|
||||||
|
<span className="font-medium">Login</span>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Navigation */}
|
||||||
|
<nav className="mt-4 rounded-lg bg-[#0B1A32]/90">
|
||||||
|
<div className="flex items-center justify-between px-6 py-1">
|
||||||
|
<div className="flex space-x-1">
|
||||||
|
{NAV_ITEMS.map((item) => (
|
||||||
|
<NavLink
|
||||||
|
key={item.to}
|
||||||
|
to={item.to}
|
||||||
|
className={({ isActive }) => `
|
||||||
|
group relative px-4 py-3 rounded-md
|
||||||
|
transition-all duration-300 ease-out
|
||||||
|
outline-none
|
||||||
|
${isActive ? 'text-white font-medium' : 'text-[#8EADD4]'}
|
||||||
|
`}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<>
|
||||||
|
<span className="relative z-10 transition-colors group-hover:text-white">
|
||||||
|
{item.label}
|
||||||
|
</span>
|
||||||
|
<span className={`
|
||||||
|
absolute inset-0 rounded-md bg-gradient-to-b
|
||||||
|
from-white/10 to-transparent transition-opacity
|
||||||
|
duration-300 ease-out opacity-0 group-hover:opacity-10
|
||||||
|
${isActive ? 'opacity-5' : ''}
|
||||||
|
`} />
|
||||||
|
<span className={`
|
||||||
|
absolute bottom-1.5 left-1/2 h-[2px] bg-white
|
||||||
|
transition-all duration-300 ease-out
|
||||||
|
transform -translate-x-1/2
|
||||||
|
${isActive
|
||||||
|
? 'w-12 opacity-100'
|
||||||
|
: 'w-0 opacity-0 group-hover:w-8 group-hover:opacity-50'
|
||||||
|
}
|
||||||
|
`} />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</NavLink>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
);
|
||||||
|
});
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
|
export const Logo = () => (
|
||||||
|
<Link to="/" className="flex items-center space-x-3 group focus:outline-none focus:ring-2 focus:ring-[#8EADD4] rounded-lg">
|
||||||
|
<img
|
||||||
|
src="/logo.svg"
|
||||||
|
alt="USAF Logo"
|
||||||
|
className="h-12 w-auto transform transition-transform group-hover:scale-105"
|
||||||
|
loading="eager"
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<h1 className="text-2xl font-bold tracking-wider">Leadership Mailbox</h1>
|
||||||
|
<p className="text-sm text-[#8EADD4]">United States Air Force</p>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
);
|
|
@ -1,40 +1,27 @@
|
||||||
import { useState, useEffect, useRef, ReactNode } from 'react';
|
import { motion } from 'framer-motion'
|
||||||
import { motion, AnimatePresence } from 'framer-motion';
|
import { Outlet } from 'react-router-dom'
|
||||||
import { TopNavBar } from '@web/src/components/layout/main/top-nav-bar';
|
import { Header } from './Header'
|
||||||
import { navItems, notificationItems } from '@web/src/components/layout/main/nav-data';
|
import { Footer } from './Footer'
|
||||||
import { Sidebar } from '@web/src/components/layout/main/side-bar';
|
|
||||||
import { Outlet } from 'react-router-dom';
|
|
||||||
|
|
||||||
|
|
||||||
export function MainLayout() {
|
export function MainLayout() {
|
||||||
const [sidebarOpen, setSidebarOpen] = useState(true);
|
|
||||||
const [notifications, setNotifications] = useState(3);
|
|
||||||
const [recentSearches] = useState([
|
|
||||||
'React Fundamentals',
|
|
||||||
'TypeScript Advanced',
|
|
||||||
'Tailwind CSS Projects',
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-gray-50">
|
<motion.div
|
||||||
<TopNavBar
|
initial={{ opacity: 0 }}
|
||||||
sidebarOpen={sidebarOpen}
|
animate={{ opacity: 1 }}
|
||||||
setSidebarOpen={setSidebarOpen}
|
transition={{ duration: 0.5 }}
|
||||||
notifications={notifications}
|
>
|
||||||
notificationItems={notificationItems}
|
{/* 顶部 Header */}
|
||||||
recentSearches={recentSearches}
|
<Header />
|
||||||
/>
|
|
||||||
|
|
||||||
<AnimatePresence mode="wait">
|
{/* 主要内容区域 */}
|
||||||
{sidebarOpen && <Sidebar navItems={navItems} />}
|
<main className="min-h-screen bg-slate-50">
|
||||||
</AnimatePresence>
|
<div className="container mx-auto px-4 py-8">
|
||||||
|
<Outlet />
|
||||||
<main
|
</div>
|
||||||
className={`pt-16 min-h-screen transition-all duration-300 ${sidebarOpen ? 'ml-64' : 'ml-0'
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
<Outlet></Outlet>
|
|
||||||
</main>
|
</main>
|
||||||
</div>
|
|
||||||
);
|
{/* 底部 Footer */}
|
||||||
}
|
<Footer />
|
||||||
|
</motion.div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
import { MagnifyingGlassIcon } from "@heroicons/react/24/outline";
|
||||||
|
import { useState, useCallback } from "react";
|
||||||
|
import debounce from "lodash/debounce";
|
||||||
|
|
||||||
|
interface SearchBarProps {
|
||||||
|
onSearch?: (query: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SearchBar = ({ onSearch }: SearchBarProps) => {
|
||||||
|
const [query, setQuery] = useState("");
|
||||||
|
|
||||||
|
const debouncedSearch = useCallback(
|
||||||
|
debounce((value: string) => {
|
||||||
|
onSearch?.(value);
|
||||||
|
}, 300),
|
||||||
|
[onSearch]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex-1 max-w-xl mx-12">
|
||||||
|
<div className="group relative">
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
value={query}
|
||||||
|
onChange={(e) => {
|
||||||
|
setQuery(e.target.value);
|
||||||
|
debouncedSearch(e.target.value);
|
||||||
|
}}
|
||||||
|
placeholder="Search letters, announcements, policies..."
|
||||||
|
className="w-full rounded-lg border border-transparent bg-[#0B1A32]
|
||||||
|
px-4 py-2.5 pl-10 text-white placeholder-[#8EADD4]
|
||||||
|
transition-all duration-300 focus:border-[#8EADD4]
|
||||||
|
focus:outline-none focus:ring-1 focus:ring-[#8EADD4]"
|
||||||
|
aria-label="Search"
|
||||||
|
/>
|
||||||
|
<MagnifyingGlassIcon
|
||||||
|
className="absolute left-3 top-3 h-5 w-5 text-[#8EADD4]
|
||||||
|
transition-colors group-hover:text-white"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
|
@ -0,0 +1,7 @@
|
||||||
|
export const NAV_ITEMS = [
|
||||||
|
{ to: "/write-letter", label: "Write Letter" },
|
||||||
|
{ to: "/search-letter", label: "Search Letters" },
|
||||||
|
{ to: "/public-letters", label: "Public Letters" },
|
||||||
|
{ to: "/announcements", label: "Announcements" },
|
||||||
|
{ to: "/guidelines", label: "Guidelines" },
|
||||||
|
] as const;
|
|
@ -1,43 +0,0 @@
|
||||||
import { NavItem } from '@nice/client';
|
|
||||||
import {
|
|
||||||
HomeIcon,
|
|
||||||
BookOpenIcon,
|
|
||||||
UserGroupIcon,
|
|
||||||
Cog6ToothIcon,
|
|
||||||
BellIcon,
|
|
||||||
HeartIcon,
|
|
||||||
AcademicCapIcon,
|
|
||||||
UsersIcon,
|
|
||||||
PresentationChartBarIcon
|
|
||||||
} from '@heroicons/react/24/outline';
|
|
||||||
|
|
||||||
export const navItems: NavItem[] = [
|
|
||||||
{ icon: <HomeIcon className="w-6 h-6" />, label: '探索知识', path: '/' },
|
|
||||||
{ icon: <AcademicCapIcon className="w-6 h-6" />, label: '我的学习', path: '/courses/student' },
|
|
||||||
{ icon: <PresentationChartBarIcon className="w-6 h-6" />, label: '我的授课', path: '/courses/instructor' },
|
|
||||||
{ icon: <UsersIcon className="w-6 h-6" />, label: '学习社区', path: '/community' },
|
|
||||||
{ icon: <Cog6ToothIcon className="w-6 h-6" />, label: '应用设置', path: '/settings' },
|
|
||||||
];
|
|
||||||
export const notificationItems = [
|
|
||||||
{
|
|
||||||
icon: <BellIcon className="w-6 h-6 text-blue-500" />,
|
|
||||||
title: "New Course Available",
|
|
||||||
description: "Advanced TypeScript Programming is now available",
|
|
||||||
time: "2 hours ago",
|
|
||||||
isUnread: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: <HeartIcon className="w-6 h-6 text-red-500" />,
|
|
||||||
title: "Course Recommendation",
|
|
||||||
description: "Based on your interests: React Native Development",
|
|
||||||
time: "1 day ago",
|
|
||||||
isUnread: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: <AcademicCapIcon className="w-6 h-6 text-green-500" />,
|
|
||||||
title: "Certificate Ready",
|
|
||||||
description: "Your React Fundamentals certificate is ready to download",
|
|
||||||
time: "2 days ago",
|
|
||||||
isUnread: true,
|
|
||||||
},
|
|
||||||
];
|
|
|
@ -20,6 +20,8 @@ import CourseContentForm from "../components/models/course/editor/form/CourseCon
|
||||||
import { CourseGoalForm } from "../components/models/course/editor/form/CourseGoalForm";
|
import { CourseGoalForm } from "../components/models/course/editor/form/CourseGoalForm";
|
||||||
import CourseSettingForm from "../components/models/course/editor/form/CourseSettingForm";
|
import CourseSettingForm from "../components/models/course/editor/form/CourseSettingForm";
|
||||||
import CourseEditorLayout from "../components/models/course/editor/layout/CourseEditorLayout";
|
import CourseEditorLayout from "../components/models/course/editor/layout/CourseEditorLayout";
|
||||||
|
import WriteLetterPage from "../app/main/letter/write/page";
|
||||||
|
import LetterListPage from "../app/main/letter/list/page";
|
||||||
|
|
||||||
interface CustomIndexRouteObject extends IndexRouteObject {
|
interface CustomIndexRouteObject extends IndexRouteObject {
|
||||||
name?: string;
|
name?: string;
|
||||||
|
@ -29,7 +31,11 @@ interface CustomIndexRouteObject extends IndexRouteObject {
|
||||||
name?: string;
|
name?: string;
|
||||||
breadcrumb?: string;
|
breadcrumb?: string;
|
||||||
}
|
}
|
||||||
|
export interface NavItem {
|
||||||
|
icon?: React.ReactNode;
|
||||||
|
label: string;
|
||||||
|
path: string;
|
||||||
|
}
|
||||||
export interface CustomNonIndexRouteObject extends NonIndexRouteObject {
|
export interface CustomNonIndexRouteObject extends NonIndexRouteObject {
|
||||||
name?: string;
|
name?: string;
|
||||||
children?: CustomRouteObject[];
|
children?: CustomRouteObject[];
|
||||||
|
@ -57,8 +63,16 @@ export const routes: CustomRouteObject[] = [
|
||||||
{
|
{
|
||||||
index: true,
|
index: true,
|
||||||
element: <HomePage />,
|
element: <HomePage />,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "write-letter",
|
||||||
|
element: <WriteLetterPage></WriteLetterPage>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "list",
|
||||||
|
element: <LetterListPage></LetterListPage>
|
||||||
}
|
}
|
||||||
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1 @@
|
||||||
export interface NavItem {
|
export { }
|
||||||
icon?: React.ReactNode;
|
|
||||||
label: string;
|
|
||||||
path: string;
|
|
||||||
}
|
|
123
pnpm-lock.yaml
123
pnpm-lock.yaml
|
@ -12,7 +12,7 @@ importers:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nestjs/bullmq':
|
'@nestjs/bullmq':
|
||||||
specifier: ^10.2.0
|
specifier: ^10.2.0
|
||||||
version: 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.34.8)
|
version: 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(bullmq@5.34.8)
|
||||||
'@nestjs/common':
|
'@nestjs/common':
|
||||||
specifier: ^10.3.10
|
specifier: ^10.3.10
|
||||||
version: 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
version: 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
@ -33,7 +33,7 @@ importers:
|
||||||
version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.4.15)(rxjs@7.8.1)
|
version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/websockets@10.4.15)(rxjs@7.8.1)
|
||||||
'@nestjs/schedule':
|
'@nestjs/schedule':
|
||||||
specifier: ^4.1.0
|
specifier: ^4.1.0
|
||||||
version: 4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))
|
version: 4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)
|
||||||
'@nestjs/websockets':
|
'@nestjs/websockets':
|
||||||
specifier: ^10.3.10
|
specifier: ^10.3.10
|
||||||
version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-socket.io@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
@ -142,13 +142,13 @@ importers:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@nestjs/cli':
|
'@nestjs/cli':
|
||||||
specifier: ^10.0.0
|
specifier: ^10.0.0
|
||||||
version: 10.4.9(@swc/core@1.10.6)
|
version: 10.4.9(@swc/core@1.10.6(@swc/helpers@0.5.15))
|
||||||
'@nestjs/schematics':
|
'@nestjs/schematics':
|
||||||
specifier: ^10.0.0
|
specifier: ^10.0.0
|
||||||
version: 10.2.3(chokidar@3.6.0)(typescript@5.7.2)
|
version: 10.2.3(chokidar@3.6.0)(typescript@5.7.2)
|
||||||
'@nestjs/testing':
|
'@nestjs/testing':
|
||||||
specifier: ^10.0.0
|
specifier: ^10.0.0
|
||||||
version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15))
|
version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-express@10.4.15)
|
||||||
'@types/exceljs':
|
'@types/exceljs':
|
||||||
specifier: ^1.3.0
|
specifier: ^1.3.0
|
||||||
version: 1.3.2
|
version: 1.3.2
|
||||||
|
@ -196,7 +196,7 @@ importers:
|
||||||
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2)
|
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2)
|
||||||
jest:
|
jest:
|
||||||
specifier: ^29.5.0
|
specifier: ^29.5.0
|
||||||
version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
prettier:
|
prettier:
|
||||||
specifier: ^3.0.0
|
specifier: ^3.0.0
|
||||||
version: 3.4.2
|
version: 3.4.2
|
||||||
|
@ -208,13 +208,13 @@ importers:
|
||||||
version: 6.3.4
|
version: 6.3.4
|
||||||
ts-jest:
|
ts-jest:
|
||||||
specifier: ^29.1.0
|
specifier: ^29.1.0
|
||||||
version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)))(typescript@5.7.2)
|
version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)))(typescript@5.7.2)
|
||||||
ts-loader:
|
ts-loader:
|
||||||
specifier: ^9.4.3
|
specifier: ^9.4.3
|
||||||
version: 9.5.1(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6))
|
version: 9.5.1(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15)))
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.1
|
specifier: ^10.9.1
|
||||||
version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
tsconfig-paths:
|
tsconfig-paths:
|
||||||
specifier: ^4.2.0
|
specifier: ^4.2.0
|
||||||
version: 4.2.0
|
version: 4.2.0
|
||||||
|
@ -395,6 +395,9 @@ importers:
|
||||||
superjson:
|
superjson:
|
||||||
specifier: ^2.2.1
|
specifier: ^2.2.1
|
||||||
version: 2.2.2
|
version: 2.2.2
|
||||||
|
swiper:
|
||||||
|
specifier: ^11.2.1
|
||||||
|
version: 11.2.1
|
||||||
tailwind-merge:
|
tailwind-merge:
|
||||||
specifier: ^2.6.0
|
specifier: ^2.6.0
|
||||||
version: 2.6.0
|
version: 2.6.0
|
||||||
|
@ -440,7 +443,7 @@ importers:
|
||||||
version: 8.4.49
|
version: 8.4.49
|
||||||
tailwindcss:
|
tailwindcss:
|
||||||
specifier: ^3.4.10
|
specifier: ^3.4.10
|
||||||
version: 3.4.17(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2))
|
version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -501,7 +504,7 @@ importers:
|
||||||
version: 6.0.1
|
version: 6.0.1
|
||||||
tsup:
|
tsup:
|
||||||
specifier: ^8.3.5
|
specifier: ^8.3.5
|
||||||
version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
version: 8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -535,10 +538,10 @@ importers:
|
||||||
version: 6.0.1
|
version: 6.0.1
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.1
|
specifier: ^10.9.1
|
||||||
version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
tsup:
|
tsup:
|
||||||
specifier: ^8.3.5
|
specifier: ^8.3.5
|
||||||
version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
version: 8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -604,10 +607,10 @@ importers:
|
||||||
version: 6.0.1
|
version: 6.0.1
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.1
|
specifier: ^10.9.1
|
||||||
version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
tsup:
|
tsup:
|
||||||
specifier: ^8.3.5
|
specifier: ^8.3.5
|
||||||
version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
version: 8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -659,10 +662,10 @@ importers:
|
||||||
version: 13.2.3
|
version: 13.2.3
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.1
|
specifier: ^10.9.1
|
||||||
version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
tsup:
|
tsup:
|
||||||
specifier: ^8.3.5
|
specifier: ^8.3.5
|
||||||
version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
version: 8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -717,10 +720,10 @@ importers:
|
||||||
version: 6.0.1
|
version: 6.0.1
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.1
|
specifier: ^10.9.1
|
||||||
version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
tsup:
|
tsup:
|
||||||
specifier: ^8.3.5
|
specifier: ^8.3.5
|
||||||
version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
version: 8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -738,10 +741,10 @@ importers:
|
||||||
version: 6.0.1
|
version: 6.0.1
|
||||||
ts-node:
|
ts-node:
|
||||||
specifier: ^10.9.1
|
specifier: ^10.9.1
|
||||||
version: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
version: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
tsup:
|
tsup:
|
||||||
specifier: ^8.3.5
|
specifier: ^8.3.5
|
||||||
version: 8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
version: 8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.7.2
|
version: 5.7.2
|
||||||
|
@ -6425,6 +6428,10 @@ packages:
|
||||||
svg-parser@2.0.4:
|
svg-parser@2.0.4:
|
||||||
resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
|
resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
|
||||||
|
|
||||||
|
swiper@11.2.1:
|
||||||
|
resolution: {integrity: sha512-62G69+iQRIfUqTmJkWpZDcX891Ra8O9050ckt1/JI2H+0483g+gq0m7gINecDqMtDh2zt5dK+uzBRxGhGOOvQA==}
|
||||||
|
engines: {node: '>= 4.7.0'}
|
||||||
|
|
||||||
symbol-observable@4.0.0:
|
symbol-observable@4.0.0:
|
||||||
resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
|
resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
|
@ -8327,7 +8334,7 @@ snapshots:
|
||||||
jest-util: 29.7.0
|
jest-util: 29.7.0
|
||||||
slash: 3.0.0
|
slash: 3.0.0
|
||||||
|
|
||||||
'@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))':
|
'@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jest/console': 29.7.0
|
'@jest/console': 29.7.0
|
||||||
'@jest/reporters': 29.7.0
|
'@jest/reporters': 29.7.0
|
||||||
|
@ -8341,7 +8348,7 @@ snapshots:
|
||||||
exit: 0.1.2
|
exit: 0.1.2
|
||||||
graceful-fs: 4.2.11
|
graceful-fs: 4.2.11
|
||||||
jest-changed-files: 29.7.0
|
jest-changed-files: 29.7.0
|
||||||
jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
jest-haste-map: 29.7.0
|
jest-haste-map: 29.7.0
|
||||||
jest-message-util: 29.7.0
|
jest-message-util: 29.7.0
|
||||||
jest-regex-util: 29.6.3
|
jest-regex-util: 29.6.3
|
||||||
|
@ -8531,21 +8538,21 @@ snapshots:
|
||||||
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
|
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
|
'@nestjs/bull-shared@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@nestjs/bullmq@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(bullmq@5.34.8)':
|
'@nestjs/bullmq@10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(bullmq@5.34.8)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))
|
'@nestjs/bull-shared': 10.2.3(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)
|
||||||
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
bullmq: 5.34.8
|
bullmq: 5.34.8
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@nestjs/cli@10.4.9(@swc/core@1.10.6)':
|
'@nestjs/cli@10.4.9(@swc/core@1.10.6(@swc/helpers@0.5.15))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@angular-devkit/core': 17.3.11(chokidar@3.6.0)
|
'@angular-devkit/core': 17.3.11(chokidar@3.6.0)
|
||||||
'@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
|
'@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
|
||||||
|
@ -8555,7 +8562,7 @@ snapshots:
|
||||||
chokidar: 3.6.0
|
chokidar: 3.6.0
|
||||||
cli-table3: 0.6.5
|
cli-table3: 0.6.5
|
||||||
commander: 4.1.1
|
commander: 4.1.1
|
||||||
fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6))
|
fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15)))
|
||||||
glob: 10.4.5
|
glob: 10.4.5
|
||||||
inquirer: 8.2.6
|
inquirer: 8.2.6
|
||||||
node-emoji: 1.11.0
|
node-emoji: 1.11.0
|
||||||
|
@ -8564,7 +8571,7 @@ snapshots:
|
||||||
tsconfig-paths: 4.2.0
|
tsconfig-paths: 4.2.0
|
||||||
tsconfig-paths-webpack-plugin: 4.2.0
|
tsconfig-paths-webpack-plugin: 4.2.0
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
webpack: 5.97.1(@swc/core@1.10.6)
|
webpack: 5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))
|
||||||
webpack-node-externals: 3.0.0
|
webpack-node-externals: 3.0.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@swc/core': 1.10.6(@swc/helpers@0.5.15)
|
'@swc/core': 1.10.6(@swc/helpers@0.5.15)
|
||||||
|
@ -8636,7 +8643,7 @@ snapshots:
|
||||||
- supports-color
|
- supports-color
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
|
|
||||||
'@nestjs/schedule@4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))':
|
'@nestjs/schedule@4.1.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
@ -8654,7 +8661,7 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- chokidar
|
- chokidar
|
||||||
|
|
||||||
'@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15))':
|
'@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15)(@nestjs/platform-express@10.4.15)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
'@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.4.15)(@nestjs/websockets@10.4.15)(reflect-metadata@0.2.2)(rxjs@7.8.1)
|
||||||
|
@ -10687,13 +10694,13 @@ snapshots:
|
||||||
crc-32: 1.2.2
|
crc-32: 1.2.2
|
||||||
readable-stream: 3.6.2
|
readable-stream: 3.6.2
|
||||||
|
|
||||||
create-jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
|
create-jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jest/types': 29.6.3
|
'@jest/types': 29.6.3
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
exit: 0.1.2
|
exit: 0.1.2
|
||||||
graceful-fs: 4.2.11
|
graceful-fs: 4.2.11
|
||||||
jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
jest-util: 29.7.0
|
jest-util: 29.7.0
|
||||||
prompts: 2.4.2
|
prompts: 2.4.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -11403,7 +11410,7 @@ snapshots:
|
||||||
cross-spawn: 7.0.6
|
cross-spawn: 7.0.6
|
||||||
signal-exit: 4.1.0
|
signal-exit: 4.1.0
|
||||||
|
|
||||||
fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6)):
|
fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.26.2
|
'@babel/code-frame': 7.26.2
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
|
@ -11418,7 +11425,7 @@ snapshots:
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
tapable: 2.2.1
|
tapable: 2.2.1
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
webpack: 5.97.1(@swc/core@1.10.6)
|
webpack: 5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))
|
||||||
|
|
||||||
form-data@4.0.1:
|
form-data@4.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -11864,16 +11871,16 @@ snapshots:
|
||||||
- babel-plugin-macros
|
- babel-plugin-macros
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
jest-cli@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
|
jest-cli@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
'@jest/test-result': 29.7.0
|
'@jest/test-result': 29.7.0
|
||||||
'@jest/types': 29.6.3
|
'@jest/types': 29.6.3
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
create-jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
create-jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
exit: 0.1.2
|
exit: 0.1.2
|
||||||
import-local: 3.2.0
|
import-local: 3.2.0
|
||||||
jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
jest-config: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
jest-util: 29.7.0
|
jest-util: 29.7.0
|
||||||
jest-validate: 29.7.0
|
jest-validate: 29.7.0
|
||||||
yargs: 17.7.2
|
yargs: 17.7.2
|
||||||
|
@ -11883,7 +11890,7 @@ snapshots:
|
||||||
- supports-color
|
- supports-color
|
||||||
- ts-node
|
- ts-node
|
||||||
|
|
||||||
jest-config@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
|
jest-config@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.26.0
|
'@babel/core': 7.26.0
|
||||||
'@jest/test-sequencer': 29.7.0
|
'@jest/test-sequencer': 29.7.0
|
||||||
|
@ -11909,7 +11916,7 @@ snapshots:
|
||||||
strip-json-comments: 3.1.1
|
strip-json-comments: 3.1.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 20.17.12
|
'@types/node': 20.17.12
|
||||||
ts-node: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
ts-node: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- babel-plugin-macros
|
- babel-plugin-macros
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -12135,12 +12142,12 @@ snapshots:
|
||||||
merge-stream: 2.0.0
|
merge-stream: 2.0.0
|
||||||
supports-color: 8.1.1
|
supports-color: 8.1.1
|
||||||
|
|
||||||
jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)):
|
jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
'@jest/types': 29.6.3
|
'@jest/types': 29.6.3
|
||||||
import-local: 3.2.0
|
import-local: 3.2.0
|
||||||
jest-cli: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
jest-cli: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@types/node'
|
- '@types/node'
|
||||||
- babel-plugin-macros
|
- babel-plugin-macros
|
||||||
|
@ -12769,13 +12776,13 @@ snapshots:
|
||||||
camelcase-css: 2.0.1
|
camelcase-css: 2.0.1
|
||||||
postcss: 8.4.49
|
postcss: 8.4.49
|
||||||
|
|
||||||
postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2)):
|
postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
lilconfig: 3.1.3
|
lilconfig: 3.1.3
|
||||||
yaml: 2.7.0
|
yaml: 2.7.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
postcss: 8.4.49
|
postcss: 8.4.49
|
||||||
ts-node: 10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)
|
ts-node: 10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)
|
||||||
|
|
||||||
postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.4.49)(yaml@2.7.0):
|
postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.4.49)(yaml@2.7.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -13838,6 +13845,8 @@ snapshots:
|
||||||
|
|
||||||
svg-parser@2.0.4: {}
|
svg-parser@2.0.4: {}
|
||||||
|
|
||||||
|
swiper@11.2.1: {}
|
||||||
|
|
||||||
symbol-observable@4.0.0: {}
|
symbol-observable@4.0.0: {}
|
||||||
|
|
||||||
synckit@0.9.2:
|
synckit@0.9.2:
|
||||||
|
@ -13849,7 +13858,7 @@ snapshots:
|
||||||
|
|
||||||
tailwind-merge@2.6.0: {}
|
tailwind-merge@2.6.0: {}
|
||||||
|
|
||||||
tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2)):
|
tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@alloc/quick-lru': 5.2.0
|
'@alloc/quick-lru': 5.2.0
|
||||||
arg: 5.0.2
|
arg: 5.0.2
|
||||||
|
@ -13868,7 +13877,7 @@ snapshots:
|
||||||
postcss: 8.4.49
|
postcss: 8.4.49
|
||||||
postcss-import: 15.1.0(postcss@8.4.49)
|
postcss-import: 15.1.0(postcss@8.4.49)
|
||||||
postcss-js: 4.0.1(postcss@8.4.49)
|
postcss-js: 4.0.1(postcss@8.4.49)
|
||||||
postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.17.12)(typescript@5.7.2))
|
postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
postcss-nested: 6.2.0(postcss@8.4.49)
|
postcss-nested: 6.2.0(postcss@8.4.49)
|
||||||
postcss-selector-parser: 6.1.2
|
postcss-selector-parser: 6.1.2
|
||||||
resolve: 1.22.10
|
resolve: 1.22.10
|
||||||
|
@ -13886,14 +13895,14 @@ snapshots:
|
||||||
inherits: 2.0.4
|
inherits: 2.0.4
|
||||||
readable-stream: 3.6.2
|
readable-stream: 3.6.2
|
||||||
|
|
||||||
terser-webpack-plugin@5.3.11(@swc/core@1.10.6)(webpack@5.97.1(@swc/core@1.10.6)):
|
terser-webpack-plugin@5.3.11(@swc/core@1.10.6(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/trace-mapping': 0.3.25
|
'@jridgewell/trace-mapping': 0.3.25
|
||||||
jest-worker: 27.5.1
|
jest-worker: 27.5.1
|
||||||
schema-utils: 4.3.0
|
schema-utils: 4.3.0
|
||||||
serialize-javascript: 6.0.2
|
serialize-javascript: 6.0.2
|
||||||
terser: 5.37.0
|
terser: 5.37.0
|
||||||
webpack: 5.97.1(@swc/core@1.10.6)
|
webpack: 5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@swc/core': 1.10.6(@swc/helpers@0.5.15)
|
'@swc/core': 1.10.6(@swc/helpers@0.5.15)
|
||||||
|
|
||||||
|
@ -13979,12 +13988,12 @@ snapshots:
|
||||||
|
|
||||||
ts-interface-checker@0.1.13: {}
|
ts-interface-checker@0.1.13: {}
|
||||||
|
|
||||||
ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2)))(typescript@5.7.2):
|
ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2)))(typescript@5.7.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
bs-logger: 0.2.6
|
bs-logger: 0.2.6
|
||||||
ejs: 3.1.10
|
ejs: 3.1.10
|
||||||
fast-json-stable-stringify: 2.1.0
|
fast-json-stable-stringify: 2.1.0
|
||||||
jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2))
|
jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2))
|
||||||
jest-util: 29.7.0
|
jest-util: 29.7.0
|
||||||
json5: 2.2.3
|
json5: 2.2.3
|
||||||
lodash.memoize: 4.1.2
|
lodash.memoize: 4.1.2
|
||||||
|
@ -13998,7 +14007,7 @@ snapshots:
|
||||||
'@jest/types': 29.6.3
|
'@jest/types': 29.6.3
|
||||||
babel-jest: 29.7.0(@babel/core@7.26.0)
|
babel-jest: 29.7.0(@babel/core@7.26.0)
|
||||||
|
|
||||||
ts-loader@9.5.1(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6)):
|
ts-loader@9.5.1(typescript@5.7.2)(webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))):
|
||||||
dependencies:
|
dependencies:
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
enhanced-resolve: 5.18.0
|
enhanced-resolve: 5.18.0
|
||||||
|
@ -14006,9 +14015,9 @@ snapshots:
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
source-map: 0.7.4
|
source-map: 0.7.4
|
||||||
typescript: 5.7.2
|
typescript: 5.7.2
|
||||||
webpack: 5.97.1(@swc/core@1.10.6)
|
webpack: 5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15))
|
||||||
|
|
||||||
ts-node@10.9.2(@swc/core@1.10.6)(@types/node@20.17.12)(typescript@5.7.2):
|
ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@20.17.12)(typescript@5.7.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@cspotcode/source-map-support': 0.8.1
|
'@cspotcode/source-map-support': 0.8.1
|
||||||
'@tsconfig/node10': 1.0.11
|
'@tsconfig/node10': 1.0.11
|
||||||
|
@ -14043,7 +14052,7 @@ snapshots:
|
||||||
|
|
||||||
tslib@2.8.1: {}
|
tslib@2.8.1: {}
|
||||||
|
|
||||||
tsup@8.3.5(@swc/core@1.10.6)(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0):
|
tsup@8.3.5(@swc/core@1.10.6(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(typescript@5.7.2)(yaml@2.7.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
bundle-require: 5.1.0(esbuild@0.24.2)
|
bundle-require: 5.1.0(esbuild@0.24.2)
|
||||||
cac: 6.7.14
|
cac: 6.7.14
|
||||||
|
@ -14236,7 +14245,7 @@ snapshots:
|
||||||
|
|
||||||
webpack-sources@3.2.3: {}
|
webpack-sources@3.2.3: {}
|
||||||
|
|
||||||
webpack@5.97.1(@swc/core@1.10.6):
|
webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/eslint-scope': 3.7.7
|
'@types/eslint-scope': 3.7.7
|
||||||
'@types/estree': 1.0.6
|
'@types/estree': 1.0.6
|
||||||
|
@ -14258,7 +14267,7 @@ snapshots:
|
||||||
neo-async: 2.6.2
|
neo-async: 2.6.2
|
||||||
schema-utils: 3.3.0
|
schema-utils: 3.3.0
|
||||||
tapable: 2.2.1
|
tapable: 2.2.1
|
||||||
terser-webpack-plugin: 5.3.11(@swc/core@1.10.6)(webpack@5.97.1(@swc/core@1.10.6))
|
terser-webpack-plugin: 5.3.11(@swc/core@1.10.6(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.6(@swc/helpers@0.5.15)))
|
||||||
watchpack: 2.4.2
|
watchpack: 2.4.2
|
||||||
webpack-sources: 3.2.3
|
webpack-sources: 3.2.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
|
Loading…
Reference in New Issue