diff --git a/package.json b/package.json index 6dc153f4..066eb6ab 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "dependencies": { "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^4.1.3", + "@tailwindcss/typography": "^0.5.16", "@tanstack/react-query": "^5.61.3", "@tanstack/react-query-devtools": "^5.76.1", "autoprefixer": "^10.4.20", @@ -27,6 +28,7 @@ "lodash": "^4.17.21", "postcss": "^8.4.49", "qr-scanner": "^1.4.2", + "quill": "2", "react": "^18.3.1", "react-datepicker": "^7.5.0", "react-daum-postcode": "^3.2.0", diff --git a/public/assets/Home.svg b/public/assets/Home.svg new file mode 100644 index 00000000..11753bdf --- /dev/null +++ b/public/assets/Home.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/app/routes/Router.tsx b/src/app/routes/Router.tsx index 3b19b7c6..2e5a6e66 100644 --- a/src/app/routes/Router.tsx +++ b/src/app/routes/Router.tsx @@ -80,7 +80,7 @@ const dashboardRoutes = [ { path: DASHBOARD_ROUTES.dashboard, element: , requiresAuth: false }, { path: DASHBOARD_ROUTES.eventInfo, element: , requiresAuth: false }, { path: DASHBOARD_ROUTES.eventDetail, element: , requiresAuth: false }, - { path: DASHBOARD_ROUTES.eventTag, element: , requiresAuth: false }, + { path: DASHBOARD_ROUTES.eventTag, element: (),requiresAuth: false,}, { path: DASHBOARD_ROUTES.ticketCreate, element: , requiresAuth: false }, { path: DASHBOARD_ROUTES.ticket, element: , requiresAuth: false }, { path: DASHBOARD_ROUTES.ticketOption, element: , requiresAuth: false }, diff --git a/src/entities/event/api/event.ts b/src/entities/event/api/event.ts index 866aba30..426c4d85 100644 --- a/src/entities/event/api/event.ts +++ b/src/entities/event/api/event.ts @@ -87,3 +87,4 @@ export const eventDeletion = async (eventId: number) => { const response = await axiosClient.delete(`/events/${eventId}`); return response.data; }; + diff --git a/src/features/event/ui/ShareEventModal.tsx b/src/features/event/ui/ShareEventModal.tsx index 0e7bbe60..893c8d4e 100644 --- a/src/features/event/ui/ShareEventModal.tsx +++ b/src/features/event/ui/ShareEventModal.tsx @@ -3,6 +3,7 @@ import kakao from '../../../../public/assets/event-manage/details/KaKao.svg'; import { shareToKakao } from '../../../shared/lib/kakaoShare'; import stripHtml from '../lib/stripHtml'; import EventInfo from '../../../entities/user/ui/EventInfo'; +import { useRef } from 'react'; interface ShareEventModalProps { closeModal: () => void; @@ -20,6 +21,47 @@ const ShareEventModal = ({ eventUrl = window.location.href, }: ShareEventModalProps) => { const description = stripHtml(eventDescription); + const startYRef = useRef(null); + const modalRef = useRef(null); + + const handleTouchStart = (e: React.TouchEvent) => { + startYRef.current = e.touches[0].clientY; + }; + + const handleTouchMove = (e: React.TouchEvent) => { + const startY = startYRef.current; + if (startY === null) return; + + const deltaY = e.touches[0].clientY - startY; + + // 모달이 따라 내려오는 효과 (optional) + if (modalRef.current && deltaY > 0) { + modalRef.current.style.transform = `translateY(${deltaY}px)`; + } + }; + + const handleTouchEnd = (e: React.TouchEvent) => { + const startY = startYRef.current; + if (startY === null) return; + + const endY = e.changedTouches[0].clientY; + const deltaY = endY - startY; + + if (deltaY > 100) { + // 일정 거리 이상 내려갔을 때 모달 닫기 + closeModal(); + } else { + // 다시 원위치 + if (modalRef.current) { + modalRef.current.style.transform = 'translateY(0)'; + modalRef.current.style.transition = 'transform 0.2s ease-out'; + setTimeout(() => { + if (modalRef.current) modalRef.current.style.transition = ''; + }, 200); + } + } + startYRef.current = null; + }; const handleKakaoShare = async () => { try { @@ -66,7 +108,13 @@ const ShareEventModal = ({ return (
-
e.stopPropagation()} className="relative w-full max-w-lg bg-white rounded-t-[20px] px-6 py-4"> +
diff --git a/src/features/event/ui/TextEditor.tsx b/src/features/event/ui/TextEditor.tsx index 5dee2a8d..e37c8752 100644 --- a/src/features/event/ui/TextEditor.tsx +++ b/src/features/event/ui/TextEditor.tsx @@ -87,22 +87,23 @@ const TextEditor = ({ eventState, setEventState, value = '', onChange, onValidat }; const handleChange = (val: string) => { - const totalLength = getTotalContentLength(val); - - if (totalLength <= MAX_LENGTH) { - setEditorContent(val); - onChange?.(val); - setEventState?.(prev => ({ ...prev, description: val })); - onValidationChange?.(getPlainText(val).length > 0); - setIsOverLimit(false); - } else { - const editorInstance = quillRef.current?.getEditor(); - if (editorInstance) { - editorInstance.setContents(editorInstance.clipboard.convert(eventState?.description)); - } - setIsOverLimit(true); + const totalLength = getTotalContentLength(val); + + if (totalLength <= MAX_LENGTH) { + setEditorContent(val); + onChange?.(val); + setEventState?.(prev => ({ ...prev, description: val })); + onValidationChange?.(getPlainText(val).length > 0); + setIsOverLimit(false); + } else { + const editorInstance = quillRef.current?.getEditor(); + if (editorInstance) { + editorInstance.clipboard.dangerouslyPasteHTML(eventState?.description ?? ''); } - }; + setIsOverLimit(true); + } +}; + useEffect(() => { onValidationChange?.(getPlainText(editorContent).length > 0); diff --git a/src/features/home/ui/EventTags.tsx b/src/features/home/ui/EventTags.tsx index 128ffab4..626e0bd3 100644 --- a/src/features/home/ui/EventTags.tsx +++ b/src/features/home/ui/EventTags.tsx @@ -9,8 +9,8 @@ const EventTags = () => { return ( <>
- - + +
diff --git a/src/features/join/hooks/useUserHook.ts b/src/features/join/hooks/useUserHook.ts index 9d8e6215..626b7114 100644 --- a/src/features/join/hooks/useUserHook.ts +++ b/src/features/join/hooks/useUserHook.ts @@ -22,9 +22,8 @@ export const useUserUpdate = () => { export const useAgreeTerms = () => { return useMutation({ mutationFn: agreeTerms, - onError: (error) => { - alert('동의 처리 실패'); - console.error('이용약관 동의 실패', error); + onError: () => { + alert('약관 동의 처리에 실패했습니다.'); } }); }; \ No newline at end of file diff --git a/src/features/ticket/api/ticket.ts b/src/features/ticket/api/ticket.ts index ff13c35e..1f00fdff 100644 --- a/src/features/ticket/api/ticket.ts +++ b/src/features/ticket/api/ticket.ts @@ -9,6 +9,9 @@ export const createTicket = async (data: CreateTicketRequest) => { export const readTicket = async (eventId: number): Promise<{ isSuccess: boolean; result: ReadTicketResponse[] }> => { const response = await axiosClient.get('/tickets', { params: { eventId }, + headers: { + isPublicApi: true, + }, }); return response.data; }; diff --git a/src/pages/dashboard/ui/EventDetailPage.tsx b/src/pages/dashboard/ui/EventDetailPage.tsx index e2b2f441..29969ad7 100644 --- a/src/pages/dashboard/ui/EventDetailPage.tsx +++ b/src/pages/dashboard/ui/EventDetailPage.tsx @@ -9,6 +9,7 @@ import { useUpdateEventHook } from '../../../features/dashboard/hook/useEventHoo import { UpdateEventRequest } from '../../../features/dashboard/model/event'; import { OnlineType } from '../../../shared/types/baseEventType'; import { useEventDetail } from '../../../entities/event/hook/useEventHook'; +import { useQueryClient } from '@tanstack/react-query'; const EventDetailPage = () => { const navigate = useNavigate(); @@ -20,10 +21,13 @@ const EventDetailPage = () => { const [description, setDescription] = useState(''); const [referenceLinks, setReferenceLinks] = useState([]); + const queryClient = useQueryClient(); + useEffect(() => { + console.log(data?.result.bannerImageUrl) if (data?.result) { setHostChannelId(data.result.hostChannelId || 0); - setBannerImageUrl(data.result.bannerImageUrl || ''); + setBannerImageUrl(prev => prev || data.result.bannerImageUrl || ''); setDescription(data.result.description || ''); setReferenceLinks(data.result.referenceLinks || []); } @@ -37,7 +41,7 @@ const EventDetailPage = () => { title: data.result.title, startDate: data.result.startDate, endDate: data.result.endDate, - bannerImageUrl: bannerImageUrl || data.result.bannerImageUrl || '', + bannerImageUrl: bannerImageUrl.trim() !== '' ? bannerImageUrl : data.result.bannerImageUrl || '', description: description || data.result.description || '', referenceLinks: referenceLinks.map(({ title, url }) => ({ title, url })) || data.result.referenceLinks || [], onlineType: data.result.onlineType as OnlineType, @@ -54,6 +58,8 @@ const EventDetailPage = () => { mutate(requestData, { onSuccess: () => { alert('이벤트 정보가 저장되었습니다.'); + queryClient.invalidateQueries({ queryKey: ['eventDetail', data?.result.id] }); + navigate(`/dashboard/${data?.result.id}`); }, onError: () => { @@ -63,11 +69,11 @@ const EventDetailPage = () => { }; return ( - +

이벤트 상세 정보

- +
diff --git a/src/pages/dashboard/ui/EventInfoPage.tsx b/src/pages/dashboard/ui/EventInfoPage.tsx index 0771444b..9560a89b 100644 --- a/src/pages/dashboard/ui/EventInfoPage.tsx +++ b/src/pages/dashboard/ui/EventInfoPage.tsx @@ -89,7 +89,8 @@ const EventInfoPage = () => { }, [data]); return ( - + // +

이벤트 기본 정보

{ const navigate = useNavigate(); + const { eventState, setEventState } = useFunnelState(); + const { id } = useParams(); + const { mutate } = useUpdateEventHook(); + const { data } = useEventDetail(); + useEffect(() => { + if (data?.result.hashtags && setEventState) { + setEventState(prev => ({ + ...prev, + hashtags: data.result.hashtags, + })); + } + }, [data, setEventState]); + const handleEventTag = () => { + if (!id || !data?.result) return; + + const cleanedTags = eventState.hashtags.filter(tag => tag.trim() !== ''); + + const requestData = { + ...data.result, + hostChannelId: data.result.hostChannelId, + hashtags: cleanedTags, + }; + + mutate(requestData, { + onSuccess: () => { + alert('이벤트 정보가 저장되었습니다.'); + navigate(`/dashboard/${id}`); + }, + onError: () => { + alert('저장에 실패했습니다.'); + }, + }); + } + return (

이벤트 태그 정보

- +
diff --git a/src/pages/dashboard/ui/mail/MailBoxPage.tsx b/src/pages/dashboard/ui/mail/MailBoxPage.tsx index 53c4df87..da2f81c8 100644 --- a/src/pages/dashboard/ui/mail/MailBoxPage.tsx +++ b/src/pages/dashboard/ui/mail/MailBoxPage.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import TextButton from '../../../../../design-system/ui/buttons/TextButton'; import DashboardLayout from '../../../../shared/ui/backgrounds/DashboardLayout'; import SearchBar from '../../../../shared/ui/SearchBar'; @@ -13,11 +13,21 @@ const MailBoxPage = () => { const [listType, setListType] = useState<'completed' | 'pending'>('completed'); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedEmailId, setSelectedEmailId] = useState(null); + const [searchKeyword, setSearchKeyword] = useState(''); const status = listType === 'pending' ? 'PENDING' : 'SENT'; const { data: emails = [], isLoading } = useReadEmail(eventId, status); const { mutate: deleteEmail } = useDeleteEmail(); + const filteredEmails = useMemo(() => { + if (!searchKeyword.trim()) return emails; + const keyword = searchKeyword.toLowerCase(); + return emails.filter(email => + email.title.toLowerCase().includes(keyword) || + email.targetName.toLowerCase().includes(keyword) + ); +}, [emails, searchKeyword]); + const handleDelete = (reservationEmailId: number) => { deleteEmail(reservationEmailId); setIsModalOpen(false); @@ -28,7 +38,12 @@ const MailBoxPage = () => {

보낸 메일함

- +
{ {isLoading ? (
로딩 중...
) : ( - emails.map(mail => ( + filteredEmails.map(mail => ( { const navigate = useNavigate(); @@ -20,7 +20,7 @@ const TicketConfirmPage = () => { const { mutate: cancelTicket } = useCancelTicket(); const handlePreviousButton = () => { - navigate(-1); + navigate("/"); }; const cancleOrderTicket = async (orderIds: number[]) => { cancelTicket(orderIds, { @@ -34,9 +34,8 @@ const TicketConfirmPage = () => {
} centerContent="티켓 구매 확인" - rightContent={검색} /> {isLoading ? (

티켓 정보를 불러오는 중...

diff --git a/src/pages/dashboard/ui/ticket/TicketOptionPage.tsx b/src/pages/dashboard/ui/ticket/TicketOptionPage.tsx index 57a52284..3fd25970 100644 --- a/src/pages/dashboard/ui/ticket/TicketOptionPage.tsx +++ b/src/pages/dashboard/ui/ticket/TicketOptionPage.tsx @@ -66,7 +66,7 @@ const TicketOptionPage = () => { : []; return ( - +
티켓에 추가 옵션 부착 하기

diff --git a/src/pages/event/ui/EventDetailsPage.tsx b/src/pages/event/ui/EventDetailsPage.tsx index a3d9b6ba..a0598122 100644 --- a/src/pages/event/ui/EventDetailsPage.tsx +++ b/src/pages/event/ui/EventDetailsPage.tsx @@ -2,7 +2,6 @@ import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import OrganizerInfo from '../../../widgets/event/ui/OrganizerInfo'; import Header from '../../../../design-system/ui/Header'; -import Search from '../../../../design-system/icons/Search.svg'; import IconButton from '../../../../design-system/ui/buttons/IconButton'; import share from '../../../../public/assets/event-manage/details/Share.svg'; import like from '../../../../public/assets/event-manage/details/Like.svg'; @@ -19,7 +18,7 @@ import { useCreateBookmark, useDeleteBookmark } from '../../../features/bookmark import { formatDate, formatTime } from '../../../shared/lib/date'; import { useEventDetail } from '../../../entities/event/hook/useEventHook'; import useAuthStore from '../../../app/provider/authStore'; - +import HomeButton from '../../../../public/assets/bottomBar/HomeIcon.svg' const EventDetailsPage = () => { const navigate = useNavigate(); const [title, setTitle] = useState(''); @@ -60,12 +59,9 @@ const EventDetailsPage = () => { <>

navigate(-1)} - leftButtonLabel="<" + leftButtonClick={() => navigate('/')} + leftButtonLabel={} centerContent="같이가요" - rightContent={ - 검색 navigate('/search')} /> - } /> {event ? ( <> @@ -114,9 +110,9 @@ const EventDetailsPage = () => {
)}
+ />
{event.result.locationLat !== 0.0 && event.result.locationLng !== 0.0 && ( diff --git a/src/pages/join/InfoInputPage.tsx b/src/pages/join/InfoInputPage.tsx index 8659a196..ce675e57 100644 --- a/src/pages/join/InfoInputPage.tsx +++ b/src/pages/join/InfoInputPage.tsx @@ -64,9 +64,6 @@ const InfoInputPage = () => { alert('회원가입이 완료되었습니다.'); navigate('/'); }, - onError: () => { - alert('약관 동의 처리에 실패했습니다.'); - }, } ); }, diff --git a/src/shared/ui/EventCard.tsx b/src/shared/ui/EventCard.tsx index ee39e4a1..d35c6848 100644 --- a/src/shared/ui/EventCard.tsx +++ b/src/shared/ui/EventCard.tsx @@ -52,6 +52,7 @@ const EventCard = ({ const { pathname } = useLocation(); const [isModalOpen, setIsModalOpen] = useState(false); const { mutate } = useEventDeletion(); + const filteredHashtags = hashtags.filter(tag => tag.trim() !== ''); const isHostPage = pathname.startsWith(`/menu/myHost`) || pathname.startsWith(`/menu/hostDetail`); @@ -94,11 +95,14 @@ const EventCard = ({ {/* 승인 여부 표시 */} {children} {/* 해시태그 */} - {hashtags && ( - e.stopPropagation()} /> + {filteredHashtags && ( + e.stopPropagation()} + /> )} - {/* 대시보드 버튼 */} + {/* 대시보드 버튼 */} {isHostPage && (
{ } }; - console.log('hashtagSlides', hashtagSlides); - return (
{!isAtStart && ( diff --git a/tailwind.config.js b/tailwind.config.js index f6d522ee..039e9e00 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -89,5 +89,5 @@ export default { lg: '512px', // 큰 화면 }, }, - plugins: [require('tailwind-scrollbar-hide')], + plugins: [require('tailwind-scrollbar-hide'),require('@tailwindcss/typography')], }; diff --git a/yarn.lock b/yarn.lock index f3fae70b..37472ed1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -124,18 +124,13 @@ dependencies: "@babel/types" "^7.27.0" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.22.15", "@babel/runtime@^7.26.7": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.22.15", "@babel/runtime@^7.26.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.27.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz" integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz" - integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog== - "@babel/template@^7.26.9", "@babel/template@^7.27.0": version "7.27.0" resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz" @@ -978,9 +973,19 @@ dependencies: "@swc/counter" "^0.1.3" +"@tailwindcss/typography@^0.5.16": + version "0.5.16" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.16.tgz#a926c8f44d5c439b2915e231cad80058850047c6" + integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" + "@tanstack/query-core@5.80.7": version "5.80.7" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.80.7.tgz#e029b26cad02fc5fe64116ac245aad0c3e5f83b4" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.7.tgz" integrity sha512-s09l5zeUKC8q7DCCCIkVSns8zZrK4ZDT6ryEjxNBFi68G4z2EBobBS7rdOY3r6W1WbUDpc1fe5oY+YO/+2UVUg== "@tanstack/query-devtools@5.76.0": @@ -997,7 +1002,7 @@ "@tanstack/react-query@^5.61.3": version "5.80.7" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.80.7.tgz#664f62f42d9ae892c07543fc64f53898aad57afa" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.7.tgz" integrity sha512-u2F0VK6+anItoEvB3+rfvTO9GEh2vb00Je05OwlUe/A0lkJBgW1HckiY3f9YZa+jx6IOe4dHPh10dyp9aY3iRQ== dependencies: "@tanstack/query-core" "5.80.7" @@ -1074,7 +1079,7 @@ "@types/classnames@^2.3.4": version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.3.4.tgz#1a1fdf5023ef216219f13e702543f9ce9b394560" + resolved "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.4.tgz" integrity sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ== dependencies: classnames "*" @@ -1179,7 +1184,7 @@ "@types/offscreencanvas@^2019.6.4": version "2019.7.3" - resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516" + resolved "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz" integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== "@types/prop-types@*": @@ -1430,18 +1435,13 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.3.0: +aria-query@5.3.0, aria-query@^5.0.0: version "5.3.0" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" -aria-query@^5.0.0: - version "5.3.2" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - assertion-error@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" @@ -1636,12 +1636,12 @@ chromatic@^11.15.0, chromatic@^11.22.0: classnames@*, classnames@^2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -2153,6 +2153,11 @@ eventemitter3@^4.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + extend@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" @@ -2168,6 +2173,11 @@ fast-diff@1.1.2: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz" integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== +fast-diff@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + fast-equals@^5.0.1: version "5.2.2" resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz" @@ -2287,7 +2297,7 @@ framer-motion@^12.4.7: fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: @@ -2307,7 +2317,7 @@ gensync@^1.0.0-beta.2: get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: @@ -2662,6 +2672,31 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -2905,6 +2940,11 @@ parchment@^1.1.2, parchment@^1.1.4: resolved "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz" integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg== +parchment@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz" + integrity sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -3008,6 +3048,14 @@ postcss-nested@^6.2.0: dependencies: postcss-selector-parser "^6.1.1" +postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" @@ -3089,6 +3137,25 @@ quill-delta@^3.6.2: extend "^3.0.2" fast-diff "1.1.2" +quill-delta@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz" + integrity sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA== + dependencies: + fast-diff "^1.3.0" + lodash.clonedeep "^4.5.0" + lodash.isequal "^4.5.0" + +quill@2: + version "2.0.3" + resolved "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz" + integrity sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw== + dependencies: + eventemitter3 "^5.0.1" + lodash-es "^4.17.21" + parchment "^3.0.0" + quill-delta "^5.1.0" + quill@^1.3.7: version "1.3.7" resolved "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz" @@ -3239,7 +3306,7 @@ react-transition-group@^4.4.5: react-virtuoso@^4.13.0: version "4.13.0" - resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.13.0.tgz#908197f1afd60993c7953897dacf0aff30028304" + resolved "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.13.0.tgz" integrity sha512-XHv2Fglpx80yFPdjZkV9d1baACKghg/ucpDFEXwaix7z0AfVQj+mF6lM+YQR6UC/TwzXG2rJKydRMb3+7iV3PA== "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^18.3.1: @@ -3327,7 +3394,7 @@ regexp.prototype.flags@^1.5.1: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-from@^4.0.0: @@ -3351,7 +3418,7 @@ reusify@^1.0.4: rollup-plugin-visualizer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.3.tgz#d05bd17e358a6d04bf593cf73556219c9c6d8dad" + resolved "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.3.tgz" integrity sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw== dependencies: open "^8.0.0" @@ -3472,7 +3539,7 @@ source-map-js@^1.2.1: source-map@^0.7.4: version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== source-map@~0.6.1: @@ -3488,7 +3555,6 @@ storybook@^8.4.6: "@storybook/core" "8.6.9" "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - name string-width-cjs version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3507,7 +3573,6 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -3834,7 +3899,7 @@ word-wrap@^1.2.5: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -3843,15 +3908,6 @@ word-wrap@^1.2.5: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" @@ -3868,7 +3924,7 @@ ws@^8.2.3: y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: @@ -3883,12 +3939,12 @@ yaml@^2.3.4: yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.5.1: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1"