sa2kit 1.6.44 → 1.6.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AliyunOSSProvider-2FARPAQD.js +15 -0
- package/dist/{AliyunOSSProvider-HCNGDJL7.js.map → AliyunOSSProvider-2FARPAQD.js.map} +1 -1
- package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +9 -0
- package/dist/{AliyunOSSProvider-4W47OFEK.mjs.map → AliyunOSSProvider-UMVGVBDJ.mjs.map} +1 -1
- package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
- package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
- package/dist/ConfigService-QR67WYNK.mjs +4 -0
- package/dist/{ConfigService-V6ZK273Z.mjs.map → ConfigService-QR67WYNK.mjs.map} +1 -1
- package/dist/{ConfigService-3DIC6C3Q.js → ConfigService-UYC6ZTCM.js} +3 -3
- package/dist/{ConfigService-3DIC6C3Q.js.map → ConfigService-UYC6ZTCM.js.map} +1 -1
- package/dist/GenericOrderManager-e4WizpNf.d.mts +28 -0
- package/dist/GenericOrderManager-e4WizpNf.d.ts +28 -0
- package/dist/LocalStorageProvider-JQF5WK5H.js +15 -0
- package/dist/{LocalStorageProvider-PP7MA5OT.js.map → LocalStorageProvider-JQF5WK5H.js.map} +1 -1
- package/dist/LocalStorageProvider-PYOHETJV.mjs +9 -0
- package/dist/{LocalStorageProvider-3RVPCQB3.mjs.map → LocalStorageProvider-PYOHETJV.mjs.map} +1 -1
- package/dist/PMXParser-RLBDO7YK.mjs +4 -0
- package/dist/{PMXParser-RNVQL76A.mjs.map → PMXParser-RLBDO7YK.mjs.map} +1 -1
- package/dist/{PMXParser-2VTA737I.js → PMXParser-XHNO2KNI.js} +3 -3
- package/dist/{PMXParser-2VTA737I.js.map → PMXParser-XHNO2KNI.js.map} +1 -1
- package/dist/UniversalFileService-RBV6EN5J.js +15 -0
- package/dist/UniversalFileService-RBV6EN5J.js.map +1 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs +9 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs.map +1 -0
- package/dist/analytics/index.js +1 -1
- package/dist/analytics/index.mjs +1 -1
- package/dist/analytics/server/index.js +1 -1
- package/dist/analytics/server/index.mjs +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.mjs +1 -1
- package/dist/audioDetection/index.js +1 -1
- package/dist/audioDetection/index.mjs +1 -1
- package/dist/auth/client/index.js +1 -1
- package/dist/auth/client/index.mjs +1 -1
- package/dist/auth/components/index.js +1 -1
- package/dist/auth/components/index.mjs +1 -1
- package/dist/auth/hooks/index.js +1 -1
- package/dist/auth/hooks/index.mjs +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.mjs +1 -1
- package/dist/auth/middleware/index.js +1 -1
- package/dist/auth/middleware/index.mjs +1 -1
- package/dist/auth/routes/index.js +1 -1
- package/dist/auth/routes/index.mjs +1 -1
- package/dist/auth/schema/index.js +1 -1
- package/dist/auth/schema/index.mjs +1 -1
- package/dist/auth/services/index.js +1 -1
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.js +12 -12
- package/dist/calendar/index.mjs +5 -5
- package/dist/calendar/routes/index.js +1 -1
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/server.js +1 -1
- package/dist/calendar/server.mjs +1 -1
- package/dist/chunk-2PS5PIXV.mjs +443 -0
- package/dist/chunk-2PS5PIXV.mjs.map +1 -0
- package/dist/chunk-35CXIK5Y.js +277 -0
- package/dist/chunk-35CXIK5Y.js.map +1 -0
- package/dist/{chunk-GMIUSZXC.mjs → chunk-3JW4X3AC.mjs} +3 -3
- package/dist/{chunk-GMIUSZXC.mjs.map → chunk-3JW4X3AC.mjs.map} +1 -1
- package/dist/chunk-3M6T5KVD.js +453 -0
- package/dist/chunk-3M6T5KVD.js.map +1 -0
- package/dist/chunk-3TNR6IMC.js +168 -0
- package/dist/chunk-3TNR6IMC.js.map +1 -0
- package/dist/chunk-4NFOSCM6.js +34 -0
- package/dist/chunk-4NFOSCM6.js.map +1 -0
- package/dist/{chunk-3NHAT7D4.mjs → chunk-4VJQZSPU.mjs} +4 -3
- package/dist/chunk-4VJQZSPU.mjs.map +1 -0
- package/dist/{chunk-SCDDMIF6.js → chunk-4XXIBWCO.js} +66 -66
- package/dist/{chunk-SCDDMIF6.js.map → chunk-4XXIBWCO.js.map} +1 -1
- package/dist/chunk-6AHYPPUP.js +344 -0
- package/dist/chunk-6AHYPPUP.js.map +1 -0
- package/dist/{chunk-EGJPS7OL.mjs → chunk-6BJ76BYC.mjs} +3 -3
- package/dist/{chunk-EGJPS7OL.mjs.map → chunk-6BJ76BYC.mjs.map} +1 -1
- package/dist/chunk-76V7EKBX.mjs +796 -0
- package/dist/chunk-76V7EKBX.mjs.map +1 -0
- package/dist/chunk-ACLOJXXE.js +195 -0
- package/dist/chunk-ACLOJXXE.js.map +1 -0
- package/dist/chunk-AEXPAH7Z.mjs +32 -0
- package/dist/chunk-AEXPAH7Z.mjs.map +1 -0
- package/dist/chunk-CFGX3EKK.js +560 -0
- package/dist/chunk-CFGX3EKK.js.map +1 -0
- package/dist/chunk-D2HXMGXS.js +46 -0
- package/dist/chunk-D2HXMGXS.js.map +1 -0
- package/dist/chunk-DM2GUVUH.js +1201 -0
- package/dist/chunk-DM2GUVUH.js.map +1 -0
- package/dist/{chunk-ZWQJSZEY.js → chunk-DVENFCQY.js} +5 -4
- package/dist/chunk-DVENFCQY.js.map +1 -0
- package/dist/chunk-EONPKLEJ.mjs +163 -0
- package/dist/chunk-EONPKLEJ.mjs.map +1 -0
- package/dist/{chunk-L47ZOYHL.js → chunk-EUIXQPPU.js} +4 -4
- package/dist/{chunk-L47ZOYHL.js.map → chunk-EUIXQPPU.js.map} +1 -1
- package/dist/chunk-K7WNCB4V.mjs +554 -0
- package/dist/chunk-K7WNCB4V.mjs.map +1 -0
- package/dist/chunk-L4ZYBFB2.mjs +44 -0
- package/dist/chunk-L4ZYBFB2.mjs.map +1 -0
- package/dist/chunk-M4HGHTIC.js +820 -0
- package/dist/chunk-M4HGHTIC.js.map +1 -0
- package/dist/{chunk-HHVDOIPV.js → chunk-MZKATHB7.js} +4 -4
- package/dist/{chunk-HHVDOIPV.js.map → chunk-MZKATHB7.js.map} +1 -1
- package/dist/{chunk-UKT3PLON.mjs → chunk-NXQVTAOP.mjs} +3 -3
- package/dist/{chunk-UKT3PLON.mjs.map → chunk-NXQVTAOP.mjs.map} +1 -1
- package/dist/chunk-OBIPI4GU.mjs +266 -0
- package/dist/chunk-OBIPI4GU.mjs.map +1 -0
- package/dist/chunk-PAX4S7QM.mjs +94 -0
- package/dist/chunk-PAX4S7QM.mjs.map +1 -0
- package/dist/chunk-PXWDQFWV.mjs +192 -0
- package/dist/chunk-PXWDQFWV.mjs.map +1 -0
- package/dist/chunk-QROLPPXP.mjs +5797 -0
- package/dist/chunk-QROLPPXP.mjs.map +1 -0
- package/dist/chunk-TGNUEULF.mjs +1158 -0
- package/dist/chunk-TGNUEULF.mjs.map +1 -0
- package/dist/chunk-VBQFVXOW.mjs +2772 -0
- package/dist/chunk-VBQFVXOW.mjs.map +1 -0
- package/dist/chunk-VLZ5N6XZ.js +5888 -0
- package/dist/chunk-VLZ5N6XZ.js.map +1 -0
- package/dist/chunk-VTGPHE4Z.mjs +322 -0
- package/dist/chunk-VTGPHE4Z.mjs.map +1 -0
- package/dist/chunk-WMJKH4XE.mjs +30 -0
- package/dist/{chunk-BJTO5JO5.mjs.map → chunk-WMJKH4XE.mjs.map} +1 -1
- package/dist/chunk-XYQMAF7H.js +96 -0
- package/dist/chunk-XYQMAF7H.js.map +1 -0
- package/dist/chunk-Z3G3IXEF.js +2814 -0
- package/dist/chunk-Z3G3IXEF.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +35 -0
- package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/components/index.d.mts +378 -0
- package/dist/components/index.d.ts +378 -0
- package/dist/components/index.js +414 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +9 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/config/index.mjs +1 -1
- package/dist/config/server/index.js +1 -1
- package/dist/config/server/index.mjs +1 -1
- package/dist/fileService-O3W6YXCI.mjs +4 -0
- package/dist/fileService-O3W6YXCI.mjs.map +1 -0
- package/dist/fileService-YUDIYOAS.js +13 -0
- package/dist/fileService-YUDIYOAS.js.map +1 -0
- package/dist/i18n/index.js +7 -7
- package/dist/i18n/index.mjs +1 -1
- package/dist/imageCrop/index.js +1 -1
- package/dist/imageCrop/index.mjs +1 -1
- package/dist/index.d.mts +9 -580
- package/dist/index.d.ts +9 -580
- package/dist/index.js +297 -956
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +103 -789
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +8 -8
- package/dist/logger/index.mjs +5 -2
- package/dist/mikuFireworks3D/index.js +1 -1
- package/dist/mikuFireworks3D/index.mjs +1 -1
- package/dist/mikuFireworks3D/server/index.js +1 -1
- package/dist/mikuFireworks3D/server/index.mjs +1 -1
- package/dist/mikuFusionGame/index.js +5 -5
- package/dist/mikuFusionGame/index.mjs +4 -4
- package/dist/mmd/admin/index.js +1 -1
- package/dist/mmd/admin/index.mjs +1 -1
- package/dist/mmd/index.js +2 -2
- package/dist/mmd/index.mjs +2 -2
- package/dist/mmd/server/index.js +1 -1
- package/dist/mmd/server/index.mjs +1 -1
- package/dist/music/index.js +1 -1
- package/dist/music/index.mjs +1 -1
- package/dist/music/server/index.js +1 -1
- package/dist/music/server/index.mjs +1 -1
- package/dist/navigation/index.d.mts +93 -0
- package/dist/navigation/index.d.ts +93 -0
- package/dist/navigation/index.js +29 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/index.mjs +4 -0
- package/dist/navigation/index.mjs.map +1 -0
- package/dist/popupConfig-BznThU1O.d.mts +330 -0
- package/dist/popupConfig-BznThU1O.d.ts +330 -0
- package/dist/portfolio/index.d.mts +57 -0
- package/dist/portfolio/index.d.ts +57 -0
- package/dist/portfolio/index.js +35 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/index.mjs +10 -0
- package/dist/portfolio/index.mjs.map +1 -0
- package/dist/request/index.js +1 -1
- package/dist/request/index.mjs +1 -1
- package/dist/showmasterpiece/index.d.mts +2524 -0
- package/dist/showmasterpiece/index.d.ts +2524 -0
- package/dist/showmasterpiece/index.js +9681 -0
- package/dist/showmasterpiece/index.js.map +1 -0
- package/dist/showmasterpiece/index.mjs +9631 -0
- package/dist/showmasterpiece/index.mjs.map +1 -0
- package/dist/showmasterpiece/migration/index.d.mts +120 -0
- package/dist/showmasterpiece/migration/index.d.ts +120 -0
- package/dist/showmasterpiece/migration/index.js +595 -0
- package/dist/showmasterpiece/migration/index.js.map +1 -0
- package/dist/showmasterpiece/migration/index.mjs +589 -0
- package/dist/showmasterpiece/migration/index.mjs.map +1 -0
- package/dist/showmasterpiece/scripts/index.d.mts +28 -0
- package/dist/showmasterpiece/scripts/index.d.ts +28 -0
- package/dist/showmasterpiece/scripts/index.js +327 -0
- package/dist/showmasterpiece/scripts/index.js.map +1 -0
- package/dist/showmasterpiece/scripts/index.mjs +325 -0
- package/dist/showmasterpiece/scripts/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.d.mts +2698 -0
- package/dist/showmasterpiece/server/index.d.ts +2698 -0
- package/dist/showmasterpiece/server/index.js +179 -0
- package/dist/showmasterpiece/server/index.js.map +1 -0
- package/dist/showmasterpiece/server/index.mjs +6 -0
- package/dist/showmasterpiece/server/index.mjs.map +1 -0
- package/dist/storage/index.js +8 -8
- package/dist/storage/index.mjs +2 -2
- package/dist/testYourself/admin/index.js +1 -1
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +2 -2
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/server/index.js +1 -1
- package/dist/testYourself/server/index.mjs +1 -1
- package/dist/universalExport/index.js +154 -1195
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -1157
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.js +5 -3
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +4 -2
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.js +10 -7
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +6 -2
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +592 -265
- package/dist/universalFile/server/index.d.ts +592 -265
- package/dist/universalFile/server/index.js +298 -5637
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +8 -5559
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +12 -12
- package/dist/utils/index.mjs +3 -3
- package/package.json +36 -1
- package/dist/AliyunOSSProvider-4W47OFEK.mjs +0 -6
- package/dist/AliyunOSSProvider-HCNGDJL7.js +0 -15
- package/dist/ConfigService-V6ZK273Z.mjs +0 -4
- package/dist/LocalStorageProvider-3RVPCQB3.mjs +0 -6
- package/dist/LocalStorageProvider-PP7MA5OT.js +0 -15
- package/dist/PMXParser-RNVQL76A.mjs +0 -4
- package/dist/chunk-25OFOKNF.js +0 -171
- package/dist/chunk-25OFOKNF.js.map +0 -1
- package/dist/chunk-3DXPQ4YV.mjs +0 -165
- package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
- package/dist/chunk-3NHAT7D4.mjs.map +0 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -10
- package/dist/chunk-CIVO4R6N.mjs +0 -37
- package/dist/chunk-CIVO4R6N.mjs.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -12
- package/dist/chunk-HDMIOOZY.mjs +0 -546
- package/dist/chunk-HDMIOOZY.mjs.map +0 -1
- package/dist/chunk-HJ6MH7J7.js +0 -552
- package/dist/chunk-HJ6MH7J7.js.map +0 -1
- package/dist/chunk-KH6RQ4J5.js +0 -28
- package/dist/chunk-KH6RQ4J5.js.map +0 -1
- package/dist/chunk-Q5EDCKQA.js +0 -336
- package/dist/chunk-Q5EDCKQA.js.map +0 -1
- package/dist/chunk-YOTQG4NP.mjs +0 -314
- package/dist/chunk-YOTQG4NP.mjs.map +0 -1
- package/dist/chunk-ZGVB35L2.mjs +0 -25
- package/dist/chunk-ZGVB35L2.mjs.map +0 -1
- package/dist/chunk-ZRAW3HXA.js +0 -43
- package/dist/chunk-ZRAW3HXA.js.map +0 -1
- package/dist/chunk-ZWQJSZEY.js.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
export { FloatingMenu_default as FloatingMenu, FloatingMenuExample_default as FloatingMenuExample, Navigation_default as Navigation, NavigationItem_default as NavigationItem, NavigationToggle_default as NavigationToggle } from './chunk-2PS5PIXV.mjs';
|
|
2
|
+
import { ExperimentCard } from './chunk-OBIPI4GU.mjs';
|
|
3
|
+
export { About_default as About, Contact_default as Contact, ExperimentCard, Home_default as Home, ProjectCarousel } from './chunk-OBIPI4GU.mjs';
|
|
1
4
|
export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, DanmakuPanel, FIREWORK_KIND_LABELS, FireworksCanvas, FireworksControlPanel, MIKU_PALETTE, MikuFireworks3D, NORMAL_PALETTE, WebSocketTransport, useDanmakuController, useFireworksEngine, useFireworksRealtime } from './chunk-CX5GPCCO.mjs';
|
|
2
|
-
import { Dialog, DialogContent, Avatar, AvatarImage, AvatarFallback, Button,
|
|
3
|
-
export { Dialog as AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, DialogDescription as AlertDialogDescription, DialogFooter as AlertDialogFooter, DialogHeader as AlertDialogHeader, DialogOverlay as AlertDialogOverlay, DialogPortal as AlertDialogPortal, DialogTitle as AlertDialogTitle, DialogTrigger as AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, BackButton, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CollisionBalls, ConfirmModal, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FilterButtonGroup, GenericOrderManager, Grid, Input, Label, Modal, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, ScrollArea, ScrollBar, SearchBox, SearchResultHint, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Dialog as Sheet, DialogClose as SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, DialogOverlay as SheetOverlay, DialogPortal as SheetPortal, SheetTitle, DialogTrigger as SheetTrigger, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Timeline, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants } from './chunk-
|
|
4
|
-
export { ImageMappingPanel, LocalImageMappingPanel } from './chunk-
|
|
5
|
+
import { Dialog, DialogContent, Avatar, AvatarImage, AvatarFallback, Button, FilterButtonGroup, BackButton, Grid, Badge } from './chunk-3JW4X3AC.mjs';
|
|
6
|
+
export { Dialog as AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, DialogDescription as AlertDialogDescription, DialogFooter as AlertDialogFooter, DialogHeader as AlertDialogHeader, DialogOverlay as AlertDialogOverlay, DialogPortal as AlertDialogPortal, DialogTitle as AlertDialogTitle, DialogTrigger as AlertDialogTrigger, Avatar, AvatarFallback, AvatarImage, BackButton, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CollisionBalls, ConfirmModal, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FilterButtonGroup, GenericOrderManager, Grid, Input, Label, Modal, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, ScrollArea, ScrollBar, SearchBox, SearchResultHint, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Dialog as Sheet, DialogClose as SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, DialogOverlay as SheetOverlay, DialogPortal as SheetPortal, SheetTitle, DialogTrigger as SheetTrigger, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Timeline, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants } from './chunk-3JW4X3AC.mjs';
|
|
7
|
+
export { ImageMappingPanel, LocalImageMappingPanel } from './chunk-6BJ76BYC.mjs';
|
|
5
8
|
import './chunk-LJ4CCSSY.mjs';
|
|
6
9
|
import './chunk-Z36R3P62.mjs';
|
|
7
10
|
import './chunk-52TN2QSS.mjs';
|
|
@@ -9,23 +12,24 @@ import './chunk-KZKIH4AS.mjs';
|
|
|
9
12
|
import { useAuth } from './chunk-KW5JH6V6.mjs';
|
|
10
13
|
import './chunk-PE5EAHZK.mjs';
|
|
11
14
|
import './chunk-AIKEVVDR.mjs';
|
|
12
|
-
import { cn } from './chunk-
|
|
13
|
-
export { arrayUtils, cn, debugUtils, errorUtils, fileUtils, formatTime, japaneseUtils, stringUtils, validators } from './chunk-
|
|
14
|
-
export { useAsyncStorage, useElectronStorage, useTaroStorage } from './chunk-
|
|
15
|
+
import { cn } from './chunk-4VJQZSPU.mjs';
|
|
16
|
+
export { arrayUtils, cn, debugUtils, errorUtils, fileUtils, formatTime, japaneseUtils, stringUtils, validators } from './chunk-4VJQZSPU.mjs';
|
|
17
|
+
export { useAsyncStorage, useElectronStorage, useTaroStorage } from './chunk-NXQVTAOP.mjs';
|
|
15
18
|
export { useLocalStorage, useStorage } from './chunk-VVWQTO4Y.mjs';
|
|
16
19
|
import './chunk-WEEXCPSE.mjs';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
import
|
|
20
|
+
import { init_logger } from './chunk-PXWDQFWV.mjs';
|
|
21
|
+
export { ConsoleLoggerAdapter, LogLevel, Logger, createLogger, logger } from './chunk-PXWDQFWV.mjs';
|
|
22
|
+
import './chunk-WMJKH4XE.mjs';
|
|
23
|
+
import React3, { useState, useRef, useCallback, useEffect } from 'react';
|
|
20
24
|
import { createWorker } from 'tesseract.js';
|
|
21
25
|
import { Upload, X, Loader2, FileText, Eraser, Download, MessageSquare, Send, Bot, User, Shield, AlertTriangle, FlaskConical, LogOut, Meh, Frown, Smile } from 'lucide-react';
|
|
22
26
|
import { clsx } from 'clsx';
|
|
23
|
-
import Link from 'next/link';
|
|
24
|
-
import { createPortal } from 'react-dom';
|
|
25
27
|
import { useSensors, useSensor, PointerSensor, TouchSensor, KeyboardSensor, DndContext, closestCenter } from '@dnd-kit/core';
|
|
26
28
|
import { useSortable, sortableKeyboardCoordinates, SortableContext, rectSortingStrategy, arrayMove } from '@dnd-kit/sortable';
|
|
27
29
|
import { CSS } from '@dnd-kit/utilities';
|
|
28
30
|
|
|
31
|
+
// src/index.ts
|
|
32
|
+
init_logger();
|
|
29
33
|
var useOCR = (options = {}) => {
|
|
30
34
|
const [state, setState] = useState({
|
|
31
35
|
isProcessing: false,
|
|
@@ -153,43 +157,43 @@ var OCRScanner = ({
|
|
|
153
157
|
handleFileChange(mockEvent);
|
|
154
158
|
}
|
|
155
159
|
};
|
|
156
|
-
return /* @__PURE__ */
|
|
160
|
+
return /* @__PURE__ */ React3.createElement(
|
|
157
161
|
"div",
|
|
158
162
|
{
|
|
159
163
|
className: clsx("p-6 border-2 border-dashed rounded-xl transition-all", isProcessing ? "border-blue-400 bg-blue-50/10" : "border-gray-200 hover:border-blue-400", className),
|
|
160
164
|
onDragOver: handleDragOver,
|
|
161
165
|
onDrop: handleDrop
|
|
162
166
|
},
|
|
163
|
-
!imagePreview ? /* @__PURE__ */
|
|
167
|
+
!imagePreview ? /* @__PURE__ */ React3.createElement(
|
|
164
168
|
"div",
|
|
165
169
|
{
|
|
166
170
|
className: "flex flex-col items-center justify-center cursor-pointer space-y-4",
|
|
167
171
|
onClick: () => fileInputRef.current?.click()
|
|
168
172
|
},
|
|
169
|
-
/* @__PURE__ */
|
|
170
|
-
/* @__PURE__ */
|
|
171
|
-
) : /* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ React3.createElement("div", { className: "p-4 bg-blue-50 rounded-full text-blue-500" }, /* @__PURE__ */ React3.createElement(Upload, { size: 32 })),
|
|
174
|
+
/* @__PURE__ */ React3.createElement("div", { className: "text-center" }, /* @__PURE__ */ React3.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u70B9\u51FB\u6216\u62D6\u62FD\u56FE\u7247\u8FDB\u884C OCR \u8BC6\u522B"), /* @__PURE__ */ React3.createElement("p", { className: "text-sm text-gray-500" }, "\u652F\u6301 JPG, PNG, WebP"))
|
|
175
|
+
) : /* @__PURE__ */ React3.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React3.createElement("div", { className: "relative group rounded-lg overflow-hidden border border-gray-200" }, /* @__PURE__ */ React3.createElement(
|
|
172
176
|
"img",
|
|
173
177
|
{
|
|
174
178
|
src: imagePreview,
|
|
175
179
|
alt: "Preview",
|
|
176
180
|
className: clsx("max-h-64 mx-auto object-contain transition-opacity", isProcessing ? "opacity-50" : "opacity-100")
|
|
177
181
|
}
|
|
178
|
-
), !isProcessing && /* @__PURE__ */
|
|
182
|
+
), !isProcessing && /* @__PURE__ */ React3.createElement(
|
|
179
183
|
"button",
|
|
180
184
|
{
|
|
181
185
|
onClick: reset,
|
|
182
186
|
className: "absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm"
|
|
183
187
|
},
|
|
184
|
-
/* @__PURE__ */
|
|
185
|
-
), isProcessing && /* @__PURE__ */
|
|
188
|
+
/* @__PURE__ */ React3.createElement(X, { size: 18 })
|
|
189
|
+
), isProcessing && /* @__PURE__ */ React3.createElement("div", { className: "absolute inset-0 flex flex-col items-center justify-center bg-black/5" }, /* @__PURE__ */ React3.createElement(Loader2, { className: "animate-spin text-blue-500 mb-2", size: 32 }), /* @__PURE__ */ React3.createElement("div", { className: "w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React3.createElement(
|
|
186
190
|
"div",
|
|
187
191
|
{
|
|
188
192
|
className: "bg-blue-500 h-full transition-all duration-300",
|
|
189
193
|
style: { width: progress * 100 + "%" }
|
|
190
194
|
}
|
|
191
|
-
)), /* @__PURE__ */
|
|
192
|
-
/* @__PURE__ */
|
|
195
|
+
)), /* @__PURE__ */ React3.createElement("p", { className: "text-xs font-medium text-blue-600 mt-2" }, status === "initializing" ? "\u6B63\u5728\u52A0\u8F7D\u5F15\u64CE..." : "\u8BC6\u522B\u4E2D " + Math.round(progress * 100) + "%"))), result && !isProcessing && /* @__PURE__ */ React3.createElement("div", { className: "bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center gap-2 mb-2 text-gray-600 font-medium" }, /* @__PURE__ */ React3.createElement(FileText, { size: 18 }), /* @__PURE__ */ React3.createElement("span", null, "\u8BC6\u522B\u7ED3\u679C (\u7F6E\u4FE1\u5EA6: ", Math.round(result.confidence), "%)")), /* @__PURE__ */ React3.createElement("pre", { className: "text-sm text-gray-800 whitespace-pre-wrap font-sans" }, result.text)), error && /* @__PURE__ */ React3.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u8BC6\u522B\u5931\u8D25: ", error.message)),
|
|
196
|
+
/* @__PURE__ */ React3.createElement(
|
|
193
197
|
"input",
|
|
194
198
|
{
|
|
195
199
|
type: "file",
|
|
@@ -337,37 +341,37 @@ var BackgroundRemover = ({
|
|
|
337
341
|
a.download = "removed_background.png";
|
|
338
342
|
a.click();
|
|
339
343
|
};
|
|
340
|
-
return /* @__PURE__ */
|
|
344
|
+
return /* @__PURE__ */ React3.createElement("div", { className: clsx("p-6 border-2 border-dashed rounded-xl transition-all", isProcessing ? "border-purple-400 bg-purple-50/10" : "border-gray-200 hover:border-purple-400", className) }, !imagePreview ? /* @__PURE__ */ React3.createElement(
|
|
341
345
|
"div",
|
|
342
346
|
{
|
|
343
347
|
className: "flex flex-col items-center justify-center cursor-pointer space-y-4",
|
|
344
348
|
onClick: () => fileInputRef.current?.click()
|
|
345
349
|
},
|
|
346
|
-
/* @__PURE__ */
|
|
347
|
-
/* @__PURE__ */
|
|
348
|
-
) : /* @__PURE__ */
|
|
350
|
+
/* @__PURE__ */ React3.createElement("div", { className: "p-4 bg-purple-50 rounded-full text-purple-500" }, /* @__PURE__ */ React3.createElement(Eraser, { size: 32 })),
|
|
351
|
+
/* @__PURE__ */ React3.createElement("div", { className: "text-center" }, /* @__PURE__ */ React3.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u4E0A\u4F20\u56FE\u7247\u79FB\u9664\u80CC\u666F"), /* @__PURE__ */ React3.createElement("p", { className: "text-sm text-gray-500" }, "\u5EFA\u8BAE\u4F7F\u7528\u4E3B\u4F53\u660E\u786E\u7684\u56FE\u7247"))
|
|
352
|
+
) : /* @__PURE__ */ React3.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React3.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React3.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React3.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u539F\u56FE"), /* @__PURE__ */ React3.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50" }, /* @__PURE__ */ React3.createElement("img", { src: imagePreview, alt: "Original", className: "max-h-64 mx-auto object-contain" }))), /* @__PURE__ */ React3.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React3.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u5904\u7406\u7ED3\u679C"), /* @__PURE__ */ React3.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]" }, resultUrl ? /* @__PURE__ */ React3.createElement("img", { src: resultUrl, alt: "Result", className: "max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500" }) : /* @__PURE__ */ React3.createElement("div", { className: "h-64 flex flex-col items-center justify-center text-gray-400" }, isProcessing ? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(Loader2, { className: "animate-spin text-purple-500 mb-2", size: 32 }), /* @__PURE__ */ React3.createElement("div", { className: "w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React3.createElement(
|
|
349
353
|
"div",
|
|
350
354
|
{
|
|
351
355
|
className: "bg-purple-500 h-full transition-all duration-300",
|
|
352
356
|
style: { width: progress * 100 + "%" }
|
|
353
357
|
}
|
|
354
|
-
)), /* @__PURE__ */
|
|
358
|
+
)), /* @__PURE__ */ React3.createElement("p", { className: "text-[10px] mt-2 font-mono uppercase" }, status.replace(/-/g, " "))) : /* @__PURE__ */ React3.createElement("span", { className: "text-sm italic" }, "\u7B49\u5F85\u5904\u7406..."))))), /* @__PURE__ */ React3.createElement("div", { className: "flex justify-between items-center pt-2" }, !isProcessing && /* @__PURE__ */ React3.createElement(
|
|
355
359
|
"button",
|
|
356
360
|
{
|
|
357
361
|
onClick: reset,
|
|
358
362
|
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors"
|
|
359
363
|
},
|
|
360
|
-
/* @__PURE__ */
|
|
364
|
+
/* @__PURE__ */ React3.createElement(X, { size: 16 }),
|
|
361
365
|
"\u91CD\u65B0\u5F00\u59CB"
|
|
362
|
-
), resultUrl && !isProcessing && /* @__PURE__ */
|
|
366
|
+
), resultUrl && !isProcessing && /* @__PURE__ */ React3.createElement(
|
|
363
367
|
"button",
|
|
364
368
|
{
|
|
365
369
|
onClick: downloadResult,
|
|
366
370
|
className: "flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all"
|
|
367
371
|
},
|
|
368
|
-
/* @__PURE__ */
|
|
372
|
+
/* @__PURE__ */ React3.createElement(Download, { size: 16 }),
|
|
369
373
|
"\u4E0B\u8F7D PNG"
|
|
370
|
-
)), error && /* @__PURE__ */
|
|
374
|
+
)), error && /* @__PURE__ */ React3.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5904\u7406\u5931\u8D25: ", error.message)), /* @__PURE__ */ React3.createElement(
|
|
371
375
|
"input",
|
|
372
376
|
{
|
|
373
377
|
type: "file",
|
|
@@ -486,11 +490,11 @@ var SentimentAnalyzer = ({
|
|
|
486
490
|
if (!result) return null;
|
|
487
491
|
switch (result.sentiment) {
|
|
488
492
|
case "positive":
|
|
489
|
-
return /* @__PURE__ */
|
|
493
|
+
return /* @__PURE__ */ React3.createElement(Smile, { className: "text-green-500", size: 24 });
|
|
490
494
|
case "negative":
|
|
491
|
-
return /* @__PURE__ */
|
|
495
|
+
return /* @__PURE__ */ React3.createElement(Frown, { className: "text-red-500", size: 24 });
|
|
492
496
|
default:
|
|
493
|
-
return /* @__PURE__ */
|
|
497
|
+
return /* @__PURE__ */ React3.createElement(Meh, { className: "text-yellow-500", size: 24 });
|
|
494
498
|
}
|
|
495
499
|
};
|
|
496
500
|
const getSentimentColor = () => {
|
|
@@ -504,7 +508,7 @@ var SentimentAnalyzer = ({
|
|
|
504
508
|
return "bg-yellow-50 border-yellow-200 text-yellow-700";
|
|
505
509
|
}
|
|
506
510
|
};
|
|
507
|
-
return /* @__PURE__ */
|
|
511
|
+
return /* @__PURE__ */ React3.createElement("div", { className: clsx("p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm", className) }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium" }, /* @__PURE__ */ React3.createElement(MessageSquare, { size: 20 }), /* @__PURE__ */ React3.createElement("span", null, "\u6587\u672C\u60C5\u611F\u5206\u6790")), /* @__PURE__ */ React3.createElement("div", { className: "relative" }, /* @__PURE__ */ React3.createElement(
|
|
508
512
|
"textarea",
|
|
509
513
|
{
|
|
510
514
|
value: text,
|
|
@@ -513,15 +517,15 @@ var SentimentAnalyzer = ({
|
|
|
513
517
|
className: "w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200",
|
|
514
518
|
disabled: isProcessing
|
|
515
519
|
}
|
|
516
|
-
), /* @__PURE__ */
|
|
520
|
+
), /* @__PURE__ */ React3.createElement(
|
|
517
521
|
"button",
|
|
518
522
|
{
|
|
519
523
|
onClick: handleAnalyze,
|
|
520
524
|
disabled: !text.trim() || isProcessing,
|
|
521
525
|
className: "absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm"
|
|
522
526
|
},
|
|
523
|
-
isProcessing ? /* @__PURE__ */
|
|
524
|
-
)), isProcessing && /* @__PURE__ */
|
|
527
|
+
isProcessing ? /* @__PURE__ */ React3.createElement(Loader2, { className: "animate-spin", size: 18 }) : /* @__PURE__ */ React3.createElement(Send, { size: 18 })
|
|
528
|
+
)), isProcessing && /* @__PURE__ */ React3.createElement("div", { className: "mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse" }, /* @__PURE__ */ React3.createElement(Loader2, { size: 14, className: "animate-spin" }), /* @__PURE__ */ React3.createElement("span", null, "\u6B63\u5728\u5206\u6790 (\u9996\u6B21\u8FD0\u884C\u5C06\u52A0\u8F7D\u6A21\u578B\u8D44\u6E90)...")), result && !isProcessing && /* @__PURE__ */ React3.createElement("div", { className: clsx("mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2", getSentimentColor()) }, /* @__PURE__ */ React3.createElement("div", { className: "p-2 bg-white rounded-full shadow-sm" }, getSentimentIcon()), /* @__PURE__ */ React3.createElement("div", null, /* @__PURE__ */ React3.createElement("p", { className: "font-bold text-lg capitalize" }, result.sentiment), /* @__PURE__ */ React3.createElement("p", { className: "text-sm opacity-80" }, "\u7F6E\u4FE1\u5EA6: ", (result.score * 100).toFixed(1), "% (", result.label, ")"))), error && /* @__PURE__ */ React3.createElement("div", { className: "mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5206\u6790\u5931\u8D25: ", error.message));
|
|
525
529
|
};
|
|
526
530
|
var useTextGeneration = (options = {}) => {
|
|
527
531
|
const [state, setState] = useState({
|
|
@@ -661,7 +665,7 @@ AI\u56DE\u5E94\uFF1A"`;
|
|
|
661
665
|
setChatHistory((prev) => [...prev, { role: "assistant", content: "\uFF08\u672C\u5730\u6A21\u578B\u601D\u8003\u8FC7\u5EA6\uFF0C\u6682\u65F6\u4F11\u606F\u4E2D...\uFF09" }]);
|
|
662
666
|
}
|
|
663
667
|
};
|
|
664
|
-
return /* @__PURE__ */
|
|
668
|
+
return /* @__PURE__ */ React3.createElement("div", { className: clsx("flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden", className) }, /* @__PURE__ */ React3.createElement("div", { ref: scrollRef, className: "flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50" }, chatHistory.length === 0 && /* @__PURE__ */ React3.createElement("div", { className: "h-full flex flex-col items-center justify-center text-gray-400 space-y-2" }, /* @__PURE__ */ React3.createElement(Bot, { size: 48, className: "opacity-20" }), /* @__PURE__ */ React3.createElement("p", { className: "text-sm italic text-center px-8 text-gray-400 font-sans" }, "\u4F60\u597D\uFF01\u6211\u662F 100% \u672C\u5730\u8FD0\u884C\u7684 AI\u3002", /* @__PURE__ */ React3.createElement("br", null), "\u4F60\u53EF\u4EE5\u548C\u6211\u804A\u804A\u5929\uFF0C\u6211\u4F1A\u5C1D\u8BD5\u7406\u89E3\u4F60\u7684\u610F\u601D\u3002")), chatHistory.map((msg, i) => /* @__PURE__ */ React3.createElement("div", { key: i, className: clsx("flex", msg.role === "user" ? "justify-end" : "justify-start", "animate-in fade-in slide-in-from-bottom-2") }, /* @__PURE__ */ React3.createElement("div", { className: clsx("flex gap-3 max-w-[85%]", msg.role === "user" ? "flex-row-reverse" : "") }, /* @__PURE__ */ React3.createElement("div", { className: clsx("p-2 rounded-lg h-fit", msg.role === "user" ? "bg-blue-100 text-blue-600" : "bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400") }, msg.role === "user" ? /* @__PURE__ */ React3.createElement(User, { size: 18 }) : /* @__PURE__ */ React3.createElement(Bot, { size: 18 })), /* @__PURE__ */ React3.createElement("div", { className: clsx("p-3 rounded-2xl shadow-sm text-sm", msg.role === "user" ? "bg-blue-600 text-white rounded-tr-none" : "bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed") }, msg.content)))), isGenerating && /* @__PURE__ */ React3.createElement("div", { className: "flex justify-start" }, /* @__PURE__ */ React3.createElement("div", { className: "flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600" }, /* @__PURE__ */ React3.createElement(Loader2, { className: "animate-spin text-blue-500", size: 16 }), /* @__PURE__ */ React3.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React3.createElement("span", { className: "text-xs text-gray-500 font-medium" }, "\u601D\u8003\u4E2D..."), /* @__PURE__ */ React3.createElement("span", { className: "text-[10px] text-blue-400 font-mono tracking-tighter" }, genStatus))))), /* @__PURE__ */ React3.createElement("div", { className: "p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700" }, /* @__PURE__ */ React3.createElement("div", { className: "relative flex items-center gap-2" }, /* @__PURE__ */ React3.createElement(
|
|
665
669
|
"input",
|
|
666
670
|
{
|
|
667
671
|
type: "text",
|
|
@@ -672,14 +676,14 @@ AI\u56DE\u5E94\uFF1A"`;
|
|
|
672
676
|
className: "flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800",
|
|
673
677
|
disabled: isGenerating
|
|
674
678
|
}
|
|
675
|
-
), /* @__PURE__ */
|
|
679
|
+
), /* @__PURE__ */ React3.createElement(
|
|
676
680
|
"button",
|
|
677
681
|
{
|
|
678
682
|
onClick: handleSend,
|
|
679
683
|
disabled: !input.trim() || isGenerating,
|
|
680
684
|
className: "absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center"
|
|
681
685
|
},
|
|
682
|
-
/* @__PURE__ */
|
|
686
|
+
/* @__PURE__ */ React3.createElement(Send, { size: 18 })
|
|
683
687
|
))));
|
|
684
688
|
};
|
|
685
689
|
var themeStyles = {
|
|
@@ -704,7 +708,7 @@ var ProfileModal = ({
|
|
|
704
708
|
}) => {
|
|
705
709
|
const renderSocialLinks = () => {
|
|
706
710
|
if (!data.socialLinks || data.socialLinks.length === 0) return null;
|
|
707
|
-
return /* @__PURE__ */
|
|
711
|
+
return /* @__PURE__ */ React3.createElement("div", { className: "flex gap-3 mt-2" }, data.socialLinks.map((link, index) => /* @__PURE__ */ React3.createElement(
|
|
708
712
|
"a",
|
|
709
713
|
{
|
|
710
714
|
key: index,
|
|
@@ -723,15 +727,15 @@ var ProfileModal = ({
|
|
|
723
727
|
}
|
|
724
728
|
}
|
|
725
729
|
},
|
|
726
|
-
link.icon ? /* @__PURE__ */
|
|
730
|
+
link.icon ? /* @__PURE__ */ React3.createElement("span", { className: "text-base" }, link.icon) : /* @__PURE__ */ React3.createElement("span", { className: "text-[10px] font-semibold" }, link.type)
|
|
727
731
|
)));
|
|
728
732
|
};
|
|
729
733
|
const renderContacts = () => {
|
|
730
734
|
if (!data.contacts || Object.keys(data.contacts).length === 0) return null;
|
|
731
|
-
return /* @__PURE__ */
|
|
735
|
+
return /* @__PURE__ */ React3.createElement("div", { className: cn(
|
|
732
736
|
"mt-4 border-t pt-4",
|
|
733
737
|
themeName === "dark" ? "border-gray-800" : "border-gray-100"
|
|
734
|
-
) }, Object.entries(data.contacts).map(([type, value], index) => /* @__PURE__ */
|
|
738
|
+
) }, Object.entries(data.contacts).map(([type, value], index) => /* @__PURE__ */ React3.createElement(
|
|
735
739
|
"div",
|
|
736
740
|
{
|
|
737
741
|
key: index,
|
|
@@ -741,35 +745,35 @@ var ProfileModal = ({
|
|
|
741
745
|
),
|
|
742
746
|
onClick: () => onContactClick && onContactClick(type, value)
|
|
743
747
|
},
|
|
744
|
-
/* @__PURE__ */
|
|
748
|
+
/* @__PURE__ */ React3.createElement("span", { className: cn(
|
|
745
749
|
"font-medium w-[70px] shrink-0",
|
|
746
750
|
themeName === "dark" ? "text-gray-400" : "text-gray-500"
|
|
747
751
|
) }, type, ":"),
|
|
748
|
-
/* @__PURE__ */
|
|
752
|
+
/* @__PURE__ */ React3.createElement("span", { className: themeName === "dark" ? "text-gray-200" : "text-gray-800" }, value)
|
|
749
753
|
)));
|
|
750
754
|
};
|
|
751
|
-
return /* @__PURE__ */
|
|
755
|
+
return /* @__PURE__ */ React3.createElement(Dialog, { open: isOpen, onOpenChange: (open) => !open && onClose() }, /* @__PURE__ */ React3.createElement(DialogContent, { className: cn(
|
|
752
756
|
"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl",
|
|
753
757
|
themeStyles[themeName] || "",
|
|
754
758
|
className
|
|
755
|
-
) }, /* @__PURE__ */
|
|
759
|
+
) }, /* @__PURE__ */ React3.createElement("div", { className: "p-6" }, /* @__PURE__ */ React3.createElement("div", { className: "flex gap-5 mb-5" }, showAvatar && /* @__PURE__ */ React3.createElement(
|
|
756
760
|
"div",
|
|
757
761
|
{
|
|
758
762
|
className: "shrink-0",
|
|
759
763
|
onClick: onAvatarClick,
|
|
760
764
|
style: { cursor: onAvatarClick ? "pointer" : "default" }
|
|
761
765
|
},
|
|
762
|
-
/* @__PURE__ */
|
|
763
|
-
), /* @__PURE__ */
|
|
766
|
+
/* @__PURE__ */ React3.createElement(Avatar, { className: "border-2 border-primary/10 shadow-sm", style: { width: avatarSize, height: avatarSize } }, data.avatar && /* @__PURE__ */ React3.createElement(AvatarImage, { src: data.avatar, alt: data.name, className: "object-cover" }), /* @__PURE__ */ React3.createElement(AvatarFallback, { className: "text-xl" }, data.name.substring(0, 2).toUpperCase()))
|
|
767
|
+
), /* @__PURE__ */ React3.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, /* @__PURE__ */ React3.createElement("h2", { className: cn(
|
|
764
768
|
"text-2xl font-bold m-0 mb-1",
|
|
765
769
|
themeName === "dark" ? "text-white" : "text-gray-900"
|
|
766
|
-
) }, data.name), data.title && /* @__PURE__ */
|
|
770
|
+
) }, data.name), data.title && /* @__PURE__ */ React3.createElement("div", { className: cn(
|
|
767
771
|
"text-sm mb-2",
|
|
768
772
|
themeName === "dark" ? "text-gray-400" : "text-gray-500"
|
|
769
|
-
) }, data.title), showSocial && renderSocialLinks())), showBio && data.bio && /* @__PURE__ */
|
|
773
|
+
) }, data.title), showSocial && renderSocialLinks())), showBio && data.bio && /* @__PURE__ */ React3.createElement("div", { className: cn(
|
|
770
774
|
"mb-5 leading-relaxed text-sm",
|
|
771
775
|
themeName === "dark" ? "text-gray-300" : "text-gray-600"
|
|
772
|
-
) }, /* @__PURE__ */
|
|
776
|
+
) }, /* @__PURE__ */ React3.createElement("p", null, data.bio)), showContacts && renderContacts(), data.customContent && /* @__PURE__ */ React3.createElement("div", { className: "mt-5" }, data.customContent))));
|
|
773
777
|
};
|
|
774
778
|
var ProfileModal_default = ProfileModal;
|
|
775
779
|
var BadgeList = ({
|
|
@@ -777,13 +781,13 @@ var BadgeList = ({
|
|
|
777
781
|
className = ""
|
|
778
782
|
}) => {
|
|
779
783
|
if (!badges || badges.length === 0) return null;
|
|
780
|
-
return /* @__PURE__ */
|
|
784
|
+
return /* @__PURE__ */ React3.createElement("div", { className: cn("flex flex-wrap gap-2 mt-4", className) }, badges.map((badge, index) => /* @__PURE__ */ React3.createElement(
|
|
781
785
|
Badge,
|
|
782
786
|
{
|
|
783
787
|
key: index,
|
|
784
788
|
variant: badge.type === "default" ? "default" : badge.type
|
|
785
789
|
},
|
|
786
|
-
badge.icon && /* @__PURE__ */
|
|
790
|
+
badge.icon && /* @__PURE__ */ React3.createElement("span", { className: "mr-1" }, badge.icon),
|
|
787
791
|
badge.label
|
|
788
792
|
)));
|
|
789
793
|
};
|
|
@@ -834,7 +838,7 @@ var exampleProfileData = {
|
|
|
834
838
|
{ label: "\u7C89\u4E1D", value: 1024 },
|
|
835
839
|
{ label: "\u8BC4\u5206", value: "4.9" }
|
|
836
840
|
],
|
|
837
|
-
customContent: /* @__PURE__ */
|
|
841
|
+
customContent: /* @__PURE__ */ React3.createElement("div", { className: "mt-5 border-t border-gray-100 pt-4" }, /* @__PURE__ */ React3.createElement("h3", { className: "text-sm font-semibold mb-2" }, "\u4E13\u4E1A\u6280\u80FD"), /* @__PURE__ */ React3.createElement("p", { className: "text-sm text-gray-600 leading-relaxed" }, "\u7CBE\u901AReact\u3001Vue\u3001Angular\u7B49\u524D\u7AEF\u6846\u67B6\uFF0C\u719F\u6089TypeScript\u3001JavaScript\u3001CSS3\u3001HTML5\u7B49\u524D\u7AEF\u6280\u672F\u3002 \u6709\u4E30\u5BCC\u7684\u5927\u578B\u9879\u76EE\u5F00\u53D1\u7ECF\u9A8C\uFF0C\u80FD\u72EC\u7ACB\u8D1F\u8D23\u524D\u7AEF\u67B6\u6784\u8BBE\u8BA1\u3002"))
|
|
838
842
|
};
|
|
839
843
|
var ProfileButton = ({
|
|
840
844
|
data = exampleProfileData,
|
|
@@ -854,7 +858,7 @@ var ProfileButton = ({
|
|
|
854
858
|
window.open("tel:" + value);
|
|
855
859
|
}
|
|
856
860
|
};
|
|
857
|
-
return /* @__PURE__ */
|
|
861
|
+
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(
|
|
858
862
|
Button,
|
|
859
863
|
{
|
|
860
864
|
variant,
|
|
@@ -863,7 +867,7 @@ var ProfileButton = ({
|
|
|
863
867
|
className
|
|
864
868
|
},
|
|
865
869
|
buttonText
|
|
866
|
-
), /* @__PURE__ */
|
|
870
|
+
), /* @__PURE__ */ React3.createElement(
|
|
867
871
|
ProfileModal_default,
|
|
868
872
|
{
|
|
869
873
|
isOpen: isModalOpen,
|
|
@@ -874,8 +878,8 @@ var ProfileButton = ({
|
|
|
874
878
|
onSocialLinkClick: (url) => window.open(url, "_blank")
|
|
875
879
|
},
|
|
876
880
|
data.customContent,
|
|
877
|
-
data.badges && /* @__PURE__ */
|
|
878
|
-
data.stats && /* @__PURE__ */
|
|
881
|
+
data.badges && /* @__PURE__ */ React3.createElement(BadgeList, { badges: data.badges }),
|
|
882
|
+
data.stats && /* @__PURE__ */ React3.createElement(StatList, { stats: data.stats })
|
|
879
883
|
));
|
|
880
884
|
};
|
|
881
885
|
var AutoOpenModal = ({
|
|
@@ -905,7 +909,7 @@ var AutoOpenModal = ({
|
|
|
905
909
|
window.open("tel:" + value);
|
|
906
910
|
}
|
|
907
911
|
};
|
|
908
|
-
return /* @__PURE__ */
|
|
912
|
+
return /* @__PURE__ */ React3.createElement(
|
|
909
913
|
ProfileModal_default,
|
|
910
914
|
{
|
|
911
915
|
isOpen: isModalOpen,
|
|
@@ -915,8 +919,8 @@ var AutoOpenModal = ({
|
|
|
915
919
|
onContactClick: handleContactClick,
|
|
916
920
|
onSocialLinkClick: (url) => window.open(url, "_blank")
|
|
917
921
|
},
|
|
918
|
-
data.badges && /* @__PURE__ */
|
|
919
|
-
data.stats && /* @__PURE__ */
|
|
922
|
+
data.badges && /* @__PURE__ */ React3.createElement(BadgeList, { badges: data.badges }),
|
|
923
|
+
data.stats && /* @__PURE__ */ React3.createElement(StatList, { stats: data.stats })
|
|
920
924
|
);
|
|
921
925
|
};
|
|
922
926
|
var sizeMap = {
|
|
@@ -940,7 +944,7 @@ var EnhancedAvatar = ({
|
|
|
940
944
|
}) => {
|
|
941
945
|
const sizeClass = typeof size === "string" ? sizeMap[size] : "";
|
|
942
946
|
const customSizeStyle = typeof size === "number" ? { width: size, height: size } : {};
|
|
943
|
-
return /* @__PURE__ */
|
|
947
|
+
return /* @__PURE__ */ React3.createElement("div", { className: cn("relative inline-block", className), onClick }, /* @__PURE__ */ React3.createElement(Avatar, { className: cn(sizeClass, onClick && "cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all"), style: customSizeStyle }, src && /* @__PURE__ */ React3.createElement(AvatarImage, { src, alt: name || "Avatar", className: "object-cover" }), /* @__PURE__ */ React3.createElement(AvatarFallback, { className: "bg-primary/10 text-primary-foreground" }, name ? name.substring(0, 2).toUpperCase() : "??")), mood && /* @__PURE__ */ React3.createElement(
|
|
944
948
|
"div",
|
|
945
949
|
{
|
|
946
950
|
className: cn(
|
|
@@ -949,698 +953,8 @@ var EnhancedAvatar = ({
|
|
|
949
953
|
typeof size === "number" ? size > 60 ? "h-4 w-4" : "h-3 w-3" : size === "large" ? "h-4 w-4" : "h-3 w-3"
|
|
950
954
|
)
|
|
951
955
|
}
|
|
952
|
-
), statusText && /* @__PURE__ */
|
|
956
|
+
), statusText && /* @__PURE__ */ React3.createElement("div", { className: "absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap" }, /* @__PURE__ */ React3.createElement("span", { className: "text-xs text-muted-foreground" }, statusText)));
|
|
953
957
|
};
|
|
954
|
-
var About = ({
|
|
955
|
-
timelineConfig,
|
|
956
|
-
collisionBallsConfig
|
|
957
|
-
}) => {
|
|
958
|
-
return /* @__PURE__ */ React12.createElement("section", { id: "about", className: "py-16 bg-white" }, /* @__PURE__ */ React12.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React12.createElement("h2", { className: "text-3xl font-bold text-center mb-12" }, "\u5173\u4E8E\u6211"), /* @__PURE__ */ React12.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-12" }, /* @__PURE__ */ React12.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React12.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u4E2A\u4EBA\u7ECF\u5386"), /* @__PURE__ */ React12.createElement(Timeline, { items: timelineConfig.items })), /* @__PURE__ */ React12.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React12.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u6280\u80FD\u5C55\u793A"), /* @__PURE__ */ React12.createElement("div", { style: { height: "400px", position: "relative" } }, /* @__PURE__ */ React12.createElement(CollisionBalls, { collisionBallsConfig }))))));
|
|
959
|
-
};
|
|
960
|
-
var About_default = About;
|
|
961
|
-
var Contact = () => {
|
|
962
|
-
const [formData, setFormData] = useState({
|
|
963
|
-
name: "",
|
|
964
|
-
email: "",
|
|
965
|
-
message: ""
|
|
966
|
-
});
|
|
967
|
-
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
968
|
-
const [submitStatus, setSubmitStatus] = useState("idle");
|
|
969
|
-
const handleChange = (e) => {
|
|
970
|
-
const { name, value } = e.target;
|
|
971
|
-
setFormData((prev) => ({
|
|
972
|
-
...prev,
|
|
973
|
-
[name]: value
|
|
974
|
-
}));
|
|
975
|
-
};
|
|
976
|
-
const handleSubmit = async (e) => {
|
|
977
|
-
e.preventDefault();
|
|
978
|
-
setIsSubmitting(true);
|
|
979
|
-
setSubmitStatus("idle");
|
|
980
|
-
try {
|
|
981
|
-
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
982
|
-
setSubmitStatus("success");
|
|
983
|
-
setFormData({ name: "", email: "", message: "" });
|
|
984
|
-
} catch (error) {
|
|
985
|
-
setSubmitStatus("error");
|
|
986
|
-
} finally {
|
|
987
|
-
setIsSubmitting(false);
|
|
988
|
-
}
|
|
989
|
-
};
|
|
990
|
-
return /* @__PURE__ */ React12.createElement("section", { id: "contact", className: "py-16 bg-gray-50" }, /* @__PURE__ */ React12.createElement("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8" }, /* @__PURE__ */ React12.createElement("div", { className: "text-center mb-12" }, /* @__PURE__ */ React12.createElement("h2", { className: "text-3xl font-bold text-gray-900 sm:text-4xl" }, "\u8054\u7CFB\u6211"), /* @__PURE__ */ React12.createElement("p", { className: "mt-4 text-lg text-gray-600" }, "\u6709\u4EFB\u4F55\u95EE\u9898\u6216\u5EFA\u8BAE\uFF1F\u8BF7\u968F\u65F6\u8054\u7CFB\u6211")), /* @__PURE__ */ React12.createElement("div", { className: "bg-white rounded-lg shadow-xl p-6 sm:p-8" }, /* @__PURE__ */ React12.createElement("form", { onSubmit: handleSubmit, className: "space-y-6" }, /* @__PURE__ */ React12.createElement("div", null, /* @__PURE__ */ React12.createElement("label", { htmlFor: "name", className: "block text-sm font-medium text-gray-700" }, "\u59D3\u540D"), /* @__PURE__ */ React12.createElement(
|
|
991
|
-
"input",
|
|
992
|
-
{
|
|
993
|
-
type: "text",
|
|
994
|
-
name: "name",
|
|
995
|
-
id: "name",
|
|
996
|
-
value: formData.name,
|
|
997
|
-
onChange: handleChange,
|
|
998
|
-
required: true,
|
|
999
|
-
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
1000
|
-
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u59D3\u540D"
|
|
1001
|
-
}
|
|
1002
|
-
)), /* @__PURE__ */ React12.createElement("div", null, /* @__PURE__ */ React12.createElement("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700" }, "\u90AE\u7BB1"), /* @__PURE__ */ React12.createElement(
|
|
1003
|
-
"input",
|
|
1004
|
-
{
|
|
1005
|
-
type: "email",
|
|
1006
|
-
name: "email",
|
|
1007
|
-
id: "email",
|
|
1008
|
-
value: formData.email,
|
|
1009
|
-
onChange: handleChange,
|
|
1010
|
-
required: true,
|
|
1011
|
-
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
1012
|
-
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u90AE\u7BB1"
|
|
1013
|
-
}
|
|
1014
|
-
)), /* @__PURE__ */ React12.createElement("div", null, /* @__PURE__ */ React12.createElement("label", { htmlFor: "message", className: "block text-sm font-medium text-gray-700" }, "\u6D88\u606F"), /* @__PURE__ */ React12.createElement(
|
|
1015
|
-
"textarea",
|
|
1016
|
-
{
|
|
1017
|
-
name: "message",
|
|
1018
|
-
id: "message",
|
|
1019
|
-
rows: 4,
|
|
1020
|
-
value: formData.message,
|
|
1021
|
-
onChange: handleChange,
|
|
1022
|
-
required: true,
|
|
1023
|
-
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
1024
|
-
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u6D88\u606F"
|
|
1025
|
-
}
|
|
1026
|
-
)), /* @__PURE__ */ React12.createElement("div", { className: "flex items-center justify-end" }, /* @__PURE__ */ React12.createElement(
|
|
1027
|
-
"button",
|
|
1028
|
-
{
|
|
1029
|
-
type: "submit",
|
|
1030
|
-
disabled: isSubmitting,
|
|
1031
|
-
className: clsx("inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white", isSubmitting ? "bg-blue-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500")
|
|
1032
|
-
},
|
|
1033
|
-
isSubmitting ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001\u6D88\u606F"
|
|
1034
|
-
)), submitStatus === "success" && /* @__PURE__ */ React12.createElement("div", { className: "rounded-md bg-green-50 p-4" }, /* @__PURE__ */ React12.createElement("div", { className: "flex" }, /* @__PURE__ */ React12.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React12.createElement("svg", { className: "h-5 w-5 text-green-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React12.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }))), /* @__PURE__ */ React12.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React12.createElement("p", { className: "text-sm font-medium text-green-800" }, "\u6D88\u606F\u5DF2\u6210\u529F\u53D1\u9001\uFF01")))), submitStatus === "error" && /* @__PURE__ */ React12.createElement("div", { className: "rounded-md bg-red-50 p-4" }, /* @__PURE__ */ React12.createElement("div", { className: "flex" }, /* @__PURE__ */ React12.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React12.createElement("svg", { className: "h-5 w-5 text-red-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React12.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }))), /* @__PURE__ */ React12.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React12.createElement("p", { className: "text-sm font-medium text-red-800" }, "\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")))))), /* @__PURE__ */ React12.createElement("div", { className: "mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3" }, /* @__PURE__ */ React12.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React12.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React12.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React12.createElement("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" }))), /* @__PURE__ */ React12.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u90AE\u7BB1"), /* @__PURE__ */ React12.createElement("p", { className: "mt-2 text-gray-600" }, "your.email@example.com")), /* @__PURE__ */ React12.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React12.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React12.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React12.createElement("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" }))), /* @__PURE__ */ React12.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u7535\u8BDD"), /* @__PURE__ */ React12.createElement("p", { className: "mt-2 text-gray-600" }, "+86 123 4567 8900")), /* @__PURE__ */ React12.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React12.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React12.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React12.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" }), /* @__PURE__ */ React12.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z" }))), /* @__PURE__ */ React12.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u5730\u5740"), /* @__PURE__ */ React12.createElement("p", { className: "mt-2 text-gray-600" }, "\u4E2D\u56FD\uFF0C\u5317\u4EAC")))));
|
|
1035
|
-
};
|
|
1036
|
-
var Contact_default = Contact;
|
|
1037
|
-
var Home = ({ homeConfig, className }) => {
|
|
1038
|
-
const { title, subtitle, buttons, imageSrc } = homeConfig;
|
|
1039
|
-
const [displayText, setDisplayText] = useState("");
|
|
1040
|
-
const [currentIndex, setCurrentIndex] = useState(0);
|
|
1041
|
-
useEffect(() => {
|
|
1042
|
-
if (currentIndex < title.length) {
|
|
1043
|
-
const timer = setTimeout(() => {
|
|
1044
|
-
setDisplayText((prev) => prev + title[currentIndex]);
|
|
1045
|
-
setCurrentIndex((prev) => prev + 1);
|
|
1046
|
-
}, 150);
|
|
1047
|
-
return () => clearTimeout(timer);
|
|
1048
|
-
}
|
|
1049
|
-
return () => {
|
|
1050
|
-
setDisplayText("");
|
|
1051
|
-
setCurrentIndex(0);
|
|
1052
|
-
};
|
|
1053
|
-
}, [currentIndex, title]);
|
|
1054
|
-
return /* @__PURE__ */ React12.createElement(
|
|
1055
|
-
"section",
|
|
1056
|
-
{
|
|
1057
|
-
id: "home",
|
|
1058
|
-
className: cn("min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50", className)
|
|
1059
|
-
},
|
|
1060
|
-
/* @__PURE__ */ React12.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React12.createElement("div", { className: "flex flex-col md:flex-row items-center gap-12" }, /* @__PURE__ */ React12.createElement("div", { className: "flex-1 text-center md:text-left" }, /* @__PURE__ */ React12.createElement("h1", { className: "text-4xl md:text-6xl font-bold mb-6 text-gray-900" }, /* @__PURE__ */ React12.createElement("span", { className: "inline-block" }, displayText), /* @__PURE__ */ React12.createElement("span", { className: "animate-pulse ml-1 text-blue-500" }, "|")), /* @__PURE__ */ React12.createElement("p", { className: "text-xl md:text-2xl text-gray-600 mb-8" }, subtitle), /* @__PURE__ */ React12.createElement("div", { className: "flex flex-wrap gap-4 justify-center md:justify-start" }, buttons.map((button) => /* @__PURE__ */ React12.createElement(
|
|
1061
|
-
"a",
|
|
1062
|
-
{
|
|
1063
|
-
key: button.link,
|
|
1064
|
-
href: button.link,
|
|
1065
|
-
className: "px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium"
|
|
1066
|
-
},
|
|
1067
|
-
button.text
|
|
1068
|
-
)))), /* @__PURE__ */ React12.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React12.createElement("div", { className: "relative group" }, /* @__PURE__ */ React12.createElement("div", { className: "absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200" }), /* @__PURE__ */ React12.createElement(
|
|
1069
|
-
"img",
|
|
1070
|
-
{
|
|
1071
|
-
src: imageSrc,
|
|
1072
|
-
alt: "Profile",
|
|
1073
|
-
className: "relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white"
|
|
1074
|
-
}
|
|
1075
|
-
)))))
|
|
1076
|
-
);
|
|
1077
|
-
};
|
|
1078
|
-
var Home_default = Home;
|
|
1079
|
-
var ExperimentCard = ({
|
|
1080
|
-
href,
|
|
1081
|
-
title,
|
|
1082
|
-
description,
|
|
1083
|
-
tags,
|
|
1084
|
-
category,
|
|
1085
|
-
isCompleted,
|
|
1086
|
-
updatedAt,
|
|
1087
|
-
createdAt,
|
|
1088
|
-
className
|
|
1089
|
-
}) => {
|
|
1090
|
-
const formatDate = (dateString) => {
|
|
1091
|
-
if (!dateString) return "";
|
|
1092
|
-
try {
|
|
1093
|
-
const date = new Date(dateString);
|
|
1094
|
-
return date.toLocaleDateString("zh-CN", {
|
|
1095
|
-
year: "numeric",
|
|
1096
|
-
month: "2-digit",
|
|
1097
|
-
day: "2-digit"
|
|
1098
|
-
});
|
|
1099
|
-
} catch (e) {
|
|
1100
|
-
return dateString;
|
|
1101
|
-
}
|
|
1102
|
-
};
|
|
1103
|
-
return /* @__PURE__ */ React12.createElement(Link, { href, className: cn("block group", className) }, /* @__PURE__ */ React12.createElement("div", { className: "w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200" }, /* @__PURE__ */ React12.createElement("div", { className: "p-6" }, /* @__PURE__ */ React12.createElement("div", { className: "flex items-start justify-between mb-4" }, /* @__PURE__ */ React12.createElement("h3", { className: "text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight" }, title), /* @__PURE__ */ React12.createElement("div", { className: "flex flex-col gap-2 flex-shrink-0" }, /* @__PURE__ */ React12.createElement("span", { className: cn(
|
|
1104
|
-
"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm",
|
|
1105
|
-
category === "utility" ? "bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200" : "bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200"
|
|
1106
|
-
) }, category === "utility" ? "\u{1F527} \u5B9E\u7528\u5DE5\u5177" : "\u{1F3AE} \u4F11\u95F2\u5A31\u4E50"), /* @__PURE__ */ React12.createElement("span", { className: cn(
|
|
1107
|
-
"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border",
|
|
1108
|
-
isCompleted ? "bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200" : "bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200"
|
|
1109
|
-
) }, isCompleted ? "\u2705 \u5DF2\u5B8C\u6210" : "\u{1F6A7} \u8FDB\u884C\u4E2D"))), /* @__PURE__ */ React12.createElement("p", { className: "text-gray-600 mb-4" }, description), updatedAt && /* @__PURE__ */ React12.createElement("div", { className: "flex items-center gap-1 mb-3 text-xs text-gray-500" }, /* @__PURE__ */ React12.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React12.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" })), /* @__PURE__ */ React12.createElement("span", null, "\u66F4\u65B0\u4E8E: ", formatDate(updatedAt)), createdAt && createdAt !== updatedAt && /* @__PURE__ */ React12.createElement("span", { className: "ml-2 text-gray-400" }, "\u521B\u5EFA\u4E8E: ", formatDate(createdAt))), /* @__PURE__ */ React12.createElement("div", { className: "flex flex-wrap gap-2" }, tags.map((tag) => /* @__PURE__ */ React12.createElement(
|
|
1110
|
-
"span",
|
|
1111
|
-
{
|
|
1112
|
-
key: tag,
|
|
1113
|
-
className: "px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200"
|
|
1114
|
-
},
|
|
1115
|
-
"#",
|
|
1116
|
-
tag
|
|
1117
|
-
))))));
|
|
1118
|
-
};
|
|
1119
|
-
var ProjectCarousel = ({ projects, className }) => {
|
|
1120
|
-
const [currentIndex, setCurrentIndex] = useState(0);
|
|
1121
|
-
const nextSlide = () => {
|
|
1122
|
-
setCurrentIndex(
|
|
1123
|
-
(prevIndex) => prevIndex === projects.length - 1 ? 0 : prevIndex + 1
|
|
1124
|
-
);
|
|
1125
|
-
};
|
|
1126
|
-
const prevSlide = () => {
|
|
1127
|
-
setCurrentIndex(
|
|
1128
|
-
(prevIndex) => prevIndex === 0 ? projects.length - 1 : prevIndex - 1
|
|
1129
|
-
);
|
|
1130
|
-
};
|
|
1131
|
-
return /* @__PURE__ */ React12.createElement("section", { id: "projects", className: cn("py-16 bg-gray-50", className) }, /* @__PURE__ */ React12.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React12.createElement("h2", { className: "text-3xl font-bold text-center mb-12 text-gray-900" }, "\u9879\u76EE\u5C55\u793A"), /* @__PURE__ */ React12.createElement("div", { className: "relative max-w-4xl mx-auto" }, /* @__PURE__ */ React12.createElement("div", { className: "relative h-[400px] overflow-hidden rounded-lg shadow-xl" }, projects.map((project, index) => /* @__PURE__ */ React12.createElement(
|
|
1132
|
-
"div",
|
|
1133
|
-
{
|
|
1134
|
-
key: project.id,
|
|
1135
|
-
className: cn(
|
|
1136
|
-
"absolute w-full h-full transition-all duration-500 transform",
|
|
1137
|
-
index === currentIndex ? "translate-x-0 opacity-100" : index < currentIndex ? "-translate-x-full opacity-0" : "translate-x-full opacity-0"
|
|
1138
|
-
)
|
|
1139
|
-
},
|
|
1140
|
-
/* @__PURE__ */ React12.createElement(
|
|
1141
|
-
ExperimentCard,
|
|
1142
|
-
{
|
|
1143
|
-
href: project.link || "#",
|
|
1144
|
-
title: project.title,
|
|
1145
|
-
description: project.description,
|
|
1146
|
-
tags: project.tags,
|
|
1147
|
-
category: "utility"
|
|
1148
|
-
}
|
|
1149
|
-
)
|
|
1150
|
-
))), /* @__PURE__ */ React12.createElement(
|
|
1151
|
-
"button",
|
|
1152
|
-
{
|
|
1153
|
-
onClick: prevSlide,
|
|
1154
|
-
className: "absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]"
|
|
1155
|
-
},
|
|
1156
|
-
/* @__PURE__ */ React12.createElement(
|
|
1157
|
-
"svg",
|
|
1158
|
-
{
|
|
1159
|
-
className: "w-6 h-6 text-gray-600",
|
|
1160
|
-
fill: "none",
|
|
1161
|
-
stroke: "currentColor",
|
|
1162
|
-
viewBox: "0 0 24 24"
|
|
1163
|
-
},
|
|
1164
|
-
/* @__PURE__ */ React12.createElement(
|
|
1165
|
-
"path",
|
|
1166
|
-
{
|
|
1167
|
-
strokeLinecap: "round",
|
|
1168
|
-
strokeLinejoin: "round",
|
|
1169
|
-
strokeWidth: 2,
|
|
1170
|
-
d: "M15 19l-7-7 7-7"
|
|
1171
|
-
}
|
|
1172
|
-
)
|
|
1173
|
-
)
|
|
1174
|
-
), /* @__PURE__ */ React12.createElement(
|
|
1175
|
-
"button",
|
|
1176
|
-
{
|
|
1177
|
-
onClick: nextSlide,
|
|
1178
|
-
className: "absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]"
|
|
1179
|
-
},
|
|
1180
|
-
/* @__PURE__ */ React12.createElement(
|
|
1181
|
-
"svg",
|
|
1182
|
-
{
|
|
1183
|
-
className: "w-6 h-6 text-gray-600",
|
|
1184
|
-
fill: "none",
|
|
1185
|
-
stroke: "currentColor",
|
|
1186
|
-
viewBox: "0 0 24 24"
|
|
1187
|
-
},
|
|
1188
|
-
/* @__PURE__ */ React12.createElement(
|
|
1189
|
-
"path",
|
|
1190
|
-
{
|
|
1191
|
-
strokeLinecap: "round",
|
|
1192
|
-
strokeLinejoin: "round",
|
|
1193
|
-
strokeWidth: 2,
|
|
1194
|
-
d: "M9 5l7 7-7 7"
|
|
1195
|
-
}
|
|
1196
|
-
)
|
|
1197
|
-
)
|
|
1198
|
-
), /* @__PURE__ */ React12.createElement("div", { className: "absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-[10]" }, projects.map((_, index) => /* @__PURE__ */ React12.createElement(
|
|
1199
|
-
"button",
|
|
1200
|
-
{
|
|
1201
|
-
key: index,
|
|
1202
|
-
onClick: () => setCurrentIndex(index),
|
|
1203
|
-
className: cn(
|
|
1204
|
-
"w-2 h-2 rounded-full transition-all duration-300",
|
|
1205
|
-
index === currentIndex ? "bg-blue-500 w-4" : "bg-gray-300"
|
|
1206
|
-
)
|
|
1207
|
-
}
|
|
1208
|
-
))))));
|
|
1209
|
-
};
|
|
1210
|
-
var NavigationItemComponent = ({
|
|
1211
|
-
item,
|
|
1212
|
-
direction,
|
|
1213
|
-
isActive,
|
|
1214
|
-
onClick
|
|
1215
|
-
}) => {
|
|
1216
|
-
const handleClick = (e) => {
|
|
1217
|
-
e.preventDefault();
|
|
1218
|
-
onClick(item);
|
|
1219
|
-
};
|
|
1220
|
-
const getItemClasses = () => {
|
|
1221
|
-
const baseClasses = `
|
|
1222
|
-
group relative flex items-center gap-3
|
|
1223
|
-
transition-all duration-300 ease-in-out
|
|
1224
|
-
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50
|
|
1225
|
-
rounded-lg
|
|
1226
|
-
`;
|
|
1227
|
-
const directionClasses = direction === "vertical" ? "px-4 py-3 w-full justify-start" : "px-3 py-2 justify-center";
|
|
1228
|
-
const stateClasses = isActive ? "bg-blue-500 text-white shadow-lg" : item.isExternal ? "text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200" : "text-gray-700 hover:bg-blue-50 hover:text-blue-600";
|
|
1229
|
-
return baseClasses + " " + directionClasses + " " + stateClasses;
|
|
1230
|
-
};
|
|
1231
|
-
return /* @__PURE__ */ React12.createElement(
|
|
1232
|
-
"a",
|
|
1233
|
-
{
|
|
1234
|
-
href: item.href,
|
|
1235
|
-
onClick: handleClick,
|
|
1236
|
-
target: item.target,
|
|
1237
|
-
rel: item.isExternal ? "noopener noreferrer" : void 0,
|
|
1238
|
-
className: getItemClasses()
|
|
1239
|
-
},
|
|
1240
|
-
item.icon && /* @__PURE__ */ React12.createElement("span", { className: "flex-shrink-0" }, item.icon),
|
|
1241
|
-
/* @__PURE__ */ React12.createElement("span", { className: clsx("font-medium", direction === "vertical" ? "text-sm" : "text-xs") }, item.label),
|
|
1242
|
-
item.isExternal && /* @__PURE__ */ React12.createElement(
|
|
1243
|
-
"svg",
|
|
1244
|
-
{
|
|
1245
|
-
className: "w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity",
|
|
1246
|
-
fill: "none",
|
|
1247
|
-
stroke: "currentColor",
|
|
1248
|
-
viewBox: "0 0 24 24"
|
|
1249
|
-
},
|
|
1250
|
-
/* @__PURE__ */ React12.createElement(
|
|
1251
|
-
"path",
|
|
1252
|
-
{
|
|
1253
|
-
strokeLinecap: "round",
|
|
1254
|
-
strokeLinejoin: "round",
|
|
1255
|
-
strokeWidth: 2,
|
|
1256
|
-
d: "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
|
|
1257
|
-
}
|
|
1258
|
-
)
|
|
1259
|
-
),
|
|
1260
|
-
direction === "vertical" && isActive && /* @__PURE__ */ React12.createElement("div", { className: "absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full" })
|
|
1261
|
-
);
|
|
1262
|
-
};
|
|
1263
|
-
var NavigationItem_default = NavigationItemComponent;
|
|
1264
|
-
var Navigation = ({
|
|
1265
|
-
config,
|
|
1266
|
-
isOpen,
|
|
1267
|
-
activeItemId,
|
|
1268
|
-
onItemClick,
|
|
1269
|
-
className = ""
|
|
1270
|
-
}) => {
|
|
1271
|
-
const { direction, position, items, avatar, logo } = config;
|
|
1272
|
-
const getContainerClasses = () => {
|
|
1273
|
-
const baseClasses = `
|
|
1274
|
-
fixed z-[90]
|
|
1275
|
-
bg-white/95 backdrop-blur-lg
|
|
1276
|
-
border border-gray-200/50
|
|
1277
|
-
shadow-2xl
|
|
1278
|
-
transition-all duration-500 ease-in-out
|
|
1279
|
-
`;
|
|
1280
|
-
if (direction === "vertical") {
|
|
1281
|
-
const verticalClasses = "h-screen w-64 flex flex-col";
|
|
1282
|
-
const positionClasses = position === "left" ? "left-0 top-0 " + (isOpen ? "translate-x-0" : "-translate-x-full") : "right-0 top-0 " + (isOpen ? "translate-x-0" : "translate-x-full");
|
|
1283
|
-
return baseClasses + " " + verticalClasses + " " + positionClasses;
|
|
1284
|
-
} else {
|
|
1285
|
-
const horizontalClasses = "w-full h-16 flex items-center";
|
|
1286
|
-
const positionClasses = position === "top" ? "top-0 left-0 right-0 " + (isOpen ? "translate-y-0" : "-translate-y-full") : "bottom-0 left-0 right-0 " + (isOpen ? "translate-y-0" : "translate-y-full");
|
|
1287
|
-
return baseClasses + " " + horizontalClasses + " " + positionClasses;
|
|
1288
|
-
}
|
|
1289
|
-
};
|
|
1290
|
-
const getContentClasses = () => {
|
|
1291
|
-
if (direction === "vertical") {
|
|
1292
|
-
return "flex flex-col h-full p-4";
|
|
1293
|
-
} else {
|
|
1294
|
-
return "flex items-center justify-between w-full px-6";
|
|
1295
|
-
}
|
|
1296
|
-
};
|
|
1297
|
-
const getItemsListClasses = () => {
|
|
1298
|
-
if (direction === "vertical") {
|
|
1299
|
-
return "flex flex-col gap-2 flex-1 overflow-y-auto mt-4";
|
|
1300
|
-
} else {
|
|
1301
|
-
return "flex items-center gap-4";
|
|
1302
|
-
}
|
|
1303
|
-
};
|
|
1304
|
-
const handleItemClick = (item) => {
|
|
1305
|
-
if (item.isExternal) {
|
|
1306
|
-
window.open(item.href, item.target || "_blank");
|
|
1307
|
-
} else if (item.href.startsWith("#")) {
|
|
1308
|
-
const element = document.getElementById(item.id);
|
|
1309
|
-
if (element) {
|
|
1310
|
-
element.scrollIntoView({ behavior: "smooth" });
|
|
1311
|
-
}
|
|
1312
|
-
} else {
|
|
1313
|
-
window.location.href = item.href;
|
|
1314
|
-
}
|
|
1315
|
-
onItemClick?.(item);
|
|
1316
|
-
};
|
|
1317
|
-
if (!isOpen) return null;
|
|
1318
|
-
return /* @__PURE__ */ React12.createElement("nav", { className: clsx(getContainerClasses(), className) }, /* @__PURE__ */ React12.createElement("div", { className: getContentClasses() }, logo && /* @__PURE__ */ React12.createElement("div", { className: "flex items-center justify-center mb-4" }, /* @__PURE__ */ React12.createElement(
|
|
1319
|
-
"img",
|
|
1320
|
-
{
|
|
1321
|
-
src: logo.src,
|
|
1322
|
-
alt: logo.alt || "Logo",
|
|
1323
|
-
className: "h-8 w-auto"
|
|
1324
|
-
}
|
|
1325
|
-
)), direction === "vertical" && /* @__PURE__ */ React12.createElement("div", { className: "h-12 flex-shrink-0" }), /* @__PURE__ */ React12.createElement("div", { className: getItemsListClasses() }, items.map((item) => /* @__PURE__ */ React12.createElement(
|
|
1326
|
-
NavigationItem_default,
|
|
1327
|
-
{
|
|
1328
|
-
key: item.id,
|
|
1329
|
-
item,
|
|
1330
|
-
direction,
|
|
1331
|
-
isActive: activeItemId === item.id,
|
|
1332
|
-
onClick: handleItemClick
|
|
1333
|
-
}
|
|
1334
|
-
))), avatar && direction === "vertical" && /* @__PURE__ */ React12.createElement("div", { className: "flex items-center justify-center mt-auto pt-4" }, /* @__PURE__ */ React12.createElement(
|
|
1335
|
-
"img",
|
|
1336
|
-
{
|
|
1337
|
-
src: avatar.src,
|
|
1338
|
-
alt: avatar.alt || "Avatar",
|
|
1339
|
-
className: "w-10 h-10 rounded-full border-2 border-gray-200"
|
|
1340
|
-
}
|
|
1341
|
-
)), avatar && direction === "horizontal" && /* @__PURE__ */ React12.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React12.createElement(
|
|
1342
|
-
"img",
|
|
1343
|
-
{
|
|
1344
|
-
src: avatar.src,
|
|
1345
|
-
alt: avatar.alt || "Avatar",
|
|
1346
|
-
className: "w-8 h-8 rounded-full border-2 border-gray-200"
|
|
1347
|
-
}
|
|
1348
|
-
))));
|
|
1349
|
-
};
|
|
1350
|
-
var Navigation_default = Navigation;
|
|
1351
|
-
var NavigationToggle = ({
|
|
1352
|
-
isOpen,
|
|
1353
|
-
onClick,
|
|
1354
|
-
position
|
|
1355
|
-
}) => {
|
|
1356
|
-
const getPositionClasses = () => {
|
|
1357
|
-
switch (position) {
|
|
1358
|
-
case "top":
|
|
1359
|
-
return "top-4 left-4";
|
|
1360
|
-
case "bottom":
|
|
1361
|
-
return "bottom-4 left-4";
|
|
1362
|
-
case "left":
|
|
1363
|
-
return "top-4 left-4";
|
|
1364
|
-
case "right":
|
|
1365
|
-
return "top-4 right-4";
|
|
1366
|
-
default:
|
|
1367
|
-
return "top-4 left-4";
|
|
1368
|
-
}
|
|
1369
|
-
};
|
|
1370
|
-
return /* @__PURE__ */ React12.createElement(
|
|
1371
|
-
"button",
|
|
1372
|
-
{
|
|
1373
|
-
onClick,
|
|
1374
|
-
className: clsx(
|
|
1375
|
-
"fixed",
|
|
1376
|
-
getPositionClasses(),
|
|
1377
|
-
"z-[100] p-3 rounded-xl bg-white/90 backdrop-blur-md shadow-lg hover:shadow-xl border border-gray-200/50 transition-all duration-300 ease-in-out hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50"
|
|
1378
|
-
),
|
|
1379
|
-
"aria-label": isOpen ? "\u5173\u95ED\u5BFC\u822A\u680F" : "\u6253\u5F00\u5BFC\u822A\u680F"
|
|
1380
|
-
},
|
|
1381
|
-
/* @__PURE__ */ React12.createElement("div", { className: "w-5 h-5 flex flex-col justify-center items-center" }, /* @__PURE__ */ React12.createElement(
|
|
1382
|
-
"span",
|
|
1383
|
-
{
|
|
1384
|
-
className: clsx(
|
|
1385
|
-
"block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out",
|
|
1386
|
-
isOpen ? "rotate-45 translate-y-0.5" : ""
|
|
1387
|
-
)
|
|
1388
|
-
}
|
|
1389
|
-
), /* @__PURE__ */ React12.createElement(
|
|
1390
|
-
"span",
|
|
1391
|
-
{
|
|
1392
|
-
className: clsx(
|
|
1393
|
-
"block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1",
|
|
1394
|
-
isOpen ? "opacity-0 scale-0" : "opacity-100 scale-100"
|
|
1395
|
-
)
|
|
1396
|
-
}
|
|
1397
|
-
), /* @__PURE__ */ React12.createElement(
|
|
1398
|
-
"span",
|
|
1399
|
-
{
|
|
1400
|
-
className: clsx(
|
|
1401
|
-
"block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1",
|
|
1402
|
-
isOpen ? "-rotate-45 -translate-y-2.5" : ""
|
|
1403
|
-
)
|
|
1404
|
-
}
|
|
1405
|
-
))
|
|
1406
|
-
);
|
|
1407
|
-
};
|
|
1408
|
-
var NavigationToggle_default = NavigationToggle;
|
|
1409
|
-
var FloatingMenu = ({
|
|
1410
|
-
trigger,
|
|
1411
|
-
menu,
|
|
1412
|
-
initialPosition = { x: 20, y: 20 },
|
|
1413
|
-
defaultOpen = false,
|
|
1414
|
-
className = "",
|
|
1415
|
-
menuClassName = "",
|
|
1416
|
-
triggerClassName = "",
|
|
1417
|
-
zIndex = 1e3
|
|
1418
|
-
}) => {
|
|
1419
|
-
const [position, setPosition] = useState(initialPosition);
|
|
1420
|
-
const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);
|
|
1421
|
-
const [menuDirection, setMenuDirection] = useState("right");
|
|
1422
|
-
const [isDragging, setIsDragging] = useState(false);
|
|
1423
|
-
const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });
|
|
1424
|
-
const containerRef = useRef(null);
|
|
1425
|
-
const [mounted, setMounted] = useState(false);
|
|
1426
|
-
const [hasDragged, setHasDragged] = useState(false);
|
|
1427
|
-
const dragTimerRef = useRef(null);
|
|
1428
|
-
const mouseDownPosRef = useRef(null);
|
|
1429
|
-
useEffect(() => {
|
|
1430
|
-
setMounted(true);
|
|
1431
|
-
return () => setMounted(false);
|
|
1432
|
-
}, []);
|
|
1433
|
-
useEffect(() => {
|
|
1434
|
-
if (!mounted || !containerRef.current) return;
|
|
1435
|
-
const updateMenuDirection = () => {
|
|
1436
|
-
const rect = containerRef.current?.getBoundingClientRect();
|
|
1437
|
-
if (!rect) return;
|
|
1438
|
-
const windowWidth = window.innerWidth;
|
|
1439
|
-
const middlePoint = windowWidth / 2;
|
|
1440
|
-
setMenuDirection(rect.left < middlePoint ? "right" : "left");
|
|
1441
|
-
};
|
|
1442
|
-
updateMenuDirection();
|
|
1443
|
-
window.addEventListener("resize", updateMenuDirection);
|
|
1444
|
-
window.addEventListener("scroll", updateMenuDirection);
|
|
1445
|
-
return () => {
|
|
1446
|
-
window.removeEventListener("resize", updateMenuDirection);
|
|
1447
|
-
window.removeEventListener("scroll", updateMenuDirection);
|
|
1448
|
-
};
|
|
1449
|
-
}, [mounted]);
|
|
1450
|
-
const handleMouseDown = (e) => {
|
|
1451
|
-
if (!containerRef.current) return;
|
|
1452
|
-
e.stopPropagation();
|
|
1453
|
-
mouseDownPosRef.current = { x: e.clientX, y: e.clientY };
|
|
1454
|
-
const rect = containerRef.current.getBoundingClientRect();
|
|
1455
|
-
setDragOffset({
|
|
1456
|
-
x: e.clientX - rect.left,
|
|
1457
|
-
y: e.clientY - rect.top
|
|
1458
|
-
});
|
|
1459
|
-
setHasDragged(false);
|
|
1460
|
-
setIsDragging(true);
|
|
1461
|
-
};
|
|
1462
|
-
useEffect(() => {
|
|
1463
|
-
if (!isDragging) return;
|
|
1464
|
-
const handleMouseMove = (e) => {
|
|
1465
|
-
if (mouseDownPosRef.current) {
|
|
1466
|
-
const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);
|
|
1467
|
-
const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);
|
|
1468
|
-
if (dx > 3 || dy > 3) {
|
|
1469
|
-
setHasDragged(true);
|
|
1470
|
-
}
|
|
1471
|
-
}
|
|
1472
|
-
const newX = e.clientX - dragOffset.x;
|
|
1473
|
-
const newY = e.clientY - dragOffset.y;
|
|
1474
|
-
const windowWidth = window.innerWidth;
|
|
1475
|
-
const windowHeight = window.innerHeight;
|
|
1476
|
-
setPosition({
|
|
1477
|
-
x: Math.min(Math.max(newX, 0), windowWidth - 50),
|
|
1478
|
-
y: Math.min(Math.max(newY, 0), windowHeight - 50)
|
|
1479
|
-
});
|
|
1480
|
-
};
|
|
1481
|
-
const handleMouseUp = () => {
|
|
1482
|
-
setIsDragging(false);
|
|
1483
|
-
mouseDownPosRef.current = null;
|
|
1484
|
-
if (dragTimerRef.current) {
|
|
1485
|
-
window.clearTimeout(dragTimerRef.current);
|
|
1486
|
-
}
|
|
1487
|
-
dragTimerRef.current = window.setTimeout(() => {
|
|
1488
|
-
setHasDragged(false);
|
|
1489
|
-
}, 300);
|
|
1490
|
-
};
|
|
1491
|
-
document.addEventListener("mousemove", handleMouseMove);
|
|
1492
|
-
document.addEventListener("mouseup", handleMouseUp);
|
|
1493
|
-
return () => {
|
|
1494
|
-
document.removeEventListener("mousemove", handleMouseMove);
|
|
1495
|
-
document.removeEventListener("mouseup", handleMouseUp);
|
|
1496
|
-
};
|
|
1497
|
-
}, [isDragging, dragOffset]);
|
|
1498
|
-
useEffect(() => {
|
|
1499
|
-
return () => {
|
|
1500
|
-
if (dragTimerRef.current) {
|
|
1501
|
-
window.clearTimeout(dragTimerRef.current);
|
|
1502
|
-
}
|
|
1503
|
-
};
|
|
1504
|
-
}, []);
|
|
1505
|
-
const toggleMenu = (e) => {
|
|
1506
|
-
e.stopPropagation();
|
|
1507
|
-
if (hasDragged) {
|
|
1508
|
-
return;
|
|
1509
|
-
}
|
|
1510
|
-
setIsMenuOpen(!isMenuOpen);
|
|
1511
|
-
};
|
|
1512
|
-
useEffect(() => {
|
|
1513
|
-
if (!isMenuOpen) return;
|
|
1514
|
-
const handleClickOutside = (e) => {
|
|
1515
|
-
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
1516
|
-
setIsMenuOpen(false);
|
|
1517
|
-
}
|
|
1518
|
-
};
|
|
1519
|
-
document.addEventListener("mousedown", handleClickOutside);
|
|
1520
|
-
return () => {
|
|
1521
|
-
document.removeEventListener("mousedown", handleClickOutside);
|
|
1522
|
-
};
|
|
1523
|
-
}, [isMenuOpen]);
|
|
1524
|
-
useEffect(() => {
|
|
1525
|
-
if (!mounted) return;
|
|
1526
|
-
const checkBoundaries = () => {
|
|
1527
|
-
const windowWidth = window.innerWidth;
|
|
1528
|
-
const windowHeight = window.innerHeight;
|
|
1529
|
-
setPosition((prev) => {
|
|
1530
|
-
const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);
|
|
1531
|
-
const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);
|
|
1532
|
-
if (newX !== prev.x || newY !== prev.y) {
|
|
1533
|
-
return { x: newX, y: newY };
|
|
1534
|
-
}
|
|
1535
|
-
return prev;
|
|
1536
|
-
});
|
|
1537
|
-
};
|
|
1538
|
-
window.addEventListener("resize", checkBoundaries);
|
|
1539
|
-
return () => {
|
|
1540
|
-
window.removeEventListener("resize", checkBoundaries);
|
|
1541
|
-
};
|
|
1542
|
-
}, [mounted]);
|
|
1543
|
-
if (!mounted) return null;
|
|
1544
|
-
return createPortal(
|
|
1545
|
-
/* @__PURE__ */ React12.createElement(
|
|
1546
|
-
"div",
|
|
1547
|
-
{
|
|
1548
|
-
ref: containerRef,
|
|
1549
|
-
className: clsx("fixed select-none box-border", className),
|
|
1550
|
-
style: {
|
|
1551
|
-
left: position.x + "px",
|
|
1552
|
-
top: position.y + "px",
|
|
1553
|
-
zIndex
|
|
1554
|
-
}
|
|
1555
|
-
},
|
|
1556
|
-
/* @__PURE__ */ React12.createElement(
|
|
1557
|
-
"div",
|
|
1558
|
-
{
|
|
1559
|
-
className: clsx(
|
|
1560
|
-
"flex items-center justify-center w-12 h-12 md:w-12 md:h-12 bg-white rounded-full shadow-md hover:shadow-lg cursor-grab active:cursor-grabbing transition-all duration-200 hover:scale-105 active:scale-95",
|
|
1561
|
-
triggerClassName
|
|
1562
|
-
),
|
|
1563
|
-
onMouseDown: handleMouseDown,
|
|
1564
|
-
onClick: toggleMenu
|
|
1565
|
-
},
|
|
1566
|
-
trigger
|
|
1567
|
-
),
|
|
1568
|
-
isMenuOpen && /* @__PURE__ */ React12.createElement(
|
|
1569
|
-
"div",
|
|
1570
|
-
{
|
|
1571
|
-
className: clsx(
|
|
1572
|
-
"absolute top-0 bg-white rounded-lg shadow-xl p-3 min-w-[200px] md:min-w-[200px] max-w-[300px] z-[1000] transition-all duration-200",
|
|
1573
|
-
isMenuOpen ? "opacity-100 scale-100" : "opacity-0 scale-95",
|
|
1574
|
-
menuDirection === "left" ? "right-[calc(100%+10px)]" : "left-[calc(100%+10px)]",
|
|
1575
|
-
menuClassName
|
|
1576
|
-
),
|
|
1577
|
-
onClick: (e) => e.stopPropagation(),
|
|
1578
|
-
onMouseDown: (e) => e.stopPropagation(),
|
|
1579
|
-
onMouseUp: (e) => e.stopPropagation(),
|
|
1580
|
-
onTouchStart: (e) => e.stopPropagation(),
|
|
1581
|
-
onTouchMove: (e) => e.stopPropagation(),
|
|
1582
|
-
onTouchEnd: (e) => e.stopPropagation(),
|
|
1583
|
-
onPointerDown: (e) => e.stopPropagation(),
|
|
1584
|
-
onPointerUp: (e) => e.stopPropagation()
|
|
1585
|
-
},
|
|
1586
|
-
menu
|
|
1587
|
-
)
|
|
1588
|
-
),
|
|
1589
|
-
document.body
|
|
1590
|
-
);
|
|
1591
|
-
};
|
|
1592
|
-
var FloatingMenu_default = FloatingMenu;
|
|
1593
|
-
var FloatingMenuExample = () => {
|
|
1594
|
-
const [windowWidth, setWindowWidth] = useState(0);
|
|
1595
|
-
useEffect(() => {
|
|
1596
|
-
setWindowWidth(window.innerWidth);
|
|
1597
|
-
const handleResize = () => setWindowWidth(window.innerWidth);
|
|
1598
|
-
window.addEventListener("resize", handleResize);
|
|
1599
|
-
return () => window.removeEventListener("resize", handleResize);
|
|
1600
|
-
}, []);
|
|
1601
|
-
const menuItems = [
|
|
1602
|
-
{ id: 1, label: "\u9996\u9875", icon: "\u{1F3E0}" },
|
|
1603
|
-
{ id: 2, label: "\u8BBE\u7F6E", icon: "\u2699\uFE0F" },
|
|
1604
|
-
{ id: 3, label: "\u6D88\u606F", icon: "\u{1F4E9}" },
|
|
1605
|
-
{ id: 4, label: "\u5E2E\u52A9", icon: "\u2753" },
|
|
1606
|
-
{ id: 5, label: "\u9000\u51FA", icon: "\u{1F6AA}" }
|
|
1607
|
-
];
|
|
1608
|
-
const handleMenuItemClick = (id) => {
|
|
1609
|
-
console.log("\u70B9\u51FB\u4E86\u83DC\u5355\u9879: " + id);
|
|
1610
|
-
};
|
|
1611
|
-
return /* @__PURE__ */ React12.createElement("div", { className: "w-full h-screen bg-gray-100 relative p-8" }, /* @__PURE__ */ React12.createElement("div", { className: "max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12" }, /* @__PURE__ */ React12.createElement("h1", { className: "text-3xl font-bold mb-4 text-gray-900" }, "\u60AC\u6D6E\u83DC\u5355\u793A\u4F8B"), /* @__PURE__ */ React12.createElement("p", { className: "text-gray-600 leading-relaxed mb-6" }, "\u8FD9\u662F\u4E00\u4E2A\u53EF\u62D6\u62FD\u7684\u60AC\u6D6E\u83DC\u5355\u7EC4\u4EF6\u793A\u4F8B\u3002\u4F60\u53EF\u4EE5\u5C1D\u8BD5\u62D6\u52A8\u4E0B\u65B9\u7684 ", /* @__PURE__ */ React12.createElement("span", { className: "font-bold text-blue-600" }, "\u84DD\u8272\u6309\u94AE"), " \u5230\u5904\u79FB\u52A8\u3002"), /* @__PURE__ */ React12.createElement("div", { className: "bg-blue-50 border-l-4 border-blue-500 p-4 mb-6" }, /* @__PURE__ */ React12.createElement("p", { className: "text-sm text-blue-700" }, /* @__PURE__ */ React12.createElement("strong", null, "\u667A\u80FD\u5B9A\u4F4D\uFF1A"), " \u83DC\u5355\u4F1A\u6839\u636E\u6309\u94AE\u5728\u5C4F\u5E55\u4E0A\u7684\u4F4D\u7F6E\u81EA\u52A8\u8C03\u6574\u5F39\u51FA\u65B9\u5411\uFF08\u5411\u5DE6\u6216\u5411\u53F3\uFF09\u3002"))), /* @__PURE__ */ React12.createElement(
|
|
1612
|
-
FloatingMenu_default,
|
|
1613
|
-
{
|
|
1614
|
-
trigger: /* @__PURE__ */ React12.createElement("div", { className: "w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer" }, /* @__PURE__ */ React12.createElement("span", { className: "text-xl" }, "\u2795")),
|
|
1615
|
-
menu: /* @__PURE__ */ React12.createElement("div", { className: "w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden" }, /* @__PURE__ */ React12.createElement("div", { className: "px-4 py-3 border-b border-gray-100" }, /* @__PURE__ */ React12.createElement("h3", { className: "text-sm font-bold text-gray-900" }, "\u5FEB\u6377\u83DC\u5355")), /* @__PURE__ */ React12.createElement("ul", { className: "py-1" }, menuItems.map((item) => /* @__PURE__ */ React12.createElement(
|
|
1616
|
-
"li",
|
|
1617
|
-
{
|
|
1618
|
-
key: item.id,
|
|
1619
|
-
className: "flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm",
|
|
1620
|
-
onClick: () => handleMenuItemClick(item.id)
|
|
1621
|
-
},
|
|
1622
|
-
/* @__PURE__ */ React12.createElement("span", { className: "text-lg" }, item.icon),
|
|
1623
|
-
/* @__PURE__ */ React12.createElement("span", { className: "font-medium" }, item.label)
|
|
1624
|
-
)))),
|
|
1625
|
-
initialPosition: { x: 100, y: 100 }
|
|
1626
|
-
}
|
|
1627
|
-
), windowWidth > 0 && /* @__PURE__ */ React12.createElement(
|
|
1628
|
-
FloatingMenu_default,
|
|
1629
|
-
{
|
|
1630
|
-
trigger: /* @__PURE__ */ React12.createElement("div", { className: "w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer" }, /* @__PURE__ */ React12.createElement("span", { className: "text-xl" }, "\u{1F50D}")),
|
|
1631
|
-
menu: /* @__PURE__ */ React12.createElement("div", { className: "w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4" }, /* @__PURE__ */ React12.createElement("h3", { className: "text-sm font-bold text-gray-900 mb-3" }, "\u5FEB\u901F\u641C\u7D22"), /* @__PURE__ */ React12.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React12.createElement(
|
|
1632
|
-
"input",
|
|
1633
|
-
{
|
|
1634
|
-
type: "text",
|
|
1635
|
-
placeholder: "\u8F93\u5165\u5173\u952E\u5B57...",
|
|
1636
|
-
className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none"
|
|
1637
|
-
}
|
|
1638
|
-
), /* @__PURE__ */ React12.createElement("button", { className: "w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors" }, "\u641C\u7D22"))),
|
|
1639
|
-
initialPosition: { x: windowWidth - 100, y: 100 }
|
|
1640
|
-
}
|
|
1641
|
-
));
|
|
1642
|
-
};
|
|
1643
|
-
var FloatingMenuExample_default = FloatingMenuExample;
|
|
1644
958
|
|
|
1645
959
|
// src/testField/utils/index.ts
|
|
1646
960
|
function filterExperiments(experiments, config) {
|
|
@@ -1825,7 +1139,7 @@ var CategoryFilter = ({
|
|
|
1825
1139
|
showCount: true
|
|
1826
1140
|
}
|
|
1827
1141
|
];
|
|
1828
|
-
return /* @__PURE__ */
|
|
1142
|
+
return /* @__PURE__ */ React3.createElement(
|
|
1829
1143
|
FilterButtonGroup,
|
|
1830
1144
|
{
|
|
1831
1145
|
label: "\u9879\u76EE\u7C7B\u522B",
|
|
@@ -1877,7 +1191,7 @@ var CompletionFilterComponent = ({
|
|
|
1877
1191
|
showCount: true
|
|
1878
1192
|
}
|
|
1879
1193
|
];
|
|
1880
|
-
return /* @__PURE__ */
|
|
1194
|
+
return /* @__PURE__ */ React3.createElement(
|
|
1881
1195
|
FilterButtonGroup,
|
|
1882
1196
|
{
|
|
1883
1197
|
label: "\u5B8C\u6210\u72B6\u6001",
|
|
@@ -1889,10 +1203,10 @@ var CompletionFilterComponent = ({
|
|
|
1889
1203
|
);
|
|
1890
1204
|
};
|
|
1891
1205
|
var PageHeader = ({ counts, className }) => {
|
|
1892
|
-
return /* @__PURE__ */
|
|
1206
|
+
return /* @__PURE__ */ React3.createElement("div", { className }, /* @__PURE__ */ React3.createElement("div", { className: "mb-8" }, /* @__PURE__ */ React3.createElement(BackButton, null)), /* @__PURE__ */ React3.createElement("div", { className: "mb-8" }, /* @__PURE__ */ React3.createElement("h1", { className: "text-3xl font-bold text-gray-900" }, "\u5B9E\u9A8C\u7530"), /* @__PURE__ */ React3.createElement("p", { className: "mt-2 text-sm text-gray-600" }, "\u5728\u8FD9\u91CC\uFF0C\u4F60\u53EF\u4EE5\u5C1D\u8BD5\u5404\u79CD\u5B9E\u9A8C\u6027\u7684\u529F\u80FD\u548C\u9879\u76EE"), /* @__PURE__ */ React3.createElement("div", { className: "mt-4 flex flex-wrap gap-4 text-sm text-gray-500" }, /* @__PURE__ */ React3.createElement("span", null, "\u603B\u8BA1: ", counts.all, " \u4E2A\u9879\u76EE"), /* @__PURE__ */ React3.createElement("span", null, "\u5B9E\u7528\u5DE5\u5177: ", counts.utility, " \u4E2A"), /* @__PURE__ */ React3.createElement("span", null, "\u4F11\u95F2\u5A31\u4E50: ", counts.leisure, " \u4E2A"), /* @__PURE__ */ React3.createElement("span", null, "\u5DF2\u5B8C\u6210: ", counts.completed, " \u4E2A"))));
|
|
1893
1207
|
};
|
|
1894
1208
|
function defaultExperimentRenderer(item) {
|
|
1895
|
-
return /* @__PURE__ */
|
|
1209
|
+
return /* @__PURE__ */ React3.createElement(
|
|
1896
1210
|
ExperimentCard,
|
|
1897
1211
|
{
|
|
1898
1212
|
href: item.path,
|
|
@@ -1914,7 +1228,7 @@ function ExperimentGrid({
|
|
|
1914
1228
|
className = ""
|
|
1915
1229
|
}) {
|
|
1916
1230
|
const itemRenderer = renderItem || ((item) => defaultExperimentRenderer(item));
|
|
1917
|
-
return /* @__PURE__ */
|
|
1231
|
+
return /* @__PURE__ */ React3.createElement(
|
|
1918
1232
|
Grid,
|
|
1919
1233
|
{
|
|
1920
1234
|
items,
|
|
@@ -1929,10 +1243,10 @@ function ExperimentItemGrid({
|
|
|
1929
1243
|
experiments,
|
|
1930
1244
|
...props
|
|
1931
1245
|
}) {
|
|
1932
|
-
return /* @__PURE__ */
|
|
1246
|
+
return /* @__PURE__ */ React3.createElement(ExperimentGrid, { items: experiments, ...props });
|
|
1933
1247
|
}
|
|
1934
1248
|
var EmptyState = ({ searchQuery, onClearSearch, className }) => {
|
|
1935
|
-
return /* @__PURE__ */
|
|
1249
|
+
return /* @__PURE__ */ React3.createElement("div", { className: clsx("text-center py-12", className) }, /* @__PURE__ */ React3.createElement(
|
|
1936
1250
|
"svg",
|
|
1937
1251
|
{
|
|
1938
1252
|
className: "mx-auto h-12 w-12 text-gray-400",
|
|
@@ -1940,7 +1254,7 @@ var EmptyState = ({ searchQuery, onClearSearch, className }) => {
|
|
|
1940
1254
|
stroke: "currentColor",
|
|
1941
1255
|
viewBox: "0 0 24 24"
|
|
1942
1256
|
},
|
|
1943
|
-
/* @__PURE__ */
|
|
1257
|
+
/* @__PURE__ */ React3.createElement(
|
|
1944
1258
|
"path",
|
|
1945
1259
|
{
|
|
1946
1260
|
strokeLinecap: "round",
|
|
@@ -1949,7 +1263,7 @@ var EmptyState = ({ searchQuery, onClearSearch, className }) => {
|
|
|
1949
1263
|
d: "M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.47.904-6.06 2.384"
|
|
1950
1264
|
}
|
|
1951
1265
|
)
|
|
1952
|
-
), /* @__PURE__ */
|
|
1266
|
+
), /* @__PURE__ */ React3.createElement("h3", { className: "mt-2 text-sm font-medium text-gray-900" }, "\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u5B9E\u9A8C\u9879\u76EE"), /* @__PURE__ */ React3.createElement("p", { className: "mt-1 text-sm text-gray-500" }, searchQuery ? "\u5C1D\u8BD5\u8C03\u6574\u641C\u7D22\u5173\u952E\u8BCD\u6216\u7B5B\u9009\u6761\u4EF6" : "\u5F53\u524D\u5206\u7C7B\u4E0B\u6682\u65E0\u5B9E\u9A8C\u9879\u76EE"), searchQuery && /* @__PURE__ */ React3.createElement("div", { className: "mt-4" }, /* @__PURE__ */ React3.createElement(
|
|
1953
1267
|
"button",
|
|
1954
1268
|
{
|
|
1955
1269
|
onClick: onClearSearch,
|
|
@@ -1971,7 +1285,7 @@ var SortControl = ({
|
|
|
1971
1285
|
{ value: "category", label: "\u7C7B\u522B" },
|
|
1972
1286
|
{ value: "completion", label: "\u5B8C\u6210\u72B6\u6001" }
|
|
1973
1287
|
];
|
|
1974
|
-
return /* @__PURE__ */
|
|
1288
|
+
return /* @__PURE__ */ React3.createElement("div", { className: "flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-4 p-4 bg-white rounded-lg shadow-sm border border-gray-100" }, /* @__PURE__ */ React3.createElement("div", { className: "text-sm font-medium text-gray-700" }, "\u6392\u5E8F\u65B9\u5F0F\uFF1A"), /* @__PURE__ */ React3.createElement("div", { className: "flex flex-wrap gap-2" }, sortOptions.map((option) => /* @__PURE__ */ React3.createElement(
|
|
1975
1289
|
"button",
|
|
1976
1290
|
{
|
|
1977
1291
|
key: option.value,
|
|
@@ -1979,30 +1293,30 @@ var SortControl = ({
|
|
|
1979
1293
|
onClick: () => onSortByChange(option.value)
|
|
1980
1294
|
},
|
|
1981
1295
|
option.label
|
|
1982
|
-
))), /* @__PURE__ */
|
|
1296
|
+
))), /* @__PURE__ */ React3.createElement("div", { className: "ml-auto flex items-center" }, /* @__PURE__ */ React3.createElement(
|
|
1983
1297
|
"button",
|
|
1984
1298
|
{
|
|
1985
1299
|
className: "flex items-center gap-1 px-3 py-1.5 text-sm rounded-full bg-gray-100 hover:bg-gray-200",
|
|
1986
1300
|
onClick: () => onSortOrderChange(sortOrder === "asc" ? "desc" : "asc")
|
|
1987
1301
|
},
|
|
1988
|
-
sortOrder === "asc" ? /* @__PURE__ */
|
|
1302
|
+
sortOrder === "asc" ? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12" })), /* @__PURE__ */ React3.createElement("span", null, "\u5347\u5E8F")) : /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4" })), /* @__PURE__ */ React3.createElement("span", null, "\u964D\u5E8F"))
|
|
1989
1303
|
)));
|
|
1990
1304
|
};
|
|
1991
1305
|
var SortModeToggle = ({ sortMode, onSortModeChange }) => {
|
|
1992
|
-
return /* @__PURE__ */
|
|
1306
|
+
return /* @__PURE__ */ React3.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center gap-3 bg-white p-4 rounded-lg shadow-sm border border-gray-100" }, /* @__PURE__ */ React3.createElement("span", { className: "text-sm font-medium text-gray-700" }, "\u6392\u5E8F\u6A21\u5F0F\uFF1A"), /* @__PURE__ */ React3.createElement("div", { className: "flex w-full sm:w-auto p-1 bg-gray-100 rounded-lg" }, /* @__PURE__ */ React3.createElement(
|
|
1993
1307
|
"button",
|
|
1994
1308
|
{
|
|
1995
1309
|
className: clsx("flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors", sortMode === "auto" ? "bg-white text-blue-700 font-medium shadow-sm" : "text-gray-600 hover:bg-gray-200"),
|
|
1996
1310
|
onClick: () => onSortModeChange("auto")
|
|
1997
1311
|
},
|
|
1998
|
-
/* @__PURE__ */
|
|
1999
|
-
), /* @__PURE__ */
|
|
1312
|
+
/* @__PURE__ */ React3.createElement("div", { className: "flex items-center justify-center sm:justify-start space-x-1" }, /* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4" })), /* @__PURE__ */ React3.createElement("span", null, "\u81EA\u52A8\u6392\u5E8F"))
|
|
1313
|
+
), /* @__PURE__ */ React3.createElement(
|
|
2000
1314
|
"button",
|
|
2001
1315
|
{
|
|
2002
1316
|
className: clsx("flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors", sortMode === "manual" ? "bg-white text-blue-700 font-medium shadow-sm" : "text-gray-600 hover:bg-gray-200"),
|
|
2003
1317
|
onClick: () => onSortModeChange("manual")
|
|
2004
1318
|
},
|
|
2005
|
-
/* @__PURE__ */
|
|
1319
|
+
/* @__PURE__ */ React3.createElement("div", { className: "flex items-center justify-center sm:justify-start space-x-1" }, /* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 013 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11" })), /* @__PURE__ */ React3.createElement("span", null, "\u624B\u52A8\u6392\u5E8F"))
|
|
2006
1320
|
)));
|
|
2007
1321
|
};
|
|
2008
1322
|
var SortableExperimentItem = ({
|
|
@@ -2027,14 +1341,14 @@ var SortableExperimentItem = ({
|
|
|
2027
1341
|
opacity: isDragging ? 0.8 : 1,
|
|
2028
1342
|
position: "relative"
|
|
2029
1343
|
};
|
|
2030
|
-
return /* @__PURE__ */
|
|
1344
|
+
return /* @__PURE__ */ React3.createElement(
|
|
2031
1345
|
"div",
|
|
2032
1346
|
{
|
|
2033
1347
|
ref: setNodeRef,
|
|
2034
1348
|
style,
|
|
2035
1349
|
className: "relative group"
|
|
2036
1350
|
},
|
|
2037
|
-
/* @__PURE__ */
|
|
1351
|
+
/* @__PURE__ */ React3.createElement(
|
|
2038
1352
|
"div",
|
|
2039
1353
|
{
|
|
2040
1354
|
...attributes,
|
|
@@ -2043,10 +1357,10 @@ var SortableExperimentItem = ({
|
|
|
2043
1357
|
onClick: (e) => e.stopPropagation(),
|
|
2044
1358
|
"aria-label": "\u62D6\u52A8\u6392\u5E8F"
|
|
2045
1359
|
},
|
|
2046
|
-
/* @__PURE__ */
|
|
2047
|
-
/* @__PURE__ */
|
|
1360
|
+
/* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5 text-gray-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 8h16M4 16h16" })),
|
|
1361
|
+
/* @__PURE__ */ React3.createElement("span", { className: "absolute top-full mt-1 left-1/2 transform -translate-x-1/2 text-xs bg-gray-800 text-white px-2 py-1 rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity" }, "\u62D6\u52A8\u6392\u5E8F")
|
|
2048
1362
|
),
|
|
2049
|
-
/* @__PURE__ */
|
|
1363
|
+
/* @__PURE__ */ React3.createElement("div", { className: "absolute right-2 top-2 flex flex-col gap-2 sm:hidden z-[10]" }, /* @__PURE__ */ React3.createElement(
|
|
2050
1364
|
"button",
|
|
2051
1365
|
{
|
|
2052
1366
|
onClick: (e) => {
|
|
@@ -2057,8 +1371,8 @@ var SortableExperimentItem = ({
|
|
|
2057
1371
|
className: clsx("w-8 h-8 rounded-full flex items-center justify-center shadow-md", isFirst ? "bg-gray-200 cursor-not-allowed" : "bg-white/80 hover:bg-white active:bg-gray-100"),
|
|
2058
1372
|
"aria-label": "\u5411\u4E0A\u79FB\u52A8"
|
|
2059
1373
|
},
|
|
2060
|
-
/* @__PURE__ */
|
|
2061
|
-
), /* @__PURE__ */
|
|
1374
|
+
/* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: clsx("h-5 w-5", isFirst ? "text-gray-400" : "text-gray-500"), fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 15l7-7 7 7" }))
|
|
1375
|
+
), /* @__PURE__ */ React3.createElement(
|
|
2062
1376
|
"button",
|
|
2063
1377
|
{
|
|
2064
1378
|
onClick: (e) => {
|
|
@@ -2069,9 +1383,9 @@ var SortableExperimentItem = ({
|
|
|
2069
1383
|
className: clsx("w-8 h-8 rounded-full flex items-center justify-center shadow-md", isLast ? "bg-gray-200 cursor-not-allowed" : "bg-white/80 hover:bg-white active:bg-gray-100"),
|
|
2070
1384
|
"aria-label": "\u5411\u4E0B\u79FB\u52A8"
|
|
2071
1385
|
},
|
|
2072
|
-
/* @__PURE__ */
|
|
1386
|
+
/* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: clsx("h-5 w-5", isLast ? "text-gray-400" : "text-gray-500"), fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))
|
|
2073
1387
|
)),
|
|
2074
|
-
/* @__PURE__ */
|
|
1388
|
+
/* @__PURE__ */ React3.createElement("div", { className: clsx("transition-all", isDragging ? "scale-105 shadow-xl" : "") }, /* @__PURE__ */ React3.createElement(
|
|
2075
1389
|
ExperimentCard,
|
|
2076
1390
|
{
|
|
2077
1391
|
href: item.path,
|
|
@@ -2150,10 +1464,10 @@ var DraggableExperimentGrid = ({
|
|
|
2150
1464
|
});
|
|
2151
1465
|
}
|
|
2152
1466
|
};
|
|
2153
|
-
|
|
1467
|
+
React3.useEffect(() => {
|
|
2154
1468
|
setItems(initialItems);
|
|
2155
1469
|
}, [initialItems]);
|
|
2156
|
-
return /* @__PURE__ */
|
|
1470
|
+
return /* @__PURE__ */ React3.createElement("div", { className: clsx("relative", className) }, /* @__PURE__ */ React3.createElement("div", { className: "mb-4 px-4 py-3 bg-blue-50 text-blue-700 rounded-lg border border-blue-200 text-sm" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-start sm:items-center" }, /* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5 mr-2 flex-shrink-0 mt-0.5 sm:mt-0", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React3.createElement("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" })), /* @__PURE__ */ React3.createElement("div", null, /* @__PURE__ */ React3.createElement("p", { className: "mb-1" }, "\u62D6\u62FD\u5361\u7247\u53EF\u4EE5\u81EA\u5B9A\u4E49\u6392\u5E8F\u3002\u70B9\u51FB\u5361\u7247\u53EF\u4EE5\u8BBF\u95EE\u5BF9\u5E94\u7684\u5B9E\u9A8C\u9879\u76EE\u3002"), /* @__PURE__ */ React3.createElement("p", { className: "text-xs text-blue-600 sm:hidden" }, "\u70B9\u51FB\u5361\u7247\u53F3\u4E0A\u89D2\u7684\u4E0A\u4E0B\u7BAD\u5934\u6309\u94AE\u8C03\u6574\u987A\u5E8F"), /* @__PURE__ */ React3.createElement("p", { className: "text-xs text-blue-600 hidden sm:block" }, "\u957F\u6309\u5361\u7247\u53F3\u4E0A\u89D2\u7684\u62D6\u52A8\u56FE\u6807\u8FDB\u884C\u6392\u5E8F")))), /* @__PURE__ */ React3.createElement(
|
|
2157
1471
|
DndContext,
|
|
2158
1472
|
{
|
|
2159
1473
|
sensors,
|
|
@@ -2161,13 +1475,13 @@ var DraggableExperimentGrid = ({
|
|
|
2161
1475
|
onDragStart: handleDragStart,
|
|
2162
1476
|
onDragEnd: handleDragEnd
|
|
2163
1477
|
},
|
|
2164
|
-
/* @__PURE__ */
|
|
1478
|
+
/* @__PURE__ */ React3.createElement(
|
|
2165
1479
|
SortableContext,
|
|
2166
1480
|
{
|
|
2167
1481
|
items: items.map((item) => item.id),
|
|
2168
1482
|
strategy: rectSortingStrategy
|
|
2169
1483
|
},
|
|
2170
|
-
/* @__PURE__ */
|
|
1484
|
+
/* @__PURE__ */ React3.createElement("div", { className: clsx("grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6", isDragging ? "cursor-grabbing" : "") }, items.map((item, index) => /* @__PURE__ */ React3.createElement(
|
|
2171
1485
|
SortableExperimentItem,
|
|
2172
1486
|
{
|
|
2173
1487
|
key: item.id,
|
|
@@ -2194,7 +1508,7 @@ var PermissionGuard = ({
|
|
|
2194
1508
|
return true;
|
|
2195
1509
|
};
|
|
2196
1510
|
if (!hasPermission()) {
|
|
2197
|
-
return fallback || /* @__PURE__ */
|
|
1511
|
+
return fallback || /* @__PURE__ */ React3.createElement("div", { className: "min-h-screen bg-gray-50 flex items-center justify-center" }, /* @__PURE__ */ React3.createElement("div", { className: "max-w-md w-full bg-white rounded-lg shadow-lg p-8 text-center" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center justify-center mb-4" }, /* @__PURE__ */ React3.createElement(Shield, { className: "w-12 h-12 text-red-500" })), /* @__PURE__ */ React3.createElement("h2", { className: "text-xl font-semibold text-gray-900 mb-2" }, "\u9700\u8981\u767B\u5F55"), /* @__PURE__ */ React3.createElement("p", { className: "text-gray-600 mb-4" }, "\u8BF7\u5148\u767B\u5F55\u4EE5\u8BBF\u95EE\u5B9E\u9A8C\u7530\u529F\u80FD\u3002"), /* @__PURE__ */ React3.createElement("div", { className: "flex items-center justify-center text-sm text-gray-500 mb-4" }, /* @__PURE__ */ React3.createElement(AlertTriangle, { className: "w-4 h-4 mr-1" }), "\u5B9E\u9A8C\u7530\u5BF9\u6240\u6709\u6CE8\u518C\u7528\u6237\u5F00\u653E"), /* @__PURE__ */ React3.createElement(
|
|
2198
1512
|
"button",
|
|
2199
1513
|
{
|
|
2200
1514
|
onClick: () => window.history.back(),
|
|
@@ -2203,7 +1517,7 @@ var PermissionGuard = ({
|
|
|
2203
1517
|
"\u8FD4\u56DE\u4E0A\u4E00\u9875"
|
|
2204
1518
|
)));
|
|
2205
1519
|
}
|
|
2206
|
-
return /* @__PURE__ */
|
|
1520
|
+
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, children);
|
|
2207
1521
|
};
|
|
2208
1522
|
var UserInfoBar = ({ apiClient }) => {
|
|
2209
1523
|
const { user, logout, isLoggedIn } = useAuth(apiClient);
|
|
@@ -2218,17 +1532,17 @@ var UserInfoBar = ({ apiClient }) => {
|
|
|
2218
1532
|
if (!isLoggedIn || !user) {
|
|
2219
1533
|
return null;
|
|
2220
1534
|
}
|
|
2221
|
-
return /* @__PURE__ */
|
|
1535
|
+
return /* @__PURE__ */ React3.createElement("div", { className: "bg-white border-b border-gray-200 px-4 py-3" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center space-x-3" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React3.createElement(User, { className: "w-5 h-5 text-gray-600" }), /* @__PURE__ */ React3.createElement("span", { className: "text-sm font-medium text-gray-900" }, user.name || user.email || "\u7528\u6237"), user.role && /* @__PURE__ */ React3.createElement("span", { className: "inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800" }, user.role))), /* @__PURE__ */ React3.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React3.createElement("div", { className: "flex items-center space-x-1 text-sm text-gray-500" }, /* @__PURE__ */ React3.createElement(FlaskConical, { className: "w-4 h-4" }), /* @__PURE__ */ React3.createElement("span", null, "\u5B9E\u9A8C\u7530")), /* @__PURE__ */ React3.createElement(
|
|
2222
1536
|
"button",
|
|
2223
1537
|
{
|
|
2224
1538
|
onClick: handleLogout,
|
|
2225
1539
|
className: "inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500"
|
|
2226
1540
|
},
|
|
2227
|
-
/* @__PURE__ */
|
|
1541
|
+
/* @__PURE__ */ React3.createElement(LogOut, { className: "w-4 h-4 mr-1" }),
|
|
2228
1542
|
"\u767B\u51FA"
|
|
2229
1543
|
))));
|
|
2230
1544
|
};
|
|
2231
1545
|
|
|
2232
|
-
export {
|
|
1546
|
+
export { AutoOpenModal, BackgroundRemover, CategoryFilter, CompletionFilterComponent, DraggableExperimentGrid, EmptyState, EnhancedAvatar, ExperimentGrid, ExperimentItemGrid, OCRScanner, PageHeader, PermissionGuard, ProfileButton, ProfileModal, SentimentAnalyzer, SmartAssistant, SortControl, SortModeToggle, SortableExperimentItem, UserInfoBar, filterExperiments, getAllTags, getCategoryColor, getCategoryDisplayName, getCompletionFilterDisplayName, getCompletionStatusColor, getCompletionStatusText, getExperimentCounts, sortExperiments, useBackgroundRemoval, useOCR, useSentimentAnalysis, useTextGeneration, validateExperiment };
|
|
2233
1547
|
//# sourceMappingURL=index.mjs.map
|
|
2234
1548
|
//# sourceMappingURL=index.mjs.map
|