diff --git a/README.md b/README.md index f20ef2a..c75f65f 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ PicImpact 存储库大小

-### 无障碍支持 - -已经在尽力支持了,主要基于 [WAI-ARIA 规范](https://developer.mozilla.org/zh-CN/docs/Learn/Accessibility/WAI-ARIA_basics),有爱,无障碍! +

+ +

### 如何部署 @@ -126,6 +126,10 @@ PicImpact 欢迎各种贡献,包括但不限于改进,新功能,文档和 > 事实上不是过于老旧的浏览器,一般都是能用的。 +### 无障碍支持 + +已经在尽力支持了,主要基于 [WAI-ARIA 规范](https://developer.mozilla.org/zh-CN/docs/Learn/Accessibility/WAI-ARIA_basics),有爱,无障碍! + ### 技术栈 - Web框架: diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 0069c6f..4d7ea2f 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -12,6 +12,7 @@ export default async function Admin() { result: any[] }> => { 'use server' + // @ts-ignore return await fetchImagesAnalysis() } diff --git a/app/admin/settings/about/page.tsx b/app/admin/settings/about/page.tsx index 2d5685b..58db924 100644 --- a/app/admin/settings/about/page.tsx +++ b/app/admin/settings/about/page.tsx @@ -3,7 +3,7 @@ import favicon from '~/public/favicon.svg' import Image from 'next/image' import { Divider, Avatar } from '@nextui-org/react' -import { BookOpenCheck, ExternalLink, Github } from 'lucide-react' +import { ExternalLink, Github } from 'lucide-react' import Link from 'next/link' export default function About() { diff --git a/app/admin/settings/backup/page.tsx b/app/admin/settings/backup/page.tsx index b1ea5bc..e238e8b 100644 --- a/app/admin/settings/backup/page.tsx +++ b/app/admin/settings/backup/page.tsx @@ -109,12 +109,14 @@ export default function Backup() { icon={} loading={backupLoading} onClick={() => backup()} + aria-label="备份" >备份

如果您在线上环境,请确保您的数据库单次会话时长以及事务的支持,否则会还原数据失败!

diff --git a/app/admin/settings/layout.tsx b/app/admin/settings/layout.tsx index 056ed13..d04bcac 100644 --- a/app/admin/settings/layout.tsx +++ b/app/admin/settings/layout.tsx @@ -20,6 +20,7 @@ export default function AdminLayout({ color="primary" variant={pathname === '/admin/settings/preferences' ? 'bordered': 'light'} onClick={() => router.push('/admin/settings/preferences')} + aria-label="首选项" > 首选项 @@ -28,6 +29,7 @@ export default function AdminLayout({ color="primary" variant={pathname === '/admin/settings/password' ? 'bordered': 'light'} onClick={() => router.push('/admin/settings/password')} + aria-label="密码修改" > 密码修改 @@ -36,6 +38,7 @@ export default function AdminLayout({ color="primary" variant={pathname === '/admin/settings/storages' ? 'bordered': 'light'} onClick={() => router.push('/admin/settings/storages')} + aria-label="存储" > 存储 @@ -44,6 +47,7 @@ export default function AdminLayout({ color="primary" variant={pathname === '/admin/settings/backup' ? 'bordered': 'light'} onClick={() => router.push('/admin/settings/backup')} + aria-label="备份" > 备份 @@ -52,6 +56,7 @@ export default function AdminLayout({ color="primary" variant={pathname === '/admin/settings/about' ? 'bordered': 'light'} onClick={() => router.push('/admin/settings/about')} + aria-label="关于" > 关于 diff --git a/app/admin/settings/password/page.tsx b/app/admin/settings/password/page.tsx index 3e98e04..dfd93a2 100644 --- a/app/admin/settings/password/page.tsx +++ b/app/admin/settings/password/page.tsx @@ -121,6 +121,7 @@ export default function PassWord() { setTwoPassword('') setThreePassword('') }} + aria-label="重置" > 重置 @@ -129,6 +130,7 @@ export default function PassWord() { variant="bordered" isLoading={loading} onClick={() => updatePassword()} + aria-label="提交" > 提交 diff --git a/app/admin/settings/preferences/page.tsx b/app/admin/settings/preferences/page.tsx index ff0b466..276bf27 100644 --- a/app/admin/settings/preferences/page.tsx +++ b/app/admin/settings/preferences/page.tsx @@ -10,7 +10,7 @@ export default function Preferences() { const [title, setTitle] = useState('') const [loading, setLoading] = useState(false) - const { data } = useSWR('/api/get-custom-title', fetcher) + const { data } = useSWR('/api/v1/get-custom-title', fetcher) async function updateTitle() { try { @@ -54,6 +54,7 @@ export default function Preferences() { variant="bordered" isLoading={loading} onClick={() => updateTitle()} + aria-label="提交" > 提交 diff --git a/app/api/get-link/route.ts b/app/api/get-link/route.ts deleted file mode 100644 index 8c1496f..0000000 --- a/app/api/get-link/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import 'server-only' -import { fetchTagsShow } from '~/server/lib/query' - -export async function GET() { - const data = await fetchTagsShow(); - return Response.json(data) -} - -export const dynamic = 'force-dynamic' \ No newline at end of file diff --git a/app/api/get-custom-title/route.ts b/app/api/v1/get-custom-title/route.ts similarity index 100% rename from app/api/get-custom-title/route.ts rename to app/api/v1/get-custom-title/route.ts diff --git a/components/Masonry.tsx b/components/Masonry.tsx index 030bca4..dcb1cad 100644 --- a/components/Masonry.tsx +++ b/components/Masonry.tsx @@ -74,6 +74,7 @@ export default function Masonry(props : Readonly) { onClick={() => { setSize(size + 1) }} + aria-label="加载更多" > 加载更多 diff --git a/components/MasonryItem.tsx b/components/MasonryItem.tsx index bc757d0..d1b8c9f 100644 --- a/components/MasonryItem.tsx +++ b/components/MasonryItem.tsx @@ -6,13 +6,16 @@ import { } from '~/components/ui/Dialog' import { useButtonStore } from '~/app/providers/button-store-Providers' import { ImageType } from '~/types' -import { Image, Tabs, Tab, Card, CardHeader, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell } from '@nextui-org/react' -import { Aperture, Camera } from 'lucide-react' +import { Image, Tabs, Tab, Card, CardHeader, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, Button } from '@nextui-org/react' +import { Aperture, Camera, Image as ImageIcon, Languages, CalendarDays, X, SunMedium, MoonStar } from 'lucide-react' +import * as React from 'react' +import { useTheme } from 'next-themes' export default function MasonryItem() { const { MasonryView, MasonryViewData, setMasonryView, setMasonryViewData } = useButtonStore( (state) => state, ) + const { theme, setTheme } = useTheme() return ( -
-

{MasonryViewData.detail}

+
+
+

{MasonryViewData.detail}

+
+
+ + +
@@ -44,8 +75,8 @@ export default function MasonryItem() { - +
+ 详情
} @@ -53,23 +84,38 @@ export default function MasonryItem() {
-

相机

+
+ +

相机

+

{MasonryViewData?.exif?.model || 'N&A'}

-

相片描述

+
+ +

相片描述

+

{MasonryViewData.detail || 'N&A'}

+ + +
+ +

拍摄时间

+
+

{MasonryViewData?.exif?.data_time || 'N&A'}

+
+
- +
+ Exif
} diff --git a/components/RefreshButton.tsx b/components/RefreshButton.tsx index 041e763..b58a1cb 100644 --- a/components/RefreshButton.tsx +++ b/components/RefreshButton.tsx @@ -15,6 +15,7 @@ export default function RefreshButton(props: Readonly) { size="sm" variant="shadow" isLoading={isLoading} + aria-label="刷新" onClick={async () => { await mutate() }} diff --git a/components/admin/list/ImageEditSheet.tsx b/components/admin/list/ImageEditSheet.tsx index 22e071b..18f0502 100644 --- a/components/admin/list/ImageEditSheet.tsx +++ b/components/admin/list/ImageEditSheet.tsx @@ -161,6 +161,7 @@ export default function ImageEditSheet(props : Readonly submit()} + aria-label="更新" > 更新 diff --git a/components/admin/list/ListProps.tsx b/components/admin/list/ListProps.tsx index d494e7b..fd667ff 100644 --- a/components/admin/list/ListProps.tsx +++ b/components/admin/list/ListProps.tsx @@ -142,6 +142,7 @@ export default function ListProps(props : Readonly) { await totalMutate() await mutate() }} + aria-label="刷新" > 刷新 @@ -167,7 +168,7 @@ export default function ListProps(props : Readonly) { - {image.tag_names.length > 8 ? image.tag_names.substring(0, 8) + '...' : image.tag_names} + {image.tag_names.length > 8 ? image.tag_names.substring(0, 8) + '...' : image.tag_names}
@@ -180,7 +181,7 @@ export default function ListProps(props : Readonly) { : - {image.tag_names} + {image.tag_names}
@@ -198,6 +199,7 @@ export default function ListProps(props : Readonly) { setImageViewData(image) setImageView(true) }} + aria-label="查看图片" > @@ -237,6 +239,7 @@ export default function ListProps(props : Readonly) { color="primary" variant="shadow" startContent={} + aria-label="排序" >{image.sort} @@ -255,6 +258,7 @@ export default function ListProps(props : Readonly) { setImageEditData(image) setImageEdit(true) }} + aria-label="编辑图片" > @@ -265,6 +269,7 @@ export default function ListProps(props : Readonly) { setImage(image) setIsOpen(true) }} + aria-label="删除图片" > @@ -304,6 +309,7 @@ export default function ListProps(props : Readonly) { setImage({} as ImageType) setIsOpen(false) }} + aria-label="不删除" > 算了 @@ -311,6 +317,7 @@ export default function ListProps(props : Readonly) { color="primary" isLoading={deleteLoading} onClick={() => deleteImage()} + aria-label="确认删除" > 是的 diff --git a/components/admin/settings/storages/AListEditSheet.tsx b/components/admin/settings/storages/AListEditSheet.tsx index de42ad9..8128bae 100644 --- a/components/admin/settings/storages/AListEditSheet.tsx +++ b/components/admin/settings/storages/AListEditSheet.tsx @@ -79,6 +79,7 @@ export default function AListEditSheet() { color="primary" variant="shadow" onClick={() => submit()} + aria-label="更新" > 更新 diff --git a/components/admin/settings/storages/AListTabs.tsx b/components/admin/settings/storages/AListTabs.tsx index 3109c8d..76a0707 100644 --- a/components/admin/settings/storages/AListTabs.tsx +++ b/components/admin/settings/storages/AListTabs.tsx @@ -34,6 +34,7 @@ export default function AListTabs() { radius="full" isLoading={isValidating} onClick={() => mutate()} + aria-label="刷新" > 刷新 @@ -46,6 +47,7 @@ export default function AListTabs() { setAListEdit(true) setAListEditData(JSON.parse(JSON.stringify(data))) }} + aria-label="编辑" > 编辑 diff --git a/components/admin/settings/storages/R2EditSheet.tsx b/components/admin/settings/storages/R2EditSheet.tsx index b30a500..61178a7 100644 --- a/components/admin/settings/storages/R2EditSheet.tsx +++ b/components/admin/settings/storages/R2EditSheet.tsx @@ -79,6 +79,7 @@ export default function S3EditSheet() { color="primary" variant="shadow" onClick={() => submit()} + aria-label="更新" > 更新 diff --git a/components/admin/settings/storages/R2Tabs.tsx b/components/admin/settings/storages/R2Tabs.tsx index 1c759d6..4e7e53a 100644 --- a/components/admin/settings/storages/R2Tabs.tsx +++ b/components/admin/settings/storages/R2Tabs.tsx @@ -34,6 +34,7 @@ export default function R2Tabs() { radius="full" isLoading={isValidating} onClick={() => mutate()} + aria-label="刷新" > 刷新 @@ -46,6 +47,7 @@ export default function R2Tabs() { setR2Edit(true) setR2EditData(JSON.parse(JSON.stringify(data))) }} + aria-label="编辑" > 编辑 diff --git a/components/admin/settings/storages/S3EditSheet.tsx b/components/admin/settings/storages/S3EditSheet.tsx index c62a92c..5edae25 100644 --- a/components/admin/settings/storages/S3EditSheet.tsx +++ b/components/admin/settings/storages/S3EditSheet.tsx @@ -79,6 +79,7 @@ export default function S3EditSheet() { color="primary" variant="shadow" onClick={() => submit()} + aria-label="更新" > 更新 diff --git a/components/admin/settings/storages/S3Tabs.tsx b/components/admin/settings/storages/S3Tabs.tsx index d9ebd02..87dd835 100644 --- a/components/admin/settings/storages/S3Tabs.tsx +++ b/components/admin/settings/storages/S3Tabs.tsx @@ -34,6 +34,7 @@ export default function S3Tabs() { radius="full" isLoading={isValidating} onClick={() => mutate()} + aria-label="刷新" > 刷新 @@ -46,6 +47,7 @@ export default function S3Tabs() { setS3Edit(true) setS3EditData(JSON.parse(JSON.stringify(data))) }} + aria-label="编辑" > 编辑 diff --git a/components/admin/tag/DefaultTag.tsx b/components/admin/tag/DefaultTag.tsx index 3b8c6f0..711ba97 100644 --- a/components/admin/tag/DefaultTag.tsx +++ b/components/admin/tag/DefaultTag.tsx @@ -21,7 +21,7 @@ export default function DefaultTag() {

首页

- / + /
@@ -42,6 +42,7 @@ export default function DefaultTag() { color="primary" variant="shadow" startContent={} + aria-label="排序" >-1 diff --git a/components/admin/tag/TagAddButton.tsx b/components/admin/tag/TagAddButton.tsx index e9bf7c3..0caacbb 100644 --- a/components/admin/tag/TagAddButton.tsx +++ b/components/admin/tag/TagAddButton.tsx @@ -16,6 +16,7 @@ export default function TagAddButton() { size="sm" variant="shadow" onClick={() => setTagAdd(true)} + aria-label="新增" > 新增 diff --git a/components/admin/tag/TagAddSheet.tsx b/components/admin/tag/TagAddSheet.tsx index bbde14c..5d6047b 100644 --- a/components/admin/tag/TagAddSheet.tsx +++ b/components/admin/tag/TagAddSheet.tsx @@ -124,6 +124,7 @@ export default function TagAddSheet(props : Readonly) { color="primary" variant="shadow" onClick={() => submit()} + aria-label="提交" > 提交 diff --git a/components/admin/tag/TagEditSheet.tsx b/components/admin/tag/TagEditSheet.tsx index 0898f9d..21cfd53 100644 --- a/components/admin/tag/TagEditSheet.tsx +++ b/components/admin/tag/TagEditSheet.tsx @@ -135,6 +135,7 @@ export default function TagEditSheet(props : Readonly) { color="primary" variant="shadow" onClick={() => submit()} + aria-label="更新" > 更新 diff --git a/components/admin/tag/TagList.tsx b/components/admin/tag/TagList.tsx index d25fe69..15bd589 100644 --- a/components/admin/tag/TagList.tsx +++ b/components/admin/tag/TagList.tsx @@ -104,7 +104,7 @@ export default function TagList(props : Readonly) {

{tag.name}

- {tag.tag_value} + {tag.tag_value}
@@ -140,6 +140,7 @@ export default function TagList(props : Readonly) { color="primary" variant="shadow" startContent={} + aria-label="排序" >{tag.sort} @@ -158,6 +159,7 @@ export default function TagList(props : Readonly) { setTagEditData(tag) setTagEdit(true) }} + aria-label="编辑标签" > @@ -168,6 +170,7 @@ export default function TagList(props : Readonly) { setTag(tag) setIsOpen(true) }} + aria-label="删除标签" > @@ -195,6 +198,7 @@ export default function TagList(props : Readonly) { setTag({} as TagType) setIsOpen(false) }} + aria-label="不删除" > 算了 @@ -202,6 +206,7 @@ export default function TagList(props : Readonly) { color="primary" isLoading={deleteLoading} onClick={() => deleteTag()} + aria-label="确认删除" > 是的 diff --git a/components/admin/upload/FileUpload.tsx b/components/admin/upload/FileUpload.tsx index ee2eebe..c3fc740 100644 --- a/components/admin/upload/FileUpload.tsx +++ b/components/admin/upload/FileUpload.tsx @@ -303,6 +303,7 @@ export default function FileUpload() { size="sm" isLoading={loading} onClick={() => submit()} + aria-label="提交" > 提交 diff --git a/components/layout/BaseSide.tsx b/components/layout/BaseSide.tsx index 7f1793c..14b78df 100644 --- a/components/layout/BaseSide.tsx +++ b/components/layout/BaseSide.tsx @@ -1,6 +1,6 @@ 'use client' -import { Listbox, ListboxItem} from '@nextui-org/react' +import { Listbox, ListboxItem } from '@nextui-org/react' import { useSession } from 'next-auth/react' import { usePathname } from 'next/navigation' import { useRouter } from 'next-nprogress-bar' diff --git a/components/layout/DropMenu.tsx b/components/layout/DropMenu.tsx index a0087e4..44f5715 100644 --- a/components/layout/DropMenu.tsx +++ b/components/layout/DropMenu.tsx @@ -32,6 +32,7 @@ export const DropMenu = () => { size="sm" isBordered src={session?.user?.image || ''} + aria-label="下拉菜单" /> { diff --git a/components/layout/DynamicDropMenu.tsx b/components/layout/DynamicDropMenu.tsx index 9549e15..b634937 100644 --- a/components/layout/DynamicDropMenu.tsx +++ b/components/layout/DynamicDropMenu.tsx @@ -23,14 +23,14 @@ export default function DynamicDropMenu(props: Readonly) { router.push('/')} - className={pathname === '/' ? 'bg-gray-100' : ''} + className={pathname === '/' ? 'bg-gray-100 dark:text-black' : ''} >首页 {Array.isArray(props.data) && props.data?.map((tag: TagType, index: any, array: TagType[]) => ( router.push(tag.tag_value)} - className={pathname === tag.tag_value ? 'bg-gray-100' : ''} + className={pathname === tag.tag_value ? 'bg-gray-100 dark:text-black' : ''} >{tag.name} ))} diff --git a/components/layout/HeaderLink.tsx b/components/layout/HeaderLink.tsx index de762b6..213c1c8 100644 --- a/components/layout/HeaderLink.tsx +++ b/components/layout/HeaderLink.tsx @@ -17,6 +17,7 @@ export default function HeaderLink(props: Readonly) { variant="light" className={pathname === '/' ? 'border-b-2 border-indigo-600' : ''} onClick={() => router.push('/')} + aria-label="首页" > 首页 @@ -28,6 +29,7 @@ export default function HeaderLink(props: Readonly) { variant="light" className={pathname === tag.tag_value ? 'border-b-2 border-indigo-600' : ''} onClick={() => router.push(tag.tag_value)} + aria-label={tag.name} > {tag.name} diff --git a/components/layout/VaulDrawer.tsx b/components/layout/VaulDrawer.tsx index 4724f85..11e0963 100644 --- a/components/layout/VaulDrawer.tsx +++ b/components/layout/VaulDrawer.tsx @@ -162,7 +162,7 @@ export default function VaulDrawer() {
GitHub diff --git a/components/login/UserFrom.tsx b/components/login/UserFrom.tsx index 67acb35..6706060 100644 --- a/components/login/UserFrom.tsx +++ b/components/login/UserFrom.tsx @@ -105,6 +105,7 @@ export const UserFrom = () => { } setIsLoading(false) }} + aria-label="登录" > 登录 @@ -113,6 +114,7 @@ export const UserFrom = () => { className="w-full" variant="shadow" onClick={() => router.push('/')} + aria-label="返回首页" > 返回首页 diff --git a/components/ui/ContextMenu.tsx b/components/ui/ContextMenu.tsx deleted file mode 100644 index a8c9d17..0000000 --- a/components/ui/ContextMenu.tsx +++ /dev/null @@ -1,203 +0,0 @@ -'use client' - -import * as React from 'react' -import * as ContextMenuPrimitive from '@radix-ui/react-context-menu' -import { - CheckIcon, - ChevronRightIcon, - DotFilledIcon, -} from '@radix-ui/react-icons' -import { cn } from '~/utils' - -const ContextMenu = ContextMenuPrimitive.Root - -const ContextMenuTrigger = ContextMenuPrimitive.Trigger - -const ContextMenuGroup = ContextMenuPrimitive.Group - -const ContextMenuPortal = ContextMenuPrimitive.Portal - -const ContextMenuSub = ContextMenuPrimitive.Sub - -const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup - -const ContextMenuSubTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean -} ->(({ className, inset, children, ...props }, ref) => ( - - {children} - - -)) -ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName - -const ContextMenuSubContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName - -const ContextMenuContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - -)) -ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName - -const ContextMenuItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean -} ->(({ className, inset, ...props }, ref) => ( - -)) -ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName - -const ContextMenuCheckboxItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, checked, ...props }, ref) => ( - - - - - - - {children} - -)) -ContextMenuCheckboxItem.displayName = - ContextMenuPrimitive.CheckboxItem.displayName - -const ContextMenuRadioItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - - - - {children} - -)) -ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName - -const ContextMenuLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean -} ->(({ className, inset, ...props }, ref) => ( - -)) -ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName - -const ContextMenuSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName - -const ContextMenuShortcut = ({ - className, - ...props - }: React.HTMLAttributes) => { - return ( - - ) -} -ContextMenuShortcut.displayName = "ContextMenuShortcut" - -export { - ContextMenu, - ContextMenuTrigger, - ContextMenuContent, - ContextMenuItem, - ContextMenuCheckboxItem, - ContextMenuRadioItem, - ContextMenuLabel, - ContextMenuSeparator, - ContextMenuShortcut, - ContextMenuGroup, - ContextMenuPortal, - ContextMenuSub, - ContextMenuSubContent, - ContextMenuSubTrigger, - ContextMenuRadioGroup, -} diff --git a/components/ui/Dialog.tsx b/components/ui/Dialog.tsx index 9a8ae2e..7f9975f 100644 --- a/components/ui/Dialog.tsx +++ b/components/ui/Dialog.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as DialogPrimitive from '@radix-ui/react-dialog' -import { X } from 'lucide-react' +// import { X } from 'lucide-react' import { cn } from '~/utils' @@ -38,16 +38,16 @@ const DialogContent = React.forwardRef< {children} - - - Close - + {/**/} + {/* */} + {/* Close*/} + {/**/} )) diff --git a/components/ui/ScrollArea.tsx b/components/ui/ScrollArea.tsx deleted file mode 100644 index da1d843..0000000 --- a/components/ui/ScrollArea.tsx +++ /dev/null @@ -1,48 +0,0 @@ -'use client' - -import * as React from 'react' -import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' - -import { cn } from '~/utils' - -const ScrollArea = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - {children} - - - - -)) -ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName - -const ScrollBar = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, orientation = "vertical", ...props }, ref) => ( - - - -)) -ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName - -export { ScrollArea, ScrollBar } diff --git a/package.json b/package.json index 6ae99eb..fe532fe 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,9 @@ "@aws-sdk/client-s3": "^3.568.0", "@nextui-org/react": "^2.3.6", "@prisma/client": "^5.13.0", - "@radix-ui/react-context-menu": "^2.1.5", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-scroll-area": "^1.0.5", "antd": "^5.17.0", "canvas-confetti": "^1.9.3", "class-variance-authority": "^0.7.0", diff --git a/picimpact.png b/picimpact.png new file mode 100644 index 0000000..396b0b3 Binary files /dev/null and b/picimpact.png differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f1d6ac..ece936e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,6 @@ dependencies: '@prisma/client': specifier: ^5.13.0 version: 5.13.0(prisma@5.13.0) - '@radix-ui/react-context-menu': - specifier: ^2.1.5 - version: 2.1.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-dialog': specifier: ^1.0.5 version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) @@ -32,9 +29,6 @@ dependencies: '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.3.1) - '@radix-ui/react-scroll-area': - specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) antd: specifier: ^5.17.0 version: 5.17.0(react-dom@18.3.1)(react@18.3.1) @@ -2921,12 +2915,6 @@ packages: dependencies: '@prisma/debug': 5.13.0 - /@radix-ui/number@1.0.1: - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - dependencies: - '@babel/runtime': 7.24.4 - dev: false - /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: @@ -2992,32 +2980,6 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-context-menu@2.1.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-R5XaDj06Xul1KGb+WP8qiOh7tKJNz2durpLBXAGZjSVtctcRFCuEvy2gtMwRJGePwQQE5nV77gs4FwRi8T+r2g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: @@ -3353,35 +3315,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: