From 038dfcb9b43bf7ccd2898f6667973ab38ea809ac Mon Sep 17 00:00:00 2001 From: Pitchaya T <33589608+ptchayap@users.noreply.github.com> Date: Mon, 24 Jun 2024 20:32:41 +0700 Subject: [PATCH] Release/v4.0.0 beta.8 (#67) * chore: ASC-00000 - css module typescript config (#233) * fix: ASC-21254 - align api signature for draft page (#210) * fix: can't upload story * fix: story image renderer * fix: align comment tray component props * fix: align story tab component props * fix: change export name to align signature api * fix: ddraft page * fix: align signature api * fix: fill color * fix: ASC-21249 - align story tab component props (#203) * fix: can't upload story * fix: story image renderer * fix: align comment tray component props * fix: align story tab component props * fix: change export name to align signature api * fix: ddraft page * fix: align signature api * fix: story tab * fix: ASC-21260 - align comment tray component props (#202) * fix: can't upload story * fix: story image renderer * fix: align comment tray component props * fix: align story tab component props * fix: change export name to align signature api * fix: ddraft page * fix: align signature api * fix: story tab * fix: remove unused * fix: comment tray * fix: ASC-21404 - AmityViewStoryPage signature alignment (#209) * fix z-index * fix: signature alignment * fix: view story page * feat: add to support 6 users for storybook (#238) * feat: ASC-00000 - use more env from secrets (#239) * feat: add to support 6 users for storybook * fix: add to read env from secrets * feat: ASC-00000 - add more storybook user (#240) * feat: add to support 6 users for storybook * fix: add to read env from secrets * fix: add use secret on staging * fix: permission (#244) * fix: ASC-21393 - refactor customization 4.0 (#211) * feat: add generateShadeColors func * feat: add AmityUIKitManager * chore: add tsdoc to AmityUIKitManager * fix: merge from develop * fix: AmityUIKit manager * fix: remove unused * fix: revert uikit 3 * fix: remove unused * fix: export * fix: move to main v4 * fix: move to v4 * fix: export path * Refactor theme generation logic in ThemeProvider.tsx * fix: theme color generation * fix: theme provider * fix: remove unused * feat: add Typography component with css * fix: css * fix: add queryClient provider * fix: import * fix: import * fix: v4 * fix: conflict * fix: draft page * fix: setup * fix: export * fix: move mergedNavigationBehavior * fix: remove unused * fix: remove unused * fix: uikit manager * fix: uncomment * fix: remove unused * fix: remove unused * fix: remove unused * fix: remove unused files * fix: remove * fix: login * fix: css var * fix: css var * fix: condition * fix: css var * fix: css var * fix: hook * fix: type * fix: ASC-00000 - V4 fix customization (#248) * fix: config structure * fix: add hyperlink config * fix: add validate * fix: config and hyperlink * fix: hyperlink * fix: css * fix: border radius * fix: hyperlink * fix: hyperlink * fix: add storybook user * fix: aspect ratio * fix: hyperlink config css var Co-authored-by: Kiattirat Sujjapongse * fix: css var module Co-authored-by: Kiattirat Sujjapongse * fix: ASC-21789 - create story on view story page doesn't work (#249) * fix: video * fix: uncomment --------- Co-authored-by: Kiattirat Sujjapongse --------- Co-authored-by: Kiattirat Sujjapongse * feat(chat): ASC-0000 - Chat V4 big chunk 1 (#214) * feat: add livechat ui * feat: add chatButton and desktop view * fix: bg color * feat: move story to be under V4 storybook folder * feat: add customComponent * fix: change chat icon * fix: remove unread notification * fix: remove un-used hook * fix: remove un-used * fix: change style to module css * fix: remove unused * feat: add prefix`asc` to default css config * fix: remove chatIcon * fix: modal not open smoothly at the first time * fix: remove un-used styling * feat: update color pallate * feat: update spacing * feat: update color and fontSize * fix: box shadow on header * feat: re-structure folder to v4 * fix: import global css * fix: use typograhy module css * fix: remove unused * feat: add message list and bubbles * fix: wrap element * fix: change file name * feat: add compose bar * feat: add home indicator * feat: add sending a mesage action * fix: sorting message to be asc * feat: add badge for moderator * fix: overflow message * fix: sortBy segmentAsc * feat: add message list pagination * feat(chat): add draft-js as a compose bar * feat: add loading indicator * feat(chat): fix submit * feat(chat): fix compose bar container * feat: add viewing reply message * fix: deleted message display * fix: remove comment * feat(chat): use default compose bar / remove draft-js * feat(chat): remove draft * feat(chat-state): asc-20903 done loading state * feat(chat-state): asc-20903 restructure * feat(chat-state): asc-20903 apply infinite scroll * feat(chat-state): asc-20903 include error from sdk api to local hook * feat(chat-state): asc-20903 add error state * feat(chat-state): asc-20903 add error state * feat(chat-mention): asc-00000 create message with mention * feat: add popover action * feat: add hover state for message action * feat: add flag and mention button * feat(chat-mention): asc-00000 click to mention * feat: add more action * fix: merge * fix: hide mention and flag * fix: ASC-20213 - fix message list (#219) * fix: message list of the same user * fix: z-index * feat: confirm modal v3 to support dark mode * fix: change to use i18n * fix: TODO text display on Modal content * fix: merge className * fix: remove unused * fix: bring overflow-y back Co-authored-by: Kiattirat Sujjapongse --------- Co-authored-by: Kiattirat Sujjapongse * fix(chat): fix pagination issue (#223) * feat(chat): ASC-21243 - create message with reply message (#218) * feat(chat): reply placeholder * feat(chat): create message with reply * feat: ASC-00000 - dark mode hard code (#225) * fix: dark theme color palatte * fix: header color styling * fix: colors on message bubble * fix: color on popover * fix: color on optionIcon * fix(chat): asc-00000 - fix loading state css broken (#221) * fix(chat): asc-00000 loading state css missing * fix(chat): asc-00000 loading state css missing * feat(chat): ASC-20222 - connection offline alert (#213) * feat(chat): asc-20222 - connection state * feat(chat): asc-20222 - add more connection * feat(chat): asc-20222 - update PR * feat(chat): asc-20222 - update PR * feat: update PR * fix(chat): ASC-00000 - update mention payload (#224) * fix(chat): update mention payload * fix(chat): mention ALL * fix: sample app to open sheet every selection * fix: hide heart reaction * feat: ASC-20213 - fix popover still show (#235) * fix: popover still show * fix: bring just ArrowTop code back * fix: resize messagelist container (#232) * feat: ASC-20213 - highlight mention message (#236) * fix: popover still show * fix: bring just ArrowTop code back * feat: add hilight for mention message * fix: truncate long text of replied message * fix: change getTextWithMention to be a component * fix: message not show as a new line * feat: ASC-20213 - fix consequence message list (#237) * fix: remove consequence message list * fix: remove unused * feat(chat): ASC-00000 - api alignment for chat header (#241) * feat(chat): api alignment chat header * Update src/v4/chat/components/AmityLiveChatHeader/livechatHeader.stories.tsx * feat(chat): ASC-00000 - export AmityLiveChatHeader * fix: ASC-21776 - reply message display on compose bar is over the screen (#242) * fix: reply display message over the screen * feat: remove comment * feat(chat): duplicate useSocialMention => useMention and revert * feat(chat): update pr * fix(chat): ASC-00000 - change theme for message composer (#234) * fix(chat): ASC-00000 - duplicate v4 * fix(chat): ASC-00000 - check message length before submit * fix(chat): ASC-00000 -update styling * fix(chat): ASC-00000 - update styling * fix(chat): prettier remove code by accident * fix(chat): remove styled component * fix(chat): asc-21737 - update condition to prevent create duplicate message (#245) * fix(chat): asc-21791 - fix mention payload (#243) * feat(chat): update pr * feat: ASC-20213 - message bubble api alignment (#247) * fix: message bubble api aligment * fix: to use action as params for message bubble * feat: export elements * fix: remove unused * fix: change type name Co-authored-by: Kiattirat Sujjapongse * fix: type name * feat: expose component * fix: wrong type name * fix: modify expose component * fix: storybook's name --------- Co-authored-by: Kiattirat Sujjapongse * fix(chat): ASC-21796 - query chat after connection back to normal + api alignment (#246) * fix(chat): asc-21796 reload data when connection back to normal * feat(chat): api alignment for message list * feat(chat): export * feat(chat): api align live chat page * feat(chat): api align for composer * feat(chat): update pr * feat(chat): update pr * feat(chat): remove all v4 component from useCustomComponent * feat(chat): update pr - remove chat header * feat(chat): ASC-00000 - compose bar api alignment (#250) * feat(chat): composebar alignment * feat(chat): update pr * fix(chat): revert code (#251) * feat: ASC-20213 - modal notification v4 (#252) * fix: add confirm modal v4 * fix: change to use Notification v4 * fix: remove unused * fix: duplicate icon to v4 * fix: move confirm model component * fix: revert modal and confirm v3 components * fix: revert notification v3 * fix: move Icon to v4 and remove unused icon * fix(chat): revert code * feat: ASC-20213 - fix delete message display (#256) * fix: move component to v4 folder * fix: delete message * feat(chat): update pr * fix(chat): ASC-21734 - Fix UI Bug (#255) * fix(chat): update mention ui * fix(chat): update mention ui * fix(chat): update delete word * fix(chat): update mention ui * fix(chat): update mention ui * Update src/i18n/en.json Co-authored-by: Pitchaya T. <33589608+ptchayap@users.noreply.github.com> * feat(chat): update mention logic * feat(chat): update pr * feat(chat): revert text * feat(chat): update mention logic * fix(chat): popup width * fix(chat): font-color in light mode * fix(chat): placeholder * fix(chat): fix moderator * feat(chat): fix mention * feat(chat): fix avatar in reply * feat(chat): update pr * feat(chat): use rem * feat(chat): update pr --------- Co-authored-by: Pitchaya T. <33589608+ptchayap@users.noreply.github.com> * fix: ASC-20213 - bug staging (#257) * fix: bug staging * fix: revert overflow-x * feat: ASC-20213 - livechat configuration merge (#253) * feat: add generateShadeColors func * feat: add AmityUIKitManager * chore: add tsdoc to AmityUIKitManager * fix: merge from develop * fix: AmityUIKit manager * fix: remove unused * fix: revert uikit 3 * fix: remove unused * fix: export * fix: move to main v4 * fix: move to v4 * fix: export path * Refactor theme generation logic in ThemeProvider.tsx * fix: theme color generation * fix: theme provider * fix: remove unused * feat: add Typography component with css * fix: css * fix: add queryClient provider * fix: import * fix: import * fix: color palette * fix: change global.css file * fix: v4 * fix: conflict * fix: draft page * fix: setup * fix: export * fix: move mergedNavigationBehavior * fix: remove unused * fix: remove unused * fix: uikit manager * fix: uncomment * fix: remove unused * fix: remove unused * fix: remove unused * fix: remove unused files * fix: remove * fix: login * fix: typography and style files * fix: typography * fix: message type * fix: type * fix: add background to livechat page * feat: add config for message bubble * feat: fix cannot load next page * fix: type * feat: add placeholder for compose bar configuration * feat: revert storybook user * fix: use primary color from theme * fix: nested component style * fix: to pass class * fix: change to be module.css * fix: remove unused file * fix: remove unused config * fix: typography * fix: default user avatar * feat: upgrade ts-sdk * fix: revet theme file --------- Co-authored-by: Chaiwat Trisuwan * fix(chat): change tag --------- Co-authored-by: ptchaya_p Co-authored-by: ptchaya_p Co-authored-by: Pitchaya T <33589608+ptchayap@users.noreply.github.com> Co-authored-by: Chaiwat Trisuwan * feat(chat): ASC-0000 - export compose bar (#258) * feat: export v4 provider (#259) * Release/v4.0.0 beta.1 (#262) * fix: update ts-sdk version * chore(release): 4.0.0-beta.1 --------- Co-authored-by: Chaiwat Trisuwan Co-authored-by: bmo-amity-bot * fix: ASC-00000 - export type (#263) * fix: export type * fix: update version * fix: ASC-00000 - fix provider v4 props (#261) * fix: provider * fix: provider * fix: export * fix: export * fix: type * fix: pnpm lock * fix: deps * Release/v4.0.0 beta.2 (#265) * fix: export wrong path (#264) * chore(release): 4.0.0-beta.2 --------- Co-authored-by: bmo-amity-bot * feat: ASC-20277 - flag unflag message (#267) * feat: add report button on message action sheet * feat: add flag ui on message bubble container * fix: cannot click report button * feat: add unFlag button * fix: unflag button text id * feat: add flag/unflag toast * feat: add livechat toast * fix: icon to support color changing * fix: message and id for report, unreport * fix: remove unused * fix: use color from palette * fix: ASC-00000 - remove sheet loading state (#271) * fix: remove sheet in loading state * fix: remove wrong return * fix: ASC-21913 - type and optional field on config (#268) * fix: type and optional field on config * fix: remove undefined checking * fix: use config from customization provider * fix: add error state on delete message (#269) * fix: ASC-21767 - mention border when got mention (#272) * fix: mention border when got mention * fix: remove console.log * feat: ASC-21691 - add hyperlink style to primary color (#270) * feat: add hyperlink style to primary color * fix: remove className because Linktify does not support * fix: remove nested selector and open to new tab * fix(social): asc-00000 use internal path (#266) * feat: ASC-17980 - global feed story targets tab and story target circle (#254) * feat: add generateShadeColors func * feat: add AmityUIKitManager * chore: add tsdoc to AmityUIKitManager * fix: merge from develop * fix: AmityUIKit manager * fix: remove unused * fix: revert uikit 3 * fix: remove unused * fix: export * fix: move to main v4 * fix: move to v4 * fix: export path * Refactor theme generation logic in ThemeProvider.tsx * fix: theme color generation * fix: theme provider * fix: remove unused * feat: add Typography component with css * fix: css * fix: add queryClient provider * fix: import * fix: import * fix: v4 * fix: conflict * fix: draft page * feat: global feed story tab * fix: empty state * fix: css module * fix: official badge * fix: css * fix: css * fix: css * fix: update from comments * fix: story tab item * feat: feed v4 * fix: private condition * fix: story * fix: css * fix: remove unused * fix: story * fix: remove unused * fix: ignore type * fix: progress ring * fix: use clsx * fix: remove ts-ignore * fix: remove unused * feat(chat): ASC-00000 - Muted + Banned channel (#276) * feat(chat): isMuted done * feat(chat): asc-00000 remove comment * feat(chat): banned user * feat(chat): update PR * feat(chat): update PR * feat(chat): ASC-00000 - fix composebar styling + limit 200 character (#275) * fix(social): asc-00000 use from v4 folder * fix(chat): asc-00000 fix mention styling in composebar * fix: update styling * fix: compose bar styling * feat: limit text * feat: revert file * feat: revert file * feat: remove deprecated func * fix: ASC-21913 - config type (#278) * fix: type and optional field on config * fix: remove undefined checking * fix: use config from customization provider * fix: use defaultConfig * fix: add blocked word + not allowed link (#280) * fix: icon (#281) * fix: using v3 and v4 provider separately for each stories (#284) * fix: ASC-00000 - confirm context (#285) * fix: confirm context * chore: Update src/social/components/Comment/index.tsx Co-authored-by: Pitchaya T. <33589608+ptchayap@users.noreply.github.com> * chore: remove unused code --------- Co-authored-by: Pitchaya T. <33589608+ptchayap@users.noreply.github.com> * fix: ASC-00000 - notification context (#286) * fix: NotificationProvider * fix: add NotificationProvider into UiKitProvider * chore: move LiveChatNotificationProvider to chat * fix: ASC-00000 - add login step on UiKitProvider (#287) * fix: login * fix: Update src/core/providers/UiKitProvider/index.tsx * fix: message remain on compose bar after sending success (#289) * fix: user muted state (#293) * fix: ASC-22026 - moderator cannot send message on muted channel (#294) * fix: user muted state * fix: moderator cannot send message on muted channel * fix: ASC-219999 - incorrect comment count color (#283) * fix: font * fix: story tab gap * fix: modal * fix: ASC-21979 - can't click header on video preview (#282) * fix: use css var * fix: move v4 story * fix: move folder * fix: remove index path * fix: styled to css module * fix: use v4 (#295) * fix: ASC-20502 - shouldAllowCreation condition (#296) * fix: shouldAllowCreation * fix: type * fix: ASC-20883 - remove latestComments prop (#290) * fix: pass latestComments to CommentList component * fix: remove latestComments prop * fix: add v3 provider (#298) * fix: ASC-21980 - hyper link background color (#299) * fix: use v4 * fix: hyperlink position and bg color * fix: remove styled component * feat: ASC-21665 - darkmode config (#279) * fix: type and optional field on config * fix: remove undefined checking * fix: use config from customization provider * feat: handle switch light/dark mode * feat: add configuration live chat page * feat: add config on livechat header * feat: add theme configuration message list * feat: add configuration theme on message composer * fix: modal styling * feat: add configuration for livechat notification * fix: copy message to use livechat notification * fix: pr review * fix: pr * fix: user preferred theme * fix: ASC-21980 - fix remove link button style (#300) * fix: use v4 * fix: hyperlink position and bg color * fix: remove styled component * fix: button * fix: character limit (#302) * fix: change permission to check if user is a moderator (#304) * fix: ASC-22060 - remove onBack() on draft page (#303) * fix: use v4 * fix: hyperlink position and bg color * fix: remove styled component * fix: button * fix: hyperlink style * fix: style * fix: story tab item font color * fix: css var * fix: remove onBack() * fix: css * fix: remove unused * fix: remove unused line * fix: ASC-21980 - hyperlink style (#301) * fix: use v4 * fix: hyperlink position and bg color * fix: remove styled component * fix: button * fix: hyperlink style * fix: style * fix: story tab item font color * fix: css var * fix: css * fix: remove unused * fix: remove line * fix: ASC-22063 - fix story global feed pagination (#305) * fix: use v4 * fix: hyperlink position and bg color * fix: remove styled component * fix: button * fix: hyperlink style * fix: style * fix: story tab item font color * fix: css var * fix: remove onBack() * fix: story global feed pagination * fix: add comment * fix: remove new line * fix: remove console.log * fix: logic * fix: story style * chore: Update src/v4/styles/global.css * fix: remove console.log --------- Co-authored-by: Bonn * fix: official condition (#306) * fix: ASC-19646 - notification error when failed create story (#307) * fix: official condition * fix: add error * fix: ASC-22060 - navigate to community when create story (#308) * fix: official condition * fix: add error * fix: navigate * fix: ASC-21985 - navigate story target for global feed story (#309) * fix: official condition * fix: add error * fix: navigate * fix: story global feed navigate * fix: onClose * fix: ASC-22060 - create story on view story page (#310) * fix: story global feed upload * fix: remove console.log * fix: navigate * fix: ASC-21970 - story uploading state (#297) * fix: font * fix: story tab gap * fix: use css var * fix: modal * fix: can't delete story * fix: v4 component * fix: hyperlink config * fix: shouldAllowCreation * fix: type * fix: uploading state * fix: remove console.log * fix: use css var * fix: modal * fix: v4 component * fix: hyperlink config * fix: shouldAllowCreation * fix: type * fix: uploading state * fix: remove console.log * fix: storyRing state * fix: remove fill in verified icon * fix: story ring * fix: icon * fix: story --------- Co-authored-by: Bonn * fix: notification style (#311) * fix: add onAllStoriesEnd (#312) * Release/v4.0.0 beta.3 (#314) * chore: upgrade dependencies * fix: cherry-pick bugs from v3 * chore(release): 4.0.0-beta.3 --------- Co-authored-by: bmo-amity-bot * chore(sdk): ASC-00000 - custom build ci (#316) * chore: custom build ci * chore: remove unused libs * chore: fix ci * chore: fix ci * fix: revert ci * fix: remove pnpm cache step * fix: pnpm install step * fix: ci * fix: add NPM_TOKEN * fix: update .npmrc * fix: update pnpm-lock.yaml * fix: path * chore: add cache step * feat: only creator or story permission can see impression (#319) * feat: ASC-22084 - StoryPreview component for Console (#317) * feat: story preview component for console * fix: ui * fix: story preview prop * fix: export * fix: story prop * fix: story prop * fix: trigger action * fix: trigger action * fix: trigger action * fix: trigger action * fix: action * update readme (#323) * feat: ASC-20558 - swipe down gesture to close story (#321) * feat: apply framer motion * feat: add transition * fix: swipe down for video * fix: video story should pause when drag * fix: remove unused libs * fix: wrong spell function name * fix: remove unused * chore: change story component name * fix: v4 avatar component * feat: add ghost prop to button * fix: remove unused * fix: bottom sheet component * fix: use rem * fix: load more wrapper * fix: draft page * fix: load more button * fix: hyperlink * fix: css * fix: icon * fix: css * fix: css * fix: comment * fix: story comment * fix: remove unused * fix: import * fix: button dark theme * fix: custom css * fix: bottom sheet css * fix: css * fix: import * fix: css * fix: css * fix: avatar * fix: remove console.log * fix: avatar * fix: use clsx * fix: whitespace * fix: use icon from v4 * fix: icon * fix: loading indicator * fix: ASC-22263 - hyperlink background (#326) * fix: hyperlink background * fix: hyperlink icon color * fix: css (#327) * fix: ASC-22263 - hyperlink doesn't show in view story page (#328) * fix: hyperlink background * fix: hyperlink icon color * fix: css (#327) * fix: story * fix: css * fix: ASC-22264 - reply comment margin (#329) * fix: hyperlink background * fix: hyperlink icon color * fix: css * fix: add scroller * fix: comment * fix: ASC-21792 - comment list infinite scroll (#330) * fix: hyperlink background * fix: hyperlink icon color * fix: css * fix: add scroller * fix: comment * fix: scroll * fix: comment list * fix: reaction list * fix: comment date css shrink * fix: type * fix: css * fix: color * fix: comment scroll * fix: comment list * fix: use intersection observer instead * fix: padding * Release/v4.0.0 beta.4 (#334) * fix: github actions * chore: dropdown instead of free-text * chore: add none option * chore: add none option for pre-release input * fix: add NPM_TOKEN env * chore(release): 4.0.0-beta.4 --------- Co-authored-by: bmo-amity-bot * fix: to support un config value (#340) * fix: hyperlink long text (#335) * fix: hyperlink custom text input max length (#336) * fix: ASC-220001 - share story button (#337) * fix: share story button * fix: use avatar v4 * fix: remove unused * fix: ASC-21590 - hyperlink ui (#347) * fix: hyperlink long text * fix: story hyperlink * fix: story commu condition (#346) * feat: ASC-22133 - custom reaction provider (#325) * feat: add custom reaction provider * feat: add to use reactionsContext * fix: rename provider * feat: ASC-22127 - reaction preview message bubble (#331) * feat: add reaction preview container * feat: add abbreviateCount function * feat: add fallback reaction * feat: update pr --------- Co-authored-by: Kiattirat S * feat: ASC-22124 - message reaction picker (#332) * feat: add reaction container and button * feat: add active and hover state * fix: storybook display * fix: remove unused * feat: add checking for active state * feat: add open state on reaction picker * feat: add hover state on Quick reaction button * feat: seperate components * feat: close picker when clicking outside * feat: add handling on click reaction button * fix: hover state * Update src/v4/chat/components/LiveChatMessageContent/MessageReaction/index.tsx * Delete src/v4/chat/hooks/useMessageReactions.ts --------- Co-authored-by: Kiattirat Sujjapongse * feat: ASC-22130 - add quick reaction (#339) * feat: add handling for quick reaction button * fix: add await to wait for add and remove reaction * fix: reaction pickert style * fix: storybook name * fix: reaction picker storybook * feat: add pageId, componentId and elementId * fix: change internal component name and export * fix: export from components * fix: message reaction components name * feat: add static file to include in storybook build * fix: remove duplicated file * fix: new design on my reaction * fix: not use z-index * fix: position of each reaction * fix: remove border on reaction preview for my reaction style * fix: remove unused * feat(reaction): ASC-22136 - reaction panel (#344) * feat: add handling for quick reaction button * fix: add await to wait for add and remove reaction * fix: reaction pickert style * fix: storybook name * fix: reaction picker storybook * feat: add pageId, componentId and elementId * fix: remove comment * feat(reaction-list): add empty files * feat(reaction): reuse reaction tab from social * feat(reaction): pass openReaction func to child * feat(reaction): render data from config * feat(reaction): update panel style * feat(reaction): update reaction list * feat(reaction): update reaction list * feat(reaction): add all state for reaction list * feat(reaction): change unit * feat(reaction): remove unused files * feat(reaction): update PR * feat(reaction): update PR * feat(reaction): update PR * fix: remove unused * feat(reaction): update PR --------- Co-authored-by: ptchaya_p Co-authored-by: Pitchaya T <33589608+ptchayap@users.noreply.github.com> --------- Co-authored-by: Kiattirat S * fix: ASC-22623 - story video (#349) * fix: story video * fix: video * fix: remove console.log * feat(reaction): update condition (#350) * fix(reaction): ASC-22611 - update missing ui and action to remove reaction from message (#348) * fix: ASC-22611 - update ui * fix(reaction): missing ui and action to remove reaction from message * fix: ASC-22611 - update ui * fix: ASC-22611 - update ui * fix(reaction): hide 0 reaction count * fix(reaction): update pr * fix(reaction): export reaction list * fix: create story condition (#352) * fix: ASC-222740 - create story condition for global-admin role (#354) * fix: create story condition * fix: condition * fix: condition * fix: condition * fix(reaction): ASC-22622 - fix reaction UI bugs (#355) * fix(reaction): update pagination * fix(reaction): use total reactor count from message / story / post / comments * fix(reaction): update ui * fix(reaction): update ui * fix: ASC-22740 - create story permission condition to create story (#356) * fix: create story condition * fix: condition * fix: condition * fix: condition * fix: condition * feat(SDK): test build * feat(SDK): upgrade ts-sdk version * fix: ASC-21529 - view story wrapper css (#359) * fix: css * refactor: view story page condition * fix: ASC-20521 - story delete condition (#360) * fix: story delete condition * fix: condition * fix: ASC-20505 - condition for non member (#361) * fix: condition for non member * fix: hyperlink config * fix: condition * fix: hook (#362) * fix: ASC-22947 - hyperlink config bottom sheet condition (#367) * fix: hyperlink action condition * fix: hyperlink css * fix: remove unused * fix: hyperlink config condition * fix: ASC-22949 - video story bug when delete (#366) * fix: video story bug when delete * fix: remove console.log * fix: condition * fix: close bottom sheet condition (#365) * fix: ASC-20502 - comment condition (#363) * fix: comment condition * fix: story comment compose bar condition * fix: ASC-22484 - hyperlink config css (#345) * fix: hyperlink config css * fix: remove unused * fix: remove unused * fix: hyperlink * fix: color bg * fix: remove console log * fix: type * fix: type * fix: hyperlink * fix: ASC-20532 - deleted comment block (#364) * fix: deleted comment block * fix: css * fix: remove unused props * fix: css var * fix: category card responsive styles (#372) * fix: ASC-22947 - story can't add hyperlink (#373) * fix: hyperlink action condition * fix: hyperlink css * fix: remove unused * fix: hyperlink config condition * fix: css * fix: ASC-00000 - bring back v3 code (#358) * Revert "fix: ASC-21481 - remove unnecessary request to prevent rate limit (#230)" This reverts commit e9c82ec82889773dc875f812e7688e4363d20569. # Conflicts: # pnpm-lock.yaml # src/core/providers/UiKitProvider/index.tsx # src/social/components/CommentList/index.tsx # src/social/components/CommentList/styles.tsx # src/social/components/EngagementBar/UIEngagementBar.tsx * fix: reply comment text * Revert "fix: ASC-21481 - remove unnecessary request to prevent rate limit (#230)" This reverts commit e9c82ec82889773dc875f812e7688e4363d20569. # Conflicts: # pnpm-lock.yaml # src/core/providers/UiKitProvider/index.tsx # src/social/components/CommentList/index.tsx # src/social/components/CommentList/styles.tsx # src/social/components/EngagementBar/UIEngagementBar.tsx * fix: reply comment text * fix: undefined .length * fix: video should pause when click item in action menu (#375) * fix: hyperlink text color (#376) * fix: ASC-21507 - reset form when confirm remove hyperlink (#368) * fix: hyperlink action condition * fix: hyperlink css * fix: remove unused * fix: hyperlink config condition * fix: reset form when confirm remove hyperlink * chore: ASC-22035 - customizations (#378) * feat: ThemeProvider, CustomizationProvider and IconComponent * chore: remove unused code * chore: useAmityComponentProps * feat: useAmityPage, useAmityComponent, useAmityElement * chore: update foundation * fix: uikit hook bug * fix: update core foundation (theme, modal) * fix: default color palette * fix: types * fix: fix isExcluded * chore: remove unused code * fix: typing * fix: fix a testing workflow * chore: Apply suggestions from code review Co-authored-by: Pitchaya T. <33589608+ptchayap@users.noreply.github.com> --------- Co-authored-by: Pitchaya T. <33589608+ptchayap@users.noreply.github.com> * fix: story tab show with member only (#383) * chore: ASC-22036 - stylelint (#379) * chore: stylelint * chore: add postcss * chore: update lint scripts * chore: ASC-22039 - browserslist (#380) * chore: setup browserslist * chore: run prettier * fix: draft video should loop (#369) * chore: ASC-22040 - node 20 (#381) * chore: add asdf and change engines field of node version to 20 * chore: pnpm v9 * chore: remove pull_request_template.md * chore: upgrade github actions * chore: update node version --------- Co-authored-by: Chaiwat Trisuwan * fix: fix a staging workflow (#389) * fix: add pnpm install step (#390) * feat: ASC-22340 - CommunitySearchResults (#391) * feat: CommunitySearchResults * fix: update avatar size * feat: ASC-22294 - PostContent (#392) * feat: PostContent * fix: lint * chore: update package.json * fix: elements/index * feat: TopSearchBar (#393) * feat: SocialHomePage (#394) * feat: SocialGlobalSearchPage (#395) * feat: MyCommunities (#396) * feat: PostDetailPage (#397) * feat: ASC-22335 - update routes (#398) * feat: update route * chore: remove unused code * chore: Drawer (#402) * fix: text overflow (#400) * chore: ASC-22335 - update SocialGlobalSearchPage route (#399) * feat: add SocialGlobalSearchPage routing * fix: update useUserQueryByDisplayName * fix: ASC-22335 - VideoViewer styles (#401) * fix: fix VideoViewer * chore: remove console.log * fix: ASC-21508 - hyperlink to show confirm when back with data (#404) * fix: hyperlink to show confirm when back with data * fix: bring bank old cold * fix: pageId no need to pass prop * fix: ASC-20694 - react story condition for non member (#370) * fix: comment condition * fix: story react condition for non member * fix: import * fix: params * fix: ASC-22312 - moderator badge (#384) * fix: moderator badge * fix: moderator badge * fix: moderator badge * fix: use css var * fix: remove unused * fix: remove package manager * fix: comment tray stories * fix: remove unused * fix: remove console.log * fix: sub story community rte * feat: ASC-22893 - create post menu & select post target page (#405) * style: change create menu color * feat: implement ui CreatePostMenu * feat: add event when click createPostMenuButton * feat: implement CreateStoryButtons * feat: implement CreatePollButton * feat: implement CreateLivestreamButton * fix: text Livestream * fix: changeable text * feat: implement SelectPostTargetPage * feat: onBack * fix: pageId * fix: text static * style: pointer * feat: integrate API communites to SelectPostTargetPage * feat: custom communities avatar size * feat: add UserAvatar * feat: apply infinity scroll * fix: map key * feat: add userId * style: change px to rem * fix: dark theme styles * reafactor: remove blank line * style: add pointer * fix: pr comments * refactor: wrap button in IconComponent * style: adapt global var * fix: optional pageId * refactor: remove comment * feat: ASC-22888 - hide create post menu for current release (#413) * feat: comment code create post menu for current release * fix: remove SelectPostTargetPage * fix: hyperlink confirm remove link (#406) * fix: ASC-23219 - story view page onClose (#408) * fix: story view page onClose * fix: to v4 * fix: removed deprecated * fix: import * fix: ASC-20522 - navigate view story in mobile overlay (#409) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: remove unused * fix: import * fix: import * fix: global story hook import * fix: ASC-22720 - view story full width and height (#410) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: view story full width and height * feat(message): handle optimistic on message creation (#377) * fix: ASC-22081 - notification v4 (#411) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: view story full width and height * fix: notification v4 * fix: file name * fix: ASC-20521 - delete first multiple story go to next story (#412) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: view story full width and height * fix: notification v4 * fix: delete first multiple stories go to next story * fix: ASC-23136 - fix social v3 issues (#388) * fix: bring back reply i18n i18n * fix: icon size * fix: comments do not load * chore: story in v3 * fix: isFlaggedByMe rate limit issue * fix: fix PageBehavior * fix: ViewStoryPage navigation * fix: remove duplicate * fix: import * fix: draft page prop * fix: draft story page storyType prop --------- Co-authored-by: Chaiwat Trisuwan * feat: ASC-00000 - tech debt livechat (#416) * fix: unconfigurable style * fix: modify avatar v4 to support defaultImage * fix: livechat avatar to use avatar component v4 * fix: user icon in message bubble to use v4 compo * fix: change defaul image for livechat * fix: use avatar v4 component on story preview * fix: to use v4 components in reply message placeholder * fix: mention item to use v4 avatar components * fix: defaultImage on share story button * fix: theme on AmityLiveChatHeader * fix: compose bar to use useAmityComponent * fix: LiveChatMessageList to use useAmityComponent * fix: remove condition variable * fix: configuration value * fix: message reaction to use useAmityElement * fix: remove unused * fix: to use same value on light and dark theme for livechat * fix: remove /index * fix: view story page context (#420) * fix: build include css (#421) * fix: ASC-23233 - disabled button when file is uploading and fix 429 issue (#422) * fix: disabled remove button when file is uploading * fix: add handle document event when menu opened * fix: ASC-23288 - disabled submit vote button (#424) * fix: disabled submit vote button * chore: remove console.log * fix: formatDuration (#429) * fix: link text color (#426) * fix: reduce comment api network call amount (#427) * fix: like button color (#425) * fix: play icon (#428) * feat: ASC-23090 - LinkPreview (#414) * feat: LinkPreview * fix: error handling * fix: types * fix: move post creator out of infinite scroll (#430) * fix: append a created poll post (#432) * fix: ASC-22315 - error noti when user upload unsupported file (#417) * fix: story tab background color * fix: update navigate * fix: styled to css module * fix: remove console.log * fix: remove console.log * fix: story tab * fix: type * fix: remove console.log * fix: story tab type * fix: noti css * fix: story avatar * fix: remove unused * fix: remove unused * fix: share story button use amityElement * fix: icon * fix: add default communityProfileImageBackground * fix: story tab community * fix: story tab * fix: navigate * fix: story navigate * fix: remove unused * fix: red border story tab * fix: import and type * fix: import and type * fix: remove error icon z-index * fix: official badge condition * fix: remove unused * fix: height * fix: story avatar * fix: share story button * fix: ASC-20535 - deleted reply block (#418) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: view story full width and height * fix: notification v4 * fix: delete first multiple stories go to next story * fix: story tab background color * fix: update navigate * fix: styled to css module * fix: remove console.log * fix: remove console.log * fix: story tab * fix: type * fix: remove console.log * fix: story tab type * fix: noti css * fix: story avatar * fix: remove unused * fix: remove unused * fix: share story button use amityElement * fix: icon * fix: add default communityProfileImageBackground * fix: story tab community * fix: story tab * fix: navigate * fix: story navigate * fix: remove unused * fix: red border story tab * fix: remove ts-sdk peer dep * fix: delete comment * fix: i18n * fix: add margin-bottom to container * fix: remove packagemanager * fix: story ring empty state color * fix: import and type * fix: import and type * fix: remove error icon z-index * fix: official badge condition * fix: remove i18n * fix: no comment word * fix: ASC-20356 - story tab should navigate to unseen (#419) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: view story full width and height * fix: notification v4 * fix: delete first multiple stories go to next story * fix: story tab background color * fix: update navigate * fix: styled to css module * fix: remove console.log * fix: remove console.log * fix: story tab * fix: type * fix: remove console.log * fix: story tab type * fix: noti css * fix: story avatar * fix: remove unused * fix: remove unused * fix: share story button use amityElement * fix: icon * fix: add default communityProfileImageBackground * fix: story tab community * fix: story tab * fix: navigate * fix: story navigate * fix: remove unused * fix: red border story tab * fix: remove ts-sdk peer dep * fix: delete comment * fix: i18n * fix: add margin-bottom to container * fix: remove packagemanager * fix: story ring empty state color * fix: story tab should navigate to unseen * fix: type * fix: import and type * fix: type * fix: background image * fix: element * fix: community story tab condition * fix: remove unused * fix: create story button * fix: community story tab render condition * fix: delete community story condition * fix: discard create story navigate condition * fix: add create new story button * fix: export create new story button * chore: add ui story for create new story button * fix: share story button * fix: remove unused * fix: close button color * fix: remove unused * fix: remove unused function * fix: remove unused * fix: flicker render * fix: loading overlay width height * fix: draft page container * fix: remove inline function * fix: story wrapper height * fix: community story tab condition * fix: aspect ratio button to use useAmityElement * fix: elements * fix: remove inline function * fix: elements * fix: import and type * fix: remove error icon z-index * fix: official badge condition * fix: prop * fix: import * fix: community avatar * fix: story tab condition * fix: type * fix: remove console.log * fix: story tab condition * fix: remove i18n * fix: no comment word * fix: elements * fix: type * fix: add pageId to confirm * fix: ASC-21809 - upload video story on mobile device (#423) * fix: story view page onClose * fix: to v4 * fix: overlay bug * fix: remove console.log * fix: remove styled component * fix: add story arrow left right to customization provider * fix: view story full width and height * fix: notification v4 * fix: delete first multiple stories go to next story * fix: story tab background color * fix: update navigate * fix: styled to css module * fix: remove console.log * fix: remove console.log * fix: story tab * fix: type * fix: remove console.log * fix: story tab type * fix: noti css * fix: story avatar * fix: remove unused * fix: remove unused * fix: share story button use amityElement * fix: icon * fix: add default communityProfileImageBackground * fix: story tab community * fix: story tab * fix: navigate * fix: story navigate * fix: remove unused * fix: red border story tab * fix: remove ts-sdk peer dep * fix: delete comment * fix: i18n * fix: add margin-bottom to container * fix: remove packagemanager * fix: story ring empty state color * fix: story tab should navigate to unseen * fix: type * fix: import and type * fix: type * fix: background image * fix: element * fix: official badge condition * fix: condition * chore: add react-aria-component * fix: hooks * fix: community story tab condition * fix: remove unused * fix: create story button * fix: community story tab render condition * fix: delete community story condition * fix: discard create story navigate condition * fix: add create new story button * fix: export create new story button * chore: add ui story for create new story button * fix: share story button * fix: remove unused * fix: close button color * fix: remove unused * fix: remove unused function * fix: remove unused * fix: flicker render * fix: loading overlay width height * fix: draft page container * fix: remove inline function * fix: story wrapper height * fix: community story tab condition * fix: aspect ratio button to use useAmityElement * fix: elements * fix: remove inline function * fix: elements * fix: import and type * fix: remove error icon z-index * fix: official badge condition * fix: prop * fix: import * fix: community avatar * fix: condition * fix: story tab condition * fix: type * fix: story tab * fix: community * fix: type and layout (#434) * fix: ASC-21494 - non member can react in comment tray (#433) * fix: story tab background color * fix: update navigate * fix: styled to css module * fix: remove console.log * fix: remove console.log * fix: story tab * fix: type * fix: remove console.log * fix: story tab type * fix: noti css * fix: story avatar * fix: remove unused * fix: remove unused * fix: share story button use amityElement * fix: icon * fix: add default communityProfileImageBackground * fix: story tab community * fix: story tab * fix: navigate * fix: story navigate * fix: remove unused * fix: red border story tab * fix: import and type * fix: import and type * fix: remove error icon z-index * fix: official badge condition * fix: reaction list * fix: remove console.log * fix: import * fix: pass pageId and componentId * fix: avatar * fix: community avatar * fix: play pause button * fix: story tab condition * fix: remove unused * fix: remove unused * fix: story tab * fix: onPress * fix: wrapper * fix: rem * fix: remove package manager * feat: skeleton loader (#407) * fix: ASC-23278 - view story container (#435) * fix: create new story button prop * fix: story view * fix: remove package manager * fix: remove console * fix: unnecessary code * fix: elements * fix: ASC-23385 - view story comment tray close after comment (#438) * fix: create new story button prop * fix: story view * fix: remove package manager * fix: remove console * fix: unnecessary code * fix: elements * fix: story comment button width * fix: useGetActiveStoriesByTarget hook * fix: add story progress bar * fix: view story comment tray close after comment * fix: story progress bar * fix: community story * fix: remove unused * fix: community * fix: type * fix: speaker button condition ui * fix: story sub * fix: remove unused * fix: button css * Release/v4.0.0 beta.7 (#439) * chore(release): 4.0.0-beta.5 * chore(release): 4.0.0-beta.6 * fix: build include css (#421) * chore(release): 4.0.0-beta.7 --------- Co-authored-by: bmo-amity-bot * Release/v4.0.0 beta.8 (#440) * build: upgrade version ts-sdk * build: upgrade dependencies * chore(release): 4.0.0-beta.8 --------- Co-authored-by: bmo-amity-bot * chore(release): 4.0.0-beta.8 --------- Co-authored-by: Bonn Co-authored-by: Chaiwat Trisuwan Co-authored-by: Kiattirat Sujjapongse Co-authored-by: bmo-amity-bot Co-authored-by: ChayanitBm --- .browserslistrc | 1 + .github/pull_request_template.md | 13 - .github/workflows/dev.yaml | 12 +- .github/workflows/production.yaml | 8 +- .github/workflows/staging.yaml | 19 +- .github/workflows/testing.yaml | 14 +- .npmrc | 1 - .prettierignore | 3 + .storybook/manager.ts | 2 +- .stylelintignore | 3 + .stylelintrc.json | 6 + .tool-versions | 1 + CHANGELOG.md | 2 + amity-uikit.config.json | 18 +- code-of-conduct.md | 2 +- package.json | 34 +- pnpm-lock.yaml | 18906 ++++++++++------ postcss.config.js | 6 + security.md | 2 +- src/chat/components/ChatHeader/styles.tsx | 8 +- src/chat/components/Message/styles.tsx | 5 +- src/chat/components/RecentChat/styles.tsx | 5 +- src/core/components/Dropdown/index.tsx | 50 +- src/core/components/Linkify/index.tsx | 15 +- src/core/components/Linkify/styles.tsx | 2 +- src/core/components/Notification/index.tsx | 2 +- .../components/Uploaders/File/StyledFile.tsx | 8 +- src/core/components/Uploaders/File/styles.tsx | 2 +- .../components/Uploaders/Image/styles.tsx | 9 +- .../components/Uploaders/Video/styles.tsx | 4 +- .../providers/UiKitProvider/fonts/inter.css | 113 +- src/core/providers/UiKitProvider/index.tsx | 66 +- src/i18n/en.json | 8 +- src/icons/EmptyImageGallery.tsx | 3 +- src/icons/EmptyLivestreamGallery.tsx | 2 +- src/icons/EmptyVideoGallery.tsx | 5 +- src/icons/FileAttachment.tsx | 2 +- src/icons/Globe.tsx | 2 +- src/icons/ImageAttachment.tsx | 2 +- src/icons/Mention.tsx | 16 +- src/icons/Newspaper.tsx | 2 +- src/icons/NewspaperLight.tsx | 2 +- src/icons/Play.tsx | 5 +- src/icons/ThumbsUp.tsx | 5 +- src/index.ts | 2 +- .../components/Comment/StyledComment.tsx | 233 +- src/social/components/Comment/index.tsx | 29 - src/social/components/Comment/styles.tsx | 13 + .../components/CommentLikeButton/styles.tsx | 3 + src/social/components/CommentList/index.tsx | 114 +- .../CommunityInfo/UICommunityInfo.tsx | 2 +- .../EngagementBar/UIEngagementBar.tsx | 4 +- src/social/components/Feed/index.tsx | 449 +- src/social/components/StoryTab/StoryTab.tsx | 62 + src/social/components/StoryTab/index.tsx | 1 + src/social/components/post/Creator/index.tsx | 76 +- .../components/post/GalleryContent/styles.tsx | 30 +- .../components/post/LikeButton/styles.tsx | 3 + .../components/post/PollContent/index.tsx | 4 +- .../components/post/PollContent/styles.tsx | 13 +- .../post/Post/DefaultPostRenderer.tsx | 235 +- src/social/components/post/Post/index.tsx | 5 - src/social/components/post/Post/styles.tsx | 12 + src/social/constants.ts | 1 + .../useCommunityModeratorsCollection.ts | 1 - src/social/pages/Application/index.tsx | 19 +- src/social/pages/CommunityFeed/index.tsx | 22 +- src/social/pages/DraftPage.tsx | 29 + src/social/pages/NewsFeed/index.tsx | 2 +- src/social/pages/ViewStoryPage.tsx | 61 + src/social/providers/NavigationProvider.tsx | 43 +- src/utils.ts | 9 - .../components/AmityLiveChatHeader/index.tsx | 16 +- .../AmityLiveChatHeader/styles.module.css | 15 +- .../AmityLiveChatMessageComposeBar/index.tsx | 14 +- .../styles.module.css | 27 +- .../AmityLiveChatMessageList/index.tsx | 10 +- .../styles.module.css | 3 +- .../HomeIndicator/styles.module.css | 2 +- .../MessageAction/styles.module.css | 41 +- .../MessageBubble/styles.module.css | 42 +- .../MessageBubbleContainer/index.tsx | 12 +- .../MessageBubbleContainer/styles.module.css | 5 +- .../MessageReaction/index.tsx | 1 - .../MessageReaction/styles.module.css | 2 +- .../MessageTextWithMention/styles.module.css | 10 +- .../LiveChatMessageContent/styles.module.css | 19 +- .../LiveChatNotification/styles.module.css | 4 +- .../components/MessageQuickReaction/index.tsx | 15 +- .../MessageQuickReaction/styles.module.css | 5 +- .../MessageReactionPreview/index.tsx | 26 +- .../MessageReactionPreview/styles.module.css | 6 +- .../ChatContainer/ReplyMessagePlaceholder.tsx | 10 +- .../ChatContainer/styles.module.css | 30 +- src/v4/chat/pages/AmityLiveChatPage/index.tsx | 8 +- .../pages/AmityLiveChatPage/styles.module.css | 4 +- src/v4/core/IconComponent.tsx | 29 + .../core/components/Avatar/Avatar.module.css | 10 +- src/v4/core/components/Avatar/Avatar.tsx | 18 +- src/v4/core/components/Avatar/index.ts | 2 +- .../BottomSheet/BottomSheet.module.css | 27 +- .../components/BottomSheet/BottomSheet.tsx | 7 +- .../core/components/Button/Button.module.css | 2 +- src/v4/core/components/ConfirmModal/index.tsx | 76 +- .../core/components/Drawer/Drawer.module.css | 41 + src/v4/core/components/Drawer/Drawer.tsx | 25 + src/v4/core/components/Drawer/index.ts | 1 + .../components/InputText/styles.module.css | 6 +- .../LoadMoreWrapper.module.css | 3 +- src/v4/core/components/Modal/index.tsx | 15 +- .../core/components/Modal/styles.module.css | 9 +- .../Notification/Notification.module.css | 63 + src/v4/core/components/Notification/index.tsx | 4 +- .../components/SocialMentionItem/index.tsx | 11 +- .../core/components/Typography/Typography.tsx | 40 +- .../collections/useAllUsersCollection.ts | 15 + .../collections/useCommunitiesCollection.ts | 18 + src/v4/core/hooks/collections/useCommunity.ts | 23 + .../collections/useFollowersCollection.ts | 26 + .../collections/useFollowingsCollection.ts | 26 + .../core/hooks/collections/useGlobalFeed.ts | 69 + .../hooks/collections/useUsersCollection.ts | 68 + src/v4/core/hooks/objects/usePost.ts | 18 + src/v4/core/hooks/objects/useUser.ts | 18 + .../subscriptions/useCommentSubscription.ts | 20 + .../useCommunityReactionSubscription.ts | 19 + .../subscriptions/useCommunitySubscription.ts | 22 + .../subscriptions/usePostSubscription.ts | 22 + .../subscriptions/useReactionSubscription.ts | 33 + .../hooks/subscriptions/useSubscription.ts | 49 + .../useUserReactionSubscription.ts | 19 + .../subscriptions/useUserSubscription.ts | 22 + src/v4/core/hooks/uikit/index.ts | 49 + src/v4/core/hooks/useFile.ts | 16 + src/v4/core/hooks/useImage.ts | 31 + src/v4/core/hooks/useIntersectionObserver.ts | 25 + src/v4/core/hooks/useLiveCollection.ts | 79 + src/v4/core/hooks/useLiveObject.ts | 79 + src/v4/core/hooks/usePostByIds.ts | 19 + src/v4/core/hooks/usePostFlaggedByMe.ts | 99 + src/v4/core/hooks/usePostPermissions.ts | 26 + src/v4/core/hooks/useSDK.ts | 6 + src/v4/core/providers/AmityUIKitProvider.tsx | 92 +- src/v4/core/providers/ConfirmProvider.tsx | 11 +- .../core/providers/CustomizationProvider.tsx | 174 +- src/v4/core/providers/DrawerProvider.tsx | 47 + src/v4/core/providers/NavigationProvider.tsx | 497 + .../providers/NotificationProvider.module.css | 41 +- .../core/providers/PageBehaviorProvider.tsx | 147 +- .../SDKConnectorFetcherProvider.tsx | 96 + .../SDKConnectorLiveCollectionProvider.tsx | 99 + .../SDKConnectorLiveObjectProvider.tsx | 99 + .../SDKConnectorSubscribersProvider.tsx | 68 + .../providers/SDKConnectorProvider/index.tsx | 21 + src/v4/core/providers/SDKProvider.tsx | 11 + src/v4/core/providers/ThemeProvider.tsx | 17 +- src/v4/core/providers/UIStyles.module.css | 53 +- src/v4/core/providers/index.css | 100 +- src/v4/helpers/utils.ts | 25 + src/v4/icons/AngleRight.tsx | 16 + src/v4/icons/Chat.tsx | 26 + src/v4/icons/ChevronLeft.tsx | 16 + src/v4/icons/Community.tsx | 2 - src/v4/icons/User.tsx | 24 + .../CommentTray/CommentTray.module.css | 7 +- .../components/CommentTray/CommentTray.tsx | 13 +- .../components/CommentTray/ui.stories.tsx | 128 +- .../CommunityItem.module.css | 58 + .../CommunitySearchResult/CommunityItem.tsx | 85 + .../CommunityItemSkeleton.module.css | 74 + .../CommunityItemSkeleton.tsx | 56 + .../CommunitySearchResult.module.css | 68 + .../CommunitySearchResult.stories.tsx | 20 + .../CommunitySearchResult.tsx | 52 + .../CommunitySearchResult/index.tsx | 1 + .../CreatePostMenu/CreatePostMenu.module.css | 10 + .../CreatePostMenu/CreatePostMenu.tsx | 23 + .../components/CreatePostMenu/index.tsx | 1 + .../EmptyNewsFeed/EmptyNewsFeed.module.css | 13 + .../EmptyNewsFeed/EmptyNewsFeed.stories.tsx | 15 + .../EmptyNewsFeed/EmptyNewsFeed.tsx | 37 + .../social/components/EmptyNewsFeed/index.tsx | 1 + .../GlobalFeed/GlobalFeed.module.css | 86 + .../GlobalFeed/GlobalFeed.stories.tsx | 15 + .../components/GlobalFeed/GlobalFeed.tsx | 80 + src/v4/social/components/GlobalFeed/index.tsx | 1 + .../HyperLinkConfig.module.css | 17 +- .../HyperLinkConfig/HyperLinkConfig.tsx | 104 +- .../MyCommunities/MyCommunities.module.css | 6 + .../MyCommunities/MyCommunities.stories.tsx | 15 + .../MyCommunities/MyCommunities.tsx | 38 + .../social/components/MyCommunities/index.tsx | 1 + .../components/Newsfeed/Newsfeed.module.css | 88 + .../components/Newsfeed/Newsfeed.stories.tsx | 15 + .../social/components/Newsfeed/Newsfeed.tsx | 120 + src/v4/social/components/Newsfeed/index.tsx | 1 + .../components/Newsfeed/styles.module.css | 44 + .../social/components/PostContent/Crying.tsx | 42 + src/v4/social/components/PostContent/Fire.tsx | 54 + .../social/components/PostContent/Happy.tsx | 47 + .../ImageContent/ImageContent.module.css | 76 + .../PostContent/ImageContent/ImageContent.tsx | 68 + .../PostContent/ImageContent/index.tsx | 1 + src/v4/social/components/PostContent/Like.tsx | 33 + .../LinkPreview/LinkPreview.module.css | 41 + .../LinkPreview/LinkPreview.stories.tsx | 17 + .../PostContent/LinkPreview/LinkPreview.tsx | 102 + .../LinkPreviewSkeleton.module.css | 49 + .../LinkPreview/LinkPreviewSkeleton.tsx | 21 + .../PostContent/LinkPreview/index.tsx | 1 + src/v4/social/components/PostContent/Love.tsx | 36 + .../PostContent/PostContent.module.css | 176 + .../PostContent/PostContent.stories.tsx | 20 + .../components/PostContent/PostContent.tsx | 377 + .../PostContentSkeleton.module.css | 86 + .../PostContentSkeleton.stories.tsx | 20 + .../PostContent/PostContentSkeleton.tsx | 75 + .../TextContent/TextContent.module.css | 15 + .../PostContent/TextContent/TextContent.tsx | 76 + .../PostContent/TextContent/index.tsx | 1 + .../VideoContent/VideoContent.module.css | 115 + .../PostContent/VideoContent/VideoContent.tsx | 103 + .../PostContent/VideoContent/index.tsx | 1 + .../social/components/PostContent/index.tsx | 2 + .../ReactionList/ReactionList.module.css | 10 +- .../components/ReactionList/ReactionList.tsx | 26 +- .../ReactionList/ReactionListPanel.tsx | 41 +- .../StoryTab/CreateNewStoryButton.tsx | 32 - .../components/StoryTab/StoryTab.module.css | 9 +- .../social/components/StoryTab/StoryTab.tsx | 61 +- .../StoryTab/StoryTabCommunity.module.css | 152 +- .../components/StoryTab/StoryTabCommunity.tsx | 148 +- .../StoryTab/StoryTabGlobalFeed.module.css | 45 +- .../StoryTab/StoryTabGlobalFeed.tsx | 29 +- .../StoryTab/StoryTabItem.module.css | 9 +- .../components/StoryTab/StoryTabItem.tsx | 88 +- src/v4/social/components/StoryTab/styles.tsx | 80 - .../TopNavigation/TopNavigation.module.css | 21 + .../TopNavigation/TopNavigation.stories.tsx | 15 + .../TopNavigation/TopNavigation.tsx | 51 + .../social/components/TopNavigation/index.tsx | 1 + .../TopSearchBar/TopSearchBar.module.css | 49 + .../TopSearchBar/TopSearchBar.stories.tsx | 15 + .../components/TopSearchBar/TopSearchBar.tsx | 66 + .../social/components/TopSearchBar/index.tsx | 1 + .../UserSearchItem.module.css | 41 + .../UserSearchResult/UserSearchItem.tsx | 25 + .../UserSearchItemSkeleton.module.css | 74 + .../UserSearchItemSkeleton.tsx | 54 + .../UserSearchResult.module.css | 9 + .../UserSearchResult.stories.tsx | 20 + .../UserSearchResult/UserSearchResult.tsx | 45 + .../components/UserSearchResult/index.tsx | 1 + .../social/components/ViewStoryPage/index.tsx | 323 - src/v4/social/constants/memberRoles.ts | 7 + src/v4/social/constants/permissions.ts | 38 + src/v4/social/constants/reactions.ts | 3 + .../ActionButton/ActionButton.module.css | 4 +- .../ArrowLeftButton.module.css | 26 + .../ArrowLeftButton/ArrowLeftButton.tsx | 41 + .../social/elements/ArrowLeftButton/index.ts | 1 + .../ArrowRightButton.module.css | 26 + .../ArrowRightButton/ArrowRightButton.tsx | 42 + .../social/elements/ArrowRightButton/index.ts | 1 + .../AspectRatioButton.module.css | 8 + .../AspectRatioButton/AspectRatioButton.tsx | 73 +- .../elements/AspectRatioButton/styles.tsx | 22 - .../elements/BackButton/BackButton.module.css | 18 +- .../BackButton/BackButton.stories.tsx | 15 + .../social/elements/BackButton/BackButton.tsx | 79 +- src/v4/social/elements/BackButton/styles.tsx | 18 - .../CancelButton/CancelButton.module.css | 17 + .../CancelButton/CancelButton.stories.tsx | 15 + .../elements/CancelButton/CancelButton.tsx | 55 +- src/v4/social/elements/CancelButton/index.tsx | 1 + .../social/elements/CancelButton/styles.tsx | 22 - .../ClearButton/ClearButton.module.css | 8 + .../ClearButton/ClearButton.stories.tsx | 15 + .../elements/ClearButton/ClearButton.tsx | 58 + src/v4/social/elements/ClearButton/index.tsx | 1 + .../CloseButton/CloseButton.module.css | 28 + .../elements/CloseButton/CloseButton.tsx | 69 +- src/v4/social/elements/CloseButton/styles.tsx | 30 - .../CommentBubbleDeleted.module.css | 23 + .../CommentBubbleDeleted.tsx | 63 + .../elements/CommentBubbleDeleted/index.ts | 1 + .../CommentButton/CommentButton.module.css | 30 +- .../CommentButton/CommentButton.stories.tsx | 19 + .../elements/CommentButton/CommentButton.tsx | 111 +- .../social/elements/CommentButton/index.tsx | 1 + .../CommunityAvatar.module.css | 31 + .../CommunityAvatar.stories.tsx | 22 + .../CommunityAvatar/CommunityAvatar.tsx | 59 + .../social/elements/CommunityAvatar/index.tsx | 1 + .../CommunityCategoryName.module.css | 9 + .../CommunityCategoryName.stories.tsx | 15 + .../CommunityCategoryName.tsx | 38 + .../elements/CommunityCategoryName/index.tsx | 1 + .../CommunityDisplayName.module.css | 7 + .../CommunityDisplayName.stories.tsx | 22 + .../CommunityDisplayName.tsx | 36 + .../elements/CommunityDisplayName/index.tsx | 1 + .../CommunityMembersCount.module.css | 3 + .../CommunityMembersCount.stories.tsx | 15 + .../CommunityMembersCount.tsx | 38 + .../elements/CommunityMembersCount/index.tsx | 1 + .../CommunityOfficialBadge.module.css | 8 + .../CommunityOfficialBadge.stories.tsx | 15 + .../CommunityOfficialBadge.tsx | 60 + .../elements/CommunityOfficialBadge/index.tsx | 1 + .../CommunityPrivateBadge.module.css | 8 + .../CommunityPrivateBadge.stories.tsx | 15 + .../CommunityPrivateBadge.tsx | 60 + .../elements/CommunityPrivateBadge/index.tsx | 1 + .../CreateCommunityButton.module.css | 9 + .../CreateCommunityButton.stories.tsx | 15 + .../CreateCommunityButton.tsx | 44 + .../elements/CreateCommunityButton/index.tsx | 1 + .../CreateLivestreamButton.module.css | 15 + .../CreateLivestreamButton.tsx | 67 + .../elements/CreateLivestreamButton/index.tsx | 1 + .../CreateNewStoryButton.module.css | 7 + .../CreateNewStoryButton.tsx | 62 + .../elements/CreateNewStoryButton/index.ts | 1 + .../CreateNewStoryButton/ui.stories.tsx | 15 + .../CreatePollButton.module.css | 15 + .../CreatePollButton/CreatePollButton.tsx | 63 + .../elements/CreatePollButton/index.tsx | 1 + .../CreatePostButton.module.css | 16 + .../CreatePostButton/CreatePostButton.tsx | 59 + .../elements/CreatePostButton/index.tsx | 1 + .../CreateStoryButton.module.css | 15 + .../CreateStoryButton/CreateStoryButton.tsx | 101 +- .../elements/CreateStoryButton/index.tsx | 1 + .../elements/CreateStoryButton/styles.tsx | 34 - .../Description/Description.module.css | 4 + .../Description/Description.stories.tsx | 15 + .../elements/Description/Description.tsx | 33 + src/v4/social/elements/Description/index.tsx | 1 + .../elements/DoneButton/DoneButton.module.css | 3 + .../social/elements/DoneButton/DoneButton.tsx | 30 + src/v4/social/elements/DoneButton/index.ts | 1 + .../ExploreButton/ExploreButton.module.css | 13 + .../ExploreButton/ExploreButton.stories.tsx | 15 + .../elements/ExploreButton/ExploreButton.tsx | 40 + .../social/elements/ExploreButton/index.tsx | 1 + .../ExploreCommunitiesButton.module.css | 18 + .../ExploreCommunitiesButton.stories.tsx | 15 + .../ExploreCommunitiesButton.tsx | 48 + .../ExploreCommunitiesButton/index.tsx | 1 + .../GlobalSearchButton.module.css | 15 + .../GlobalSearchButton.stories.tsx | 15 + .../GlobalSearchButton/GlobalSearchButton.tsx | 73 + .../elements/GlobalSearchButton/index.tsx | 1 + .../HeaderLabel/HeaderLabel.module.css | 3 + .../HeaderLabel/HeaderLabel.stories.tsx | 15 + .../elements/HeaderLabel/HeaderLabel.tsx | 31 + src/v4/social/elements/HeaderLabel/index.tsx | 1 + .../elements/HyperLink/HyperLink.module.css | 3 +- .../HyperLinkButton.module.css | 3 + .../HyperLinkButton/HyperLinkButton.tsx | 46 +- .../Illustration/Illustration.stories.tsx | 15 + .../elements/Illustration/Illustration.tsx | 184 + src/v4/social/elements/Illustration/index.tsx | 1 + .../ImpressionButton/ImpressionButton.tsx | 39 - .../social/elements/ImpressionButton/index.ts | 1 - .../elements/ImpressionButton/styles.tsx | 21 - .../elements/MenuButton/MenuButton.module.css | 3 + .../MenuButton/MenuButton.stories.tsx | 15 + .../social/elements/MenuButton/MenuButton.tsx | 46 + src/v4/social/elements/MenuButton/index.tsx | 1 + .../ModeratorBadge/ModeratorBadge.module.css | 28 + .../ModeratorBadge/ModeratorBadge.stories.tsx | 15 + .../ModeratorBadge/ModeratorBadge.tsx | 44 + .../social/elements/ModeratorBadge/index.tsx | 1 + .../MyCommunitiesButton.module.css | 13 + .../MyCommunitiesButton.stories.tsx | 15 + .../MyCommunitiesButton.tsx | 41 + .../elements/MyCommunitiesButton/index.tsx | 1 + .../MyTimelineAvatar.module.css | 10 + .../MyTimelineAvatar/MyTimelineAvatar.tsx | 26 + .../elements/MyTimelineAvatar/index.tsx | 1 + .../MyTimelineText/MyTimelineText.module.css | 11 + .../MyTimelineText/MyTimelineText.tsx | 29 + .../social/elements/MyTimelineText/index.tsx | 1 + .../NewsfeedButton/NewsfeedButton.module.css | 13 + .../NewsfeedButton/NewsfeedButton.stories.tsx | 15 + .../NewsfeedButton/NewsfeedButton.tsx | 41 + .../social/elements/NewsfeedButton/index.tsx | 1 + .../OverflowMenuButton.module.css | 3 + .../OverflowMenuButton/OverflowMenuButton.tsx | 76 +- .../elements/OverflowMenuButton/styles.tsx | 30 - .../PostCreationButton.module.css | 18 + .../PostCreationButton.stories.tsx | 15 + .../PostCreationButton/PostCreationButton.tsx | 77 + .../elements/PostCreationButton/index.tsx | 1 + .../elements/ReactButton/ReactButton.tsx | 81 - src/v4/social/elements/ReactButton/index.ts | 1 - src/v4/social/elements/ReactButton/styles.tsx | 29 - .../social/elements/ReactionButton/Crying.tsx | 42 + .../social/elements/ReactionButton/Fire.tsx | 54 + .../social/elements/ReactionButton/Happy.tsx | 47 + .../social/elements/ReactionButton/Like.tsx | 33 + .../social/elements/ReactionButton/Love.tsx | 36 + .../ReactionButton/ReactionButton.module.css | 114 + .../ReactionButton/ReactionButton.stories.tsx | 19 + .../ReactionButton/ReactionButton.tsx | 331 + .../social/elements/ReactionButton/index.tsx | 1 + .../social/elements/SaveButton/SaveButton.tsx | 68 +- src/v4/social/elements/SaveButton/styles.tsx | 23 - .../SearchIcon/SearchIcon.stories.tsx | 15 + .../social/elements/SearchIcon/SearchIcon.tsx | 51 + src/v4/social/elements/SearchIcon/index.tsx | 1 + .../ShareButton/ShareButton.module.css | 15 + .../ShareButton/ShareButton.stories.tsx | 15 + .../elements/ShareButton/ShareButton.tsx | 58 + src/v4/social/elements/ShareButton/index.tsx | 1 + .../elements/ShareButton/styles.module.css | 14 + .../ShareStoryButton.module.css | 19 +- .../ShareStoryButton/ShareStoryButton.tsx | 74 +- .../SpeakerButton/SpeakerButton.module.css | 12 + .../elements/SpeakerButton/SpeakerButton.tsx | 141 +- .../social/elements/SpeakerButton/styles.tsx | 36 - .../StoryCommentButton.module.css | 17 + .../StoryCommentButton/StoryCommentButton.tsx | 77 + .../elements/StoryCommentButton/index.ts | 1 + .../StoryImpressionButton.module.css | 6 + .../StoryImpressionButton.tsx | 66 + .../elements/StoryImpressionButton/index.ts | 1 + .../StoryProgressBar.module.css | 24 + .../StoryProgressBar/StoryProgressBar.tsx | 102 + .../social/elements/StoryProgressBar/index.ts | 1 + .../StoryReactionButton.module.css | 17 + .../StoryReactionButton.tsx | 104 + .../elements/StoryReactionButton/index.ts | 1 + .../elements/StoryRing/StoryRing.module.css | 26 + .../social/elements/StoryRing/StoryRing.tsx | 235 + src/v4/social/elements/StoryRing/index.tsx | 1 + .../elements/Timestamp/Timestamp.module.css | 3 + .../elements/Timestamp/Timestamp.stories.tsx | 15 + .../social/elements/Timestamp/Timestamp.tsx | 89 + src/v4/social/elements/Timestamp/index.tsx | 1 + src/v4/social/elements/Title/Title.module.css | 4 + .../social/elements/Title/Title.stories.tsx | 15 + src/v4/social/elements/Title/Title.tsx | 32 + src/v4/social/elements/Title/index.tsx | 1 + src/v4/social/elements/index.ts | 20 +- .../collections/useCommunitiesCollection.ts | 18 + .../useCommunityMembersCollection.ts | 15 + .../useCommunityModeratorsCollection.ts | 18 + .../collections/useGlobalStoryTargets.ts | 26 + .../collections/useReactionsCollection.ts | 18 + src/v4/social/hooks/index.ts | 7 + src/v4/social/hooks/useCategoriesByIds.ts | 23 + src/v4/social/hooks/useCommentFlaggedByMe.ts | 70 + src/v4/social/hooks/useCommunityInfo.ts | 55 + src/v4/social/hooks/useCommunityPermission.ts | 21 + .../hooks/useCommunityStoriesSubscription.ts | 29 + src/v4/social/hooks/useGetActiveStories.ts | 15 + src/v4/social/hooks/useLiveCollection.ts | 80 + .../social/hooks/useUserQueryByDisplayName.ts | 56 + .../internal-components/Badege/Badge.tsx | 12 - .../internal-components/Badege/index.ts | 1 - .../internal-components/Badege/types.ts | 4 - .../Comment/Comment.module.css | 1 - .../Comment/CommentText.module.css | 7 +- .../Comment/CommentText.tsx | 12 +- .../Comment/UIComment.module.css | 47 +- .../internal-components/Comment/UIComment.tsx | 9 + .../internal-components/Comment/index.tsx | 23 +- .../CommentComposeBar.module.css | 79 +- .../CommentComposeBar/CommentComposeBar.tsx | 10 +- .../CommentList/CommentList.module.css | 2 +- .../CommentList/CommentList.tsx | 27 +- .../ImageViewer/ImageViewer.module.css | 101 + .../ImageViewer/ImageViewer.tsx | 96 + .../internal-components/ImageViewer/index.tsx | 0 .../Linkify/Linkify.module.css | 8 + .../internal-components/Linkify/Linkify.tsx | 23 + .../internal-components/Linkify/index.tsx | 1 + .../PostMenu/PostMenu.module.css | 53 + .../internal-components/PostMenu/PostMenu.tsx | 184 + .../internal-components/PostMenu/index.tsx | 1 + .../StoryCommentComposeBar.module.css | 84 +- .../StoryPreview/StoryPreview.module.css | 148 +- .../StoryPreview/StoryPreview.tsx | 6 +- .../StoryViewer/Renderers/AutoPlayContent.tsx | 4 +- .../StoryViewer/Renderers/Default.tsx | 4 +- .../StoryViewer/Renderers/Image.tsx | 230 +- .../Renderers/Renderers.module.css | 44 +- .../StoryViewer/Renderers/Video.tsx | 145 +- .../Wrappers/Footer/Footer.module.css | 13 + .../Renderers/Wrappers/Footer/index.tsx | 50 +- .../Renderers/Wrappers/Footer/styles.tsx | 111 - .../Wrappers/Header/Header.module.css | 436 +- .../Renderers/Wrappers/Header/index.tsx | 30 +- .../StoryViewer/Renderers/index.tsx | 8 +- .../StoryViewer/Renderers/types.ts | 58 +- .../TabButton/TabButton.module.css | 22 + .../TabButton/TabButton.stories.tsx | 12 + .../TabButton/TabButton.tsx | 50 + .../internal-components/TabButton/index.tsx | 1 + .../TabsBar/TabsBar.module.css | 28 + .../TabsBar/TabsBar.stories.tsx | 22 + .../internal-components/TabsBar/TabsBar.tsx | 52 + .../internal-components/TabsBar/index.tsx | 1 + .../UserAvatar/UserAvatar.module.css | 31 + .../UserAvatar/UserAvatar.stories.tsx | 12 + .../UserAvatar/UserAvatar.tsx | 46 + .../internal-components/UserAvatar/index.tsx | 1 + .../VideoPreview/VideoPreview.tsx | 4 +- .../internal-components/VideoPreview/index.ts | 2 +- .../VideoViewer/VideoViewer.module.css | 101 + .../VideoViewer/VideoViewer.tsx | 133 + .../internal-components/VideoViewer/index.tsx | 0 .../pages/Application/Application.module.css | 42 +- src/v4/social/pages/Application/index.tsx | 89 +- .../pages/DraftsPage/DraftsPage.module.css | 125 +- src/v4/social/pages/DraftsPage/DraftsPage.tsx | 100 +- .../PostDetailPage/PostDetailPage.module.css | 105 + .../PostDetailPage/PostDetailPage.stories.tsx | 17 + .../pages/PostDetailPage/PostDetailPage.tsx | 117 + src/v4/social/pages/PostDetailPage/index.tsx | 1 + .../SelectPostTargetPage.module.css | 48 + .../SelectPostTargetPage.tsx | 86 + .../pages/SelectPostTargetPage/index.tsx | 1 + .../SocialGlobalSearchPage.module.css | 24 + .../SocialGlobalSearchPage.stories.tsx | 12 + .../SocialGlobalSearchPage.tsx | 100 + .../pages/SocialGlobalSearchPage/index.tsx | 1 + .../SocialHomePage/SocialHomePage.module.css | 38 + .../SocialHomePage/SocialHomePage.stories.tsx | 12 + .../pages/SocialHomePage/SocialHomePage.tsx | 89 + src/v4/social/pages/SocialHomePage/index.tsx | 1 + .../pages/StoryPage/CommunityFeedStory.tsx | 394 +- .../pages/StoryPage/GlobalFeedStory.tsx | 470 +- .../pages/StoryPage/StoryPage.module.css | 58 + .../pages/StoryPage/ViewGlobalFeedStory.tsx | 53 + .../social/pages/StoryPage/ViewStoryPage.tsx | 61 +- src/v4/social/pages/StoryPage/index.tsx | 2 +- src/v4/social/pages/index.ts | 2 +- src/v4/social/utils/index.ts | 212 + src/v4/styles/global.css | 87 +- src/v4/styles/typography.module.css | 10 +- src/v4/utils/permissions.ts | 47 + 545 files changed, 27799 insertions(+), 11807 deletions(-) create mode 100644 .browserslistrc delete mode 100644 .github/pull_request_template.md create mode 100644 .prettierignore create mode 100644 .stylelintignore create mode 100644 .stylelintrc.json create mode 100644 .tool-versions create mode 100644 postcss.config.js create mode 100644 src/social/components/StoryTab/StoryTab.tsx create mode 100644 src/social/components/StoryTab/index.tsx create mode 100644 src/social/pages/DraftPage.tsx create mode 100644 src/social/pages/ViewStoryPage.tsx create mode 100644 src/v4/core/IconComponent.tsx create mode 100644 src/v4/core/components/Drawer/Drawer.module.css create mode 100644 src/v4/core/components/Drawer/Drawer.tsx create mode 100644 src/v4/core/components/Drawer/index.ts create mode 100644 src/v4/core/components/Notification/Notification.module.css create mode 100644 src/v4/core/hooks/collections/useAllUsersCollection.ts create mode 100644 src/v4/core/hooks/collections/useCommunitiesCollection.ts create mode 100644 src/v4/core/hooks/collections/useCommunity.ts create mode 100644 src/v4/core/hooks/collections/useFollowersCollection.ts create mode 100644 src/v4/core/hooks/collections/useFollowingsCollection.ts create mode 100644 src/v4/core/hooks/collections/useGlobalFeed.ts create mode 100644 src/v4/core/hooks/collections/useUsersCollection.ts create mode 100644 src/v4/core/hooks/objects/usePost.ts create mode 100644 src/v4/core/hooks/objects/useUser.ts create mode 100644 src/v4/core/hooks/subscriptions/useCommentSubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/useCommunityReactionSubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/useCommunitySubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/usePostSubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/useReactionSubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/useSubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/useUserReactionSubscription.ts create mode 100644 src/v4/core/hooks/subscriptions/useUserSubscription.ts create mode 100644 src/v4/core/hooks/uikit/index.ts create mode 100644 src/v4/core/hooks/useFile.ts create mode 100644 src/v4/core/hooks/useImage.ts create mode 100644 src/v4/core/hooks/useIntersectionObserver.ts create mode 100644 src/v4/core/hooks/useLiveCollection.ts create mode 100644 src/v4/core/hooks/useLiveObject.ts create mode 100644 src/v4/core/hooks/usePostByIds.ts create mode 100644 src/v4/core/hooks/usePostFlaggedByMe.ts create mode 100644 src/v4/core/hooks/usePostPermissions.ts create mode 100644 src/v4/core/hooks/useSDK.ts create mode 100644 src/v4/core/providers/DrawerProvider.tsx create mode 100644 src/v4/core/providers/NavigationProvider.tsx create mode 100644 src/v4/core/providers/SDKConnectorProvider/SDKConnectorFetcherProvider.tsx create mode 100644 src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveCollectionProvider.tsx create mode 100644 src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveObjectProvider.tsx create mode 100644 src/v4/core/providers/SDKConnectorProvider/SDKConnectorSubscribersProvider.tsx create mode 100644 src/v4/core/providers/SDKConnectorProvider/index.tsx create mode 100644 src/v4/core/providers/SDKProvider.tsx create mode 100644 src/v4/icons/AngleRight.tsx create mode 100644 src/v4/icons/Chat.tsx create mode 100644 src/v4/icons/ChevronLeft.tsx create mode 100644 src/v4/icons/User.tsx create mode 100644 src/v4/social/components/CommunitySearchResult/CommunityItem.module.css create mode 100644 src/v4/social/components/CommunitySearchResult/CommunityItem.tsx create mode 100644 src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.module.css create mode 100644 src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.tsx create mode 100644 src/v4/social/components/CommunitySearchResult/CommunitySearchResult.module.css create mode 100644 src/v4/social/components/CommunitySearchResult/CommunitySearchResult.stories.tsx create mode 100644 src/v4/social/components/CommunitySearchResult/CommunitySearchResult.tsx create mode 100644 src/v4/social/components/CommunitySearchResult/index.tsx create mode 100644 src/v4/social/components/CreatePostMenu/CreatePostMenu.module.css create mode 100644 src/v4/social/components/CreatePostMenu/CreatePostMenu.tsx create mode 100644 src/v4/social/components/CreatePostMenu/index.tsx create mode 100644 src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.module.css create mode 100644 src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.stories.tsx create mode 100644 src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.tsx create mode 100644 src/v4/social/components/EmptyNewsFeed/index.tsx create mode 100644 src/v4/social/components/GlobalFeed/GlobalFeed.module.css create mode 100644 src/v4/social/components/GlobalFeed/GlobalFeed.stories.tsx create mode 100644 src/v4/social/components/GlobalFeed/GlobalFeed.tsx create mode 100644 src/v4/social/components/GlobalFeed/index.tsx create mode 100644 src/v4/social/components/MyCommunities/MyCommunities.module.css create mode 100644 src/v4/social/components/MyCommunities/MyCommunities.stories.tsx create mode 100644 src/v4/social/components/MyCommunities/MyCommunities.tsx create mode 100644 src/v4/social/components/MyCommunities/index.tsx create mode 100644 src/v4/social/components/Newsfeed/Newsfeed.module.css create mode 100644 src/v4/social/components/Newsfeed/Newsfeed.stories.tsx create mode 100644 src/v4/social/components/Newsfeed/Newsfeed.tsx create mode 100644 src/v4/social/components/Newsfeed/index.tsx create mode 100644 src/v4/social/components/Newsfeed/styles.module.css create mode 100644 src/v4/social/components/PostContent/Crying.tsx create mode 100644 src/v4/social/components/PostContent/Fire.tsx create mode 100644 src/v4/social/components/PostContent/Happy.tsx create mode 100644 src/v4/social/components/PostContent/ImageContent/ImageContent.module.css create mode 100644 src/v4/social/components/PostContent/ImageContent/ImageContent.tsx create mode 100644 src/v4/social/components/PostContent/ImageContent/index.tsx create mode 100644 src/v4/social/components/PostContent/Like.tsx create mode 100644 src/v4/social/components/PostContent/LinkPreview/LinkPreview.module.css create mode 100644 src/v4/social/components/PostContent/LinkPreview/LinkPreview.stories.tsx create mode 100644 src/v4/social/components/PostContent/LinkPreview/LinkPreview.tsx create mode 100644 src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.module.css create mode 100644 src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.tsx create mode 100644 src/v4/social/components/PostContent/LinkPreview/index.tsx create mode 100644 src/v4/social/components/PostContent/Love.tsx create mode 100644 src/v4/social/components/PostContent/PostContent.module.css create mode 100644 src/v4/social/components/PostContent/PostContent.stories.tsx create mode 100644 src/v4/social/components/PostContent/PostContent.tsx create mode 100644 src/v4/social/components/PostContent/PostContentSkeleton.module.css create mode 100644 src/v4/social/components/PostContent/PostContentSkeleton.stories.tsx create mode 100644 src/v4/social/components/PostContent/PostContentSkeleton.tsx create mode 100644 src/v4/social/components/PostContent/TextContent/TextContent.module.css create mode 100644 src/v4/social/components/PostContent/TextContent/TextContent.tsx create mode 100644 src/v4/social/components/PostContent/TextContent/index.tsx create mode 100644 src/v4/social/components/PostContent/VideoContent/VideoContent.module.css create mode 100644 src/v4/social/components/PostContent/VideoContent/VideoContent.tsx create mode 100644 src/v4/social/components/PostContent/VideoContent/index.tsx create mode 100644 src/v4/social/components/PostContent/index.tsx delete mode 100644 src/v4/social/components/StoryTab/CreateNewStoryButton.tsx delete mode 100644 src/v4/social/components/StoryTab/styles.tsx create mode 100644 src/v4/social/components/TopNavigation/TopNavigation.module.css create mode 100644 src/v4/social/components/TopNavigation/TopNavigation.stories.tsx create mode 100644 src/v4/social/components/TopNavigation/TopNavigation.tsx create mode 100644 src/v4/social/components/TopNavigation/index.tsx create mode 100644 src/v4/social/components/TopSearchBar/TopSearchBar.module.css create mode 100644 src/v4/social/components/TopSearchBar/TopSearchBar.stories.tsx create mode 100644 src/v4/social/components/TopSearchBar/TopSearchBar.tsx create mode 100644 src/v4/social/components/TopSearchBar/index.tsx create mode 100644 src/v4/social/components/UserSearchResult/UserSearchItem.module.css create mode 100644 src/v4/social/components/UserSearchResult/UserSearchItem.tsx create mode 100644 src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.module.css create mode 100644 src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.tsx create mode 100644 src/v4/social/components/UserSearchResult/UserSearchResult.module.css create mode 100644 src/v4/social/components/UserSearchResult/UserSearchResult.stories.tsx create mode 100644 src/v4/social/components/UserSearchResult/UserSearchResult.tsx create mode 100644 src/v4/social/components/UserSearchResult/index.tsx delete mode 100644 src/v4/social/components/ViewStoryPage/index.tsx create mode 100644 src/v4/social/constants/memberRoles.ts create mode 100644 src/v4/social/constants/permissions.ts create mode 100644 src/v4/social/constants/reactions.ts create mode 100644 src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.module.css create mode 100644 src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.tsx create mode 100644 src/v4/social/elements/ArrowLeftButton/index.ts create mode 100644 src/v4/social/elements/ArrowRightButton/ArrowRightButton.module.css create mode 100644 src/v4/social/elements/ArrowRightButton/ArrowRightButton.tsx create mode 100644 src/v4/social/elements/ArrowRightButton/index.ts create mode 100644 src/v4/social/elements/AspectRatioButton/AspectRatioButton.module.css delete mode 100644 src/v4/social/elements/AspectRatioButton/styles.tsx create mode 100644 src/v4/social/elements/BackButton/BackButton.stories.tsx delete mode 100644 src/v4/social/elements/BackButton/styles.tsx create mode 100644 src/v4/social/elements/CancelButton/CancelButton.module.css create mode 100644 src/v4/social/elements/CancelButton/CancelButton.stories.tsx create mode 100644 src/v4/social/elements/CancelButton/index.tsx delete mode 100644 src/v4/social/elements/CancelButton/styles.tsx create mode 100644 src/v4/social/elements/ClearButton/ClearButton.module.css create mode 100644 src/v4/social/elements/ClearButton/ClearButton.stories.tsx create mode 100644 src/v4/social/elements/ClearButton/ClearButton.tsx create mode 100644 src/v4/social/elements/ClearButton/index.tsx create mode 100644 src/v4/social/elements/CloseButton/CloseButton.module.css delete mode 100644 src/v4/social/elements/CloseButton/styles.tsx create mode 100644 src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.module.css create mode 100644 src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.tsx create mode 100644 src/v4/social/elements/CommentBubbleDeleted/index.ts create mode 100644 src/v4/social/elements/CommentButton/CommentButton.stories.tsx create mode 100644 src/v4/social/elements/CommentButton/index.tsx create mode 100644 src/v4/social/elements/CommunityAvatar/CommunityAvatar.module.css create mode 100644 src/v4/social/elements/CommunityAvatar/CommunityAvatar.stories.tsx create mode 100644 src/v4/social/elements/CommunityAvatar/CommunityAvatar.tsx create mode 100644 src/v4/social/elements/CommunityAvatar/index.tsx create mode 100644 src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.module.css create mode 100644 src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.stories.tsx create mode 100644 src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.tsx create mode 100644 src/v4/social/elements/CommunityCategoryName/index.tsx create mode 100644 src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.module.css create mode 100644 src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.stories.tsx create mode 100644 src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.tsx create mode 100644 src/v4/social/elements/CommunityDisplayName/index.tsx create mode 100644 src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.module.css create mode 100644 src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.stories.tsx create mode 100644 src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.tsx create mode 100644 src/v4/social/elements/CommunityMembersCount/index.tsx create mode 100644 src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.module.css create mode 100644 src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.stories.tsx create mode 100644 src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.tsx create mode 100644 src/v4/social/elements/CommunityOfficialBadge/index.tsx create mode 100644 src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.module.css create mode 100644 src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.stories.tsx create mode 100644 src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.tsx create mode 100644 src/v4/social/elements/CommunityPrivateBadge/index.tsx create mode 100644 src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.module.css create mode 100644 src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.stories.tsx create mode 100644 src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.tsx create mode 100644 src/v4/social/elements/CreateCommunityButton/index.tsx create mode 100644 src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.module.css create mode 100644 src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.tsx create mode 100644 src/v4/social/elements/CreateLivestreamButton/index.tsx create mode 100644 src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.module.css create mode 100644 src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.tsx create mode 100644 src/v4/social/elements/CreateNewStoryButton/index.ts create mode 100644 src/v4/social/elements/CreateNewStoryButton/ui.stories.tsx create mode 100644 src/v4/social/elements/CreatePollButton/CreatePollButton.module.css create mode 100644 src/v4/social/elements/CreatePollButton/CreatePollButton.tsx create mode 100644 src/v4/social/elements/CreatePollButton/index.tsx create mode 100644 src/v4/social/elements/CreatePostButton/CreatePostButton.module.css create mode 100644 src/v4/social/elements/CreatePostButton/CreatePostButton.tsx create mode 100644 src/v4/social/elements/CreatePostButton/index.tsx create mode 100644 src/v4/social/elements/CreateStoryButton/CreateStoryButton.module.css create mode 100644 src/v4/social/elements/CreateStoryButton/index.tsx delete mode 100644 src/v4/social/elements/CreateStoryButton/styles.tsx create mode 100644 src/v4/social/elements/Description/Description.module.css create mode 100644 src/v4/social/elements/Description/Description.stories.tsx create mode 100644 src/v4/social/elements/Description/Description.tsx create mode 100644 src/v4/social/elements/Description/index.tsx create mode 100644 src/v4/social/elements/DoneButton/DoneButton.module.css create mode 100644 src/v4/social/elements/DoneButton/DoneButton.tsx create mode 100644 src/v4/social/elements/DoneButton/index.ts create mode 100644 src/v4/social/elements/ExploreButton/ExploreButton.module.css create mode 100644 src/v4/social/elements/ExploreButton/ExploreButton.stories.tsx create mode 100644 src/v4/social/elements/ExploreButton/ExploreButton.tsx create mode 100644 src/v4/social/elements/ExploreButton/index.tsx create mode 100644 src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.module.css create mode 100644 src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.stories.tsx create mode 100644 src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.tsx create mode 100644 src/v4/social/elements/ExploreCommunitiesButton/index.tsx create mode 100644 src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.module.css create mode 100644 src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.stories.tsx create mode 100644 src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.tsx create mode 100644 src/v4/social/elements/GlobalSearchButton/index.tsx create mode 100644 src/v4/social/elements/HeaderLabel/HeaderLabel.module.css create mode 100644 src/v4/social/elements/HeaderLabel/HeaderLabel.stories.tsx create mode 100644 src/v4/social/elements/HeaderLabel/HeaderLabel.tsx create mode 100644 src/v4/social/elements/HeaderLabel/index.tsx create mode 100644 src/v4/social/elements/HyperLinkButton/HyperLinkButton.module.css create mode 100644 src/v4/social/elements/Illustration/Illustration.stories.tsx create mode 100644 src/v4/social/elements/Illustration/Illustration.tsx create mode 100644 src/v4/social/elements/Illustration/index.tsx delete mode 100644 src/v4/social/elements/ImpressionButton/ImpressionButton.tsx delete mode 100644 src/v4/social/elements/ImpressionButton/index.ts delete mode 100644 src/v4/social/elements/ImpressionButton/styles.tsx create mode 100644 src/v4/social/elements/MenuButton/MenuButton.module.css create mode 100644 src/v4/social/elements/MenuButton/MenuButton.stories.tsx create mode 100644 src/v4/social/elements/MenuButton/MenuButton.tsx create mode 100644 src/v4/social/elements/MenuButton/index.tsx create mode 100644 src/v4/social/elements/ModeratorBadge/ModeratorBadge.module.css create mode 100644 src/v4/social/elements/ModeratorBadge/ModeratorBadge.stories.tsx create mode 100644 src/v4/social/elements/ModeratorBadge/ModeratorBadge.tsx create mode 100644 src/v4/social/elements/ModeratorBadge/index.tsx create mode 100644 src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.module.css create mode 100644 src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.stories.tsx create mode 100644 src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.tsx create mode 100644 src/v4/social/elements/MyCommunitiesButton/index.tsx create mode 100644 src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.module.css create mode 100644 src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.tsx create mode 100644 src/v4/social/elements/MyTimelineAvatar/index.tsx create mode 100644 src/v4/social/elements/MyTimelineText/MyTimelineText.module.css create mode 100644 src/v4/social/elements/MyTimelineText/MyTimelineText.tsx create mode 100644 src/v4/social/elements/MyTimelineText/index.tsx create mode 100644 src/v4/social/elements/NewsfeedButton/NewsfeedButton.module.css create mode 100644 src/v4/social/elements/NewsfeedButton/NewsfeedButton.stories.tsx create mode 100644 src/v4/social/elements/NewsfeedButton/NewsfeedButton.tsx create mode 100644 src/v4/social/elements/NewsfeedButton/index.tsx create mode 100644 src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.module.css delete mode 100644 src/v4/social/elements/OverflowMenuButton/styles.tsx create mode 100644 src/v4/social/elements/PostCreationButton/PostCreationButton.module.css create mode 100644 src/v4/social/elements/PostCreationButton/PostCreationButton.stories.tsx create mode 100644 src/v4/social/elements/PostCreationButton/PostCreationButton.tsx create mode 100644 src/v4/social/elements/PostCreationButton/index.tsx delete mode 100644 src/v4/social/elements/ReactButton/ReactButton.tsx delete mode 100644 src/v4/social/elements/ReactButton/index.ts delete mode 100644 src/v4/social/elements/ReactButton/styles.tsx create mode 100644 src/v4/social/elements/ReactionButton/Crying.tsx create mode 100644 src/v4/social/elements/ReactionButton/Fire.tsx create mode 100644 src/v4/social/elements/ReactionButton/Happy.tsx create mode 100644 src/v4/social/elements/ReactionButton/Like.tsx create mode 100644 src/v4/social/elements/ReactionButton/Love.tsx create mode 100644 src/v4/social/elements/ReactionButton/ReactionButton.module.css create mode 100644 src/v4/social/elements/ReactionButton/ReactionButton.stories.tsx create mode 100644 src/v4/social/elements/ReactionButton/ReactionButton.tsx create mode 100644 src/v4/social/elements/ReactionButton/index.tsx delete mode 100644 src/v4/social/elements/SaveButton/styles.tsx create mode 100644 src/v4/social/elements/SearchIcon/SearchIcon.stories.tsx create mode 100644 src/v4/social/elements/SearchIcon/SearchIcon.tsx create mode 100644 src/v4/social/elements/SearchIcon/index.tsx create mode 100644 src/v4/social/elements/ShareButton/ShareButton.module.css create mode 100644 src/v4/social/elements/ShareButton/ShareButton.stories.tsx create mode 100644 src/v4/social/elements/ShareButton/ShareButton.tsx create mode 100644 src/v4/social/elements/ShareButton/index.tsx create mode 100644 src/v4/social/elements/ShareButton/styles.module.css create mode 100644 src/v4/social/elements/SpeakerButton/SpeakerButton.module.css delete mode 100644 src/v4/social/elements/SpeakerButton/styles.tsx create mode 100644 src/v4/social/elements/StoryCommentButton/StoryCommentButton.module.css create mode 100644 src/v4/social/elements/StoryCommentButton/StoryCommentButton.tsx create mode 100644 src/v4/social/elements/StoryCommentButton/index.ts create mode 100644 src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.module.css create mode 100644 src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.tsx create mode 100644 src/v4/social/elements/StoryImpressionButton/index.ts create mode 100644 src/v4/social/elements/StoryProgressBar/StoryProgressBar.module.css create mode 100644 src/v4/social/elements/StoryProgressBar/StoryProgressBar.tsx create mode 100644 src/v4/social/elements/StoryProgressBar/index.ts create mode 100644 src/v4/social/elements/StoryReactionButton/StoryReactionButton.module.css create mode 100644 src/v4/social/elements/StoryReactionButton/StoryReactionButton.tsx create mode 100644 src/v4/social/elements/StoryReactionButton/index.ts create mode 100644 src/v4/social/elements/StoryRing/StoryRing.module.css create mode 100644 src/v4/social/elements/StoryRing/StoryRing.tsx create mode 100644 src/v4/social/elements/StoryRing/index.tsx create mode 100644 src/v4/social/elements/Timestamp/Timestamp.module.css create mode 100644 src/v4/social/elements/Timestamp/Timestamp.stories.tsx create mode 100644 src/v4/social/elements/Timestamp/Timestamp.tsx create mode 100644 src/v4/social/elements/Timestamp/index.tsx create mode 100644 src/v4/social/elements/Title/Title.module.css create mode 100644 src/v4/social/elements/Title/Title.stories.tsx create mode 100644 src/v4/social/elements/Title/Title.tsx create mode 100644 src/v4/social/elements/Title/index.tsx create mode 100644 src/v4/social/hooks/collections/useCommunitiesCollection.ts create mode 100644 src/v4/social/hooks/collections/useCommunityMembersCollection.ts create mode 100644 src/v4/social/hooks/collections/useCommunityModeratorsCollection.ts create mode 100644 src/v4/social/hooks/collections/useGlobalStoryTargets.ts create mode 100644 src/v4/social/hooks/collections/useReactionsCollection.ts create mode 100644 src/v4/social/hooks/useCategoriesByIds.ts create mode 100644 src/v4/social/hooks/useCommentFlaggedByMe.ts create mode 100644 src/v4/social/hooks/useCommunityInfo.ts create mode 100644 src/v4/social/hooks/useCommunityPermission.ts create mode 100644 src/v4/social/hooks/useCommunityStoriesSubscription.ts create mode 100644 src/v4/social/hooks/useGetActiveStories.ts create mode 100644 src/v4/social/hooks/useLiveCollection.ts create mode 100644 src/v4/social/hooks/useUserQueryByDisplayName.ts delete mode 100644 src/v4/social/internal-components/Badege/Badge.tsx delete mode 100644 src/v4/social/internal-components/Badege/index.ts delete mode 100644 src/v4/social/internal-components/Badege/types.ts create mode 100644 src/v4/social/internal-components/ImageViewer/ImageViewer.module.css create mode 100644 src/v4/social/internal-components/ImageViewer/ImageViewer.tsx create mode 100644 src/v4/social/internal-components/ImageViewer/index.tsx create mode 100644 src/v4/social/internal-components/Linkify/Linkify.module.css create mode 100644 src/v4/social/internal-components/Linkify/Linkify.tsx create mode 100644 src/v4/social/internal-components/Linkify/index.tsx create mode 100644 src/v4/social/internal-components/PostMenu/PostMenu.module.css create mode 100644 src/v4/social/internal-components/PostMenu/PostMenu.tsx create mode 100644 src/v4/social/internal-components/PostMenu/index.tsx delete mode 100644 src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/styles.tsx create mode 100644 src/v4/social/internal-components/TabButton/TabButton.module.css create mode 100644 src/v4/social/internal-components/TabButton/TabButton.stories.tsx create mode 100644 src/v4/social/internal-components/TabButton/TabButton.tsx create mode 100644 src/v4/social/internal-components/TabButton/index.tsx create mode 100644 src/v4/social/internal-components/TabsBar/TabsBar.module.css create mode 100644 src/v4/social/internal-components/TabsBar/TabsBar.stories.tsx create mode 100644 src/v4/social/internal-components/TabsBar/TabsBar.tsx create mode 100644 src/v4/social/internal-components/TabsBar/index.tsx create mode 100644 src/v4/social/internal-components/UserAvatar/UserAvatar.module.css create mode 100644 src/v4/social/internal-components/UserAvatar/UserAvatar.stories.tsx create mode 100644 src/v4/social/internal-components/UserAvatar/UserAvatar.tsx create mode 100644 src/v4/social/internal-components/UserAvatar/index.tsx create mode 100644 src/v4/social/internal-components/VideoViewer/VideoViewer.module.css create mode 100644 src/v4/social/internal-components/VideoViewer/VideoViewer.tsx create mode 100644 src/v4/social/internal-components/VideoViewer/index.tsx create mode 100644 src/v4/social/pages/PostDetailPage/PostDetailPage.module.css create mode 100644 src/v4/social/pages/PostDetailPage/PostDetailPage.stories.tsx create mode 100644 src/v4/social/pages/PostDetailPage/PostDetailPage.tsx create mode 100644 src/v4/social/pages/PostDetailPage/index.tsx create mode 100644 src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.module.css create mode 100644 src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.tsx create mode 100644 src/v4/social/pages/SelectPostTargetPage/index.tsx create mode 100644 src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.module.css create mode 100644 src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.stories.tsx create mode 100644 src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.tsx create mode 100644 src/v4/social/pages/SocialGlobalSearchPage/index.tsx create mode 100644 src/v4/social/pages/SocialHomePage/SocialHomePage.module.css create mode 100644 src/v4/social/pages/SocialHomePage/SocialHomePage.stories.tsx create mode 100644 src/v4/social/pages/SocialHomePage/SocialHomePage.tsx create mode 100644 src/v4/social/pages/SocialHomePage/index.tsx create mode 100644 src/v4/social/pages/StoryPage/StoryPage.module.css create mode 100644 src/v4/social/pages/StoryPage/ViewGlobalFeedStory.tsx create mode 100644 src/v4/social/utils/index.ts create mode 100644 src/v4/utils/permissions.ts diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 000000000..b9562f3cc --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +>0.3%, defaults \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 9f0d4b412..000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,13 +0,0 @@ -### Checklist - -- [ ] There is an associated JIRA issue (**required**) -- [ ] The title of your PR is formatted properly (**required**) -- [ ] Code is up-to-date with the `develop` branch (**required**) - -- [ ] You've successfully run your unit tests locally -- [ ] There are new or updated unit tests validating the change - - -### Short description - - diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml index 8bebc69ec..075a34597 100644 --- a/.github/workflows/dev.yaml +++ b/.github/workflows/dev.yaml @@ -26,14 +26,16 @@ jobs: steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: install node - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 + with: + node-version-file: .tool-versions - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 with: - version: 8 + version: 9 run_install: false - name: Get pnpm store directory @@ -41,7 +43,7 @@ jobs: run: | echo "pnpm_cache_dir=$(pnpm store path | tr -d '\n')" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} diff --git a/.github/workflows/production.yaml b/.github/workflows/production.yaml index 63351027c..f54fafa7a 100644 --- a/.github/workflows/production.yaml +++ b/.github/workflows/production.yaml @@ -33,16 +33,16 @@ jobs: steps: - name: git checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: configure committer run: | git config user.name "bmo-amity-bot" git config user.email "developers@amity.co" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 with: - version: 8 + version: 9 run_install: false - name: Get pnpm store directory @@ -50,7 +50,7 @@ jobs: run: | echo "pnpm_cache_dir=$(pnpm store path | tr -d '\n')" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} diff --git a/.github/workflows/staging.yaml b/.github/workflows/staging.yaml index b5578312f..ac17c7fd1 100644 --- a/.github/workflows/staging.yaml +++ b/.github/workflows/staging.yaml @@ -25,17 +25,24 @@ jobs: steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: install node - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 + with: + node-version-file: .tool-versions - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 with: - version: 8 - run_install: true + version: 9 + run_install: false + + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "pnpm_cache_dir=$(pnpm store path | tr -d '\n')" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index e79685a0d..7d03c52b5 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -10,22 +10,24 @@ jobs: steps: - name: git checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: install node - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 + with: + node-version-file: .tool-versions - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 with: - version: 8 + version: 9 run_install: false - name: Get pnpm store directory id: pnpm-cache run: | - echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT + echo "pnpm_cache_dir=$(pnpm store path | tr -d '\n')" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} diff --git a/.npmrc b/.npmrc index bd3327ab5..e69de29bb 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +0,0 @@ -//registry.npmjs.org/:_authToken=${NPM_TOKEN} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..d65ba3f2c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +dist + +pnpm-lock.yaml \ No newline at end of file diff --git a/.storybook/manager.ts b/.storybook/manager.ts index 65f017a95..6d6534f28 100644 --- a/.storybook/manager.ts +++ b/.storybook/manager.ts @@ -3,4 +3,4 @@ import theme from './theme'; addons.setConfig({ theme, -}); \ No newline at end of file +}); diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 000000000..a138d33d4 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,3 @@ +**/*/*.css + +!src/v4/**/*.css \ No newline at end of file diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 000000000..32bf0e5de --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,6 @@ +{ + "extends": ["stylelint-config-standard", "stylelint-no-unsupported-browser-features"], + "rules": { + "selector-class-pattern": null + } +} diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 000000000..02fda0682 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +nodejs 20.14.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f5ae4a66..4589fa1de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## 4.0.0-beta.8 (2024-06-24) + ## 4.0.0-beta.7 (2024-06-18) ## 4.0.0-beta.6 (2024-06-07) diff --git a/amity-uikit.config.json b/amity-uikit.config.json index ce9f67eda..3b0980017 100644 --- a/amity-uikit.config.json +++ b/amity-uikit.config.json @@ -178,15 +178,15 @@ "theme": { "light": { "primary_color": "#1054DE", - "secondary_color": "#292B32", - "base_color": "#292b32", - "base_shade1_color": "#636878", - "base_shade2_color": "#898e9e", - "base_shade3_color": "#a5a9b5", - "base_shade4_color": "#ebecef", + "secondary_color": "#ebecef", + "base_color": "#ebecef", + "base_shade1_color": "#a5a9b5", + "base_shade2_color": "#6e7487", + "base_shade3_color": "#40434e", + "base_shade4_color": "#292b32", "alert_color": "#FA4D30", - "background_color": "#FFFFFF", - "base_inverse_color": "#000000" + "background_color": "#191919", + "base_inverse_color": "#FFFFFF" }, "dark": { "primary_color": "#1054DE", @@ -208,7 +208,7 @@ "message_limit": 200, "placeholder_text": "Write a message" }, - "live_chat_page/message_list/message_quick_reaction": { + "live_chat/message_list/message_quick_reaction": { "reaction": "heart" } } diff --git a/code-of-conduct.md b/code-of-conduct.md index a89b212a1..dd3af28f3 100644 --- a/code-of-conduct.md +++ b/code-of-conduct.md @@ -1,3 +1,3 @@ # Code of conduct -Please refer to the [Amity code of conduct](https://docs.amity.co/support/code-of-conduct) \ No newline at end of file +Please refer to the [Amity code of conduct](https://docs.amity.co/support/code-of-conduct) diff --git a/package.json b/package.json index 9c29c5f7a..8435f7968 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "@amityco/ui-kit-open-source", - "version": "4.0.0-beta.7", + "version": "4.0.0-beta.8", "engines": { - "node": ">=16", - "pnpm": ">=8" + "node": ">=20", + "pnpm": "9" }, "module": "dist/esm/index.js", "main": "dist/index.js", @@ -33,17 +33,18 @@ "test:watch": "jest --watch", "storybook": "storybook dev -p 6006", "storybook:build": "storybook build --output-dir ./storybook-build", - "lint": "eslint .", - "lint:fix": "eslint . --fix", + "lint": "eslint . && stylelint \"**/*.css\"", + "stylelint": "stylelint", + "lint:fix": "eslint . --fix && stylelint \"**/*.css\" --fix", "tsc": "tsc" }, "peerDependencies": { - "@amityco/ts-sdk": "^6.26.3", + "@amityco/ts-sdk": "^6.27.0", "react": ">=17.0.2", "react-dom": ">=17.0.2" }, "devDependencies": { - "@amityco/ts-sdk": "^6.25.1", + "@amityco/ts-sdk": "^6.27.0", "@storybook/addon-a11y": "^7.6.7", "@storybook/addon-actions": "^7.6.7", "@storybook/addon-backgrounds": "^7.6.7", @@ -69,7 +70,8 @@ "@typescript-eslint/eslint-plugin": "^6.18.0", "@typescript-eslint/parser": "^6.18.0", "@vitejs/plugin-react": "^4.2.1", - "autoprefixer": "^10.4.16", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", "esbuild-plugin-replace": "^1.4.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", @@ -79,7 +81,7 @@ "husky": "^8.0.3", "jest": "^29.7.0", "lint-staged": "^13.3.0", - "postcss": "^8.4.33", + "postcss": "^8.4.38", "prettier": "2.4.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -87,6 +89,9 @@ "standard-version": "^9.5.0", "storybook": "^7.6.7", "styled-components": "^6.1.6", + "stylelint": "^16.6.1", + "stylelint-config-standard": "^36.0.0", + "stylelint-no-unsupported-browser-features": "^8.0.1", "svg-url-loader": "^7.1.1", "ts-jest": "^29.1.1", "tsup": "^7.3.0", @@ -101,8 +106,10 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@hookform/error-message": "^2.0.1", "@hookform/resolvers": "^3.3.4", + "@radix-ui/react-tabs": "^1.0.4", "@tanstack/react-query": "^5.28.14", "clsx": "^2.1.0", + "dayjs": "^1.11.11", "extract-colors": "^4.0.2", "filesize": "^9.0.11", "framer-motion": "^11.1.7", @@ -111,7 +118,10 @@ "linkifyjs": "^4.1.3", "lodash": "^4.17.21", "millify": "^6.1.0", + "modern-normalize": "^2.0.0", "polished": "^4.3.1", + "react-aria": "^3.33.1", + "react-aria-components": "^1.2.1", "react-hook-form": "^7.49.2", "react-infinite-scroll-component": "^6.1.0", "react-insta-stories": "^2.6.2", @@ -127,11 +137,13 @@ "react-use": "^17.4.2", "stylis": "^4.3.1", "uuid": "^8.3.2", + "vaul": "^0.9.1", "zod": "^3.22.4" }, "lint-staged": { - "*.{js,jsx}": "eslint --cache --fix", - "*.{json,md}": "prettier --write" + "*.{js,jsx,ts,tsx}": "eslint --cache --fix", + "*.{json,md,css}": "prettier --write", + "*.{css}": "stylelint --fix" }, "postcss": { "plugins": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ebcec89f..d1bf77335 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2319 +1,1426 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@fortawesome/fontawesome-svg-core': - specifier: ^1.2.36 - version: 1.3.0 - '@fortawesome/free-solid-svg-icons': - specifier: ^5.15.4 - version: 5.15.4 - '@fortawesome/react-fontawesome': - specifier: ^0.2.0 - version: 0.2.0(@fortawesome/fontawesome-svg-core@1.3.0)(react@18.3.1) - '@hookform/error-message': - specifier: ^2.0.1 - version: 2.0.1(react-dom@18.3.1)(react-hook-form@7.51.3)(react@18.3.1) - '@hookform/resolvers': - specifier: ^3.3.4 - version: 3.3.4(react-hook-form@7.51.3) - '@tanstack/react-query': - specifier: ^5.28.14 - version: 5.32.0(react@18.3.1) - clsx: - specifier: ^2.1.0 - version: 2.1.1 - extract-colors: - specifier: ^4.0.2 - version: 4.0.4 - filesize: - specifier: ^9.0.11 - version: 9.0.11 - framer-motion: - specifier: ^11.1.7 - version: 11.1.7(react-dom@18.3.1)(react@18.3.1) - hls.js: - specifier: ^1.4.14 - version: 1.5.8 - linkify-react: - specifier: ^4.1.3 - version: 4.1.3(linkifyjs@4.1.3)(react@18.3.1) - linkifyjs: - specifier: ^4.1.3 - version: 4.1.3 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - millify: - specifier: ^6.1.0 - version: 6.1.0 - polished: - specifier: ^4.3.1 - version: 4.3.1 - react-hook-form: - specifier: ^7.49.2 - version: 7.51.3(react@18.3.1) - react-infinite-scroll-component: - specifier: ^6.1.0 - version: 6.1.0(react@18.3.1) - react-insta-stories: - specifier: ^2.6.2 - version: 2.6.2(react@18.3.1) - react-intl: - specifier: ^6.5.5 - version: 6.6.5(react@18.3.1)(typescript@4.9.5) - react-loading-skeleton: - specifier: ^3.3.1 - version: 3.4.0(react@18.3.1) - react-mentions: - specifier: ^4.4.10 - version: 4.4.10(react-dom@18.3.1)(react@18.3.1) - react-modal-sheet: - specifier: ^2.2.0 - version: 2.2.0(framer-motion@11.1.7)(react@18.3.1) - react-sizeme: - specifier: ^3.0.2 - version: 3.0.2 - react-textarea-autosize: - specifier: ^8.5.3 - version: 8.5.3(@types/react@17.0.80)(react@18.3.1) - react-timeago: - specifier: ^7.2.0 - version: 7.2.0(react@18.3.1) - react-tiny-popover: - specifier: ^7.2.4 - version: 7.2.4(react-dom@18.3.1)(react@18.3.1) - react-truncate-markup: - specifier: ^5.1.2 - version: 5.1.2(react@18.3.1) - react-use: - specifier: ^17.4.2 - version: 17.5.0(react-dom@18.3.1)(react@18.3.1) - stylis: - specifier: ^4.3.1 - version: 4.3.2 - uuid: - specifier: ^8.3.2 - version: 8.3.2 - zod: - specifier: ^3.22.4 - version: 3.23.4 - -devDependencies: - '@amityco/ts-sdk': - specifier: ^6.25.1 - version: 6.25.1 - '@storybook/addon-a11y': - specifier: ^7.6.7 - version: 7.6.18 - '@storybook/addon-actions': - specifier: ^7.6.7 - version: 7.6.18 - '@storybook/addon-backgrounds': - specifier: ^7.6.7 - version: 7.6.18 - '@storybook/addon-controls': - specifier: ^7.6.7 - version: 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/addon-essentials': - specifier: ^7.6.7 - version: 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/addon-toolbars': - specifier: ^7.6.7 - version: 7.6.18 - '@storybook/addon-viewport': - specifier: ^7.6.7 - version: 7.6.18 - '@storybook/client-api': - specifier: ^7.6.7 - version: 7.6.17 - '@storybook/preview-api': - specifier: ^7.6.7 - version: 7.6.18 - '@storybook/react': - specifier: ^7.6.7 - version: 7.6.18(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5) - '@storybook/react-vite': - specifier: ^7.6.7 - version: 7.6.18(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(vite@4.5.3) - '@storybook/theming': - specifier: ^7.6.7 - version: 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 - '@types/lodash': - specifier: ^4.14.202 - version: 4.17.0 - '@types/prop-types': - specifier: ^15.7.11 - version: 15.7.12 - '@types/react': - specifier: ^17.0.74 - version: 17.0.80 - '@types/react-helmet': - specifier: ^6.1.11 - version: 6.1.11 - '@types/react-infinite-scroller': - specifier: ^1.2.5 - version: 1.2.5 - '@types/react-mentions': - specifier: ^4.1.13 - version: 4.1.13 - '@types/react-timeago': - specifier: ^4.1.7 - version: 4.1.7 - '@types/styled-components': - specifier: ^5.1.34 - version: 5.1.34 - '@types/uuid': - specifier: ^9.0.7 - version: 9.0.8 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@4.9.5) - '@typescript-eslint/parser': - specifier: ^6.18.0 - version: 6.21.0(eslint@8.57.0)(typescript@4.9.5) - '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.2.1(vite@4.5.3) - autoprefixer: - specifier: ^10.4.16 - version: 10.4.19(postcss@8.4.38) - esbuild-plugin-replace: - specifier: ^1.4.0 - version: 1.4.0 - eslint: - specifier: ^8.56.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-import-resolver-typescript: - specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jest: - specifier: ^27.6.1 - version: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(jest@29.7.0)(typescript@4.9.5) - husky: - specifier: ^8.0.3 - version: 8.0.3 - jest: - specifier: ^29.7.0 - version: 29.7.0 - lint-staged: - specifier: ^13.3.0 - version: 13.3.0 - postcss: - specifier: ^8.4.33 - version: 8.4.38 - prettier: - specifier: 2.4.0 - version: 2.4.0 - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - react-router-dom: - specifier: ^6.21.1 - version: 6.23.0(react-dom@18.3.1)(react@18.3.1) - standard-version: - specifier: ^9.5.0 - version: 9.5.0 - storybook: - specifier: ^7.6.7 - version: 7.6.18 - styled-components: - specifier: ^6.1.6 - version: 6.1.8(react-dom@18.3.1)(react@18.3.1) - svg-url-loader: - specifier: ^7.1.1 - version: 7.1.1(webpack@5.91.0) - ts-jest: - specifier: ^29.1.1 - version: 29.1.2(@babel/core@7.24.4)(esbuild@0.19.12)(jest@29.7.0)(typescript@4.9.5) - tsup: - specifier: ^7.3.0 - version: 7.3.0(postcss@8.4.38)(typescript@4.9.5) - typescript: - specifier: ^4.9.5 - version: 4.9.5 - typescript-plugin-css-modules: - specifier: ^5.1.0 - version: 5.1.0(typescript@4.9.5) - vite: - specifier: ^4.5.1 - version: 4.5.3 - vite-tsconfig-paths: - specifier: ^4.2.3 - version: 4.3.2(typescript@4.9.5)(vite@4.5.3) +importers: + + .: + dependencies: + '@fortawesome/fontawesome-svg-core': + specifier: ^1.2.36 + version: 1.3.0 + '@fortawesome/free-solid-svg-icons': + specifier: ^5.15.4 + version: 5.15.4 + '@fortawesome/react-fontawesome': + specifier: ^0.2.0 + version: 0.2.2(@fortawesome/fontawesome-svg-core@1.3.0)(react@18.3.1) + '@hookform/error-message': + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1(react@18.3.1))(react-hook-form@7.52.0(react@18.3.1))(react@18.3.1) + '@hookform/resolvers': + specifier: ^3.3.4 + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.28.14 + version: 5.45.1(react@18.3.1) + clsx: + specifier: ^2.1.0 + version: 2.1.1 + dayjs: + specifier: ^1.11.11 + version: 1.11.11 + extract-colors: + specifier: ^4.0.2 + version: 4.0.6 + filesize: + specifier: ^9.0.11 + version: 9.0.11 + framer-motion: + specifier: ^11.1.7 + version: 11.2.11(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + hls.js: + specifier: ^1.4.14 + version: 1.5.11 + linkify-react: + specifier: ^4.1.3 + version: 4.1.3(linkifyjs@4.1.3)(react@18.3.1) + linkifyjs: + specifier: ^4.1.3 + version: 4.1.3 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + millify: + specifier: ^6.1.0 + version: 6.1.0 + modern-normalize: + specifier: ^2.0.0 + version: 2.0.0 + polished: + specifier: ^4.3.1 + version: 4.3.1 + react-aria: + specifier: ^3.33.1 + version: 3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-aria-components: + specifier: ^1.2.1 + version: 1.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-hook-form: + specifier: ^7.49.2 + version: 7.52.0(react@18.3.1) + react-infinite-scroll-component: + specifier: ^6.1.0 + version: 6.1.0(react@18.3.1) + react-insta-stories: + specifier: ^2.6.2 + version: 2.7.0(react@18.3.1) + react-intl: + specifier: ^6.5.5 + version: 6.6.8(react@18.3.1)(typescript@4.9.5) + react-loading-skeleton: + specifier: ^3.3.1 + version: 3.4.0(react@18.3.1) + react-mentions: + specifier: ^4.4.10 + version: 4.4.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-modal-sheet: + specifier: ^2.2.0 + version: 2.2.1(framer-motion@11.2.11(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + react-sizeme: + specifier: ^3.0.2 + version: 3.0.2 + react-textarea-autosize: + specifier: ^8.5.3 + version: 8.5.3(@types/react@17.0.80)(react@18.3.1) + react-timeago: + specifier: ^7.2.0 + version: 7.2.0(react@18.3.1) + react-tiny-popover: + specifier: ^7.2.4 + version: 7.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-truncate-markup: + specifier: ^5.1.2 + version: 5.1.2(react@18.3.1) + react-use: + specifier: ^17.4.2 + version: 17.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + stylis: + specifier: ^4.3.1 + version: 4.3.2 + uuid: + specifier: ^8.3.2 + version: 8.3.2 + vaul: + specifier: ^0.9.1 + version: 0.9.1(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: + specifier: ^3.22.4 + version: 3.23.8 + devDependencies: + '@amityco/ts-sdk': + specifier: ^6.27.0 + version: 6.27.0 + '@storybook/addon-a11y': + specifier: ^7.6.7 + version: 7.6.20 + '@storybook/addon-actions': + specifier: ^7.6.7 + version: 7.6.20 + '@storybook/addon-backgrounds': + specifier: ^7.6.7 + version: 7.6.20 + '@storybook/addon-controls': + specifier: ^7.6.7 + version: 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/addon-essentials': + specifier: ^7.6.7 + version: 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/addon-toolbars': + specifier: ^7.6.7 + version: 7.6.20 + '@storybook/addon-viewport': + specifier: ^7.6.7 + version: 7.6.20 + '@storybook/client-api': + specifier: ^7.6.7 + version: 7.6.17 + '@storybook/preview-api': + specifier: ^7.6.7 + version: 7.6.20 + '@storybook/react': + specifier: ^7.6.7 + version: 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@4.9.5) + '@storybook/react-vite': + specifier: ^7.6.7 + version: 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.18.0)(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)) + '@storybook/theming': + specifier: ^7.6.7 + version: 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/lodash': + specifier: ^4.14.202 + version: 4.17.5 + '@types/prop-types': + specifier: ^15.7.11 + version: 15.7.12 + '@types/react': + specifier: ^17.0.74 + version: 17.0.80 + '@types/react-helmet': + specifier: ^6.1.11 + version: 6.1.11 + '@types/react-infinite-scroller': + specifier: ^1.2.5 + version: 1.2.5 + '@types/react-mentions': + specifier: ^4.1.13 + version: 4.1.13 + '@types/react-timeago': + specifier: ^4.1.7 + version: 4.1.7 + '@types/styled-components': + specifier: ^5.1.34 + version: 5.1.34 + '@types/uuid': + specifier: ^9.0.7 + version: 9.0.8 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^6.18.0 + version: 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.3.1(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + browserslist: + specifier: ^4.23.0 + version: 4.23.1 + esbuild-plugin-replace: + specifier: ^1.4.0 + version: 1.4.0 + eslint: + specifier: ^8.56.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-import-resolver-typescript: + specifier: ^3.6.1 + version: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jest: + specifier: ^27.6.1 + version: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(jest@29.7.0(@types/node@20.14.8))(typescript@4.9.5) + husky: + specifier: ^8.0.3 + version: 8.0.3 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.14.8) + lint-staged: + specifier: ^13.3.0 + version: 13.3.0 + postcss: + specifier: ^8.4.38 + version: 8.4.38 + prettier: + specifier: 2.4.0 + version: 2.4.0 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.21.1 + version: 6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + storybook: + specifier: ^7.6.7 + version: 7.6.20 + styled-components: + specifier: ^6.1.6 + version: 6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + stylelint: + specifier: ^16.6.1 + version: 16.6.1(typescript@4.9.5) + stylelint-config-standard: + specifier: ^36.0.0 + version: 36.0.1(stylelint@16.6.1(typescript@4.9.5)) + stylelint-no-unsupported-browser-features: + specifier: ^8.0.1 + version: 8.0.1(stylelint@16.6.1(typescript@4.9.5)) + svg-url-loader: + specifier: ^7.1.1 + version: 7.1.1(webpack@5.92.1(esbuild@0.19.12)) + ts-jest: + specifier: ^29.1.1 + version: 29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.14.8))(typescript@4.9.5) + tsup: + specifier: ^7.3.0 + version: 7.3.0(postcss@8.4.38)(typescript@4.9.5) + typescript: + specifier: ^4.9.5 + version: 4.9.5 + typescript-plugin-css-modules: + specifier: ^5.1.0 + version: 5.1.0(typescript@4.9.5) + vite: + specifier: ^4.5.1 + version: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^4.2.3 + version: 4.3.2(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)) packages: - /@adobe/css-tools@4.3.3: + '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true - /@amityco/ts-sdk@6.25.1: - resolution: {integrity: sha512-Xm0BhctI1bMw2IDtpd2weY+BIF5bVhu0CXsG6qkZMVNx3whGteh24YDD3J6ZM8h29RaZp3VXb0yHGZLh6InKAw==} + '@amityco/ts-sdk@6.27.0': + resolution: {integrity: sha512-6I55XYqhet6MDlB/qw9YunFO1BD2TwZSr2BBZ3+dWsBjBVp8BTDr7rPy74gpoVmPWRVbD4XTRM1c8dPeWeLEPQ==} engines: {node: '>=12', npm: '>=6'} - dependencies: - agentkeepalive: 4.5.0 - axios: 1.6.8(debug@4.3.4) - debug: 4.3.4 - hls.js: 1.5.8 - js-base64: 3.7.7 - mitt: 3.0.1 - mqtt: 4.3.8 - object-hash: 3.0.0 - react-native-uuid: 2.0.2 - socket.io-client: 2.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@aw-web-design/x-default-browser@1.4.126: + '@aw-web-design/x-default-browser@1.4.126': resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} hasBin: true - dependencies: - default-browser-id: 3.0.0 - dev: true - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - dev: true - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.24.4: - resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helpers': 7.24.4 - '@babel/parser': 7.24.4 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.24.4: - resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + '@babel/helper-create-class-features-plugin@7.24.7': + resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.24.7': + resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.4): + '@babel/helper-define-polyfill-provider@0.6.2': resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + '@babel/helper-member-expression-to-functions@7.24.7': + resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.24.7': + resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - dev: true - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.24.7': + resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + '@babel/helper-wrap-function@7.24.7': + resolution: {integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - dev: true - /@babel/helpers@7.24.4: - resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - dev: true - /@babel/parser@7.24.4: - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.24.0 - dev: true - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7': + resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7': + resolution: {integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7': + resolution: {integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4): + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-bigint@7.8.3': resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): + '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4): + '@babel/plugin-syntax-class-static-block@7.14.5': resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-dynamic-import@7.8.3': resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-export-namespace-from@7.8.3': resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} + '@babel/plugin-syntax-flow@7.24.7': + resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.24.7': + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): + '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): + '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4): + '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): + '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4): + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4): - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.24.7': + resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} + '@babel/plugin-transform-block-scoping@7.24.7': + resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.24.7': + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + '@babel/plugin-transform-classes@7.24.7': + resolution: {integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: true - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/template': 7.24.0 - dev: true - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + '@babel/plugin-transform-destructuring@7.24.7': + resolution: {integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} + '@babel/plugin-transform-flow-strip-types@7.24.7': + resolution: {integrity: sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.24.7': + resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.24.7': + resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.24.7': + resolution: {integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-simple-access': 7.22.5 - dev: true - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.24.7': + resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + '@babel/plugin-transform-optional-chaining@7.24.7': + resolution: {integrity: sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.24.7': + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - regenerator-transform: 0.15.2 - dev: true - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + '@babel/plugin-transform-typeof-symbol@7.24.7': + resolution: {integrity: sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + '@babel/plugin-transform-typescript@7.24.7': + resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - dev: true - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.24.7': + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/preset-env@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} + '@babel/preset-env@7.24.7': + resolution: {integrity: sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.4) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.4) - core-js-compat: 3.37.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-flow@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} + '@babel/preset-flow@7.24.7': + resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4): + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/types': 7.24.0 - esutils: 2.0.3 - dev: true - /@babel/preset-typescript@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + '@babel/preset-typescript@7.24.7': + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) - dev: true - /@babel/register@7.23.7(@babel/core@7.24.4): - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.4 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 - dev: true - /@babel/regjsgen@0.8.0: + '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true - /@babel/runtime@7.24.4: - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + '@babel/runtime@7.24.7': + resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - /@babel/runtime@7.4.5: + '@babel/runtime@7.4.5': resolution: {integrity: sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==} - dependencies: - regenerator-runtime: 0.13.11 - dev: false - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - dev: true - /@babel/traverse@7.24.1: - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@base2/pretty-print-object@1.0.1: + '@base2/pretty-print-object@1.0.1': resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - dev: true - /@bcoe/v8-coverage@0.2.3: + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@colors/colors@1.5.0: + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true - optional: true - /@discoveryjs/json-ext@0.5.7: + '@csstools/css-parser-algorithms@2.6.3': + resolution: {integrity: sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.3.1 + + '@csstools/css-tokenizer@2.3.1': + resolution: {integrity: sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==} + engines: {node: ^14 || ^16 || >=18} + + '@csstools/media-query-list-parser@2.1.11': + resolution: {integrity: sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.6.3 + '@csstools/css-tokenizer': ^2.3.1 + + '@csstools/selector-specificity@3.1.1': + resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + + '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - dev: true - /@emotion/is-prop-valid@1.2.1: - resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: true + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - /@emotion/memoize@0.8.1: + '@emotion/memoize@0.8.1': resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: true - /@emotion/unitless@0.8.0: - resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} - dev: true + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1): + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' - dependencies: - react: 18.3.1 - dev: true - /@esbuild/aix-ppc64@0.19.12: + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.20: + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.12: + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.12: + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.20: + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.12: + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.20: + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.12: + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.20: + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.12: + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.20: + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.20: + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.12: + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.20: + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.12: + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.20: + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.12: + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.20: + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.12: + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.20: + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.12: + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.20: + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.12: + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.20: + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.12: + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.20: + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.12: + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.20: + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.12: + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.20: + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.12: + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.20: + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.12: + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.20: + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.12: + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.20: + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.12: + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.20: + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.12: + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.20: + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.12: + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.12: + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.10.1': + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.57.0: + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@fal-works/esbuild-plugin-global-externals@2.1.2: + '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - dev: true - /@floating-ui/core@1.6.1: - resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} - dependencies: - '@floating-ui/utils': 0.2.2 - dev: true + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - /@floating-ui/dom@1.6.4: - resolution: {integrity: sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==} - dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.2 - dev: true + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - /@floating-ui/react-dom@2.0.9(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} + '@floating-ui/react-dom@2.1.0': + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.6.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@floating-ui/utils@0.2.2: + '@floating-ui/utils@0.2.2': resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - dev: true - /@formatjs/ecma402-abstract@1.18.2: - resolution: {integrity: sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==} - dependencies: - '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 - dev: false + '@formatjs/ecma402-abstract@2.0.0': + resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} - /@formatjs/fast-memoize@2.2.0: + '@formatjs/fast-memoize@2.2.0': resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - dependencies: - tslib: 2.6.2 - dev: false - /@formatjs/icu-messageformat-parser@2.7.6: - resolution: {integrity: sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/icu-skeleton-parser': 1.8.0 - tslib: 2.6.2 - dev: false + '@formatjs/icu-messageformat-parser@2.7.8': + resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} - /@formatjs/icu-skeleton-parser@1.8.0: - resolution: {integrity: sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - tslib: 2.6.2 - dev: false + '@formatjs/icu-skeleton-parser@1.8.2': + resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} - /@formatjs/intl-displaynames@6.6.6: - resolution: {integrity: sha512-Dg5URSjx0uzF8VZXtHb6KYZ6LFEEhCbAbKoYChYHEOnMFTw/ZU3jIo/NrujzQD2EfKPgQzIq73LOUvW6Z/LpFA==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 - dev: false + '@formatjs/intl-displaynames@6.6.8': + resolution: {integrity: sha512-Lgx6n5KxN16B3Pb05z3NLEBQkGoXnGjkTBNCZI+Cn17YjHJ3fhCeEJJUqRlIZmJdmaXQhjcQVDp6WIiNeRYT5g==} - /@formatjs/intl-listformat@7.5.5: - resolution: {integrity: sha512-XoI52qrU6aBGJC9KJddqnacuBbPlb/bXFN+lIFVFhQ1RnFHpzuFrlFdjD9am2O7ZSYsyqzYRpkVcXeT1GHkwDQ==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 - dev: false + '@formatjs/intl-listformat@7.5.7': + resolution: {integrity: sha512-MG2TSChQJQT9f7Rlv+eXwUFiG24mKSzmF144PLb8m8OixyXqn4+YWU+5wZracZGCgVTVmx8viCf7IH3QXoiB2g==} - /@formatjs/intl-localematcher@0.5.4: + '@formatjs/intl-localematcher@0.5.4': resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} - dependencies: - tslib: 2.6.2 - dev: false - /@formatjs/intl@2.10.1(typescript@4.9.5): - resolution: {integrity: sha512-dsLG15U7xDi8yzKf4hcAWSsCaez3XrjTO2oaRHPyHtXLm1aEzYbDw6bClo/HMHu+iwS5GbDqT3DV+hYP2ylScg==} + '@formatjs/intl@2.10.4': + resolution: {integrity: sha512-56483O+HVcL0c7VucAS2tyH020mt9XTozZO67cwtGg0a7KWDukS/FzW3OnvaHmTHDuYsoPIzO+ZHVfU6fT/bJw==} peerDependencies: typescript: ^4.7 || 5 peerDependenciesMeta: typescript: optional: true - dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.6 - '@formatjs/intl-displaynames': 6.6.6 - '@formatjs/intl-listformat': 7.5.5 - intl-messageformat: 10.5.11 - tslib: 2.6.2 - typescript: 4.9.5 - dev: false - /@fortawesome/fontawesome-common-types@0.2.36: + '@fortawesome/fontawesome-common-types@0.2.36': resolution: {integrity: sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==} engines: {node: '>=6'} - requiresBuild: true - dev: false - /@fortawesome/fontawesome-common-types@0.3.0: + '@fortawesome/fontawesome-common-types@0.3.0': resolution: {integrity: sha512-CA3MAZBTxVsF6SkfkHXDerkhcQs0QPofy43eFdbWJJkZiq3SfiaH1msOkac59rQaqto5EqWnASboY1dBuKen5w==} engines: {node: '>=6'} deprecated: Please upgrade to 6.1.0. https://fontawesome.com/docs/changelog/ - requiresBuild: true - dev: false - /@fortawesome/fontawesome-svg-core@1.3.0: + '@fortawesome/fontawesome-svg-core@1.3.0': resolution: {integrity: sha512-UIL6crBWhjTNQcONt96ExjUnKt1D68foe3xjEensLDclqQ6YagwCRYVQdrp/hW0ALRp/5Fv/VKw+MqTUWYYvPg==} engines: {node: '>=6'} deprecated: Please upgrade to 6.1.0. https://fontawesome.com/docs/changelog/ - requiresBuild: true - dependencies: - '@fortawesome/fontawesome-common-types': 0.3.0 - dev: false - /@fortawesome/free-solid-svg-icons@5.15.4: + '@fortawesome/free-solid-svg-icons@5.15.4': resolution: {integrity: sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==} engines: {node: '>=6'} - requiresBuild: true - dependencies: - '@fortawesome/fontawesome-common-types': 0.2.36 - dev: false - /@fortawesome/react-fontawesome@0.2.0(@fortawesome/fontawesome-svg-core@1.3.0)(react@18.3.1): - resolution: {integrity: sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==} + '@fortawesome/react-fontawesome@0.2.2': + resolution: {integrity: sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==} peerDependencies: '@fortawesome/fontawesome-svg-core': ~1 || ~6 react: '>=16.3' - dependencies: - '@fortawesome/fontawesome-svg-core': 1.3.0 - prop-types: 15.8.1 - react: 18.3.1 - dev: false - /@hookform/error-message@2.0.1(react-dom@18.3.1)(react-hook-form@7.51.3)(react@18.3.1): + '@hookform/error-message@2.0.1': resolution: {integrity: sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' react-hook-form: ^7.0.0 - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-hook-form: 7.51.3(react@18.3.1) - dev: false - /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): - resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + '@hookform/resolvers@3.6.0': + resolution: {integrity: sha512-UBcpyOX3+RR+dNnqBd0lchXpoL8p4xC21XP8H6Meb8uve5Br1GCnmg0PcBoKKqPKgGu9GHQ/oygcmPrQhetwqw==} peerDependencies: react-hook-form: ^7.0.0 - dependencies: - react-hook-form: 7.51.3(react@18.3.1) - dev: false - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true + deprecated: Use @eslint/config-array instead - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.3: + '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: true + deprecated: Use @eslint/object-schema instead - /@hutson/parse-repository-url@3.0.2: + '@hutson/parse-repository-url@3.0.2': resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - dev: true - /@isaacs/cliui@8.0.2: + '@internationalized/date@3.5.4': + resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} + + '@internationalized/message@3.1.4': + resolution: {integrity: sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==} + + '@internationalized/number@3.5.3': + resolution: {integrity: sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==} + + '@internationalized/string@3.2.3': + resolution: {integrity: sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw==} + + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - /@istanbuljs/load-nyc-config@1.1.0: + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - /@jest/console@29.7.0: + '@jest/console@29.7.0': resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.12.7 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: true - /@jest/core@29.7.0: + '@jest/core@29.7.0': resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2321,93 +1428,28 @@ packages: peerDependenciesMeta: node-notifier: optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.12.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.7) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - /@jest/environment@29.7.0: + '@jest/environment@29.7.0': resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.12.7 - jest-mock: 29.7.0 - dev: true - /@jest/expect-utils@29.7.0: + '@jest/expect-utils@29.7.0': resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - /@jest/expect@29.7.0: + '@jest/expect@29.7.0': resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/fake-timers@29.7.0: + '@jest/fake-timers@29.7.0': resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.7 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - /@jest/globals@29.7.0: + '@jest/globals@29.7.0': resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/reporters@29.7.0: + '@jest/reporters@29.7.0': resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -2415,107 +1457,32 @@ packages: peerDependenciesMeta: node-notifier: optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.7 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - /@jest/source-map@29.6.3: + '@jest/source-map@29.6.3': resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - /@jest/test-result@29.7.0: + '@jest/test-result@29.7.0': resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - dev: true - /@jest/test-sequencer@29.7.0: + '@jest/test-sequencer@29.7.0': resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - dev: true - /@jest/transform@29.7.0: + '@jest/transform@29.7.0': resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.24.4 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/types@29.6.3: + '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.7 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@4.9.5)(vite@4.5.3): + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0': resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} peerDependencies: typescript: '>= 4.3.x' @@ -2523,114 +1490,65 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - glob: 7.2.3 - glob-promise: 4.2.2(glob@7.2.3) - magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@4.9.5) - typescript: 4.9.5 - vite: 4.5.3 - dev: true - /@jridgewell/gen-mapping@0.3.5: + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.2.1: + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/source-map@0.3.6: + '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.25: + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@juggle/resize-observer@3.4.0: + '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - dev: true - /@mdx-js/react@2.3.0(react@18.3.1): + '@mdx-js/react@2.3.0': resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} peerDependencies: react: '>=16' - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 17.0.80 - react: 18.3.1 - dev: true - /@ndelangen/get-tarball@3.0.9: + '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} - dependencies: - gunzip-maybe: 1.4.2 - pump: 3.0.0 - tar-fs: 2.1.1 - dev: true - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - /@pkgjs/parseargs@0.11.0: + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@radix-ui/number@1.0.1: + '@radix-ui/number@1.0.1': resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - dependencies: - '@babel/runtime': 7.24.4 - dev: true - /@radix-ui/primitive@1.0.1: + '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - dependencies: - '@babel/runtime': 7.24.4 - dev: true - /@radix-ui/react-arrow@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-arrow@1.0.3': resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -2642,15 +1560,8 @@ packages: optional: true '@types/react-dom': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-collection@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/react-collection@1.0.3': resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -2662,84 +1573,114 @@ packages: optional: true '@types/react-dom': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-compose-refs@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 - react: 18.3.1 - dev: true + '@types/react-dom': + optional: true - /@radix-ui/react-context@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + '@radix-ui/react-compose-refs@1.0.1': + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 - react: 18.3.1 - dev: true - /@radix-ui/react-direction@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 - react: 18.3.1 - dev: true - /@radix-ui/react-dismissable-layer@1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + '@radix-ui/react-context@1.0.1': + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 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': + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.1': + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.0.1': + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.0.4': + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + 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-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-focus-guards@1.0.1(@types/react@17.0.80)(react@18.3.1): + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.0.1': resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -2747,13 +1688,17 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 - react: 18.3.1 - dev: true - /@radix-ui/react-focus-scope@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.0.3': resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: '@types/react': '*' @@ -2765,17 +1710,21 @@ packages: optional: true '@types/react-dom': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-id@1.0.1(@types/react@17.0.80)(react@18.3.1): + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.0.1': resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -2783,14 +1732,17 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - dev: true - /@radix-ui/react-popper@1.1.2(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popper@1.1.2': resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -2802,24 +1754,8 @@ packages: optional: true '@types/react-dom': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/rect': 1.0.1 - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-portal@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/react-portal@1.0.3': resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -2831,15 +1767,34 @@ packages: optional: true '@types/react-dom': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-primitive@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@1.0.3': resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -2851,43 +1806,34 @@ packages: optional: true '@types/react-dom': optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-slot': 1.0.2(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-roving-focus@1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc 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-collection': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-select@1.2.2(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): + '@radix-ui/react-select@1.2.2': resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} peerDependencies: '@types/react': '*' @@ -2899,504 +1845,8693 @@ packages: optional: true '@types/react-dom': optional: true + + '@radix-ui/react-separator@1.1.0': + resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.0.2': + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.0': + resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.0': + resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.0': + resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.1.0': + resolution: {integrity: sha512-ZUKknxhMTL/4hPh+4DuaTot9aO7UD6Kupj4gqXCsBTayX1pD1L+0C2/2VZKXb4tIifQklZ3pf2hG9T+ns+FclQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.0.1': + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.0.1': + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.0.3': + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.0.1': + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.0.1': + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.0.1': + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.0.1': + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.0.3': + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + 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 + + '@radix-ui/rect@1.0.1': + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + + '@react-aria/breadcrumbs@3.5.13': + resolution: {integrity: sha512-G1Gqf/P6kVdfs94ovwP18fTWuIxadIQgHsXS08JEVcFVYMjb9YjqnEBaohUxD1tq2WldMbYw53ahQblT4NTG+g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/button@3.9.5': + resolution: {integrity: sha512-dgcYR6j8WDOMLKuVrtxzx4jIC05cVKDzc+HnPO8lNkBAOfjcuN5tkGRtIjLtqjMvpZHhQT5aDbgFpIaZzxgFIg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/calendar@3.5.8': + resolution: {integrity: sha512-Whlp4CeAA5/ZkzrAHUv73kgIRYjw088eYGSc+cvSOCxfrc/2XkBm9rNrnSBv0DvhJ8AG0Fjz3vYakTmF3BgZBw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/checkbox@3.14.3': + resolution: {integrity: sha512-EtBJL6iu0gvrw3A4R7UeVLR6diaVk/mh4kFBc7c8hQjpEJweRr4hmJT3hrNg3MBcTWLxFiMEXPGgWEwXDBygtA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/color@3.0.0-beta.33': + resolution: {integrity: sha512-nhqnIHYm5p6MbuF3cC6lnqzG7MjwBsBd0DtpO+ByFYO+zxpMMbeC5R+1SFxvapR4uqmAzTotbtiUCGsG+SUaIg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/combobox@3.9.1': + resolution: {integrity: sha512-SpK92dCmT8qn8aEcUAihRQrBb5LZUhwIbDExFII8PvUvEFy/PoQHXIo3j1V29WkutDBDpMvBv/6XRCHGXPqrhQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/datepicker@3.10.1': + resolution: {integrity: sha512-4HZL593nrNMa1GjBmWEN/OTvNS6d3/16G1YJWlqiUlv11ADulSbqBIjMmkgwrJVFcjrgqtXFy+yyrTA/oq94Zw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/dialog@3.5.14': + resolution: {integrity: sha512-oqDCjQ8hxe3GStf48XWBf2CliEnxlR9GgSYPHJPUc69WBj68D9rVcCW3kogJnLAnwIyf3FnzbX4wSjvUa88sAQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/dnd@3.6.1': + resolution: {integrity: sha512-6WnujUTD+cIYZVF/B+uXdHyJ+WSpbYa8jH282epvY4FUAq1qLmen12/HHcoj/5dswKQe8X6EM3OhkQM89d9vFw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/focus@3.17.1': + resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/form@3.0.5': + resolution: {integrity: sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/grid@3.9.1': + resolution: {integrity: sha512-fGEZqAEaS8mqzV/II3N4ndoNWegIcbh+L3PmKbXdpKKUP8VgMs/WY5rYl5WAF0f5RoFwXqx3ibDLeR9tKj/bOg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/gridlist@3.8.1': + resolution: {integrity: sha512-vVPkkA+Ct0NDcpnNm/tnYaBumg0fP9pXxsPLqL1rxvsTyj1PaIpFTZ4corabPTbTDExZwUSTS3LG1n+o1OvBtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/i18n@3.11.1': + resolution: {integrity: sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/interactions@3.21.3': + resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/label@3.7.8': + resolution: {integrity: sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/link@3.7.1': + resolution: {integrity: sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/listbox@3.12.1': + resolution: {integrity: sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/live-announcer@3.3.4': + resolution: {integrity: sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==} + + '@react-aria/menu@3.14.1': + resolution: {integrity: sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/meter@3.4.13': + resolution: {integrity: sha512-oG6KvHQM3ri93XkYQkgEaMKSMO9KNDVpcW1MUqFfqyUXHFBRZRrJB4BTXMZ4nyjheFVQjVboU51fRwoLjOzThg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/numberfield@3.11.3': + resolution: {integrity: sha512-QQ9ZTzBbRI8d9ksaBWm6YVXbgv+5zzUsdxVxwzJVXLznvivoORB8rpdFJzUEWVCo25lzoBxluCEPYtLOxP1B0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/overlays@3.22.1': + resolution: {integrity: sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/progress@3.4.13': + resolution: {integrity: sha512-YBV9bOO5JzKvG8QCI0IAA00o6FczMgIDiK8Q9p5gKorFMatFUdRayxlbIPoYHMi+PguLil0jHgC7eOyaUcrZ0g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/radio@3.10.4': + resolution: {integrity: sha512-3fmoMcQtCpgjTwJReFjnvIE/C7zOZeCeWUn4JKDqz9s1ILYsC3Rk5zZ4q66tFn6v+IQnecrKT52wH6+hlVLwTA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/searchfield@3.7.5': + resolution: {integrity: sha512-h1sMUOWjhevaKKUHab/luHbM6yiyeN57L4RxZU0IIc9Ww0h5Rp2GUuKZA3pcdPiExHje0aijcImL3wBHEbKAzw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/select@3.14.5': + resolution: {integrity: sha512-s8jixBuTUNdKWRHe2tIJqp55ORHeUObGMw1s7PQRRVrrHPdNSYseAOI9B2W7qpl3hKhvjJg40UW+45mcb1WKbw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/selection@3.18.1': + resolution: {integrity: sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/separator@3.3.13': + resolution: {integrity: sha512-hofA6JCPnAOqSE9vxnq7Dkazr7Kb2A0I5sR16fOG7ddjYRc/YEY5Nv7MWfKUGU0kNFHkgNjsDAILERtLechzeA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/slider@3.7.8': + resolution: {integrity: sha512-MYvPcM0K8jxEJJicUK2+WxUkBIM/mquBxOTOSSIL3CszA80nXIGVnLlCUnQV3LOUzpWtabbWaZokSPtGgOgQOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/spinbutton@3.6.5': + resolution: {integrity: sha512-0aACBarF/Xr/7ixzjVBTQ0NBwwwsoGkf5v6AVFVMTC0uYMXHTALvRs+ULHjHMa5e/cX/aPlEvaVT7jfSs+Xy9Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/ssr@3.9.4': + resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/switch@3.6.4': + resolution: {integrity: sha512-2nVqz4ZuJyof47IpGSt3oZRmp+EdS8wzeDYgf42WHQXrx4uEOk1mdLJ20+NnsYhj/2NHZsvXVrjBeKMjlMs+0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/table@3.14.1': + resolution: {integrity: sha512-WaPgQe4zQF5OaluO5rm+Y2nEoFR63vsLd4BT4yjK1uaFhKhDY2Zk+1SCVQvBLLKS4WK9dhP05nrNzT0vp/ZPOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/tabs@3.9.1': + resolution: {integrity: sha512-S5v/0sRcOaSXaJYZuuy1ZVzYc7JD4sDyseG1133GjyuNjJOFHgoWMb+b4uxNIJbZxnLgynn/ZDBZSO+qU+fIxw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/tag@3.4.1': + resolution: {integrity: sha512-gcIGPYZ2OBwMT4IHnlczEezKlxr0KRPL/mSfm2Q91GE027ZGOJnqusH9az6DX1qxrQx8x3vRdqYT2KmuefkrBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/textfield@3.14.5': + resolution: {integrity: sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/toggle@3.10.4': + resolution: {integrity: sha512-bRk+CdB8QzrSyGNjENXiTWxfzYKRw753iwQXsEAU7agPCUdB8cZJyrhbaUoD0rwczzTp2zDbZ9rRbUPdsBE2YQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/toolbar@3.0.0-beta.5': + resolution: {integrity: sha512-c8spY7aeLI6L+ygdXvEbAzaT41vExsxZ1Ld0t7BB+6iEF3nyBNJHshjkgdR7nv8FLgNk0no4tj0GTq4Jj4UqHQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/tooltip@3.7.4': + resolution: {integrity: sha512-+XRx4HlLYqWY3fB8Z60bQi/rbWDIGlFUtXYbtoa1J+EyRWfhpvsYImP8qeeNO/vgjUtDy1j9oKa8p6App9mBMQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/tree@3.0.0-alpha.1': + resolution: {integrity: sha512-CucyeJ4VeAvWO5UJHt/l9JO65CVtsOVUctMOVNCQS77Isqp3olX9pvfD3LXt8fD5Ph2g0Q/b7siVpX5ieVB32g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/utils@3.17.0': + resolution: {integrity: sha512-NEul0cQ6tQPdNSHYzNYD+EfFabeYNvDwEiHB82kK/Tsfhfm84SM+baben/at2N51K7iRrJPr5hC5fi4+P88lNg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/utils@3.24.1': + resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/visually-hidden@3.8.12': + resolution: {integrity: sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/calendar@3.5.1': + resolution: {integrity: sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/checkbox@3.6.5': + resolution: {integrity: sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/collections@3.10.7': + resolution: {integrity: sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/color@3.6.1': + resolution: {integrity: sha512-iW0nAhl3+fUBegHMw5EcAbFVDpgwHBrivfC85pVoTM3pyzp66hqNN6R6xWxW6ETyljS8UOer59+/w4GDVGdPig==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/combobox@3.8.4': + resolution: {integrity: sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/data@3.11.4': + resolution: {integrity: sha512-PbnUQxeE6AznSuEWYnRmrYQ9t5z1Asx98Jtrl96EeA6Iapt9kOjTN9ySqCxtPxMKleb1NIqG3+uHU3veIqmLsg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/datepicker@3.9.4': + resolution: {integrity: sha512-yBdX01jn6gq4NIVvHIqdjBUPo+WN8Bujc4OnPw+ZnfA4jI0eIgq04pfZ84cp1LVXW0IB0VaCu1AlQ/kvtZjfGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/dnd@3.3.1': + resolution: {integrity: sha512-I/Ci5xB8hSgAXzoWYWScfMM9UK1MX/eTlARBhiSlfudewweOtNJAI+cXJgU7uiUnGjh4B4v3qDBtlAH1dWDCsw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/flags@3.0.3': + resolution: {integrity: sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw==} + + '@react-stately/form@3.0.3': + resolution: {integrity: sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/grid@3.8.7': + resolution: {integrity: sha512-he3TXCLAhF5C5z1/G4ySzcwyt7PEiWcVIupxebJQqRyFrNWemSuv+7tolnStmG8maMVIyV3P/3j4eRBbdSlOIg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/list@3.10.5': + resolution: {integrity: sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/menu@3.7.1': + resolution: {integrity: sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/numberfield@3.9.3': + resolution: {integrity: sha512-UlPTLSabhLEuHtgzM0PgfhtEaHy3yttbzcRb8yHNvGo4KbCHeHpTHd3QghKfTFm024Mug7+mVlWCmMtW0f5ttg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/overlays@3.6.7': + resolution: {integrity: sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/radio@3.10.4': + resolution: {integrity: sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/searchfield@3.5.3': + resolution: {integrity: sha512-H0OvlgwPIFdc471ypw79MDjz3WXaVq9+THaY6JM4DIohEJNN5Dwei7O9g6r6m/GqPXJIn5TT3b74kJ2Osc00YQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/select@3.6.4': + resolution: {integrity: sha512-whZgF1N53D0/dS8tOFdrswB0alsk5Q5620HC3z+5f2Hpi8gwgAZ8TYa+2IcmMYRiT+bxVuvEc/NirU9yPmqGbA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/selection@3.15.1': + resolution: {integrity: sha512-6TQnN9L0UY9w19B7xzb1P6mbUVBtW840Cw1SjgNXCB3NPaCf59SwqClYzoj8O2ZFzMe8F/nUJtfU1NS65/OLlw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/slider@3.5.4': + resolution: {integrity: sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/table@3.11.8': + resolution: {integrity: sha512-EdyRW3lT1/kAVDp5FkEIi1BQ7tvmD2YgniGdLuW/l9LADo0T+oxZqruv60qpUS6sQap+59Riaxl91ClDxrJnpg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/tabs@3.6.6': + resolution: {integrity: sha512-sOLxorH2uqjAA+v1ppkMCc2YyjgqvSGeBDgtR/lyPSDd4CVMoTExszROX2dqG0c8il9RQvzFuufUtQWMY6PgSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/toggle@3.7.4': + resolution: {integrity: sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/tooltip@3.4.9': + resolution: {integrity: sha512-P7CDJsdoKarz32qFwf3VNS01lyC+63gXpDZG31pUu+EO5BeQd4WKN/AH1Beuswpr4GWzxzFc1aXQgERFGVzraA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/tree@3.8.1': + resolution: {integrity: sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/utils@3.10.1': + resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/virtualizer@3.7.1': + resolution: {integrity: sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/breadcrumbs@3.7.5': + resolution: {integrity: sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/button@3.9.4': + resolution: {integrity: sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/calendar@3.4.6': + resolution: {integrity: sha512-WSntZPwtvsIYWvBQRAPvuCn55UTJBZroTvX0vQvWykJRQnPAI20G1hMQ3dNsnAL+gLZUYxBXn66vphmjUuSYew==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/checkbox@3.8.1': + resolution: {integrity: sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/color@3.0.0-beta.25': + resolution: {integrity: sha512-D24ASvLeSWouBwOBi4ftUe4/BhrZj5AiHV7tXwrVeMGOy9Z9jyeK65Xysq+R3ecaSONLXsgai5CQMvj13cOacA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/combobox@3.11.1': + resolution: {integrity: sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/datepicker@3.7.4': + resolution: {integrity: sha512-ZfvgscvNzBJpYyVWg3nstJtA/VlWLwErwSkd1ivZYam859N30w8yH+4qoYLa6FzWLCFlrsRHyvtxlEM7lUAt5A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/dialog@3.5.10': + resolution: {integrity: sha512-S9ga+edOLNLZw7/zVOnZdT5T40etpzUYBXEKdFPbxyPYnERvRxJAsC1/ASuBU9fQAXMRgLZzADWV+wJoGS/X9g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/form@3.7.4': + resolution: {integrity: sha512-HZojAWrb6feYnhDEOy3vBamDVAHDl0l2JQZ7aIDLHmeTAGQC3JNZcm2fLTxqLye46zz8w8l8OHgI+NdD4PHdOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/grid@3.2.6': + resolution: {integrity: sha512-XfHenL2jEBUYrhKiPdeM24mbLRXUn79wVzzMhrNYh24nBwhsPPpxF+gjFddT3Cy8dt6tRInfT6pMEu9nsXwaHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/link@3.5.5': + resolution: {integrity: sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/listbox@3.4.9': + resolution: {integrity: sha512-S5G+WmNKUIOPZxZ4svWwWQupP3C6LmVfnf8QQmPDvwYXGzVc0WovkqUWyhhjJirFDswTXRCO9p0yaTHHIlkdwQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/menu@3.9.9': + resolution: {integrity: sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/meter@3.4.1': + resolution: {integrity: sha512-AIJV4NDFAqKH94s02c5Da4TH2qgJjfrw978zuFM0KUBFD85WRPKh7MvgWpomvUgmzqE6lMCzIdi1KPKqrRabdw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/numberfield@3.8.3': + resolution: {integrity: sha512-z5fGfVj3oh5bmkw9zDvClA1nDBSFL9affOuyk2qZ/M2SRUmykDAPCksbfcMndft0XULWKbF4s2CYbVI+E/yrUA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/overlays@3.8.7': + resolution: {integrity: sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/progress@3.5.4': + resolution: {integrity: sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/radio@3.8.1': + resolution: {integrity: sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/searchfield@3.5.5': + resolution: {integrity: sha512-T/NHg12+w23TxlXMdetogLDUldk1z5dDavzbnjKrLkajLb221bp8brlR/+O6C1CtFpuJGALqYHgTasU1qkQFSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/select@3.9.4': + resolution: {integrity: sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/shared@3.23.1': + resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/slider@3.7.3': + resolution: {integrity: sha512-F8qFQaD2mqug2D0XeWMmjGBikiwbdERFlhFzdvNGbypPLz3AZICBKp1ZLPWdl0DMuy03G/jy6Gl4mDobl7RT2g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/switch@3.5.3': + resolution: {integrity: sha512-Nb6+J5MrPaFa8ZNFKGMzAsen/NNzl5UG/BbC65SLGPy7O0VDa/sUpn7dcu8V2xRpRwwIN/Oso4v63bt2sgdkgA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/table@3.9.5': + resolution: {integrity: sha512-fgM2j9F/UR4Anmd28CueghCgBwOZoCVyN8fjaIFPd2MN4gCwUUfANwxLav65gZk4BpwUXGoQdsW+X50L3555mg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/tabs@3.3.7': + resolution: {integrity: sha512-ZdLe5xOcFX6+/ni45Dl2jO0jFATpTnoSqj6kLIS/BYv8oh0n817OjJkLf+DS3CLfNjApJWrHqAk34xNh6nRnEg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/textfield@3.9.3': + resolution: {integrity: sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/tooltip@3.4.9': + resolution: {integrity: sha512-wZ+uF1+Zc43qG+cOJzioBmLUNjRa7ApdcT0LI1VvaYvH5GdfjzUJOorLX9V/vAci0XMJ50UZ+qsh79aUlw2yqg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@remix-run/router@1.16.1': + resolution: {integrity: sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==} + engines: {node: '>=14.0.0'} + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@storybook/addon-a11y@7.6.20': + resolution: {integrity: sha512-t19O2KW+8NF8mdxAZdubpe0s/3x7z5cl4LdyiNQgYxcUGjhjAUD+C3UvEUsRxG71ZAID/VC8SX+G2HX5TENGHA==} + + '@storybook/addon-actions@7.6.20': + resolution: {integrity: sha512-c/GkEQ2U9BC/Ew/IMdh+zvsh4N6y6n7Zsn2GIhJgcu9YEAa5aF2a9/pNgEGBMOABH959XE8DAOMERw/5qiLR8g==} + + '@storybook/addon-backgrounds@7.6.20': + resolution: {integrity: sha512-a7ukoaXT42vpKsMxkseIeO3GqL0Zst2IxpCTq5dSlXiADrcemSF/8/oNpNW9C4L6F1Zdt+WDtECXslEm017FvQ==} + + '@storybook/addon-controls@7.6.20': + resolution: {integrity: sha512-06ZT5Ce1sZW52B0s6XuokwjkKO9GqHlTUHvuflvd8wifxKlCmRvNUxjBvwh+ccGJ49ZS73LbMSLFgtmBEkCxbg==} + + '@storybook/addon-docs@7.6.20': + resolution: {integrity: sha512-XNfYRhbxH5JP7B9Lh4W06PtMefNXkfpV39Gaoih5HuqngV3eoSL4RikZYOMkvxRGQ738xc6axySU3+JKcP1OZg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/addon-essentials@7.6.20': + resolution: {integrity: sha512-hCupSOiJDeOxJKZSgH0x5Mb2Xqii6mps21g5hpxac1XjhQtmGflShxi/xOHhK3sNqrbgTSbScfpUP3hUlZO/2Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/addon-highlight@7.6.20': + resolution: {integrity: sha512-7/x7xFdFyqCki5Dm3uBePldUs9l98/WxJ7rTHQuYqlX7kASwyN5iXPzuhmMRUhlMm/6G6xXtLabIpzwf1sFurA==} + + '@storybook/addon-measure@7.6.20': + resolution: {integrity: sha512-i2Iq08bGfI7gZbG6Lb8uF/L287tnaGUR+2KFEmdBjH6+kgjWLiwfpanoPQpy4drm23ar0gUjX+L3Ri03VI5/Xg==} + + '@storybook/addon-outline@7.6.20': + resolution: {integrity: sha512-TdsIQZf/TcDsGoZ1XpO+9nBc4OKqcMIzY4SrI8Wj9dzyFLQ37s08gnZr9POci8AEv62NTUOVavsxcafllkzqDQ==} + + '@storybook/addon-toolbars@7.6.20': + resolution: {integrity: sha512-5Btg4i8ffWTDHsU72cqxC8nIv9N3E3ObJAc6k0llrmPBG/ybh3jxmRfs8fNm44LlEXaZ5qrK/petsXX3UbpIFg==} + + '@storybook/addon-viewport@7.6.20': + resolution: {integrity: sha512-i8mIw8BjLWAVHEQsOTE6UPuEGQvJDpsu1XZnOCkpfTfPMz73m+3td/PmLG7mMT2wPnLu9IZncKLCKTAZRbt/YQ==} + + '@storybook/blocks@7.6.20': + resolution: {integrity: sha512-xADKGEOJWkG0UD5jbY4mBXRlmj2C+CIupDL0/hpzvLvwobxBMFPKZIkcZIMvGvVnI/Ui+tJxQxLSuJ5QsPthUw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/builder-manager@7.6.20': + resolution: {integrity: sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==} + + '@storybook/builder-vite@7.6.20': + resolution: {integrity: sha512-q3vf8heE7EaVYTWlm768ewaJ9lh6v/KfoPPeHxXxzSstg4ByP9kg4E1mrfAo/l6broE9E9zo3/Q4gsM/G/rw8Q==} + peerDependencies: + '@preact/preset-vite': '*' + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite-plugin-glimmerx: '*' + peerDependenciesMeta: + '@preact/preset-vite': + optional: true + typescript: + optional: true + vite-plugin-glimmerx: + optional: true + + '@storybook/channels@7.6.17': + resolution: {integrity: sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==} + + '@storybook/channels@7.6.20': + resolution: {integrity: sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==} + + '@storybook/cli@7.6.20': + resolution: {integrity: sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==} + hasBin: true + + '@storybook/client-api@7.6.17': + resolution: {integrity: sha512-rsxKBRLtUmBXbxG79Pf1GzUuMDMsFdhNR/a5k7kIA/mlEsvWD8are/aH/zk1oLr7+5QOqEkiXLL6+Erry7dzXA==} + + '@storybook/client-logger@7.6.17': + resolution: {integrity: sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==} + + '@storybook/client-logger@7.6.20': + resolution: {integrity: sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==} + + '@storybook/codemod@7.6.20': + resolution: {integrity: sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==} + + '@storybook/components@7.6.20': + resolution: {integrity: sha512-0d8u4m558R+W5V+rseF/+e9JnMciADLXTpsILrG+TBhwECk0MctIWW18bkqkujdCm8kDZr5U2iM/5kS1Noy7Ug==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/core-client@7.6.20': + resolution: {integrity: sha512-upQuQQinLmlOPKcT8yqXNtwIucZ4E4qegYZXH5HXRWoLAL6GQtW7sUVSIuFogdki8OXRncr/dz8OA+5yQyYS4w==} + + '@storybook/core-common@7.6.20': + resolution: {integrity: sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==} + + '@storybook/core-events@7.6.17': + resolution: {integrity: sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==} + + '@storybook/core-events@7.6.20': + resolution: {integrity: sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==} + + '@storybook/core-server@7.6.20': + resolution: {integrity: sha512-qC5BdbqqwMLTdCwMKZ1Hbc3+3AaxHYWLiJaXL9e8s8nJw89xV8c8l30QpbJOGvcDmsgY6UTtXYaJ96OsTr7MrA==} + + '@storybook/csf-plugin@7.6.20': + resolution: {integrity: sha512-dzBzq0dN+8WLDp6NxYS4G7BCe8+vDeDRBRjHmM0xb0uJ6xgQViL8SDplYVSGnk3bXE/1WmtvyRzQyTffBnaj9Q==} + + '@storybook/csf-tools@7.6.20': + resolution: {integrity: sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==} + + '@storybook/csf@0.1.8': + resolution: {integrity: sha512-Ntab9o7LjBCbFIao5l42itFiaSh/Qu+l16l/r/9qmV9LnYZkO+JQ7tzhdlwpgJfhs+B5xeejpdAtftDRyXNajw==} + + '@storybook/docs-mdx@0.1.0': + resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} + + '@storybook/docs-tools@7.6.20': + resolution: {integrity: sha512-Bw2CcCKQ5xGLQgtexQsI1EGT6y5epoFzOINi0FSTGJ9Wm738nRp5LH3dLk1GZLlywIXcYwOEThb2pM+pZeRQxQ==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/manager-api@7.6.20': + resolution: {integrity: sha512-gOB3m8hO3gBs9cBoN57T7jU0wNKDh+hi06gLcyd2awARQlAlywnLnr3s1WH5knih6Aq+OpvGBRVKkGLOkaouCQ==} + + '@storybook/manager@7.6.20': + resolution: {integrity: sha512-0Cf6WN0t7yEG2DR29tN5j+i7H/TH5EfPppg9h9/KiQSoFHk+6KLoy2p5do94acFU+Ro4+zzxvdCGbcYGKuArpg==} + + '@storybook/mdx2-csf@1.1.0': + resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} + + '@storybook/node-logger@7.6.20': + resolution: {integrity: sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==} + + '@storybook/postinstall@7.6.20': + resolution: {integrity: sha512-AN4WPeNma2xC2/K/wP3I/GMbBUyeSGD3+86ZFFJFO1QmE/Zea6E+1aVlTd1iKHQUcNkZ9bZTrqkhPGVYx10pIw==} + + '@storybook/preview-api@7.6.17': + resolution: {integrity: sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==} + + '@storybook/preview-api@7.6.20': + resolution: {integrity: sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==} + + '@storybook/preview@7.6.20': + resolution: {integrity: sha512-cxYlZ5uKbCYMHoFpgleZqqGWEnqHrk5m5fT8bYSsDsdQ+X5wPcwI/V+v8dxYAdQcMphZVIlTjo6Dno9WG8qmVA==} + + '@storybook/react-dom-shim@7.6.20': + resolution: {integrity: sha512-SRvPDr9VWcS24ByQOVmbfZ655y5LvjXRlsF1I6Pr9YZybLfYbu3L5IicfEHT4A8lMdghzgbPFVQaJez46DTrkg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/react-vite@7.6.20': + resolution: {integrity: sha512-uKuBFyGPZxpfR8vpDU/2OE9v7iTaxwL7ldd7k1swYd1rTSAPacTnEHSMl1R5AjUhkdI7gRmGN9q7qiVfK2XJCA==} + engines: {node: '>=16'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + + '@storybook/react@7.6.20': + resolution: {integrity: sha512-i5tKNgUbTNwlqBWGwPveDhh9ktlS0wGtd97A1ZgKZc3vckLizunlAFc7PRC1O/CMq5PTyxbuUb4RvRD2jWKwDA==} + engines: {node: '>=16.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@storybook/router@7.6.20': + resolution: {integrity: sha512-mCzsWe6GrH47Xb1++foL98Zdek7uM5GhaSlrI7blWVohGa0qIUYbfJngqR4ZsrXmJeeEvqowobh+jlxg3IJh+w==} + + '@storybook/telemetry@7.6.20': + resolution: {integrity: sha512-dmAOCWmOscYN6aMbhCMmszQjoycg7tUPRVy2kTaWg6qX10wtMrvEtBV29W4eMvqdsoRj5kcvoNbzRdYcWBUOHQ==} + + '@storybook/theming@7.6.20': + resolution: {integrity: sha512-iT1pXHkSkd35JsCte6Qbanmprx5flkqtSHC6Gi6Umqoxlg9IjiLPmpHbaIXzoC06DSW93hPj5Zbi1lPlTvRC7Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/types@7.6.17': + resolution: {integrity: sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==} + + '@storybook/types@7.6.20': + resolution: {integrity: sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==} + + '@swc/helpers@0.4.14': + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + + '@swc/helpers@0.5.11': + resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + + '@tanstack/query-core@5.45.0': + resolution: {integrity: sha512-RVfIZQmFUTdjhSAAblvueimfngYyfN6HlwaJUPK71PKd7yi43Vs1S/rdimmZedPWX/WGppcq/U1HOj7O7FwYxw==} + + '@tanstack/react-query@5.45.1': + resolution: {integrity: sha512-mYYfJujKg2kxmkRRjA6nn4YKG3ITsKuH22f1kteJ5IuVQqgKUgbaSQfYwVP0gBS05mhwxO03HVpD0t7BMN7WOA==} + peerDependencies: + react: ^18.0.0 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + + '@types/detect-port@1.3.5': + resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} + + '@types/doctrine@0.0.3': + resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} + + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + + '@types/ejs@3.1.5': + resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} + + '@types/emscripten@1.39.13': + resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} + + '@types/escodegen@0.0.6': + resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree@0.0.51': + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/find-cache-dir@3.2.1': + resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/js-cookie@2.2.7': + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash@4.17.5': + resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/mime-types@2.1.4': + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node@18.19.39': + resolution: {integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==} + + '@types/node@20.14.8': + resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/postcss-modules-local-by-default@4.0.2': + resolution: {integrity: sha512-CtYCcD+L+trB3reJPny+bKWKMzPfxEyQpKIwit7kErnOexf5/faaGpkFy4I5AwbV4hp1sk7/aTg0tt0B67VkLQ==} + + '@types/postcss-modules-scope@3.0.4': + resolution: {integrity: sha512-//ygSisVq9kVI0sqx3UPLzWIMCmtSVrzdljtuaAEJtGoGnpjBikZ2sXO5MpH9SnWX9HRfXxHifDAXcQjupWnIQ==} + + '@types/pretty-hrtime@1.0.3': + resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-helmet@6.1.11': + resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==} + + '@types/react-infinite-scroller@1.2.5': + resolution: {integrity: sha512-fJU1jhMgoL6NJFrqTM0Ob7tnd2sQWGxe2ESwiU6FZWbJK/VO/Er5+AOhc+e2zbT0dk5pLygqctsulOLJ8xnSzw==} + + '@types/react-mentions@4.1.13': + resolution: {integrity: sha512-kRulAAjlmhCtsJ9bapO0foocknaE/rEuFKpmFEU81fBfnXZmZNBaJ9J/DBjwigT3WDHjQVUmYoi5sxEXrcdzAw==} + + '@types/react-timeago@4.1.7': + resolution: {integrity: sha512-ogD4Ror/hDG+pQggCX+TgPgJ8W2jeeUxsgNU485Qpm0Ma+E2TND2EJuKwK5+sxlkDXDEgsHradO0zWBkTgLzNg==} + + '@types/react@17.0.80': + resolution: {integrity: sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==} + + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/styled-components@5.1.34': + resolution: {integrity: sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==} + + '@types/stylis@4.2.5': + resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react@3.1.0': + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xobotyi/scrollbar-width@1.9.5': + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': + resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} + engines: {node: '>=14.15.0'} + peerDependencies: + esbuild: '>=0.10.0' + + '@yarnpkg/fslib@2.10.3': + resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + + '@yarnpkg/libzip@2.3.0': + resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + after@0.8.2: + resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} + + agent-base@5.1.1: + resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + app-root-dir@1.0.2: + resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arraybuffer.slice@0.0.7: + resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.9.1: + resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} + engines: {node: '>=4'} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + backo2@1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + base64-arraybuffer@0.1.5: + resolution: {integrity: sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==} + engines: {node: '>= 0.6.0'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + batch-processor@1.0.0: + resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} + + better-assert@1.0.2: + resolution: {integrity: sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==} + + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blob@0.0.5: + resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-require@4.2.1: + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commist@1.1.0: + resolution: {integrity: sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-bind@1.0.0: + resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} + + component-emitter@1.2.1: + resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + component-inherit@0.0.3: + resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + computed-style@0.1.4: + resolution: {integrity: sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + + conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + + conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + + conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + + conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + + conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + + conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + + conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + + conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-functions-list@3.2.2: + resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} + engines: {node: '>=12 || >=16'} + + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-tokenize@1.0.1: + resolution: {integrity: sha512-gLmmbJdwH9HLY4bcA17lnZ8GgPwEXRbvxBJGHnkiB6gLhRpTzjkjtMIvz7YORGW/Ptv2oMk8b5g+u7mRD6Dd7A==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + detect-package-manager@2.0.1: + resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} + engines: {node: '>=12'} + + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + doiuse@6.0.2: + resolution: {integrity: sha512-eBTs23NOX+EAYPr4RbCR6J4DRW/TML3uMo37y0X1whlkersDYFCk9HmCl09KX98cis22VKsV1QaxfVNauJ3NBw==} + engines: {node: '>=16'} + hasBin: true + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.810: + resolution: {integrity: sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==} + + element-resize-detector@1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-client@3.3.3: + resolution: {integrity: sha512-PXIgpzb1brtBzh8Q6vCjzCMeu4nfEPmaDm+L3Qb2sVHwLkxC1qRiBMSjOB0NJNjZ0hbPNUKQa+s8J2XxLOIEeQ==} + + engine.io-parser@2.1.3: + resolution: {integrity: sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==} + + enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} + hasBin: true + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild-plugin-alias@0.2.1: + resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} + + esbuild-plugin-replace@1.4.0: + resolution: {integrity: sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==} + + esbuild-register@3.5.0: + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest@27.9.0: + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-colors@4.0.6: + resolution: {integrity: sha512-U+pYyQKXCSHOmtZPIEJBGLJjLDiqS+oOub2ILA3a7UGt9+IvZvwAN3hOPFjUgT+gX/apSBwP5vBgnKMlV0fy8Q==} + + extract-zip@1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + + fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fetch-retry@5.0.6: + resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@9.0.0: + resolution: {integrity: sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==} + engines: {node: '>=18'} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@9.0.11: + resolution: {integrity: sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flow-parser@0.238.0: + resolution: {integrity: sha512-VE7XSv1epljsIN2YeBnxCmGJihpNIAnLLu/pPOdA+Gkso7qDltJwUi6vfHjgxdBbjSdAuPGnhuOHJUQG+yYwIg==} + engines: {node: '>=0.4.0'} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@11.2.11: + resolution: {integrity: sha512-n+ozoEzgJu/2h9NoQMokF+CwNqIRVyuRC4RwMPwklfrrTjbVV32k9uBIgqYAwn7Jfpt5LuDVCtT57MWz1FbaLw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-npm-tarball-url@2.1.0: + resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} + engines: {node: '>=12.17'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-promise@4.2.2: + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-binary2@1.0.3: + resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} + + has-cors@1.1.0: + resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@3.0.0: + resolution: {integrity: sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==} + + hls.js@1.5.11: + resolution: {integrity: sha512-q3We1izi2+qkOO+TvZdHv+dx6aFzdtk3xc1/Qesrvto4thLTT/x/1FK85c5h1qZE4MmMBNgKg+MIW8nxQfxwBw==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@4.0.0: + resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} + engines: {node: '>= 6.0.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indexof@0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-prefixer@7.0.0: + resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + intl-messageformat@10.5.14: + resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.1: + resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} + + jake@10.9.1: + resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-sdsl@4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jscodeshift@0.15.2: + resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + peerDependenciesMeta: + '@babel/preset-env': + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + known-css-properties@0.31.0: + resolution: {integrity: sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==} + + lazy-universal-dotenv@4.0.0: + resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} + engines: {node: '>=14.0.0'} + + ldjson-stream@1.2.1: + resolution: {integrity: sha512-xw/nNEXafuPSLu8NjjG3+atVVw+8U1APZAQylmwQn19Hgw6rC7QjHvP6MupnHWCrzSm9m0xs5QWkCLuRvBPjgQ==} + + less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + + leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + line-height@0.3.1: + resolution: {integrity: sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==} + engines: {node: '>= 4.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-react@4.1.3: + resolution: {integrity: sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA==} + peerDependencies: + linkifyjs: ^4.0.0 + react: '>= 15.0.0' + + linkifyjs@4.1.3: + resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + + lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + + markdown-to-jsx@7.4.7: + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + + mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + millify@6.1.0: + resolution: {integrity: sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + modern-normalize@2.0.0: + resolution: {integrity: sha512-CxBoEVKh5U4DH3XuNbc5ONLF6dQBc8dSc7pdZ1957FGbIO5JBqGqqchhET9dTexri8/pk9xBL6+5ceOtCIp1QA==} + engines: {node: '>=6'} + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + mqtt-packet@6.10.0: + resolution: {integrity: sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==} + + mqtt@4.3.8: + resolution: {integrity: sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==} + engines: {node: '>=10.0.0'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nano-css@5.6.1: + resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + peerDependencies: + react: '*' + react-dom: '*' + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + number-allocator@1.0.14: + resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} + + nypm@0.3.8: + resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-component@0.0.3: + resolution: {integrity: sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parseqs@0.0.5: + resolution: {integrity: sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==} + + parseuri@0.0.5: + resolution: {integrity: sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-resolve-nested-selector@0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + + postcss-safe-parser@7.0.0: + resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.0: + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.4.0: + resolution: {integrity: sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + puppeteer-core@2.1.1: + resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} + engines: {node: '>=8.16.0'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-aria-components@1.2.1: + resolution: {integrity: sha512-iGIdDjbTyLLn0/tGUyBQxxu+E1bw4/H4AU89d0cRcu8yIdw6MXG29YElmRHn0ugiyrERrk/YQALihstnns5kRQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + react-aria@3.33.1: + resolution: {integrity: sha512-hFC3K/UA+90Krlx2IgRTgzFbC6FSPi4pUwHT+STperPLK+cTEHkI+3Lu0YYwQSBatkgxnIv9+GtFuVbps2kROw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + react-colorful@5.6.1: + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-docgen-typescript@2.2.2: + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@7.0.3: + resolution: {integrity: sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==} + engines: {node: '>=16.14.0'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-element-to-jsx-string@15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + + react-hook-form@7.52.0: + resolution: {integrity: sha512-mJX506Xc6mirzLsmXUJyqlAI3Kj9Ph2RhplYhUVffeOQSnubK2uVqBFOBJmvKikvbFV91pxVXmDiR+QMF19x6A==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-infinite-scroll-component@6.1.0: + resolution: {integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==} + peerDependencies: + react: '>=16.0.0' + + react-insta-stories@2.7.0: + resolution: {integrity: sha512-pCPHzC323b9Ttvr8ByLrX/iH/ft/L3ThWGDJPKdvHnaWdR5dhFkonrQ0/KNiEIH5t539dNyFPevLJUOobkD2WQ==} + peerDependencies: + react: '>=16.8.2' + + react-intl@6.6.8: + resolution: {integrity: sha512-M0pkhzcgV31h++2901BiRXWl69hp2zPyLxRrSwRjd1ErXbNoubz/f4M6DrRTd4OiSUrT4ajRQzrmtS5plG4FtA==} + peerDependencies: + react: ^16.6.0 || 17 || 18 + typescript: ^4.7 || 5 + peerDependenciesMeta: + typescript: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + + react-loading-skeleton@3.4.0: + resolution: {integrity: sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==} + peerDependencies: + react: '>=16.8.0' + + react-mentions@4.4.10: + resolution: {integrity: sha512-JHiQlgF1oSZR7VYPjq32wy97z1w1oE4x10EuhKjPr4WUKhVzG1uFQhQjKqjQkbVqJrmahf+ldgBTv36NrkpKpA==} + peerDependencies: + react: '>=16.8.3' + react-dom: '>=16.8.3' + + react-modal-sheet@2.2.1: + resolution: {integrity: sha512-bVdxbKVhTbsgn+5g3/X9RjhFhKkPGLMCfLR2O22FHk62G28kFIFn4yKqhXBbXR8qPcjBcaUxadrn7cR+LVI8Vw==} + engines: {node: '>=16'} + peerDependencies: + framer-motion: '>=6' + react: '>=16' + + react-native-uuid@2.0.2: + resolution: {integrity: sha512-5ypj/hV58P+6VREdjkW0EudSibsH3WdqDERoHKnD9syFWjF+NfRWWrJb2sa3LIwI5zpzMvUiabs+DX40WHpEMw==} + engines: {node: '>=10.0.0', npm: '>=6.0.0'} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.5: + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-dom@6.23.1: + resolution: {integrity: sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.23.1: + resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-sizeme@3.0.2: + resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} + + react-stately@3.31.1: + resolution: {integrity: sha512-wuq673NHkYSdoceGryjtMJJvB9iQgyDkQDsnTN0t2v91pXjGDsN/EcOvnUrxXSBtY9eLdIw74R54z9GX5cJNEg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-textarea-autosize@8.5.3: + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-timeago@7.2.0: + resolution: {integrity: sha512-2KsBEEs+qRhKx/kekUVNSTIpop3Jwd7SRBm0R4Eiq3mPeswRGSsftY9FpKsE/lXLdURyQFiHeHFrIUxLYskG5g==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-tiny-popover@7.2.4: + resolution: {integrity: sha512-T7ZSwXcUtPXCog3Bux9+TjoTvUeMi/+zI0Yv/TkIznZCWUg0XTt2797G0IiT5mTVeJeLivUzdOmKA1hOQdMfOQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-truncate-markup@5.1.2: + resolution: {integrity: sha512-eEq6T8Rs+wz98cRYzQECGFNBfXwRYraLg/kz52f6DRBKmzxqB+GYLeDkVe/zrC+2vh5AEwM6nSYFvDWEBljd0w==} + peerDependencies: + react: '>=16.3' + + react-universal-interface@0.6.2: + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + + react-use@17.5.0: + resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==} + peerDependencies: + react: '*' + react-dom: '*' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + reinterval@1.1.0: + resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} + + remark-external-links@8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + + remark-slug@6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + reserved-words@0.1.2: + resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.77.6: + resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + socket.io-client@2.2.0: + resolution: {integrity: sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==} + + socket.io-parser@3.3.3: + resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + + split2@0.2.1: + resolution: {integrity: sha512-D/oTExYAkC9nWleOCTOyNmAuzfAT/6rHGBA9LIK7FVnGo13CSvrKCUzKenwH6U1s2znY9MqH6v0UQTEDa3vJmg==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + + stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + + standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + store2@2.14.3: + resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} + + storybook@7.6.20: + resolution: {integrity: sha512-Wt04pPTO71pwmRmsgkyZhNo4Bvdb/1pBAMsIFb9nQLykEdzzpXjvingxFFvdOG4nIowzwgxD+CLlyRqVJqnATw==} + hasBin: true + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-components@6.1.11: + resolution: {integrity: sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + stylelint-config-recommended@14.0.1: + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-config-standard@36.0.1: + resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-no-unsupported-browser-features@8.0.1: + resolution: {integrity: sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + + stylelint@16.6.1: + resolution: {integrity: sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q==} + engines: {node: '>=18.12.0'} + hasBin: true + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + stylus@0.62.0: + resolution: {integrity: sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==} + hasBin: true + + substyle@9.4.1: + resolution: {integrity: sha512-VOngeq/W1/UkxiGzeqVvDbGDPM8XgUyJVWjrqeh+GgKqspEPiLYndK+XRcsKUHM5Muz/++1ctJ1QCF/OqRiKWA==} + peerDependencies: + react: '>=16.8.3' + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + svg-url-loader@7.1.1: + resolution: {integrity: sha512-NlsMCePODm7FQhU9aEZyGLPx5Xe1QRI1cSEUE6vTq5LJc9l9pStagvXoEIyZ9O3r00w6G3+Wbkimb+SC3DI/Aw==} + engines: {node: '>=10'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + synchronous-promise@2.0.17: + resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + tempy@1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + throttle-debounce@2.3.0: + resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} + engines: {node: '>=8'} + + throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-array@0.1.4: + resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tocbot@4.28.2: + resolution: {integrity: sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-jest@29.1.5: + resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + tsconfck@3.1.0: + resolution: {integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsup@7.3.0: + resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==} + engines: {node: '>=18'} + deprecated: Breaking node 16 + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript-plugin-css-modules@5.1.0: + resolution: {integrity: sha512-6h+sLBa4l+XYSTn/31vZHd/1c3SvAbLpobY6FxDiUOHJQG1eD9Gh3eCs12+Eqc+TCOAdxcO+zAPvUq0jBfdciw==} + peerDependencies: + typescript: '>=4.0.0' + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + uglify-js@3.18.0: + resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin@1.10.1: + resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + engines: {node: '>=14.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-composed-ref@1.3.0: + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.2.1: + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-resize-observer@9.1.0: + resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} + peerDependencies: + react: 16.8.0 - 18 + react-dom: 16.8.0 - 18 + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vaul@0.9.1: + resolution: {integrity: sha512-fAhd7i4RNMinx+WEm6pF3nOl78DFkAazcN04ElLPFF9BMCNGbY/kou8UMhIcicm0rJCNePJP0Yyza60gGOD0Jw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + webpack@5.92.1: + resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@6.1.4: + resolution: {integrity: sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@1.6.3: + resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yeast@0.1.2: + resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@adobe/css-tools@4.3.3': {} + + '@amityco/ts-sdk@6.27.0': + dependencies: + agentkeepalive: 4.5.0 + axios: 1.7.2(debug@4.3.5) + debug: 4.3.5 + hls.js: 1.5.11 + js-base64: 3.7.7 + mitt: 3.0.1 + mqtt: 4.3.8 + object-hash: 3.0.0 + react-native-uuid: 2.0.2 + socket.io-client: 2.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@aw-web-design/x-default-browser@1.4.126': + dependencies: + default-browser-id: 3.0.0 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.7': {} + + '@babel/core@7.24.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.7': + dependencies: + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.24.7': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + debug: 4.3.5 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-member-expression-to-functions@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-wrap-function': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-optimise-call-expression': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helper-wrap-function@7.24.7': + dependencies: + '@babel/helper-function-name': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + '@babel/helper-split-export-declaration': 7.24.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/template': 7.24.7 + + '@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-flow-strip-types@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.7) + + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) + + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + + '@babel/plugin-transform-optional-chaining@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-typeof-symbol@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + + '@babel/preset-env@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-destructuring': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typeof-symbol': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7) + core-js-compat: 3.37.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-transform-flow-strip-types': 7.24.7(@babel/core@7.24.7) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/types': 7.24.7 + esutils: 2.0.3 + + '@babel/preset-typescript@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.24.6(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.24.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.4.5': + dependencies: + regenerator-runtime: 0.13.11 + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/traverse@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@base2/pretty-print-object@1.0.1': {} + + '@bcoe/v8-coverage@0.2.3': {} + + '@colors/colors@1.5.0': + optional: true + + '@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1)': + dependencies: + '@csstools/css-tokenizer': 2.3.1 + + '@csstools/css-tokenizer@2.3.1': {} + + '@csstools/media-query-list-parser@2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) + '@csstools/css-tokenizer': 2.3.1 + + '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.0)': + dependencies: + postcss-selector-parser: 6.1.0 + + '@discoveryjs/json-ext@0.5.7': {} + + '@dual-bundle/import-meta-resolve@4.1.0': {} + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fal-works/esbuild-plugin-global-externals@2.1.2': {} + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.6.5': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + + '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.2': {} + + '@formatjs/ecma402-abstract@2.0.0': + dependencies: + '@formatjs/intl-localematcher': 0.5.4 + tslib: 2.6.3 + + '@formatjs/fast-memoize@2.2.0': + dependencies: + tslib: 2.6.3 + + '@formatjs/icu-messageformat-parser@2.7.8': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/icu-skeleton-parser': 1.8.2 + tslib: 2.6.3 + + '@formatjs/icu-skeleton-parser@1.8.2': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + tslib: 2.6.3 + + '@formatjs/intl-displaynames@6.6.8': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/intl-localematcher': 0.5.4 + tslib: 2.6.3 + + '@formatjs/intl-listformat@7.5.7': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/intl-localematcher': 0.5.4 + tslib: 2.6.3 + + '@formatjs/intl-localematcher@0.5.4': + dependencies: + tslib: 2.6.3 + + '@formatjs/intl@2.10.4(typescript@4.9.5)': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/fast-memoize': 2.2.0 + '@formatjs/icu-messageformat-parser': 2.7.8 + '@formatjs/intl-displaynames': 6.6.8 + '@formatjs/intl-listformat': 7.5.7 + intl-messageformat: 10.5.14 + tslib: 2.6.3 + optionalDependencies: + typescript: 4.9.5 + + '@fortawesome/fontawesome-common-types@0.2.36': {} + + '@fortawesome/fontawesome-common-types@0.3.0': {} + + '@fortawesome/fontawesome-svg-core@1.3.0': + dependencies: + '@fortawesome/fontawesome-common-types': 0.3.0 + + '@fortawesome/free-solid-svg-icons@5.15.4': + dependencies: + '@fortawesome/fontawesome-common-types': 0.2.36 + + '@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@1.3.0)(react@18.3.1)': + dependencies: + '@fortawesome/fontawesome-svg-core': 1.3.0 + prop-types: 15.8.1 + react: 18.3.1 + + '@hookform/error-message@2.0.1(react-dom@18.3.1(react@18.3.1))(react-hook-form@7.52.0(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-hook-form: 7.52.0(react@18.3.1) + + '@hookform/resolvers@3.6.0(react-hook-form@7.52.0(react@18.3.1))': + dependencies: + react-hook-form: 7.52.0(react@18.3.1) + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@hutson/parse-repository-url@3.0.2': {} + + '@internationalized/date@3.5.4': + dependencies: + '@swc/helpers': 0.5.11 + + '@internationalized/message@3.1.4': + dependencies: + '@swc/helpers': 0.5.11 + intl-messageformat: 10.5.14 + + '@internationalized/number@3.5.3': + dependencies: + '@swc/helpers': 0.5.11 + + '@internationalized/string@3.2.3': + dependencies: + '@swc/helpers': 0.5.11 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.8 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.8 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.8) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.8 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.14.8 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.14.8 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.24.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.14.8 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1))': + dependencies: + glob: 7.2.3 + glob-promise: 4.2.2(glob@7.2.3) + magic-string: 0.27.0 + react-docgen-typescript: 2.2.2(typescript@4.9.5) + vite: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) + optionalDependencies: + typescript: 4.9.5 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@juggle/resize-observer@3.4.0': {} + + '@mdx-js/react@2.3.0(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 17.0.80 + react: 18.3.1 + + '@ndelangen/get-tarball@3.0.9': + dependencies: + gunzip-maybe: 1.4.2 + pump: 3.0.0 + tar-fs: 2.1.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/number@1.0.1': + dependencies: + '@babel/runtime': 7.24.7 + + '@radix-ui/primitive@1.0.1': + dependencies: + '@babel/runtime': 7.24.7 + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-collection@1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-collection@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-compose-refs@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-context@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-context@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-dialog@1.1.1(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@17.0.80)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@17.0.80)(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-direction@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-direction@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-dismissable-layer@1.0.4(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-focus-guards@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-focus-scope@1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-focus-scope@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-id@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-id@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-popper@1.1.2(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/rect': 1.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-portal@1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-portal@1.1.1(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-presence@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-primitive@1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-slot': 1.0.2(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-primitive@2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-roving-focus@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-select@1.2.2(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-popper': 1.1.2(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@17.0.80)(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-separator@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-slot@1.0.2(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-slot@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-tabs@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-toggle-group@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-toggle@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-toolbar@1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@17.0.80)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@17.0.80)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-previous@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-rect@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/rect': 1.0.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-use-size@1.0.1(@types/react@17.0.80)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/react-visually-hidden@1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.7 + '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 17.0.80 + + '@radix-ui/rect@1.0.1': + dependencies: + '@babel/runtime': 7.24.7 + + '@react-aria/breadcrumbs@3.5.13(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/link': 3.7.1(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/breadcrumbs': 3.7.5(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/button@3.9.5(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/toggle': 3.7.4(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/calendar@3.5.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@internationalized/date': 3.5.4 + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/live-announcer': 3.3.4 + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/calendar': 3.5.1(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/calendar': 3.4.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/checkbox@3.14.3(react@18.3.1)': + dependencies: + '@react-aria/form': 3.0.5(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/toggle': 3.10.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/checkbox': 3.6.5(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/toggle': 3.7.4(react@18.3.1) + '@react-types/checkbox': 3.8.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/color@3.0.0-beta.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/numberfield': 3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/slider': 3.7.8(react@18.3.1) + '@react-aria/spinbutton': 3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.5(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-aria/visually-hidden': 3.8.12(react@18.3.1) + '@react-stately/color': 3.6.1(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-types/color': 3.0.0-beta.25(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/combobox@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/listbox': 3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/live-announcer': 3.3.4 + '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.5(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/combobox': 3.8.4(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/combobox': 3.11.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/datepicker@3.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@internationalized/date': 3.5.4 + '@internationalized/number': 3.5.3 + '@internationalized/string': 3.2.3 + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/form': 3.0.5(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/spinbutton': 3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/datepicker': 3.9.4(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/calendar': 3.4.6(react@18.3.1) + '@react-types/datepicker': 3.7.4(react@18.3.1) + '@react-types/dialog': 3.5.10(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/dialog@3.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/dialog': 3.5.10(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/dnd@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@internationalized/string': 3.2.3 + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/live-announcer': 3.3.4 + '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/dnd': 3.3.1(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/focus@3.17.1(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + clsx: 2.1.1 + react: 18.3.1 + + '@react-aria/form@3.0.5(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/grid@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/live-announcer': 3.3.4 + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/grid': 3.8.7(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-stately/virtualizer': 3.7.1(react@18.3.1) + '@react-types/checkbox': 3.8.1(react@18.3.1) + '@react-types/grid': 3.2.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/gridlist@3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/grid': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-stately/tree': 3.8.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/i18n@3.11.1(react@18.3.1)': + dependencies: + '@internationalized/date': 3.5.4 + '@internationalized/message': 3.1.4 + '@internationalized/number': 3.5.3 + '@internationalized/string': 3.2.3 + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/interactions@3.21.3(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/label@3.7.8(react@18.3.1)': + dependencies: + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/link@3.7.1(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/link': 3.5.5(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/listbox@3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-types/listbox': 3.4.9(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/live-announcer@3.3.4': + dependencies: + '@swc/helpers': 0.5.11 + + '@react-aria/menu@3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/menu': 3.7.1(react@18.3.1) + '@react-stately/tree': 3.8.1(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/menu': 3.9.9(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/meter@3.4.13(react@18.3.1)': + dependencies: + '@react-aria/progress': 3.4.13(react@18.3.1) + '@react-types/meter': 3.4.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/numberfield@3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/spinbutton': 3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.5(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/numberfield': 3.9.3(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/numberfield': 3.8.3(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/overlays@3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-aria/visually-hidden': 3.8.12(react@18.3.1) + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/overlays': 3.8.7(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/progress@3.4.13(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/progress': 3.5.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/radio@3.10.4(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/form': 3.0.5(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/radio': 3.10.4(react@18.3.1) + '@react-types/radio': 3.8.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/searchfield@3.7.5(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/textfield': 3.14.5(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/searchfield': 3.5.3(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/searchfield': 3.5.5(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/select@3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/form': 3.0.5(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/listbox': 3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-aria/visually-hidden': 3.8.12(react@18.3.1) + '@react-stately/select': 3.6.4(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/select': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/selection@3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/separator@3.3.13(react@18.3.1)': + dependencies: + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/slider@3.7.8(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/slider': 3.5.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/slider': 3.7.3(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/spinbutton@3.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/live-announcer': 3.3.4 + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/ssr@3.9.4(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/switch@3.6.4(react@18.3.1)': + dependencies: + '@react-aria/toggle': 3.10.4(react@18.3.1) + '@react-stately/toggle': 3.7.4(react@18.3.1) + '@react-types/switch': 3.5.3(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/table@3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/grid': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/live-announcer': 3.3.4 + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-aria/visually-hidden': 3.8.12(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/flags': 3.0.3 + '@react-stately/table': 3.11.8(react@18.3.1) + '@react-stately/virtualizer': 3.7.1(react@18.3.1) + '@react-types/checkbox': 3.8.1(react@18.3.1) + '@react-types/grid': 3.2.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/table': 3.9.5(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/tabs@3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/tabs': 3.6.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/tabs': 3.3.7(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/tag@3.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/gridlist': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/textfield@3.14.5(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/form': 3.0.5(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/textfield': 3.9.3(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/toggle@3.10.4(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/toggle': 3.7.4(react@18.3.1) + '@react-types/checkbox': 3.8.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/toolbar@3.0.0-beta.5(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/tooltip@3.7.4(react@18.3.1)': + dependencies: + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/tooltip': 3.4.9(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/tooltip': 3.4.9(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-aria/tree@3.0.0-alpha.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/gridlist': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/tree': 3.8.1(react@18.3.1) + '@react-types/button': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/utils@3.17.0(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.4.14 + clsx: 1.2.1 + react: 18.3.1 + + '@react-aria/utils@3.24.1(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + clsx: 2.1.1 + react: 18.3.1 + + '@react-aria/visually-hidden@3.8.12(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/calendar@3.5.1(react@18.3.1)': + dependencies: + '@internationalized/date': 3.5.4 + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/calendar': 3.4.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/checkbox@3.6.5(react@18.3.1)': + dependencies: + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/checkbox': 3.8.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/collections@3.10.7(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/color@3.6.1(react@18.3.1)': + dependencies: + '@internationalized/number': 3.5.3 + '@internationalized/string': 3.2.3 + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/numberfield': 3.9.3(react@18.3.1) + '@react-stately/slider': 3.5.4(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/color': 3.0.0-beta.25(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/combobox@3.8.4(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-stately/select': 3.6.4(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/combobox': 3.11.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/data@3.11.4(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/datepicker@3.9.4(react@18.3.1)': + dependencies: + '@internationalized/date': 3.5.4 + '@internationalized/string': 3.2.3 + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/datepicker': 3.7.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/dnd@3.3.1(react@18.3.1)': + dependencies: + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/flags@3.0.3': + dependencies: + '@swc/helpers': 0.5.11 + + '@react-stately/form@3.0.3(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/grid@3.8.7(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-types/grid': 3.2.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/list@3.10.5(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/menu@3.7.1(react@18.3.1)': + dependencies: + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-types/menu': 3.9.9(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/numberfield@3.9.3(react@18.3.1)': + dependencies: + '@internationalized/number': 3.5.3 + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/numberfield': 3.8.3(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/overlays@3.6.7(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/overlays': 3.8.7(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/radio@3.10.4(react@18.3.1)': + dependencies: + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/radio': 3.8.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/searchfield@3.5.3(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/searchfield': 3.5.5(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/select@3.6.4(react@18.3.1)': + dependencies: + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-types/select': 3.9.4(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/selection@3.15.1(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/slider@3.5.4(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/slider': 3.7.3(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/table@3.11.8(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/flags': 3.0.3 + '@react-stately/grid': 3.8.7(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/grid': 3.2.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/table': 3.9.5(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/tabs@3.6.6(react@18.3.1)': + dependencies: + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/tabs': 3.3.7(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/toggle@3.7.4(react@18.3.1)': + dependencies: + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/checkbox': 3.8.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/tooltip@3.4.9(react@18.3.1)': + dependencies: + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-types/tooltip': 3.4.9(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/tree@3.8.1(react@18.3.1)': + dependencies: + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/utils@3.10.1(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-stately/virtualizer@3.7.1(react@18.3.1)': + dependencies: + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@swc/helpers': 0.5.11 + react: 18.3.1 + + '@react-types/breadcrumbs@3.7.5(react@18.3.1)': + dependencies: + '@react-types/link': 3.5.5(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + '@react-types/button@3.9.4(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + '@react-types/calendar@3.4.6(react@18.3.1)': + dependencies: + '@internationalized/date': 3.5.4 + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + '@react-types/checkbox@3.8.1(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + '@react-types/color@3.0.0-beta.25(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/slider': 3.7.3(react@18.3.1) + react: 18.3.1 + + '@react-types/combobox@3.11.1(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + '@react-types/datepicker@3.7.4(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-popper': 1.1.2(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 17.0.80 - aria-hidden: 1.2.4 + '@internationalized/date': 3.5.4 + '@react-types/calendar': 3.4.6(react@18.3.1) + '@react-types/overlays': 3.8.7(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@17.0.80)(react@18.3.1) - dev: true - /@radix-ui/react-separator@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} - 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 + '@react-types/dialog@3.5.10(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/overlays': 3.8.7(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-slot@1.0.2(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/form@3.7.4(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-toggle-group@1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} - 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 + '@react-types/grid@3.2.6(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-toggle': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-toggle@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} - 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 + '@react-types/link@3.5.5(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-toolbar@1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} - 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 + '@react-types/listbox@3.4.9(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-separator': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-toggle-group': 1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/menu@3.9.9(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 + '@react-types/overlays': 3.8.7(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/meter@3.4.1(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/progress': 3.5.4(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/numberfield@3.8.3(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/overlays@3.8.7(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-use-previous@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/progress@3.5.4(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-use-rect@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/radio@3.8.1(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/rect': 1.0.1 - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-use-size@1.0.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@react-types/searchfield@3.5.5(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@17.0.80)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/textfield': 3.9.3(react@18.3.1) react: 18.3.1 - dev: true - /@radix-ui/react-visually-hidden@1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - 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 + '@react-types/select@3.9.4(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 17.0.80 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@radix-ui/rect@1.0.1: - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + '@react-types/shared@3.23.1(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.4 - dev: true + react: 18.3.1 - /@react-aria/ssr@3.9.2(react@18.3.1): - resolution: {integrity: sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-types/slider@3.7.3(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.11 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-aria/utils@3.17.0(react@18.3.1): - resolution: {integrity: sha512-NEul0cQ6tQPdNSHYzNYD+EfFabeYNvDwEiHB82kK/Tsfhfm84SM+baben/at2N51K7iRrJPr5hC5fi4+P88lNg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-types/switch@3.5.3(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.2(react@18.3.1) - '@react-stately/utils': 3.9.1(react@18.3.1) - '@react-types/shared': 3.22.1(react@18.3.1) - '@swc/helpers': 0.4.36 - clsx: 1.2.1 + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-stately/utils@3.9.1(react@18.3.1): - resolution: {integrity: sha512-yzw75GE0iUWiyps02BOAPTrybcsMIxEJlzXqtvllAb01O9uX5n0i3X+u2eCpj2UoDF4zS08Ps0jPgWxg8xEYtA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-types/table@3.9.5(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.11 + '@react-types/grid': 3.2.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/shared@3.22.1(react@18.3.1): - resolution: {integrity: sha512-PCpa+Vo6BKnRMuOEzy5zAZ3/H5tnQg1e80khMhK2xys0j6ZqzkgQC+fHMNZ7VDFNLqqNMj/o0eVeSBDh2POjkw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-types/tabs@3.3.7(react@18.3.1)': dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) react: 18.3.1 - dev: false - /@remix-run/router@1.16.0: - resolution: {integrity: sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==} - engines: {node: '>=14.0.0'} - dev: true + '@react-types/textfield@3.9.3(react@18.3.1)': + dependencies: + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 - /@rollup/pluginutils@5.1.0: - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@react-types/tooltip@3.4.9(react@18.3.1)': + dependencies: + '@react-types/overlays': 3.8.7(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + '@remix-run/router@1.16.1': {} + + '@rollup/pluginutils@5.1.0(rollup@4.18.0)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - dev: true + optionalDependencies: + rollup: 4.18.0 - /@rollup/rollup-android-arm-eabi@4.17.1: - resolution: {integrity: sha512-P6Wg856Ou/DLpR+O0ZLneNmrv7QpqBg+hK4wE05ijbC/t349BRfMfx+UFj5Ha3fCFopIa6iSZlpdaB4agkWp2Q==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true - /@rollup/rollup-android-arm64@4.17.1: - resolution: {integrity: sha512-piwZDjuW2WiHr05djVdUkrG5JbjnGbtx8BXQchYCMfib/nhjzWoiScelZ+s5IJI7lecrwSxHCzW026MWBL+oJQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.18.0': optional: true - /@rollup/rollup-darwin-arm64@4.17.1: - resolution: {integrity: sha512-LsZXXIsN5Q460cKDT4Y+bzoPDhBmO5DTr7wP80d+2EnYlxSgkwdPfE3hbE+Fk8dtya+8092N9srjBTJ0di8RIA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.18.0': optional: true - /@rollup/rollup-darwin-x64@4.17.1: - resolution: {integrity: sha512-S7TYNQpWXB9APkxu/SLmYHezWwCoZRA9QLgrDeml+SR2A1LLPD2DBUdUlvmCF7FUpRMKvbeeWky+iizQj65Etw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.18.0': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.17.1: - resolution: {integrity: sha512-Lq2JR5a5jsA5um2ZoLiXXEaOagnVyCpCW7xvlcqHC7y46tLwTEgUSTM3a2TfmmTMmdqv+jknUioWXlmxYxE9Yw==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true - /@rollup/rollup-linux-arm-musleabihf@4.17.1: - resolution: {integrity: sha512-9BfzwyPNV0IizQoR+5HTNBGkh1KXE8BqU0DBkqMngmyFW7BfuIZyMjQ0s6igJEiPSBvT3ZcnIFohZ19OqjhDPg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true - /@rollup/rollup-linux-arm64-gnu@4.17.1: - resolution: {integrity: sha512-e2uWaoxo/rtzA52OifrTSXTvJhAXb0XeRkz4CdHBK2KtxrFmuU/uNd544Ogkpu938BzEfvmWs8NZ8Axhw33FDw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true - /@rollup/rollup-linux-arm64-musl@4.17.1: - resolution: {integrity: sha512-ekggix/Bc/d/60H1Mi4YeYb/7dbal1kEDZ6sIFVAE8pUSx7PiWeEh+NWbL7bGu0X68BBIkgF3ibRJe1oFTksQQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.17.1: - resolution: {integrity: sha512-UGV0dUo/xCv4pkr/C8KY7XLFwBNnvladt8q+VmdKrw/3RUd3rD0TptwjisvE2TTnnlENtuY4/PZuoOYRiGp8Gw==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.17.1: - resolution: {integrity: sha512-gEYmYYHaehdvX46mwXrU49vD6Euf1Bxhq9pPb82cbUU9UT2NV+RSckQ5tKWOnNXZixKsy8/cPGtiUWqzPuAcXQ==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true - /@rollup/rollup-linux-s390x-gnu@4.17.1: - resolution: {integrity: sha512-xeae5pMAxHFp6yX5vajInG2toST5lsCTrckSRUFwNgzYqnUjNBcQyqk1bXUxX5yhjWFl2Mnz3F8vQjl+2FRIcw==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true - /@rollup/rollup-linux-x64-gnu@4.17.1: - resolution: {integrity: sha512-AsdnINQoDWfKpBzCPqQWxSPdAWzSgnYbrJYtn6W0H2E9It5bZss99PiLA8CgmDRfvKygt20UpZ3xkhFlIfX9zQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true - /@rollup/rollup-linux-x64-musl@4.17.1: - resolution: {integrity: sha512-KoB4fyKXTR+wYENkIG3fFF+5G6N4GFvzYx8Jax8BR4vmddtuqSb5oQmYu2Uu067vT/Fod7gxeQYKupm8gAcMSQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true - /@rollup/rollup-win32-arm64-msvc@4.17.1: - resolution: {integrity: sha512-J0d3NVNf7wBL9t4blCNat+d0PYqAx8wOoY+/9Q5cujnafbX7BmtYk3XvzkqLmFECaWvXGLuHmKj/wrILUinmQg==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true - /@rollup/rollup-win32-ia32-msvc@4.17.1: - resolution: {integrity: sha512-xjgkWUwlq7IbgJSIxvl516FJ2iuC/7ttjsAxSPpC9kkI5iQQFHKyEN5BjbhvJ/IXIZ3yIBcW5QDlWAyrA+TFag==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true - /@rollup/rollup-win32-x64-msvc@4.17.1: - resolution: {integrity: sha512-0QbCkfk6cnnVKWqqlC0cUrrUMDMfu5ffvYMTUHf+qMN2uAb3MKP31LPcwiMXBNsvoFGs/kYdFOsuLmvppCopXA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - dev: true - /@storybook/addon-a11y@7.6.18: - resolution: {integrity: sha512-eTnj/eAh6Lzh5gZ5y/wn5qoGrei9tpKz/HliS4AxEKUlAG80LVXyDooYA+EXN1vo/9EH3TiiS01roRJOGdzTUA==} + '@storybook/addon-a11y@7.6.20': dependencies: - '@storybook/addon-highlight': 7.6.18 - axe-core: 4.9.0 - dev: true + '@storybook/addon-highlight': 7.6.20 + axe-core: 4.9.1 - /@storybook/addon-actions@7.6.18: - resolution: {integrity: sha512-HWS2NqUNH7FGG5QyWMvV3aw2IcwXw6xQwCx2xLUD7fJFqCAf4cDXZIsGnTVHCtoddVRBIlcS+LRmiGU8+mQKdw==} + '@storybook/addon-actions@7.6.20': dependencies: - '@storybook/core-events': 7.6.18 + '@storybook/core-events': 7.6.20 '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 uuid: 9.0.1 - dev: true - /@storybook/addon-backgrounds@7.6.18: - resolution: {integrity: sha512-Bai0n3RfO+PmsQ69KdRhPvuwCistNLvpKtAEzo9nlpHfYh921OgVfZrKFfWJgYskvyVlaNu0DeR3t6TT8CbT/A==} + '@storybook/addon-backgrounds@7.6.20': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 ts-dedent: 2.2.0 - dev: true - /@storybook/addon-controls@7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-iH/JbltgjDFihRppeniNlGE3Qc86Q5oW8+p77E9B0ILn3yGk3rNOSlOTUg7a1seMjddJfsptDn4xMFHuunYuyQ==} + '@storybook/addon-controls@7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@storybook/blocks': 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) + '@storybook/blocks': 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lodash: 4.17.21 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -3406,29 +10541,24 @@ packages: - react - react-dom - supports-color - dev: true - /@storybook/addon-docs@7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-+JzGL5ImwZ5VE+PiEUzRHWKbgvFsg/G2OTzyqZD8vQ+NlB6rmKGzGpXz0c4D6xEupzIJwjbpSN2ZOzgld0Du9Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/addon-docs@7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@jest/transform': 29.7.0 '@mdx-js/react': 2.3.0(react@18.3.1) - '@storybook/blocks': 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/client-logger': 7.6.18 - '@storybook/components': 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/csf-plugin': 7.6.18 - '@storybook/csf-tools': 7.6.18 + '@storybook/blocks': 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/client-logger': 7.6.20 + '@storybook/components': 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/csf-plugin': 7.6.20 + '@storybook/csf-tools': 7.6.20 '@storybook/global': 5.0.0 '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.6.18 - '@storybook/postinstall': 7.6.18 - '@storybook/preview-api': 7.6.18 - '@storybook/react-dom-shim': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/theming': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 7.6.18 + '@storybook/node-logger': 7.6.20 + '@storybook/postinstall': 7.6.20 + '@storybook/preview-api': 7.6.20 + '@storybook/react-dom-shim': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.20 fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -3440,27 +10570,22 @@ packages: - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/addon-essentials@7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-qgVH442LhIdzCbx0E+eB1+xTj1TOKqSqrUy76viILCK1wfMSeIsU8TNkqnc8hzUQH2IatUJb/t76wXh2eV9s4w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@storybook/addon-actions': 7.6.18 - '@storybook/addon-backgrounds': 7.6.18 - '@storybook/addon-controls': 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/addon-docs': 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/addon-highlight': 7.6.18 - '@storybook/addon-measure': 7.6.18 - '@storybook/addon-outline': 7.6.18 - '@storybook/addon-toolbars': 7.6.18 - '@storybook/addon-viewport': 7.6.18 - '@storybook/core-common': 7.6.18 - '@storybook/manager-api': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/node-logger': 7.6.18 - '@storybook/preview-api': 7.6.18 + '@storybook/addon-essentials@7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@storybook/addon-actions': 7.6.20 + '@storybook/addon-backgrounds': 7.6.20 + '@storybook/addon-controls': 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/addon-docs': 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/addon-highlight': 7.6.20 + '@storybook/addon-measure': 7.6.20 + '@storybook/addon-outline': 7.6.20 + '@storybook/addon-toolbars': 7.6.20 + '@storybook/addon-viewport': 7.6.20 + '@storybook/core-common': 7.6.20 + '@storybook/manager-api': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/node-logger': 7.6.20 + '@storybook/preview-api': 7.6.20 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ts-dedent: 2.2.0 @@ -3469,56 +10594,41 @@ packages: - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/addon-highlight@7.6.18: - resolution: {integrity: sha512-XUR9sTcxqYbes9ckj1b/GyAJ3yFfE/2YnvPFz8vWO9hIZjlL0Wvyiy/1L2DePF1S+zHrYA8+dg65vK8pMXUrnQ==} + '@storybook/addon-highlight@7.6.20': dependencies: '@storybook/global': 5.0.0 - dev: true - /@storybook/addon-measure@7.6.18: - resolution: {integrity: sha512-ixEW/RG3iJCiyJQ51vKqlTJHq6vJ7O/xHGGMFV9+RYP0S2klZctQQwLZxUWUjSLUUjCX/DrxVlmK03h+7f+wWA==} + '@storybook/addon-measure@7.6.20': dependencies: '@storybook/global': 5.0.0 tiny-invariant: 1.3.3 - dev: true - /@storybook/addon-outline@7.6.18: - resolution: {integrity: sha512-YKHjir/+KZH0P/F8spmm9l/EC28VXlE0beAxeErvpPiA6t1Ykrh7GEPvPEolY1DydKBaLLnd20adLhDskl+oGg==} + '@storybook/addon-outline@7.6.20': dependencies: '@storybook/global': 5.0.0 ts-dedent: 2.2.0 - dev: true - /@storybook/addon-toolbars@7.6.18: - resolution: {integrity: sha512-AlqW8rA5gNtxjbTyJtJlVfmqbcSJAWFHTvC7OfwbZRZLmF5agdBUQeAZYI75WBZpdlYrp23s88O+MRMa/CF2yA==} - dev: true + '@storybook/addon-toolbars@7.6.20': {} - /@storybook/addon-viewport@7.6.18: - resolution: {integrity: sha512-fgn38aXappEeDNg5u52fswhjkNN5Sru6Rf/2WhuuQXteIC2tX27J03Ud8h2aKydzHai7zz8jJ0IoGt7cA6W0Nw==} + '@storybook/addon-viewport@7.6.20': dependencies: memoizerific: 1.11.3 - dev: true - /@storybook/blocks@7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-mCEyGew2nyiFwJ1iHfm4ItB/bDrVzYUODkKktmHDmJJgjKFIDQJPTgLsiQhXBtxqW0TImL4JpSU/aUAAbXpZeg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/blocks@7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@storybook/channels': 7.6.18 - '@storybook/client-logger': 7.6.18 - '@storybook/components': 7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/core-events': 7.6.18 - '@storybook/csf': 0.1.5 - '@storybook/docs-tools': 7.6.18 + '@storybook/channels': 7.6.20 + '@storybook/client-logger': 7.6.20 + '@storybook/components': 7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/core-events': 7.6.20 + '@storybook/csf': 0.1.8 + '@storybook/docs-tools': 7.6.20 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/preview-api': 7.6.18 - '@storybook/theming': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 7.6.18 - '@types/lodash': 4.17.0 + '@storybook/manager-api': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/preview-api': 7.6.20 + '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.20 + '@types/lodash': 4.17.5 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 @@ -3526,10 +10636,10 @@ packages: memoizerific: 1.11.3 polished: 4.3.1 react: 18.3.1 - react-colorful: 5.6.1(react-dom@18.3.1)(react@18.3.1) + react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: 18.3.1(react@18.3.1) telejson: 7.2.0 - tocbot: 4.27.13 + tocbot: 4.28.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 transitivePeerDependencies: @@ -3537,15 +10647,13 @@ packages: - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/builder-manager@7.6.18: - resolution: {integrity: sha512-kXnC/lDA3zUeXgwAoHKed+CXbDcKV8GJ6qrPCw1D1a3ug5Lw5DYPBJC/KP3CgNpVx6vukkeEIwKYg2M+LRmI6g==} + '@storybook/builder-manager@7.6.20': dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.6.18 - '@storybook/manager': 7.6.18 - '@storybook/node-logger': 7.6.18 + '@storybook/core-common': 7.6.20 + '@storybook/manager': 7.6.20 + '@storybook/node-logger': 7.6.20 '@types/ejs': 3.1.5 '@types/find-cache-dir': 3.2.1 '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.20) @@ -3561,31 +10669,17 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/builder-vite@7.6.18(typescript@4.9.5)(vite@4.5.3): - resolution: {integrity: sha512-f3chnC6ug9KJDz3Z+HNl8yhJ/SUT0ASdJjKViVJ90MKKyFpeCvzs2DSgMGv2UJrPfBMh6PhFM2dy26+LksioCQ==} - peerDependencies: - '@preact/preset-vite': '*' - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - vite-plugin-glimmerx: '*' - peerDependenciesMeta: - '@preact/preset-vite': - optional: true - typescript: - optional: true - vite-plugin-glimmerx: - optional: true + '@storybook/builder-vite@7.6.20(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1))': dependencies: - '@storybook/channels': 7.6.18 - '@storybook/client-logger': 7.6.18 - '@storybook/core-common': 7.6.18 - '@storybook/csf-plugin': 7.6.18 - '@storybook/node-logger': 7.6.18 - '@storybook/preview': 7.6.18 - '@storybook/preview-api': 7.6.18 - '@storybook/types': 7.6.18 + '@storybook/channels': 7.6.20 + '@storybook/client-logger': 7.6.20 + '@storybook/core-common': 7.6.20 + '@storybook/csf-plugin': 7.6.20 + '@storybook/node-logger': 7.6.20 + '@storybook/preview': 7.6.20 + '@storybook/preview-api': 7.6.20 + '@storybook/types': 7.6.20 '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 es-module-lexer: 0.9.3 @@ -3594,51 +10688,45 @@ packages: fs-extra: 11.2.0 magic-string: 0.30.10 rollup: 3.29.4 + vite: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) + optionalDependencies: typescript: 4.9.5 - vite: 4.5.3 transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/channels@7.6.17: - resolution: {integrity: sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==} + '@storybook/channels@7.6.17': dependencies: '@storybook/client-logger': 7.6.17 '@storybook/core-events': 7.6.17 '@storybook/global': 5.0.0 - qs: 6.12.1 + qs: 6.11.0 telejson: 7.2.0 tiny-invariant: 1.3.3 - dev: true - /@storybook/channels@7.6.18: - resolution: {integrity: sha512-ayMJ6GJot81URJySXcwZG1mLacblUVdLgAMIhU7oSW1K1v4KvQPxv3FqjNN+48g/1s+2A9UraCDqN0qzO3wznQ==} + '@storybook/channels@7.6.20': dependencies: - '@storybook/client-logger': 7.6.18 - '@storybook/core-events': 7.6.18 + '@storybook/client-logger': 7.6.20 + '@storybook/core-events': 7.6.20 '@storybook/global': 5.0.0 - qs: 6.12.1 + qs: 6.11.0 telejson: 7.2.0 tiny-invariant: 1.3.3 - dev: true - /@storybook/cli@7.6.18: - resolution: {integrity: sha512-2zlCyX4m1Jb3p+P/Z+7ioa7cXA+Sv+j0JevUWaaVZbBLrjj/G2k5bYzgrks0FhQZ6MLv5bkuZPGtJMgWQ8+c3Q==} - hasBin: true + '@storybook/cli@7.6.20': dependencies: - '@babel/core': 7.24.4 - '@babel/preset-env': 7.24.4(@babel/core@7.24.4) - '@babel/types': 7.24.0 + '@babel/core': 7.24.7 + '@babel/preset-env': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 7.6.18 - '@storybook/core-common': 7.6.18 - '@storybook/core-events': 7.6.18 - '@storybook/core-server': 7.6.18 - '@storybook/csf-tools': 7.6.18 - '@storybook/node-logger': 7.6.18 - '@storybook/telemetry': 7.6.18 - '@storybook/types': 7.6.18 + '@storybook/codemod': 7.6.20 + '@storybook/core-common': 7.6.20 + '@storybook/core-events': 7.6.20 + '@storybook/core-server': 7.6.20 + '@storybook/csf-tools': 7.6.20 + '@storybook/node-logger': 7.6.20 + '@storybook/telemetry': 7.6.20 + '@storybook/types': 7.6.20 '@types/semver': 7.5.8 '@yarnpkg/fslib': 2.10.3 '@yarnpkg/libzip': 2.3.0 @@ -3655,14 +10743,14 @@ packages: get-port: 5.1.1 giget: 1.2.3 globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.24.4) + jscodeshift: 0.15.2(@babel/preset-env@7.24.7(@babel/core@7.24.7)) leven: 3.1.0 ora: 5.4.1 prettier: 2.8.8 prompts: 2.4.2 puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 - semver: 7.6.0 + semver: 7.6.2 strip-json-comments: 3.1.1 tempy: 1.0.1 ts-dedent: 2.2.0 @@ -3672,86 +10760,69 @@ packages: - encoding - supports-color - utf-8-validate - dev: true - /@storybook/client-api@7.6.17: - resolution: {integrity: sha512-rsxKBRLtUmBXbxG79Pf1GzUuMDMsFdhNR/a5k7kIA/mlEsvWD8are/aH/zk1oLr7+5QOqEkiXLL6+Erry7dzXA==} + '@storybook/client-api@7.6.17': dependencies: '@storybook/client-logger': 7.6.17 '@storybook/preview-api': 7.6.17 - dev: true - /@storybook/client-logger@7.6.17: - resolution: {integrity: sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==} + '@storybook/client-logger@7.6.17': dependencies: '@storybook/global': 5.0.0 - dev: true - /@storybook/client-logger@7.6.18: - resolution: {integrity: sha512-/mSKa968G++M7RTW1XLM0jgNMUATxKv/vggLyQ9Oo2UpQhRaXX8dKRl7GVu2yFDRm9sDKs7rg+KSsstrEjQcSg==} + '@storybook/client-logger@7.6.20': dependencies: '@storybook/global': 5.0.0 - dev: true - - /@storybook/codemod@7.6.18: - resolution: {integrity: sha512-XV9/oZYctRKQzllqjwcH17Fys91cmaL+/Vy9aJmpnv/+yNFUdvsyrjqEGfVpl5c00/Ge3ueP+y7YhLYSjTezUg==} - dependencies: - '@babel/core': 7.24.4 - '@babel/preset-env': 7.24.4(@babel/core@7.24.4) - '@babel/types': 7.24.0 - '@storybook/csf': 0.1.5 - '@storybook/csf-tools': 7.6.18 - '@storybook/node-logger': 7.6.18 - '@storybook/types': 7.6.18 + + '@storybook/codemod@7.6.20': + dependencies: + '@babel/core': 7.24.7 + '@babel/preset-env': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 + '@storybook/csf': 0.1.8 + '@storybook/csf-tools': 7.6.20 + '@storybook/node-logger': 7.6.20 + '@storybook/types': 7.6.20 '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.3 globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.24.4) + jscodeshift: 0.15.2(@babel/preset-env@7.24.7(@babel/core@7.24.7)) lodash: 4.17.21 prettier: 2.8.8 - recast: 0.23.6 + recast: 0.23.9 transitivePeerDependencies: - supports-color - dev: true - /@storybook/components@7.6.18(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-t27jyQUTkLgpQc2b7AQ848MJkihOfTgXsDIIMW1sYixqYO1R2anWE2qF5+1ZXZ58xyQEbUWnWUNYrGj3jGwAOw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/components@7.6.20(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-select': 1.2.2(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-toolbar': 1.0.4(@types/react@17.0.80)(react-dom@18.3.1)(react@18.3.1) - '@storybook/client-logger': 7.6.18 - '@storybook/csf': 0.1.5 + '@radix-ui/react-select': 1.2.2(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toolbar': 1.1.0(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/client-logger': 7.6.20 + '@storybook/csf': 0.1.8 '@storybook/global': 5.0.0 - '@storybook/theming': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 7.6.18 + '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.20 memoizerific: 1.11.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-resize-observer: 9.1.0(react-dom@18.3.1)(react@18.3.1) + use-resize-observer: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/core-client@7.6.18: - resolution: {integrity: sha512-gKelPHlE4Xr8mkC0q1CotxB1hoR54P94LeJ6NrmNp2W8vZLiV8d/3CShJwTyEEkhhOB8diEGyya2LawboMYPpg==} + '@storybook/core-client@7.6.20': dependencies: - '@storybook/client-logger': 7.6.18 - '@storybook/preview-api': 7.6.18 - dev: true + '@storybook/client-logger': 7.6.20 + '@storybook/preview-api': 7.6.20 - /@storybook/core-common@7.6.18: - resolution: {integrity: sha512-ZZbvjpDKs3KPyoUWLTaMn8/0N2S8tXZpMfdrZrHHOzy9O3mmbk2Silr1OytWS6CBICFgDb71p7EWZ026KOVNkA==} + '@storybook/core-common@7.6.20': dependencies: - '@storybook/core-events': 7.6.18 - '@storybook/node-logger': 7.6.18 - '@storybook/types': 7.6.18 + '@storybook/core-events': 7.6.20 + '@storybook/node-logger': 7.6.20 + '@storybook/types': 7.6.20 '@types/find-cache-dir': 3.2.1 - '@types/node': 18.19.31 + '@types/node': 18.19.39 '@types/node-fetch': 2.6.11 '@types/pretty-hrtime': 1.0.3 chalk: 4.1.2 @@ -3761,7 +10832,7 @@ packages: find-cache-dir: 3.3.2 find-up: 5.0.0 fs-extra: 11.2.0 - glob: 10.3.12 + glob: 10.4.2 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 node-fetch: 2.7.0 @@ -3773,112 +10844,95 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/core-events@7.6.17: - resolution: {integrity: sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==} + '@storybook/core-events@7.6.17': dependencies: ts-dedent: 2.2.0 - dev: true - /@storybook/core-events@7.6.18: - resolution: {integrity: sha512-K4jrHedFRfokvkIfKfNtQTcguPzeWF3oiuyXQR4gv4bnMCndCoiSRKfCE5zesgGmfml/Krt2zb4nNz/UPLbDeA==} + '@storybook/core-events@7.6.20': dependencies: ts-dedent: 2.2.0 - dev: true - /@storybook/core-server@7.6.18: - resolution: {integrity: sha512-LXsbVqsHHcF/9mCcCDebRUO+ZuvK10Xtrgt8KJfAuWGU2nj8D2sJLw7suuDEB7UBTNMsJMOAmyrVU9FQbfWLCQ==} + '@storybook/core-server@7.6.20': dependencies: '@aw-web-design/x-default-browser': 1.4.126 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.6.18 - '@storybook/channels': 7.6.18 - '@storybook/core-common': 7.6.18 - '@storybook/core-events': 7.6.18 - '@storybook/csf': 0.1.5 - '@storybook/csf-tools': 7.6.18 + '@storybook/builder-manager': 7.6.20 + '@storybook/channels': 7.6.20 + '@storybook/core-common': 7.6.20 + '@storybook/core-events': 7.6.20 + '@storybook/csf': 0.1.8 + '@storybook/csf-tools': 7.6.20 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.6.18 - '@storybook/node-logger': 7.6.18 - '@storybook/preview-api': 7.6.18 - '@storybook/telemetry': 7.6.18 - '@storybook/types': 7.6.18 + '@storybook/manager': 7.6.20 + '@storybook/node-logger': 7.6.20 + '@storybook/preview-api': 7.6.20 + '@storybook/telemetry': 7.6.20 + '@storybook/types': 7.6.20 '@types/detect-port': 1.3.5 - '@types/node': 18.19.31 + '@types/node': 18.19.39 '@types/pretty-hrtime': 1.0.3 '@types/semver': 7.5.8 better-opn: 3.0.2 chalk: 4.1.2 - cli-table3: 0.6.4 + cli-table3: 0.6.5 compression: 1.7.4 - detect-port: 1.5.1 + detect-port: 1.6.1 express: 4.19.2 fs-extra: 11.2.0 globby: 11.1.0 - ip: 2.0.1 lodash: 4.17.21 open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 - semver: 7.6.0 + semver: 7.6.2 telejson: 7.2.0 tiny-invariant: 1.3.3 ts-dedent: 2.2.0 util: 0.12.5 util-deprecate: 1.0.2 watchpack: 2.4.1 - ws: 8.17.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - dev: true - /@storybook/csf-plugin@7.6.18: - resolution: {integrity: sha512-dV/f0oIuv/OsmAh3FVqBkZAvQ5YRQXglZlHynaqt8cUVXi+Nsc/b7kFTBGj2GyIi9TCdiqfV5Yns+Bq2bIVHrA==} + '@storybook/csf-plugin@7.6.20': dependencies: - '@storybook/csf-tools': 7.6.18 + '@storybook/csf-tools': 7.6.20 unplugin: 1.10.1 transitivePeerDependencies: - supports-color - dev: true - /@storybook/csf-tools@7.6.18: - resolution: {integrity: sha512-ngRNHEtLJv6vMlqCeJaG8dh1CwtCaGCHi7xuS+b71Y97xXLJlA6RR9rhsMG6bDwMJR+xiIqKUc6HH3ZBSVVhiA==} + '@storybook/csf-tools@7.6.20': dependencies: - '@babel/generator': 7.24.4 - '@babel/parser': 7.24.4 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - '@storybook/csf': 0.1.5 - '@storybook/types': 7.6.18 + '@babel/generator': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + '@storybook/csf': 0.1.8 + '@storybook/types': 7.6.20 fs-extra: 11.2.0 - recast: 0.23.6 + recast: 0.23.9 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/csf@0.1.5: - resolution: {integrity: sha512-pW7Dtk/bE2JGrAe/KuBY4Io02NBe/2CLP2DkgVgWlSwvEVdm/rbQyiwy8RaL0lQlJCv9CsGBY+n9HQG8d4bZjQ==} + '@storybook/csf@0.1.8': dependencies: type-fest: 2.19.0 - dev: true - /@storybook/docs-mdx@0.1.0: - resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} - dev: true + '@storybook/docs-mdx@0.1.0': {} - /@storybook/docs-tools@7.6.18: - resolution: {integrity: sha512-gE4He4YoOAFnFwarSsOJVLC1YVN6iilQXMZsKD2SNI0M30nOeqK5NjFwXtAklq6QQvBZVZV7VRG5sY7i4aGBcQ==} + '@storybook/docs-tools@7.6.20': dependencies: - '@storybook/core-common': 7.6.18 - '@storybook/preview-api': 7.6.18 - '@storybook/types': 7.6.18 + '@storybook/core-common': 7.6.20 + '@storybook/preview-api': 7.6.20 + '@storybook/types': 7.6.20 '@types/doctrine': 0.0.3 assert: 2.1.0 doctrine: 3.0.0 @@ -3886,23 +10940,19 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/global@5.0.0: - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - dev: true + '@storybook/global@5.0.0': {} - /@storybook/manager-api@7.6.18(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-4c2japUMjnHiel38wQoNWh5RVac6ATMcWxvzPhOKx3I19gbSoUF1CcDg+1piRMWuSyzUBIBlIrBB3s4/02gnnA==} + '@storybook/manager-api@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@storybook/channels': 7.6.18 - '@storybook/client-logger': 7.6.18 - '@storybook/core-events': 7.6.18 - '@storybook/csf': 0.1.5 + '@storybook/channels': 7.6.20 + '@storybook/client-logger': 7.6.20 + '@storybook/core-events': 7.6.20 + '@storybook/csf': 0.1.8 '@storybook/global': 5.0.0 - '@storybook/router': 7.6.18 - '@storybook/theming': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 7.6.18 + '@storybook/router': 7.6.20 + '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.20 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 @@ -3912,94 +10962,68 @@ packages: transitivePeerDependencies: - react - react-dom - dev: true - /@storybook/manager@7.6.18: - resolution: {integrity: sha512-ZFatbkbK5qv2a4jJEm6WqKZZqkYm++t0uAZozBA6TNq/bWMaD9ihummPTGND8R0M7SW0rfUVFDAE8bv14gLcdg==} - dev: true + '@storybook/manager@7.6.20': {} - /@storybook/mdx2-csf@1.1.0: - resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - dev: true + '@storybook/mdx2-csf@1.1.0': {} - /@storybook/node-logger@7.6.18: - resolution: {integrity: sha512-e75XQ6TekxjpzdlW6rZAFtv/9aD/nQb4z9kaBr3GhuVMGVJNihs9ek6eVEFZLxpks4FDVSPTSg0QtFpSgOpbrg==} - dev: true + '@storybook/node-logger@7.6.20': {} - /@storybook/postinstall@7.6.18: - resolution: {integrity: sha512-TTTvuR6LyaRfzrtJvSr+L4Bys8gp3wOKACOErZBXjt3UCQR4rwhwGP7k2GsysiHHLbxGu25ZU2fnnT2OYYeTNA==} - dev: true + '@storybook/postinstall@7.6.20': {} - /@storybook/preview-api@7.6.17: - resolution: {integrity: sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==} + '@storybook/preview-api@7.6.17': dependencies: '@storybook/channels': 7.6.17 '@storybook/client-logger': 7.6.17 '@storybook/core-events': 7.6.17 - '@storybook/csf': 0.1.5 + '@storybook/csf': 0.1.8 '@storybook/global': 5.0.0 '@storybook/types': 7.6.17 '@types/qs': 6.9.15 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 - qs: 6.12.1 + qs: 6.11.0 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - dev: true - /@storybook/preview-api@7.6.18: - resolution: {integrity: sha512-X3r3MnoLJWUhHTVFggJcfHzDLCKSOdHNOpXXRNkdG2WXFcCZAlTdm0KqThCvQmdqS4OAOJMfn4pHqtxPG8yfyg==} + '@storybook/preview-api@7.6.20': dependencies: - '@storybook/channels': 7.6.18 - '@storybook/client-logger': 7.6.18 - '@storybook/core-events': 7.6.18 - '@storybook/csf': 0.1.5 + '@storybook/channels': 7.6.20 + '@storybook/client-logger': 7.6.20 + '@storybook/core-events': 7.6.20 + '@storybook/csf': 0.1.8 '@storybook/global': 5.0.0 - '@storybook/types': 7.6.18 + '@storybook/types': 7.6.20 '@types/qs': 6.9.15 dequal: 2.0.3 lodash: 4.17.21 memoizerific: 1.11.3 - qs: 6.12.1 + qs: 6.11.0 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - dev: true - /@storybook/preview@7.6.18: - resolution: {integrity: sha512-iltkZxz991GmzXMNkM9b7ddM45IsfZoQ+pMGXOv902Xawx9otvNkMVxBMhpXG+tf7G3FrSM1DFT6V9SycC6pqg==} - dev: true + '@storybook/preview@7.6.20': {} - /@storybook/react-dom-shim@7.6.18(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-s4eIq5KVnS7E4pIXdq31YzqRZX0FZEYKoUeZziBBajRvmPAJ/zWSBbrGeOIR71xDHT7UkUoeb5EuyfykS9yuoA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/react-dom-shim@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true - /@storybook/react-vite@7.6.18(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5)(vite@4.5.3): - resolution: {integrity: sha512-7Q4x7SEA9ajb348z5bX+dXM8x+JWgLus1xGPySnVKariYrlgmJrSbFSE07oMsA0m0Y2mwXzWQgv7imjU7Jwklg==} - engines: {node: '>=16'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + '@storybook/react-vite@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.18.0)(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@4.9.5)(vite@4.5.3) - '@rollup/pluginutils': 5.1.0 - '@storybook/builder-vite': 7.6.18(typescript@4.9.5)(vite@4.5.3) - '@storybook/react': 7.6.18(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5) - '@vitejs/plugin-react': 3.1.0(vite@4.5.3) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@storybook/builder-vite': 7.6.20(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)) + '@storybook/react': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@4.9.5) + '@vitejs/plugin-react': 3.1.0(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)) magic-string: 0.30.10 react: 18.3.1 react-docgen: 7.0.3 react-dom: 18.3.1(react@18.3.1) - vite: 4.5.3 + vite: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -4007,29 +11031,19 @@ packages: - supports-color - typescript - vite-plugin-glimmerx - dev: true - /@storybook/react@7.6.18(react-dom@18.3.1)(react@18.3.1)(typescript@4.9.5): - resolution: {integrity: sha512-cWAMz8W7Xa1fv8ugFsUCw0w08GsWGGw5XiYgLJJ+2/zQNhkMGzsY9zl7XQtULhIBfY0MptC7CLIYHc0t61xvHw==} - engines: {node: '>=16.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@storybook/react@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@4.9.5)': dependencies: - '@storybook/client-logger': 7.6.18 - '@storybook/core-client': 7.6.18 - '@storybook/docs-tools': 7.6.18 + '@storybook/client-logger': 7.6.20 + '@storybook/core-client': 7.6.20 + '@storybook/docs-tools': 7.6.20 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.6.18 - '@storybook/react-dom-shim': 7.6.18(react-dom@18.3.1)(react@18.3.1) - '@storybook/types': 7.6.18 + '@storybook/preview-api': 7.6.20 + '@storybook/react-dom-shim': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/types': 7.6.20 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 - '@types/node': 18.19.31 + '@types/node': 18.19.39 acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) acorn-walk: 7.2.0 @@ -4039,30 +11053,27 @@ packages: prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-element-to-jsx-string: 15.0.0(react-dom@18.3.1)(react@18.3.1) + react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.2.0 type-fest: 2.19.0 - typescript: 4.9.5 util-deprecate: 1.0.2 + optionalDependencies: + typescript: 4.9.5 transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/router@7.6.18: - resolution: {integrity: sha512-Kw6nAPWRAFE9DM//pnyjL7Xnxt+yQIONdERDnPrdEmHG5mErXGtO18aFMsb/7GiAD50J/i5ObTp7FJsWffAnbg==} + '@storybook/router@7.6.20': dependencies: - '@storybook/client-logger': 7.6.18 + '@storybook/client-logger': 7.6.20 memoizerific: 1.11.3 - qs: 6.12.1 - dev: true + qs: 6.11.0 - /@storybook/telemetry@7.6.18: - resolution: {integrity: sha512-fVgQtWYpAA1Htiu05GwipBNM5odCi05FpaoaxnCO/CsqrTfKYBJTorVo8mh8wc03gfQJs1/nXN2v0WEo0ahUoA==} + '@storybook/telemetry@7.6.20': dependencies: - '@storybook/client-logger': 7.6.18 - '@storybook/core-common': 7.6.18 - '@storybook/csf-tools': 7.6.18 + '@storybook/client-logger': 7.6.20 + '@storybook/core-common': 7.6.20 + '@storybook/csf-tools': 7.6.20 chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 @@ -4071,555 +11082,351 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/theming@7.6.18(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-5nwqV/rAVzS8wZ6DbsX5/ugDLV189hn2m3K9JlJmhVW9b2mSDYW5i1cTjpoChh1t9gMZl82VPnEhgPRMx5bXgw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/theming@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@storybook/client-logger': 7.6.18 + '@storybook/client-logger': 7.6.20 '@storybook/global': 5.0.0 memoizerific: 1.11.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true - /@storybook/types@7.6.17: - resolution: {integrity: sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==} + '@storybook/types@7.6.17': dependencies: '@storybook/channels': 7.6.17 '@types/babel__core': 7.20.5 '@types/express': 4.17.21 file-system-cache: 2.3.0 - dev: true - /@storybook/types@7.6.18: - resolution: {integrity: sha512-W7/8kUtMhEopZhwXFMOKlXwQCrz0PBJ5wQwmJNZ4i0YPTVfFzb+/6pgpkzUNtbXiTp6dfxi3ERoAF9wz9Zyt7w==} + '@storybook/types@7.6.20': dependencies: - '@storybook/channels': 7.6.18 + '@storybook/channels': 7.6.20 '@types/babel__core': 7.20.5 '@types/express': 4.17.21 file-system-cache: 2.3.0 - dev: true - - /@swc/helpers@0.4.14: - resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} - dependencies: - tslib: 2.6.2 - dev: false - /@swc/helpers@0.4.36: - resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} + '@swc/helpers@0.4.14': dependencies: - legacy-swc-helpers: /@swc/helpers@0.4.14 - tslib: 2.6.2 - dev: false + tslib: 2.6.3 - /@swc/helpers@0.5.11: - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@swc/helpers@0.5.11': dependencies: - tslib: 2.6.2 - dev: false + tslib: 2.6.3 - /@tanstack/query-core@5.32.0: - resolution: {integrity: sha512-Z3flEgCat55DRXU5UMwYU1U+DgFZKA3iufyOKs+II7iRAo0uXkeU7PH5e6sOH1CGEag0IpKmZxlUFpCg6roSKw==} - dev: false + '@tanstack/query-core@5.45.0': {} - /@tanstack/react-query@5.32.0(react@18.3.1): - resolution: {integrity: sha512-+E3UudQtarnx9A6xhpgMZapyF+aJfNBGFMgI459FnduEZqT/9KhOWnMOneZahLRt52yzskSA0AuOyLkXHK0yBA==} - peerDependencies: - react: ^18.0.0 + '@tanstack/react-query@5.45.1(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.32.0 + '@tanstack/query-core': 5.45.0 react: 18.3.1 - dev: false - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 - dev: true + '@types/babel__traverse': 7.20.6 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.0 - dev: true + '@babel/types': 7.24.7 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - dev: true + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.0 - dev: true + '@babel/types': 7.24.7 - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.12.7 - dev: true + '@types/node': 20.14.8 - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: - '@types/node': 20.12.7 - dev: true + '@types/node': 20.14.8 - /@types/cross-spawn@6.0.6: - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 20.12.7 - dev: true + '@types/node': 20.14.8 - /@types/detect-port@1.3.5: - resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - dev: true + '@types/detect-port@1.3.5': {} - /@types/doctrine@0.0.3: - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - dev: true + '@types/doctrine@0.0.3': {} - /@types/doctrine@0.0.9: - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - dev: true + '@types/doctrine@0.0.9': {} - /@types/ejs@3.1.5: - resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - dev: true + '@types/ejs@3.1.5': {} - /@types/emscripten@1.39.10: - resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} - dev: true + '@types/emscripten@1.39.13': {} - /@types/escodegen@0.0.6: - resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - dev: true + '@types/escodegen@0.0.6': {} - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 '@types/estree': 1.0.5 - dev: true - /@types/eslint@8.56.10: - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: true - /@types/estree@0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - dev: true + '@types/estree@0.0.51': {} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/express-serve-static-core@4.19.0: - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.14.8 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - dev: true - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 + '@types/express-serve-static-core': 4.19.5 '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 - dev: true - /@types/find-cache-dir@3.2.1: - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - dev: true + '@types/find-cache-dir@3.2.1': {} - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.12.7 - dev: true + '@types/node': 20.14.8 - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.12.7 - dev: true + '@types/node': 20.14.8 - /@types/hoist-non-react-statics@3.3.5: - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + '@types/hoist-non-react-statics@3.3.5': dependencies: '@types/react': 17.0.80 hoist-non-react-statics: 3.3.2 - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.4': {} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 - dev: true - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.12': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - dev: true - /@types/js-cookie@2.2.7: - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - dev: false + '@types/js-cookie@2.2.7': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json5@0.0.29': {} - /@types/lodash@4.17.0: - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - dev: true + '@types/lodash@4.17.5': {} - /@types/mdx@2.0.13: - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - dev: true + '@types/mdx@2.0.13': {} - /@types/mime-types@2.1.4: - resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - dev: true + '@types/mime-types@2.1.4': {} - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/mime@1.3.5': {} - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true + '@types/minimatch@3.0.5': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimatch@5.1.2': {} - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/minimist@1.2.5': {} + + '@types/node-fetch@2.6.11': dependencies: - '@types/node': 18.19.31 + '@types/node': 18.19.39 form-data: 4.0.0 - dev: true - /@types/node@18.19.31: - resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + '@types/node@18.19.39': dependencies: undici-types: 5.26.5 - dev: true - /@types/node@20.12.7: - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@20.14.8': dependencies: undici-types: 5.26.5 - dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/postcss-modules-local-by-default@4.0.2: - resolution: {integrity: sha512-CtYCcD+L+trB3reJPny+bKWKMzPfxEyQpKIwit7kErnOexf5/faaGpkFy4I5AwbV4hp1sk7/aTg0tt0B67VkLQ==} + '@types/postcss-modules-local-by-default@4.0.2': dependencies: postcss: 8.4.38 - dev: true - /@types/postcss-modules-scope@3.0.4: - resolution: {integrity: sha512-//ygSisVq9kVI0sqx3UPLzWIMCmtSVrzdljtuaAEJtGoGnpjBikZ2sXO5MpH9SnWX9HRfXxHifDAXcQjupWnIQ==} + '@types/postcss-modules-scope@3.0.4': dependencies: postcss: 8.4.38 - dev: true - /@types/pretty-hrtime@1.0.3: - resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - dev: true + '@types/pretty-hrtime@1.0.3': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.12': {} - /@types/qs@6.9.15: - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - dev: true + '@types/qs@6.9.15': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/react-helmet@6.1.11: - resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==} + '@types/react-helmet@6.1.11': dependencies: '@types/react': 17.0.80 - dev: true - /@types/react-infinite-scroller@1.2.5: - resolution: {integrity: sha512-fJU1jhMgoL6NJFrqTM0Ob7tnd2sQWGxe2ESwiU6FZWbJK/VO/Er5+AOhc+e2zbT0dk5pLygqctsulOLJ8xnSzw==} + '@types/react-infinite-scroller@1.2.5': dependencies: '@types/react': 17.0.80 - dev: true - /@types/react-mentions@4.1.13: - resolution: {integrity: sha512-kRulAAjlmhCtsJ9bapO0foocknaE/rEuFKpmFEU81fBfnXZmZNBaJ9J/DBjwigT3WDHjQVUmYoi5sxEXrcdzAw==} + '@types/react-mentions@4.1.13': dependencies: '@types/react': 17.0.80 - dev: true - /@types/react-timeago@4.1.7: - resolution: {integrity: sha512-ogD4Ror/hDG+pQggCX+TgPgJ8W2jeeUxsgNU485Qpm0Ma+E2TND2EJuKwK5+sxlkDXDEgsHradO0zWBkTgLzNg==} + '@types/react-timeago@4.1.7': dependencies: '@types/react': 17.0.80 - dev: true - /@types/react@17.0.80: - resolution: {integrity: sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==} + '@types/react@17.0.80': dependencies: '@types/prop-types': 15.7.12 '@types/scheduler': 0.16.8 csstype: 3.1.3 - /@types/resolve@1.20.6: - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - dev: true + '@types/resolve@1.20.6': {} - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/scheduler@0.16.8': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.12.7 - dev: true + '@types/node': 20.14.8 - /@types/serve-static@1.15.7: - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.12.7 + '@types/node': 20.14.8 '@types/send': 0.17.4 - dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true + '@types/stack-utils@2.0.3': {} - /@types/styled-components@5.1.34: - resolution: {integrity: sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==} + '@types/styled-components@5.1.34': dependencies: '@types/hoist-non-react-statics': 3.3.5 '@types/react': 17.0.80 csstype: 3.1.3 - dev: true - /@types/stylis@4.2.0: - resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} - dev: true + '@types/stylis@4.2.5': {} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: true + '@types/unist@2.0.10': {} - /@types/uuid@9.0.8: - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - dev: true + '@types/uuid@9.0.8': {} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@4.9.5): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5)': dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.10.1 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + debug: 4.3.5 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.0 + semver: 7.6.2 ts-api-utils: 1.3.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + debug: 4.3.5 eslint: 8.57.0 + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@4.9.5): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) - debug: 4.3.4 + debug: 4.3.5 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@typescript-eslint/types@5.62.0': {} - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.21.0': {} - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 + semver: 7.6.2 tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@4.9.5): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.21.0(typescript@4.9.5)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 + semver: 7.6.2 ts-api-utils: 1.3.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -4629,17 +11436,12 @@ packages: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@4.9.5): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -4648,122 +11450,82 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) eslint: 8.57.0 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@vitejs/plugin-react@3.1.0(vite@4.5.3): - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.1.0-beta.0 + '@vitejs/plugin-react@3.1.0(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1))': dependencies: - '@babel/core': 7.24.4 - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) magic-string: 0.27.0 react-refresh: 0.14.2 - vite: 4.5.3 + vite: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) transitivePeerDependencies: - supports-color - dev: true - /@vitejs/plugin-react@4.2.1(vite@4.5.3): - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 + '@vitejs/plugin-react@4.3.1(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1))': dependencies: - '@babel/core': 7.24.4 - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 4.5.3 + vite: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) transitivePeerDependencies: - supports-color - dev: true - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - dev: true + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 - dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -4773,29 +11535,23 @@ packages: '@webassemblyjs/wasm-opt': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - dev: true - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - dev: true - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -4803,258 +11559,151 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - dev: true - /@xobotyi/scrollbar-width@1.9.5: - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - dev: false + '@xobotyi/scrollbar-width@1.9.5': {} - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20): - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20)': dependencies: esbuild: 0.18.20 - tslib: 2.6.2 - dev: true + tslib: 2.6.3 - /@yarnpkg/fslib@2.10.3: - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + '@yarnpkg/fslib@2.10.3': dependencies: '@yarnpkg/libzip': 2.3.0 tslib: 1.14.1 - dev: true - /@yarnpkg/libzip@2.3.0: - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + '@yarnpkg/libzip@2.3.0': dependencies: - '@types/emscripten': 1.39.10 + '@types/emscripten': 1.39.13 tslib: 1.14.1 - dev: true - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-attributes@1.9.5(acorn@8.12.0): dependencies: - acorn: 8.11.3 - dev: true + acorn: 8.12.0 - /acorn-jsx@5.3.2(acorn@7.4.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: - acorn: 8.11.3 - dev: true + acorn: 8.12.0 - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@7.2.0: {} - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@7.4.1: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.12.0: {} - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true + add-stream@1.0.0: {} - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - dev: true + address@1.2.2: {} - /after@0.8.2: - resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} - dev: true + after@0.8.2: {} - /agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - dev: true + agent-base@5.1.1: {} - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 - dev: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ajv@8.16.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + ansi-escapes@5.0.0: dependencies: type-fest: 1.4.0 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - dev: true + app-root-dir@1.0.2: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} + aria-hidden@1.2.4: dependencies: - tslib: 2.6.2 - dev: true + tslib: 2.6.3 - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true + array-differ@3.0.0: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + array-flatten@1.1.1: {} - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + array-ify@1.0.0: {} + + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5062,16 +11711,10 @@ packages: es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5079,31 +11722,22 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -5113,263 +11747,172 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /arraybuffer.slice@0.0.7: - resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} - dev: true + arraybuffer.slice@0.0.7: {} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + arrify@2.0.1: {} + + assert@2.1.0: dependencies: call-bind: 1.0.7 is-nan: 1.3.2 object-is: 1.1.6 object.assign: 4.1.5 util: 0.12.5 - dev: true - /ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + ast-types@0.16.1: dependencies: - tslib: 2.6.2 - dev: true + tslib: 2.6.3 - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: true + astral-regex@2.0.0: {} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: true + async-limiter@1.0.1: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + async@3.2.5: {} - /autoprefixer@10.4.19(postcss@8.4.38): - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + asynckit@0.4.0: {} + + autoprefixer@10.4.19(postcss@8.4.38): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001614 + browserslist: 4.23.1 + caniuse-lite: 1.0.30001636 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.38 postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /axe-core@4.9.0: - resolution: {integrity: sha512-H5orY+M2Fr56DWmMFpMrq5Ge93qjNdPVqzBv5gWK3aD1OvjBEJlEzxf09z93dGVQeI0LiW+aCMIx1QtShC/zUw==} - engines: {node: '>=4'} - dev: true + axe-core@4.9.1: {} - /axios@1.6.8(debug@4.3.4): - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + axios@1.7.2(debug@4.3.5): dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.5) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - /babel-core@7.0.0-bridge.0(@babel/core@7.24.4): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-core@7.0.0-bridge.0(@babel/core@7.24.7): dependencies: - '@babel/core': 7.24.4 - dev: true + '@babel/core': 7.24.7 - /babel-jest@29.7.0(@babel/core@7.24.4): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@29.7.0(@babel/core@7.24.7): dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.7 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.4) + babel-preset-jest: 29.6.3(@babel/core@7.24.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 - dev: true + '@types/babel__traverse': 7.20.6 - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.4): - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7): dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.4) + '@babel/compat-data': 7.24.7 + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7): dependencies: - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.4) - core-js-compat: 3.37.0 + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) + core-js-compat: 3.37.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.4): - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.7): dependencies: - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.4) + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) transitivePeerDependencies: - supports-color - dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.4): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.24.4): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.4 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + + babel-preset-jest@29.6.3(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) - dev: true + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) - /backo2@1.0.2: - resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} - dev: true + backo2@1.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base64-arraybuffer@0.1.5: - resolution: {integrity: sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==} - engines: {node: '>= 0.6.0'} - dev: true + balanced-match@2.0.0: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-arraybuffer@0.1.5: {} - /batch-processor@1.0.0: - resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} - dev: false + base64-js@1.5.1: {} - /better-assert@1.0.2: - resolution: {integrity: sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==} + batch-processor@1.0.0: {} + + better-assert@1.0.2: dependencies: callsite: 1.0.0 - dev: true - /better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + better-opn@3.0.2: dependencies: open: 8.4.2 - dev: true - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: true + big-integer@1.6.52: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true + big.js@5.2.2: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.3.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /blob@0.0.5: - resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} - dev: true + blob@0.0.5: {} - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -5385,189 +11928,110 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: - fill-range: 7.0.1 - dev: true + fill-range: 7.1.1 - /browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - dev: true + browser-assert@1.2.1: {} - /browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + browserify-zlib@0.1.4: dependencies: pako: 0.2.9 - dev: true - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001614 - electron-to-chromium: 1.4.750 + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.810 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true + update-browserslist-db: 1.0.16(browserslist@4.23.1) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 - dev: true - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - dev: true - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true + buffer-crc32@0.2.13: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /bundle-require@4.0.3(esbuild@0.19.12): - resolution: {integrity: sha512-2iscZ3fcthP2vka4Y7j277YJevwmsby/FpFDwjgw34Nl7dtCpt7zz/4TexmHMzY6KZEih7En9ImlbbgUNNQGtA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' + bundle-require@4.2.1(esbuild@0.19.12): dependencies: esbuild: 0.19.12 load-tsconfig: 0.2.5 - dev: true - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.0.0: {} - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.1.2: {} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true - /callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} - dev: true + callsite@1.0.0: {} - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: true + camelize@1.0.1: {} - /caniuse-lite@1.0.30001614: - resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} - dev: true + caniuse-lite@1.0.30001636: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true + char-regex@1.0.2: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -5575,220 +12039,127 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true + chownr@1.1.4: {} - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true + chownr@2.0.0: {} - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chrome-trace-event@1.0.4: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + citty@0.1.6: dependencies: consola: 3.2.3 - dev: true - /cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - dev: true + cjs-module-lexer@1.3.1: {} - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + clean-stack@2.2.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cli-table3@0.6.4: - resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-truncate@3.1.0: dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 - dev: true - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + client-only@0.0.1: {} + + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false + clsx@1.2.1: {} - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + clsx@2.1.1: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true + co@4.6.0: {} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true + collect-v8-coverage@1.0.2: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colord@2.9.3: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + colorette@2.0.20: {} + + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - dev: true + commander@11.0.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: true + commander@6.2.1: {} - /commist@1.1.0: - resolution: {integrity: sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==} + commist@1.1.0: dependencies: leven: 2.1.0 minimist: 1.2.8 - dev: true - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true + commondir@1.0.1: {} - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /component-bind@1.0.0: - resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} - dev: true + component-bind@1.0.0: {} - /component-emitter@1.2.1: - resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} - dev: true + component-emitter@1.2.1: {} - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: true + component-emitter@1.3.1: {} - /component-inherit@0.0.3: - resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} - dev: true + component-inherit@0.0.3: {} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.52.0 - dev: true - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.7.4: dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -5799,91 +12170,55 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /computed-style@0.1.4: - resolution: {integrity: sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==} - dev: false + computed-style@0.1.4: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: true - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: true - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: true + consola@3.2.3: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: true - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true + content-type@1.0.5: {} - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} + conventional-changelog-angular@5.0.13: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true - /conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} + conventional-changelog-atom@2.0.8: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} + conventional-changelog-codemirror@2.0.8: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-config-spec@2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - dev: true + conventional-changelog-config-spec@2.1.0: {} - /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} + conventional-changelog-conventionalcommits@4.6.3: dependencies: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 - dev: true - /conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} + conventional-changelog-core@4.2.4: dependencies: add-stream: 1.0.0 conventional-changelog-writer: 5.0.1 @@ -5899,53 +12234,31 @@ packages: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 - dev: true - /conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} + conventional-changelog-ember@2.0.9: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} + conventional-changelog-eslint@3.0.9: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} + conventional-changelog-express@2.0.6: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} + conventional-changelog-jquery@3.0.11: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} + conventional-changelog-jshint@2.0.9: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true - /conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} - dev: true + conventional-changelog-preset-loader@2.3.4: {} - /conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} - hasBin: true + conventional-changelog-writer@5.0.1: dependencies: conventional-commits-filter: 2.0.7 dateformat: 3.0.3 @@ -5956,11 +12269,8 @@ packages: semver: 6.3.1 split: 1.0.1 through2: 4.0.2 - dev: true - /conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} + conventional-changelog@3.1.25: dependencies: conventional-changelog-angular: 5.0.13 conventional-changelog-atom: 2.0.8 @@ -5973,20 +12283,13 @@ packages: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 - dev: true - /conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} + conventional-commits-filter@2.0.7: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: true - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true + conventional-commits-parser@3.2.4: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 @@ -5994,12 +12297,8 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} - hasBin: true + conventional-recommended-bump@6.1.0: dependencies: concat-stream: 2.0.0 conventional-changelog-preset-loader: 2.3.4 @@ -6009,53 +12308,43 @@ packages: git-semver-tags: 4.1.1 meow: 8.1.2 q: 1.5.1 - dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true + cookie-signature@1.0.6: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.6.0: {} - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-anything@2.0.6: dependencies: is-what: 3.14.1 - dev: true - /copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 - dev: false - /core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.37.1: dependencies: - browserslist: 4.23.0 - dev: true + browserslist: 4.23.1 - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} + + cosmiconfig@9.0.0(typescript@4.9.5): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 4.9.5 - /create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + create-jest@29.7.0(@types/node@20.14.8): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.7) + jest-config: 29.7.0(@types/node@20.14.8) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -6063,218 +12352,131 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: true + crypto-random-string@2.0.0: {} - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: true + css-color-keywords@1.0.0: {} - /css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-functions-list@3.2.2: {} + + css-in-js-utils@3.1.0: dependencies: - hyphenate-style-name: 1.0.4 - dev: false + hyphenate-style-name: 1.1.0 - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-to-react-native@3.2.0: dependencies: camelize: 1.0.1 css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 - dev: true - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + css-tokenize@1.0.1: + dependencies: + inherits: 2.0.4 + readable-stream: 1.1.14 + + css-tree@1.1.3: dependencies: mdn-data: 2.0.14 source-map: 0.6.1 - dev: false - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: true + cssesc@3.0.0: {} - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.1.3: {} - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true + dargs@7.0.0: {} - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true + dateformat@3.0.3: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + dayjs@1.11.11: {} + + debug@2.6.9: dependencies: ms: 2.0.0 - dev: true - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.1.0: dependencies: ms: 2.0.0 - dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: true - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + debug@4.3.5: + dependencies: + ms: 2.1.2 + + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + decamelize@1.2.0: {} - /dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true + dedent@1.5.3: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true + deepmerge@4.3.1: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - dev: true + defu@6.1.4: {} - /del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} + del@6.1.1: dependencies: globby: 11.1.0 graceful-fs: 4.2.11 @@ -6284,184 +12486,114 @@ packages: p-map: 4.0.0 rimraf: 3.0.2 slash: 3.0.0 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + delayed-stream@1.0.0: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true + depd@2.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + dequal@2.0.3: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true + destroy@1.2.0: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true + detect-newline@3.1.0: {} - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: true + detect-node-es@1.1.0: {} - /detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} + detect-package-manager@2.0.1: dependencies: execa: 5.1.1 - dev: true - /detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} - hasBin: true + detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color - dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + doiuse@6.0.2: + dependencies: + browserslist: 4.23.1 + caniuse-lite: 1.0.30001636 + css-tokenize: 1.0.1 + duplexify: 4.1.3 + ldjson-stream: 1.2.1 + multimatch: 5.0.0 + postcss: 8.4.38 + source-map: 0.7.4 + yargs: 17.7.2 + + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + dotenv-expand@10.0.0: {} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true + dotenv@16.4.5: {} - /dotgitignore@2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} + dotgitignore@2.1.0: dependencies: find-up: 3.0.0 minimatch: 3.1.2 - dev: true - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 - dev: true - /duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true + ee-first@1.1.1: {} - /ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.10: dependencies: - jake: 10.8.7 - dev: true + jake: 10.9.1 - /electron-to-chromium@1.4.750: - resolution: {integrity: sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==} - dev: true + electron-to-chromium@1.4.810: {} - /element-resize-detector@1.2.4: - resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + element-resize-detector@1.2.4: dependencies: batch-processor: 1.0.0 - dev: false - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true + emittery@0.13.1: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true + emojis-list@3.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true + encodeurl@1.0.2: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: true - /engine.io-client@3.3.3: - resolution: {integrity: sha512-PXIgpzb1brtBzh8Q6vCjzCMeu4nfEPmaDm+L3Qb2sVHwLkxC1qRiBMSjOB0NJNjZ0hbPNUKQa+s8J2XxLOIEeQ==} + engine.io-client@3.3.3: dependencies: component-emitter: 1.2.1 component-inherit: 0.0.3 @@ -6478,56 +12610,38 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /engine.io-parser@2.1.3: - resolution: {integrity: sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==} + engine.io-parser@2.1.3: dependencies: after: 0.8.2 arraybuffer.slice: 0.0.7 base64-arraybuffer: 0.1.5 blob: 0.0.5 has-binary2: 1.0.3 - dev: true - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.17.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} - hasBin: true - dev: true + env-paths@2.2.1: {} - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true + envinfo@7.13.0: {} + + errno@0.1.8: dependencies: prr: 1.0.1 - dev: true optional: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 - dev: false - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -6544,7 +12658,7 @@ packages: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -6575,85 +12689,51 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - dev: true + es-module-lexer@0.9.3: {} - /es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} - dev: true + es-module-lexer@1.5.3: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - dev: true + esbuild-plugin-alias@0.2.1: {} - /esbuild-plugin-replace@1.4.0: - resolution: {integrity: sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==} + esbuild-plugin-replace@1.4.0: dependencies: magic-string: 0.25.9 - dev: true - /esbuild-register@3.5.0(esbuild@0.18.20): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' + esbuild-register@3.5.0(esbuild@0.18.20): dependencies: - debug: 4.3.4 + debug: 4.3.5 esbuild: 0.18.20 transitivePeerDependencies: - supports-color - dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 '@esbuild/android-arm64': 0.18.20 @@ -6677,13 +12757,8 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 '@esbuild/android-arm': 0.19.12 @@ -6708,76 +12783,46 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.3.4 - enhanced-resolve: 5.16.0 + debug: 4.3.5 + enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.3 + get-tsconfig: 4.7.5 is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: @@ -6785,49 +12830,20 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -6836,72 +12852,50 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(jest@29.7.0)(typescript@4.9.5): - resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(jest@29.7.0(@types/node@20.14.8))(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) eslint: 8.57.0 - jest: 29.7.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5) + jest: 29.7.0(@types/node@20.14.8) transitivePeerDependencies: - supports-color - typescript - dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.10.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -6911,7 +12905,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -6940,73 +12934,38 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true + etag@1.8.1: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -7017,11 +12976,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -7032,11 +12988,8 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -7047,27 +13000,18 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true + exit@0.1.2: {} - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 - dev: true - /express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + express@4.19.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -7102,19 +13046,12 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true + extend@3.0.2: {} - /extract-colors@4.0.4: - resolution: {integrity: sha512-/ZfiJzkTBpTA46ZrUEmk6mtfQy+xJqS8m5N259oiF3yKjUDJprS0H4buTpMGt5IA7LMLY/gEHVx5Qx/v9PynNQ==} - dev: false + extract-colors@4.0.6: {} - /extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true + extract-zip@1.7.0: dependencies: concat-stream: 1.6.2 debug: 2.6.9 @@ -7122,117 +13059,77 @@ packages: yauzl: 2.10.0 transitivePeerDependencies: - supports-color - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 - dev: true + micromatch: 4.0.7 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} - dev: false + fast-loops@1.1.3: {} - /fast-shallow-equal@1.0.0: - resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} - dev: false + fast-shallow-equal@1.0.0: {} - /fastest-stable-stringify@2.0.2: - resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} - dev: false + fastest-levenshtein@1.0.16: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastest-stable-stringify@2.0.2: {} + + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - dev: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - dev: true - /fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} - dev: true + fetch-retry@5.0.6: {} - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-loader@6.2.0(webpack@5.91.0): - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + file-entry-cache@9.0.0: + dependencies: + flat-cache: 5.0.0 + + file-loader@6.2.0(webpack@5.92.1(esbuild@0.19.12)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.91.0(esbuild@0.19.12) - dev: true + webpack: 5.92.1(esbuild@0.19.12) - /file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + file-system-cache@2.3.0: dependencies: fs-extra: 11.1.1 ramda: 0.29.0 - dev: true - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: true - /filesize@9.0.11: - resolution: {integrity: sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA==} - engines: {node: '>= 0.4.0'} - dev: false + filesize@9.0.11: {} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -7243,280 +13140,161 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} + find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 - dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + find-up@2.1.0: dependencies: locate-path: 2.0.0 - dev: true - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flat-cache@5.0.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 - /flow-parser@0.235.1: - resolution: {integrity: sha512-s04193L4JE+ntEcQXbD6jxRRlyj9QXcgEl2W6xSjH4l9x4b0eHoCHfbYHjqf9LdZFUiM5LhgpiqsvLj/AyOyYQ==} - engines: {node: '>=0.4.0'} - dev: true + flatted@3.3.1: {} - /follow-redirects@1.15.6(debug@4.3.4): - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4 - dev: true + flow-parser@0.238.0: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + follow-redirects@1.15.6(debug@4.3.5): + optionalDependencies: + debug: 4.3.5 + + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true + forwarded@0.2.0: {} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true + fraction.js@4.3.7: {} - /framer-motion@11.1.7(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-cW11Pu53eDAXUEhv5hEiWuIXWhfkbV32PlgVISn7jRdcAiVrJ1S03YQQ0/DzoswGYYwKi4qYmHHjCzAH52eSdQ==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true + framer-motion@11.2.11(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: + tslib: 2.6.3 + optionalDependencies: + '@emotion/is-prop-valid': 1.2.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tslib: 2.6.2 - dev: false - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true + fresh@0.5.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true + fs-constants@1.0.0: {} - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} + fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: true + get-nonce@1.0.1: {} - /get-npm-tarball-url@2.1.0: - resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} - engines: {node: '>=12.17'} - dev: true + get-npm-tarball-url@2.1.0: {} - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true + get-pkg-repo@4.2.1: dependencies: '@hutson/parse-repository-url': 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: true - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true + get-port@5.1.1: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /giget@1.2.3: - resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} - hasBin: true + giget@1.2.3: dependencies: citty: 0.1.6 consola: 3.2.3 @@ -7526,89 +13304,56 @@ packages: ohash: 1.1.3 pathe: 1.1.2 tar: 6.2.1 - dev: true - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + git-remote-origin-url@2.0.0: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: true - /git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} - hasBin: true + git-semver-tags@4.1.1: dependencies: meow: 8.1.2 semver: 6.3.1 - dev: true - /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + gitconfiglocal@1.0.0: dependencies: ini: 1.3.8 - dev: true - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true + github-slugger@1.5.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-promise@4.2.2(glob@7.2.3): - resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} - engines: {node: '>=12'} - peerDependencies: - glob: ^7.1.6 + glob-promise@4.2.2(glob@7.2.3): dependencies: '@types/glob': 7.2.0 glob: 7.2.3 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.4.2: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 + foreground-child: 3.2.1 + jackspeak: 3.4.0 minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.2 - dev: true + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7616,30 +13361,29 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 - dev: true + gopd: 1.0.1 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -7647,29 +13391,20 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true + globjoin@0.1.4: {} - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + globrex@0.1.2: {} + + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true + gunzip-maybe@1.4.2: dependencies: browserify-zlib: 0.1.4 is-deflate: 1.0.0 @@ -7677,672 +13412,379 @@ packages: peek-stream: 1.1.3 pumpify: 1.5.1 through2: 2.0.5 - dev: true - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 - dev: true + uglify-js: 3.18.0 - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-binary2@1.0.3: - resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} + has-binary2@1.0.3: dependencies: isarray: 2.0.1 - dev: true - /has-cors@1.1.0: - resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} - dev: true + has-cors@1.1.0: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /help-me@3.0.0: - resolution: {integrity: sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==} + help-me@3.0.0: dependencies: glob: 7.2.3 readable-stream: 3.6.2 - dev: true - /hls.js@1.5.8: - resolution: {integrity: sha512-hJYMPfLhWO7/7+n4f9pn6bOheCGx0WgvVz7k3ouq3Pp1bja48NN+HeCQu3XCGYzqWQF/wo7Sk6dJAyWVJD8ECA==} + hls.js@1.5.11: {} - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - dev: true + html-tags@3.3.1: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true - /https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} + https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 - debug: 4.3.4 + debug: 4.3.5 transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + human-signals@4.3.1: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: true - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true + husky@8.0.3: {} - /hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} - dev: false + hyphenate-style-name@1.1.0: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - requiresBuild: true + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true optional: true - /icss-utils@5.1.0(postcss@8.4.38): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + icss-utils@5.1.0(postcss@8.4.38): dependencies: postcss: 8.4.38 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true + image-size@0.5.5: optional: true - /immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} - dev: true + immutable@4.3.6: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /indexof@0.0.1: - resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} - dev: true + indexof@0.0.1: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /inline-style-prefixer@7.0.0: - resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + inline-style-prefixer@7.0.0: dependencies: css-in-js-utils: 3.1.0 fast-loops: 1.1.3 - dev: false - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /intl-messageformat@10.5.11: - resolution: {integrity: sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==} + intl-messageformat@10.5.14: dependencies: - '@formatjs/ecma402-abstract': 1.18.2 + '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.6 - tslib: 2.6.2 - dev: false + '@formatjs/icu-messageformat-parser': 2.7.8 + tslib: 2.6.3 - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 - /ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} - dev: true - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true + ipaddr.js@1.9.1: {} - /is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - dev: true + is-absolute-url@3.0.3: {} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - dev: true + is-deflate@1.0.0: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true + is-generator-fn@2.1.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - dev: true + is-gzip@1.0.0: {} - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-interactive@1.0.0: {} - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + is-nan@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: true - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true + is-path-cwd@2.2.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - dev: true - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-object@5.0.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true + is-what@3.14.1: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + isarray@0.0.1: {} - /isarray@2.0.1: - resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} - dev: true + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.1: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isarray@2.0.5: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + isexe@2.0.0: {} - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + isobject@3.0.1: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.2: dependencies: - '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true + jake@10.9.1: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -8361,26 +13803,17 @@ packages: transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@29.7.0(@types/node@20.14.8): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0 + create-jest: 29.7.0(@types/node@20.14.8) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.7) + jest-config: 29.7.0(@types/node@20.14.8) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -8389,25 +13822,13 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /jest-config@29.7.0(@types/node@20.12.7): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@29.7.0(@types/node@20.14.8): dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 - babel-jest: 29.7.0(@babel/core@7.24.4) + babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -8421,152 +13842,107 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.8 transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - dev: true - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 - dev: true - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 jest-mock: 29.7.0 jest-util: 29.7.0 - dev: true - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-get-type@29.6.3: {} - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.12.7 + '@types/node': 20.14.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - dev: true - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 - dev: true - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 jest-util: 29.7.0 - dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: jest-resolve: 29.7.0 - dev: true - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-regex-util@29.6.3: {} - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -8577,18 +13953,15 @@ packages: resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 - dev: true - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -8606,11 +13979,8 @@ packages: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - dev: true - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8619,7 +13989,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 chalk: 4.1.2 cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 @@ -8636,21 +14006,18 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.24.4 - '@babel/generator': 7.24.4 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - '@babel/types': 7.24.0 + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -8661,26 +14028,20 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - dev: true - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: true - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -8688,225 +14049,147 @@ packages: jest-get-type: 29.6.3 leven: 3.1.0 pretty-format: 29.7.0 - dev: true - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.7 + '@types/node': 20.14.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 - dev: true - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: - '@types/node': 20.12.7 + '@types/node': 20.14.8 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: - '@types/node': 20.12.7 + '@types/node': 20.14.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.7.0(@types/node@20.14.8): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0 + jest-cli: 29.7.0(@types/node@20.14.8) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - dev: true - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true + joycon@3.1.1: {} - /js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - dev: true + js-base64@3.7.7: {} - /js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - dev: false + js-cookie@2.2.1: {} - /js-sdsl@4.3.0: - resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} - dev: true + js-sdsl@4.3.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jscodeshift@0.15.2(@babel/preset-env@7.24.4): - resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - peerDependenciesMeta: - '@babel/preset-env': - optional: true + + js-yaml@4.1.0: dependencies: - '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) - '@babel/preset-env': 7.24.4(@babel/core@7.24.4) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.4) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) - '@babel/register': 7.23.7(@babel/core@7.24.4) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.4) + argparse: 2.0.1 + + jscodeshift@0.15.2(@babel/preset-env@7.24.7(@babel/core@7.24.7)): + dependencies: + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7) + '@babel/preset-flow': 7.24.7(@babel/core@7.24.7) + '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/register': 7.24.6(@babel/core@7.24.7) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.7) chalk: 4.1.2 - flow-parser: 0.235.1 + flow-parser: 0.238.0 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 neo-async: 2.6.2 node-dir: 0.1.17 - recast: 0.23.6 + recast: 0.23.9 temp: 0.8.4 write-file-atomic: 2.4.3 + optionalDependencies: + '@babel/preset-env': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json-stringify-safe@5.0.1: {} + + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true + kleur@3.0.3: {} - /lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} + known-css-properties@0.31.0: {} + + lazy-universal-dotenv@4.0.0: dependencies: app-root-dir: 1.0.2 dotenv: 16.4.5 dotenv-expand: 10.0.0 - dev: true - /less@4.2.0: - resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} - engines: {node: '>=6'} - hasBin: true + ldjson-stream@1.2.1: + dependencies: + split2: 0.2.1 + through2: 0.6.5 + + less@4.2.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.2 + tslib: 2.6.3 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -8915,65 +14198,34 @@ packages: mime: 1.6.0 needle: 3.3.1 source-map: 0.6.1 - dev: true - /leven@2.1.0: - resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} - engines: {node: '>=0.10.0'} - dev: true + leven@2.1.0: {} - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true + lilconfig@2.1.0: {} - /lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - dev: true + lilconfig@3.1.2: {} - /line-height@0.3.1: - resolution: {integrity: sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==} - engines: {node: '>= 4.0.0'} + line-height@0.3.1: dependencies: computed-style: 0.1.4 - dev: false - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /linkify-react@4.1.3(linkifyjs@4.1.3)(react@18.3.1): - resolution: {integrity: sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA==} - peerDependencies: - linkifyjs: ^4.0.0 - react: '>= 15.0.0' + linkify-react@4.1.3(linkifyjs@4.1.3)(react@18.3.1): dependencies: linkifyjs: 4.1.3 react: 18.3.1 - dev: false - /linkifyjs@4.1.3: - resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} - dev: false + linkifyjs@4.1.3: {} - /lint-staged@13.3.0: - resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true + lint-staged@13.3.0: dependencies: chalk: 5.3.0 commander: 11.0.0 @@ -8988,260 +14240,158 @@ packages: transitivePeerDependencies: - enquirer - supports-color - dev: true - /listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} - engines: {node: '>=16.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + listr2@6.6.1: dependencies: cli-truncate: 3.1.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 5.0.1 - rfdc: 1.3.1 + rfdc: 1.4.1 wrap-ansi: 8.1.0 - dev: true - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + load-tsconfig@0.2.5: {} - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.0: {} - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true + lodash.debounce@4.0.8: {} - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true + lodash.ismatch@4.4.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true + lodash.sortby@4.7.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash.truncate@4.4.2: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + lodash@4.17.21: {} + + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 cli-cursor: 4.0.0 slice-ansi: 5.0.0 strip-ansi: 7.1.0 wrap-ansi: 8.1.0 - dev: true - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.2.2: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - dev: true - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} + magic-string@0.27.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.2 - dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: - semver: 7.6.0 - dev: true + semver: 7.6.2 - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true + make-error@1.3.6: {} - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - dev: true - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - dev: true + map-or-similar@1.5.0: {} - /markdown-to-jsx@7.4.7(react@18.3.1): - resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} - engines: {node: '>= 10'} - peerDependencies: - react: '>= 0.14.0' + markdown-to-jsx@7.4.7(react@18.3.1): dependencies: react: 18.3.1 - dev: true - /mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + mathml-tag-names@2.1.3: {} + + mdast-util-definitions@4.0.0: dependencies: unist-util-visit: 2.0.3 - dev: true - /mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - dev: true + mdast-util-to-string@1.1.0: {} - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: false + mdn-data@2.0.14: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true + mdn-data@2.0.30: {} - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false + media-typer@0.3.0: {} - /memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memoize-one@5.2.1: {} + + memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 - dev: true - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + meow@13.2.0: {} + + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -9254,189 +14404,109 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 - dev: true - /millify@6.1.0: - resolution: {integrity: sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==} - hasBin: true + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + millify@6.1.0: dependencies: yargs: 17.7.2 - dev: false - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true + mime@1.6.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mime@2.6.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: true - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true + minipass@5.0.0: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.1.2: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true - /mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - dev: true + mitt@3.0.1: {} - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true + mkdirp-classic@0.5.3: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true + modern-normalize@2.0.0: {} - /mqtt-packet@6.10.0: - resolution: {integrity: sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==} + modify-values@1.0.1: {} + + mqtt-packet@6.10.0: dependencies: bl: 4.1.0 - debug: 4.3.4 + debug: 4.3.5 process-nextick-args: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /mqtt@4.3.8: - resolution: {integrity: sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==} - engines: {node: '>=10.0.0'} - hasBin: true + mqtt@4.3.8: dependencies: commist: 1.1.0 concat-stream: 2.0.0 - debug: 4.3.4 + debug: 4.3.5 duplexify: 4.1.3 help-me: 3.0.0 inherits: 2.0.4 @@ -9447,41 +14517,36 @@ packages: pump: 3.0.0 readable-stream: 3.6.2 reinterval: 1.1.0 - rfdc: 1.3.1 + rfdc: 1.4.1 split2: 3.2.2 - ws: 7.5.9 + ws: 7.5.10 xtend: 4.0.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: true - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + multimatch@5.0.0: + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - /nano-css@5.6.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} - peerDependencies: - react: '*' - react-dom: '*' + nano-css@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@jridgewell/sourcemap-codec': 1.4.15 css-tree: 1.1.3 @@ -9493,249 +14558,144 @@ packages: rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 stylis: 4.3.2 - dev: false - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true + needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.3.0 - dev: true + sax: 1.4.1 optional: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 - dev: true - /node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - dev: true + node-fetch-native@1.6.4: {} - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-int64@0.4.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true + node-releases@2.0.14: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-range@0.1.2: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /number-allocator@1.0.14: - resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} + number-allocator@1.0.14: dependencies: - debug: 4.3.4 + debug: 4.3.5 js-sdsl: 4.3.0 transitivePeerDependencies: - supports-color - dev: true - /nypm@0.3.8: - resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true + nypm@0.3.8: dependencies: citty: 0.1.6 consola: 3.2.3 execa: 8.0.1 pathe: 1.1.2 ufo: 1.5.3 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - /object-component@0.0.3: - resolution: {integrity: sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==} - dev: true + object-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: true + object-component@0.0.3: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-hash@3.0.0: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-inspect@1.13.1: {} + + object-is@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} - dev: true + ohash@1.1.3: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true + on-headers@1.0.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -9743,11 +14703,8 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -9758,468 +14715,254 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: true + package-json-from-dist@1.0.0: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + pako@0.2.9: {} + + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true + parse-node-version@1.0.1: {} - /parseqs@0.0.5: - resolution: {integrity: sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==} + parseqs@0.0.5: dependencies: better-assert: 1.0.2 - dev: true - /parseuri@0.0.5: - resolution: {integrity: sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==} + parseuri@0.0.5: dependencies: better-assert: 1.0.2 - dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true + parseurl@1.3.3: {} - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 - minipass: 7.0.4 - dev: true + minipass: 7.1.2 - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true + path-to-regexp@0.1.7: {} - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + pathe@1.1.2: {} - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 duplexify: 3.7.1 through2: 2.0.5 - dev: true - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true + pend@1.2.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.1: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picomatch@2.3.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.6.0: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true + pify@2.3.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pify@3.0.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - requiresBuild: true - dev: true + pify@4.0.1: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 - dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 - dev: true - /polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} - engines: {node: '>=10'} + polished@4.3.1: dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.7 - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-load-config@3.1.4(postcss@8.4.38): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@3.1.4(postcss@8.4.38): dependencies: lilconfig: 2.1.0 - postcss: 8.4.38 yaml: 1.10.2 - dev: true + optionalDependencies: + postcss: 8.4.38 - /postcss-load-config@4.0.2(postcss@8.4.38): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.2(postcss@8.4.38): dependencies: - lilconfig: 3.1.1 + lilconfig: 3.1.2 + yaml: 2.4.5 + optionalDependencies: postcss: 8.4.38 - yaml: 2.4.2 - dev: true - /postcss-modules-extract-imports@3.1.0(postcss@8.4.38): - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-extract-imports@3.1.0(postcss@8.4.38): dependencies: postcss: 8.4.38 - dev: true - /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): - resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-local-by-default@4.0.5(postcss@8.4.38): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.1.0 postcss-value-parser: 4.2.0 - dev: true - /postcss-modules-scope@3.2.0(postcss@8.4.38): - resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-scope@3.2.0(postcss@8.4.38): dependencies: postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: true + postcss-selector-parser: 6.1.0 - /postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} + postcss-resolve-nested-selector@0.1.1: {} + + postcss-safe-parser@7.0.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + + postcss-selector-parser@6.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier@2.4.0: - resolution: {integrity: sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.4.0: {} - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.3.1 - dev: true + react-is: 18.1.0 - /pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: true + pretty-hrtime@1.0.3: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + process-nextick-args@2.0.1: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true + process@0.11.10: {} - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true + progress@2.0.3: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true - dev: true + prr@1.0.1: optional: true - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + pump@2.0.1: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + pumpify@1.5.1: dependencies: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 - dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /puppeteer-core@2.1.1: - resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} - engines: {node: '>=8.16.0'} + puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.4 - debug: 4.3.4 + debug: 4.3.5 extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -10227,97 +14970,125 @@ packages: progress: 2.0.3 proxy-from-env: 1.1.0 rimraf: 2.7.1 - ws: 6.2.2 + ws: 6.2.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: true - - /pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - dev: true - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true + pure-rand@6.1.0: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: true + q@1.5.1: {} - /qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: side-channel: 1.0.6 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + quick-lru@4.0.1: {} - /ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - dev: true + ramda@0.29.0: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true + range-parser@1.2.1: {} - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /react-colorful@5.6.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react-aria-components@1.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@internationalized/date': 3.5.4 + '@internationalized/string': 3.2.3 + '@react-aria/color': 3.0.0-beta.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/toolbar': 3.0.0-beta.5(react@18.3.1) + '@react-aria/tree': 3.0.0-alpha.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-stately/color': 3.6.1(react@18.3.1) + '@react-stately/menu': 3.7.1(react@18.3.1) + '@react-stately/table': 3.11.8(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/color': 3.0.0-beta.25(react@18.3.1) + '@react-types/form': 3.7.4(react@18.3.1) + '@react-types/grid': 3.2.6(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + '@react-types/table': 3.9.5(react@18.3.1) + '@swc/helpers': 0.5.11 + client-only: 0.0.1 + react: 18.3.1 + react-aria: 3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-stately: 3.31.1(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) + + react-aria@3.33.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@internationalized/string': 3.2.3 + '@react-aria/breadcrumbs': 3.5.13(react@18.3.1) + '@react-aria/button': 3.9.5(react@18.3.1) + '@react-aria/calendar': 3.5.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/checkbox': 3.14.3(react@18.3.1) + '@react-aria/combobox': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/datepicker': 3.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dialog': 3.5.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dnd': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/gridlist': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/i18n': 3.11.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/label': 3.7.8(react@18.3.1) + '@react-aria/link': 3.7.1(react@18.3.1) + '@react-aria/listbox': 3.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/meter': 3.4.13(react@18.3.1) + '@react-aria/numberfield': 3.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/progress': 3.4.13(react@18.3.1) + '@react-aria/radio': 3.10.4(react@18.3.1) + '@react-aria/searchfield': 3.7.5(react@18.3.1) + '@react-aria/select': 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.18.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/separator': 3.3.13(react@18.3.1) + '@react-aria/slider': 3.7.8(react@18.3.1) + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-aria/switch': 3.6.4(react@18.3.1) + '@react-aria/table': 3.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tabs': 3.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tag': 3.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/textfield': 3.14.5(react@18.3.1) + '@react-aria/tooltip': 3.7.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-aria/visually-hidden': 3.8.12(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true - /react-docgen-typescript@2.2.2(typescript@4.9.5): - resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} - peerDependencies: - typescript: '>= 4.3.x' + react-docgen-typescript@2.2.2(typescript@4.9.5): dependencies: typescript: 4.9.5 - dev: true - /react-docgen@7.0.3: - resolution: {integrity: sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==} - engines: {node: '>=16.14.0'} + react-docgen@7.0.3: dependencies: - '@babel/core': 7.24.4 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/core': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 @@ -10325,103 +15096,59 @@ packages: strip-indent: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - /react-element-to-jsx-string@15.0.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} - peerDependencies: - react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@base2/pretty-print-object': 1.0.1 is-plain-object: 5.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.1.0 - dev: true - /react-hook-form@7.51.3(react@18.3.1): - resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} - engines: {node: '>=12.22.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react-hook-form@7.52.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /react-infinite-scroll-component@6.1.0(react@18.3.1): - resolution: {integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==} - peerDependencies: - react: '>=16.0.0' + react-infinite-scroll-component@6.1.0(react@18.3.1): dependencies: react: 18.3.1 throttle-debounce: 2.3.0 - dev: false - /react-insta-stories@2.6.2(react@18.3.1): - resolution: {integrity: sha512-eM1YHr92bV7WK5h9sECjyYnqZtPxnzJrZFr9IaoDcaZaAEOHVRav+pST513DIG8Hk8QjSTHtdvHHZ0Ka5HwH8w==} - peerDependencies: - react: '>=16.8.2' + react-insta-stories@2.7.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /react-intl@6.6.5(react@18.3.1)(typescript@4.9.5): - resolution: {integrity: sha512-OErDPbGqus0QKVj77MGCC9Plbnys3CDQrq6Lw41c60pmeTdn41AhoS1SIzXG6SUlyF7qNN2AVqfrrIvHUgSyLQ==} - peerDependencies: - react: ^16.6.0 || 17 || 18 - typescript: ^4.7 || 5 - peerDependenciesMeta: - typescript: - optional: true + react-intl@6.6.8(react@18.3.1)(typescript@4.9.5): dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/icu-messageformat-parser': 2.7.6 - '@formatjs/intl': 2.10.1(typescript@4.9.5) - '@formatjs/intl-displaynames': 6.6.6 - '@formatjs/intl-listformat': 7.5.5 + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/icu-messageformat-parser': 2.7.8 + '@formatjs/intl': 2.10.4(typescript@4.9.5) + '@formatjs/intl-displaynames': 6.6.8 + '@formatjs/intl-listformat': 7.5.7 '@types/hoist-non-react-statics': 3.3.5 '@types/react': 17.0.80 hoist-non-react-statics: 3.3.2 - intl-messageformat: 10.5.11 + intl-messageformat: 10.5.14 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.6.3 + optionalDependencies: typescript: 4.9.5 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - dev: true + react-is@16.13.1: {} - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true + react-is@18.1.0: {} - /react-loading-skeleton@3.4.0(react@18.3.1): - resolution: {integrity: sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==} - peerDependencies: - react: '>=16.8.0' + react-loading-skeleton@3.4.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /react-mentions@4.4.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-JHiQlgF1oSZR7VYPjq32wy97z1w1oE4x10EuhKjPr4WUKhVzG1uFQhQjKqjQkbVqJrmahf+ldgBTv36NrkpKpA==} - peerDependencies: - react: '>=16.8.3' - react-dom: '>=16.8.3' + react-mentions@4.4.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.4.5 invariant: 2.2.4 @@ -10429,173 +15156,134 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) substyle: 9.4.1(react@18.3.1) - dev: false - - /react-modal-sheet@2.2.0(framer-motion@11.1.7)(react@18.3.1): - resolution: {integrity: sha512-OAIWuVWxMx3zQqrMLbYWnczadplg0WLd+AaBWmN5+ysNF5/pneqjkOV3AWaIZOCIF4TcrejiCsTduutbzCRP2Q==} - engines: {node: '>=16'} - peerDependencies: - framer-motion: '>=6' - react: '>=16' + + react-modal-sheet@2.2.1(framer-motion@11.2.11(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@react-aria/utils': 3.17.0(react@18.3.1) - framer-motion: 11.1.7(react-dom@18.3.1)(react@18.3.1) + framer-motion: 11.2.11(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - dev: false - /react-native-uuid@2.0.2: - resolution: {integrity: sha512-5ypj/hV58P+6VREdjkW0EudSibsH3WdqDERoHKnD9syFWjF+NfRWWrJb2sa3LIwI5zpzMvUiabs+DX40WHpEMw==} - engines: {node: '>=10.0.0', npm: '>=6.0.0'} - dev: true + react-native-uuid@2.0.2: {} - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.14.2: {} - /react-remove-scroll-bar@2.3.6(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-remove-scroll-bar@2.3.6(@types/react@17.0.80)(react@18.3.1): dependencies: - '@types/react': 17.0.80 react: 18.3.1 react-style-singleton: 2.2.1(@types/react@17.0.80)(react@18.3.1) - tslib: 2.6.2 - dev: true + tslib: 2.6.3 + optionalDependencies: + '@types/react': 17.0.80 - /react-remove-scroll@2.5.5(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-remove-scroll@2.5.5(@types/react@17.0.80)(react@18.3.1): dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@17.0.80)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@17.0.80)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@17.0.80)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@17.0.80)(react@18.3.1) + optionalDependencies: '@types/react': 17.0.80 + + react-remove-scroll@2.5.7(@types/react@17.0.80)(react@18.3.1): + dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.6(@types/react@17.0.80)(react@18.3.1) react-style-singleton: 2.2.1(@types/react@17.0.80)(react@18.3.1) - tslib: 2.6.2 + tslib: 2.6.3 use-callback-ref: 1.3.2(@types/react@17.0.80)(react@18.3.1) use-sidecar: 1.1.2(@types/react@17.0.80)(react@18.3.1) - dev: true + optionalDependencies: + '@types/react': 17.0.80 - /react-router-dom@6.23.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react-router-dom@6.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/router': 1.16.0 + '@remix-run/router': 1.16.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.23.0(react@18.3.1) - dev: true + react-router: 6.23.1(react@18.3.1) - /react-router@6.23.0(react@18.3.1): - resolution: {integrity: sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' + react-router@6.23.1(react@18.3.1): dependencies: - '@remix-run/router': 1.16.0 + '@remix-run/router': 1.16.1 react: 18.3.1 - dev: true - /react-sizeme@3.0.2: - resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} + react-sizeme@3.0.2: dependencies: element-resize-detector: 1.2.4 invariant: 2.2.4 shallowequal: 1.1.0 throttle-debounce: 3.0.1 - dev: false - /react-style-singleton@2.2.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-stately@3.31.1(react@18.3.1): + dependencies: + '@react-stately/calendar': 3.5.1(react@18.3.1) + '@react-stately/checkbox': 3.6.5(react@18.3.1) + '@react-stately/collections': 3.10.7(react@18.3.1) + '@react-stately/combobox': 3.8.4(react@18.3.1) + '@react-stately/data': 3.11.4(react@18.3.1) + '@react-stately/datepicker': 3.9.4(react@18.3.1) + '@react-stately/dnd': 3.3.1(react@18.3.1) + '@react-stately/form': 3.0.3(react@18.3.1) + '@react-stately/list': 3.10.5(react@18.3.1) + '@react-stately/menu': 3.7.1(react@18.3.1) + '@react-stately/numberfield': 3.9.3(react@18.3.1) + '@react-stately/overlays': 3.6.7(react@18.3.1) + '@react-stately/radio': 3.10.4(react@18.3.1) + '@react-stately/searchfield': 3.5.3(react@18.3.1) + '@react-stately/select': 3.6.4(react@18.3.1) + '@react-stately/selection': 3.15.1(react@18.3.1) + '@react-stately/slider': 3.5.4(react@18.3.1) + '@react-stately/table': 3.11.8(react@18.3.1) + '@react-stately/tabs': 3.6.6(react@18.3.1) + '@react-stately/toggle': 3.7.4(react@18.3.1) + '@react-stately/tooltip': 3.4.9(react@18.3.1) + '@react-stately/tree': 3.8.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) + react: 18.3.1 + + react-style-singleton@2.2.1(@types/react@17.0.80)(react@18.3.1): dependencies: - '@types/react': 17.0.80 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 - tslib: 2.6.2 - dev: true + tslib: 2.6.3 + optionalDependencies: + '@types/react': 17.0.80 - /react-textarea-autosize@8.5.3(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-textarea-autosize@8.5.3(@types/react@17.0.80)(react@18.3.1): dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.7 react: 18.3.1 use-composed-ref: 1.3.0(react@18.3.1) use-latest: 1.2.1(@types/react@17.0.80)(react@18.3.1) transitivePeerDependencies: - '@types/react' - dev: false - /react-timeago@7.2.0(react@18.3.1): - resolution: {integrity: sha512-2KsBEEs+qRhKx/kekUVNSTIpop3Jwd7SRBm0R4Eiq3mPeswRGSsftY9FpKsE/lXLdURyQFiHeHFrIUxLYskG5g==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-timeago@7.2.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /react-tiny-popover@7.2.4(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-T7ZSwXcUtPXCog3Bux9+TjoTvUeMi/+zI0Yv/TkIznZCWUg0XTt2797G0IiT5mTVeJeLivUzdOmKA1hOQdMfOQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-tiny-popover@7.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /react-truncate-markup@5.1.2(react@18.3.1): - resolution: {integrity: sha512-eEq6T8Rs+wz98cRYzQECGFNBfXwRYraLg/kz52f6DRBKmzxqB+GYLeDkVe/zrC+2vh5AEwM6nSYFvDWEBljd0w==} - peerDependencies: - react: '>=16.3' + react-truncate-markup@5.1.2(react@18.3.1): dependencies: line-height: 0.3.1 memoize-one: 5.2.1 prop-types: 15.8.1 react: 18.3.1 resize-observer-polyfill: 1.5.1 - dev: false - /react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.2): - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} - peerDependencies: - react: '*' - tslib: '*' + react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.3): dependencies: react: 18.3.1 - tslib: 2.6.2 - dev: false + tslib: 2.6.3 - /react-use@17.5.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==} - peerDependencies: - react: '*' - react-dom: '*' + react-use@17.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -10603,62 +15291,60 @@ packages: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.1(react-dom@18.3.1)(react@18.3.1) + nano-css: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.2) + react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.3) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 throttle-debounce: 3.0.1 ts-easing: 0.2.0 - tslib: 2.6.2 - dev: false + tslib: 2.6.3 - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -10667,80 +15353,52 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /recast@0.23.6: - resolution: {integrity: sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==} - engines: {node: '>= 4'} + recast@0.23.9: dependencies: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 - dev: true + tslib: 2.6.3 - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 - dev: true - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true + regenerate@1.4.2: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false + regenerator-runtime@0.13.11: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-runtime@0.14.1: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.4 - dev: true + '@babel/runtime': 7.24.7 - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -10748,261 +15406,162 @@ packages: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - dev: true - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - dev: true - /reinterval@1.1.0: - resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} - dev: true + reinterval@1.1.0: {} - /remark-external-links@8.0.0: - resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + remark-external-links@8.0.0: dependencies: extend: 3.0.2 is-absolute-url: 3.0.3 mdast-util-definitions: 4.0.0 space-separated-tokens: 1.1.5 unist-util-visit: 2.0.3 - dev: true - /remark-slug@6.1.0: - resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + remark-slug@6.1.0: dependencies: github-slugger: 1.5.0 mdast-util-to-string: 1.1.0 unist-util-visit: 2.0.3 - dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /reserved-words@0.1.2: - resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} - dev: true + require-from-string@2.0.2: {} - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false + reserved-words@0.1.2: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resize-observer-polyfill@1.5.1: {} + + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true + resolve.exports@2.0.2: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.4.1: {} - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true + rimraf@2.6.3: dependencies: glob: 7.2.3 - dev: true - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true + rimraf@2.7.1: dependencies: glob: 7.2.3 - dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.29.4: optionalDependencies: fsevents: 2.3.3 - dev: true - /rollup@4.17.1: - resolution: {integrity: sha512-0gG94inrUtg25sB2V/pApwiv1lUb0bQ25FPNuzO89Baa+B+c0ccaaBKM5zkZV/12pUUdH+lWCSm9wmHqyocuVQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.18.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.1 - '@rollup/rollup-android-arm64': 4.17.1 - '@rollup/rollup-darwin-arm64': 4.17.1 - '@rollup/rollup-darwin-x64': 4.17.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.1 - '@rollup/rollup-linux-arm-musleabihf': 4.17.1 - '@rollup/rollup-linux-arm64-gnu': 4.17.1 - '@rollup/rollup-linux-arm64-musl': 4.17.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.1 - '@rollup/rollup-linux-riscv64-gnu': 4.17.1 - '@rollup/rollup-linux-s390x-gnu': 4.17.1 - '@rollup/rollup-linux-x64-gnu': 4.17.1 - '@rollup/rollup-linux-x64-musl': 4.17.1 - '@rollup/rollup-win32-arm64-msvc': 4.17.1 - '@rollup/rollup-win32-ia32-msvc': 4.17.1 - '@rollup/rollup-win32-x64-msvc': 4.17.1 + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 - dev: true - /rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + rtl-css-js@1.16.1: dependencies: - '@babel/runtime': 7.24.4 - dev: false + '@babel/runtime': 7.24.7 - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /sass@1.75.0: - resolution: {integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==} - engines: {node: '>=14.0.0'} - hasBin: true + sass@1.77.6: dependencies: chokidar: 3.6.0 - immutable: 4.3.5 + immutable: 4.3.6 source-map-js: 1.2.0 - dev: true - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: true + sax@1.3.0: {} - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + sax@1.4.1: + optional: true + + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} - dev: false + screenfull@5.2.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true + semver@7.6.2: {} - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -11019,17 +15578,12 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -11037,11 +15591,8 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -11049,87 +15600,57 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /set-harmonic-interval@1.0.1: - resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} - engines: {node: '>=6.9'} - dev: false + set-harmonic-interval@1.0.1: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true + setprototypeof@1.2.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - dev: true - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + shallowequal@1.1.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /socket.io-client@2.2.0: - resolution: {integrity: sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==} + socket.io-client@2.2.0: dependencies: backo2: 1.0.2 base64-arraybuffer: 0.1.5 @@ -11149,141 +15670,91 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /socket.io-parser@3.3.3: - resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==} + socket.io-parser@3.3.3: dependencies: component-emitter: 1.3.1 debug: 3.1.0 isarray: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.6: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.7.4: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true + sourcemap-codec@1.4.8: {} - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - dev: true + space-separated-tokens@1.1.5: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true + spdx-license-ids: 3.0.18 - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true + spdx-license-ids: 3.0.18 - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.18: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@0.2.1: + dependencies: + through2: 0.6.5 + + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + split@1.0.1: dependencies: through: 2.3.8 - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 - dev: false - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - dev: true - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: false + stackframe@1.3.4: {} - /stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + stacktrace-gps@3.1.2: dependencies: source-map: 0.5.6 stackframe: 1.3.4 - dev: false - /stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + stacktrace-js@2.0.2: dependencies: error-stack-parser: 2.1.4 stack-generator: 2.0.10 stacktrace-gps: 3.1.2 - dev: false - /standard-version@9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} - hasBin: true + standard-version@9.5.0: dependencies: chalk: 2.4.2 conventional-changelog: 3.1.25 @@ -11296,296 +15767,258 @@ packages: figures: 3.2.0 find-up: 5.0.0 git-semver-tags: 4.1.1 - semver: 7.6.0 + semver: 7.6.2 stringify-package: 1.0.1 yargs: 16.2.0 - dev: true - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true + statuses@2.0.1: {} - /store2@2.14.3: - resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} - dev: true + store2@2.14.3: {} - /storybook@7.6.18: - resolution: {integrity: sha512-AUhWAVISi+qTsfpJlVuo65VfhqWtapkqJDXA/bK+4actBR9DpRXXwow6xJQJH5wrp8TZk0X9Pkqm3fykTQ5MCA==} - hasBin: true + storybook@7.6.20: dependencies: - '@storybook/cli': 7.6.18 + '@storybook/cli': 7.6.20 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - dev: true - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: true + stream-shift@1.0.3: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@0.10.31: {} + + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-package@1.0.1: - resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} - deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - dev: true + stringify-package@1.0.1: {} - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + strip-indent@4.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /styled-components@6.1.8(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} - engines: {node: '>= 16'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' + styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@emotion/is-prop-valid': 1.2.1 - '@emotion/unitless': 0.8.0 - '@types/stylis': 4.2.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.5 css-to-react-native: 3.2.0 - csstype: 3.1.2 - postcss: 8.4.31 + csstype: 3.1.3 + postcss: 8.4.38 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 - stylis: 4.3.1 - tslib: 2.5.0 - dev: true + stylis: 4.3.2 + tslib: 2.6.2 - /stylis@4.3.1: - resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} - dev: true + stylelint-config-recommended@14.0.1(stylelint@16.6.1(typescript@4.9.5)): + dependencies: + stylelint: 16.6.1(typescript@4.9.5) - /stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - dev: false + stylelint-config-standard@36.0.1(stylelint@16.6.1(typescript@4.9.5)): + dependencies: + stylelint: 16.6.1(typescript@4.9.5) + stylelint-config-recommended: 14.0.1(stylelint@16.6.1(typescript@4.9.5)) - /stylus@0.62.0: - resolution: {integrity: sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==} - hasBin: true + stylelint-no-unsupported-browser-features@8.0.1(stylelint@16.6.1(typescript@4.9.5)): + dependencies: + doiuse: 6.0.2 + postcss: 8.4.38 + stylelint: 16.6.1(typescript@4.9.5) + + stylelint@16.6.1(typescript@4.9.5): + dependencies: + '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) + '@csstools/css-tokenizer': 2.3.1 + '@csstools/media-query-list-parser': 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@4.9.5) + css-functions-list: 3.2.2 + css-tree: 2.3.1 + debug: 4.3.5 + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 9.0.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.31.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 7.0.0(postcss@8.4.38) + postcss-selector-parser: 6.1.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 7.1.0 + supports-hyperlinks: 3.0.0 + svg-tags: 1.0.0 + table: 6.8.2 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + stylis@4.3.2: {} + + stylus@0.62.0: dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.3.4 + debug: 4.3.5 glob: 7.2.3 sax: 1.3.0 source-map: 0.7.4 transitivePeerDependencies: - supports-color - dev: true - /substyle@9.4.1(react@18.3.1): - resolution: {integrity: sha512-VOngeq/W1/UkxiGzeqVvDbGDPM8XgUyJVWjrqeh+GgKqspEPiLYndK+XRcsKUHM5Muz/++1ctJ1QCF/OqRiKWA==} - peerDependencies: - react: '>=16.8.3' + substyle@9.4.1(react@18.3.1): dependencies: '@babel/runtime': 7.4.5 invariant: 2.2.4 react: 18.3.1 - dev: false - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.12 + glob: 10.4.2 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-hyperlinks@3.0.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 - /svg-url-loader@7.1.1(webpack@5.91.0): - resolution: {integrity: sha512-NlsMCePODm7FQhU9aEZyGLPx5Xe1QRI1cSEUE6vTq5LJc9l9pStagvXoEIyZ9O3r00w6G3+Wbkimb+SC3DI/Aw==} - engines: {node: '>=10'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + svg-url-loader@7.1.1(webpack@5.92.1(esbuild@0.19.12)): dependencies: - file-loader: 6.2.0(webpack@5.91.0) + file-loader: 6.2.0(webpack@5.92.1(esbuild@0.19.12)) loader-utils: 2.0.4 - webpack: 5.91.0(esbuild@0.19.12) - dev: true + webpack: 5.92.1(esbuild@0.19.12) - /synchronous-promise@2.0.17: - resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - dev: true + synchronous-promise@2.0.17: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + table@6.8.2: + dependencies: + ajv: 8.16.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tapable@2.2.1: {} + + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -11593,418 +16026,231 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true - /telejson@7.2.0: - resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + telejson@7.2.0: dependencies: memoizerific: 1.11.3 - dev: true - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: true + temp-dir@2.0.0: {} - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} + temp@0.8.4: dependencies: rimraf: 2.6.3 - dev: true - /tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} + tempy@1.0.1: dependencies: del: 6.1.1 is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: true - /terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.91.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.92.1(esbuild@0.19.12)): dependencies: '@jridgewell/trace-mapping': 0.3.25 - esbuild: 0.19.12 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.30.4 - webpack: 5.91.0(esbuild@0.19.12) - dev: true + terser: 5.31.1 + webpack: 5.92.1(esbuild@0.19.12) + optionalDependencies: + esbuild: 0.19.12 - /terser@5.30.4: - resolution: {integrity: sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==} - engines: {node: '>=10'} - hasBin: true + terser@5.31.1: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true + text-extensions@1.9.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /throttle-debounce@2.3.0: - resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} - engines: {node: '>=8'} - dev: false + throttle-debounce@2.3.0: {} - /throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} - dev: false + throttle-debounce@3.0.1: {} - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@0.6.5: + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.2 + + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: true - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: true + tiny-invariant@1.3.3: {} - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true + tmpl@1.0.5: {} - /to-array@0.1.4: - resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} - dev: true + to-array@0.1.4: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /tocbot@4.27.13: - resolution: {integrity: sha512-zS8GVVg14x/KBTxbvF6s3BNLltfMNZxTPaBpj+FjuwmnSv+ZK0trNN4uV5Ptw64NLFi2E30gt33+/a1Fkt3cWQ==} - dev: true + tocbot@4.28.2: {} - /toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - dev: false + toggle-selection@1.0.6: {} - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true + toidentifier@1.0.1: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: true - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /ts-api-utils@1.3.0(typescript@4.9.5): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@4.9.5): dependencies: typescript: 4.9.5 - dev: true - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: true + ts-dedent@2.2.0: {} - /ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - dev: false + ts-easing@0.2.0: {} - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + ts-interface-checker@0.1.13: {} - /ts-jest@29.1.2(@babel/core@7.24.4)(esbuild@0.19.12)(jest@29.7.0)(typescript@4.9.5): - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.14.8))(typescript@4.9.5): dependencies: - '@babel/core': 7.24.4 bs-logger: 0.2.6 - esbuild: 0.19.12 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0 + jest: 29.7.0(@types/node@20.14.8) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.0 + semver: 7.6.2 typescript: 4.9.5 yargs-parser: 21.1.1 - dev: true + optionalDependencies: + '@babel/core': 7.24.7 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) + esbuild: 0.19.12 - /tsconfck@3.0.3(typescript@4.9.5): - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: + tsconfck@3.1.0(typescript@4.9.5): + optionalDependencies: typescript: 4.9.5 - dev: true - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true + tslib@1.14.1: {} - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: true + tslib@2.6.2: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.3: {} - /tsup@7.3.0(postcss@8.4.38)(typescript@4.9.5): - resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==} - engines: {node: '>=18'} - deprecated: Breaking node 16 - hasBin: true - peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + tsup@7.3.0(postcss@8.4.38)(typescript@4.9.5): dependencies: - bundle-require: 4.0.3(esbuild@0.19.12) + bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.4 + debug: 4.3.5 esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss: 8.4.38 postcss-load-config: 4.0.2(postcss@8.4.38) resolve-from: 5.0.0 - rollup: 4.17.1 + rollup: 4.18.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 typescript: 4.9.5 transitivePeerDependencies: - supports-color - ts-node - dev: true - /tsutils@3.21.0(typescript@4.9.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsutils@3.21.0(typescript@4.9.5): dependencies: tslib: 1.14.1 typescript: 4.9.5 - dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - dev: true + type-fest@0.16.0: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + type-fest@0.18.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true - - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -12012,11 +16258,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -12024,16 +16267,10 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true + typedarray@0.0.6: {} - /typescript-plugin-css-modules@5.1.0(typescript@4.9.5): - resolution: {integrity: sha512-6h+sLBa4l+XYSTn/31vZHd/1c3SvAbLpobY6FxDiUOHJQG1eD9Gh3eCs12+Eqc+TCOAdxcO+zAPvUq0jBfdciw==} - peerDependencies: - typescript: '>=4.0.0' + typescript-plugin-css-modules@5.1.0(typescript@4.9.5): dependencies: '@types/postcss-modules-local-by-default': 4.0.2 '@types/postcss-modules-scope': 3.0.4 @@ -12047,7 +16284,7 @@ packages: postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) postcss-modules-scope: 3.2.0(postcss@8.4.38) reserved-words: 0.1.2 - sass: 1.75.0 + sass: 1.77.6 source-map-js: 1.2.0 stylus: 0.62.0 tsconfig-paths: 4.2.0 @@ -12055,366 +16292,212 @@ packages: transitivePeerDependencies: - supports-color - ts-node - dev: true - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true + typescript@4.9.5: {} - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true + ufo@1.5.3: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.18.0: optional: true - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + undici-types@5.26.5: {} - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true + unicode-canonical-property-names-ecmascript@2.0.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - dev: true - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true + unicode-property-aliases-ecmascript@2.1.0: {} - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - dev: true - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: true + unist-util-is@4.1.0: {} - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@3.1.1: dependencies: '@types/unist': 2.0.10 unist-util-is: 4.1.0 - dev: true - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@2.0.3: dependencies: '@types/unist': 2.0.10 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: true - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true + unpipe@1.0.0: {} - /unplugin@1.10.1: - resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} - engines: {node: '>=14.0.0'} + unplugin@1.10.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.0 chokidar: 3.6.0 webpack-sources: 3.2.3 - webpack-virtual-modules: 0.6.1 - dev: true + webpack-virtual-modules: 0.6.2 - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true + untildify@4.0.0: {} - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 - picocolors: 1.0.0 - dev: true + picocolors: 1.0.1 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /use-callback-ref@1.3.2(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-callback-ref@1.3.2(@types/react@17.0.80)(react@18.3.1): dependencies: - '@types/react': 17.0.80 react: 18.3.1 - tslib: 2.6.2 - dev: true + tslib: 2.6.3 + optionalDependencies: + '@types/react': 17.0.80 - /use-composed-ref@1.3.0(react@18.3.1): - resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-composed-ref@1.3.0(react@18.3.1): dependencies: react: 18.3.1 - dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-isomorphic-layout-effect@1.1.2(@types/react@17.0.80)(react@18.3.1): dependencies: - '@types/react': 17.0.80 react: 18.3.1 - dev: false + optionalDependencies: + '@types/react': 17.0.80 - /use-latest@1.2.1(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-latest@1.2.1(@types/react@17.0.80)(react@18.3.1): dependencies: - '@types/react': 17.0.80 react: 18.3.1 use-isomorphic-layout-effect: 1.1.2(@types/react@17.0.80)(react@18.3.1) - dev: false + optionalDependencies: + '@types/react': 17.0.80 - /use-resize-observer@9.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} - peerDependencies: - react: 16.8.0 - 18 - react-dom: 16.8.0 - 18 + use-resize-observer@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@juggle/resize-observer': 3.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true - /use-sidecar@1.1.2(@types/react@17.0.80)(react@18.3.1): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-sidecar@1.1.2(@types/react@17.0.80)(react@18.3.1): dependencies: - '@types/react': 17.0.80 detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.6.2 - dev: true + tslib: 2.6.3 + optionalDependencies: + '@types/react': 17.0.80 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + util-deprecate@1.0.2: {} + + util@0.12.5: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 which-typed-array: 1.1.15 - dev: true - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true + utils-merge@1.0.1: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: true + uuid@9.0.1: {} - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.2.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true + vary@1.1.2: {} - /vite-tsconfig-paths@4.3.2(typescript@4.9.5)(vite@4.5.3): - resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + vaul@0.9.1(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - debug: 4.3.4 + '@radix-ui/react-dialog': 1.1.1(@types/react@17.0.80)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + vite-tsconfig-paths@4.3.2(typescript@4.9.5)(vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1)): + dependencies: + debug: 4.3.5 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@4.9.5) - vite: 4.5.3 + tsconfck: 3.1.0(typescript@4.9.5) + optionalDependencies: + vite: 4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1) transitivePeerDependencies: - supports-color - typescript - dev: true - /vite@4.5.3: - resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.5.3(@types/node@20.14.8)(less@4.2.0)(sass@1.77.6)(stylus@0.62.0)(terser@5.31.1): dependencies: esbuild: 0.18.20 postcss: 8.4.38 rollup: 3.29.4 optionalDependencies: + '@types/node': 20.14.8 fsevents: 2.3.3 - dev: true + less: 4.2.0 + sass: 1.77.6 + stylus: 0.62.0 + terser: 5.31.1 - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - dev: true - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + webidl-conversions@4.0.2: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack-virtual-modules@0.6.1: - resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} - dev: true + webpack-virtual-modules@0.6.2: {} - /webpack@5.91.0(esbuild@0.19.12): - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.92.1(esbuild@0.19.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.5.2 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.3 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -12425,209 +16508,116 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.19.12)(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(esbuild@0.19.12)(webpack@5.92.1(esbuild@0.19.12)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + which@2.0.2: + dependencies: + isexe: 2.0.0 - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + word-wrap@1.2.5: {} - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + write-file-atomic@2.4.3: dependencies: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /ws@6.1.4: - resolution: {integrity: sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + ws@6.1.4: dependencies: async-limiter: 1.0.1 - dev: true - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@6.2.3: dependencies: async-limiter: 1.0.1 - dev: true - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@7.5.10: {} - /ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.17.1: {} - /xmlhttprequest-ssl@1.6.3: - resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} - engines: {node: '>=0.4.0'} - dev: true + xmlhttprequest-ssl@1.6.3: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true + xtend@4.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + yaml@1.10.2: {} - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.1: {} - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yaml@2.4.5: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -12636,11 +16626,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -12650,22 +16637,13 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true - /yeast@0.1.2: - resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} - dev: true + yeast@0.1.2: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /zod@3.23.4: - resolution: {integrity: sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==} - dev: false + zod@3.23.8: {} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 000000000..4aa2217d8 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: [require('autoprefixer'), require('postcss-nested')], +}; + +module.exports = config; diff --git a/security.md b/security.md index da632f8b2..f2634807f 100644 --- a/security.md +++ b/security.md @@ -1,3 +1,3 @@ # Security policy -Please refer to the [Amity security policies](https://docs.amity.co/support/security) \ No newline at end of file +Please refer to the [Amity security policies](https://docs.amity.co/support/security) diff --git a/src/chat/components/ChatHeader/styles.tsx b/src/chat/components/ChatHeader/styles.tsx index 56d4db455..ccc2e6f97 100644 --- a/src/chat/components/ChatHeader/styles.tsx +++ b/src/chat/components/ChatHeader/styles.tsx @@ -1,14 +1,14 @@ import styled from 'styled-components'; import { ReactNode } from 'react'; -import { BarsIcon } from "~/icons"; +import { BarsIcon } from '~/icons'; export const DetailsIcon = styled(BarsIcon).attrs<{ icon?: ReactNode }>({ width: 24, height: 24, })` - cursor: pointer; - fill: ${({ theme }) => theme.palette.neutral.main}; - align-self: center; + cursor: pointer; + fill: ${({ theme }) => theme.palette.neutral.main}; + align-self: center; `; export const ChatHeaderContainer = styled.div` diff --git a/src/chat/components/Message/styles.tsx b/src/chat/components/Message/styles.tsx index eabbcfcd6..b5a5dfff7 100644 --- a/src/chat/components/Message/styles.tsx +++ b/src/chat/components/Message/styles.tsx @@ -36,7 +36,10 @@ export const CloseIcon = styled(Close)<{ icon?: ReactNode }>` cursor: pointer; `; -export const MessageOptionsIcon = styled(EllipsisV).attrs<{ icon?: ReactNode }>({ width: 11, height: 11 })` +export const MessageOptionsIcon = styled(EllipsisV).attrs<{ icon?: ReactNode }>({ + width: 11, + height: 11, +})` opacity: 0.5; margin: 0 5px; cursor: pointer; diff --git a/src/chat/components/RecentChat/styles.tsx b/src/chat/components/RecentChat/styles.tsx index 6ed989388..675edd6ba 100644 --- a/src/chat/components/RecentChat/styles.tsx +++ b/src/chat/components/RecentChat/styles.tsx @@ -2,7 +2,10 @@ import { ReactNode } from 'react'; import styled from 'styled-components'; import { CreateChat } from '~/icons'; -export const CreateNewChatIcon = styled(CreateChat).attrs<{ icon?: ReactNode }>({ width: 24, height: 18 })` +export const CreateNewChatIcon = styled(CreateChat).attrs<{ icon?: ReactNode }>({ + width: 24, + height: 18, +})` width: 24px !important; cursor: pointer; `; diff --git a/src/core/components/Dropdown/index.tsx b/src/core/components/Dropdown/index.tsx index 8cf1ce5d2..3ec5a16dc 100644 --- a/src/core/components/Dropdown/index.tsx +++ b/src/core/components/Dropdown/index.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, MutableRefObject } from 'react'; import Button from '~/core/components/Button'; import { ChevronDown } from '~/icons'; @@ -10,6 +10,54 @@ import { DropdownContainer, Frame, FrameContainer, ButtonContainer } from './sty const SCROLLABLE_HEIGHT = 200; +export const useDropdown = ({ + parentContainer, + dropdownRef, + align = POSITION_LEFT, + scrollableHeight = SCROLLABLE_HEIGHT, + position = POSITION_BOTTOM, + buttonContainerHeight, +}: { + scrollableHeight?: number; + position?: string; + align?: string; + dropdownRef: MutableRefObject; + parentContainer?: Element | null; + buttonContainerHeight: number; +}) => { + const [currentPosition, setCurrentPosition] = useState(position); + const entry = useObserver(dropdownRef.current, { + root: parentContainer, + rootMargin: parentContainer + ? `0px 0px -${Math.ceil( + (scrollableHeight * 100) / + (parentContainer.getBoundingClientRect().height - buttonContainerHeight), + )}% 0px` + : undefined, + }); + + // handling reposition for dropdown list + useEffect(() => { + if (entry?.isIntersecting === false) { + // handling vertical re-position + if (entry.boundingClientRect?.top < 0) { + setCurrentPosition(POSITION_BOTTOM); + } else { + setCurrentPosition(POSITION_TOP); + } + } else { + // reset to default + setCurrentPosition(position); + } + }, [entry, position]); + + return { + align, + currentPosition, + scrollableHeight, + }; +}; + const triggerRenderer: DropdownProps['renderTrigger'] = (props) => { return ( ); diff --git a/src/core/components/Uploaders/Image/styles.tsx b/src/core/components/Uploaders/Image/styles.tsx index 815de2c6d..3c9847cac 100644 --- a/src/core/components/Uploaders/Image/styles.tsx +++ b/src/core/components/Uploaders/Image/styles.tsx @@ -71,19 +71,24 @@ export const ImageSkeleton = () => ( ); +const StyledRemoveIcon = styled(RemoveIcon).attrs<{ icon?: ReactNode }>({width: 24, height: 24})``; + export const RemoveButton = styled(Button).attrs<{ variant?: string; children?: ReactNode; }>({ variant: 'secondary', - children: , + children: , })` position: absolute; top: 0.5em; right: 0.5em; `; -export const CircleIcon = styled(ExclamationCircle).attrs<{ icon?: ReactNode }>({ width: 24, height: 24 })` +export const CircleIcon = styled(ExclamationCircle).attrs<{ icon?: ReactNode }>({ + width: 24, + height: 24, +})` z-index: 2; opacity: 0.7; `; diff --git a/src/core/components/Uploaders/Video/styles.tsx b/src/core/components/Uploaders/Video/styles.tsx index d911c2f12..2c5ff7faa 100644 --- a/src/core/components/Uploaders/Video/styles.tsx +++ b/src/core/components/Uploaders/Video/styles.tsx @@ -83,12 +83,14 @@ export const VideoSkeleton = () => ( ); +const StyledRemoveIcon = styled(Remove).attrs<{ icon?: ReactNode }>({width: 24, height: 24})``; + export const RemoveButton = styled(Button).attrs<{ variant?: string; children?: ReactNode; }>({ variant: 'secondary', - children: Remove, + children: , })` position: absolute; top: 0.5em; diff --git a/src/core/providers/UiKitProvider/fonts/inter.css b/src/core/providers/UiKitProvider/fonts/inter.css index f45001012..d92263820 100644 --- a/src/core/providers/UiKitProvider/fonts/inter.css +++ b/src/core/providers/UiKitProvider/fonts/inter.css @@ -1,154 +1,152 @@ @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 100; font-display: swap; - src: url("Inter-Thin.woff2?v=3.19") format("woff2"), - url("Inter-Thin.woff?v=3.19") format("woff"); + src: url('Inter-Thin.woff2?v=3.19') format('woff2'), url('Inter-Thin.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 100; font-display: swap; - src: url("Inter-ThinItalic.woff2?v=3.19") format("woff2"), - url("Inter-ThinItalic.woff?v=3.19") format("woff"); + src: url('Inter-ThinItalic.woff2?v=3.19') format('woff2'), + url('Inter-ThinItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 200; font-display: swap; - src: url("Inter-ExtraLight.woff2?v=3.19") format("woff2"), - url("Inter-ExtraLight.woff?v=3.19") format("woff"); + src: url('Inter-ExtraLight.woff2?v=3.19') format('woff2'), + url('Inter-ExtraLight.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 200; font-display: swap; - src: url("Inter-ExtraLightItalic.woff2?v=3.19") format("woff2"), - url("Inter-ExtraLightItalic.woff?v=3.19") format("woff"); + src: url('Inter-ExtraLightItalic.woff2?v=3.19') format('woff2'), + url('Inter-ExtraLightItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 300; font-display: swap; - src: url("Inter-Light.woff2?v=3.19") format("woff2"), - url("Inter-Light.woff?v=3.19") format("woff"); + src: url('Inter-Light.woff2?v=3.19') format('woff2'), + url('Inter-Light.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 300; font-display: swap; - src: url("Inter-LightItalic.woff2?v=3.19") format("woff2"), - url("Inter-LightItalic.woff?v=3.19") format("woff"); + src: url('Inter-LightItalic.woff2?v=3.19') format('woff2'), + url('Inter-LightItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 400; font-display: swap; - src: url("Inter-Regular.woff2?v=3.19") format("woff2"), - url("Inter-Regular.woff?v=3.19") format("woff"); + src: url('Inter-Regular.woff2?v=3.19') format('woff2'), + url('Inter-Regular.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 400; font-display: swap; - src: url("Inter-Italic.woff2?v=3.19") format("woff2"), - url("Inter-Italic.woff?v=3.19") format("woff"); + src: url('Inter-Italic.woff2?v=3.19') format('woff2'), + url('Inter-Italic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 500; font-display: swap; - src: url("Inter-Medium.woff2?v=3.19") format("woff2"), - url("Inter-Medium.woff?v=3.19") format("woff"); + src: url('Inter-Medium.woff2?v=3.19') format('woff2'), + url('Inter-Medium.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 500; font-display: swap; - src: url("Inter-MediumItalic.woff2?v=3.19") format("woff2"), - url("Inter-MediumItalic.woff?v=3.19") format("woff"); + src: url('Inter-MediumItalic.woff2?v=3.19') format('woff2'), + url('Inter-MediumItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 600; font-display: swap; - src: url("Inter-SemiBold.woff2?v=3.19") format("woff2"), - url("Inter-SemiBold.woff?v=3.19") format("woff"); + src: url('Inter-SemiBold.woff2?v=3.19') format('woff2'), + url('Inter-SemiBold.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 600; font-display: swap; - src: url("Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"), - url("Inter-SemiBoldItalic.woff?v=3.19") format("woff"); + src: url('Inter-SemiBoldItalic.woff2?v=3.19') format('woff2'), + url('Inter-SemiBoldItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 700; font-display: swap; - src: url("Inter-Bold.woff2?v=3.19") format("woff2"), - url("Inter-Bold.woff?v=3.19") format("woff"); + src: url('Inter-Bold.woff2?v=3.19') format('woff2'), url('Inter-Bold.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 700; font-display: swap; - src: url("Inter-BoldItalic.woff2?v=3.19") format("woff2"), - url("Inter-BoldItalic.woff?v=3.19") format("woff"); + src: url('Inter-BoldItalic.woff2?v=3.19') format('woff2'), + url('Inter-BoldItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 800; font-display: swap; - src: url("Inter-ExtraBold.woff2?v=3.19") format("woff2"), - url("Inter-ExtraBold.woff?v=3.19") format("woff"); + src: url('Inter-ExtraBold.woff2?v=3.19') format('woff2'), + url('Inter-ExtraBold.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 800; font-display: swap; - src: url("Inter-ExtraBoldItalic.woff2?v=3.19") format("woff2"), - url("Inter-ExtraBoldItalic.woff?v=3.19") format("woff"); + src: url('Inter-ExtraBoldItalic.woff2?v=3.19') format('woff2'), + url('Inter-ExtraBoldItalic.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: normal; + font-style: normal; font-weight: 900; font-display: swap; - src: url("Inter-Black.woff2?v=3.19") format("woff2"), - url("Inter-Black.woff?v=3.19") format("woff"); + src: url('Inter-Black.woff2?v=3.19') format('woff2'), + url('Inter-Black.woff?v=3.19') format('woff'); } @font-face { font-family: 'Inter'; - font-style: italic; + font-style: italic; font-weight: 900; font-display: swap; - src: url("Inter-BlackItalic.woff2?v=3.19") format("woff2"), - url("Inter-BlackItalic.woff?v=3.19") format("woff"); + src: url('Inter-BlackItalic.woff2?v=3.19') format('woff2'), + url('Inter-BlackItalic.woff?v=3.19') format('woff'); } /* ------------------------------------------------------- @@ -166,7 +164,7 @@ Usage: font-display: swap; font-style: normal; font-named-instance: 'Regular'; - src: url("Inter-roman.var.woff2?v=3.19") format("woff2"); + src: url('Inter-roman.var.woff2?v=3.19') format('woff2'); } @font-face { font-family: 'Inter var'; @@ -174,10 +172,9 @@ Usage: font-display: swap; font-style: italic; font-named-instance: 'Italic'; - src: url("Inter-italic.var.woff2?v=3.19") format("woff2"); + src: url('Inter-italic.var.woff2?v=3.19') format('woff2'); } - /* -------------------------------------------------------------------------- [EXPERIMENTAL] Multi-axis, single variable font. @@ -196,5 +193,5 @@ explicitly, e.g. font-weight: 100 900; font-display: swap; font-style: oblique 0deg 10deg; - src: url("Inter.var.woff2?v=3.19") format("woff2"); + src: url('Inter.var.woff2?v=3.19') format('woff2'); } diff --git a/src/core/providers/UiKitProvider/index.tsx b/src/core/providers/UiKitProvider/index.tsx index ee3378b3a..d46058fba 100644 --- a/src/core/providers/UiKitProvider/index.tsx +++ b/src/core/providers/UiKitProvider/index.tsx @@ -1,27 +1,33 @@ import './inter.css'; -import './index.css'; import React, { useState, useEffect, useMemo, useRef } from 'react'; import { Client as ASCClient } from '@amityco/ts-sdk'; import { ThemeProvider } from 'styled-components'; import { NotificationsContainer } from '~/core/components/Notification'; import { ConfirmComponent } from '~/core/components/Confirm'; +import { NotificationsContainer as NotificationsContainerV4 } from '~/v4/core/components/Notification'; +import { ConfirmComponent as ConfirmComponentV4 } from '~/v4/core/components/ConfirmModal'; import ConfigProvider from '~/social/providers/ConfigProvider'; import Localization from './Localization'; import buildGlobalTheme from './theme'; import { UIStyles } from './styles'; import { SDKContext } from '../SDKProvider'; +import { SDKContext as SDKContextV4 } from '~/v4/core/providers/SDKProvider'; import useUser from '~/core/hooks/useUser'; import NavigationProvider from '~/social/providers/NavigationProvider'; -import SDKConnectorProvider from '../SDKConnectorProvider'; +import SDKConnectorProvider from '~/core/providers/SDKConnectorProvider'; +import SDKConnectorProviderV4 from '~/v4/core/providers/SDKConnectorProvider'; import CustomComponentsProvider, { CustomComponentType } from '../CustomComponentsProvider'; import PostRendererProvider, { PostRendererConfigType, } from '~/social/providers/PostRendererProvider'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { ConfirmProvider } from '../ConfirmProvider'; +import { ConfirmProvider as ConfirmProviderV4 } from '~/v4/core/providers/ConfirmProvider'; +import { NotificationProvider as NotificationProviderV4 } from '~/v4/core/providers/NotificationProvider'; +import { ConfirmProvider } from '~/core/providers/ConfirmProvider'; import { NotificationProvider } from '~/core/providers/NotificationProvider'; +import { CustomizationProvider } from '~/v4/core/providers/CustomizationProvider'; interface UiKitProviderProps { apiKey: string; @@ -149,26 +155,40 @@ const UiKitProvider = ({ - - - - - - - {children} - - - - - - - - + + + + + + + + + + + + + {children} + + + + + + + + + + + + + + + + diff --git a/src/i18n/en.json b/src/i18n/en.json index 21c0ba99e..458f64e2d 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -52,7 +52,8 @@ "collapsible.viewAll": "View all", "collapsible.viewAllFiles": "View all files", "collapsible.viewMoreComments": "View more comments", - "collapsible.viewMoreReplies": "View {count, plural, one {# reply} other {# replies}}", + "collapsible.viewMoreReplies": "View more replies", + "collapsible.viewMoreReply": "View {count, plural, one {# reply} other {# replies}}", "community.createSuccess": "Your community was successfully created", "community.updateSuccess": "Your community was successfully updated", @@ -367,6 +368,10 @@ "storyCreation.hyperlink.validation.error.invalidUrl": "Please enter a valid URL.", "storyCreation.hyperlink.validation.error.whitelisted": "Please enter a whitelisted URL.", "storyCreation.hyperlink.validation.error.blocked": "Your text contains a blocklisted word.", + "storyCreation.hyperlink.unsavedChanges.title": "Unsaved changes", + "storyCreation.hyperlink.unsavedChanges.content": "Are you sure you want to cancel? Your changes won't be saved.", + "storyCreation.hyperlink.unsavedChanges.cancel": "No", + "storyCreation.hyperlink.unsavedChanges.confirm": "Yes", "storyViewer.actions.deleteStory": "Delete story", "storyViewer.action.confirmModal.title": "Delete this story?", @@ -383,6 +388,7 @@ "storyViewer.toast.like.disabled": "Join community to interact with all stories", "storyViewer.toast.comment.reported": "Comment reported", "storyViewer.toast.comment.unreported": "Comment unreported", + "storyViewer.toast.disable.react": "Join community to interact with all stories", "storyViewer.commentComposeBar.submit": "Post", diff --git a/src/icons/EmptyImageGallery.tsx b/src/icons/EmptyImageGallery.tsx index 694388856..c0ca0bdbb 100644 --- a/src/icons/EmptyImageGallery.tsx +++ b/src/icons/EmptyImageGallery.tsx @@ -10,8 +10,7 @@ const EmptyImageGallery = (props: React.SVGProps) => { xmlns="http://www.w3.org/2000/svg" {...props} > - + ); }; diff --git a/src/icons/EmptyLivestreamGallery.tsx b/src/icons/EmptyLivestreamGallery.tsx index bf1b0263d..37a8fd081 100644 --- a/src/icons/EmptyLivestreamGallery.tsx +++ b/src/icons/EmptyLivestreamGallery.tsx @@ -15,4 +15,4 @@ const EmptyLivestreamGallery = (props: React.SVGProps) => { ); }; -export default EmptyLivestreamGallery; \ No newline at end of file +export default EmptyLivestreamGallery; diff --git a/src/icons/EmptyVideoGallery.tsx b/src/icons/EmptyVideoGallery.tsx index 9ae086fbf..91afabbdc 100644 --- a/src/icons/EmptyVideoGallery.tsx +++ b/src/icons/EmptyVideoGallery.tsx @@ -10,10 +10,9 @@ const EmptyVideoGallery = (props: React.SVGProps) => { xmlns="http://www.w3.org/2000/svg" {...props} > - + ); }; -export default EmptyVideoGallery; \ No newline at end of file +export default EmptyVideoGallery; diff --git a/src/icons/FileAttachment.tsx b/src/icons/FileAttachment.tsx index 1cbd0db75..a21a0350f 100644 --- a/src/icons/FileAttachment.tsx +++ b/src/icons/FileAttachment.tsx @@ -1,6 +1,6 @@ import React from 'react'; -const Svg = (props : React.SVGProps) => ( +const Svg = (props: React.SVGProps) => ( ) => ( +const Svg = (props: React.SVGProps) => ( ) => ( +const Svg = (props: React.SVGProps) => ( ) => ( - +const Svg = ({ fill = '#1054DE', ...props }: React.SVGProps) => ( + - + ); diff --git a/src/icons/Newspaper.tsx b/src/icons/Newspaper.tsx index c1ba558a7..a35154cd9 100644 --- a/src/icons/Newspaper.tsx +++ b/src/icons/Newspaper.tsx @@ -25,4 +25,4 @@ const Svg = (props: React.SVGProps) => ( ); -export default Svg; \ No newline at end of file +export default Svg; diff --git a/src/icons/NewspaperLight.tsx b/src/icons/NewspaperLight.tsx index 9ee72a1f7..2e6ca9360 100644 --- a/src/icons/NewspaperLight.tsx +++ b/src/icons/NewspaperLight.tsx @@ -25,4 +25,4 @@ const Svg = (props: React.SVGProps) => ( ); -export default Svg; \ No newline at end of file +export default Svg; diff --git a/src/icons/Play.tsx b/src/icons/Play.tsx index 316c11b60..bd71bb88b 100644 --- a/src/icons/Play.tsx +++ b/src/icons/Play.tsx @@ -10,10 +10,7 @@ function Icon(props: React.SVGProps) { viewBox="0 0 25 24" {...props} > - + ); } diff --git a/src/icons/ThumbsUp.tsx b/src/icons/ThumbsUp.tsx index e49b18ecc..3381cf279 100644 --- a/src/icons/ThumbsUp.tsx +++ b/src/icons/ThumbsUp.tsx @@ -10,10 +10,7 @@ function Icon(props: React.SVGProps) { viewBox="0 0 20 20" {...props} > - + ); } diff --git a/src/index.ts b/src/index.ts index 835c8c3ef..1d3bbd08a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,7 @@ export { useSDK as useAmitySDK } from '~/core/hooks/useSDK'; // v4 export { default as AmityUIKitManager } from '~/v4/core/AmityUIKitManager'; -export { AmityDraftStoryPage, AmityViewStoryPage } from '~/v4/social/pages'; +export { AmityDraftStoryPage, ViewStoryPage as AmityViewStoryPage } from '~/v4/social/pages'; export { CommentTray as AmityCommentTrayComponent, StoryTab as AmityStoryTabComponent, diff --git a/src/social/components/Comment/StyledComment.tsx b/src/social/components/Comment/StyledComment.tsx index 5ebfc4d15..6958cacd3 100644 --- a/src/social/components/Comment/StyledComment.tsx +++ b/src/social/components/Comment/StyledComment.tsx @@ -1,9 +1,7 @@ -/* eslint-disable import/no-cycle */ -import React from 'react'; +import React, { forwardRef, MutableRefObject, useEffect, useRef, useState } from 'react'; import Truncate from 'react-truncate-markup'; import { FormattedMessage, useIntl } from 'react-intl'; -import { POSITION_LEFT } from '~/helpers/getCssPosition'; import Button, { PrimaryButton } from '~/core/components/Button'; import CommentLikeButton from '~/social/components/CommentLikeButton'; import CommentText from './CommentText'; @@ -20,14 +18,121 @@ import { InteractionBar, ReplyIcon, ReplyButton, - OptionMenu, CommentEditContainer, CommentEditTextarea, ButtonContainer, EditedMark, + OptionMenuContainer, + OptionButtonContainer, } from './styles'; import { Mentioned, Metadata, isNonNullable } from '~/helpers/utils'; import { QueryMentioneesFnType } from '~/social/hooks/useSocialMention'; +import { Option, OptionsButton, OptionsIcon } from '~/core/components/OptionMenu/styles'; +import useCommentFlaggedByMe from '~/social/hooks/useCommentFlaggedByMe'; +import { useNotifications } from '~/core/providers/NotificationProvider'; +import { useDropdown } from '~/core/components/Dropdown/index'; +import useElementSize from '~/core/hooks/useElementSize'; +import { Frame, FrameContainer } from '~/core/components/Dropdown/styles'; + +type OptionMenuProps = StyledCommentProps & { + onEditCommentClick: () => void; + onClose: () => void; + buttonContainerHeight: number; +}; + +const OptionMenu = ({ + commentId, + canDelete = false, + canEdit = false, + canReport = true, + handleReportComment, + startEditing, + handleDelete, + isReplyComment, + onClose, + buttonContainerHeight, +}: OptionMenuProps) => { + const { formatMessage } = useIntl(); + const notification = useNotifications(); + const dropdownRef = useRef(null); + + const { currentPosition, align, scrollableHeight } = useDropdown({ + dropdownRef, + buttonContainerHeight, + }); + + const { isFlaggedByMe: isReported, toggleFlagComment } = useCommentFlaggedByMe(commentId); + + const onReportClick = async () => { + try { + await toggleFlagComment(); + handleReportComment?.(); + if (isReported) { + notification.success({ + content: formatMessage({ id: 'report.unreportSent' }), + }); + } else { + notification.success({ + content: formatMessage({ id: 'report.reportSent' }), + }); + } + } catch (err) { + if (err instanceof Error) { + notification.error({ + content: err.message, + }); + } + } + }; + + const options = [ + canEdit + ? { + name: isReplyComment + ? formatMessage({ id: 'reply.edit' }) + : formatMessage({ id: 'comment.edit' }), + action: startEditing, + } + : null, + canReport + ? { + name: isReported + ? formatMessage({ id: 'report.undoReport' }) + : formatMessage({ id: 'report.doReport' }), + action: onReportClick, + } + : null, + canDelete + ? { + name: isReplyComment + ? formatMessage({ id: 'reply.delete' }) + : formatMessage({ id: 'comment.delete' }), + action: handleDelete, + } + : null, + ].filter(isNonNullable); + + return ( + + + + {options.map(({ name, action }) => ( + + ))} + + + + ); +}; interface StyledCommentProps { commentId?: string; @@ -67,61 +172,45 @@ interface StyledCommentProps { metadata?: Metadata; } -const StyledComment = ({ - commentId, - authorName, - authorAvatar, - canDelete = false, - canEdit = false, - canLike = true, - canReply = false, - canReport = true, - createdAt, - editedAt, - text, - markup, - onClickReply, - handleReportComment, - handleEdit, - startEditing, - cancelEditing, - handleDelete, - isEditing, - onChange, - queryMentionees, - isReported, - isReplyComment, - isBanned, - mentionees, - metadata, -}: StyledCommentProps) => { +const StyledComment = (props: StyledCommentProps) => { + const { + commentId, + authorName, + authorAvatar, + canLike = true, + canReply = false, + createdAt, + editedAt, + text, + markup, + onClickReply, + handleEdit, + startEditing, + cancelEditing, + isEditing, + onChange, + queryMentionees, + isBanned, + mentionees, + } = props; const { formatMessage } = useIntl(); - const options = [ - canEdit - ? { - name: isReplyComment - ? formatMessage({ id: 'reply.edit' }) - : formatMessage({ id: 'comment.edit' }), - action: startEditing, - } - : null, - canReport - ? { - name: isReported - ? formatMessage({ id: 'report.undoReport' }) - : formatMessage({ id: 'report.doReport' }), - action: handleReportComment, - } - : null, - canDelete - ? { - name: isReplyComment - ? formatMessage({ id: 'reply.delete' }) - : formatMessage({ id: 'comment.delete' }), - action: handleDelete, - } - : null, - ].filter(isNonNullable); + + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [buttonContainerRef, buttonContainerHeight] = useElementSize(); + + const toggle = () => setIsMenuOpen((prev) => !prev); + + useEffect(() => { + if (isMenuOpen) { + document.addEventListener('click', toggle); + } else { + document.removeEventListener('click', toggle); + } + + return () => { + document.removeEventListener('click', toggle); + }; + }, [isMenuOpen]); return ( <> @@ -189,7 +278,7 @@ const StyledComment = ({ )} - {!isEditing && (canLike || canReply || options.length > 0) && ( + {!isEditing && (canLike || canReply) && ( {canLike && } @@ -199,12 +288,26 @@ const StyledComment = ({ )} - + +
+ { + ev.stopPropagation(); + toggle(); + }} + > + + +
+ {isMenuOpen && ( + startEditing()} + buttonContainerHeight={buttonContainerHeight} + /> + )} +
)} diff --git a/src/social/components/Comment/index.tsx b/src/social/components/Comment/index.tsx index a60124f48..f032b7290 100644 --- a/src/social/components/Comment/index.tsx +++ b/src/social/components/Comment/index.tsx @@ -32,7 +32,6 @@ import useUser from '~/core/hooks/useUser'; import useFile from '~/core/hooks/useFile'; import { CommentRepository } from '@amityco/ts-sdk'; import { useCustomComponent } from '~/core/providers/CustomComponentsProvider'; -import useCommentFlaggedByMe from '~/social/hooks/useCommentFlaggedByMe'; import useCommentPermission from '~/social/hooks/useCommentPermission'; import useCommentSubscription from '~/social/hooks/useCommentSubscription'; @@ -96,7 +95,6 @@ const Comment = ({ commentId, readonly }: CommentProps) => { const commentAuthor = useUser(comment?.userId); const commentAuthorAvatar = useFile(commentAuthor?.avatarFileId); const { userRoles } = useSDK(); - const { toggleFlagComment, isFlaggedByMe } = useCommentFlaggedByMe(commentId); const [isReplying, setIsReplying] = useState(false); const [isEditing, setIsEditing] = useState(false); @@ -131,10 +129,6 @@ const Comment = ({ commentId, readonly }: CommentProps) => { if (post == null && comment == null) return ; - const handleReportComment = async () => { - return toggleFlagComment(); - }; - const handleReplyToComment = async ( replyCommentText: string, mentionees: Mentionees, @@ -180,27 +174,6 @@ const Comment = ({ commentId, readonly }: CommentProps) => { const handleDeleteComment = async () => commentId && CommentRepository.deleteComment(commentId); - const onReportClick = async () => { - try { - await handleReportComment(); - if (isFlaggedByMe) { - notification.success({ - content: formatMessage({ id: 'report.unreportSent' }), - }); - } else { - notification.success({ - content: formatMessage({ id: 'report.reportSent' }), - }); - } - } catch (err) { - if (err instanceof Error) { - notification.error({ - content: err.message, - }); - } - } - }; - const onClickReply = () => { setIsReplying((preValue) => !preValue); }; @@ -268,14 +241,12 @@ const Comment = ({ commentId, readonly }: CommentProps) => { metadata={comment?.metadata} text={text} markup={markup} - handleReportComment={onReportClick} startEditing={startEditing} cancelEditing={cancelEditing} handleEdit={handleEdit} handleDelete={deleteComment} isEditing={isEditing} queryMentionees={queryMentionees} - isReported={isFlaggedByMe} isReplyComment={isReplyComment} onClickReply={onClickReply} onChange={onChange} diff --git a/src/social/components/Comment/styles.tsx b/src/social/components/Comment/styles.tsx index c432d9b23..ef860fc01 100644 --- a/src/social/components/Comment/styles.tsx +++ b/src/social/components/Comment/styles.tsx @@ -9,6 +9,19 @@ import { MinusCircle, Reply } from '~/icons'; import UIAvatar from '~/core/components/Avatar'; +export const OptionButtonContainer = styled.div` + display: flex; + align-items: center; + + position: relative; +`; + +export const OptionMenuContainer = styled.div` + position: absolute; + + left: 100%; +`; + export const Avatar = styled(UIAvatar)` margin-right: 8px; `; diff --git a/src/social/components/CommentLikeButton/styles.tsx b/src/social/components/CommentLikeButton/styles.tsx index e8fcc405c..205686dc2 100644 --- a/src/social/components/CommentLikeButton/styles.tsx +++ b/src/social/components/CommentLikeButton/styles.tsx @@ -5,6 +5,7 @@ import { ThumbsUp } from '~/icons'; const isLikedStyle = css` color: ${({ theme }) => theme.palette.primary.main}; + fill: ${({ theme }) => theme.palette.primary.main}; `; export const StyledLikeButton = styled(SecondaryButton)` @@ -18,6 +19,8 @@ export const StyledLikeButton = styled(SecondaryButton)` export const BaseLikeIcon = styled(ThumbsUp)<{ icon?: ReactNode }>` font-size: 16px; + color: #a5a9b5; + fill: #a5a9b5; `; export const IsLikedLikeIcon = styled(BaseLikeIcon)<{ icon?: ReactNode }>` diff --git a/src/social/components/CommentList/index.tsx b/src/social/components/CommentList/index.tsx index 5699d3225..d84ba07e1 100644 --- a/src/social/components/CommentList/index.tsx +++ b/src/social/components/CommentList/index.tsx @@ -1,4 +1,4 @@ -import React, { memo } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; import Comment from '~/social/components/Comment'; @@ -8,6 +8,8 @@ import LoadMoreWrapper from '../LoadMoreWrapper'; import usePostSubscription from '~/social/hooks/usePostSubscription'; import { SubscriptionLevels } from '@amityco/ts-sdk'; import useCommentsCollection from '~/social/hooks/collections/useCommentsCollection'; +import usePost from '~/social/hooks/usePost'; +import { LoadMoreButton, ShevronDownIcon } from '../LoadMoreWrapper/styles'; interface CommentListProps { parentId?: string; @@ -19,7 +21,7 @@ interface CommentListProps { limit?: number; } -const CommentList = ({ +const InnerCommentList = ({ parentId, referenceId, referenceType, @@ -28,10 +30,13 @@ const CommentList = ({ // filterByParentId = false, readonly = false, isExpanded = true, -}: CommentListProps) => { + callLoadMoreAgain = false, +}: CommentListProps & { + callLoadMoreAgain?: boolean; +}) => { + const [isCallAgain, setIsCallAgain] = useState(!callLoadMoreAgain); const { formatMessage } = useIntl(); const isReplyComment = !!parentId; - const { comments, hasMore, loadMore } = useCommentsCollection({ parentId, referenceId, @@ -39,11 +44,12 @@ const CommentList = ({ limit, }); - usePostSubscription({ - postId: referenceId, - level: SubscriptionLevels.COMMENT, - shouldSubscribe: () => referenceType === 'post' && !parentId, - }); + useEffect(() => { + if (isCallAgain && comments.length > 0 && hasMore) { + loadMore(); + setIsCallAgain(false); + } + }, [comments, hasMore, loadMore, isCallAgain]); const loadMoreText = isReplyComment ? formatMessage({ id: 'collapsible.viewMoreReplies' }, { count: comments.length }) @@ -73,4 +79,94 @@ const CommentList = ({ ); }; +const PostCommentList = (props: CommentListProps) => { + const { + parentId, + referenceId, + referenceType, + limit = 5, + // TODO: breaking change + // filterByParentId = false, + readonly = false, + isExpanded = true, + } = props; + const { formatMessage } = useIntl(); + const [firstRender, setFirstRender] = useState(true); + const isReplyComment = !!parentId; + const post = usePost(referenceId); + + usePostSubscription({ + postId: referenceId, + level: SubscriptionLevels.COMMENT, + shouldSubscribe: () => referenceType === 'post' && !parentId, + }); + + const loadMoreText = isReplyComment + ? formatMessage({ id: 'collapsible.viewMoreReplies' }) + : formatMessage({ id: 'collapsible.viewMoreComments' }); + + const prependIcon = isReplyComment ? ( + + + + ) : null; + + if (firstRender) { + return ( + (post?.latestComments?.length || 0)} + loadMore={() => { + setFirstRender(false); + }} + text={loadMoreText} + className={isReplyComment ? 'reply-button' : 'comments-button'} + prependIcon={prependIcon} + appendIcon={null} + isExpanded={isExpanded} + contentSlot={(post?.latestComments || []).map((comment: Amity.Comment) => ( + + ))} + /> + ); + } + + return ; +}; + +const ReplayCommentList = (props: CommentListProps) => { + const [isExpanded, setExpanded] = useState(false); + const { formatMessage } = useIntl(); + + const prependIcon = ( + + + + ); + + if (!isExpanded) { + return ( + setExpanded((prev) => !prev)}> + {prependIcon} {formatMessage({ id: 'collapsible.viewMoreReplies' })} + + ); + } + + return ; +}; + +const CommentList = (props: CommentListProps) => { + const { referenceType, parentId } = props; + const isReplyComment = !!parentId; + + if (isReplyComment) { + return ; + } + + if (referenceType === 'post' && !isReplyComment) { + return ; + } + + return ; +}; + export default memo(CommentList); diff --git a/src/social/components/CommunityInfo/UICommunityInfo.tsx b/src/social/components/CommunityInfo/UICommunityInfo.tsx index eec09c233..6bb97a467 100644 --- a/src/social/components/CommunityInfo/UICommunityInfo.tsx +++ b/src/social/components/CommunityInfo/UICommunityInfo.tsx @@ -26,7 +26,7 @@ import { import { useCustomComponent } from '~/core/providers/CustomComponentsProvider'; import millify from 'millify'; import { isNonNullable } from '~/helpers/utils'; -import { StoryTab } from '~/v4/social/components'; +import { StoryTab } from '~/social/components/StoryTab'; interface UICommunityInfoProps { communityId: string; diff --git a/src/social/components/EngagementBar/UIEngagementBar.tsx b/src/social/components/EngagementBar/UIEngagementBar.tsx index 328a3c158..7abef7342 100644 --- a/src/social/components/EngagementBar/UIEngagementBar.tsx +++ b/src/social/components/EngagementBar/UIEngagementBar.tsx @@ -73,7 +73,7 @@ const UIEngagementBar = ({ - {latestComments?.length > 0 ? ( + {post.commentsCount > 0 ? ( ) : null} @@ -91,7 +91,7 @@ const UIEngagementBar = ({ - {latestComments?.length > 0 ? ( + {post.commentsCount > 0 ? ( - {!isHiddenProfile ? ( - <> - {showPostCreator ? ( - prependItem(newPost)} - /> - ) : null} - {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - {(!isLoading || loadMoreHasBeenCalled) && contents.length > 0 && ( - ( - removeItem(postId)} - /> - ))} - /> - )} - - {!isLoading && contents.length === 0 && ( - - )} - - {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - ) : ( - - )} - + <> + {showPostCreator ? ( + prependItem(newPost)} + /> + ) : null} + + {!isHiddenProfile ? ( + <> + {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + {(!isLoading || loadMoreHasBeenCalled) && contents.length > 0 && ( + ( + removeItem(postId)} + /> + ))} + /> + )} + + {!isLoading && contents.length === 0 && ( + + )} + + {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + ) : ( + + )} + + ); }; @@ -147,63 +149,64 @@ const MyFeed = ({ } return ( - - {!isHiddenProfile ? ( - <> - - - {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - {(!isLoading || loadMoreHasBeenCalled) && posts.length > 0 && ( - - {posts.map((post) => ( - - ))} - - } - /> - )} - - {!isLoading && posts.length === 0 && ( - - )} - - {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - ) : ( - - )} - + <> + + + {!isHiddenProfile ? ( + <> + {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + {(!isLoading || loadMoreHasBeenCalled) && posts.length > 0 && ( + + {posts.map((post) => ( + + ))} + + } + /> + )} + + {!isLoading && posts.length === 0 && ( + + )} + + {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + ) : ( + + )} + + ); }; @@ -246,61 +249,62 @@ const CommunityFeed = ({ } return ( - - {!isHiddenProfile ? ( - <> - {showPostCreator ? ( - - ) : null} - - {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - {!isLoading && posts.length > 0 && ( - - {posts.map((post) => ( - - ))} - - } - /> - )} - - {!isLoading && posts.length === 0 && ( - - )} - - {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - ) : ( - - )} - + <> + {showPostCreator ? ( + + ) : null} + + {!isHiddenProfile ? ( + <> + {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + {!isLoading && posts.length > 0 && ( + + {posts.map((post) => ( + + ))} + + } + /> + )} + + {!isLoading && posts.length === 0 && ( + + )} + + {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + ) : ( + + )} + + ); }; @@ -345,65 +349,66 @@ const BaseFeed = ({ } return ( - - {!isHiddenProfile ? ( - <> - {showPostCreator && ( - - )} - - {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - {!isLoading && posts.length > 0 && ( - - {posts.map((post) => ( - - ))} - - } - /> - )} - - {!isLoading && posts.length === 0 && ( - - )} - - {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} - - ) : ( - + <> + {showPostCreator && ( + )} - + + {!isHiddenProfile ? ( + <> + {isLoading && !loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + {!isLoading && posts.length > 0 && ( + + {posts.map((post) => ( + + ))} + + } + /> + )} + + {!isLoading && posts.length === 0 && ( + + )} + + {isLoading && loadMoreHasBeenCalled ? renderLoadingSkeleton() : null} + + ) : ( + + )} + + ); }; diff --git a/src/social/components/StoryTab/StoryTab.tsx b/src/social/components/StoryTab/StoryTab.tsx new file mode 100644 index 000000000..c928efe51 --- /dev/null +++ b/src/social/components/StoryTab/StoryTab.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { useNavigation } from '~/social/providers/NavigationProvider'; +import { StoryTabCommunityFeed } from '~/v4/social/components/StoryTab/StoryTabCommunity'; +import { StoryTabGlobalFeed } from '~/v4/social/components/StoryTab/StoryTabGlobalFeed'; +import { useStoryContext } from '~/v4/social/providers/StoryProvider'; + +type StoryTabType = 'communityFeed' | 'globalFeed'; + +type StoryTabProps = { + type: T; + communityId?: T extends 'communityFeed' ? string : never; +}; + +export const StoryTab = ({ type, communityId }: StoryTabProps) => { + const componentId = 'story_tab_component'; + const { onClickStory, goToDraftStoryPage } = useNavigation(); + + const { setFile } = useStoryContext(); + + const renderStoryTab = () => { + switch (type) { + case 'communityFeed': + return ( + { + setFile(file); + if (file) { + goToDraftStoryPage( + communityId || '', + 'community', + file.type.includes('image') + ? { type: 'image', url: URL.createObjectURL(file) } + : { type: 'video', url: URL.createObjectURL(file) }, + 'communityFeed', + ); + } + }} + onStoryClick={() => onClickStory(communityId || '', 'communityFeed')} + /> + ); + case 'globalFeed': + return ( + { + onClickStory( + storyTarget.targetId, + 'globalFeed', + storyTargets.map((s) => s.targetId), + ); + }} + /> + ); + default: + return null; + } + }; + + return renderStoryTab(); +}; diff --git a/src/social/components/StoryTab/index.tsx b/src/social/components/StoryTab/index.tsx new file mode 100644 index 000000000..79f9f2f95 --- /dev/null +++ b/src/social/components/StoryTab/index.tsx @@ -0,0 +1 @@ +export { StoryTab } from './StoryTab'; diff --git a/src/social/components/post/Creator/index.tsx b/src/social/components/post/Creator/index.tsx index 01958cb2d..e9b43aa8f 100644 --- a/src/social/components/post/Creator/index.tsx +++ b/src/social/components/post/Creator/index.tsx @@ -168,43 +168,10 @@ const PostCreatorBar = ({ }); }; - async function onCreatePost() { + async function createPost(createPostParams: Parameters[0]) { if (!target.targetId) return; try { setIsCreating(true); - const data: { text?: string } = {}; - const attachments = []; - - if (text) { - data.text = text; - } - - if (postImages.length) { - attachments.push(...postImages.map((i) => ({ fileId: i.fileId, type: FileType.IMAGE }))); - } - - if (postVideos.length) { - attachments.push(...postVideos.map((i) => ({ fileId: i.fileId, type: FileType.VIDEO }))); - } - - if (postFiles.length) { - attachments.push(...postFiles.map((i) => ({ fileId: i.fileId, type: FileType.FILE }))); - } - - if (data.text?.length && data.text.length > MAXIMUM_POST_CHARACTERS) { - overCharacterModal(); - return; - } - - const createPostParams: Parameters[0] = { - targetId: target.targetId, - targetType: target.targetType, - data, - dataType: 'text', - attachments, - metadata, - mentionees, - }; const postData = await PostRepository.createPost(createPostParams); @@ -244,6 +211,45 @@ const PostCreatorBar = ({ } } + async function onCreatePost() { + if (!target.targetId) return; + const data: { text?: string } = {}; + const attachments = []; + + if (text) { + data.text = text; + } + + if (postImages.length) { + attachments.push(...postImages.map((i) => ({ fileId: i.fileId, type: FileType.IMAGE }))); + } + + if (postVideos.length) { + attachments.push(...postVideos.map((i) => ({ fileId: i.fileId, type: FileType.VIDEO }))); + } + + if (postFiles.length) { + attachments.push(...postFiles.map((i) => ({ fileId: i.fileId, type: FileType.FILE }))); + } + + if (data.text?.length && data.text.length > MAXIMUM_POST_CHARACTERS) { + overCharacterModal(); + return; + } + + const createPostParams: Parameters[0] = { + targetId: target.targetId, + targetType: target.targetType, + data, + dataType: 'text', + attachments, + metadata, + mentionees, + }; + + return createPost(createPostParams); + } + const onMaxFilesLimit = () => { notification.info({ content: , @@ -300,7 +306,7 @@ const PostCreatorBar = ({ targetType={creatorTargetType} onCreatePoll={async (pollId, text, pollMentionees, metadata) => { if (!creatorTargetId) return; - await PostRepository.createPost({ + createPost({ targetId: creatorTargetId, targetType: creatorTargetType, data: { pollId, text }, diff --git a/src/social/components/post/GalleryContent/styles.tsx b/src/social/components/post/GalleryContent/styles.tsx index e3f1619f5..a229f0527 100644 --- a/src/social/components/post/GalleryContent/styles.tsx +++ b/src/social/components/post/GalleryContent/styles.tsx @@ -20,13 +20,32 @@ export const RemoveButton = styled(Button).attrs<{ right: 0.5em; `; -export const PlayIcon = styled(Play)` +export const StyledPlayIcon = styled(Play)` + fill: #fff; +`; + +export const PlayIconContainer = styled.div` position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); + display: flex; + justify-content: center; + align-items: center; + + width: 2.25rem; + height: 2.25rem; + + background-color: ${({ theme }) => theme.palette.base.shade2}; + border-radius: 50%; `; +export const PlayIcon = (props: HTMLAttributes) => ( + + + +); + export const Duration = styled.div` position: absolute; left: 0.5rem; @@ -61,7 +80,8 @@ const BaseThumbnail = ({ const { formatNumber } = useIntl(); const formatDuration = (inputDuration: number) => { - const hour = formatNumber(Math.floor(inputDuration / 60 / 60), { + const floorHour = Math.floor(inputDuration / 60 / 60); + const hour = formatNumber(floorHour, { minimumIntegerDigits: 2, maximumSignificantDigits: 2, }); @@ -70,12 +90,14 @@ const BaseThumbnail = ({ maximumSignificantDigits: 2, }); - const second = formatNumber((inputDuration % 60) % 60, { + const roundedSecond = Math.round((inputDuration % 60) % 60); + + const second = formatNumber(roundedSecond, { minimumIntegerDigits: 2, maximumSignificantDigits: 2, }); - if (hour === '00') { + if (floorHour === 0) { return `${minute}:${second}`; } return `${hour}:${minute}:${second}`; diff --git a/src/social/components/post/LikeButton/styles.tsx b/src/social/components/post/LikeButton/styles.tsx index 54057d1a3..861460e3a 100644 --- a/src/social/components/post/LikeButton/styles.tsx +++ b/src/social/components/post/LikeButton/styles.tsx @@ -6,6 +6,7 @@ import { ThumbsUp } from '~/icons'; const isLikedStyle = css` color: ${({ theme }) => theme.palette.primary.main}; + fill: ${({ theme }) => theme.palette.primary.main}; `; export const StyledLikeButton = styled(SecondaryButton)` @@ -15,6 +16,8 @@ export const StyledLikeButton = styled(SecondaryButton)` export const BaseLikeIcon = styled(ThumbsUp)<{ icon?: ReactNode }>` font-size: 16px; margin-right: 5px; + color: #a5a9b5; + fill: #a5a9b5; `; export const IsLikedLikeIcon = styled(BaseLikeIcon)<{ icon?: ReactNode }>` diff --git a/src/social/components/post/PollContent/index.tsx b/src/social/components/post/PollContent/index.tsx index 758f5ed2b..bdb80189a 100644 --- a/src/social/components/post/PollContent/index.tsx +++ b/src/social/components/post/PollContent/index.tsx @@ -136,7 +136,7 @@ const PollContent = ({ pollId }: { pollId?: string }) => { } }; - const handleSubmit: React.MouseEventHandler = async (e) => { + const handleSubmit: React.MouseEventHandler = async (e) => { if (!pollId) return; e.preventDefault(); @@ -173,7 +173,7 @@ const PollContent = ({ pollId }: { pollId?: string }) => { )} {!isVoted && ( - + handleSubmit(e)}> )} diff --git a/src/social/components/post/PollContent/styles.tsx b/src/social/components/post/PollContent/styles.tsx index 05de8b63b..97bd23fd5 100644 --- a/src/social/components/post/PollContent/styles.tsx +++ b/src/social/components/post/PollContent/styles.tsx @@ -45,7 +45,7 @@ export const PollInformation = styled.div` margin-bottom: 12px; `; -export const SubmitButton = styled.a.attrs<{ disabled?: boolean }>({ role: 'button' })` +export const SubmitButton = styled.button.attrs<{ disabled?: boolean }>({ role: 'button' })` display: block; width: 100%; text-align: center; @@ -53,11 +53,12 @@ export const SubmitButton = styled.a.attrs<{ disabled?: boolean }>({ role: 'butt font-weight: 600; ${({ disabled, theme }) => - disabled ? theme.palette.primary.shade2 : theme.palette.primary.main}; - - &:hover { - cursor: pointer; - } + disabled + ? { + color: theme.palette.primary.shade2, + cursor: 'not-allowed', + } + : { color: theme.palette.primary.main, cursor: 'pointer' }}; `; export const ChipContainer = styled.div` diff --git a/src/social/components/post/Post/DefaultPostRenderer.tsx b/src/social/components/post/Post/DefaultPostRenderer.tsx index 0da4efad6..ce553f85a 100644 --- a/src/social/components/post/Post/DefaultPostRenderer.tsx +++ b/src/social/components/post/Post/DefaultPostRenderer.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; import Button, { PrimaryButton } from '~/core/components/Button'; import Modal from '~/core/components/Modal'; @@ -10,7 +10,8 @@ import PostHeader from '~/social/components/post/Header'; import Content from '~/social/components/post/Post/Content'; import { ContentSkeleton, - OptionMenu, + OptionButtonContainer, + OptionMenuContainer, PostContainer, PostHeadContainer, ReviewButtonsContainer, @@ -23,6 +24,12 @@ import usePostSubscription from '~/social/hooks/usePostSubscription'; import { SubscriptionLevels } from '@amityco/ts-sdk'; import { useConfirmContext } from '~/core/providers/ConfirmProvider'; import { useNotifications } from '~/core/providers/NotificationProvider'; +import usePostFlaggedByMe from '~/social/hooks/usePostFlaggedByMe'; +import { Option, OptionsButton, OptionsIcon } from '~/core/components/OptionMenu/styles'; +import { useDropdown } from '~/core/components/Dropdown/index'; +import useElementSize from '~/core/hooks/useElementSize'; +import { Frame, FrameContainer } from '~/core/components/Dropdown/styles'; +import { POSITION_BOTTOM, POSITION_RIGHT } from '~/helpers/getCssPosition'; // Number of lines to show in a text post before truncating. const MAX_TEXT_LINES_DEFAULT = 8; @@ -30,55 +37,45 @@ const MAX_TEXT_LINES_WITH_CHILDREN = 3; const ERROR_POST_HAS_BEEN_REVIEWED = 'Post has been reviewed'; -type DefaultPostRendererProps = PostRendererProps; +type OptionMenuProps = DefaultPostRendererProps & { + onApprove: () => void; + onDecline: () => void; + onEditPostClick: () => void; + onClose: () => void; + buttonContainerHeight: number; +}; -const DefaultPostRenderer = ({ +const OptionMenu = ({ childrenPosts = [], - className, handleDeletePost, handleReportPost, handleUnreportPost, - handleApprovePost, - handleDeclinePost, handleClosePoll, isPollClosed, - hidePostTarget, - isFlaggedByMe, - readonly, post, - loading, -}: DefaultPostRendererProps) => { + onEditPostClick, + onClose, + buttonContainerHeight, +}: OptionMenuProps) => { const { formatMessage } = useIntl(); - const [isEditing, setIsEditing] = useState(false); - const openEditingPostModal = () => setIsEditing(true); - const closeEditingPostModal = () => setIsEditing(false); + const { info, confirm } = useConfirmContext(); const notification = useNotifications(); - function showHasBeenReviewedMessageIfNeeded(error: unknown) { - if (error instanceof Error) { - if (error.message.includes(ERROR_POST_HAS_BEEN_REVIEWED)) { - info({ - title: , - content: , - }); - } else { - throw error; - } - } - } + const { isFlaggedByMe, toggleFlagPost } = usePostFlaggedByMe(post); const communityId = post?.targetId; const community = useCommunity(communityId); const { currentUserId } = useSDK(); + const dropdownRef = useRef(null); - usePostSubscription({ - postId: post?.postId, - level: SubscriptionLevels.POST, + const { currentPosition, align, scrollableHeight } = useDropdown({ + dropdownRef, + buttonContainerHeight, + position: POSITION_BOTTOM, + align: POSITION_RIGHT, }); - const [approving, setApproving] = useState(false); - const [declining, setDeclining] = useState(false); const { canEdit, canReview, canDelete, canReport, isPostUnderReview } = useCommunityPostPermission({ community, @@ -87,40 +84,20 @@ const DefaultPostRenderer = ({ userId: currentUserId || undefined, }); + const pollPost = childrenPosts.find((childPost) => childPost.dataType === 'poll'); + const onReportClick = async () => { + toggleFlagPost(); await handleReportPost?.(); notification.success({ content: }); }; const onUnreportClick = async () => { + toggleFlagPost(); await handleUnreportPost?.(); notification.success({ content: }); }; - const onApprove = async () => { - try { - setApproving(true); - await handleApprovePost?.(); - notification.success({ content: }); - } catch (error) { - showHasBeenReviewedMessageIfNeeded(error); - } finally { - setApproving(false); - } - }; - - const onDecline = async () => { - try { - setDeclining(true); - await handleDeclinePost?.(); - notification.success({ content: }); - } catch (error) { - showHasBeenReviewedMessageIfNeeded(error); - } finally { - setDeclining(false); - } - }; - const confirmDeletePost = () => { confirm({ title: formatMessage({ id: 'post.deletePost' }), @@ -132,13 +109,11 @@ const DefaultPostRenderer = ({ }); }; - const pollPost = childrenPosts.find((childPost) => childPost.dataType === 'poll'); - - const allOptions = [ + const options = [ canEdit ? { name: formatMessage({ id: 'post.editPost' }), - action: openEditingPostModal, + action: () => onEditPostClick(), } : null, canDelete @@ -163,6 +138,120 @@ const DefaultPostRenderer = ({ : null, ].filter(isNonNullable); + return ( + + + + {options.map(({ name, action }) => ( + + ))} + + + + ); +}; + +type DefaultPostRendererProps = PostRendererProps; + +const DefaultPostRenderer = (props: DefaultPostRendererProps) => { + const { + childrenPosts = [], + className, + handleApprovePost, + handleDeclinePost, + hidePostTarget, + readonly, + post, + loading, + } = props; + const { formatMessage } = useIntl(); + const [isEditing, setIsEditing] = useState(false); + const openEditingPostModal = () => setIsEditing(true); + const closeEditingPostModal = () => setIsEditing(false); + const { info, confirm } = useConfirmContext(); + const notification = useNotifications(); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [buttonContainerRef, buttonContainerHeight] = useElementSize(); + + const [approving, setApproving] = useState(false); + const [declining, setDeclining] = useState(false); + + const toggle = () => setIsMenuOpen((prev) => !prev); + + useEffect(() => { + if (isMenuOpen) { + document.addEventListener('click', toggle); + } else { + document.removeEventListener('click', toggle); + } + + return () => { + document.removeEventListener('click', toggle); + }; + }, [isMenuOpen]); + + function showHasBeenReviewedMessageIfNeeded(error: unknown) { + if (error instanceof Error) { + if (error.message.includes(ERROR_POST_HAS_BEEN_REVIEWED)) { + info({ + title: , + content: , + }); + } else { + throw error; + } + } + } + + const communityId = post?.targetId; + const community = useCommunity(communityId); + const { currentUserId } = useSDK(); + + usePostSubscription({ + postId: post?.postId, + level: SubscriptionLevels.POST, + }); + + const { canReview, isPostUnderReview } = useCommunityPostPermission({ + community, + post, + childrenPosts, + userId: currentUserId || undefined, + }); + + const onApprove = async () => { + try { + setApproving(true); + await handleApprovePost?.(); + notification.success({ content: }); + } catch (error) { + showHasBeenReviewedMessageIfNeeded(error); + } finally { + setApproving(false); + } + }; + + const onDecline = async () => { + try { + setDeclining(true); + await handleDeclinePost?.(); + notification.success({ content: }); + } catch (error) { + showHasBeenReviewedMessageIfNeeded(error); + } finally { + setDeclining(false); + } + }; + const hasChildrenPosts = childrenPosts.length > 0; const postMaxLines = hasChildrenPosts ? MAX_TEXT_LINES_WITH_CHILDREN : MAX_TEXT_LINES_DEFAULT; @@ -175,7 +264,31 @@ const DefaultPostRenderer = ({ - {!loading && } + {!loading && ( + +
+ { + event.stopPropagation(); + toggle(); + }} + className={className} + > + + +
+ {isMenuOpen && ( + openEditingPostModal()} + buttonContainerHeight={buttonContainerHeight} + /> + )} +
+ )}
{loading ? ( diff --git a/src/social/components/post/Post/index.tsx b/src/social/components/post/Post/index.tsx index 0930f5f34..9b474e2a3 100644 --- a/src/social/components/post/Post/index.tsx +++ b/src/social/components/post/Post/index.tsx @@ -9,7 +9,6 @@ import { PollRepository, PostRepository, SubscriptionLevels } from '@amityco/ts- import usePostByIds from '~/social/hooks/usePostByIds'; import { useCustomComponent } from '~/core/providers/CustomComponentsProvider'; import useImage from '~/core/hooks/useImage'; -import usePostFlaggedByMe from '~/social/hooks/usePostFlaggedByMe'; import { usePostRenderer } from '~/social/providers/PostRendererProvider'; import usePostSubscription from '~/social/hooks/usePostSubscription'; import useReactionSubscription from '~/social/hooks/useReactionSubscription'; @@ -28,7 +27,6 @@ const Post = ({ postId, className, hidePostTarget, readonly, onDeleted }: PostPr const avatarFileUrl = useImage({ fileId: postedUser?.avatarFileId, imageSize: 'small' }); const childrenPosts = usePostByIds(post?.children); const { userRoles } = useSDK(); - const { isFlaggedByMe, toggleFlagPost } = usePostFlaggedByMe(post); const postRenderFn = usePostRenderer(post?.dataType); const { currentUserId } = useSDK(); @@ -87,9 +85,6 @@ const Post = ({ postId, className, hidePostTarget, readonly, onDeleted }: PostPr post, userRoles, readonly, - isFlaggedByMe, - handleReportPost: toggleFlagPost, - handleUnreportPost: toggleFlagPost, handleApprovePost, handleDeclinePost, handleDeletePost, diff --git a/src/social/components/post/Post/styles.tsx b/src/social/components/post/Post/styles.tsx index a84aa7cfc..f56d302eb 100644 --- a/src/social/components/post/Post/styles.tsx +++ b/src/social/components/post/Post/styles.tsx @@ -4,6 +4,17 @@ import styled from 'styled-components'; import UIOptionMenu from '~/core/components/OptionMenu'; import Skeleton from '~/core/components/Skeleton'; +export const OptionButtonContainer = styled.div` + display: flex; + align-items: center; + + position: relative; +`; + +export const OptionMenuContainer = styled.div` + position: absolute; +`; + export const OptionMenu = styled(UIOptionMenu)<{ icon?: ReactNode }>` margin-left: auto; `; @@ -27,6 +38,7 @@ export const PostContainer = styled(PlainPostContainer)` export const PostHeadContainer = styled.div` display: flex; align-items: center; + justify-content: space-between; margin-bottom: 14px; `; diff --git a/src/social/constants.ts b/src/social/constants.ts index 4b96820e2..037a8097f 100644 --- a/src/social/constants.ts +++ b/src/social/constants.ts @@ -7,6 +7,7 @@ export const enum PageTypes { CommunityEdit = 'communityedit', UserEdit = 'useredit', ViewStory = 'viewstory', + DraftPage = 'draftpage', } export const MemberRoles = Object.freeze({ diff --git a/src/social/hooks/collections/useCommunityModeratorsCollection.ts b/src/social/hooks/collections/useCommunityModeratorsCollection.ts index 412c78f82..3019dd8bb 100644 --- a/src/social/hooks/collections/useCommunityModeratorsCollection.ts +++ b/src/social/hooks/collections/useCommunityModeratorsCollection.ts @@ -1,5 +1,4 @@ import { CommunityRepository } from '@amityco/ts-sdk'; - import useLiveCollection from '~/core/hooks/useLiveCollection'; import { MemberRoles } from '~/social/constants'; diff --git a/src/social/pages/Application/index.tsx b/src/social/pages/Application/index.tsx index c06c3b3ba..699e7b8f8 100644 --- a/src/social/pages/Application/index.tsx +++ b/src/social/pages/Application/index.tsx @@ -19,6 +19,8 @@ import useSDK from '~/core/hooks/useSDK'; import { StoryProvider } from '~/v4/social/providers/StoryProvider'; import CommunityFeed from '../CommunityFeed'; +import ViewStoryPage from '../ViewStoryPage'; +import AmityDraftStoryPage from '../DraftPage'; const ApplicationContainer = styled.div` height: 100%; @@ -44,7 +46,7 @@ const Wrapper = styled.div` `; const Community = () => { - const { page, onBack } = useNavigation(); + const { page } = useNavigation(); const { client } = useSDK(); const [socialSettings, setSocialSettings] = useState(null); @@ -87,6 +89,21 @@ const Community = () => { /> )} + {page.type === PageTypes.ViewStory && ( + + + + )} + + {page.type === PageTypes.DraftPage && ( + + )} + {page.type === PageTypes.CommunityEdit && ( )} diff --git a/src/social/pages/CommunityFeed/index.tsx b/src/social/pages/CommunityFeed/index.tsx index 337a34920..b0ca3f9bf 100644 --- a/src/social/pages/CommunityFeed/index.tsx +++ b/src/social/pages/CommunityFeed/index.tsx @@ -32,7 +32,7 @@ import useStories from '~/social/hooks/useStories'; import { BarsIcon } from '~/icons'; import { useStoryContext } from '~/v4/social/providers/StoryProvider'; -import { AmityDraftStoryPage } from '~/v4/social/pages'; +import { useNavigation } from '~/social/providers/NavigationProvider'; interface CommunityFeedProps { communityId: string; @@ -42,7 +42,7 @@ interface CommunityFeedProps { } const CommunityFeed = ({ communityId, isNewCommunity, isOpen, toggleOpen }: CommunityFeedProps) => { - const { file } = useStoryContext(); + const { goToDraftStoryPage } = useNavigation(); const { stories } = useStories({ targetId: communityId, targetType: 'community', @@ -54,8 +54,6 @@ const CommunityFeed = ({ communityId, isNewCommunity, isOpen, toggleOpen }: Comm const community = useCommunity(communityId); - const communityAvatar = useFile(community?.avatarFileId || ''); - const { canReview } = useCommunityPermission({ community }); const { posts } = usePostsCollection({ @@ -88,22 +86,6 @@ const CommunityFeed = ({ communityId, isNewCommunity, isOpen, toggleOpen }: Comm } }, [activeTab, tabs]); - if (file) { - return ( - - - - ); - } - return ( diff --git a/src/social/pages/DraftPage.tsx b/src/social/pages/DraftPage.tsx new file mode 100644 index 000000000..6fc187717 --- /dev/null +++ b/src/social/pages/DraftPage.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { + AmityDraftStoryPageProps, + PlainDraftStoryPage, +} from '~/v4/social/pages/DraftsPage/DraftsPage'; +import { PageTypes } from '~/social/constants'; +import { useNavigation } from '~/social/providers/NavigationProvider'; + +export const AmityDraftStoryPage = (props: AmityDraftStoryPageProps) => { + const { onChangePage, onClickCommunity } = useNavigation(); + + return ( + { + if (props.storyType === 'communityFeed') { + onClickCommunity(props.targetId); + } else { + onChangePage(PageTypes.NewsFeed); + } + }} + goToCommunityPage={(communityId) => onClickCommunity(communityId)} + goToGlobalFeedPage={() => onChangePage(PageTypes.NewsFeed)} + storyType={props.storyType} + /> + ); +}; + +export default AmityDraftStoryPage; diff --git a/src/social/pages/NewsFeed/index.tsx b/src/social/pages/NewsFeed/index.tsx index ac43e15e1..7caa3bd99 100644 --- a/src/social/pages/NewsFeed/index.tsx +++ b/src/social/pages/NewsFeed/index.tsx @@ -14,7 +14,7 @@ import { } from './styles'; import { BarsIcon } from '~/icons'; import { useIntl } from 'react-intl'; -import { StoryTab } from '~/v4/social/components'; +import { StoryTab } from '~/social/components/StoryTab'; interface NewsFeedProps { isOpen: boolean; diff --git a/src/social/pages/ViewStoryPage.tsx b/src/social/pages/ViewStoryPage.tsx new file mode 100644 index 000000000..808f373ea --- /dev/null +++ b/src/social/pages/ViewStoryPage.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { CommunityFeedStory } from '~/v4/social/pages/StoryPage/CommunityFeedStory'; +import { useNavigation } from '~/social/providers/NavigationProvider'; +import { ViewGlobalFeedStoryPage } from '~/v4/social/pages/StoryPage/ViewGlobalFeedStory'; +import { PageTypes } from '~/social/constants'; + +type ViewStoryPageType = 'communityFeed' | 'globalFeed'; + +interface AmityViewStoryPageProps { + type: ViewStoryPageType; + targetId: string; +} + +const ViewStoryPage: React.FC = ({ type, targetId }) => { + const pageId = 'view_story_page'; + const { onBack, goToDraftStoryPage, onClickCommunity, onChangePage, onClickStory } = + useNavigation(); + + const goToNewsFeed = () => { + onChangePage(PageTypes.NewsFeed); + }; + + const goToCommunity = (communityId: string) => { + onClickCommunity(communityId); + }; + + if (type === 'communityFeed') + return ( + + goToDraftStoryPage(targetId, targetType, mediaType, storyType) + } + /> + ); + + if (type === 'globalFeed') + return ( + onClickStory(targetId, 'globalFeed')} + goToDraftStoryPage={({ targetId, targetType, mediaType, storyType }) => + goToDraftStoryPage(targetId, targetType, mediaType, storyType) + } + onClickCommunity={(targetId) => onClickCommunity(targetId)} + /> + ); + + return null; +}; + +export default ViewStoryPage; diff --git a/src/social/providers/NavigationProvider.tsx b/src/social/providers/NavigationProvider.tsx index e2bf1d385..056501c3d 100644 --- a/src/social/providers/NavigationProvider.tsx +++ b/src/social/providers/NavigationProvider.tsx @@ -3,6 +3,7 @@ import { FormattedMessage } from 'react-intl'; import { useConfirmContext } from '~/core/providers/ConfirmProvider'; import { PageTypes } from '~/social/constants'; +import { AmityStoryMediaType } from '~/v4/social/pages/DraftsPage/DraftsPage'; type Page = | { @@ -32,10 +33,18 @@ type Page = | { type: PageTypes.ViewStory; storyId: string; - targetId?: string; + targetId: string; communityId?: string; - targetIds?: string[]; - storyType?: 'communityFeed' | 'globalFeed'; + targetIds: string[]; + storyType: 'communityFeed' | 'globalFeed'; + } + | { + type: PageTypes.DraftPage; + communityId?: string; + mediaType: AmityStoryMediaType; + targetId: string; + targetType: Amity.StoryTargetType; + storyType: 'communityFeed' | 'globalFeed'; }; type ContextValue = { @@ -54,6 +63,12 @@ type ContextValue = { onEditUser: (userId: string) => void; onMessageUser: (userId: string) => void; onBack: () => void; + goToDraftStoryPage: ( + targetId: string, + targetType: string, + mediaType: AmityStoryMediaType, + storyType: 'communityFeed' | 'globalFeed', + ) => void; setNavigationBlocker?: ( params: | { @@ -83,6 +98,7 @@ let defaultValue: ContextValue = { onMessageUser: (userId: string) => {}, setNavigationBlocker: () => {}, onBack: () => {}, + goToDraftStoryPage: (targetId: string) => {}, }; export const defaultNavigationBlocker = { @@ -109,6 +125,8 @@ if (process.env.NODE_ENV !== 'production') { onEditUser: (userId) => console.log(`NavigationContext onEditUser(${userId})`), onMessageUser: (userId) => console.log(`NavigationContext onMessageUser(${userId})`), onBack: () => console.log('NavigationContext onBack()'), + goToDraftStoryPage: (targetId, targetType, mediaType, storyType) => + console.log(`NavigationContext goToDraftStoryPage(${targetId})`), }; } @@ -139,6 +157,7 @@ interface NavigationProviderProps { onEditUser?: (userId: string) => void; onMessageUser?: (userId: string) => void; onBack?: () => void; + goToDraftStoryPage?: (targetId: string) => void; } export default function NavigationProvider({ @@ -352,6 +371,23 @@ export default function NavigationProvider({ [onChangePage, pushPage], ); + const goToDraftStoryPage = useCallback( + (targetId, targetType, mediaType, storyType) => { + const next = { + type: PageTypes.DraftPage, + targetId, + targetType, + mediaType, + storyType, + }; + + if (onChangePage) return onChangePage(next); + + pushPage(next); + }, + [onChangePage, pushPage], + ); + return ( diff --git a/src/utils.ts b/src/utils.ts index 8dd500000..f334aebde 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -5,15 +5,6 @@ export function isLoadingItem(item: T | { skeleton?: boolean }): item is { sk return !!(item as { skeleton?: boolean }).skeleton; } -export function isValidHttpUrl(url: string) { - try { - const newUrl = new URL(url); - return newUrl.protocol === 'http:' || newUrl.protocol === 'https:'; - } catch (err) { - return false; - } -} - export const checkStoryPermission = ( client: Amity.Client | null | undefined, communityId?: string, diff --git a/src/v4/chat/components/AmityLiveChatHeader/index.tsx b/src/v4/chat/components/AmityLiveChatHeader/index.tsx index fa8a7f48e..93e238217 100644 --- a/src/v4/chat/components/AmityLiveChatHeader/index.tsx +++ b/src/v4/chat/components/AmityLiveChatHeader/index.tsx @@ -1,27 +1,33 @@ import React from 'react'; import millify from 'millify'; import { FormattedMessage, useIntl } from 'react-intl'; -import UserAvatar from '~/v4/chat/components/UserAvatar'; -import { backgroundImage as communityBackgroundImage } from '~/v4/icons/Community'; +import Chat from '~/v4/icons/Chat'; import UserRegular from '~/v4/icons/UserRegular'; import useConnectionStates from '~/social/hooks/useConnectionStates'; import ConnectionSpinner from '~/v4/icons/ConnectionSpinner'; import { Typography } from '~/v4/core/components'; import styles from './styles.module.css'; import useChatInfo from '~/v4/chat/hooks/useChatInfo'; +import { Avatar, AVATAR_SIZE } from '~/v4/core/components/Avatar/Avatar'; +import { useAmityComponent } from '~/v4/core/hooks/uikit/index'; interface AmityLiveChatHeaderProps { channel: Amity.Channel | null; + pageId?: string; + componentId?: string; } -export const AmityLiveChatHeader = ({ channel }: AmityLiveChatHeaderProps) => { +export const AmityLiveChatHeader = ({ channel, pageId = '*' }: AmityLiveChatHeaderProps) => { + const componentId = 'chat_header'; + const { themeStyles } = useAmityComponent({ pageId, componentId }); + const { chatName, chatAvatar } = useChatInfo({ channel }); const { formatMessage } = useIntl(); const isOnline = useConnectionStates(); return ( -
- +
+ } />
{chatName || formatMessage({ id: 'loading' })} diff --git a/src/v4/chat/components/AmityLiveChatHeader/styles.module.css b/src/v4/chat/components/AmityLiveChatHeader/styles.module.css index d1d81ab14..09580e17d 100644 --- a/src/v4/chat/components/AmityLiveChatHeader/styles.module.css +++ b/src/v4/chat/components/AmityLiveChatHeader/styles.module.css @@ -7,17 +7,11 @@ } .displayName { - color: var( - --live-chat-chat-header-asc-color-base-inverse, - var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)) - ); + color: var(--asc-color-base-inverse); } .memberCount { - color: var( - --live-chat-chat-header-asc-color-base-default, - var(--live-chat-asc-color-base-default, var(--asc-color-base-default)) - ); + color: var(--asc-color-base-default); display: flex; align-items: center; } @@ -26,8 +20,5 @@ width: 0.75rem; height: 0.75rem; margin-right: var(--asc-spacing-xxs2); - fill: var( - --live-chat-chat-header-asc-color-base-default, - var(--live-chat-asc-color-base-default, var(--asc-color-base-default)) - ); + fill: var(--asc-color-base-default); } diff --git a/src/v4/chat/components/AmityLiveChatMessageComposeBar/index.tsx b/src/v4/chat/components/AmityLiveChatMessageComposeBar/index.tsx index 18441efca..cb118f8a9 100644 --- a/src/v4/chat/components/AmityLiveChatMessageComposeBar/index.tsx +++ b/src/v4/chat/components/AmityLiveChatMessageComposeBar/index.tsx @@ -10,6 +10,7 @@ import useChannelPermission from '~/v4/chat/hooks/useChannelPermission'; import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; import { useLiveChatNotifications } from '~/v4/chat/providers/LiveChatNotificationProvider'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; const COMPOSEBAR_MAX_CHARACTER_LIMIT = 200; @@ -37,7 +38,7 @@ type ComposeBarMention = { }; export const AmityLiveChatMessageComposeBar = ({ - pageId = 'live_chat', + pageId = '*', channel, suggestionRef, composeAction: { replyMessage, mentionMessage, clearReplyMessage, clearMention }, @@ -46,13 +47,13 @@ export const AmityLiveChatMessageComposeBar = ({ const [mentionList, setMentionList] = useState<{ [key: ComposeBarMention['id']]: ComposeBarMention; }>({}); + const componentId = 'message_composer'; + const { themeStyles, config } = useAmityComponent({ pageId, componentId }); const { confirm } = useConfirmContext(); const notification = useLiveChatNotifications(); - const { getConfig } = useCustomization(); - const componentConfig = getConfig(`${pageId}/${componentId}/*`); const commentInputRef = useRef(null); const { queryMentionees, mentionees, onChange, markup, metadata, text } = useMention({ @@ -68,7 +69,7 @@ export const AmityLiveChatMessageComposeBar = ({ if (!channel) return; if (text?.trim().length === 0) return; - if (text.trim().length > (componentConfig?.message_limit || COMPOSEBAR_MAX_CHARACTER_LIMIT)) { + if (text.trim().length > (config?.message_limit || COMPOSEBAR_MAX_CHARACTER_LIMIT)) { confirm({ title: formatMessage({ id: 'livechat.error.tooLongMessage.title' }), content: formatMessage({ id: 'livechat.error.tooLongMessage.description' }), @@ -119,7 +120,7 @@ export const AmityLiveChatMessageComposeBar = ({ }, []); return ( -
+
div { width: 100%; border-radius: var(--asc-border-radius-xxl); - background: var( - --live-chat-message-composer-asc-color-secondary-shade4, - var(--live-chat-asc-color-secondary-shade4, var(--asc-color-secondary-shade4)) - ); + background: var(--asc-color-secondary-shade4); textarea { padding: 0.563rem 1rem; @@ -65,14 +59,8 @@ padding: var(--asc-spacing-s1) var(--asc-spacing-s2); border-radius: var(--asc-border-radius-sm); border: var(--asc-border-radius-none); - background-color: var( - --live-chat-message-composer-asc-color-secondary, - var(--live-chat-asc-color-secondary, var(--asc-color-secondary-default)) - ); - color: var( - --live-chat-message-composer-asc-color-base-inverse, - var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)) - ); + background-color: var(--asc-color-secondary-default); + color: var(--asc-color-base-inverse); display: flex; align-items: center; @@ -83,8 +71,5 @@ } .mentionText { - color: var( - --live-chat-message-composer-asc-color-primary-default, - var(--live-chat-asc-color-primary-default, var(--asc-color-primary-default)) - ) !important; + color: var(--asc-color-primary-default); } diff --git a/src/v4/chat/components/AmityLiveChatMessageList/index.tsx b/src/v4/chat/components/AmityLiveChatMessageList/index.tsx index 34cbb6e9f..84e7a7e69 100644 --- a/src/v4/chat/components/AmityLiveChatMessageList/index.tsx +++ b/src/v4/chat/components/AmityLiveChatMessageList/index.tsx @@ -14,6 +14,7 @@ import { unFlagMessage } from '~/v4/utils/unFlagMessage'; import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; import { useLiveChatNotifications } from '~/v4/chat/providers/LiveChatNotificationProvider'; import { useCopyMessage } from '~/v4/core/hooks'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; interface AmityLiveChatMessageListProps { pageId?: string; @@ -22,7 +23,7 @@ interface AmityLiveChatMessageListProps { } export const AmityLiveChatMessageList = ({ - pageId, + pageId = '*', channel, replyMessage, }: AmityLiveChatMessageListProps) => { @@ -36,6 +37,8 @@ export const AmityLiveChatMessageList = ({ const notification = useLiveChatNotifications(); const copyMessage = useCopyMessage(); + const { themeStyles } = useAmityComponent({ pageId, componentId }); + const { messages: rawMessages, hasMore, @@ -64,7 +67,6 @@ export const AmityLiveChatMessageList = ({ content: formatMessage({ id: 'livechat.delete.message.error' }), }), }), - theme: 'dark', }); }; @@ -89,7 +91,7 @@ export const AmityLiveChatMessageList = ({ if (error) { return ( -
+
@@ -101,7 +103,7 @@ export const AmityLiveChatMessageList = ({ } return ( -
+
{containerRef.current && ( { return (
- + } />
diff --git a/src/v4/chat/components/LiveChatMessageContent/MessageBubbleContainer/styles.module.css b/src/v4/chat/components/LiveChatMessageContent/MessageBubbleContainer/styles.module.css index 240434c91..163d6932c 100644 --- a/src/v4/chat/components/LiveChatMessageContent/MessageBubbleContainer/styles.module.css +++ b/src/v4/chat/components/LiveChatMessageContent/MessageBubbleContainer/styles.module.css @@ -8,10 +8,7 @@ display: flex; gap: var(--asc-spacing-xxs2); align-items: center; - color: var( - --live-chat-message-list-asc-color-secondary-shade1, - var(--live-chat-asc-color-secondary-shade1, var(--asc-color-secondary-shade1)) - ); + color: var(--asc-color-secondary-shade2); margin-bottom: var(--asc-spacing-xxs2); } diff --git a/src/v4/chat/components/LiveChatMessageContent/MessageReaction/index.tsx b/src/v4/chat/components/LiveChatMessageContent/MessageReaction/index.tsx index 4b6499e43..356d7538a 100644 --- a/src/v4/chat/components/LiveChatMessageContent/MessageReaction/index.tsx +++ b/src/v4/chat/components/LiveChatMessageContent/MessageReaction/index.tsx @@ -99,7 +99,6 @@ export const MessageReaction = ({ }; useEffect(() => { - document.addEventListener('mousedown', onMouseDown); document.addEventListener('touchstart', handleClickOutside); return () => { diff --git a/src/v4/chat/components/LiveChatMessageContent/MessageReaction/styles.module.css b/src/v4/chat/components/LiveChatMessageContent/MessageReaction/styles.module.css index 6b1de54dc..5d1c882ec 100644 --- a/src/v4/chat/components/LiveChatMessageContent/MessageReaction/styles.module.css +++ b/src/v4/chat/components/LiveChatMessageContent/MessageReaction/styles.module.css @@ -6,7 +6,7 @@ position: absolute; bottom: 1.5rem; left: 0.625rem; - transform: translate(-50%, 0px); + transform: translate(-50%, 0); } .reactionButton { diff --git a/src/v4/chat/components/LiveChatMessageContent/MessageTextWithMention/styles.module.css b/src/v4/chat/components/LiveChatMessageContent/MessageTextWithMention/styles.module.css index b49054e75..9e77a66cd 100644 --- a/src/v4/chat/components/LiveChatMessageContent/MessageTextWithMention/styles.module.css +++ b/src/v4/chat/components/LiveChatMessageContent/MessageTextWithMention/styles.module.css @@ -1,13 +1,7 @@ .mentionText { - color: var( - --live-chat-message-list-asc-color-primary-default, - var(--live-chat-asc-color-primary-default, var(--asc-color-primary-default)) - ); + color: var(--asc-color-primary-default); } .hyperlink { - color: var( - --live-chat-message-list-asc-color-primary-default, - var(--live-chat-asc-color-primary-default, var(--asc-color-primary-default)) - ); + color: var(--asc-color-primary-default); } diff --git a/src/v4/chat/components/LiveChatMessageContent/styles.module.css b/src/v4/chat/components/LiveChatMessageContent/styles.module.css index 2b92e5f8e..0cf5143fd 100644 --- a/src/v4/chat/components/LiveChatMessageContent/styles.module.css +++ b/src/v4/chat/components/LiveChatMessageContent/styles.module.css @@ -31,10 +31,7 @@ background-color: var(--asc-color-base-shade4); gap: var(--asc-spacing-xxs2); border-radius: var(--asc-border-radius-lg); - color: var( - --live-chat-message-list-asc-color-base-inverse, - var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)) - ); + color: var(--asc-color-base-inverse); } .messageOptionsWrap { @@ -46,10 +43,7 @@ .binIcon { height: 1rem; width: 1rem; - fill: var( - --live-chat-message-list-asc-color-base-inverse, - var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)) - ); + fill: var(--asc-color-base-inverse); } .optionIcon { @@ -63,10 +57,7 @@ .timestamp { font-family: var(--asc-text-global-font-family); - color: var( - --live-chat-message-list-asc-color-base-shade2, - var(--live-chat-asc-color-base-shade2, var(--asc-color-base-shade2)) - ); + color: var(--asc-color-base-shade2); margin-bottom: var(--asc-spacing-s1); /* This value is not available in global css */ @@ -79,7 +70,7 @@ max-height: 85%; top: 15% !important; - @media (min-width: 768px) { + @media (width >= 768px) { width: 375px !important; } } @@ -92,4 +83,4 @@ .reactionListBackdrop { background-color: var(--asc-color-black) !important; opacity: 0.5 !important; -} \ No newline at end of file +} diff --git a/src/v4/chat/components/LiveChatNotification/styles.module.css b/src/v4/chat/components/LiveChatNotification/styles.module.css index f0e3857b5..336baa6ab 100644 --- a/src/v4/chat/components/LiveChatNotification/styles.module.css +++ b/src/v4/chat/components/LiveChatNotification/styles.module.css @@ -15,13 +15,13 @@ padding: 1.125rem var(--asc-spacing-m1); display: flex; align-items: center; - color: var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)); + color: var(--asc-color-base-inverse); border-radius: var(--asc-border-radius-md); animation-duration: 0.3s; animation-name: appear; animation-fill-mode: forwards; pointer-events: auto; - background-color: var(--live-chat-asc-color-base-shade4, var(--asc-color-base-shade4)); + background-color: var(--asc-color-base-shade4); } @keyframes appear { diff --git a/src/v4/chat/components/MessageQuickReaction/index.tsx b/src/v4/chat/components/MessageQuickReaction/index.tsx index 4d59a2045..7ff9939e9 100644 --- a/src/v4/chat/components/MessageQuickReaction/index.tsx +++ b/src/v4/chat/components/MessageQuickReaction/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback } from 'react'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; import { AmityReactionType, useCustomReaction } from '~/v4/core/providers/CustomReactionProvider'; import { QuickReactionIcon } from '~/v4/icons/QuickReactionIcon'; import { selectMessageReaction } from '~/v4/utils/selectMessageReaction'; @@ -19,25 +19,24 @@ export const MessageQuickReaction = ({ onSelectReaction, }: MessageQuickReactionProps) => { const elementId = 'message_quick_reaction'; - const { config: reactionConfig } = useCustomReaction(); - const { getConfig } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); + const { config } = useAmityElement({ pageId, componentId, elementId }); + const { config: reactionConfig } = useCustomReaction(); const onClickQuickReaction = useCallback(() => { if ( reactionConfig && - elementConfig.reaction && - reactionConfig.find((config) => config.name === elementConfig.reaction) + config.reaction && + reactionConfig.find((reaction) => reaction.name === config.reaction) ) { selectMessageReaction({ - reactionName: elementConfig.reaction as AmityReactionType['name'], + reactionName: config.reaction as AmityReactionType['name'], message, }); } onSelectReaction && onSelectReaction(); - }, [reactionConfig, elementConfig, message]); + }, [reactionConfig, config, message]); return (
diff --git a/src/v4/chat/components/MessageQuickReaction/styles.module.css b/src/v4/chat/components/MessageQuickReaction/styles.module.css index ce96cb230..b4d5a6f58 100644 --- a/src/v4/chat/components/MessageQuickReaction/styles.module.css +++ b/src/v4/chat/components/MessageQuickReaction/styles.module.css @@ -10,9 +10,6 @@ .quickReactionIconContainer:hover { cursor: pointer; - background-color: var( - --live-chat-message-list-asc-color-secondary-shade4, - var(--live-chat-asc-color-secondary-shade4, var(--asc-color-secondary-shade4)) - ); + background-color: var(--asc-color-secondary-shade4); border-radius: var(--asc-border-radius-sm); } diff --git a/src/v4/chat/components/MessageReactionPreview/index.tsx b/src/v4/chat/components/MessageReactionPreview/index.tsx index fc5d22f88..e48d25642 100644 --- a/src/v4/chat/components/MessageReactionPreview/index.tsx +++ b/src/v4/chat/components/MessageReactionPreview/index.tsx @@ -13,23 +13,25 @@ export const MessageReactionPreview = ({ }) => { const { config: reactionConfig } = useCustomReaction(); // find the top 3 reactions - const topReactions = useMemo( - () => - Object.entries(message.reactions) - .sort((a, b) => b[1] - a[1]) // sort by value in descending order - // remove reaction that has zero value - .filter((reaction) => reaction[1] > 0) - .slice(0, 3) - .sort((a, b) => a[1] - b[1]), - [message.reactions], - ); + const topReactions = message.reactions + ? useMemo( + () => + Object.entries(message.reactions) + .sort((a, b) => b[1] - a[1]) // sort by value in descending order + // remove reaction that has zero value + .filter((reaction) => reaction[1] > 0) + .slice(0, 3) + .sort((a, b) => a[1] - b[1]), + [message?.reactions], + ) + : []; - if (!message.reactionsCount) return null; + if (!message?.reactionsCount) return null; return (
diff --git a/src/v4/chat/components/MessageReactionPreview/styles.module.css b/src/v4/chat/components/MessageReactionPreview/styles.module.css index b8fd6addb..925401c60 100644 --- a/src/v4/chat/components/MessageReactionPreview/styles.module.css +++ b/src/v4/chat/components/MessageReactionPreview/styles.module.css @@ -24,15 +24,15 @@ } .reactionIconContainer > :first-child { - transform: translateX(0rem); + transform: translateX(0); } .reactionIconContainer > :nth-child(2) { - transform: translateX(0rem); + transform: translateX(0); } .reactionIconContainer > :last-child { - transform: translateX(0rem); + transform: translateX(0); } .reactionIcon { diff --git a/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/ReplyMessagePlaceholder.tsx b/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/ReplyMessagePlaceholder.tsx index b3174c3e4..af51ca5b6 100644 --- a/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/ReplyMessagePlaceholder.tsx +++ b/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/ReplyMessagePlaceholder.tsx @@ -1,11 +1,11 @@ import React from 'react'; import useUser from '~/core/hooks/useUser'; import styles from './styles.module.css'; -import UserAvatar from '~/v4/chat/components/UserAvatar'; -import { SIZE_ALIAS } from '~/core/hocs/withSize'; import { FormattedMessage } from 'react-intl'; -import { CloseIcon } from '~/icons'; -import { backgroundImage as userBackgroundImage } from '~/icons/User'; +import CloseIcon from '~/v4/icons/Close'; +import { Avatar } from '~/v4/core/components'; +import User from '~/v4/icons/User'; +import { AVATAR_SIZE } from '~/v4/core/components/Avatar/Avatar'; interface ReplyMessagePlaceholderProps { replyMessage: Amity.Message<'text'>; @@ -20,7 +20,7 @@ const ReplyMessagePlaceholder = ({ replyMessage, onDismiss }: ReplyMessagePlaceh return (
- + } />
diff --git a/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/styles.module.css b/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/styles.module.css index 6be928595..ba002e639 100644 --- a/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/styles.module.css +++ b/src/v4/chat/pages/AmityLiveChatPage/ChatContainer/styles.module.css @@ -10,7 +10,7 @@ gap: var(--asc-spacing-s2); padding: var(--asc-spacing-s1) var(--asc-spacing-s2); background-color: inherit; - border-top: 1px solid var(--live-chat-asc-color-base-shade2, var(--asc-color-base-shade2)); + border-top: 1px solid var(--asc-color-base-shade2); } .textInputContainer { @@ -20,8 +20,8 @@ & > div { width: 100%; border-radius: var(--asc-border-radius-xxl); - border: 1px solid var(--live-chat-asc-color-base-background, var(--asc-color-base-background)); - background: var(--live-chat-asc-color-secondary-shade4, var(--asc-color-secondary-shade4)); + border: 1px solid var(--asc-color-base-background); + background: var(--asc-color-secondary-shade4); textarea { padding: 0.563rem 1rem; @@ -37,10 +37,10 @@ border-radius: var(--asc-border-radius-sm); border: var(--asc-border-radius-none); background-color: var( - --live-chat-asc-color-secondary-default, - var(--asc-color-secondary-default) + --live-chat-asc-color-secondary-default, + var(--asc-color-secondary-default) ); - color: var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)); + color: var(--asc-color-base-inverse); display: flex; align-items: center; @@ -53,8 +53,8 @@ .replyPlaceholderContainer { display: flex; font-family: var(--asc-text-global-font-family); - background-color: var(--live-chat-asc-color-base-shade4, var(--asc-color-base-shade4)); - color: var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)); + background-color: var(--asc-color-base-shade4); + color: var(--asc-color-base-inverse); max-width: 100%; padding: var(--asc-spacing-s2); padding-left: var(--asc-spacing-m1); @@ -69,7 +69,7 @@ .replyProfile { display: flex; flex-direction: column; - color: var(--live-chat-asc-color-base-inverse, var(--asc-color-base-inverse)); + color: var(--asc-color-base-inverse); font-size: var(--asc-text-font-size-sm); line-height: var(--asc-line-height-sm); flex: 1; @@ -106,8 +106,8 @@ .mutedChannelContainer { display: flex; font-family: var(--asc-text-global-font-family); - background-color: var(--live-chat-asc-color-base-shade4, var(--asc-color-base-shade4)); - color: var(--live-chat-asc-color-base-shade1, var(--asc-color-base-shade1)); + background-color: var(--asc-color-base-shade4); + color: var(--asc-color-base-shade1); max-width: 100%; padding: var(--asc-spacing-s2); padding-left: var(--asc-spacing-m1); @@ -116,11 +116,11 @@ } .mutedIcon { - color: var(--live-chat-asc-color-base-shade3, var(--asc-color-base-shade3)); + color: var(--asc-color-base-shade3); } .commentAltIcon { - color: var(--live-chat-asc-color-base-shade2, var(--asc-color-base-shade2)); + color: var(--asc-color-base-shade2); } .banStatePanel { @@ -132,5 +132,5 @@ text-align: center; gap: var(--asc-spacing-s2); padding: var(--asc-spacing-m1); - color: var(--live-chat-asc-color-base-shade2, var(--asc-color-base-shade2)); -} \ No newline at end of file + color: var(--asc-color-base-shade2); +} diff --git a/src/v4/chat/pages/AmityLiveChatPage/index.tsx b/src/v4/chat/pages/AmityLiveChatPage/index.tsx index 18321dd20..6aac7f660 100644 --- a/src/v4/chat/pages/AmityLiveChatPage/index.tsx +++ b/src/v4/chat/pages/AmityLiveChatPage/index.tsx @@ -4,6 +4,7 @@ import AmityLiveChatHeader from '~/v4/chat/components/AmityLiveChatHeader'; import ChatContainer from './ChatContainer'; import styles from './styles.module.css'; import { LiveChatNotificationProvider } from '~/v4/chat/providers/LiveChatNotificationProvider'; +import { useAmityPage } from '~/v4/core/hooks/uikit'; interface AmityLiveChatPageProps { channelId: Amity.Channel['channelId']; @@ -11,14 +12,15 @@ interface AmityLiveChatPageProps { export const AmityLiveChatPage = ({ channelId }: AmityLiveChatPageProps) => { const channel = useChannel(channelId); + const pageId = 'live_chat'; + const { themeStyles } = useAmityPage({ pageId }); const ref = useRef(null); - const pageId = 'live_chat_page'; return ( -
+
- +
diff --git a/src/v4/chat/pages/AmityLiveChatPage/styles.module.css b/src/v4/chat/pages/AmityLiveChatPage/styles.module.css index 451ec7536..0bb535a12 100644 --- a/src/v4/chat/pages/AmityLiveChatPage/styles.module.css +++ b/src/v4/chat/pages/AmityLiveChatPage/styles.module.css @@ -1,7 +1,7 @@ .messageListSheet { z-index: 1000 !important; - @media (min-width: 768px) { + @media (width >= 768px) { width: 375px !important; } @@ -18,7 +18,7 @@ .amtiyLivechatPage { display: flex; flex-direction: column; - background-color: var(--live-chat-asc-color-base-background, var(--asc-color-base-background)); + background-color: var(--asc-color-base-background); height: 100%; overflow-y: hidden; } diff --git a/src/v4/core/IconComponent.tsx b/src/v4/core/IconComponent.tsx new file mode 100644 index 000000000..1755baddb --- /dev/null +++ b/src/v4/core/IconComponent.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Button, PressEvent } from 'react-aria-components'; + +export interface IconComponentProps { + defaultIcon: () => JSX.Element; + imgIcon: () => JSX.Element; + onPress?: (e: PressEvent) => void; + defaultIconName?: string; + configIconName?: string; + 'data-qa-anchor'?: string; + style?: React.CSSProperties; + className?: string; +} + +export const IconComponent = ({ + defaultIcon, + imgIcon, + onPress, + style, + defaultIconName, + configIconName, + className, +}: IconComponentProps) => { + return ( + + ); +}; diff --git a/src/v4/core/components/Avatar/Avatar.module.css b/src/v4/core/components/Avatar/Avatar.module.css index 1fa3fe8e1..c2e500469 100644 --- a/src/v4/core/components/Avatar/Avatar.module.css +++ b/src/v4/core/components/Avatar/Avatar.module.css @@ -6,10 +6,6 @@ background-color: var(--asc-color-base-shade3); } -.avatarContainer.visible .img { - opacity: 1; -} - .avatarContainer.clickable:hover { cursor: pointer; } @@ -56,7 +52,7 @@ position: absolute; z-index: 2; opacity: 0.5; - background-color: #000000; + background-color: #000; width: 100%; height: 100%; } @@ -98,3 +94,7 @@ height: 4rem; width: 4rem; } + +.avatarContainer.visible .img { + opacity: 1; +} diff --git a/src/v4/core/components/Avatar/Avatar.tsx b/src/v4/core/components/Avatar/Avatar.tsx index 12a061429..8a324f3dd 100644 --- a/src/v4/core/components/Avatar/Avatar.tsx +++ b/src/v4/core/components/Avatar/Avatar.tsx @@ -2,14 +2,20 @@ import React, { useState, useCallback } from 'react'; import clsx from 'clsx'; import styles from './Avatar.module.css'; +export const enum AVATAR_SIZE { + SMALL = 'small', + MEDIUM = 'medium', + LARGE = 'large', +} + export interface AvatarProps { className?: string; avatar?: string | null; showOverlay?: boolean; onClick?: () => void; loading?: boolean; - backgroundImage?: string | null; - size?: 'small' | 'medium' | 'large'; + defaultImage?: React.ReactNode; + size?: AVATAR_SIZE; } export const Avatar = ({ @@ -18,8 +24,8 @@ export const Avatar = ({ showOverlay, onClick, loading, - size = 'medium', - backgroundImage, + size = AVATAR_SIZE.MEDIUM, + defaultImage, ...props }: AvatarProps) => { const [visible, setVisible] = useState(false); @@ -62,7 +68,9 @@ export const Avatar = ({ alt="Avatar" /> ) - ) : null} + ) : ( + defaultImage ?? null + )}
); }; diff --git a/src/v4/core/components/Avatar/index.ts b/src/v4/core/components/Avatar/index.ts index d3fb6dfa7..0fb0a0baa 100644 --- a/src/v4/core/components/Avatar/index.ts +++ b/src/v4/core/components/Avatar/index.ts @@ -1 +1 @@ -export { Avatar } from './Avatar'; +export { Avatar, AVATAR_SIZE } from './Avatar'; diff --git a/src/v4/core/components/BottomSheet/BottomSheet.module.css b/src/v4/core/components/BottomSheet/BottomSheet.module.css index 73ad9606f..18f070685 100644 --- a/src/v4/core/components/BottomSheet/BottomSheet.module.css +++ b/src/v4/core/components/BottomSheet/BottomSheet.module.css @@ -1,27 +1,28 @@ -/* -You can add your own styles or override the default sheet styles via the exposed class names. -Note that you might need to use !important for style overrides since the inner styles are applied as inline styles -which have higher specificity. +/* +You can add your own styles or override the default sheet styles via the exposed class names. +Note that you might need to use !important for style overrides since the inner styles are applied as inline styles +which have higher specificity. */ .bottomSheet__container { - background-color: var(--asc-color-base-background); + background-color: var(--asc-color-base-background) !important; } .bottomSheet__header { - padding: 1rem; - display: flex; - justify-content: center; -} - -.bottomSheet__drag-indicator { + background-color: var(--asc-color-base-background); + border-top-left-radius: var(--asc-border-radius-xl); + border-top-right-radius: var(--asc-border-radius-xl); + text-align: center; + color: var(--asc-color-base-default); + border-bottom: 1px solid var(--asc-color-base-shade4); + padding-bottom: var(--asc-spacing-m1); } .bottomSheet__content { background-color: var(--asc-color-base-background); - padding: 1rem; + padding: var(--asc-spacing-m1); } .bottomSheet__backdrop { - background-color: rgba(0, 0, 0, 0.5); + background-color: rgb(0 0 0 / 50%); } diff --git a/src/v4/core/components/BottomSheet/BottomSheet.tsx b/src/v4/core/components/BottomSheet/BottomSheet.tsx index 5b5653ab9..42e1b1316 100644 --- a/src/v4/core/components/BottomSheet/BottomSheet.tsx +++ b/src/v4/core/components/BottomSheet/BottomSheet.tsx @@ -21,12 +21,7 @@ export const BottomSheet = ({ children, headerTitle, ...props }: BottomSheetProp return ( - + {headerTitle && ( diff --git a/src/v4/core/components/Button/Button.module.css b/src/v4/core/components/Button/Button.module.css index f0c9688d3..222efd315 100644 --- a/src/v4/core/components/Button/Button.module.css +++ b/src/v4/core/components/Button/Button.module.css @@ -62,4 +62,4 @@ .icon { margin-right: var(--asc-spacing-s1); -} \ No newline at end of file +} diff --git a/src/v4/core/components/ConfirmModal/index.tsx b/src/v4/core/components/ConfirmModal/index.tsx index 346ae463f..b06aa3a73 100644 --- a/src/v4/core/components/ConfirmModal/index.tsx +++ b/src/v4/core/components/ConfirmModal/index.tsx @@ -1,12 +1,22 @@ -import React from 'react'; +import React, { ReactNode } from 'react'; import Modal from '~/v4/core/components/Modal'; import { Button } from '~/v4/core/components/Button'; import clsx from 'clsx'; import styles from './styles.module.css'; -import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; +import { ConfirmType, useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; +import { useAmityElement } from '~/v4/core/hooks/uikit/index'; + +interface ConfirmProps extends ConfirmType { + className?: string; + okText?: ReactNode; + cancelText?: ReactNode; + type?: 'confirm' | 'info'; +} const Confirm = ({ - 'data-qa-anchor': dataQaAnchor = '', + pageId = '*', + componentId = '*', + elementId = '*', className, title, content, @@ -15,36 +25,42 @@ const Confirm = ({ cancelText = 'Cancel', onCancel, type = 'confirm', -}: any) => ( - - {type === 'confirm' && ( +}: ConfirmProps) => { + const { accessibilityId, themeStyles } = useAmityElement({ pageId, componentId, elementId }); + return ( + + {type === 'confirm' && ( + + )} - )} - -
- } - onCancel={onCancel} - > -
{content}
- -); +
+ } + onCancel={onCancel} + > +
{content}
+ + ); +}; export const ConfirmComponent = () => { const { confirmData, closeConfirm } = useConfirmContext(); diff --git a/src/v4/core/components/Drawer/Drawer.module.css b/src/v4/core/components/Drawer/Drawer.module.css new file mode 100644 index 000000000..ad4a3fd73 --- /dev/null +++ b/src/v4/core/components/Drawer/Drawer.module.css @@ -0,0 +1,41 @@ +.drawer__content { + padding: 1rem; + background-color: var(--asc-color-base-background); + max-height: 50%; + position: fixed; + bottom: 0; + left: 0; + right: 0; + display: flex; + flex-direction: column; + border-top-left-radius: 0.625rem; + border-top-right-radius: 0.625rem; + margin-top: 6rem; +} + +.drawer__content:focus { + outline: none; +} + +.drawer__innerContent { + background-color: var(--asc-color-base-background); + border-top-left-radius: 0.625rem; + border-top-right-radius: 0.625rem; + flex: 1; +} + +.drawer__placeholder { + margin: auto; + width: 3rem; + height: 0.375rem; + flex-shrink: 0; + border-radius: 9999px; + background-color: var(--asc-color-secondary-shade2); + margin-bottom: 2rem; +} + +.drawer__overlay { + background-color: color(from var(--asc-color-base-background) srgb r g b / 50%); + inset: 0; + position: fixed; +} diff --git a/src/v4/core/components/Drawer/Drawer.tsx b/src/v4/core/components/Drawer/Drawer.tsx new file mode 100644 index 000000000..1afd98ef3 --- /dev/null +++ b/src/v4/core/components/Drawer/Drawer.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import styles from './Drawer.module.css'; +import { useDrawer, useDrawerData } from '../../providers/DrawerProvider'; +import { Drawer } from 'vaul'; + +export const DrawerContainer = () => { + const drawerData = useDrawerData(); + const { removeDrawerData } = useDrawer(); + + const isOpen = drawerData != null; + + return ( + open === false && removeDrawerData()}> + + + +
+
+ {drawerData?.content} +
+ + + + ); +}; diff --git a/src/v4/core/components/Drawer/index.ts b/src/v4/core/components/Drawer/index.ts new file mode 100644 index 000000000..ae7b1ba67 --- /dev/null +++ b/src/v4/core/components/Drawer/index.ts @@ -0,0 +1 @@ +export { DrawerContainer } from './Drawer'; diff --git a/src/v4/core/components/InputText/styles.module.css b/src/v4/core/components/InputText/styles.module.css index 4f93ad650..ba0a542d6 100644 --- a/src/v4/core/components/InputText/styles.module.css +++ b/src/v4/core/components/InputText/styles.module.css @@ -3,7 +3,6 @@ display: flex; flex-wrap: wrap; min-width: 1em; - background: var(--asc-color-base-shade4); border: 1px solid var(--asc-color-base-shade4); border-radius: 1.25rem; @@ -25,7 +24,7 @@ width: 1%; min-width: 0; margin: 0; - padding: 0.563rem 0.563rem; + padding: 0.563rem; background: none; border: none; box-sizing: border-box; @@ -75,7 +74,7 @@ width: 1%; min-width: 0; margin: 0; - padding: 0.563rem 0.563rem; + padding: 0.563rem; background: none; border: none; box-sizing: border-box; @@ -105,6 +104,7 @@ border-bottom: 1px solid var(--asc-color-base-shade3); /* Use !important to override inline-css at target element */ + /* Keep a position of suggest panel strict with the top of compose bar same as design */ bottom: 2rem !important; left: 0 !important; diff --git a/src/v4/core/components/LoadMoreWrapper/LoadMoreWrapper.module.css b/src/v4/core/components/LoadMoreWrapper/LoadMoreWrapper.module.css index a766c66c0..14fdd88c0 100644 --- a/src/v4/core/components/LoadMoreWrapper/LoadMoreWrapper.module.css +++ b/src/v4/core/components/LoadMoreWrapper/LoadMoreWrapper.module.css @@ -7,6 +7,7 @@ padding: 0.3125rem 0.75rem 0.3125rem 0.5rem; border-radius: 0.25rem; margin-left: 3rem; + margin-bottom: var(--asc-spacing-m1); } .loadMoreButton.textCenter { @@ -22,7 +23,7 @@ color: var(--asc-color-base-default); border: none; margin-top: 1rem; - padding: 0 0 1rem 0; + padding: 0 0 1rem; border-bottom: 1px solid #e3e4e8; } diff --git a/src/v4/core/components/Modal/index.tsx b/src/v4/core/components/Modal/index.tsx index 4fc246cbf..938359bc8 100644 --- a/src/v4/core/components/Modal/index.tsx +++ b/src/v4/core/components/Modal/index.tsx @@ -2,9 +2,12 @@ import React, { ReactNode, useEffect, useRef } from 'react'; import styles from './styles.module.css'; import clsx from 'clsx'; import Close from '~/v4/icons/Close'; +import { useAmityElement } from '../../hooks/uikit'; export interface ModalProps { - 'data-qa-anchor'?: string; + pageId?: string; + componentId?: string; + elementId?: string; size?: 'small' | ''; className?: string; onOverlayClick?: () => void; @@ -16,7 +19,9 @@ export interface ModalProps { } const Modal = ({ - 'data-qa-anchor': dataQaAnchor = '', + pageId = '*', + componentId = '*', + elementId = '*', size = '', onOverlayClick = () => {}, onCancel, @@ -24,6 +29,8 @@ const Modal = ({ footer, children, }: ModalProps) => { + const { accessibilityId, themeStyles } = useAmityElement({ pageId, componentId, elementId }); + const modalRef = useRef(null); // auto focus to prevent scroll on background (when focus kept on trigger button) useEffect(() => { @@ -31,10 +38,10 @@ const Modal = ({ }, [modalRef?.current]); return ( -
+
diff --git a/src/v4/core/components/Modal/styles.module.css b/src/v4/core/components/Modal/styles.module.css index 9e1d71960..12714ffd1 100644 --- a/src/v4/core/components/Modal/styles.module.css +++ b/src/v4/core/components/Modal/styles.module.css @@ -1,7 +1,6 @@ .closeIcon { width: 1.125rem; height: 1.125rem; - padding: 0 0.375rem; cursor: pointer; margin-left: auto; @@ -24,14 +23,11 @@ .overlay { z-index: 9999; position: fixed; - top: 0; - bottom: 0; - right: 0; - left: 0; + inset: 0; overflow-y: auto; display: flex; padding: var(--asc-spacing-m2) 0; - background: rgba(23, 24, 28, 0.8); + background: rgb(23 24 28 / 80%); animation-duration: 0.3s; animation-name: appear; margin-top: 0 !important; @@ -42,6 +38,7 @@ border-radius: var(--asc-border-radius-lg); max-width: 32.5rem; min-width: 20rem; + /* TOFIX --asc-color-base-background is not defined some how */ background-color: var(--asc-color-white); } diff --git a/src/v4/core/components/Notification/Notification.module.css b/src/v4/core/components/Notification/Notification.module.css new file mode 100644 index 000000000..0acb559a7 --- /dev/null +++ b/src/v4/core/components/Notification/Notification.module.css @@ -0,0 +1,63 @@ +.icon__container { + display: flex; + padding: var(--asc-spacing-m1) var(--asc-spacing-s2); + align-items: center; + gap: var(--asc-spacing-s1); + align-self: stretch; +} + +.icon { + width: var(--asc-spacing-m2); + height: var(--asc-spacing-m2); +} + +.notifications { + position: fixed; + top: 0; + left: 0; + right: 0; + display: flex; + flex-direction: column; + align-items: center; + z-index: 99999; + pointer-events: none; + padding: var(--asc-spacing-m1); +} + +.notificationContainer { + width: 21.438rem; + display: flex; + justify-content: flex-start; + align-items: center; + color: var(--asc-color-white); + border-radius: var(--asc-border-radius-md); + margin-bottom: var(--asc-spacing-m1); + animation-duration: 0.3s; + animation-name: appear; + pointer-events: auto; + background-color: var(--asc-color-secondary-default); + box-shadow: var(--asc-box-shadow-02); +} + +@keyframes appear { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@media (width <= 768px) { + .notifications { + top: auto; + bottom: 0; + padding-bottom: var(--asc-spacing-l1); + } + + .notificationContainer { + width: 100%; + margin-bottom: var(--asc-spacing-none); + } +} diff --git a/src/v4/core/components/Notification/index.tsx b/src/v4/core/components/Notification/index.tsx index 748b487b5..b6913e9a9 100644 --- a/src/v4/core/components/Notification/index.tsx +++ b/src/v4/core/components/Notification/index.tsx @@ -1,6 +1,6 @@ import React, { ReactNode } from 'react'; import clsx from 'clsx'; -import styles from './styles.module.css'; +import styles from './Notification.module.css'; import { useNotificationData } from '~/v4/core/providers/NotificationProvider'; interface NotificationProps { @@ -11,7 +11,7 @@ interface NotificationProps { const Notification = ({ className, content, icon }: NotificationProps) => (
- {icon} {content} +
{icon}
{content}
); diff --git a/src/v4/core/components/SocialMentionItem/index.tsx b/src/v4/core/components/SocialMentionItem/index.tsx index b9933079e..dc818cbc9 100644 --- a/src/v4/core/components/SocialMentionItem/index.tsx +++ b/src/v4/core/components/SocialMentionItem/index.tsx @@ -1,16 +1,15 @@ import React, { useCallback, useEffect, useRef } from 'react'; import clsx from 'clsx'; -import UserAvatar from '~/v4/chat/components/UserAvatar'; -import { backgroundImage as userBackgroundImage } from '~/icons/User'; import BanIcon from '~/icons/Ban'; import useObserver from '~/core/hooks/useObserver'; import useUser from '~/core/hooks/useUser'; import useImage from '~/core/hooks/useImage'; import styles from './styles.module.css'; import { MentionIcon } from '~/icons'; -import { SIZE_ALIAS } from '~/core/hooks/useSize'; import { FormattedMessage } from 'react-intl'; import { Typography } from '../index'; +import { Avatar, AVATAR_SIZE } from '~/v4/core/components/Avatar'; +import User from '~/v4/icons/User'; interface SocialMentionItemProps { id: string; @@ -58,11 +57,7 @@ const UserMentionItem = ({ className={clsx(styles.mentionItem, user?.isGlobalBanned && 'isBanned')} onMouseEnter={(e) => onMouseEnter(e, user?.isGlobalBanned)} > - + } />
{user?.displayName}
diff --git a/src/v4/core/components/Typography/Typography.tsx b/src/v4/core/components/Typography/Typography.tsx index 7eff4074b..4c0d08c68 100644 --- a/src/v4/core/components/Typography/Typography.tsx +++ b/src/v4/core/components/Typography/Typography.tsx @@ -5,6 +5,7 @@ import typography from '~/v4/styles/typography.module.css'; interface TypographyProps { children: React.ReactNode; className?: string; + style?: React.CSSProperties; } const Typography: React.FC & { @@ -15,85 +16,92 @@ const Typography: React.FC & { BodyBold: React.FC; Caption: React.FC; CaptionBold: React.FC; -} = ({ children, className = '', ...props }) => { +} = ({ children, className = '', style, ...rest }) => { return ( -
+
{children}
); }; -Typography.Heading = ({ children, className = '', ...props }) => { +Typography.Heading = ({ children, className = '', style, ...rest }) => { return (

{children}

); }; -Typography.Title = ({ children, className = '', ...props }) => { +Typography.Title = ({ children, className = '', style, ...rest }) => { return (

{children}

); }; -Typography.Subtitle = ({ children, className = '', ...props }) => { +Typography.Subtitle = ({ children, className = '', style, ...rest }) => { return (

{children}

); }; -Typography.Body = ({ children, className = '', ...props }) => { +Typography.Body = ({ children, className = '', style, ...rest }) => { return (

{children}

); }; -Typography.BodyBold = ({ children, className = '', ...props }) => { +Typography.BodyBold = ({ children, className = '', style, ...rest }) => { return (

{children}

); }; -Typography.Caption = ({ children, className = '', ...props }) => { +Typography.Caption = ({ children, className = '', style, ...rest }) => { return (

{children}

); }; -Typography.CaptionBold = ({ children, className = '', ...props }) => { +Typography.CaptionBold = ({ children, className = '', style, ...rest }) => { return (

{children}

diff --git a/src/v4/core/hooks/collections/useAllUsersCollection.ts b/src/v4/core/hooks/collections/useAllUsersCollection.ts new file mode 100644 index 000000000..ba6870538 --- /dev/null +++ b/src/v4/core/hooks/collections/useAllUsersCollection.ts @@ -0,0 +1,15 @@ +import { UserRepository } from '@amityco/ts-sdk'; + +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +export default function useAllUsersCollection() { + const { items, ...rest } = useLiveCollection({ + fetcher: UserRepository.getUsers, + params: {}, + }); + + return { + users: items, + ...rest, + }; +} diff --git a/src/v4/core/hooks/collections/useCommunitiesCollection.ts b/src/v4/core/hooks/collections/useCommunitiesCollection.ts new file mode 100644 index 000000000..771190893 --- /dev/null +++ b/src/v4/core/hooks/collections/useCommunitiesCollection.ts @@ -0,0 +1,18 @@ +import { CommunityRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/core/hooks/useLiveCollection'; + +export default function useCommunitiesCollection( + queryParams?: Parameters[0], + shouldCall?: () => boolean, +) { + const { items, ...rest } = useLiveCollection({ + fetcher: CommunityRepository.getCommunities, + params: queryParams as Parameters[0], + shouldCall: () => !!queryParams && (shouldCall ? shouldCall?.() : true), + }); + + return { + communities: items, + ...rest, + }; +} diff --git a/src/v4/core/hooks/collections/useCommunity.ts b/src/v4/core/hooks/collections/useCommunity.ts new file mode 100644 index 000000000..7810c2c79 --- /dev/null +++ b/src/v4/core/hooks/collections/useCommunity.ts @@ -0,0 +1,23 @@ +import { CommunityRepository } from '@amityco/ts-sdk'; +import useLiveObject from '~/v4/core/hooks/useLiveObject'; + +const useCommunity = ({ + communityId, + shouldCall = () => true, +}: { + communityId: string | null | undefined; + shouldCall?: () => boolean; +}) => { + const { item, ...rest } = useLiveObject({ + fetcher: CommunityRepository.getCommunity, + params: communityId, + shouldCall: () => shouldCall() && !!communityId, + }); + + return { + community: item, + ...rest, + }; +}; + +export default useCommunity; diff --git a/src/v4/core/hooks/collections/useFollowersCollection.ts b/src/v4/core/hooks/collections/useFollowersCollection.ts new file mode 100644 index 000000000..b6e0999f4 --- /dev/null +++ b/src/v4/core/hooks/collections/useFollowersCollection.ts @@ -0,0 +1,26 @@ +import { UserRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +type FollowStatusInput = Amity.QueryFollowers['status']; + +export default function useFollowersCollection({ + userId, + status, +}: { + userId?: string | null; + status: FollowStatusInput; +}) { + const { items, ...rest } = useLiveCollection({ + fetcher: UserRepository.Relationship.getFollowers, + params: { + userId: userId as string, + status: status ?? undefined, + }, + shouldCall: () => !!userId, + }); + + return { + followers: items, + ...rest, + }; +} diff --git a/src/v4/core/hooks/collections/useFollowingsCollection.ts b/src/v4/core/hooks/collections/useFollowingsCollection.ts new file mode 100644 index 000000000..6c506670e --- /dev/null +++ b/src/v4/core/hooks/collections/useFollowingsCollection.ts @@ -0,0 +1,26 @@ +import { UserRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +type FollowStatusInput = Amity.QueryFollowings['status']; + +export default function useFollowingsCollection({ + userId, + status, +}: { + userId?: string | null; + status: FollowStatusInput; +}) { + const { items, ...rest } = useLiveCollection({ + fetcher: UserRepository.Relationship.getFollowings, + params: { + userId: userId as string, + status: status ?? undefined, + }, + shouldCall: () => !!userId, + }); + + return { + followings: items, + ...rest, + }; +} diff --git a/src/v4/core/hooks/collections/useGlobalFeed.ts b/src/v4/core/hooks/collections/useGlobalFeed.ts new file mode 100644 index 000000000..b7afa6c72 --- /dev/null +++ b/src/v4/core/hooks/collections/useGlobalFeed.ts @@ -0,0 +1,69 @@ +import { FeedRepository } from '@amityco/ts-sdk'; +import { useEffect, useMemo, useState } from 'react'; + +const useGlobalFeed = () => { + const [items, setItems] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [queryToken, setQueryToken] = useState(null); + const [loadMoreHasBeenCalled, setLoadMoreHasBeenCalled] = useState(false); + + async function fetchMore() { + try { + setIsLoading(true); + const newPosts = await FeedRepository.queryGlobalFeed({ + limit: 10, + queryToken: queryToken || undefined, + }); + setQueryToken(newPosts.paging.next || null); + setItems((prevItems) => [...prevItems, ...newPosts.data]); + } finally { + setIsLoading(false); + } + } + + useEffect(() => { + fetchMore(); + + return () => { + setItems([]); + setQueryToken(null); + }; + }, []); + + const prependItem = (post: Amity.Post) => { + setItems((prevItems) => [post, ...prevItems]); + }; + + const removeItem = (postId: string) => { + const newItems = items.filter((item) => item.postId !== postId); + setItems(newItems); + }; + + const hasMore = useMemo(() => queryToken !== null, [queryToken]); + + const loadMore = () => { + setLoadMoreHasBeenCalled(true); + if (hasMore) { + fetchMore(); + } + }; + + const refetch = () => { + setItems([]); + setQueryToken(null); + fetchMore(); + }; + + return { + posts: items, + isLoading, + prependItem, + removeItem, + loadMore, + hasMore, + loadMoreHasBeenCalled, + refetch, + }; +}; + +export default useGlobalFeed; diff --git a/src/v4/core/hooks/collections/useUsersCollection.ts b/src/v4/core/hooks/collections/useUsersCollection.ts new file mode 100644 index 000000000..139a8e2a8 --- /dev/null +++ b/src/v4/core/hooks/collections/useUsersCollection.ts @@ -0,0 +1,68 @@ +import { UserRepository } from '@amityco/ts-sdk'; +import { useEffect, useRef, useState } from 'react'; + +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +const MINIMUM_STRING_LENGTH_TO_TRIGGER_QUERY = 1; + +export const useUserQueryByDisplayName = ( + params: Parameters[0], +) => { + const [items, setItems] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [hasMore, setHasMore] = useState(false); + const [loadMoreHasBeenCalled, setLoadMoreHasBeenCalled] = useState(false); + const loadMoreRef = useRef<(() => void) | null>(null); + const unSubRef = useRef<(() => void) | null>(null); + + const loadMore = () => { + if (loadMoreRef.current) { + loadMoreRef.current(); + setLoadMoreHasBeenCalled(true); + } + }; + + useEffect(() => { + if (unSubRef.current) { + unSubRef.current(); + unSubRef.current = null; + } + + const unSubFn = UserRepository.searchUserByDisplayName(params, (response) => { + setHasMore(response.hasNextPage || false); + setIsLoading(response.loading); + loadMoreRef.current = response.onNextPage || null; + setItems(response.data); + }); + unSubRef.current = unSubFn; + + return () => { + unSubRef.current?.(); + unSubRef.current = null; + }; + }, [params]); + + return { + users: items, + isLoading, + hasMore, + loadMore, + loadMoreHasBeenCalled, + }; +}; + +// breaking changes +export default function useUsersCollection( + term: Parameters[0], + shouldCall: () => boolean = () => true, +) { + const { items, ...rest } = useLiveCollection({ + fetcher: UserRepository.getUsers, + params: term, + }); + + return { + users: items, + ...rest, + }; +} diff --git a/src/v4/core/hooks/objects/usePost.ts b/src/v4/core/hooks/objects/usePost.ts new file mode 100644 index 000000000..47190cb98 --- /dev/null +++ b/src/v4/core/hooks/objects/usePost.ts @@ -0,0 +1,18 @@ +import { PostRepository } from '@amityco/ts-sdk'; + +import useLiveObject from '~/v4/core/hooks/useLiveObject'; + +const usePost = (postId?: string) => { + const { item, ...rest } = useLiveObject({ + fetcher: PostRepository.getPost, + params: postId as string, + shouldCall: () => !!postId, + }); + + return { + post: item, + ...rest, + }; +}; + +export default usePost; diff --git a/src/v4/core/hooks/objects/useUser.ts b/src/v4/core/hooks/objects/useUser.ts new file mode 100644 index 000000000..398a41da7 --- /dev/null +++ b/src/v4/core/hooks/objects/useUser.ts @@ -0,0 +1,18 @@ +import { UserRepository } from '@amityco/ts-sdk'; + +import useLiveObject from '~/v4/core/hooks/useLiveObject'; + +const useUser = (userId?: string | null) => { + const { item, ...rest } = useLiveObject({ + fetcher: UserRepository.getUser, + params: userId, + shouldCall: () => !!userId, + }); + + return { + user: item, + ...rest, + }; +}; + +export default useUser; diff --git a/src/v4/core/hooks/subscriptions/useCommentSubscription.ts b/src/v4/core/hooks/subscriptions/useCommentSubscription.ts new file mode 100644 index 000000000..2b19a9c1e --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useCommentSubscription.ts @@ -0,0 +1,20 @@ +import { CommentRepository, getCommentTopic } from '@amityco/ts-sdk'; +import useSubscription from './useSubscription'; + +export default function useCommentSubscription({ + commentId, + shouldSubscribe = () => true, + callback, +}: { + commentId?: string | null; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useSubscription({ + fetcher: CommentRepository.getComment, + params: commentId, + callback, + shouldSubscribe: () => !!commentId && shouldSubscribe(), + getSubscribedTopic: ({ data: comment }) => getCommentTopic(comment), + }); +} diff --git a/src/v4/core/hooks/subscriptions/useCommunityReactionSubscription.ts b/src/v4/core/hooks/subscriptions/useCommunityReactionSubscription.ts new file mode 100644 index 000000000..2c27916bb --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useCommunityReactionSubscription.ts @@ -0,0 +1,19 @@ +import { SubscriptionLevels } from '@amityco/ts-sdk'; +import useCommunitySubscription from './useCommunitySubscription'; + +export default function useCommunityReactionSubscription({ + communityId, + shouldSubscribe = () => true, + callback, +}: { + communityId?: string | null; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useCommunitySubscription({ + communityId, + level: SubscriptionLevels.POST_AND_COMMENT, + shouldSubscribe, + callback, + }); +} diff --git a/src/v4/core/hooks/subscriptions/useCommunitySubscription.ts b/src/v4/core/hooks/subscriptions/useCommunitySubscription.ts new file mode 100644 index 000000000..6397daad6 --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useCommunitySubscription.ts @@ -0,0 +1,22 @@ +import { CommunityRepository, getCommunityTopic } from '@amityco/ts-sdk'; +import useSubscription from './useSubscription'; + +export default function useCommunitySubscription({ + communityId, + level, + shouldSubscribe = () => true, + callback, +}: { + communityId?: string | null; + level: Parameters[1]; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useSubscription({ + fetcher: CommunityRepository.getCommunity, + params: communityId, + callback, + shouldSubscribe: () => !!communityId && shouldSubscribe(), + getSubscribedTopic: ({ data: community }) => getCommunityTopic(community, level), + }); +} diff --git a/src/v4/core/hooks/subscriptions/usePostSubscription.ts b/src/v4/core/hooks/subscriptions/usePostSubscription.ts new file mode 100644 index 000000000..212aa515a --- /dev/null +++ b/src/v4/core/hooks/subscriptions/usePostSubscription.ts @@ -0,0 +1,22 @@ +import { PostRepository, getPostTopic } from '@amityco/ts-sdk'; +import useSubscription from './useSubscription'; + +export default function usePostSubscription({ + postId, + level, + shouldSubscribe = () => true, + callback, +}: { + postId?: string | null; + level: Parameters[1]; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useSubscription({ + fetcher: PostRepository.getPost, + params: postId, + callback, + shouldSubscribe: () => !!postId && shouldSubscribe(), + getSubscribedTopic: ({ data: post }) => getPostTopic(post, level), + }); +} diff --git a/src/v4/core/hooks/subscriptions/useReactionSubscription.ts b/src/v4/core/hooks/subscriptions/useReactionSubscription.ts new file mode 100644 index 000000000..984ef4fc6 --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useReactionSubscription.ts @@ -0,0 +1,33 @@ +import useCommunityReactionSubscription from './useCommunityReactionSubscription'; +import useUserReactionSubscription from './useUserReactionSubscription'; + +export default function useReactionSubscription({ + targetId, + targetType, + callback, + shouldSubscribe = () => true, +}: { + targetId?: string | null; + targetType: 'user' | 'community'; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + const { unsubscribe: userUnsubscribe } = useUserReactionSubscription({ + userId: targetId, + shouldSubscribe: () => shouldSubscribe() && targetType === 'user', + callback, + }); + + const { unsubscribe: communityUnsubscribe } = useCommunityReactionSubscription({ + communityId: targetId, + shouldSubscribe: () => shouldSubscribe() && targetType === 'community', + callback, + }); + + return { + unsubscribe() { + userUnsubscribe(); + communityUnsubscribe(); + }, + }; +} diff --git a/src/v4/core/hooks/subscriptions/useSubscription.ts b/src/v4/core/hooks/subscriptions/useSubscription.ts new file mode 100644 index 000000000..d3b5c515b --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useSubscription.ts @@ -0,0 +1,49 @@ +import { useEffect, useRef } from 'react'; +import useLiveObject from '~/v4/core/hooks/useLiveObject'; +import { useSDKSubscribersConnector } from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorSubscribersProvider'; + +export default function useSubscription({ + fetcher, + params, + callback = () => {}, + options, + shouldSubscribe = () => true, + getSubscribedTopic, +}: { + fetcher: ( + params: TParams, + callback: Amity.LiveObjectCallback, + options?: Amity.LiveObjectOptions, + ) => Amity.Unsubscriber; + params: TParams | undefined | null; + callback?: Amity.Listener; + options?: Amity.LiveObjectOptions; + shouldSubscribe?: () => boolean; + getSubscribedTopic: (response: Amity.LiveObject) => string; +}) { + const { subscribe } = useSDKSubscribersConnector(); + const unsubscribeTopicRef = useRef<(() => void) | null>(null); + useLiveObject({ + fetcher, + params, + callback: (response) => { + const { error, loading } = response; + if (loading) return; + if (error) throw error; + const { unsubscribe } = subscribe({ topic: getSubscribedTopic(response), callback }); + unsubscribeTopicRef.current = unsubscribe; + }, + options, + shouldCall: shouldSubscribe, + }); + + useEffect(() => { + return () => { + unsubscribeTopicRef.current?.(); + }; + }, [unsubscribeTopicRef]); + + return { + unsubscribe: () => unsubscribeTopicRef.current?.(), + }; +} diff --git a/src/v4/core/hooks/subscriptions/useUserReactionSubscription.ts b/src/v4/core/hooks/subscriptions/useUserReactionSubscription.ts new file mode 100644 index 000000000..3911f269c --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useUserReactionSubscription.ts @@ -0,0 +1,19 @@ +import { SubscriptionLevels } from '@amityco/ts-sdk'; +import useUserSubscription from './useUserSubscription'; + +export default function useUserReactionSubscription({ + userId, + callback, + shouldSubscribe, +}: { + userId?: string | null; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useUserSubscription({ + userId, + level: SubscriptionLevels.POST_AND_COMMENT, + shouldSubscribe, + callback, + }); +} diff --git a/src/v4/core/hooks/subscriptions/useUserSubscription.ts b/src/v4/core/hooks/subscriptions/useUserSubscription.ts new file mode 100644 index 000000000..792f18805 --- /dev/null +++ b/src/v4/core/hooks/subscriptions/useUserSubscription.ts @@ -0,0 +1,22 @@ +import { UserRepository, getUserTopic } from '@amityco/ts-sdk'; +import useSubscription from './useSubscription'; + +export default function useUserSubscription({ + userId, + level, + shouldSubscribe = () => true, + callback, +}: { + userId?: string | null; + level: Parameters[1]; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useSubscription({ + fetcher: UserRepository.getUser, + params: userId, + callback, + shouldSubscribe: () => !!userId && shouldSubscribe(), + getSubscribedTopic: ({ data: user }) => getUserTopic(user, level), + }); +} diff --git a/src/v4/core/hooks/uikit/index.ts b/src/v4/core/hooks/uikit/index.ts new file mode 100644 index 000000000..4e215a2cd --- /dev/null +++ b/src/v4/core/hooks/uikit/index.ts @@ -0,0 +1,49 @@ +import { getDefaultConfig, useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors, useTheme } from '~/v4/core/providers/ThemeProvider'; + +export const useAmityElement = ({ + pageId, + componentId, + elementId, +}: { + pageId: string; + componentId: string; + elementId: string; +}) => { + const uiReference = `${pageId}/${componentId}/${elementId}`; + const { getConfig, isExcluded } = useCustomization(); + const config = getConfig(uiReference); + const defaultConfig = getDefaultConfig(uiReference); + const themeStyles = useGenerateStylesShadeColors(config); + const isComponentExcluded = isExcluded(uiReference); + const accessibilityId = uiReference; + const currentTheme = useTheme(); + + return { + currentTheme, + config, + defaultConfig, + uiReference, + accessibilityId, + themeStyles, + isExcluded: isComponentExcluded, + }; +}; + +export const useAmityComponent = ({ + pageId, + componentId, +}: { + pageId: string; + componentId: string; +}) => { + const elementId = '*'; + return useAmityElement({ pageId, componentId, elementId }); +}; + +export const useAmityPage = ({ pageId }: { pageId: string }) => { + const componentId = '*'; + const elementId = '*'; + + return useAmityElement({ pageId, componentId, elementId }); +}; diff --git a/src/v4/core/hooks/useFile.ts b/src/v4/core/hooks/useFile.ts new file mode 100644 index 000000000..08db4848c --- /dev/null +++ b/src/v4/core/hooks/useFile.ts @@ -0,0 +1,16 @@ +import { FileRepository } from '@amityco/ts-sdk'; +import { useQuery } from '@tanstack/react-query'; + +const useFile = (fileId?: string | null) => { + const { data: file } = useQuery({ + queryKey: ['asc-uikit', 'FileRepository', 'getFile', fileId], + queryFn: () => { + return FileRepository.getFile(fileId as string); + }, + enabled: !!fileId, + }); + + return file?.data as T | undefined; +}; + +export default useFile; diff --git a/src/v4/core/hooks/useImage.ts b/src/v4/core/hooks/useImage.ts new file mode 100644 index 000000000..18001a62b --- /dev/null +++ b/src/v4/core/hooks/useImage.ts @@ -0,0 +1,31 @@ +import { useEffect, useState } from 'react'; +import { FileRepository } from '@amityco/ts-sdk'; +import useFile from './useFile'; + +interface UseImageProps { + fileId?: string | null; + imageSize?: 'small' | 'medium' | 'large' | 'full'; +} + +const useImage = ({ fileId, imageSize = 'medium' }: UseImageProps) => { + const file = useFile(fileId); + const [imageUrl, setImageUrl] = useState(undefined); + + useEffect(() => { + if (file == null || fileId == null) { + setImageUrl(undefined); + return; + } + + async function run() { + if (file?.fileUrl == null) return; + const newImageUrl = FileRepository.fileUrlWithSize(file?.fileUrl, imageSize); + setImageUrl(newImageUrl); + } + run(); + }, [file, imageSize]); + + return imageUrl; +}; + +export default useImage; diff --git a/src/v4/core/hooks/useIntersectionObserver.ts b/src/v4/core/hooks/useIntersectionObserver.ts new file mode 100644 index 000000000..5dc33f156 --- /dev/null +++ b/src/v4/core/hooks/useIntersectionObserver.ts @@ -0,0 +1,25 @@ +import { MutableRefObject, useEffect } from 'react'; + +const useIntersectionObserver = ({ + ref, + onIntersect, + options, +}: { + ref: MutableRefObject; + onIntersect: () => void; + options?: IntersectionObserverInit; +}) => { + useEffect(() => { + if (!ref?.current) return; + + const observer = new IntersectionObserver( + (entries) => entries[0]?.isIntersecting && onIntersect(), + options, + ); + observer.observe(ref.current); + + return () => observer.disconnect(); + }, [ref, onIntersect, options]); +}; + +export default useIntersectionObserver; diff --git a/src/v4/core/hooks/useLiveCollection.ts b/src/v4/core/hooks/useLiveCollection.ts new file mode 100644 index 000000000..dcb5ae63a --- /dev/null +++ b/src/v4/core/hooks/useLiveCollection.ts @@ -0,0 +1,79 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useSDKLiveCollectionConnector } from '~/v4/core/providers/SDKConnectorProvider'; + +function useLiveCollection({ + fetcher, + params, + callback = () => {}, + config, + shouldCall = () => true, +}: { + fetcher: ( + params: Amity.LiveCollectionParams, + callback: Amity.LiveCollectionCallback, + config?: Amity.LiveCollectionConfig, + ) => Amity.Unsubscriber; + params: Amity.LiveCollectionParams; + callback?: Amity.LiveCollectionCallback; + config?: Amity.LiveCollectionConfig; + shouldCall?: () => boolean; +}): { + items: TCallback[]; + isLoading: boolean; + hasMore: boolean; + loadMore: () => void; + error: Error | null; + loadMoreHasBeenCalled: boolean; +} { + const { subscribe } = useSDKLiveCollectionConnector(); + const [loadMoreHasBeenCalled, setLoadMoreHasBeenCalled] = useState(false); + const [isLoading, setIsLoading] = useState(shouldCall ? shouldCall() : true); + const [items, setItems] = useState([]); + const [error, setError] = useState(null); + const [hasMore, setHasMore] = useState(false); + const loadMoreFnRef = useRef<(() => void) | null>(null); + + const loadMore = useCallback(() => { + if (loadMoreFnRef.current) { + setLoadMoreHasBeenCalled(true); + loadMoreFnRef.current?.(); + } + }, [loadMoreFnRef, loadMoreHasBeenCalled, isLoading, setIsLoading]); + + const callbackFn = useCallback( + (response) => { + if (!shouldCall()) return; + if (response.data) setItems(response.data); + setIsLoading(response.loading); + setHasMore(response.hasNextPage); + setError(response.error); + loadMoreFnRef.current = response.onNextPage; + callback(response); + }, + [shouldCall, setItems, setIsLoading, setHasMore, loadMoreFnRef, callback], + ); + + useEffect(() => { + if (!shouldCall()) return; + const { unsubscribe } = subscribe({ + fetcher, + params, + callback: callbackFn, + }); + + return () => { + unsubscribe(); + }; + }, [params, shouldCall]); + + return { + items, + hasMore, + isLoading, + loadMore, + error, + loadMoreHasBeenCalled, + }; +} + +export default useLiveCollection; diff --git a/src/v4/core/hooks/useLiveObject.ts b/src/v4/core/hooks/useLiveObject.ts new file mode 100644 index 000000000..78c145e31 --- /dev/null +++ b/src/v4/core/hooks/useLiveObject.ts @@ -0,0 +1,79 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useSDKLiveObjectConnector } from '~/v4/core/providers/SDKConnectorProvider'; +import { subscribeTopic } from '@amityco/ts-sdk'; + +function useLiveObject({ + fetcher, + params, + callback = () => {}, + options, + shouldCall = () => true, + getSubscribedTopic, +}: { + fetcher: ( + params: TParams, + callback: Amity.LiveObjectCallback, + options?: Amity.LiveObjectOptions, + ) => Amity.Unsubscriber; + params: TParams | undefined | null; + callback?: Amity.LiveObjectCallback; + options?: Amity.LiveObjectOptions; + shouldCall?: () => boolean; + getSubscribedTopic?: () => string; +}) { + const { subscribe } = useSDKLiveObjectConnector(); + const [item, setItem] = useState(null); + const [origin, setOrigin] = useState(undefined); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const unsubscribeTopicRef = useRef<(() => void) | null>(null); + + const callbackFn: Amity.LiveObjectCallback = useCallback( + (response) => { + if (shouldCall && !shouldCall()) return; + if (params == null) return; + setIsLoading(response.loading); + if (response.data) setItem(response.data); + setOrigin(response.origin); + setError(response.error); + callback(response); + }, + [shouldCall, callback], + ); + + useEffect(() => { + if (getSubscribedTopic) { + unsubscribeTopicRef.current = subscribeTopic(getSubscribedTopic()); + } + + return () => { + unsubscribeTopicRef.current?.(); + }; + }, [getSubscribedTopic]); + + useEffect(() => { + if (params == null) return; + if (shouldCall && !shouldCall()) return; + + const { unsubscribe } = subscribe({ + fetcher, + params, + callback: callbackFn, + options, + }); + + return () => { + unsubscribe(); + }; + }, [params, shouldCall]); + + return { + item, + origin, + isLoading: isLoading || (item == null && error == null), + error, + }; +} + +export default useLiveObject; diff --git a/src/v4/core/hooks/usePostByIds.ts b/src/v4/core/hooks/usePostByIds.ts new file mode 100644 index 000000000..720a92f99 --- /dev/null +++ b/src/v4/core/hooks/usePostByIds.ts @@ -0,0 +1,19 @@ +import { PostRepository } from '@amityco/ts-sdk'; +import { useEffect, useState } from 'react'; + +const usePostByIds = (postIds: Parameters[0]) => { + const [posts, setPosts] = useState([]); + + useEffect(() => { + async function run() { + if (!postIds || postIds?.length === 0) return; + const response = await PostRepository.getPostByIds(postIds); + setPosts(response.data); + } + run(); + }, [postIds]); + + return posts; +}; + +export default usePostByIds; diff --git a/src/v4/core/hooks/usePostFlaggedByMe.ts b/src/v4/core/hooks/usePostFlaggedByMe.ts new file mode 100644 index 000000000..bb808c15b --- /dev/null +++ b/src/v4/core/hooks/usePostFlaggedByMe.ts @@ -0,0 +1,99 @@ +import { PostRepository } from '@amityco/ts-sdk'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useMemo } from 'react'; + +export const usePostFlaggedByMe = ({ + post, + isFlaggable, + onReportSuccess, + onReportError, + onUnreportSuccess, + onUnreportError, +}: { + post?: Amity.Post; + isFlaggable: boolean; + onReportSuccess?: () => void; + onReportError?: (error: Error) => void; + onUnreportSuccess?: () => void; + onUnreportError?: (error: Error) => void; +}) => { + const queryClient = useQueryClient(); + const postId = post?.postId || undefined; + + const { data, isLoading } = useQuery({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + queryFn: () => { + return PostRepository.isPostFlaggedByMe(postId); + }, + enabled: postId != null && isFlaggable, + }); + + const { mutateAsync: mutateReportPost } = useMutation({ + mutationFn: async () => { + return PostRepository.flagPost(post.postId); + }, + onMutate: async () => { + await queryClient.cancelQueries({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + }); + + queryClient.setQueryData( + ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + () => true, + ); + }, + onSuccess: () => { + onReportSuccess?.(); + }, + onError: (err, newTodo, context) => { + queryClient.invalidateQueries({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + }); + onReportError?.(err); + }, + // Always refetch after error or success: + onSettled: () => { + queryClient.invalidateQueries({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + }); + }, + }); + + const { mutateAsync: mutateUnReportPost } = useMutation({ + mutationFn: async () => { + return PostRepository.unflagPost(post.postId); + }, + onMutate: async () => { + await queryClient.cancelQueries({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + }); + + queryClient.setQueryData( + ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + () => false, + ); + }, + onSuccess: () => { + onUnreportSuccess?.(); + }, + onError: (err, newTodo, context) => { + queryClient.invalidateQueries({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + }); + onUnreportError?.(err); + }, + // Always refetch after error or success: + onSettled: () => { + queryClient.invalidateQueries({ + queryKey: ['asc-uikit', 'PostRepository', 'isPostFlaggedByMe', postId], + }); + }, + }); + + return { + isLoading, + isFlaggedByMe: data, + mutateReportPost, + mutateUnReportPost, + }; +}; diff --git a/src/v4/core/hooks/usePostPermissions.ts b/src/v4/core/hooks/usePostPermissions.ts new file mode 100644 index 000000000..3b7c4ce30 --- /dev/null +++ b/src/v4/core/hooks/usePostPermissions.ts @@ -0,0 +1,26 @@ +import { useMemo } from 'react'; +import useSDK from '~/v4/core/hooks/useSDK'; + +export const usePostPermissions = ({ + post, + community, +}: { + post: Amity.Post; + community?: Amity.Community | null; +}) => { + const { currentUserId } = useSDK(); + + const isCommunityModerator = useMemo(() => { + if (post && community) { + return post.targetType === 'community' && post.targetId === community.communityId; + } + return false; + }, []); + + const isOwner = post.postedUserId === currentUserId; + + return { + isCommunityModerator, + isOwner, + }; +}; diff --git a/src/v4/core/hooks/useSDK.ts b/src/v4/core/hooks/useSDK.ts new file mode 100644 index 000000000..42ecb62f2 --- /dev/null +++ b/src/v4/core/hooks/useSDK.ts @@ -0,0 +1,6 @@ +import { useContext } from 'react'; +import { SDKContext } from '~/v4/core/providers/SDKProvider'; + +export const useSDK = () => useContext(SDKContext); + +export default useSDK; diff --git a/src/v4/core/providers/AmityUIKitProvider.tsx b/src/v4/core/providers/AmityUIKitProvider.tsx index 7e8188e2b..4dc85f11a 100644 --- a/src/v4/core/providers/AmityUIKitProvider.tsx +++ b/src/v4/core/providers/AmityUIKitProvider.tsx @@ -5,15 +5,18 @@ import '../../styles/global.css'; import React, { useEffect, useMemo, useState } from 'react'; import useUser from '~/core/hooks/useUser'; -import SDKConnectorProvider from '~/core/providers/SDKConnectorProvider'; -import { SDKContext } from '~/core/providers/SDKProvider'; +import SDKConnectorProviderV3 from '~/core/providers/SDKConnectorProvider'; +import SDKConnectorProvider from '~/v4/core/providers/SDKConnectorProvider'; +import { SDKContext } from '~/v4/core/providers/SDKProvider'; +import { SDKContext as SDKContextV3 } from '~/core/providers/SDKProvider'; import PostRendererProvider from '~/social/providers/PostRendererProvider'; -import NavigationProvider from '~/social/providers/NavigationProvider'; +import NavigationProvider from './NavigationProvider'; import ConfigProvider from '~/social/providers/ConfigProvider'; import { ConfirmComponent } from '~/v4/core/components/ConfirmModal'; import { ConfirmComponent as LegacyConfirmComponent } from '~/core/components/Confirm'; import { NotificationsContainer } from '~/v4/core/components/Notification'; +import { DrawerContainer } from '~/v4/core/components/Drawer'; import { NotificationsContainer as LegacyNotificationsContainer } from '~/core/components/Notification'; import Localization from '~/core/providers/UiKitProvider/Localization'; @@ -22,13 +25,14 @@ import { ThemeProvider as StyledThemeProvider } from 'styled-components'; import buildGlobalTheme from '~/core/providers/UiKitProvider/theme'; import { defaultConfig, Config, CustomizationProvider } from './CustomizationProvider'; import { ThemeProvider } from './ThemeProvider'; -import { PageBehaviorProvider } from './PageBehaviorProvider'; +import { PageBehavior, PageBehaviorProvider } from './PageBehaviorProvider'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { UIStyles } from '~/core/providers/UiKitProvider/styles'; import AmityUIKitManager from '../AmityUIKitManager'; import { ConfirmProvider } from '~/v4/core/providers/ConfirmProvider'; import { ConfirmProvider as LegacyConfirmProvider } from '~/core/providers/ConfirmProvider'; import { NotificationProvider } from '~/v4/core/providers/NotificationProvider'; +import { DrawerProvider } from '~/v4/core/providers/DrawerProvider'; import { NotificationProvider as LegacyNotificationProvider } from '~/core/providers/NotificationProvider'; import { CustomReactionProvider } from './CustomReactionProvider'; @@ -58,10 +62,7 @@ interface AmityUIKitProviderProps { onEditUser?: (userId: string) => void; onMessageUser?: (userId: string) => void; }; - pageBehavior?: { - onCloseAction?: () => void; - onClickHyperLink?: () => void; - }; + pageBehavior?: PageBehavior; onConnectionStatusChange?: (state: Amity.SessionStates) => void; onConnected?: () => void; onDisconnected?: () => void; @@ -139,40 +140,47 @@ const AmityUIKitProvider: React.FC = ({ - - - - - - - - - - - - - {children} - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + {children} + + + + + + + + + + + + + + + + + + + + diff --git a/src/v4/core/providers/ConfirmProvider.tsx b/src/v4/core/providers/ConfirmProvider.tsx index b290db3c9..21a33772a 100644 --- a/src/v4/core/providers/ConfirmProvider.tsx +++ b/src/v4/core/providers/ConfirmProvider.tsx @@ -1,7 +1,7 @@ import React, { createContext, ReactNode, useContext, useState } from 'react'; import { PrimaryButton } from '~/core/components/Button/styles'; -type ConfirmType = { +export type ConfirmType = { onCancel?: () => void; onOk?: () => void; type?: 'confirm' | 'info'; @@ -11,8 +11,9 @@ type ConfirmType = { content?: ReactNode; okText?: ReactNode; cancelText?: ReactNode; - 'data-qa-anchor'?: string; - theme?: 'light' | 'dark'; + pageId?: string; + componentId?: string; + elementId?: string; }; interface ConfirmContextProps { @@ -24,8 +25,8 @@ interface ConfirmContextProps { export const ConfirmContext = createContext({ confirmData: null, - confirm: () => {}, - info: () => {}, + confirm: (data: ConfirmType) => {}, + info: (data: ConfirmType) => {}, closeConfirm: () => {}, }); diff --git a/src/v4/core/providers/CustomizationProvider.tsx b/src/v4/core/providers/CustomizationProvider.tsx index 82bc01bcb..86a031777 100644 --- a/src/v4/core/providers/CustomizationProvider.tsx +++ b/src/v4/core/providers/CustomizationProvider.tsx @@ -92,11 +92,12 @@ export const useCustomization = () => { interface CustomizationProviderProps { children: React.ReactNode; - initialConfig: Config; + initialConfig: Config | undefined; } type IconConfiguration = { icon?: string; + image?: string; }; type TextConfiguration = { text?: string; @@ -201,6 +202,14 @@ export const defaultConfig: DefaultConfig = { unmute_icon: 'unmute.png', background_color: '#1243EE', }, + 'story_page/*/arrow_left_button': { + arrow_left_icon: 'arrow_left.png', + background_color: '#1243EE', + }, + 'story_page/*/arrow_right_button': { + arrow_right_icon: 'arrow_right.png', + background_color: '#1243EE', + }, '*/edit_comment_component/*': { theme: {}, }, @@ -229,6 +238,10 @@ export const defaultConfig: DefaultConfig = { '*/comment_tray_component/*': { theme: {}, }, + '*/comment_tray_component/comment_bubble_deleted_view': { + comment_bubble_deleted_icon: 'comment_bubble_deleted.png', + text: 'This reply has been deleted', + }, '*/story_tab_component/*': {}, '*/story_tab_component/story_ring': { progress_color: ['#339AF9', '#78FA58'], @@ -274,6 +287,7 @@ export const defaultConfig: DefaultConfig = { }, 'social_home_page/empty_newsfeed/create_community_button': { icon: 'createCommunityIcon', + text: 'Create Community', }, 'social_home_page/my_communities/community_avatar': {}, 'social_home_page/my_communities/community_display_name': {}, @@ -298,33 +312,6 @@ export const defaultConfig: DefaultConfig = { icon: 'badgeIcon', text: 'Moderator', }, - '*/post_content/moderator_badge': { - icon: 'badgeIcon', - text: 'Moderator', - theme: { - light: { - primary_color: '#FA4D30', - secondary_color: '#292B32', - }, - dark: { - primary_color: '#00FF00', - secondary_color: '#292B32', - }, - }, - }, - '*/post_comment/*': { - preferred_theme: 'default', - theme: { - light: { - primary_color: '#FFC0CB', - secondary_color: '#292B32', - }, - dark: { - primary_color: '#FFFF00', - secondary_color: '#292B32', - }, - }, - }, '*/post_content/timestamp': {}, '*/post_content/menu_button': { icon: 'menuIcon', @@ -342,6 +329,87 @@ export const defaultConfig: DefaultConfig = { icon: 'shareButtonIcon', text: 'Share', }, + 'post_composer_page/*/*': {}, + 'post_composer_page/*/close_button': { + image: 'platformValue', + }, + 'post_composer_page/*/community_display_name': {}, + 'post_composer_page/*/create_button': { + text: 'Post', + }, + 'post_composer_page/*/edit_post_button': { + text: 'Save', + }, + 'post_composer_page/*/edit_post_title': { + text: 'Edit post', + }, + 'post_composer_page/media_attachment/*': {}, + 'post_composer_page/media_attachment/camera_button': { + image: 'platformValue', + }, + 'post_composer_page/media_attachment/image_button': { + image: 'platformValue', + }, + 'post_composer_page/media_attachment/video_button': { + image: 'platformValue', + }, + 'post_composer_page/media_attachment/file_button': { + image: 'platformValue', + }, + 'post_composer_page/media_attachment/detailed_button': { + image: 'platformValue', + }, + 'post_composer_page/detailed_media_attachment/*': {}, + 'post_composer_page/detailed_media_attachment/camera_button': { + text: 'Camera', + image: 'platformValue', + }, + 'post_composer_page/detailed_media_attachment/image_button': { + text: 'Photo', + image: 'platformValue', + }, + 'post_composer_page/detailed_media_attachment/video_button': { + text: 'Video', + image: 'platformValue', + }, + 'create_post_page/detailed_media_attachment/file_button': { + textpost_composer_page: 'Attachment', + image: 'platformValue', + }, + 'social_home_page/*/*': {}, + 'social_home_page/create_post_menu/*': {}, + 'social_home_page/create_post_menu/create_post_button': { + text: 'Post', + image: 'Post', + }, + 'social_home_page/create_post_menu/create_story_button': { + text: 'Story', + image: 'Story', + }, + 'social_home_page/create_post_menu/create_poll_button': { + text: 'Poll', + image: 'Poll', + }, + 'social_home_page/create_post_menu/create_livestream_button': { + text: 'Livestream', + image: 'Livestream', + }, + 'select_post_target_page/*/close_button': { + image: 'platformValue', + }, + 'select_post_target_page/*/my_timeline_avatar': {}, + 'select_post_target_page/*/title': { + text: 'Post to', + }, + 'select_post_target_page/*/my_timeline_text': { + text: 'My Timeline', + }, + '*/*/community_official_badge': { + image: 'platformValue', + }, + '*/*/community_private_badge': { + image: 'platformValue', + }, 'social_global_search_page/*/*': {}, 'social_global_search_page/top_search_bar/*': {}, 'social_global_search_page/top_search_bar/search_icon': { @@ -408,7 +476,7 @@ export const getDefaultConfig: CustomizationContextValue['getConfig'] = (path: s export const CustomizationProvider: React.FC = ({ children, - initialConfig, + initialConfig = {}, }) => { const [config, setConfig] = useState(null); @@ -421,16 +489,6 @@ export const CustomizationProvider: React.FC = ({ }, [initialConfig]); const validateConfig = (config: Config): boolean => { - // Check if mandatory fields are present - if ( - !config?.preferred_theme || - !config?.theme || - !config?.excludes || - !config?.customizations - ) { - return false; - } - return true; }; @@ -439,11 +497,34 @@ export const CustomizationProvider: React.FC = ({ }; const isExcluded = (path: string) => { - if (!config) return false; - return !!config.excludes?.some((exclude) => { - const regex = new RegExp(`^${exclude.replace(/\*/g, '.*')}$`); - return regex.test(path); - }); + const [page, component, element] = path.split('/'); + + const customizationKeys = (() => { + if (element !== '*') { + return [ + `${page}/${component}/${element}`, + `${page}/*/${element}`, + `${page}/${component}/*`, + `${page}/*/*`, + `*/${component}/${element}`, + `*/*/${element}`, + `*/${component}/*`, + `*/*/*`, + ]; + } else if (component !== '*') { + return [`${page}/${component}/*`, `${page}/*/*`, `*/${component}/*`, `*/*/*`]; + } else if (page !== '*') { + return [`${page}/*/*`, `*/*/*`]; + } + + return []; + })(); + + return ( + config?.excludes?.some((excludedPath) => { + return customizationKeys.some((key) => key === excludedPath); + }) || false + ); }; const getConfig: CustomizationContextValue['getConfig'] = (path: string) => { @@ -481,6 +562,11 @@ export const CustomizationProvider: React.FC = ({ return config.customizations[key][prop]; } } + + if (prop === 'theme' && !!config?.theme) { + return config.theme; + } + for (const key of customizationKeys) { if (defaultConfig?.customizations?.[key]?.[prop]) { return defaultConfig.customizations[key][prop]; diff --git a/src/v4/core/providers/DrawerProvider.tsx b/src/v4/core/providers/DrawerProvider.tsx new file mode 100644 index 000000000..21481ec50 --- /dev/null +++ b/src/v4/core/providers/DrawerProvider.tsx @@ -0,0 +1,47 @@ +import React, { createContext, ReactNode, useContext, useState } from 'react'; + +interface DrawerData { + content: ReactNode; +} + +interface DrawerContextProps { + drawerData?: DrawerData | null; + setDrawerData: (data: DrawerData) => void; + removeDrawerData: () => void; +} + +export const DrawerContext = createContext({ + drawerData: null, + setDrawerData: () => {}, + removeDrawerData: () => {}, +}); + +export const DrawerProvider: React.FC = ({ children }) => { + const [drawerData, setDrawerData] = useState(null); + + return ( + { + setDrawerData(data); + }, + removeDrawerData: () => { + setDrawerData(null); + }, + }} + > + {children} + + ); +}; + +export const useDrawerData = () => { + const { drawerData } = useContext(DrawerContext); + return drawerData; +}; + +export const useDrawer = () => { + const { setDrawerData, removeDrawerData } = useContext(DrawerContext); + return { setDrawerData, removeDrawerData }; +}; diff --git a/src/v4/core/providers/NavigationProvider.tsx b/src/v4/core/providers/NavigationProvider.tsx new file mode 100644 index 000000000..883326abe --- /dev/null +++ b/src/v4/core/providers/NavigationProvider.tsx @@ -0,0 +1,497 @@ +import React, { createContext, useCallback, useContext, useState, useMemo, ReactNode } from 'react'; +import { AmityStoryMediaType } from '~/v4/social/pages/DraftsPage/DraftsPage'; + +export enum PageTypes { + Explore = 'explore', + NewsFeed = 'newsFeed', + CommunityFeed = 'communityFeed', + CommunityEdit = 'communityEdit', + Category = 'category', + UserFeed = 'userFeed', + UserEdit = 'userEdit', + ViewStoryPage = 'ViewStoryPage', + SocialHomePage = 'SocialHomePage', + PostDetailPage = 'PostDetailPage', + CommunityProfilePage = 'CommunityProfilePage', + UserProfilePage = 'UserProfilePage', + SocialGlobalSearchPage = 'SocialGlobalSearchPage', + SelectPostTargetPage = 'SelectPostTargetPage', + DraftPage = 'DraftPage', +} + +type Page = + | { + type: PageTypes.Explore | PageTypes.NewsFeed; + context: { communityId?: string }; + } + | { + type: PageTypes.CommunityFeed; + context: { + communityId: string; + isNewCommunity: boolean; + }; + } + | { + type: PageTypes.CommunityEdit; + context: { + communityId: string; + tab: string; + }; + } + | { + type: PageTypes.Category; + context: { + categoryId: string; + communityId?: string; + }; + } + | { + type: PageTypes.UserFeed | PageTypes.UserEdit; + context: { + userId: string; + communityId?: string; + }; + } + | { + type: PageTypes.ViewStoryPage; + context: { + targetId: string; + targetType: Amity.StoryTargetType; + storyType: 'communityFeed' | 'globalFeed'; + }; + } + | { + type: PageTypes.PostDetailPage; + context: { + postId: string; + communityId?: string; + }; + } + | { type: PageTypes.CommunityProfilePage; context: { communityId: string } } + | { type: PageTypes.UserProfilePage; context: { userId: string; communityId?: string } } + | { type: PageTypes.SocialHomePage; context: { communityId?: string } } + | { type: PageTypes.SocialGlobalSearchPage; context: { tab?: string } } + | { type: PageTypes.SelectPostTargetPage } + | { + type: PageTypes.DraftPage; + communityId?: string; + mediaType: AmityStoryMediaType; + targetId: string; + targetType: Amity.StoryTargetType; + }; + +type ContextValue = { + page: Page; + onChangePage: (type: string) => void; + onClickCategory: (categoryId: string) => void; + onClickCommunity: (communityId: string) => void; + onClickUser: (userId: string, pageType?: string) => void; + onCommunityCreated: (communityId: string) => void; + onEditCommunity: (communityId: string, tab?: string) => void; + onEditUser: (userId: string) => void; + onMessageUser: (userId: string) => void; + onBack: () => void; + goToUserProfilePage: (userId: string) => void; + goToPostDetailPage: (postId: string) => void; + goToCommunityProfilePage: (communityId: string) => void; + goToSocialGlobalSearchPage: (tab?: string) => void; + goToSelectPostTargetPage: () => void; + goToDraftStoryPage: (context: { + targetId: string; + targetType: string; + mediaType: AmityStoryMediaType; + storyType: 'communityFeed' | 'globalFeed'; + }) => void; + goToViewStoryPage: (context: { + targetId: string; + targetType: Amity.StoryTargetType; + storyType: 'communityFeed' | 'globalFeed'; + }) => void; + setNavigationBlocker?: ( + params: + | { + title: ReactNode; + content: ReactNode; + okText: ReactNode; + } + | null + | undefined, + ) => void; +}; + +let defaultValue: ContextValue = { + page: { type: PageTypes.SocialHomePage, context: { communityId: undefined } }, + onChangePage: (type: string) => {}, + onClickCategory: (categoryId: string) => {}, + onClickCommunity: (communityId: string) => {}, + onClickUser: (userId: string) => {}, + onCommunityCreated: (communityId: string) => {}, + onEditCommunity: (communityId: string) => {}, + onEditUser: (userId: string) => {}, + onMessageUser: (userId: string) => {}, + goToUserProfilePage: (userId: string) => {}, + goToPostDetailPage: (postId: string) => {}, + goToViewStoryPage: (context: { + targetId: string; + targetType: Amity.StoryTargetType; + storyType: 'communityFeed' | 'globalFeed'; + }) => {}, + goToDraftStoryPage: (context: { + targetId: string; + targetType: string; + mediaType: AmityStoryMediaType; + }) => {}, + goToCommunityProfilePage: (communityId: string) => {}, + goToSocialGlobalSearchPage: (tab?: string) => {}, + goToSelectPostTargetPage: () => {}, + setNavigationBlocker: () => {}, + onBack: () => {}, +}; + +if (process.env.NODE_ENV !== 'production') { + defaultValue = { + page: { type: PageTypes.SocialHomePage, context: { communityId: undefined } }, + onChangePage: (type) => console.log(`NavigationContext onChangePage(${type})`), + onClickCategory: (categoryId) => + console.log(`NavigationContext onClickCategory(${categoryId})`), + onClickCommunity: (communityId) => + console.log(`NavigationContext onClickCommunity(${communityId})`), + onClickUser: (userId) => console.log(`NavigationContext onClickUser(${userId})`), + goToViewStoryPage: ({ targetId, storyType, targetType }) => + console.log(`NavigationContext goToViewStoryPage(${targetId}, ${storyType}, ${targetType})`), + onCommunityCreated: (communityId) => + console.log(`NavigationContext onCommunityCreated(${communityId})`), + onEditCommunity: (communityId) => + console.log(`NavigationContext onEditCommunity({${communityId})`), + onEditUser: (userId) => console.log(`NavigationContext onEditUser(${userId})`), + onMessageUser: (userId) => console.log(`NavigationContext onMessageUser(${userId})`), + onBack: () => console.log('NavigationContext onBack()'), + goToUserProfilePage: (userId) => + console.log(`NavigationContext goToUserProfilePage(${userId})`), + goToPostDetailPage: (postId) => console.log(`NavigationContext goToPostDetailPage(${postId})`), + goToCommunityProfilePage: (communityId) => + console.log(`NavigationContext goToCommunityProfilePage(${communityId})`), + goToSocialGlobalSearchPage: (tab) => + console.log(`NavigationContext goToSocialGlobalSearchPage(${tab})`), + goToSelectPostTargetPage: () => console.log('NavigationContext goToTargetPage()'), + goToDraftStoryPage: ({ targetId, targetType, mediaType }) => + console.log(`NavigationContext goToDraftStoryPage(${targetId}, ${targetType}, ${mediaType})`), + }; +} + +export const NavigationContext = createContext(defaultValue); + +export const useNavigation = () => useContext(NavigationContext); + +interface NavigationProviderProps { + askForConfirmation?: (params: { + title: React.ReactNode; + content: React.ReactNode; + okText: React.ReactNode; + onSuccess: () => void; + onCancel: () => void; + }) => void; + children: React.ReactNode; + onChangePage?: (data: { type: string; [x: string]: string | boolean }) => void; + onClickCategory?: (categoryId: string) => void; + onClickCommunity?: (communityId: string) => void; + onClickUser?: (userId: string) => void; + goToViewStoryPage?: (context: { + storyId: string; + storyType: 'communityFeed' | 'globalFeed'; + targetType: Amity.StoryTargetType; + }) => void; + goToDraftStoryPage?: (context: { + targetId: string; + targetType: string; + mediaType: AmityStoryMediaType; + }) => void; + onCommunityCreated?: (communityId: string) => void; + onEditCommunity?: (communityId: string, options?: { tab?: string }) => void; + onEditUser?: (userId: string) => void; + onMessageUser?: (userId: string) => void; + onBack?: () => void; +} + +export default function NavigationProvider({ + askForConfirmation, + children, + onChangePage: onChangePageProp, + onClickCategory, + onClickCommunity, + onClickUser, + onCommunityCreated, + onEditCommunity, + onEditUser, + onMessageUser, + onBack, +}: NavigationProviderProps) { + const [pages, setPages] = useState([ + { type: PageTypes.SocialHomePage, context: { communityId: undefined } }, + ]); + const currentPage = useMemo(() => pages[pages.length - 1], [pages]); + const [navigationBlocker, setNavigationBlocker] = useState< + | { + title: ReactNode; + content: ReactNode; + okText: ReactNode; + } + | null + | undefined + >(); + + const confirmation = askForConfirmation ?? confirm; + + const pushPage = useCallback(async (newPage) => { + setPages((prevState) => [...prevState, newPage]); + }, []); + + const popPage = () => { + setPages((prevState) => (prevState.length > 1 ? prevState.slice(0, -1) : prevState)); + }; + + const onChangePage = onChangePageProp + ? async (data: { type: string; [x: string]: string | boolean }) => { + onChangePageProp(data); + } + : null; + + const handleChangePage = useCallback( + (type) => { + pushPage({ type }); + }, + [pushPage], + ); + + const handleClickCommunity = useCallback( + (communityId) => { + const next = { + type: PageTypes.CommunityFeed, + communityId, + }; + + if (onChangePage) return onChangePage(next); + if (onClickCommunity) return onClickCommunity(communityId); + + pushPage(next); + }, + [onChangePage, onClickCommunity, pushPage], + ); + + const handleCommunityCreated = useCallback( + (communityId) => { + const next = { + type: PageTypes.CommunityFeed, + communityId, + isNewCommunity: true, + }; + + if (onChangePage) return onChangePage(next); + if (onCommunityCreated) return onCommunityCreated(communityId); + + pushPage(next); + }, + [onChangePage, onCommunityCreated, pushPage], + ); + + const handleClickCategory = useCallback( + (categoryId) => { + const next = { + type: PageTypes.Category, + categoryId, + }; + + if (onChangePage) return onChangePage(next); + if (onClickCategory) return onClickCategory(categoryId); + + pushPage(next); + }, + [onChangePage, onClickCategory, pushPage], + ); + + const handleClickUser = useCallback( + (userId, pageType) => { + const next = { + type: pageType ?? PageTypes.UserFeed, + userId, + }; + + if (onChangePage) return onChangePage(next); + if (onClickUser) return onClickUser(userId); + + pushPage(next); + }, + [onChangePage, onClickUser, pushPage], + ); + + const handleEditUser = useCallback( + (userId) => { + const next = { + type: PageTypes.UserEdit, + userId, + }; + + if (onChangePage) return onChangePage(next); + if (onEditUser) return onEditUser(userId); + + pushPage(next); + }, + [onChangePage, onEditUser, pushPage], + ); + + const handleEditCommunity = useCallback( + (communityId, tab) => { + const next = { + type: PageTypes.CommunityEdit, + communityId, + tab, + }; + + if (onChangePage) return onChangePage(next); + if (onEditCommunity) return onEditCommunity(communityId, { tab }); + + pushPage(next); + }, + [onChangePage, onEditCommunity, pushPage], + ); + + const handleMessageUser = useCallback( + (userId) => { + const next = { + type: 'conversation', + userId, + }; + + if (onChangePage) return onChangePage(next); + if (onMessageUser) return onMessageUser(userId); + }, + [onChangePage, onMessageUser], + ); + + const handleBack = useCallback(() => { + if (onBack) { + onBack(); + } + popPage(); + }, [onChangePage, onBack, popPage]); + + const goToViewStoryPage = useCallback( + ({ targetId, storyType, targetType }) => { + const next = { + type: PageTypes.ViewStoryPage, + context: { + targetId, + storyType, + targetType, + }, + }; + + pushPage(next); + }, + [onChangePage, pushPage], + ); + + const goToUserProfilePage = useCallback( + (userId) => { + const next = { + type: PageTypes.UserProfilePage, + context: { + userId, + }, + }; + + pushPage(next); + }, + [onChangePage, pushPage], + ); + + const goToPostDetailPage = useCallback( + (postId) => { + const next = { + type: PageTypes.PostDetailPage, + context: { + postId, + }, + }; + + pushPage(next); + }, + [onChangePage, pushPage], + ); + + const goToCommunityProfilePage = useCallback( + (communityId) => { + const next = { + type: PageTypes.CommunityProfilePage, + context: { + communityId, + }, + }; + + pushPage(next); + }, + [onChangePage, pushPage], + ); + + const goToSocialGlobalSearchPage = useCallback( + (tab?: string) => { + const next = { + type: PageTypes.SocialGlobalSearchPage, + context: { tab }, + }; + + pushPage(next); + }, + [onChangePage, pushPage], + ); + const goToSelectPostTargetPage = useCallback(() => { + const next = { + type: PageTypes.SelectPostTargetPage, + }; + + pushPage(next); + }, [onChangePage, pushPage]); + + const goToDraftStoryPage = useCallback( + ({ targetId, targetType, mediaType }) => { + const next = { + type: PageTypes.DraftPage, + targetId, + targetType, + mediaType, + }; + + if (onChangePage) return onChangePage(next); + + pushPage(next); + }, + [onChangePage, pushPage], + ); + + return ( + + {children} + + ); +} diff --git a/src/v4/core/providers/NotificationProvider.module.css b/src/v4/core/providers/NotificationProvider.module.css index 0f8bf6de4..182cab8c1 100644 --- a/src/v4/core/providers/NotificationProvider.module.css +++ b/src/v4/core/providers/NotificationProvider.module.css @@ -1,44 +1,7 @@ .icon { width: 1.125rem; height: 1.125rem; - margin-right: 8px; + margin-right: var(--asc-spacing-s1); + margin-left: var(--asc-spacing-s1); fill: var(--asc-color-white); } - -.notifications { - position: fixed; - padding-top: 50px; - top: 0; - left: 0; - right: 0; - display: flex; - flex-direction: column; - align-items: center; - z-index: 99999; - pointer-events: none; -} - -.notificationContainer { - width: 480px; - padding: 8px 30px; - display: flex; - justify-content: center; - align-items: center; - color: white; - border-radius: 4px; - margin-bottom: 10px; - animation-duration: 0.3s; - animation-name: appear; - pointer-events: auto; - background-color: var(--asc-color-base-shade4); -} - -@keyframes appear { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} diff --git a/src/v4/core/providers/PageBehaviorProvider.tsx b/src/v4/core/providers/PageBehaviorProvider.tsx index eeefde75f..68e4e96bd 100644 --- a/src/v4/core/providers/PageBehaviorProvider.tsx +++ b/src/v4/core/providers/PageBehaviorProvider.tsx @@ -1,46 +1,145 @@ -import React, { useMemo, useContext } from 'react'; -import { useNavigation } from '~/social/providers/NavigationProvider'; +import React, { useContext } from 'react'; +import { PageTypes, useNavigation } from '~/v4/core/providers/NavigationProvider'; -interface NavigationBehavior { - onCloseAction(): void; +export interface PageBehavior { + AmityStoryViewPageBehavior: { + onCloseAction(): void; + hyperLinkAction?(context: Record): void; + }; + AmityDraftStoryPageBehavior: { + onCloseAction(): void; + }; onClickHyperLink(): void; -} - -interface PageBehavior { - navigationBehavior: NavigationBehavior; + AmitySocialHomePageBehavior: Record; + AmityGlobalFeedComponentBehavior: { + goToPostDetailPage: (context: { postId: string }) => void; + goToViewStoryPage: (context: { + targetId: string; + targetType: Amity.StoryTargetType; + storyType: 'communityFeed' | 'globalFeed'; + targetIds?: string[]; + }) => void; + }; + AmityPostDetailPageBehavior: Record; + AmityPostContentComponentBehavior: { + goToCommunityProfilePage: (context: { communityId: string }) => void; + goToUserProfilePage: (context: { userId: string }) => void; + }; + AmitySocialGlobalSearchPageBehavior: Record; + AmityCommunitySearchResultComponentBehavior: { + goToCommunityProfilePage: (context: { communityId: string }) => void; + }; + AmityCreatePostMenuComponentBehavior: { + goToSelectPostTargetPage(): void; + }; } const PageBehaviorContext = React.createContext(undefined); interface PageBehaviorProviderProps { children: React.ReactNode; - pageBehavior?: Partial; + pageBehavior?: Partial; } export const PageBehaviorProvider: React.FC = ({ children, pageBehavior = {}, }) => { - const { onBack } = useNavigation(); - const defaultNavigationBehavior: NavigationBehavior = { - onCloseAction: () => { - onBack(); + const { + onBack, + goToPostDetailPage, + goToCommunityProfilePage, + goToUserProfilePage, + goToViewStoryPage, + onChangePage, + goToSelectPostTargetPage, + } = useNavigation(); + const navigationBehavior: PageBehavior = { + AmityStoryViewPageBehavior: { + onCloseAction: () => { + if (pageBehavior?.AmityStoryViewPageBehavior?.onCloseAction) { + return pageBehavior.AmityStoryViewPageBehavior.onCloseAction(); + } + onChangePage(PageTypes.SocialHomePage); + }, + hyperLinkAction: (context: Record) => { + if (pageBehavior?.AmityStoryViewPageBehavior?.hyperLinkAction) { + return pageBehavior.AmityStoryViewPageBehavior.hyperLinkAction(context); + } + }, + }, + AmityDraftStoryPageBehavior: { + onCloseAction: () => { + if (pageBehavior?.AmityDraftStoryPageBehavior?.onCloseAction) { + return pageBehavior.AmityDraftStoryPageBehavior.onCloseAction(); + } + onBack(); + }, }, onClickHyperLink: () => {}, + AmitySocialHomePageBehavior: {}, + AmityGlobalFeedComponentBehavior: { + goToPostDetailPage: (context: { postId: string }) => { + if (pageBehavior?.AmityGlobalFeedComponentBehavior?.goToPostDetailPage) { + return pageBehavior?.AmityGlobalFeedComponentBehavior.goToPostDetailPage(context); + } + goToPostDetailPage(context.postId); + }, + goToViewStoryPage: (context: { + targetId: string; + targetType: Amity.StoryTargetType; + storyType: 'communityFeed' | 'globalFeed'; + }) => { + if (pageBehavior?.AmityGlobalFeedComponentBehavior?.goToViewStoryPage) { + return pageBehavior?.AmityGlobalFeedComponentBehavior.goToViewStoryPage(context); + } + goToViewStoryPage({ + targetId: context.targetId, + targetType: context.targetType, + storyType: context.storyType, + }); + }, + }, + AmityPostDetailPageBehavior: {}, + AmityPostContentComponentBehavior: { + goToCommunityProfilePage: (context: { communityId: string }) => { + if (pageBehavior?.AmityPostContentComponentBehavior?.goToCommunityProfilePage) { + return pageBehavior.AmityPostContentComponentBehavior.goToCommunityProfilePage(context); + } + goToCommunityProfilePage(context.communityId); + }, + goToUserProfilePage: (context: { userId: string }) => { + if (pageBehavior?.AmityPostContentComponentBehavior?.goToUserProfilePage) { + return pageBehavior.AmityPostContentComponentBehavior.goToUserProfilePage(context); + } + goToUserProfilePage(context.userId); + }, + }, + AmitySocialGlobalSearchPageBehavior: {}, + AmityCommunitySearchResultComponentBehavior: { + goToCommunityProfilePage: (context: { communityId: string }) => { + if (pageBehavior?.AmityCommunitySearchResultComponentBehavior?.goToCommunityProfilePage) { + return pageBehavior.AmityCommunitySearchResultComponentBehavior.goToCommunityProfilePage( + context, + ); + } + goToCommunityProfilePage(context.communityId); + }, + }, + AmityCreatePostMenuComponentBehavior: { + goToSelectPostTargetPage() { + if (pageBehavior?.AmityCreatePostMenuComponentBehavior?.goToSelectPostTargetPage) { + return pageBehavior.AmityCreatePostMenuComponentBehavior.goToSelectPostTargetPage(); + } + goToSelectPostTargetPage(); + }, + }, }; - const pageBehaviorMemo = useMemo(() => { - const mergedNavigationBehavior: NavigationBehavior = { - ...defaultNavigationBehavior, - ...pageBehavior, - }; - return { - navigationBehavior: mergedNavigationBehavior, - }; - }, []); - return ( - {children} + + {children} + ); }; diff --git a/src/v4/core/providers/SDKConnectorProvider/SDKConnectorFetcherProvider.tsx b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorFetcherProvider.tsx new file mode 100644 index 000000000..d543c862a --- /dev/null +++ b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorFetcherProvider.tsx @@ -0,0 +1,96 @@ +import React, { createContext, useContext, useEffect, useRef } from 'react'; +const SDKConnectorFetcherContext = createContext({ + fetch: async ({ + fetchFn, + params, + }: { + fetchFn: (...args: TArgs[]) => Promise; + params: TArgs[]; + }) => { + const response = await Promise.resolve({} as TResponse); + return response; + }, +}); + +export const useSDKFetcherConnector = () => useContext(SDKConnectorFetcherContext); + +export default function SDKConnectorFetcherProvider({ children }: { children: React.ReactNode }) { + const fetcherPromiseArrayMap = useRef< + Record< + string, + Array<{ + resolve: (value: any) => void; + reject: (reason?: unknown) => void; + }> + > + >({}); + const fetcherResponse = useRef>({}); + + function getFetcherKey(fnName: string, params: Array) { + return `${fnName}.${JSON.stringify(params)}`; + } + + const fetch = ({ + fetchFn, + params, + }: { + fetchFn: (...args: TArgs[]) => Promise; + params: TArgs[]; + }) => { + const key = getFetcherKey(fetchFn.name, params); + + if (fetcherPromiseArrayMap.current[key]?.length > 0) { + if (fetcherResponse.current[key] != null) { + return Promise.resolve(fetcherResponse.current[key] as TResponse); + } + let resolveFn: (value: TResponse) => void = () => {}; + let rejectFn: (reason?: unknown) => void = () => {}; + const promise = new Promise((resolve, reject) => { + resolveFn = resolve; + rejectFn = reject; + }); + fetcherPromiseArrayMap.current[key].push({ + resolve: resolveFn, + reject: rejectFn, + }); + + return promise; + } + + let resolveFn: (value: TResponse) => void = () => {}; + let rejectFn: (reason?: unknown) => void = () => {}; + const promise = new Promise((resolve, reject) => { + resolveFn = resolve; + rejectFn = reject; + }); + fetcherPromiseArrayMap.current[key] = [ + { + resolve: resolveFn, + reject: rejectFn, + }, + ]; + + fetchFn(...params) + .then((response) => { + fetcherResponse.current[key] = response; + fetcherPromiseArrayMap.current[key].forEach(({ resolve }) => resolve(response)); + }) + .catch((error) => { + fetcherPromiseArrayMap.current[key].forEach(({ reject }) => reject(error)); + }) + .finally(() => { + setTimeout(() => { + fetcherResponse.current[key] = null; + fetcherPromiseArrayMap.current[key] = []; + }, 500); + }); + + return promise; + }; + + return ( + + {children} + + ); +} diff --git a/src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveCollectionProvider.tsx b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveCollectionProvider.tsx new file mode 100644 index 000000000..9fee6b430 --- /dev/null +++ b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveCollectionProvider.tsx @@ -0,0 +1,99 @@ +import React, { createContext, useContext, useEffect, useRef, useState } from 'react'; +import useSDK from '~/v4/core/hooks/useSDK'; +const SDKConnectorLiveCollectionContext = createContext({ + subscribe: ({ + fetcher, + params, + callback, + config, + }: { + fetcher: ( + params: Amity.LiveCollectionParams, + callback: Amity.LiveCollectionCallback, + config?: Amity.LiveCollectionConfig, + ) => Amity.Unsubscriber; + params: Amity.LiveCollectionParams; + callback: Amity.LiveCollectionCallback; + config?: Amity.LiveCollectionConfig; + }) => { + return { unsubscribe: () => {} }; + }, +}); + +export const useSDKLiveCollectionConnector = () => useContext(SDKConnectorLiveCollectionContext); + +export default function SDKConnectorLiveCollectionProvider({ + children, +}: { + children: React.ReactNode; +}) { + const subscriberMap = useRef>>>({}); + const unsubscribeFnMap = useRef void>>({}); + const responseMap = useRef>>({}); + const { currentUserId } = useSDK(); + + function getSubscriberKey(fnName: string, params: Amity.LiveCollectionParams) { + return `${currentUserId}.${fnName}.${JSON.stringify(params)}`; + } + + useEffect(() => { + return () => { + Object.values(unsubscribeFnMap.current).forEach((unsubscribeFn) => unsubscribeFn()); + }; + }, []); + + const subscribe = ({ + fetcher, + params, + callback, + config, + }: { + fetcher: ( + params: Amity.LiveCollectionParams, + callback: Amity.LiveCollectionCallback, + config?: Amity.LiveCollectionConfig, + ) => Amity.Unsubscriber; + params: Amity.LiveCollectionParams; + callback: Amity.LiveCollectionCallback; + config?: Amity.LiveCollectionConfig; + }) => { + if (currentUserId == null) return { unsubscribe() {} }; + const key = getSubscriberKey(fetcher.name, params); + + if (subscriberMap.current[key] && responseMap.current[key]) { + callback?.(responseMap.current[key] as Amity.LiveCollection); + subscriberMap.current[key].push(callback as Amity.LiveCollectionCallback); + } else { + subscriberMap.current[key] = [callback as Amity.LiveCollectionCallback]; + + const unsubscribeFn = fetcher( + params, + (response) => { + responseMap.current[key] = response; + const subscribers = subscriberMap.current[key]; + (subscribers || []).forEach((subscriber) => subscriber(response)); + }, + config, + ); + + unsubscribeFnMap.current[key] = unsubscribeFn; + } + + return { + unsubscribe() { + const callbackFn = subscriberMap.current[key].find((subscriber) => subscriber === callback); + if (callbackFn) { + subscriberMap.current[key] = subscriberMap.current[key].filter( + (subscriber) => subscriber !== callbackFn, + ); + } + }, + }; + }; + + return ( + + {children} + + ); +} diff --git a/src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveObjectProvider.tsx b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveObjectProvider.tsx new file mode 100644 index 000000000..3bb681722 --- /dev/null +++ b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveObjectProvider.tsx @@ -0,0 +1,99 @@ +import React, { createContext, useContext, useEffect, useRef, useState } from 'react'; +import useSDK from '~/v4/core/hooks/useSDK'; +const SDKConnectorLiveObjectContext = createContext({ + subscribe: ({ + fetcher, + params, + callback = () => {}, + options, + }: { + fetcher: ( + params: TParams, + callback: Amity.LiveObjectCallback, + options?: Amity.LiveObjectOptions, + ) => Amity.Unsubscriber; + params: TParams; + callback?: Amity.LiveObjectCallback; + options?: Amity.LiveObjectOptions; + }) => { + return { unsubscribe: () => {} }; + }, +}); + +export const useSDKLiveObjectConnector = () => useContext(SDKConnectorLiveObjectContext); + +export default function SDKConnectorLiveObjectProvider({ + children, +}: { + children: React.ReactNode; +}) { + const subscriberMap = useRef>>>({}); + const unsubscribeFnMap = useRef void>>({}); + const responseMap = useRef>>({}); + const { currentUserId } = useSDK(); + + function getSubscriberKey(fnName: string, params: TParams) { + return `${currentUserId}.${fnName}.${JSON.stringify(params)}`; + } + + useEffect(() => { + return () => { + Object.values(unsubscribeFnMap.current).forEach((unsubscribeFn) => unsubscribeFn()); + }; + }, []); + + const subscribe = ({ + fetcher, + params, + callback = () => {}, + options, + }: { + fetcher: ( + params: TParams, + callback: Amity.LiveObjectCallback, + options?: Amity.LiveObjectOptions, + ) => Amity.Unsubscriber; + params: TParams; + callback?: Amity.LiveObjectCallback; + options?: Amity.LiveObjectOptions; + }) => { + if (currentUserId == null) return { unsubscribe() {} }; + const key = getSubscriberKey(fetcher.name, params); + + if (subscriberMap.current[key]) { + callback(responseMap.current[key] as Amity.LiveObject); + subscriberMap.current[key].push(callback as Amity.LiveObjectCallback); + } else { + subscriberMap.current[key] = [callback as Amity.LiveObjectCallback]; + + const unsubscribeFn = fetcher( + params, + (response) => { + responseMap.current[key] = response; + const subscribers = subscriberMap.current[key]; + (subscribers || []).forEach((subscriber) => subscriber(response)); + }, + options, + ); + + unsubscribeFnMap.current[key] = unsubscribeFn; + } + + return { + unsubscribe() { + const callbackFn = subscriberMap.current[key].find((subscriber) => subscriber === callback); + if (callbackFn) { + subscriberMap.current[key] = subscriberMap.current[key].filter( + (subscriber) => subscriber !== callbackFn, + ); + } + }, + }; + }; + + return ( + + {children} + + ); +} diff --git a/src/v4/core/providers/SDKConnectorProvider/SDKConnectorSubscribersProvider.tsx b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorSubscribersProvider.tsx new file mode 100644 index 000000000..869153066 --- /dev/null +++ b/src/v4/core/providers/SDKConnectorProvider/SDKConnectorSubscribersProvider.tsx @@ -0,0 +1,68 @@ +import { subscribeTopic } from '@amityco/ts-sdk'; +import React, { createContext, useContext, useEffect, useRef } from 'react'; +const SDKConnectorSubscribersContext = createContext({ + subscribe: ({ + topic, + callback, + }: { + topic: string; + callback: Amity.Listener; + }) => { + return { unsubscribe: () => {} }; + }, +}); + +export const useSDKSubscribersConnector = () => useContext(SDKConnectorSubscribersContext); + +export default function SDKConnectorSubscribersProvider({ + children, +}: { + children: React.ReactNode; +}) { + const callbackMap = useRef>({}); + const unsubscribeFnMap = useRef void>>({}); + + useEffect(() => { + return () => { + Object.values(unsubscribeFnMap.current).forEach((unsubscribeFn) => unsubscribeFn()); + }; + }, []); + + const subscribe = ({ + topic, + callback, + }: { + topic: string; + callback: Amity.Listener; + }) => { + if (callbackMap.current[topic]) { + callbackMap.current[topic].push(callback); + } else { + callbackMap.current[topic] = [callback]; + + const unsubscribeFn = subscribeTopic(topic, (...args) => { + const callbacks = callbackMap.current[topic]; + (callbacks || []).forEach((cb) => cb(...args)); + }); + + unsubscribeFnMap.current[topic] = unsubscribeFn; + } + + return { + unsubscribe() { + const callbackFn = callbackMap.current[topic].find((cb) => cb === callback); + if (callbackFn) { + callbackMap.current[topic] = callbackMap.current[topic].filter( + (subscriber) => subscriber !== callbackFn, + ); + } + }, + }; + }; + + return ( + + {children} + + ); +} diff --git a/src/v4/core/providers/SDKConnectorProvider/index.tsx b/src/v4/core/providers/SDKConnectorProvider/index.tsx new file mode 100644 index 000000000..6c6cbe406 --- /dev/null +++ b/src/v4/core/providers/SDKConnectorProvider/index.tsx @@ -0,0 +1,21 @@ +import React, { ReactNode } from 'react'; +import SDKConnectorLiveCollectionProvider from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveCollectionProvider'; +import SDKConnectorLiveObjectProvider from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveObjectProvider'; +import SDKConnectorFetcherProvider from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorFetcherProvider'; +import SDKConnectorSubscribersProvider from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorSubscribersProvider'; + +export { useSDKLiveCollectionConnector } from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveCollectionProvider'; +export { useSDKLiveObjectConnector } from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorLiveObjectProvider'; +export { useSDKFetcherConnector } from '~/v4/core/providers/SDKConnectorProvider/SDKConnectorFetcherProvider'; + +export default function SDKConnectorProvider({ children }: { children: ReactNode }) { + return ( + + + + {children} + + + + ); +} diff --git a/src/v4/core/providers/SDKProvider.tsx b/src/v4/core/providers/SDKProvider.tsx new file mode 100644 index 000000000..c9e904b46 --- /dev/null +++ b/src/v4/core/providers/SDKProvider.tsx @@ -0,0 +1,11 @@ +import { createContext } from 'react'; + +export const SDKContext = createContext<{ + client?: Amity.Client | null; + currentUserId?: string | null; + userRoles: string[]; +}>({ + client: null, + currentUserId: undefined, + userRoles: [], +}); diff --git a/src/v4/core/providers/ThemeProvider.tsx b/src/v4/core/providers/ThemeProvider.tsx index 646b3966c..80f568bdb 100644 --- a/src/v4/core/providers/ThemeProvider.tsx +++ b/src/v4/core/providers/ThemeProvider.tsx @@ -7,6 +7,22 @@ const SHADE_PERCENTAGES = [0.25, 0.4, 0.5, 0.75]; const generateShades = (hexColor?: string, isDarkMode = false): string[] => { if (!hexColor) return Array(SHADE_PERCENTAGES.length).fill(''); + if (isDarkMode === true && hexColor === defaultConfig.theme.dark.primary_color) { + return ['#4a82f2', '#a0bdf8', '#d9e5fc', '#ffffff']; + } + + if (isDarkMode === false && hexColor === defaultConfig.theme.light.primary_color) { + return ['#4a82f2', '#a0bdf8', '#d9e5fc', '#ffffff']; + } + + if (isDarkMode === true && hexColor === defaultConfig.theme.dark.secondary_color) { + return ['#a5a9b5', '#6e7487', '#40434e', '#292b32']; + } + + if (isDarkMode === false && hexColor === defaultConfig.theme.light.secondary_color) { + return ['#636878', '#898e9e', '#a5a9b5', '#ebecef']; + } + const hslColor = parseToHsl(hexColor); const shades = SHADE_PERCENTAGES.map((percentage) => { @@ -78,7 +94,6 @@ export function useGenerateStylesShadeColors(inputConfig?: GetConfigReturnValue) const darkThemeConfig = inputThemeConfig?.dark || defaultConfig.theme.dark; const darkPrimary = generateShades(darkThemeConfig.primary_color, true); const darkSecondary = generateShades(darkThemeConfig.secondary_color, true); - return { '--asc-color-primary-default': darkThemeConfig.primary_color, '--asc-color-primary-shade1': darkPrimary[0], diff --git a/src/v4/core/providers/UIStyles.module.css b/src/v4/core/providers/UIStyles.module.css index 423afd13c..155fce675 100644 --- a/src/v4/core/providers/UIStyles.module.css +++ b/src/v4/core/providers/UIStyles.module.css @@ -1,27 +1,28 @@ .uiStyles { - font-family: var(--typography-body-font-family); - font-size: var(--typography-body-font-size); - font-weight: var(--typography-body-font-weight); - line-height: var(--typography-body-line-height); - color: var(--palette-base-main); - width: 100%; - height: 100%; - overflow: hidden; - } - - .uiStyles input, - .uiStyles div { - box-sizing: border-box; - } - - .uiStyles * { - font-size: var(--typography-body-font-size); - line-height: 1.5; - } - - .uiStyles pre { - font-family: var(--typography-body-font-family); - font-size: var(--typography-body-font-size); - font-weight: var(--typography-body-font-weight); - line-height: var(--typography-body-line-height); - } \ No newline at end of file + font-family: var(--typography-body-font-family); + font-size: var(--typography-body-font-size); + font-weight: var(--typography-body-font-weight); + line-height: var(--typography-body-line-height); + color: var(--palette-base-main); + width: 100%; + height: 100%; + overflow: hidden; +} + +.uiStyles input, +.uiStyles div { + box-sizing: border-box; +} + +.uiStyles * { + font-size: var(--typography-body-font-size); + line-height: 1.5; +} + +.uiStyles pre { + font-family: var(--typography-body-font-family); + font-size: var(--typography-body-font-size); + font-weight: var(--typography-body-font-weight); + line-height: var(--typography-body-line-height); + text-anchor: start; +} diff --git a/src/v4/core/providers/index.css b/src/v4/core/providers/index.css index 19b92c9fd..9a6bf6a34 100644 --- a/src/v4/core/providers/index.css +++ b/src/v4/core/providers/index.css @@ -1,56 +1,52 @@ @keyframes react-loading-skeleton { - 100% { - transform: translateX(100%); - } + 100% { + transform: translateX(100%); } - +} + +.react-loading-skeleton { + --base-color: #ebebeb; + --highlight-color: #f5f5f5; + --animation-duration: 1.5s; + --animation-direction: normal; + --pseudo-element-display: block; /* Enable animation */ + + background-color: var(--base-color); + width: 100%; + border-radius: 0.25rem; + display: inline-flex; + line-height: 1; + position: relative; + user-select: none; + overflow: hidden; + z-index: 1; /* Necessary for overflow: hidden to work correctly in Safari */ +} + +.react-loading-skeleton::after { + content: ' '; + display: var(--pseudo-element-display); + position: absolute; + top: 0; + left: 0; + right: 0; + height: 100%; + background-repeat: no-repeat; + background-image: linear-gradient( + 90deg, + var(--base-color), + var(--highlight-color), + var(--base-color) + ); + transform: translateX(-100%); + animation-name: react-loading-skeleton; + animation-direction: var(--animation-direction); + animation-duration: var(--animation-duration); + animation-timing-function: ease-in-out; + animation-iteration-count: infinite; +} + +@media (prefers-reduced-motion) { .react-loading-skeleton { - --base-color: #ebebeb; - --highlight-color: #f5f5f5; - --animation-duration: 1.5s; - --animation-direction: normal; - --pseudo-element-display: block; /* Enable animation */ - - background-color: var(--base-color); - - width: 100%; - border-radius: 0.25rem; - display: inline-flex; - line-height: 1; - - position: relative; - user-select: none; - overflow: hidden; - z-index: 1; /* Necessary for overflow: hidden to work correctly in Safari */ + --pseudo-element-display: none; /* Disable animation */ } - - .react-loading-skeleton::after { - content: ' '; - display: var(--pseudo-element-display); - position: absolute; - top: 0; - left: 0; - right: 0; - height: 100%; - background-repeat: no-repeat; - background-image: linear-gradient( - 90deg, - var(--base-color), - var(--highlight-color), - var(--base-color) - ); - transform: translateX(-100%); - - animation-name: react-loading-skeleton; - animation-direction: var(--animation-direction); - animation-duration: var(--animation-duration); - animation-timing-function: ease-in-out; - animation-iteration-count: infinite; - } - - @media (prefers-reduced-motion) { - .react-loading-skeleton { - --pseudo-element-display: none; /* Disable animation */ - } - } - \ No newline at end of file +} diff --git a/src/v4/helpers/utils.ts b/src/v4/helpers/utils.ts index 9afa54300..74db79310 100644 --- a/src/v4/helpers/utils.ts +++ b/src/v4/helpers/utils.ts @@ -7,6 +7,31 @@ export type Metadata = { mentioned?: Mentioned[]; }; +type Chunk = { start: number; end: number; highlight?: boolean }; + +export const processChunks = (text: string, chunks: Chunk[] = []) => { + const textLength = text?.length || 0; + const allChunks: Chunk[] = []; + + const append = (start: number, end: number, highlight: boolean) => { + allChunks.push({ start, end, highlight }); + }; + + if (!chunks || chunks?.length === 0) { + append(0, textLength, false); + } else { + let lastIndex = 0; + chunks.forEach((chunk) => { + append(lastIndex, chunk.start, false); + append(chunk.start, chunk.end, true); + lastIndex = chunk.end; + }); + append(lastIndex, textLength, false); + } + + return allChunks; +}; + export function isCommunityMember(member?: Amity.Member<'community'>) { return member?.communityMembership === 'member'; } diff --git a/src/v4/icons/AngleRight.tsx b/src/v4/icons/AngleRight.tsx new file mode 100644 index 000000000..320e3ec3e --- /dev/null +++ b/src/v4/icons/AngleRight.tsx @@ -0,0 +1,16 @@ +import React from 'react'; + +const AngleRight = (props: React.SVGProps) => ( + + + +); + +export default AngleRight; diff --git a/src/v4/icons/Chat.tsx b/src/v4/icons/Chat.tsx new file mode 100644 index 000000000..149eb508a --- /dev/null +++ b/src/v4/icons/Chat.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +const Svg = (props: React.SVGProps) => ( + + + + + +); + +export default Svg; diff --git a/src/v4/icons/ChevronLeft.tsx b/src/v4/icons/ChevronLeft.tsx new file mode 100644 index 000000000..fe77779e8 --- /dev/null +++ b/src/v4/icons/ChevronLeft.tsx @@ -0,0 +1,16 @@ +import React from 'react'; + +const ChevronLeft = (props: React.SVGProps) => ( + + + +); + +export default ChevronLeft; diff --git a/src/v4/icons/Community.tsx b/src/v4/icons/Community.tsx index ced2fc1b7..1ee18df1d 100644 --- a/src/v4/icons/Community.tsx +++ b/src/v4/icons/Community.tsx @@ -18,5 +18,3 @@ const Community = (props: React.SVGProps) => ( ); export default Community; - -export const backgroundImage = `url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 40 40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='40' height='40' rx='20' fill='%23D9E5FC'/%3E%3Cpath d='M19.8462 12C20.7625 12 21.6413 12.356 22.2893 12.9898C22.9373 13.6235 23.3013 14.4831 23.3013 15.3793C23.3013 16.2756 22.9373 17.1351 22.2893 17.7688C21.6413 18.4026 20.7625 18.7586 19.8462 18.7586C18.9298 18.7586 18.051 18.4026 17.403 17.7688C16.755 17.1351 16.391 16.2756 16.391 15.3793C16.391 14.4831 16.755 13.6235 17.403 12.9898C18.051 12.356 18.9298 12 19.8462 12ZM12.9359 14.4138C13.4887 14.4138 14.0021 14.5586 14.4463 14.8193C14.2982 16.2 14.7128 17.571 15.5618 18.6428C15.0682 19.5697 14.081 20.2069 12.9359 20.2069C12.1504 20.2069 11.3972 19.9017 10.8418 19.3585C10.2864 18.8153 9.97436 18.0786 9.97436 17.3103C9.97436 16.5421 10.2864 15.8054 10.8418 15.2622C11.3972 14.719 12.1504 14.4138 12.9359 14.4138ZM26.7564 14.4138C27.5419 14.4138 28.2951 14.719 28.8505 15.2622C29.4059 15.8054 29.7179 16.5421 29.7179 17.3103C29.7179 18.0786 29.4059 18.8153 28.8505 19.3585C28.2951 19.9017 27.5419 20.2069 26.7564 20.2069C25.6113 20.2069 24.6241 19.5697 24.1305 18.6428C24.9795 17.571 25.3941 16.2 25.246 14.8193C25.6903 14.5586 26.2036 14.4138 26.7564 14.4138ZM13.4295 24.3103C13.4295 22.3117 16.3022 20.6897 19.8462 20.6897C23.3901 20.6897 26.2628 22.3117 26.2628 24.3103V26H13.4295V24.3103ZM8 26V24.5517C8 23.2097 9.86577 22.08 12.3929 21.7517C11.8105 22.4083 11.4551 23.3159 11.4551 24.3103V26H8ZM31.6923 26H28.2372V24.3103C28.2372 23.3159 27.8818 22.4083 27.2994 21.7517C29.8265 22.08 31.6923 23.2097 31.6923 24.5517V26Z' fill='white'/%3E%3C/svg%3E%0A");`; diff --git a/src/v4/icons/User.tsx b/src/v4/icons/User.tsx new file mode 100644 index 000000000..06990514d --- /dev/null +++ b/src/v4/icons/User.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +const Svg = (props: React.SVGProps) => ( + + + + + +); + +export default Svg; diff --git a/src/v4/social/components/CommentTray/CommentTray.module.css b/src/v4/social/components/CommentTray/CommentTray.module.css index 72a5395b5..407b12b69 100644 --- a/src/v4/social/components/CommentTray/CommentTray.module.css +++ b/src/v4/social/components/CommentTray/CommentTray.module.css @@ -41,11 +41,8 @@ .nestedBackdrop { position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); + inset: 0; + background-color: rgb(0 0 0 / 50%); z-index: -1; } diff --git a/src/v4/social/components/CommentTray/CommentTray.tsx b/src/v4/social/components/CommentTray/CommentTray.tsx index 0e8c62583..2940bcf6e 100644 --- a/src/v4/social/components/CommentTray/CommentTray.tsx +++ b/src/v4/social/components/CommentTray/CommentTray.tsx @@ -1,4 +1,5 @@ import React, { useState } from 'react'; +import { useAmityComponent } from '~/v4/core/hooks/uikit/index'; import { CommentList } from '~/v4/social/internal-components/CommentList'; import { StoryCommentComposeBar } from '~/v4/social/internal-components/StoryCommentComposeBar'; import styles from './CommentTray.module.css'; @@ -11,15 +12,23 @@ interface CommentTrayProps { community: Amity.Community; shouldAllowInteraction: boolean; shouldAllowCreation?: boolean; + pageId?: string; } export const CommentTray = ({ + pageId = '*', referenceType, referenceId, community = {} as Amity.Community, shouldAllowInteraction = true, - shouldAllowCreation = false, + shouldAllowCreation = true, }: CommentTrayProps) => { + const componentId = 'comment_tray_component'; + const { config } = useAmityComponent({ + pageId, + componentId, + }); + const [isReplying, setIsReplying] = useState(false); const [replyTo, setReplyTo] = useState(null); @@ -37,6 +46,8 @@ export const CommentTray = ({
( - - -
- -
-
-
- ), - ], -} as ComponentMeta; - -const Template: ComponentStory = (args) => ; - -export const Default = Template.bind({}); -Default.args = { - pageId: '*', - storyId: 'story123', - commentId: 'comment123', - referenceType: 'story', - referenceId: 'story123', - replyTo: 'user123', - isReplying: false, - limit: 5, - isOpen: true, - isJoined: true, - allowCommentInStory: true, - onClose: () => {}, - onClickReply: () => {}, - onCancelReply: () => {}, + argTypes: { + referenceType: { + control: 'select', + options: ['content', 'post', 'story'], + }, + referenceId: { + control: 'text', + }, + shouldAllowInteraction: { + control: 'boolean', + }, + shouldAllowCreation: { + control: 'boolean', + }, + }, }; -export const Replying = Template.bind({}); -Replying.args = { - ...Default.args, - isReplying: true, -}; +type Story = StoryObj; -export const NotJoined = Template.bind({}); -NotJoined.args = { - ...Default.args, - isJoined: false, +export const CommentTrayComponent: Story = { + render: (args) => { + return ( + + ); + }, + args: { + referenceType: 'story', + referenceId: '', + shouldAllowInteraction: true, + shouldAllowCreation: true, + }, + name: 'CommentTrayComponent', }; diff --git a/src/v4/social/components/CommunitySearchResult/CommunityItem.module.css b/src/v4/social/components/CommunitySearchResult/CommunityItem.module.css new file mode 100644 index 000000000..f2d368a78 --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunityItem.module.css @@ -0,0 +1,58 @@ +.communityItem { + display: grid; + grid-template-columns: 2.5rem minmax(0, 1fr); + gap: 1rem; + padding-top: 1rem; + padding-bottom: 1rem; + width: 100%; +} + +.communityItem:not(:first-child) { + border-top: 0.0625rem solid var(--asc-color-base-shade4); +} + +.communityItem__leftPane { + display: flex; + justify-content: center; + align-items: center; +} + +.communityItem__rightPane { + display: flex; + justify-content: center; + align-items: start; + flex-direction: column; + gap: 0.25rem; + width: 100%; +} + +.communityItem__communityName { + display: flex; + justify-content: start; + align-items: center; + gap: 0.25rem; + width: 100%; +} + +.communityItem__communityName__private { + width: 1.25rem; + height: 1.25rem; + display: flex; + justify-content: center; + align-items: center; + padding-top: 0.22rem; + padding-bottom: 0.28rem; +} + +.communityItem__communityCategory { + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; +} + +.communityItem__communityMemberCount { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/v4/social/components/CommunitySearchResult/CommunityItem.tsx b/src/v4/social/components/CommunitySearchResult/CommunityItem.tsx new file mode 100644 index 000000000..420ccf68a --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunityItem.tsx @@ -0,0 +1,85 @@ +import React from 'react'; +import useCategoriesByIds from '~/social/hooks/useCategoriesByIds'; +import { CommunityAvatar } from '~/v4/social/elements/CommunityAvatar'; +import { CommunityDisplayName } from '~/v4/social/elements/CommunityDisplayName'; +import { CommunityOfficialBadge } from '~/v4/social/elements/CommunityOfficialBadge'; +import { CommunityPrivateBadge } from '~/v4/social/elements/CommunityPrivateBadge'; +import { CommunityCategoryName } from '~/v4/social/elements/CommunityCategoryName'; +import { CommunityMembersCount } from '~/v4/social/elements/CommunityMembersCount'; +import styles from './CommunityItem.module.css'; + +const CommunityCategories = ({ + community, + pageId, + componentId, +}: { + community: Amity.Community; + pageId: string; + componentId: string; +}) => { + const categories = useCategoriesByIds(community.categoryIds); + + const maxCategoriesLength = 3; + + const overflowCategoriesLength = categories.length - maxCategoriesLength; + + return ( + <> + {categories.slice(0, 3).map((category) => ( + + ))} + {overflowCategoriesLength > 0 && ( + + )} + + ); +}; + +export const CommunityItem = ({ + community, + pageId = '*', + componentId = '*', +}: { + community: Amity.Community; + pageId: string; + componentId: string; +}) => { + return ( +
+
+ +
+
+
+ {!community.isPublic && ( +
+ +
+ )} + + {community.isOfficial && ( + + )} +
+
+ +
+
+ +
+
+
+ ); +}; diff --git a/src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.module.css b/src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.module.css new file mode 100644 index 000000000..276625c95 --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.module.css @@ -0,0 +1,74 @@ +.communityItemSkeleton { + display: grid; + grid-template-columns: 2.5rem minmax(0, 1fr); + gap: 1rem; + padding-top: 1rem; + margin-bottom: 1.5rem; + height: 3.5rem; + background-color: var(--asc-color-base-background); + width: 100%; +} + +.communityItemSkeleton:not(:first-child) { + border-top: 0.0625rem solid var(--asc-color-base-shade4); +} + +.communityItemSkeleton__leftPane { + display: flex; + justify-content: center; + align-items: center; +} + +.communityItemSkeleton__information { + display: flex; + flex-direction: column; + justify-content: center; + align-items: start; + gap: 0.75rem; + width: 100%; +} + +.communityItemSkeleton__content { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.communityItemSkeleton__animation { + animation: skeleton-pulse 1.5s ease-in-out infinite; +} + +.communityItemSkeleton__userAvatar { + width: 2.5rem; + height: 2.5rem; + border-radius: 50%; + background-color: var(--asc-color-base-shade4); +} + +.communityItemSkeleton__information__title { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 8.75rem; + height: 0.5rem; +} + +.communityItemSkeleton__information__subtitle { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 6.75rem; + height: 0.5rem; +} + +@keyframes skeleton-pulse { + 0% { + opacity: 0.6; + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 0.6; + } +} diff --git a/src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.tsx b/src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.tsx new file mode 100644 index 000000000..f9f555ba5 --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunityItemSkeleton.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './CommunityItemSkeleton.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +interface CommunityItemSkeletonProps { + pageId?: string; + componentId?: string; +} + +export const CommunityItemSkeleton = ({ + pageId = '*', + componentId = '*', +}: CommunityItemSkeletonProps) => { + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + return ( +
+
+
+
+
+
+
+
+
+ ); +}; diff --git a/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.module.css b/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.module.css new file mode 100644 index 000000000..82ca0dfb2 --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.module.css @@ -0,0 +1,68 @@ +.communitySearchResult { + display: flex; + flex-direction: column; + justify-content: center; + align-items: start; + width: 100%; + background-color: var(--asc-color-base-background); + overflow-x: hidden; +} + +.communitySearchResult__communityItem { + display: grid; + grid-template-columns: 4rem minmax(0, 1fr); + gap: 1rem; + padding-top: 1rem; + padding-bottom: 1rem; + width: 100%; +} + +.communitySearchResult__communityItem:not(:first-child) { + border-top: 0.0625rem solid var(--asc-color-base-shade4); +} + +.communitySearchResult__communityItem__leftPane { + display: flex; + justify-content: center; + align-items: center; +} + +.communitySearchResult__communityItem__rightPane { + display: flex; + justify-content: center; + align-items: start; + flex-direction: column; + gap: 0.25rem; + width: 100%; +} + +.communityItem__communityName { + display: flex; + justify-content: start; + align-items: center; + gap: 0.25rem; + width: 100%; +} + +.communityItem__communityName__private { + width: 1.25rem; + height: 1.25rem; + display: flex; + justify-content: center; + align-items: center; + padding-top: 0.22rem; + padding-bottom: 0.28rem; +} + +.communityItem__communityCategory { + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; +} + +.communityItem__communityMemberCount { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.stories.tsx b/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.stories.tsx new file mode 100644 index 000000000..4d866816e --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.stories.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import useOneCommunity from '~/mock/useOneCommunity'; + +import { CommunitySearchResult } from './CommunitySearchResult'; + +export default { + title: 'v4-social/components/CommunitySearchResult', +}; + +export const CommunitySearchResultStory = { + render: () => { + const [community] = useOneCommunity(); + + if (community == null) return null; + + return {}} />; + }, + + name: 'CommunitySearchResult', +}; diff --git a/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.tsx b/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.tsx new file mode 100644 index 000000000..f17490a88 --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/CommunitySearchResult.tsx @@ -0,0 +1,52 @@ +import React, { useRef } from 'react'; +import styles from './CommunitySearchResult.module.css'; +import useIntersectionObserver from '~/v4/core/hooks/useIntersectionObserver'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; +import { CommunityItem } from './CommunityItem'; +import { CommunityItemSkeleton } from './CommunityItemSkeleton'; + +interface CommunitySearchResultProps { + pageId?: string; + communityCollection: Amity.Community[]; + isLoading: boolean; + onLoadMore: () => void; +} + +export const CommunitySearchResult = ({ + pageId = '*', + communityCollection = [], + // isLoading, + onLoadMore, +}: CommunitySearchResultProps) => { + const componentId = 'community_search_result'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + const intersectionRef = useRef(null); + + const isLoading = true; + + useIntersectionObserver({ onIntersect: () => onLoadMore(), ref: intersectionRef }); + + return ( +
+ {communityCollection.map((community: Amity.Community) => ( + + ))} + {isLoading + ? Array.from({ length: 5 }).map((_, index) => ( + + )) + : null} +
+
+ ); +}; diff --git a/src/v4/social/components/CommunitySearchResult/index.tsx b/src/v4/social/components/CommunitySearchResult/index.tsx new file mode 100644 index 000000000..fed90deeb --- /dev/null +++ b/src/v4/social/components/CommunitySearchResult/index.tsx @@ -0,0 +1 @@ +export { CommunitySearchResult } from './CommunitySearchResult'; diff --git a/src/v4/social/components/CreatePostMenu/CreatePostMenu.module.css b/src/v4/social/components/CreatePostMenu/CreatePostMenu.module.css new file mode 100644 index 000000000..e2bbd90ef --- /dev/null +++ b/src/v4/social/components/CreatePostMenu/CreatePostMenu.module.css @@ -0,0 +1,10 @@ +.createPostMenu { + background-color: var(--asc-color-base-background); + padding: 0.75rem 1rem; + border-radius: 0.75rem; + position: absolute; + right: 1rem; + top: 3.25rem; + width: 12.5rem; + box-shadow: var(--asc-box-shadow-03); +} diff --git a/src/v4/social/components/CreatePostMenu/CreatePostMenu.tsx b/src/v4/social/components/CreatePostMenu/CreatePostMenu.tsx new file mode 100644 index 000000000..19438a786 --- /dev/null +++ b/src/v4/social/components/CreatePostMenu/CreatePostMenu.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import styles from './CreatePostMenu.module.css'; +import { CreatePostButton } from '~/v4/social/elements/CreatePostButton'; + +import { CreatePollButton } from '~/v4/social/elements/CreatePollButton/CreatePollButton'; +import { CreateLivestreamButton } from '~/v4/social/elements/CreateLivestreamButton'; +import { CreateStoryButton } from '~/v4/social/elements/CreateStoryButton'; + +interface CreatePostMenuProps { + pageId: string; +} + +export function CreatePostMenu({ pageId }: CreatePostMenuProps) { + const componentId = 'create_post_menu'; + return ( +
+ + + + +
+ ); +} diff --git a/src/v4/social/components/CreatePostMenu/index.tsx b/src/v4/social/components/CreatePostMenu/index.tsx new file mode 100644 index 000000000..fcd3d0bd7 --- /dev/null +++ b/src/v4/social/components/CreatePostMenu/index.tsx @@ -0,0 +1 @@ +export {CreatePostMenu} from './CreatePostMenu' \ No newline at end of file diff --git a/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.module.css b/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.module.css new file mode 100644 index 000000000..497bbd9d0 --- /dev/null +++ b/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.module.css @@ -0,0 +1,13 @@ +.emptyNewsfeed { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + background-color: var(--asc-color-base-background); +} + +.emptyNewsfeed__text { + padding-bottom: 1.0625rem; +} diff --git a/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.stories.tsx b/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.stories.tsx new file mode 100644 index 000000000..ad275b47b --- /dev/null +++ b/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { EmptyNewsfeed } from './EmptyNewsFeed'; + +export default { + title: 'v4-social/components/EmptyNewsfeed', +}; + +export const EmptyNewsfeedStory = { + render: () => { + return ; + }, + + name: 'EmptyNewsfeed', +}; diff --git a/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.tsx b/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.tsx new file mode 100644 index 000000000..35407f4cf --- /dev/null +++ b/src/v4/social/components/EmptyNewsFeed/EmptyNewsFeed.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { Illustration } from '~/v4/social/elements/Illustration'; +import { Description } from '~/v4/social/elements/Description'; +import { Title } from '~/v4/social/elements/Title'; +import { ExploreCommunitiesButton } from '~/v4/social/elements/ExploreCommunitiesButton'; +import { CreateCommunityButton } from '~/v4/social/elements/CreateCommunityButton'; + +import styles from './EmptyNewsFeed.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +interface EmptyNewsfeedProps { + pageId?: string; +} + +export function EmptyNewsfeed({ pageId = '*' }: EmptyNewsfeedProps) { + const componentId = 'empty_newsfeed'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + if (isExcluded) return null; + + return ( +
+ +
+ + <Description pageId={pageId} componentId={componentId} /> + </div> + <ExploreCommunitiesButton pageId={pageId} componentId={componentId} /> + <CreateCommunityButton pageId={pageId} componentId={componentId} onClick={() => {}} /> + </div> + ); +} diff --git a/src/v4/social/components/EmptyNewsFeed/index.tsx b/src/v4/social/components/EmptyNewsFeed/index.tsx new file mode 100644 index 000000000..eb7f825e9 --- /dev/null +++ b/src/v4/social/components/EmptyNewsFeed/index.tsx @@ -0,0 +1 @@ +export { EmptyNewsfeed } from './EmptyNewsFeed'; diff --git a/src/v4/social/components/GlobalFeed/GlobalFeed.module.css b/src/v4/social/components/GlobalFeed/GlobalFeed.module.css new file mode 100644 index 000000000..46031cf6a --- /dev/null +++ b/src/v4/social/components/GlobalFeed/GlobalFeed.module.css @@ -0,0 +1,86 @@ +.global_feed { + display: flex; + flex-direction: column; +} + +.global_feed__postContainer { + padding: 0.25rem 1rem 0.75rem 0.75rem; +} + +.global_feed__postSkeletonContainer { + padding-top: 0.75rem; + padding-left: 1rem; +} + +.global_feed__pullToRefresh { + height: var(--asc-pull-to-refresh-height); + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; +} + +.global_feed__post__reactionBar__leftPane__icon { + width: 1.25rem; + height: 1.25rem; +} + +.global_feed__post__reactionBar__leftPane__iconImg { + width: 1.25rem; + height: 1.25rem; +} + +.global_feed__pullToRefresh__spinner { + width: 1.25rem; + height: 1.25rem; + animation-name: spin; + animation-duration: 1000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +.global_feed__divider { + background-color: var(--asc-color-base-shade4); + height: 0.5rem; + width: 100%; +} + +.global_feed__post__divider { + width: 100%; + background-color: var(--asc-color-base-shade4); + height: 0.0625rem; +} + +.global_feed__post__reactionBar { + display: flex; + justify-content: space-between; + align-items: center; + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.global_feed__post__reactionBar__leftPane { + display: flex; + align-items: center; + justify-content: center; +} + +.global_feed__post__reactionBar__rightPane { + display: flex; + align-items: center; + justify-content: center; +} + +.global_feed__intersection { + height: 1px; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} diff --git a/src/v4/social/components/GlobalFeed/GlobalFeed.stories.tsx b/src/v4/social/components/GlobalFeed/GlobalFeed.stories.tsx new file mode 100644 index 000000000..85d913fca --- /dev/null +++ b/src/v4/social/components/GlobalFeed/GlobalFeed.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { GlobalFeed } from './GlobalFeed'; + +export default { + title: 'v4-social/components/GlobalFeed', +}; + +export const GlobalFeedStory = { + render: () => { + return <GlobalFeed />; + }, + + name: 'GlobalFeed', +}; diff --git a/src/v4/social/components/GlobalFeed/GlobalFeed.tsx b/src/v4/social/components/GlobalFeed/GlobalFeed.tsx new file mode 100644 index 000000000..9a303bc33 --- /dev/null +++ b/src/v4/social/components/GlobalFeed/GlobalFeed.tsx @@ -0,0 +1,80 @@ +import React, { useRef } from 'react'; +import { PostContent, PostContentSkeleton } from '../PostContent'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import { EmptyNewsfeed } from '~/v4/social/components/EmptyNewsFeed/EmptyNewsFeed'; +import useGlobalFeed from '~/v4/core/hooks/collections/useGlobalFeed'; +import useIntersectionObserver from '~/v4/core/hooks/useIntersectionObserver'; +import { usePageBehavior } from '~/v4/core/providers/PageBehaviorProvider'; + +import styles from './GlobalFeed.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +interface GlobalFeedProps { + pageId?: string; + componentId?: string; + posts: Amity.Post[]; + isLoading: boolean; + onFeedReachBottom: () => void; +} + +export const GlobalFeed = ({ + pageId = '*', + componentId = '*', + posts, + isLoading, + onFeedReachBottom, +}: GlobalFeedProps) => { + const { getConfig } = useCustomization(); + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + const intersectionRef = useRef<HTMLDivElement>(null); + + const { AmityGlobalFeedComponentBehavior } = usePageBehavior(); + + useIntersectionObserver({ + ref: intersectionRef, + onIntersect: () => { + onFeedReachBottom(); + }, + }); + + if (posts.length === 0 && !isLoading) { + return <EmptyNewsfeed pageId={pageId} />; + } + + return ( + <div className={styles.global_feed} style={themeStyles}> + {posts.map((post, index) => ( + <div key={post.postId}> + {index !== 0 ? <div className={styles.global_feed__divider} /> : null} + <div className={styles.global_feed__postContainer}> + <PostContent + pageId={pageId} + post={post} + type="feed" + onClick={() => { + AmityGlobalFeedComponentBehavior?.goToPostDetailPage?.({ postId: post.postId }); + }} + /> + </div> + </div> + ))} + {isLoading + ? Array.from({ length: 2 }).map((_, index) => ( + <div key={index}> + <div className={styles.global_feed__divider} /> + <div className={styles.global_feed__postSkeletonContainer}> + <PostContentSkeleton /> + </div> + </div> + )) + : null} + <div ref={intersectionRef} className={styles.global_feed__intersection} /> + </div> + ); +}; diff --git a/src/v4/social/components/GlobalFeed/index.tsx b/src/v4/social/components/GlobalFeed/index.tsx new file mode 100644 index 000000000..5814d25bf --- /dev/null +++ b/src/v4/social/components/GlobalFeed/index.tsx @@ -0,0 +1 @@ +export { GlobalFeed } from './GlobalFeed'; diff --git a/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.module.css b/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.module.css index de86cacdf..ad2c8065f 100644 --- a/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.module.css +++ b/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.module.css @@ -8,11 +8,8 @@ gap: var(--asc-spacing-l1); } -.bottomSheet { -} - .bottomSheet .react-modal-sheet-backdrop { - background-color: rgba(0, 0, 0, 0.5); + background-color: rgb(0 0 0 / 50%); } .bottomSheet .react-modal-sheet-container { @@ -25,6 +22,7 @@ .bottomSheet .react-modal-sheet-content { background-color: var(--asc-color-base-background); + padding: 16px; } .bottomSheet .react-modal-sheet-header { @@ -42,10 +40,6 @@ margin-bottom: 8px; } -.bottomSheet .react-modal-sheet-content { - padding: 16px; -} - .inputContainer { display: flex; flex-direction: column; @@ -151,3 +145,10 @@ background-color: var(--asc-color-base-shade4); margin: 1rem 0; } + +.removeLinkContainer { + margin-top: var(--asc-spacing-l1); + display: flex; + flex-direction: column; + border-bottom: 1px solid var(--asc-color-base-shade4); +} diff --git a/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.tsx b/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.tsx index e806c0d35..2e16cc813 100644 --- a/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.tsx +++ b/src/v4/social/components/HyperLinkConfig/HyperLinkConfig.tsx @@ -1,17 +1,20 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import clsx from 'clsx'; -import useSDK from '~/core/hooks/useSDK'; import { BottomSheet, Typography } from '~/v4/core/components'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; -import { Trash2Icon } from '~/icons'; + import styles from './HyperLinkConfig.module.css'; import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; import { Button } from '~/v4/core/components/Button'; +import useSDK from '~/v4/core/hooks/useSDK'; +import Trash from '~/v4/social/icons/trash'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; +import { CancelButton } from '~/v4/social/elements/CancelButton'; +import { DoneButton } from '~/v4/social/elements/DoneButton'; interface HyperLinkConfigProps { pageId: string; @@ -32,19 +35,19 @@ export const HyperLinkConfig = ({ onSubmit, onRemove, }: HyperLinkConfigProps) => { - const { confirm } = useConfirmContext(); - const componentId = 'hyper_link_config_component'; - const { getConfig, isExcluded } = useCustomization(); - - const componentConfig = getConfig(`${pageId}/${componentId}/*`); - const componentTheme = componentConfig?.theme?.light || {}; + const { confirm } = useConfirmContext(); + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); - const cancelButtonConfig = getConfig(`*/hyper_link_config_component/cancel_button`); - const doneButtonConfig = getConfig(`*/hyper_link_config_component/done_button`); + if (isExcluded) return null; const { formatMessage } = useIntl(); const { client } = useSDK(); + const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); const schema = z.object({ url: z @@ -107,6 +110,12 @@ export const HyperLinkConfig = ({ resolver: zodResolver(schema), }); + const { url, customText } = watch(); + + useEffect(() => { + setHasUnsavedChanges(url !== '' || customText !== ''); + }, [url, customText]); + const onSubmitForm = async (data: HyperLinkFormInputs) => { onSubmit(data); onClose(); @@ -128,44 +137,38 @@ export const HyperLinkConfig = ({ }); }; + const handleClose = () => { + if (hasUnsavedChanges) { + confirm({ + title: formatMessage({ id: 'storyCreation.hyperlink.unsavedChanges.title' }), + content: formatMessage({ id: 'storyCreation.hyperlink.unsavedChanges.content' }), + cancelText: formatMessage({ id: 'storyCreation.hyperlink.unsavedChanges.cancel' }), + okText: formatMessage({ id: 'storyCreation.hyperlink.unsavedChanges.confirm' }), + onOk: () => { + reset(); + onClose(); + }, + }); + } else { + onClose(); + } + }; + return ( <BottomSheet detent="full-height" mountPoint={document.getElementById('asc-uikit-create-story') as HTMLElement} rootId="asc-uikit-create-story" isOpen={isOpen} - onClose={onClose} + onClose={handleClose} className={styles.bottomSheet} > <div className={styles.headerContainer}> - <Button className={clsx(styles.cancelButton)} variant="ghost" onClick={onClose}> - <Typography.Body> - {cancelButtonConfig?.cancel_button_text || - formatMessage({ id: 'storyCreation.hyperlink.bottomSheet.cancel' })} - </Typography.Body> - {cancelButtonConfig?.cancel_icon && - typeof cancelButtonConfig?.cancel_icon === 'string' && ( - <img src={cancelButtonConfig?.cancel_icon} width={16} height={16} /> - )} - </Button> + <CancelButton pageId="*" componentId={componentId} onClick={handleClose} /> <Typography.Title> {formatMessage({ id: 'storyCreation.hyperlink.bottomSheet.title' })} </Typography.Title> - <Button - variant="ghost" - form="asc-story-hyperlink-form" - type="submit" - className={clsx(styles.doneButton)} - disabled={!watch('url') || !!errors.url} - > - <Typography.Body> - {doneButtonConfig?.done_button_text || - formatMessage({ id: 'storyCreation.hyperlink.bottomSheet.submit' })} - </Typography.Body> - {doneButtonConfig?.done_icon && typeof doneButtonConfig?.done_icon === 'string' && ( - <img src={doneButtonConfig.done_icon} width={16} height={16} /> - )} - </Button> + <DoneButton pageId="*" componentId={componentId} onClick={handleSubmit(onSubmitForm)} /> </div> <div className={styles.divider} /> <div className={styles.hyperlinkFormContainer}> @@ -223,20 +226,19 @@ export const HyperLinkConfig = ({ </label> </Typography.Caption> </div> - {isHaveHyperLink && ( - <div className={styles.inputContainer}> - <Button - variant="secondary" - onClick={discardHyperlink} - className={clsx(styles.removeLinkButton)} - > - <Trash2Icon className={styles.removeIcon} /> - {formatMessage({ id: 'storyCreation.hyperlink.form.removeButton' })} - </Button> - <div className={styles.divider} /> - </div> - )} </form> + {isHaveHyperLink && ( + <div className={styles.removeLinkContainer}> + <Button + variant="secondary" + onClick={discardHyperlink} + className={clsx(styles.removeLinkButton)} + > + <Trash className={styles.removeIcon} /> + {formatMessage({ id: 'storyCreation.hyperlink.form.removeButton' })} + </Button> + </div> + )} </div> </BottomSheet> ); diff --git a/src/v4/social/components/MyCommunities/MyCommunities.module.css b/src/v4/social/components/MyCommunities/MyCommunities.module.css new file mode 100644 index 000000000..d055c9016 --- /dev/null +++ b/src/v4/social/components/MyCommunities/MyCommunities.module.css @@ -0,0 +1,6 @@ +.myCommunitiesList { + height: 100%; + width: 100%; + padding: 0 1rem; + background-color: var(--asc-color-base-background); +} diff --git a/src/v4/social/components/MyCommunities/MyCommunities.stories.tsx b/src/v4/social/components/MyCommunities/MyCommunities.stories.tsx new file mode 100644 index 000000000..8f12f18e4 --- /dev/null +++ b/src/v4/social/components/MyCommunities/MyCommunities.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { MyCommunities } from './MyCommunities'; + +export default { + title: 'v4-social/components/MyCommunities', +}; + +export const MyCommunitiesStory = { + render: () => { + return <MyCommunities />; + }, + + name: 'MyCommunities', +}; diff --git a/src/v4/social/components/MyCommunities/MyCommunities.tsx b/src/v4/social/components/MyCommunities/MyCommunities.tsx new file mode 100644 index 000000000..093ef0e0d --- /dev/null +++ b/src/v4/social/components/MyCommunities/MyCommunities.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { CommunitySearchResult } from '~/v4/social/components/CommunitySearchResult/'; +import useCommunitiesCollection from '~/v4/core/hooks/collections/useCommunitiesCollection'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +import styles from './MyCommunities.module.css'; + +interface MyCommunitiesProps { + pageId?: string; +} + +export const MyCommunities = ({ pageId = '*' }: MyCommunitiesProps) => { + const componentId = 'my_communities'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + const { communities, isLoading, error, hasMore, loadMore } = useCommunitiesCollection({ + membership: 'member', + }); + + return ( + <div style={themeStyles} className={styles.myCommunitiesList}> + <CommunitySearchResult + pageId={pageId} + communityCollection={communities} + isLoading={isLoading} + onLoadMore={() => { + if (hasMore && isLoading === false) { + loadMore(); + } + }} + /> + </div> + ); +}; diff --git a/src/v4/social/components/MyCommunities/index.tsx b/src/v4/social/components/MyCommunities/index.tsx new file mode 100644 index 000000000..86a22fbc5 --- /dev/null +++ b/src/v4/social/components/MyCommunities/index.tsx @@ -0,0 +1 @@ +export { MyCommunities } from './MyCommunities'; diff --git a/src/v4/social/components/Newsfeed/Newsfeed.module.css b/src/v4/social/components/Newsfeed/Newsfeed.module.css new file mode 100644 index 000000000..4b0053de0 --- /dev/null +++ b/src/v4/social/components/Newsfeed/Newsfeed.module.css @@ -0,0 +1,88 @@ +.newsfeed { + display: flex; + flex-direction: column; + width: 100%; + background-color: var(--asc-color-base-background); +} + +.newsfeed__postList { + display: flex; + flex-direction: column; +} + +.newsfeed__postContainer { + padding: 0.25rem 1rem 0.75rem 0.75rem; +} + +.newsfeed__pullToRefresh { + height: var(--asc-pull-to-refresh-height); + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; +} + +.newsfeed__post__reactionBar__leftPane__icon { + width: 1.25rem; + height: 1.25rem; +} + +.newsfeed__post__reactionBar__leftPane__iconImg { + width: 1.25rem; + height: 1.25rem; +} + +.newsfeed__pullToRefresh__spinner { + width: 1.25rem; + height: 1.25rem; + animation-name: spin; + animation-duration: 1000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +.newsfeed__divider { + background-color: var(--asc-color-base-shade4); + height: 0.5rem; + width: 100%; +} + +.newsfeed__post__divider { + width: 100%; + background-color: var(--asc-color-base-shade4); + height: 0.0625rem; +} + +.newsfeed__post__reactionBar { + display: flex; + justify-content: space-between; + align-items: center; + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.newsfeed__post__reactionBar__leftPane { + display: flex; + align-items: center; + justify-content: center; +} + +.newsfeed__post__reactionBar__rightPane { + display: flex; + align-items: center; + justify-content: center; +} + +.newsfeed__intersection { + height: 1px; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} diff --git a/src/v4/social/components/Newsfeed/Newsfeed.stories.tsx b/src/v4/social/components/Newsfeed/Newsfeed.stories.tsx new file mode 100644 index 000000000..263be2990 --- /dev/null +++ b/src/v4/social/components/Newsfeed/Newsfeed.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { Newsfeed } from './Newsfeed'; + +export default { + title: 'v4-social/components/Newsfeed', +}; + +export const NewsfeedStory = { + render: () => { + return <Newsfeed />; + }, + + name: 'Newsfeed', +}; diff --git a/src/v4/social/components/Newsfeed/Newsfeed.tsx b/src/v4/social/components/Newsfeed/Newsfeed.tsx new file mode 100644 index 000000000..8f0ff6487 --- /dev/null +++ b/src/v4/social/components/Newsfeed/Newsfeed.tsx @@ -0,0 +1,120 @@ +import React, { useRef, useState } from 'react'; +import { StoryTab } from '~/v4/social/components/StoryTab'; +import useGlobalFeed from '~/v4/core/hooks/collections/useGlobalFeed'; +import { EmptyNewsfeed } from '~/v4/social/components/EmptyNewsFeed'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import { GlobalFeed } from '~/v4/social/components/GlobalFeed'; + +import styles from './Newsfeed.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +const Spinner = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <div className={styles.newsfeed__pullToRefresh__spinner}> + <svg + xmlns="http://www.w3.org/2000/svg" + width="21" + height="20" + viewBox="0 0 21 20" + fill="none" + > + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="M11.1122 5C11.1122 5.39449 10.7924 5.71429 10.3979 5.71429C10.0035 5.71429 9.68366 5.39449 9.68366 5V0.714286C9.68366 0.319797 10.0035 0 10.3979 0C10.7924 0 11.1122 0.319797 11.1122 0.714286V5ZM8.25509 6.28846C8.59673 6.09122 8.71378 5.65437 8.51654 5.31273L6.37368 1.60119C6.17644 1.25955 5.73959 1.1425 5.39795 1.33975C5.05631 1.53699 4.93926 1.97384 5.1365 2.31548L7.27936 6.02702C7.4766 6.36865 7.91346 6.48571 8.25509 6.28846ZM6.42496 6.88141C6.7666 7.07865 6.88366 7.51551 6.68641 7.85714C6.48917 8.19878 6.05232 8.31583 5.71068 8.11859L1.99914 5.97573C1.6575 5.77849 1.54045 5.34164 1.7377 5C1.93494 4.65836 2.37179 4.54131 2.71343 4.73855L6.42496 6.88141ZM6.11224 10C6.11224 9.60551 5.79244 9.28571 5.39795 9.28571H1.11223C0.717746 9.28571 0.397949 9.60551 0.397949 10C0.397949 10.3945 0.717746 10.7143 1.11224 10.7143H5.39795C5.79244 10.7143 6.11224 10.3945 6.11224 10ZM5.71068 11.8814C6.05232 11.6842 6.48917 11.8012 6.68641 12.1429C6.88366 12.4845 6.7666 12.9213 6.42497 13.1186L2.71343 15.2614C2.37179 15.4587 1.93494 15.3416 1.7377 15C1.54045 14.6584 1.6575 14.2215 1.99914 14.0243L5.71068 11.8814ZM8.25509 13.7115C7.91345 13.5143 7.4766 13.6313 7.27936 13.973L5.1365 17.6845C4.93926 18.0262 5.05631 18.463 5.39795 18.6603C5.73959 18.8575 6.17644 18.7404 6.37368 18.3988L8.51654 14.6873C8.71378 14.3456 8.59673 13.9088 8.25509 13.7115ZM10.3979 14.2857C10.0035 14.2857 9.68366 14.6055 9.68366 15V19.2857C9.68366 19.6802 10.0035 20 10.3979 20C10.7924 20 11.1122 19.6802 11.1122 19.2857V15C11.1122 14.6055 10.7924 14.2857 10.3979 14.2857ZM12.5408 6.28846C12.8824 6.48571 13.3193 6.36865 13.5165 6.02702L15.6594 2.31548C15.8566 1.97384 15.7396 1.53699 15.3979 1.33975C15.0563 1.1425 14.6195 1.25956 14.4222 1.60119L12.2794 5.31273C12.0821 5.65437 12.1992 6.09122 12.5408 6.28846ZM15.0852 8.11859C14.7436 8.31583 14.3067 8.19878 14.1095 7.85714C13.9122 7.51551 14.0293 7.07866 14.3709 6.88141L18.0825 4.73855C18.4241 4.54131 18.861 4.65836 19.0582 5C19.2554 5.34164 19.1384 5.77849 18.7968 5.97573L15.0852 8.11859ZM14.6837 10C14.6837 10.3945 15.0035 10.7143 15.3979 10.7143H19.6837C20.0782 10.7143 20.3979 10.3945 20.3979 10C20.3979 9.60551 20.0782 9.28571 19.6837 9.28571H15.3979C15.0035 9.28571 14.6837 9.60551 14.6837 10ZM14.3709 13.1186C14.0293 12.9213 13.9122 12.4845 14.1095 12.1429C14.3067 11.8012 14.7436 11.6842 15.0852 11.8814L18.7968 14.0243C19.1384 14.2215 19.2554 14.6584 19.0582 15C18.861 15.3416 18.4241 15.4587 18.0825 15.2614L14.3709 13.1186ZM12.5408 13.7115C12.1992 13.9088 12.0821 14.3456 12.2794 14.6873L14.4222 18.3988C14.6195 18.7404 15.0563 18.8575 15.3979 18.6603C15.7396 18.463 15.8566 18.0262 15.6594 17.6845L13.5165 13.973C13.3193 13.6313 12.8824 13.5143 12.5408 13.7115Z" + fill="url(#paint0_angular_1709_10374)" + /> + <defs> + <radialGradient + id="paint0_angular_1709_10374" + cx="0" + cy="0" + r="1" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(10.3979 10) scale(10)" + > + <stop offset="0.669733" stop-color="#595F67" /> + <stop offset="0.716307" stop-color="#262626" stop-opacity="0.01" /> + </radialGradient> + </defs> + </svg> + </div> + ); +}; + +interface NewsfeedProps { + pageId?: string; +} + +export const Newsfeed = ({ pageId = '*' }: NewsfeedProps) => { + const componentId = 'newsfeed'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + const touchStartY = useRef(0); + const [touchDiff, setTouchDiff] = useState(0); + + const { posts, hasMore, isLoading, loadMore, refetch } = useGlobalFeed(); + + const onFeedReachBottom = () => { + if (hasMore && !isLoading) loadMore(); + }; + + if (posts.length === 0 && !isLoading) { + return <EmptyNewsfeed pageId={pageId} />; + } + + return ( + <div + className={styles.newsfeed} + style={themeStyles} + onTouchStart={(ev) => { + touchStartY.current = ev.touches[0].clientY; + }} + onTouchMove={(ev) => { + const touchY = ev.touches[0].clientY; + + if (touchStartY.current > touchY) { + return; + } + + setTouchDiff(Math.min(touchY - touchStartY.current, 100)); + if (touchDiff > 0 && window.scrollY === 0) { + ev.preventDefault(); + } + }} + onTouchEnd={() => { + touchStartY.current = 0; + if (touchDiff >= 75) { + refetch(); + } + setTouchDiff(0); + }} + > + <div + style={ + { + '--asc-pull-to-refresh-height': `${touchDiff}px`, + } as React.CSSProperties + } + className={styles.newsfeed__pullToRefresh} + > + <Spinner /> + </div> + <div className={styles.newsfeed__divider} /> + <StoryTab type="globalFeed" pageId={pageId} /> + {posts.length > 0 && <div className={styles.newsfeed__divider} />} + <GlobalFeed + isLoading={isLoading} + posts={posts} + pageId={pageId} + componentId={componentId} + onFeedReachBottom={() => onFeedReachBottom()} + /> + </div> + ); +}; diff --git a/src/v4/social/components/Newsfeed/index.tsx b/src/v4/social/components/Newsfeed/index.tsx new file mode 100644 index 000000000..7abb6097f --- /dev/null +++ b/src/v4/social/components/Newsfeed/index.tsx @@ -0,0 +1 @@ +export { Newsfeed } from './Newsfeed'; diff --git a/src/v4/social/components/Newsfeed/styles.module.css b/src/v4/social/components/Newsfeed/styles.module.css new file mode 100644 index 000000000..54a15521e --- /dev/null +++ b/src/v4/social/components/Newsfeed/styles.module.css @@ -0,0 +1,44 @@ +.newsfeed { + display: flex; + flex-direction: column; + width: 100%; +} + +.newsfeed__postList { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.newsfeed__pullToRefresh { + height: var(--asc-pull-to-refresh-height); + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; +} + +.newsfeed__pullToRefresh__spinner { + width: 1.25rem; + height: 1.25rem; + animation-name: spin; + animation-duration: 1000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +.newsfeed__divider { + background-color: var(--asc-color-base-shade4); + height: 0.5rem; + width: 100%; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} diff --git a/src/v4/social/components/PostContent/Crying.tsx b/src/v4/social/components/PostContent/Crying.tsx new file mode 100644 index 000000000..72597127f --- /dev/null +++ b/src/v4/social/components/PostContent/Crying.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +const Crying = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="33" + viewBox="0 0 32 33" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clip-path="url(#clip0_1709_7904)"> + <path + d="M16 32.5C24.8366 32.5 32 25.3366 32 16.5C32 7.66344 24.8366 0.5 16 0.5C7.16344 0.5 0 7.66344 0 16.5C0 25.3366 7.16344 32.5 16 32.5Z" + fill="#FFD54F" + /> + <path + d="M9.33317 15.1667C10.8059 15.1667 11.9998 13.9728 11.9998 12.5C11.9998 11.0273 10.8059 9.83337 9.33317 9.83337C7.86041 9.83337 6.6665 11.0273 6.6665 12.5C6.6665 13.9728 7.86041 15.1667 9.33317 15.1667Z" + fill="#6D4C41" + /> + <path + d="M22.6667 15.1667C24.1394 15.1667 25.3333 13.9728 25.3333 12.5C25.3333 11.0273 24.1394 9.83337 22.6667 9.83337C21.1939 9.83337 20 11.0273 20 12.5C20 13.9728 21.1939 15.1667 22.6667 15.1667Z" + fill="#6D4C41" + /> + <path + d="M21.0248 27.3372C20.674 27.3372 20.3232 27.2038 20.0564 26.9352C17.8894 24.7682 14.1108 24.7682 11.9456 26.9352C11.4103 27.4705 10.5423 27.4705 10.007 26.9352C9.47163 26.4016 9.47163 25.5319 10.007 24.9966C11.6076 23.396 13.7362 22.5153 16.0001 22.5153C18.264 22.5153 20.3926 23.396 21.9932 24.9984C22.5286 25.5337 22.5286 26.4016 21.9932 26.937C21.7264 27.2038 21.3756 27.3372 21.0248 27.3372Z" + fill="#6D4C41" + /> + <path + d="M24.8228 16.5987C24.4495 16.0587 23.5508 16.0587 23.1775 16.5987C22.6228 17.4014 21.3335 19.3881 21.3335 20.5001C21.3335 21.9707 22.5295 23.1667 24.0002 23.1667C25.4708 23.1667 26.6668 21.9707 26.6668 20.5001C26.6668 19.3881 25.3775 17.4014 24.8228 16.5987Z" + fill="#00BCD4" + /> + </g> + <defs> + <clipPath id="clip0_1709_7904"> + <rect width="32" height="32" fill="white" transform="translate(0 0.5)" /> + </clipPath> + </defs> + </svg> +); + +export default Crying; diff --git a/src/v4/social/components/PostContent/Fire.tsx b/src/v4/social/components/PostContent/Fire.tsx new file mode 100644 index 000000000..a93727cd2 --- /dev/null +++ b/src/v4/social/components/PostContent/Fire.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +const Fire = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="33" + viewBox="0 0 32 33" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <circle cx="16" cy="16.5" r="16" fill="url(#paint0_linear_1709_7888)" /> + <g clip-path="url(#clip0_1709_7888)"> + <path + d="M21.8752 10.2903C21.3417 9.70788 20.5123 8.92173 20.1595 10.6968C20.0395 11.3004 19.7591 11.7656 19.5189 12.1402C19.2599 10.8296 18.4808 9.47308 17.7467 8.55843C17.472 8.21623 16.4973 6.85588 16.3101 4.58008C16.2821 4.24043 15.8787 4.08093 15.6263 4.31003C13.2147 6.49923 11.891 9.51013 11.8419 12.8998C11.8419 12.8998 10.8377 12.0533 10.2921 10.4786C10.1452 10.0546 9.57671 9.97368 9.33006 10.3486C9.28271 10.4206 9.23881 10.4927 9.19921 10.5627C7.33856 13.8527 6.44351 17.848 7.27096 21.565C8.65446 27.7898 17.8062 29.5301 22.6511 25.6177C27.3914 21.7899 25.8846 14.6654 21.8752 10.2903Z" + fill="#ED694A" + /> + <path + d="M20.4125 14.8409C20.0185 14.4107 19.4058 13.83 19.1452 15.1411C19.0566 15.5869 18.8495 15.9306 18.6721 16.2073C18.4809 15.2392 17.9054 14.2372 17.3632 13.5617C17.1603 13.3089 16.4404 12.3042 16.302 10.6231C16.2814 10.3722 15.9834 10.2545 15.797 10.4237C14.0158 12.0406 13.038 14.2646 13.0018 16.7682C13.0018 16.7682 12.26 16.143 11.8571 14.9799C11.7486 14.6667 11.3287 14.607 11.1465 14.8839C11.1116 14.9371 11.0791 14.9904 11.0499 15.0421C9.67554 17.4721 9.01444 20.4231 9.62559 23.1686C10.6475 27.7664 17.4071 29.0518 20.9857 26.162C24.4869 23.3347 23.3739 18.0725 20.4125 14.8409Z" + fill="#F4A32C" + /> + <path + d="M19.077 18.9949C18.8103 18.7037 18.3955 18.3106 18.2191 19.1982C18.1592 19.5 18.0189 19.7326 17.8988 19.9199C17.7693 19.2645 17.3798 18.5863 17.0127 18.129C16.8754 17.9579 16.3881 17.2777 16.2944 16.1398C16.2804 15.9699 16.0787 15.8902 15.9525 16.0048C14.7467 17.0994 14.0849 18.6049 14.0603 20.2996C14.0603 20.2996 13.5582 19.8764 13.2855 19.0891C13.212 18.8771 12.9278 18.8366 12.8045 19.0241C12.7808 19.06 12.7589 19.0961 12.739 19.1311C11.8087 20.7761 11.3612 22.7737 11.7749 24.6323C12.4666 27.7447 17.0425 28.6149 19.4649 26.6586C20.2945 25.9887 20.8088 25.0448 20.9131 24.0006C21.0706 22.4191 20.4619 20.5062 19.077 18.9949Z" + fill="#F4D44E" + /> + <path + d="M17.838 22.85C17.6894 22.6878 17.4583 22.4688 17.36 22.9632C17.3266 23.1314 17.2485 23.261 17.1816 23.3653C17.1094 23.0002 16.8924 22.6223 16.6879 22.3676C16.6114 22.2722 16.3399 21.8933 16.2877 21.2593C16.2799 21.1647 16.1675 21.1203 16.0972 21.1841C15.4255 21.7939 15.0567 22.6327 15.043 23.5769C15.043 23.5769 14.7633 23.3411 14.6113 22.9024C14.5704 22.7843 14.412 22.7617 14.3434 22.8662C14.3302 22.8863 14.318 22.9064 14.307 22.9259C13.7887 23.8424 13.5393 24.9553 13.7698 25.9907C14.2947 28.3523 18.5971 28.2807 18.861 25.6388C18.9486 24.7577 18.6095 23.6919 17.838 22.85Z" + fill="#EAE9E8" + /> + <path + d="M14.7688 26.4597C14.5383 25.5334 14.7876 24.5379 15.3059 23.7181C15.3169 23.7006 15.3292 23.6827 15.3423 23.6647C15.411 23.5713 15.5694 23.5914 15.6103 23.6971C15.7622 24.0895 16.042 24.3004 16.042 24.3004C16.0532 23.6064 16.3046 22.9764 16.7664 22.4711C16.6631 22.3281 16.3472 21.9833 16.2877 21.2597C16.2799 21.165 16.1675 21.1207 16.0972 21.1844C15.4255 21.7943 15.0567 22.633 15.043 23.5772C15.043 23.5772 14.7633 23.3414 14.6113 22.9028C14.5704 22.7847 14.412 22.7621 14.3434 22.8666C14.3302 22.8867 14.318 22.9068 14.307 22.9263C13.7887 23.8427 13.5393 24.9557 13.7698 25.9911C13.9831 26.9509 14.8594 27.5277 15.8282 27.6669C15.3056 27.4102 14.904 27.0038 14.7688 26.4597Z" + fill="#F7E7A1" + /> + </g> + <defs> + <linearGradient + id="paint0_linear_1709_7888" + x1="7.2" + y1="7.7" + x2="24.8" + y2="29.3" + gradientUnits="userSpaceOnUse" + > + <stop stop-color="#FFF09F" /> + <stop offset="1" stop-color="#FCCF5A" /> + </linearGradient> + <clipPath id="clip0_1709_7888"> + <rect width="25.6" height="25.6" fill="white" transform="translate(3.2002 2.09998)" /> + </clipPath> + </defs> + </svg> +); + +export default Fire; diff --git a/src/v4/social/components/PostContent/Happy.tsx b/src/v4/social/components/PostContent/Happy.tsx new file mode 100644 index 000000000..9ff7a58cf --- /dev/null +++ b/src/v4/social/components/PostContent/Happy.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +const Happy = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g id="Reactions" clip-path="url(#clip0_1709_1751)"> + <path + id="Vector" + d="M16 32C24.8366 32 32 24.8366 32 16C32 7.16344 24.8366 0 16 0C7.16344 0 0 7.16344 0 16C0 24.8366 7.16344 32 16 32Z" + fill="#FFD54F" + /> + <path + id="Vector_2" + d="M27.2933 19.9601C26.9867 20.9334 26.5867 21.8267 26.0667 22.6667H5.93332C5.41332 21.8267 5.01332 20.9334 4.70665 19.9601C4.61332 19.6534 4.66665 19.3334 4.86665 19.0801C5.05332 18.8134 5.34665 18.6667 5.66665 18.6667H26.3333C26.6533 18.6667 26.9467 18.8134 27.1333 19.0801C27.3333 19.3334 27.3867 19.6534 27.2933 19.9601Z" + fill="white" + /> + <path + id="Vector_3" + d="M26.0664 22.6667C23.9598 26.1201 20.1864 28.2934 15.9998 28.2934C11.8131 28.2934 8.03977 26.1201 5.93311 22.6667H26.0664Z" + fill="#E53935" + /> + <path + id="Vector_4" + d="M12.3332 13.6668C11.7812 13.6668 11.3332 13.2188 11.3332 12.6668C11.3332 11.9322 10.7358 11.3335 9.99984 11.3335C9.26384 11.3335 8.6665 11.9322 8.6665 12.6668C8.6665 13.2188 8.2185 13.6668 7.6665 13.6668C7.1145 13.6668 6.6665 13.2188 6.6665 12.6668C6.6665 10.8295 8.16117 9.3335 9.99984 9.3335C11.8385 9.3335 13.3332 10.8295 13.3332 12.6668C13.3332 13.2188 12.8852 13.6668 12.3332 13.6668Z" + fill="#6D4C41" + /> + <path + id="Vector_5" + d="M24.3332 13.6668C23.7812 13.6668 23.3332 13.2188 23.3332 12.6668C23.3332 11.9322 22.7358 11.3335 21.9998 11.3335C21.2638 11.3335 20.6665 11.9322 20.6665 12.6668C20.6665 13.2188 20.2185 13.6668 19.6665 13.6668C19.1145 13.6668 18.6665 13.2188 18.6665 12.6668C18.6665 10.8295 20.1612 9.3335 21.9998 9.3335C23.8385 9.3335 25.3332 10.8295 25.3332 12.6668C25.3332 13.2188 24.8852 13.6668 24.3332 13.6668Z" + fill="#6D4C41" + /> + </g> + <defs> + <clipPath id="clip0_1709_1751"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +export default Happy; diff --git a/src/v4/social/components/PostContent/ImageContent/ImageContent.module.css b/src/v4/social/components/PostContent/ImageContent/ImageContent.module.css new file mode 100644 index 000000000..89e1890a5 --- /dev/null +++ b/src/v4/social/components/PostContent/ImageContent/ImageContent.module.css @@ -0,0 +1,76 @@ +.imageContent { + display: grid; + border-radius: 0.5rem; + gap: 0.25rem; + width: 100%; + overflow: hidden; +} + +.imageContent[data-images-amount='1'] { + aspect-ratio: 16/ 9; + grid-template: 'image1' / minmax(0, 1fr); +} + +.imageContent[data-images-amount='2'] { + aspect-ratio: 16/ 9; + grid-template: + 'image1 image2' 50% + 'image1 image2' 50% + / 50% 50%; +} + +.imageContent[data-images-amount='3'] { + aspect-ratio: 1; + grid-template: + 'image1 image1 image1 image1' 66% + 'image2 image2 image3 image3' 33% + / 25% 25% 25% 25%; +} + +.imageContent[data-images-amount='4'] { + aspect-ratio: 1; + grid-template-areas: + 'image1 image1 image1 image1 image1 image1' 66% + 'image2 image2 image3 image3 image4 image4' 33% + / minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr); +} + +.imageContent__img { + object-fit: cover; + object-position: center; + height: 100%; + width: 100%; +} + +.imageContent__imgContainer { + cursor: pointer; +} + +.imageContent__imgContainer:nth-child(1) { + grid-area: image1; +} + +.imageContent__imgContainer:nth-child(2) { + grid-area: image2; +} + +.imageContent__imgContainer:nth-child(3) { + grid-area: image3; +} + +.imageContent__imgContainer:nth-child(4) { + grid-area: image4; + position: relative; +} + +.imageContent__imgCover { + position: absolute; + inset: 0; + border-radius: 0 0 0.5rem; + background-color: rgb(0 0 0 / 50%); + color: var(--asc-color-white); + text-align: center; + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/v4/social/components/PostContent/ImageContent/ImageContent.tsx b/src/v4/social/components/PostContent/ImageContent/ImageContent.tsx new file mode 100644 index 000000000..90c63cf44 --- /dev/null +++ b/src/v4/social/components/PostContent/ImageContent/ImageContent.tsx @@ -0,0 +1,68 @@ +import React, { useMemo } from 'react'; + +import useImage from '~/v4/core/hooks/useImage'; +import usePostByIds from '~/v4/core/hooks/usePostByIds'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit/index'; +import styles from './ImageContent.module.css'; + +interface ImageContentProps { + pageId?: string; + componentId?: string; + elementId?: string; + post: Amity.Post<'image'>; + onImageClick: (imageIndex: number) => void; +} + +const Image = ({ fileId }: { fileId: string }) => { + const imageUrl = useImage({ + fileId, + }); + + return <img loading="lazy" className={styles.imageContent__img} src={imageUrl} alt={fileId} />; +}; + +export const ImageContent = ({ + pageId = '*', + componentId = '*', + elementId = '*', + post, + onImageClick = () => {}, +}: ImageContentProps) => { + const { themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const first4Images = useMemo(() => post.children.slice(0, 4), [post.children]); + + const imageLeftCount = Math.max(0, post.children.length - 4); + + const posts = usePostByIds(first4Images); + + const imagePosts = posts.filter((post) => post.dataType === 'image'); + + if (imagePosts.length === 0) { + return null; + } + + return ( + <div + className={styles.imageContent} + style={themeStyles} + data-images-amount={Math.min(post.children.length, 4)} + > + {imagePosts.map((post, index) => ( + <div className={styles.imageContent__imgContainer} onClick={() => onImageClick(index)}> + <Image fileId={post.data.fileId} /> + {imageLeftCount > 0 && index === posts.length - 1 && ( + <Typography.Heading className={styles.imageContent__imgCover}> + + {imageLeftCount} + </Typography.Heading> + )} + </div> + ))} + </div> + ); +}; diff --git a/src/v4/social/components/PostContent/ImageContent/index.tsx b/src/v4/social/components/PostContent/ImageContent/index.tsx new file mode 100644 index 000000000..7545385bd --- /dev/null +++ b/src/v4/social/components/PostContent/ImageContent/index.tsx @@ -0,0 +1 @@ +export { ImageContent } from './ImageContent'; diff --git a/src/v4/social/components/PostContent/Like.tsx b/src/v4/social/components/PostContent/Like.tsx new file mode 100644 index 000000000..7bbb9fa9f --- /dev/null +++ b/src/v4/social/components/PostContent/Like.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +const Like = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <circle cx="16" cy="16" r="16" fill="url(#paint0_linear_1709_1733)" /> + <path + d="M10.7752 12.1C11.2221 12.1 11.6002 12.4782 11.6002 12.925V21.175C11.6002 21.6563 11.2221 22 10.7752 22H8.0252C7.54395 22 7.2002 21.6563 7.2002 21.175V12.925C7.2002 12.4782 7.54395 12.1 8.0252 12.1H10.7752ZM9.4002 20.625C9.84707 20.625 10.2252 20.2813 10.2252 19.8C10.2252 19.3532 9.84707 18.975 9.4002 18.975C8.91895 18.975 8.5752 19.3532 8.5752 19.8C8.5752 20.2813 8.91895 20.625 9.4002 20.625ZM20.4002 7.2188C20.4002 8.66255 19.5064 9.48755 19.2314 10.45H22.7377C23.8721 10.45 24.7658 11.4125 24.7658 12.4782C24.8002 13.0969 24.5252 13.75 24.1127 14.1625C24.4564 14.9532 24.3877 16.0875 23.8033 16.8782C24.0783 17.7719 23.8033 18.8719 23.2189 19.4563C23.3908 20.075 23.3221 20.5907 23.0127 21.0032C22.3252 22 20.5721 22 19.0939 22H18.9908C17.3408 22 16.0002 21.4157 14.9002 20.9344C14.3502 20.6938 13.6283 20.3844 13.0783 20.3844C12.8721 20.35 12.7002 20.1782 12.7002 19.9719V12.6157C12.7002 12.5125 12.7346 12.4094 12.8033 12.3063C14.1783 10.9657 14.7627 9.5563 15.8627 8.42192C16.3783 7.9063 16.5502 7.15005 16.7564 6.3938C16.8939 5.77505 17.2033 4.40005 17.9252 4.40005C18.7502 4.40005 20.4002 4.67505 20.4002 7.2188Z" + fill="white" + /> + <defs> + <linearGradient + id="paint0_linear_1709_1733" + x1="12" + y1="3.2" + x2="26.4" + y2="39.2" + gradientUnits="userSpaceOnUse" + > + <stop stop-color="#63A1FF" /> + <stop offset="1" stop-color="#0041BE" /> + </linearGradient> + </defs> + </svg> +); + +export default Like; diff --git a/src/v4/social/components/PostContent/LinkPreview/LinkPreview.module.css b/src/v4/social/components/PostContent/LinkPreview/LinkPreview.module.css new file mode 100644 index 000000000..c3b8e0090 --- /dev/null +++ b/src/v4/social/components/PostContent/LinkPreview/LinkPreview.module.css @@ -0,0 +1,41 @@ +.linkPreview { + cursor: pointer; + border: 1px solid var(--asc-color-base-shade4); + border-radius: 0.5rem; + overflow: hidden; +} + +.linkPreview__top { + background-color: var(--asc-color-base-shade4); + overflow: hidden; + width: 100%; + aspect-ratio: 21 / 9; +} + +.linkPreview__bottom { + padding: 0.75rem; + display: flex; + flex-direction: column; + gap: 0.12rem; +} + +.linkPreview__object { + width: 100%; + height: 100%; + object-fit: cover; +} + +.linkPreview__unableToPreview { + display: flex; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; + background-color: var(--asc-color-base-shade4); +} + +.linkPreview__unableToPreview__icon { + width: 3rem; + height: 2.25rem; + fill: var(--asc-color-base-shade3); +} diff --git a/src/v4/social/components/PostContent/LinkPreview/LinkPreview.stories.tsx b/src/v4/social/components/PostContent/LinkPreview/LinkPreview.stories.tsx new file mode 100644 index 000000000..bbc331333 --- /dev/null +++ b/src/v4/social/components/PostContent/LinkPreview/LinkPreview.stories.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +import { LinkPreview } from './LinkPreview'; + +export default { + title: 'v4-social/internal-components/LinkPreview', +}; + +export const LinkPreviewStory = { + render: () => { + return ( + <LinkPreview url="https://medium.com/better-humans/how-to-wake%20-up-at-5-a-m-every-day-ceb02e29c802" /> + ); + }, + + name: 'LinkPreview', +}; diff --git a/src/v4/social/components/PostContent/LinkPreview/LinkPreview.tsx b/src/v4/social/components/PostContent/LinkPreview/LinkPreview.tsx new file mode 100644 index 000000000..bf921f5d8 --- /dev/null +++ b/src/v4/social/components/PostContent/LinkPreview/LinkPreview.tsx @@ -0,0 +1,102 @@ +import React, { useState } from 'react'; +import { Typography } from '~/v4/core/components/Typography'; +import { VideoPreview } from '~/v4/social/internal-components/VideoPreview'; +import { useQuery } from '@tanstack/react-query'; + +import useSDK from '~/v4/core/hooks/useSDK'; +import { LinkPreviewSkeleton } from './LinkPreviewSkeleton'; +import styles from './LinkPreview.module.css'; + +const UnableToPreviewSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="36" + height="27" + viewBox="0 0 36 27" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M32.625 0C34.4531 0 36 1.54688 36 3.375V23.625C36 25.5234 34.4531 27 32.625 27H3.375C1.47656 27 0 25.5234 0 23.625V3.375C0 1.54688 1.47656 0 3.375 0H32.625ZM32.2031 23.625C32.4141 23.625 32.625 23.4844 32.625 23.2031V3.79688C32.625 3.58594 32.4141 3.375 32.2031 3.375H3.79688C3.51562 3.375 3.375 3.58594 3.375 3.79688V23.2031C3.375 23.4844 3.51562 23.625 3.79688 23.625H32.2031ZM9 6.1875C10.5469 6.1875 11.8125 7.45312 11.8125 9C11.8125 10.6172 10.5469 11.8125 9 11.8125C7.38281 11.8125 6.1875 10.6172 6.1875 9C6.1875 7.45312 7.38281 6.1875 9 6.1875ZM6.75 20.25V16.875L9.49219 14.1328C9.84375 13.7812 10.3359 13.7812 10.6875 14.1328L13.5 16.875L21.8672 8.50781C22.2188 8.15625 22.7109 8.15625 23.0625 8.50781L29.25 14.625V20.25H6.75Z" /> + </svg> +); + +const UnableToPreview = () => ( + <div className={styles.linkPreview__unableToPreview}> + <UnableToPreviewSvg className={styles.linkPreview__unableToPreview__icon} /> + </div> +); + +const usePreviewLink = ({ url }: { url: string }) => { + const { client } = useSDK(); + + return useQuery({ + enabled: !!client, + queryKey: ['asc-uikit', 'previewLink'], + queryFn: async () => { + const data = await client?.http.get<{ + title: string; + description: string; + image: string; + video: string; + }>('/api/v1/link-preview', { + params: { + url, + }, + }); + + return data?.data; + }, + retry: false, + }); +}; + +interface LinkPreviewProps { + url: string; +} + +export function LinkPreview({ url }: LinkPreviewProps) { + const urlObject = new URL(url); + + const previewData = usePreviewLink({ url }); + + if (previewData.isLoading) { + return <LinkPreviewSkeleton />; + } + + const handleClick = () => { + window.open(url, '_blank'); + }; + + if (previewData.isError) { + return ( + <div onClick={handleClick} className={styles.linkPreview}> + <div className={styles.linkPreview__top}> + <UnableToPreview /> + </div> + <div className={styles.linkPreview__bottom}> + <Typography.Caption>{urlObject.hostname}</Typography.Caption> + </div> + </div> + ); + } + + return ( + <div onClick={handleClick} className={styles.linkPreview}> + <div className={styles.linkPreview__top}> + {previewData.data?.image ? ( + <object data={previewData.data.image} className={styles.linkPreview__object}> + <UnableToPreview /> + </object> + ) : previewData.data?.video ? ( + <VideoPreview src={previewData.data.video} /> + ) : ( + <UnableToPreview /> + )} + </div> + <div className={styles.linkPreview__bottom}> + <Typography.Caption>{urlObject.hostname}</Typography.Caption> + <Typography.BodyBold>{previewData.data?.title || ''}</Typography.BodyBold> + </div> + </div> + ); +} diff --git a/src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.module.css b/src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.module.css new file mode 100644 index 000000000..7f2d06fbf --- /dev/null +++ b/src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.module.css @@ -0,0 +1,49 @@ +.linkPreviewSkeleton { + border: 1px solid var(--asc-color-base-shade4); + border-radius: 0.5rem; + overflow: hidden; +} + +.linkPreviewSkeleton__bottom { + padding: 0.75rem; + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.linkPreviewSkeleton__bar1 { + height: 0.7109rem; + width: 14.9458rem; + border-radius: 1.0156rem; + background-color: var(--asc-color-base-shade4); +} + +.linkPreviewSkeleton__bar2 { + width: 11.0126rem; + height: 0.8203rem; + border-radius: 1.1719rem; + background-color: var(--asc-color-base-shade4); +} + +.linkPreviewSkeleton__image { + height: 11rem; + background-color: var(--asc-color-base-shade4); +} + +.linkPreviewSkeleton__animation { + animation: skeleton-pulse 1.5s ease-in-out infinite; +} + +@keyframes skeleton-pulse { + 0% { + opacity: 0.6; + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 0.6; + } +} diff --git a/src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.tsx b/src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.tsx new file mode 100644 index 000000000..d9c02250f --- /dev/null +++ b/src/v4/social/components/PostContent/LinkPreview/LinkPreviewSkeleton.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './LinkPreviewSkeleton.module.css'; + +export function LinkPreviewSkeleton() { + return ( + <div className={styles.linkPreviewSkeleton}> + <div + className={clsx(styles.linkPreviewSkeleton__image, styles.linkPreviewSkeleton__animation)} + /> + <div className={styles.linkPreviewSkeleton__bottom}> + <div + className={clsx(styles.linkPreviewSkeleton__bar1, styles.linkPreviewSkeleton__animation)} + /> + <div + className={clsx(styles.linkPreviewSkeleton__bar2, styles.linkPreviewSkeleton__animation)} + /> + </div> + </div> + ); +} diff --git a/src/v4/social/components/PostContent/LinkPreview/index.tsx b/src/v4/social/components/PostContent/LinkPreview/index.tsx new file mode 100644 index 000000000..413060de0 --- /dev/null +++ b/src/v4/social/components/PostContent/LinkPreview/index.tsx @@ -0,0 +1 @@ +export { LinkPreview } from './LinkPreview'; diff --git a/src/v4/social/components/PostContent/Love.tsx b/src/v4/social/components/PostContent/Love.tsx new file mode 100644 index 000000000..83b621c52 --- /dev/null +++ b/src/v4/social/components/PostContent/Love.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +const Love = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g id="Reactions"> + <circle id="Ellipse 2" cx="16" cy="16" r="16" fill="url(#paint0_linear_1709_1738)" /> + <path + id="circle" + d="M22.4466 10.5836C20.7296 9.07415 18.2009 9.36319 16.6088 11.0332L16.0156 11.6755L15.3912 11.0332C13.8303 9.36319 11.2704 9.07415 9.55338 10.5836C7.58661 12.3179 7.49295 15.401 9.24119 17.2637L15.2976 23.687C15.6722 24.1045 16.3278 24.1045 16.7024 23.687L22.7588 17.2637C24.507 15.401 24.4134 12.3179 22.4466 10.5836Z" + fill="white" + /> + </g> + <defs> + <linearGradient + id="paint0_linear_1709_1738" + x1="7.2" + y1="7.2" + x2="28" + y2="39.2" + gradientUnits="userSpaceOnUse" + > + <stop stop-color="#EE5C91" /> + <stop offset="0.833333" stop-color="#E02222" /> + </linearGradient> + </defs> + </svg> +); + +export default Love; diff --git a/src/v4/social/components/PostContent/PostContent.module.css b/src/v4/social/components/PostContent/PostContent.module.css new file mode 100644 index 000000000..fb4c285db --- /dev/null +++ b/src/v4/social/components/PostContent/PostContent.module.css @@ -0,0 +1,176 @@ +.postContent { + background-color: var(--asc-color-base-background); +} + +.postContent__bar { + display: grid; + grid-template-columns: min-content 1fr min-content; + align-items: center; + gap: 0.5rem; +} + +.postContent__bar__userAvatar { + display: flex; + justify-content: center; + align-items: center; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.postContent__bar__information__subtitle { + display: flex; + align-items: center; + gap: 0.25rem; +} + +.postContent__bar__information__subtitle__moderator { + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; +} + +.postContent__bar__information__subtitle__separator { + color: var(--asc-color-base-shade2); +} + +.postContent__bar__information__subtitle__timestamp { + cursor: pointer; +} + +.postContent__bar__information__subtitle__timestamp:hover { + text-decoration: underline; + text-underline-offset: 0.125rem; + text-decoration-thickness: 0.0625rem; + text-decoration-color: var(--asc-color-base-shade2); +} + +.postContent__bar__actionButton { + justify-self: flex-end; + cursor: pointer; +} + +.postContent__content_and_reactions { + padding-left: 0.25rem; +} + +.postContent__content { + display: flex; + flex-direction: column; + gap: 1rem; + padding: 0.5rem 0; +} + +.postContent__divider { + width: 100%; + background-color: var(--asc-color-base-shade4); + height: 0.0625rem; +} + +.postContent__reactionBar { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 0.7rem; +} + +.postContent__reactionBar__leftPane { + display: flex; + align-items: center; + justify-content: start; + gap: 0.75rem; +} + +.postContent__reactionBar__rightPane { + display: flex; + align-items: center; + justify-content: center; +} + +.postContent__reactionBar__leftPane__icon { + width: 1.25rem; + height: 1.25rem; +} + +.postContent__reactionBar__leftPane__iconImg { + width: 1.25rem; + height: 1.25rem; +} + +.postTitle { + display: flex; + align-items: center; + gap: 0.25rem; +} + +.postTitle__text { + color: var(--asc-color-base-default); +} + +.postTitle__icon { + fill: var(--asc-color-base-shade1); + height: 0.75rem; + width: 1rem; +} + +.postContent__comment { + display: grid; +} + +.postContent__reactions_and_comments { + display: flex; + justify-content: space-between; + padding: 0.5rem 0; +} + +.postContent__reactionsBar { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + gap: 0.25rem; +} + +.postContent__commentsCount { + color: var(--asc-color-base-shade2); +} + +.postContent__reactionsBar__reactions { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row-reverse; +} + +.postContent__reactionsBar__reactions__icon { + width: 1.25rem; + height: 1.25rem; +} + +.postContent__reactionsBar__reactions__icon:nth-last-child(1) { + transform: translateX(0); +} + +.postContent__reactionsBar__reactions__icon:nth-last-child(2) { + transform: translateX(-0.25rem); +} + +.postContent__reactionsBar__reactions__icon:nth-last-child(3) { + transform: translateX(-0.5rem); +} + +.postContent__reactionsBar__reactions__icon:nth-last-child(4) { + transform: translateX(-0.75rem); +} + +.postContent__reactionsBar__reactions__icon:nth-last-child(5) { + transform: translateX(-1rem); +} + +.postContent__reactionsBar__reactions__icon:nth-last-child(6) { + transform: translateX(-1.25rem); +} + +.postContent__reactionsBar__reactions__count { + color: var(--asc-color-base-shade2); +} diff --git a/src/v4/social/components/PostContent/PostContent.stories.tsx b/src/v4/social/components/PostContent/PostContent.stories.tsx new file mode 100644 index 000000000..e1e1dc24c --- /dev/null +++ b/src/v4/social/components/PostContent/PostContent.stories.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import useOnePost from '~/mock/useOnePost'; + +import { PostContent } from './PostContent'; + +export default { + title: 'v4-social/components/PostContent', +}; + +export const PostContentStory = { + render: () => { + const [post] = useOnePost(); + + if (post == null) return null; + + return <PostContent post={post} />; + }, + + name: 'PostContent', +}; diff --git a/src/v4/social/components/PostContent/PostContent.tsx b/src/v4/social/components/PostContent/PostContent.tsx new file mode 100644 index 000000000..38e712054 --- /dev/null +++ b/src/v4/social/components/PostContent/PostContent.tsx @@ -0,0 +1,377 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { Timestamp } from '~/v4/social/elements/Timestamp'; +import { ReactionButton } from '~/v4/social/elements/ReactionButton'; + +import { ModeratorBadge } from '~/v4/social/elements/ModeratorBadge'; +import { MenuButton } from '~/v4/social/elements/MenuButton'; +import { ShareButton } from '~/v4/social/elements/ShareButton'; +import useCommunity from '~/v4/core/hooks/collections/useCommunity'; +import useUser from '~/v4/core/hooks/objects/useUser'; +import { Typography } from '~/v4/core/components'; +import AngleRight from '~/v4/icons/AngleRight'; +import { UserAvatar } from '~/v4/social/internal-components/UserAvatar'; +import { CommentButton } from '~/v4/social/elements/CommentButton'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import { useMutation } from '@tanstack/react-query'; +import { ReactionRepository } from '@amityco/ts-sdk'; + +import styles from './PostContent.module.css'; + +import Crying from './Crying'; +import Happy from './Happy'; +import Fire from './Fire'; +import Love from './Love'; +import Like from './Like'; +import { TextContent } from './TextContent'; +import { ImageContent } from './ImageContent'; +import { VideoContent } from './VideoContent'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; +import { ImageViewer } from '~/v4/social/internal-components/ImageViewer/ImageViewer'; +import { VideoViewer } from '~/v4/social/internal-components/VideoViewer/VideoViewer'; +import usePost from '~/v4/core/hooks/objects/usePost'; +import { ReactionList } from '~/v4/social/components/ReactionList/'; +import { usePostPermissions } from '~/v4/core/hooks/usePostPermissions'; +import { PostMenu } from '~/v4/social/internal-components/PostMenu/PostMenu'; +import { useDrawer } from '~/v4/core/providers/DrawerProvider'; + +interface PostTitleProps { + post: Amity.Post; + pageId?: string; +} + +const PostTitle = ({ pageId, post }: PostTitleProps) => { + const componentId = 'post_content'; + const { getConfig } = useCustomization(); + const uiReference = `${pageId}/${componentId}/*`; + const config = getConfig(uiReference); + const themeStyles = useGenerateStylesShadeColors(config); + + const { community: targetCommunity } = useCommunity({ + communityId: post.targetId, + shouldCall: () => post.targetType === 'community', + }); + + const { user: postedUser } = useUser(post.postedUserId); + + if (targetCommunity) { + return ( + <div style={themeStyles} className={styles.postTitle}> + <Typography.BodyBold className={styles.postTitle__text}> + {postedUser?.displayName} + </Typography.BodyBold> + {targetCommunity && ( + <> + <AngleRight className={styles.postTitle__icon} /> + <Typography.BodyBold className={styles.postTitle__text}> + {targetCommunity.displayName} + </Typography.BodyBold>{' '} + </> + )} + </div> + ); + } + + return ( + <Typography.BodyBold className={styles.postTitle__text}> + {postedUser?.displayName} + </Typography.BodyBold> + ); +}; + +const useMutateAddReaction = ({ + postId, + reactionByMe, +}: { + postId: string; + reactionByMe: string | null; +}) => + useMutation({ + mutationFn: async (reactionKey: string) => { + if (reactionByMe) { + try { + await ReactionRepository.removeReaction('post', postId, reactionByMe); + } catch { + console.log("Can't remove reaction."); + } + } + return ReactionRepository.addReaction('post', postId, reactionKey); + }, + }); + +const useMutateRemoveReaction = ({ + postId, + reactionsByMe, +}: { + postId: string; + reactionsByMe: string[]; +}) => + useMutation({ + mutationFn: async () => { + return Promise.all( + reactionsByMe.map((reaction) => { + try { + return ReactionRepository.removeReaction('post', postId, reaction); + } catch (e) { + console.log("Can't remove reaction."); + } + }), + ); + }, + }); + +const ChildrenPostContent = ({ + post, + onImageClick, + onVideoClick, +}: { + post: Amity.Post[]; + onImageClick: (imageIndex: number) => void; + onVideoClick: (videoIndex: number) => void; +}) => { + return ( + <> + <ImageContent post={post} onImageClick={onImageClick} /> + <VideoContent post={post} onVideoClick={onVideoClick} /> + </> + ); +}; + +interface PostContentProps { + pageId?: string; + post: Amity.Post; + type: 'feed' | 'detail'; + onClick?: () => void; +} + +export const PostContent = ({ + pageId = '*', + post: initialPost, + type, + onClick, +}: PostContentProps) => { + const componentId = 'post_content'; + const { themeStyles } = useAmityComponent({ + pageId, + componentId, + }); + + const { post: postData } = usePost(initialPost.postId); + const { setDrawerData, removeDrawerData } = useDrawer(); + + const post = postData || initialPost; + + const [isImageViewerOpen, setIsImageViewerOpen] = useState(false); + const [isVideoViewerOpen, setIsVideoViewerOpen] = useState(false); + const [clickedImageIndex, setClickedImageIndex] = useState<number | null>(null); + const [clickedVideoIndex, setClickedVideoIndex] = useState<number | null>(null); + + useEffect(() => { + if (post) { + post.analytics?.markAsViewed(); + } + }, [post]); + + const { community: targetCommunity } = useCommunity({ + communityId: post?.targetId, + shouldCall: () => post?.targetType === 'community', + }); + + const { isCommunityModerator } = usePostPermissions({ + post, + community: targetCommunity, + }); + + const reactionByMe = useMemo(() => { + if (post == null || post.myReactions?.length === 0) return null; + return post.myReactions[0]; + }, [post.myReactions]); + + const { mutateAsync: mutateAddReactionAsync } = useMutateAddReaction({ + postId: post.postId, + reactionByMe, + }); + + const { mutateAsync: mutateRemoveReactionAsync } = useMutateRemoveReaction({ + postId: post.postId, + reactionsByMe: post.myReactions, + }); + + const handleReactionClick = (reactionKey: string) => { + if (post.myReactions?.length > 0) { + mutateRemoveReactionAsync(); + } else { + mutateAddReactionAsync(reactionKey); + } + }; + + const openImageViewer = (imageIndex: number) => { + setIsImageViewerOpen(true); + setClickedImageIndex(imageIndex); + }; + + const closeImageViewer = () => { + setIsImageViewerOpen(false); + setClickedImageIndex(null); + }; + + const openVideoViewer = (imageIndex: number) => { + setIsVideoViewerOpen(true); + setClickedVideoIndex(imageIndex); + }; + + const closeVideoViewer = () => { + setIsVideoViewerOpen(false); + setClickedVideoIndex(null); + }; + + const hasLike = post?.reactions.like > 0; + const hasLove = post?.reactions.love > 0; + const hasFire = post?.reactions.fire > 0; + const hasHappy = post?.reactions.happy > 0; + const hasCrying = post?.reactions.crying > 0; + + const hasReaction = hasLike || hasLove || hasFire || hasHappy || hasCrying; + + return ( + <> + <div className={styles.postContent} style={themeStyles}> + <div className={styles.postContent__bar}> + <div className={styles.postContent__bar__userAvatar}> + <UserAvatar userId={post.postedUserId} /> + </div> + <div> + <div> + <PostTitle post={post} /> + </div> + <div className={styles.postContent__bar__information__subtitle}> + {!isCommunityModerator ? ( + <div className={styles.postContent__bar__information__subtitle__moderator}> + <ModeratorBadge pageId={pageId} componentId={componentId} /> + <span className={styles.postContent__bar__information__subtitle__separator}> + • + </span> + </div> + ) : null} + <span + className={styles.postContent__bar__information__subtitle__timestamp} + onClick={() => onClick?.()} + > + <Timestamp timestamp={post.createdAt} /> + </span> + </div> + </div> + <div className={styles.postContent__bar__actionButton}> + {type === 'feed' ? ( + <MenuButton + pageId={pageId} + componentId={componentId} + onClick={() => + setDrawerData({ + content: ( + <PostMenu + post={post} + onCloseMenu={() => removeDrawerData()} + pageId={pageId} + componentId={componentId} + /> + ), + }) + } + /> + ) : null} + </div> + </div> + <div className={styles.postContent__content_and_reactions}> + <div className={styles.postContent__content}> + <TextContent text={post.data.text} mentionees={post?.metadata?.mentioned} /> + {post.children.length > 0 ? ( + <ChildrenPostContent + post={post} + onImageClick={openImageViewer} + onVideoClick={openVideoViewer} + /> + ) : null} + </div> + {type === 'detail' ? ( + <div className={styles.postContent__reactions_and_comments}> + <div + className={styles.postContent__reactionsBar} + onClick={() => + setDrawerData({ + content: ( + <ReactionList + pageId={pageId} + referenceId={post.postId} + referenceType={'post'} + /> + ), + }) + } + > + {hasReaction ? ( + <div className={styles.postContent__reactionsBar__reactions}> + {hasCrying && ( + <Crying className={styles.postContent__reactionsBar__reactions__icon} /> + )} + {hasHappy && ( + <Happy className={styles.postContent__reactionsBar__reactions__icon} /> + )} + {hasFire && ( + <Fire className={styles.postContent__reactionsBar__reactions__icon} /> + )} + {hasLove && ( + <Love className={styles.postContent__reactionsBar__reactions__icon} /> + )} + {hasLike && ( + <Like className={styles.postContent__reactionsBar__reactions__icon} /> + )} + </div> + ) : null} + <Typography.Caption className={styles.postContent__reactionsBar__reactions__count}> + {`${post?.reactionsCount || 0} ${post?.reactionsCount === 1 ? 'like' : 'likes'}`} + </Typography.Caption> + </div> + + <Typography.Caption className={styles.postContent__commentsCount}> + {`${post?.commentsCount || 0} ${ + post?.commentsCount === 1 ? 'comment' : 'comments' + }`} + </Typography.Caption> + </div> + ) : null} + <div className={styles.postContent__divider} /> + <div className={styles.postContent__reactionBar}> + <div className={styles.postContent__reactionBar__leftPane}> + <ReactionButton + pageId={pageId} + componentId={componentId} + reactionsCount={type === 'feed' ? post.reactionsCount : undefined} + myReactions={post.myReactions} + defaultIconClassName={styles.postContent__reactionBar__leftPane__icon} + imgIconClassName={styles.postContent__reactionBar__leftPane__iconImg} + onReactionClick={handleReactionClick} + /> + <CommentButton + pageId={pageId} + componentId={componentId} + commentsCount={type === 'feed' ? post.commentsCount : undefined} + defaultIconClassName={styles.postContent__reactionBar__leftPane__icon} + imgIconClassName={styles.postContent__reactionBar__leftPane__iconImg} + /> + </div> + <div className={styles.postContent__reactionBar__rightPane}> + <ShareButton pageId={pageId} componentId={componentId} /> + </div> + </div> + </div> + </div> + {isImageViewerOpen && typeof clickedImageIndex === 'number' ? ( + <ImageViewer post={post} onClose={closeImageViewer} initialImageIndex={clickedImageIndex} /> + ) : null} + {isVideoViewerOpen && typeof clickedVideoIndex === 'number' ? ( + <VideoViewer post={post} onClose={closeVideoViewer} initialVideoIndex={clickedVideoIndex} /> + ) : null} + </> + ); +}; diff --git a/src/v4/social/components/PostContent/PostContentSkeleton.module.css b/src/v4/social/components/PostContent/PostContentSkeleton.module.css new file mode 100644 index 000000000..bf8d440aa --- /dev/null +++ b/src/v4/social/components/PostContent/PostContentSkeleton.module.css @@ -0,0 +1,86 @@ +.postContentSkeleton { + display: flex; + flex-direction: column; + gap: 1rem; + height: 14rem; + background-color: var(--asc-color-base-background); +} + +.postContentSkeleton__bar { + display: grid; + grid-template-columns: min-content 1fr min-content; + align-items: center; + gap: 0.5rem; +} + +.postContentSkeleton__bar__information { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.postContentSkeleton__content { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.postContentSkeleton__animation { + animation: skeleton-pulse 1.5s ease-in-out infinite; +} + +.postContentSkeleton__bar__userAvatar { + width: 2.5rem; + height: 2.5rem; + border-radius: 50%; + background-color: var(--asc-color-base-shade4); +} + +.postContentSkeleton__bar__information__title { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 7.5rem; + height: 0.5rem; +} + +.postContentSkeleton__bar__information__subtitle { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 5.5rem; + height: 0.5rem; +} + +.postContentSkeleton__content__bar1 { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 15rem; + height: 0.5rem; +} + +.postContentSkeleton__content__bar2 { + border-radius: 0.18.5625rem; + background-color: var(--asc-color-base-shade4); + width: 18.5625rem; + height: 0.5rem; +} + +.postContentSkeleton__content__bar3 { + border-radius: 0; + background-color: var(--asc-color-base-shade4); + width: 11.25rem; + height: 0.5rem; +} + +@keyframes skeleton-pulse { + 0% { + opacity: 0.6; + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 0.6; + } +} diff --git a/src/v4/social/components/PostContent/PostContentSkeleton.stories.tsx b/src/v4/social/components/PostContent/PostContentSkeleton.stories.tsx new file mode 100644 index 000000000..fb912430d --- /dev/null +++ b/src/v4/social/components/PostContent/PostContentSkeleton.stories.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import useOnePost from '~/mock/useOnePost'; + +import { PostContentSkeleton } from './PostContentSkeleton'; + +export default { + title: 'v4-social/components/PostContentSkeleton', +}; + +export const PostContentSkeletonStory = { + render: () => { + const [post] = useOnePost(); + + if (post == null) return null; + + return <PostContentSkeleton />; + }, + + name: 'PostContentSkeleton', +}; diff --git a/src/v4/social/components/PostContent/PostContentSkeleton.tsx b/src/v4/social/components/PostContent/PostContentSkeleton.tsx new file mode 100644 index 000000000..db149bcb4 --- /dev/null +++ b/src/v4/social/components/PostContent/PostContentSkeleton.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './PostContentSkeleton.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +interface PostContentSkeletonProps { + pageId?: string; +} + +export const PostContentSkeleton = ({ pageId = '*' }: PostContentSkeletonProps) => { + const componentId = 'post_content'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + return ( + <div + data-qa-anchor={accessibilityId} + style={themeStyles} + className={clsx(styles.postContentSkeleton, styles.postContentSkeleton__animation)} + > + <div className={clsx(styles.postContentSkeleton__bar, styles.postContentSkeleton__animation)}> + <div + className={clsx( + styles.postContentSkeleton__bar__userAvatar, + styles.postContentSkeleton__animation, + )} + ></div> + <div + className={clsx( + styles.postContentSkeleton__bar__information, + styles.postContentSkeleton__animation, + )} + > + <div + className={clsx( + styles.postContentSkeleton__bar__information__title, + styles.postContentSkeleton__animation, + )} + /> + <div + className={clsx( + styles.postContentSkeleton__bar__information__subtitle, + styles.postContentSkeleton__animation, + )} + /> + </div> + </div> + <div + className={clsx(styles.postContentSkeleton__content, styles.postContentSkeleton__animation)} + > + <div + className={clsx( + styles.postContentSkeleton__content__bar1, + styles.postContentSkeleton__animation, + )} + /> + <div + className={clsx( + styles.postContentSkeleton__content__bar2, + styles.postContentSkeleton__animation, + )} + /> + <div + className={clsx( + styles.postContentSkeleton__content__bar3, + styles.postContentSkeleton__animation, + )} + /> + </div> + </div> + ); +}; diff --git a/src/v4/social/components/PostContent/TextContent/TextContent.module.css b/src/v4/social/components/PostContent/TextContent/TextContent.module.css new file mode 100644 index 000000000..a5e1ad3b7 --- /dev/null +++ b/src/v4/social/components/PostContent/TextContent/TextContent.module.css @@ -0,0 +1,15 @@ +.postContent { + overflow-wrap: break-word; + color: var(--asc-color-base-default); + white-space: pre-wrap; +} + +.mentionHighlightTag { + cursor: pointer; + color: var(--asc-color-primary-default); +} + +.postContent__readmore { + cursor: pointer; + color: var(--asc-color-primary-default); +} diff --git a/src/v4/social/components/PostContent/TextContent/TextContent.tsx b/src/v4/social/components/PostContent/TextContent/TextContent.tsx new file mode 100644 index 000000000..d79ece110 --- /dev/null +++ b/src/v4/social/components/PostContent/TextContent/TextContent.tsx @@ -0,0 +1,76 @@ +import React, { useState, useMemo, ReactNode, useEffect } from 'react'; + +import { Linkify } from '~/v4/social/internal-components/Linkify'; +import { Mentioned, findChunks, processChunks } from '~/v4/helpers/utils'; +import { Typography } from '~/v4/core/components'; +import { LinkPreview } from '../LinkPreview/LinkPreview'; +import styles from './TextContent.module.css'; +import * as linkify from 'linkifyjs'; + +interface MentionHighlightTagProps { + children: ReactNode; + mentionee: Mentioned; +} + +const MentionHighlightTag = ({ children }: MentionHighlightTagProps) => { + return <span className={styles.mentionHighlightTag}>{children}</span>; +}; + +const MAX_TEXT_LENGTH = 500; + +interface TextContentProps { + text?: string; + mentionees?: Mentioned[]; +} + +export const TextContent = ({ text = '', mentionees }: TextContentProps) => { + const needReadMore = text.length > MAX_TEXT_LENGTH; + + const [isReadMoreClick, setIsReadMoreClick] = useState(false); + + const isShowReadMore = needReadMore && !isReadMoreClick; + + const chunks = useMemo(() => { + if (isShowReadMore) { + return processChunks(text.substring(0, MAX_TEXT_LENGTH), findChunks(mentionees)); + } + return processChunks(text, findChunks(mentionees)); + }, [mentionees, text, isShowReadMore]); + + if (!text) { + return null; + } + + const linksFounded = linkify.find(text).filter((link) => link.type === 'url'); + + return ( + <> + <Typography.Body className={styles.postContent}> + <> + {chunks.map((chunk) => { + const key = `${text}-${chunk.start}-${chunk.end}`; + const sub = text.substring(chunk.start, chunk.end); + if (chunk.highlight) { + const mentionee = mentionees?.find((m) => m.index === chunk.start); + if (mentionee) { + return ( + <MentionHighlightTag key={key} mentionee={mentionee}> + {sub} + </MentionHighlightTag> + ); + } + return <span key={key}>{sub}</span>; + } + return <Linkify key={key}>{sub}</Linkify>; + })} + </> + {isShowReadMore ? ( + <span className={styles.postContent__readmore} onClick={() => setIsReadMoreClick(true)}> + ...Read more + </span> + ) : null} + </Typography.Body> + {linksFounded && linksFounded.length > 0 && <LinkPreview url={linksFounded[0].href} />} + </> + ); +}; diff --git a/src/v4/social/components/PostContent/TextContent/index.tsx b/src/v4/social/components/PostContent/TextContent/index.tsx new file mode 100644 index 000000000..a576260f0 --- /dev/null +++ b/src/v4/social/components/PostContent/TextContent/index.tsx @@ -0,0 +1 @@ +export { TextContent } from './TextContent'; diff --git a/src/v4/social/components/PostContent/VideoContent/VideoContent.module.css b/src/v4/social/components/PostContent/VideoContent/VideoContent.module.css new file mode 100644 index 000000000..1f5b8e9d5 --- /dev/null +++ b/src/v4/social/components/PostContent/VideoContent/VideoContent.module.css @@ -0,0 +1,115 @@ +.videoContent { + display: grid; + border-radius: 0.5rem; + gap: 0.25rem; + width: 100%; + overflow: hidden; +} + +.videoContent[data-videos-amount='1'] { + grid-template: 'video1' / minmax(0, 1fr); +} + +.videoContent[data-videos-amount='2'] { + grid-template: + 'video1 video2' 50% + 'video1 video2' 50% + / 50% 50%; +} + +.videoContent[data-videos-amount='3'] { + grid-template: + 'video1 video1 video1 video1' 66% + 'video2 video2 video3 video3' 33% + / 25% 25% 25% 25%; +} + +.videoContent[data-videos-amount='4'] { + grid-template: + 'video1 video1 video1 video1 video1 video1' 66% + 'video2 video2 video3 video3 video4 video4' 33% + / minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr); +} + +.videoContent__video { + width: 100%; + position: absolute; + top: 0; + margin: auto; +} + +.videoContent__videoContainer { + cursor: pointer; + position: relative; + width: 100%; + padding-top: 56.25%; +} + +.videoContent__videoContainer[data-videos-amount='1'], +.videoContent__videoContainer[data-videos-amount='2'] { + padding-top: 56.25%; +} + +.videoContent__videoContainer[data-videos-amount='3'], +.videoContent__videoContainer[data-videos-amount='4'] { + padding-top: 100%; +} + +.videoContent__videoContainer:nth-child(1) { + grid-area: video1; +} + +.videoContent__videoContainer:nth-child(2) { + grid-area: video2; +} + +.videoContent__videoContainer:nth-child(3) { + grid-area: video3; +} + +.videoContent__videoContainer:nth-child(4) { + grid-area: video4; +} + +.videoContent__videoCover { + position: absolute; + inset: 0; + border-radius: 0 0 0.5rem; + background-color: rgb(0 0 0 / 50%); + color: var(--asc-color-white); + text-align: center; + display: flex; + justify-content: center; + align-items: center; +} + +.videoContent__playButtonCover { + position: absolute; + inset: 0; + border-radius: 0 0 0.5rem; + text-align: center; + display: flex; + justify-content: center; + align-items: center; +} + +.videoContent__playButton { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + border-radius: 50%; + width: 2.5rem; + height: 2.5rem; + background-color: var(--asc-color-secondary-default); + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.videoContent__playButton__svg { + width: 1.5rem; + height: 1.5rem; + fill: var(--asc-color-secondary-shade4); +} diff --git a/src/v4/social/components/PostContent/VideoContent/VideoContent.tsx b/src/v4/social/components/PostContent/VideoContent/VideoContent.tsx new file mode 100644 index 000000000..dabe79de4 --- /dev/null +++ b/src/v4/social/components/PostContent/VideoContent/VideoContent.tsx @@ -0,0 +1,103 @@ +import React, { useMemo } from 'react'; +import useImage from '~/v4/core/hooks/useImage'; +import usePostByIds from '~/v4/core/hooks/usePostByIds'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './VideoContent.module.css'; + +const PlayButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="25" + height="24" + viewBox="0 0 25 24" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g id="Icon " clip-path="url(#clip0_1936_14348)"> + <path id="Vector" d="M8.95117 5V19L19.9512 12L8.95117 5Z" /> + </g> + <defs> + <clipPath id="clip0_1936_14348"> + <rect width="24" height="24" transform="translate(0.951172)" /> + </clipPath> + </defs> + </svg> +); + +interface VideoContentProps { + pageId?: string; + componentId?: string; + elementId?: string; + post: Amity.Post<'video'>; + onVideoClick: (index: number) => void; +} + +const Video = ({ fileId }: { fileId: string }) => { + const videoThumbnailUrl = useImage({ + fileId, + }); + + return <img className={styles.videoContent__video} src={videoThumbnailUrl} alt={fileId} />; +}; + +export const VideoContent = ({ + pageId = '*', + componentId = '*', + elementId = '*', + post, + onVideoClick, +}: VideoContentProps) => { + const { themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const first4Videos = useMemo(() => post.children.slice(0, 4), [post.children]); + + const posts = usePostByIds(first4Videos); + + const videoPosts = posts.filter((post) => post.dataType === 'video'); + + const videoLeftCount = Math.max(0, post.children.length - 4); + + if (videoPosts.length === 0) { + return null; + } + + return ( + <div className={styles.videoContent} style={themeStyles}> + <div + className={styles.videoContent} + style={themeStyles} + data-videos-amount={Math.min(post.children.length, 4)} + > + {videoPosts.map((post, index) => ( + <div + className={styles.videoContent__videoContainer} + data-videos-amount={Math.min(post.children.length, 4)} + onClick={() => onVideoClick(index)} + > + <Video fileId={post.data.thumbnailFileId} /> + {videoLeftCount > 0 && index === posts.length - 1 && ( + <Typography.Heading className={styles.videoContent__videoCover}> + + {videoLeftCount} + </Typography.Heading> + )} + {videoLeftCount === 0 || index < posts.length - 1 ? ( + <div className={styles.videoContent__playButtonCover}> + <div + className={styles.videoContent__playButton} + onClick={() => onVideoClick(index)} + > + <PlayButtonSvg className={styles.videoContent__playButton__svg} /> + </div> + </div> + ) : null} + </div> + ))} + </div> + </div> + ); +}; diff --git a/src/v4/social/components/PostContent/VideoContent/index.tsx b/src/v4/social/components/PostContent/VideoContent/index.tsx new file mode 100644 index 000000000..cd6e44415 --- /dev/null +++ b/src/v4/social/components/PostContent/VideoContent/index.tsx @@ -0,0 +1 @@ +export { VideoContent } from './VideoContent'; diff --git a/src/v4/social/components/PostContent/index.tsx b/src/v4/social/components/PostContent/index.tsx new file mode 100644 index 000000000..90e2e17f6 --- /dev/null +++ b/src/v4/social/components/PostContent/index.tsx @@ -0,0 +1,2 @@ +export { PostContent } from './PostContent'; +export { PostContentSkeleton } from './PostContentSkeleton'; diff --git a/src/v4/social/components/ReactionList/ReactionList.module.css b/src/v4/social/components/ReactionList/ReactionList.module.css index 04c531acc..b1f1f9d7f 100644 --- a/src/v4/social/components/ReactionList/ReactionList.module.css +++ b/src/v4/social/components/ReactionList/ReactionList.module.css @@ -97,14 +97,14 @@ height: 100%; align-items: center; justify-content: center; - color: var(--asc-color-base-shade2) + color: var(--asc-color-base-shade2); } .reactionCustomStateContainer.loadingState { flex-direction: column; justify-content: start; align-items: flex-start; - animation: skeletonPulse 1.5s ease-in-out infinite; + animation: skeleton-pulse 1.5s ease-in-out infinite; } .reactionState { @@ -126,13 +126,15 @@ color: var(--asc-color-base-shade1); } -@keyframes skeletonPulse { +@keyframes skeleton-pulse { 0% { opacity: 0.6; } + 50% { opacity: 1; } + 100% { opacity: 0.6; } @@ -151,4 +153,4 @@ .reactionPanel { height: 100%; -} \ No newline at end of file +} diff --git a/src/v4/social/components/ReactionList/ReactionList.tsx b/src/v4/social/components/ReactionList/ReactionList.tsx index 66b4afbbd..74dfb0eaf 100644 --- a/src/v4/social/components/ReactionList/ReactionList.tsx +++ b/src/v4/social/components/ReactionList/ReactionList.tsx @@ -1,17 +1,19 @@ import React, { useMemo, useRef, useState } from 'react'; -import styles from './ReactionList.module.css'; import { useReactionsCollection } from '~/v4/social/hooks/collections/useReactionsCollection'; import { Typography } from '~/v4/core/components'; import { useCustomReaction } from '~/v4/core/providers/CustomReactionProvider'; import { abbreviateCount } from '~/v4/utils/abbreviateCount'; -import { ReactionIcon } from '~/v4/social/components/ReactionList/ReactionIcon'; -import { ReactionListPanel } from '~/v4/social/components/ReactionList/ReactionListPanel'; -import { ReactionListError } from '~/v4/social/components/ReactionList/ReactionListError'; -import { ReactionListEmptyState } from '~/v4/social/components/ReactionList/ReactionListEmptyState'; -import { ReactionListLoadingState } from '~/v4/social/components/ReactionList/ReactionListLoadingState'; +import { ReactionIcon } from './ReactionIcon'; +import { ReactionListPanel } from './ReactionListPanel'; +import { ReactionListError } from './ReactionListError'; +import { ReactionListEmptyState } from './ReactionListEmptyState'; +import { ReactionListLoadingState } from './ReactionListLoadingState'; import useReaction from '~/v4/chat/hooks/useReaction'; import useReactionByReference from '~/v4/chat/hooks/useReactionByReference'; import FallbackReaction from '~/v4/icons/FallbackReaction'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +import styles from './ReactionList.module.css'; interface ReactionListProps { pageId: string; @@ -41,6 +43,7 @@ const RenderCondition = ({ removeReaction, error, currentRef, + showReactionUserDetails = false, }: { filteredReactions: Amity.Reactor[]; isLoading: boolean; @@ -49,6 +52,7 @@ const RenderCondition = ({ removeReaction: (reaction: string) => Promise<void>; error: Error | null; currentRef: HTMLDivElement | null; + showReactionUserDetails?: boolean; }) => { if (isLoading) { return <ReactionListLoadingState />; @@ -74,12 +78,18 @@ const RenderCondition = ({ isLoading={isLoading} filteredReactions={filteredReactions} removeReaction={removeReaction} + showReactionUserDetails={showReactionUserDetails} /> ); }; export const ReactionList = ({ pageId = '*', referenceId, referenceType }: ReactionListProps) => { const componentId = 'reaction_list'; + const { accessibilityId } = useAmityComponent({ + pageId, + componentId, + }); + const { reactions, error, isLoading, hasMore, loadMore } = useReactionsCollection({ referenceId, referenceType, @@ -126,9 +136,9 @@ export const ReactionList = ({ pageId = '*', referenceId, referenceType }: React ); return ( - <div className={styles.reactionListContainer} data-qa-anchor="reaction_list_header"> + <div className={styles.reactionListContainer} data-qa-anchor={`${accessibilityId}_header`}> <div className={styles.tabListContainer}> - <div className={styles.tabList} data-qa-anchor="reaction_list_tab"> + <div className={styles.tabList} data-qa-anchor={`${accessibilityId}_tab`}> <div data-active={activeTab === 'All'} className={styles.tabItem} diff --git a/src/v4/social/components/ReactionList/ReactionListPanel.tsx b/src/v4/social/components/ReactionList/ReactionListPanel.tsx index 6bfbe4f99..c3ff78ee2 100644 --- a/src/v4/social/components/ReactionList/ReactionListPanel.tsx +++ b/src/v4/social/components/ReactionList/ReactionListPanel.tsx @@ -1,12 +1,13 @@ -import styles from './ReactionList.module.css'; import React, { Fragment, useMemo } from 'react'; import { Avatar, Typography } from '~/v4/core/components'; import FallbackReaction from '~/v4/icons/FallbackReaction'; import { ReactionIcon } from '~/v4/social/components/ReactionList/ReactionIcon'; import { useCustomReaction } from '~/v4/core/providers/CustomReactionProvider'; -import useSDK from '~/core/hooks/useSDK'; -import { FormattedMessage } from 'react-intl'; import InfiniteScroll from 'react-infinite-scroll-component'; +import { AVATAR_SIZE } from '~/v4/core/components/Avatar/Avatar'; +import useSDK from '~/v4/core/hooks/useSDK'; + +import styles from './ReactionList.module.css'; export const ReactionListPanel = ({ filteredReactions, @@ -15,6 +16,7 @@ export const ReactionListPanel = ({ loadMore, isLoading, currentRef, + showReactionUserDetails, }: { filteredReactions: Amity.Reactor[]; removeReaction: (reaction: string) => Promise<void>; @@ -22,6 +24,7 @@ export const ReactionListPanel = ({ loadMore: () => void; isLoading: boolean; currentRef: HTMLDivElement | null; + showReactionUserDetails?: boolean; }) => { const { currentUserId } = useSDK(); const { config } = useCustomReaction(); @@ -50,17 +53,17 @@ export const ReactionListPanel = ({ <div className={styles.userDetailsProfile}> <Avatar data-qa-anchor="user_avatar_view" - size="small" + size={AVATAR_SIZE.SMALL} avatar={reaction.user?.avatar?.fileUrl} /> <Typography.BodyBold data-qa-anchor="user_display_name"> {reaction.user?.displayName} - {currentUserId === reaction.user?.userId && ( + {currentUserId === reaction.user?.userId && showReactionUserDetails && ( <> <br /> <div onClick={() => removeReaction(reaction.reactionName)}> <Typography.Caption className={styles.removeBtn}> - <FormattedMessage id="livechat.reaction.label.removeReaction" /> + Click to remove reaction </Typography.Caption> </div> </> @@ -68,18 +71,20 @@ export const ReactionListPanel = ({ </Typography.BodyBold> </div> - <div className={styles.userDetailsReaction}> - {reactionList.includes(reaction.reactionName) ? ( - <ReactionIcon - reactionConfigItem={ - config.find(({ name }) => name === reaction.reactionName)! - } - className={styles.reactionIcon} - /> - ) : ( - <FallbackReaction className={styles.reactionIcon} /> - )} - </div> + {showReactionUserDetails && ( + <div className={styles.userDetailsReaction}> + {reactionList.includes(reaction.reactionName) ? ( + <ReactionIcon + reactionConfigItem={ + config.find(({ name }) => name === reaction.reactionName)! + } + className={styles.reactionIcon} + /> + ) : ( + <FallbackReaction className={styles.reactionIcon} /> + )} + </div> + )} </div> </div> </Fragment> diff --git a/src/v4/social/components/StoryTab/CreateNewStoryButton.tsx b/src/v4/social/components/StoryTab/CreateNewStoryButton.tsx deleted file mode 100644 index aa69c41f1..000000000 --- a/src/v4/social/components/StoryTab/CreateNewStoryButton.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react'; - -import { AddStoryButton } from './styles'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; - -interface CreateNewStoryButtonProps { - pageId?: 'story_page'; - componentId?: '*'; - onClick?: (e: React.MouseEvent) => void; -} - -export const CreateNewStoryButton = ({ - pageId = 'story_page', - componentId = '*', - onClick = () => {}, -}: CreateNewStoryButtonProps) => { - const elementId = 'create_new_story_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; - - return ( - <AddStoryButton - onClick={onClick} - style={{ - backgroundColor: elementConfig?.background_color, - }} - /> - ); -}; diff --git a/src/v4/social/components/StoryTab/StoryTab.module.css b/src/v4/social/components/StoryTab/StoryTab.module.css index cae2c6371..126cdcd46 100644 --- a/src/v4/social/components/StoryTab/StoryTab.module.css +++ b/src/v4/social/components/StoryTab/StoryTab.module.css @@ -63,10 +63,11 @@ z-index: 2; } -@keyframes animateRing { +@keyframes animate-ring { 0% { stroke-dashoffset: 339; } + 100% { stroke-dashoffset: 0; } @@ -74,14 +75,10 @@ .progressRing { animation: none; - -webkit-animation: none; - -moz-animation: none; } .progressRing.animateRing { - animation: animateRing 2s linear 0s infinite; - -webkit-animation: animateRing 2s linear 0s infinite; - -moz-animation: animateRing 2s linear 0s infinite; + animation: animate-ring 2s linear 0s infinite; } .storyTab { diff --git a/src/v4/social/components/StoryTab/StoryTab.tsx b/src/v4/social/components/StoryTab/StoryTab.tsx index 914994c85..74bf74384 100644 --- a/src/v4/social/components/StoryTab/StoryTab.tsx +++ b/src/v4/social/components/StoryTab/StoryTab.tsx @@ -1,25 +1,74 @@ import React from 'react'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; +import { usePageBehavior } from '~/v4/core/providers/PageBehaviorProvider'; +import { useStoryContext } from '~/v4/social/providers/StoryProvider'; import { StoryTabCommunityFeed } from './StoryTabCommunity'; import { StoryTabGlobalFeed } from './StoryTabGlobalFeed'; -type AmityStoryTabComponentType = 'communityFeed' | 'globalFeed'; +type StoryTabType = 'communityFeed' | 'globalFeed'; -type AmityStoryTabComponentProps<T extends AmityStoryTabComponentType> = { +type StoryTabProps<T extends StoryTabType> = { + pageId?: string; type: T; communityId?: T extends 'communityFeed' ? string : never; }; -export const StoryTab = <T extends AmityStoryTabComponentType>({ +export const StoryTab = <T extends StoryTabType>({ + pageId = '*', type, communityId, -}: AmityStoryTabComponentProps<T>) => { +}: StoryTabProps<T>) => { + const componentId = 'story_tab_component'; + const { AmityGlobalFeedComponentBehavior } = usePageBehavior(); + const { goToViewStoryPage, goToDraftStoryPage } = useNavigation(); + const { setFile } = useStoryContext(); + const renderStoryTab = () => { switch (type) { case 'communityFeed': - return <StoryTabCommunityFeed communityId={communityId || ''} />; + return ( + <StoryTabCommunityFeed + pageId={pageId} + componentId={componentId} + communityId={communityId || ''} + onFileChange={(file) => { + setFile(file); + if (file) { + goToDraftStoryPage({ + targetId: communityId || '', + targetType: 'community', + mediaType: file.type.includes('image') + ? { type: 'image', url: URL.createObjectURL(file) } + : { type: 'video', url: URL.createObjectURL(file) }, + storyType: 'communityFeed', + }); + } + }} + onStoryClick={() => + goToViewStoryPage({ + targetId: communityId || '', + targetType: 'community', + storyType: 'communityFeed', + }) + } + /> + ); case 'globalFeed': - return <StoryTabGlobalFeed />; + return ( + <StoryTabGlobalFeed + pageId={pageId} + componentId={componentId} + goToViewStoryPage={({ storyTarget, storyTargets }) => { + AmityGlobalFeedComponentBehavior.goToViewStoryPage({ + targetId: storyTarget.targetId, + targetType: storyTarget.targetType as Amity.StoryTargetType, + storyType: 'globalFeed', + targetIds: storyTargets.map((s) => s.targetId), + }); + }} + /> + ); default: return null; } diff --git a/src/v4/social/components/StoryTab/StoryTabCommunity.module.css b/src/v4/social/components/StoryTab/StoryTabCommunity.module.css index fc744b869..97e990987 100644 --- a/src/v4/social/components/StoryTab/StoryTabCommunity.module.css +++ b/src/v4/social/components/StoryTab/StoryTabCommunity.module.css @@ -1,75 +1,81 @@ -.errorButton { - position: absolute; - bottom: 0; - right: 0; - cursor: pointer; - z-index: 2; +.errorIcon { + position: absolute; + bottom: 0; + right: 0; + cursor: pointer; + z-index: 2; +} + +.addStoryButton { + position: absolute; + bottom: 0; + right: 0; + cursor: pointer; + z-index: 2; +} + +.hiddenInput { + display: none; +} + +.storyWrapper { + width: 3rem; + height: 3rem; + position: relative; + cursor: pointer; +} + +.storyTabContainer { + background-color: var(--asc-color-base-background); + position: relative; + width: 3rem; + display: flex; + gap: 0.13rem; + flex-direction: column; + text-align: center; + padding: 1rem 0.75rem; + align-items: center; +} + +.storyAvatarContainer { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 2.5rem; + height: 2.5rem; + border-radius: 50%; + overflow: hidden; +} + +.storyAvatar { + width: 100% !important; + height: 100% !important; + object-fit: cover; + border-radius: 50%; +} + +.storyTitle { + font-size: 0.75rem; + line-height: 1rem; + color: #626262; + cursor: pointer; +} + +@keyframes animate-ring { + 0% { + stroke-dashoffset: 339; } - - .addStoryButton { - position: absolute; - bottom: 0; - right: 0; - cursor: pointer; - z-index: 2; + + 100% { + stroke-dashoffset: 0; } - - .hiddenInput { - display: none; - } - - .storyWrapper { - width: 3rem; - height: 3rem; - position: relative; - cursor: pointer; - } - - .storyTabContainer { - position: relative; - width: 3rem; - display: flex; - gap: 0.13rem; - flex-direction: column; - text-align: center; - padding: 1rem 0.75rem; - align-items: center; - } - - .storyAvatar { - width: 2.5rem; - height: 2.5rem; - position: absolute; - top: 0.25rem; - left: 0.25rem; - z-index: 1; - cursor: pointer; - } - - .storyTitle { - font-size: 0.75rem; - line-height: 1rem; - color: #626262; - cursor: pointer; - } - - @keyframes animateRing { - 0% { - stroke-dashoffset: 339; - } - 100% { - stroke-dashoffset: 0; - } - } - - .progressRing { - animation: animateRing 2s linear 0s infinite; - -webkit-animation: animateRing 2s linear 0s infinite; - -moz-animation: animateRing 2s linear 0s infinite; - } - - .progressRingStatic { - animation: none; - -webkit-animation: none; - -moz-animation: none; - } \ No newline at end of file +} + +.progressRing { + animation: animate-ring 2s linear 0s infinite; +} + +.progressRingStatic { + animation: none; +} diff --git a/src/v4/social/components/StoryTab/StoryTabCommunity.tsx b/src/v4/social/components/StoryTab/StoryTabCommunity.tsx index 0e23dccfb..ef39ba2e3 100644 --- a/src/v4/social/components/StoryTab/StoryTabCommunity.tsx +++ b/src/v4/social/components/StoryTab/StoryTabCommunity.tsx @@ -1,109 +1,111 @@ -import React, { useRef } from 'react'; +import React from 'react'; import Truncate from 'react-truncate-markup'; -import { backgroundImage as CommunityImage } from '~/icons/Community'; +import { FileTrigger } from 'react-aria-components'; +import { StoryRing } from '~/v4/social/elements/StoryRing/StoryRing'; +import clsx from 'clsx'; +import { useGetActiveStoriesByTarget } from '~/v4/social/hooks/useGetActiveStories'; +import useSDK from '~/v4/core/hooks/useSDK'; +import useUser from '~/v4/core/hooks/objects/useUser'; +import { isAdmin, isModerator } from '~/v4/utils/permissions'; +import { checkStoryPermission } from '~/v4/social/utils'; +import { useCommunityInfo } from '~/v4/social/hooks/useCommunityInfo'; -import StoryRing from './StoryRing'; -import useStories from '~/social/hooks/useStories'; -import useSDK from '~/core/hooks/useSDK'; -import { checkStoryPermission } from '~/utils'; -import { useStoryContext } from '~/v4/social/providers/StoryProvider'; -import { useCommunityInfo } from '~/social/components/CommunityInfo/hooks'; -import { useNavigation } from '~/social/providers/NavigationProvider'; +import styles from './StoryTabCommunity.module.css'; +import { CreateNewStoryButton } from '~/v4/social/elements/CreateNewStoryButton'; +import { CommunityAvatar } from '~/v4/social/elements/CommunityAvatar'; -import { - AddStoryButton, - ErrorButton, - HiddenInput, - StoryAvatar, - StoryTabContainer, - StoryTitle, - StoryWrapper, -} from './styles'; -import { isAdmin, isModerator } from '~/helpers/permissions'; -import { FormattedMessage } from 'react-intl'; -import useUser from '~/core/hooks/useUser'; +const ErrorIcon = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="16" + height="16" + fill="none" + viewBox="0 0 16 16" + {...props} + > + <circle cx="8" cy="8" r="7.25" fill="#FA4D30" stroke="#fff" strokeWidth="1.5"></circle> + <path + fill="#fff" + d="M9.25 10.75C9.25 11.453 8.687 12 8 12c-.703 0-1.25-.547-1.25-1.25 0-.688.547-1.25 1.25-1.25.688 0 1.25.563 1.25 1.25zM6.89 4.406A.378.378 0 017.267 4h1.453c.219 0 .39.188.375.406l-.203 4.25A.387.387 0 018.516 9H7.469a.387.387 0 01-.375-.344l-.203-4.25z" + ></path> + </svg> + ); +}; interface StoryTabCommunityFeedProps { + pageId?: string; + componentId?: string; communityId: string; + onStoryClick: () => void; + onFileChange: (file: File | null) => void; } -export const StoryTabCommunityFeed: React.FC<StoryTabCommunityFeedProps> = ({ communityId }) => { - const { onClickStory } = useNavigation(); - const { stories } = useStories({ +export const StoryTabCommunityFeed: React.FC<StoryTabCommunityFeedProps> = ({ + pageId = '*', + componentId = '*', + communityId, + onFileChange, + onStoryClick, +}) => { + const { stories } = useGetActiveStoriesByTarget({ targetId: communityId, targetType: 'community', options: { orderBy: 'asc', sortBy: 'createdAt' }, }); - const { avatarFileUrl } = useCommunityInfo(communityId); - const { setFile } = useStoryContext(); - const fileInputRef = useRef<HTMLInputElement>(null); - - const handleAddIconClick = () => { - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; - - const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { - const selectedFile = event.target.files?.[0]; - if (selectedFile) { - setFile(selectedFile); - } - }; - - const handleOnClick = () => { - if (Array.isArray(stories) && stories.length === 0) return; - onClickStory(communityId, 'communityFeed'); - }; + const { community } = useCommunityInfo(communityId); const { currentUserId, client } = useSDK(); - const user = useUser(currentUserId); + const { user } = useUser(currentUserId); const isGlobalAdmin = isAdmin(user?.roles); const isCommunityModerator = isModerator(user?.roles); const hasStoryPermission = isGlobalAdmin || isCommunityModerator || checkStoryPermission(client, communityId); - - const hasStoryRing = stories?.length > 0; + const hasStories = stories?.length > 0; const hasUnSeen = stories.some((story) => !story?.isSeen); const uploading = stories.some((story) => story?.syncState === 'syncing'); const isErrored = stories.some((story) => story?.syncState === 'error'); + const handleOnClick = () => { + if (Array.isArray(stories) && stories.length === 0) return; + onStoryClick(); + }; + + if (!hasStories && !hasStoryPermission) return null; + return ( - <StoryTabContainer> - <StoryWrapper> - {hasStoryRing && ( + <div className={clsx(styles.storyTabContainer)}> + <div className={clsx(styles.storyWrapper)}> + {hasStories && ( <StoryRing - pageId="*" - componentId="story_tab_component" + pageId={pageId} + componentId={componentId} hasUnseen={hasUnSeen} uploading={uploading} isErrored={isErrored} size={48} /> )} - <StoryAvatar - onClick={handleOnClick} - avatar={avatarFileUrl} - backgroundImage={CommunityImage} - /> + + <button className={clsx(styles.storyAvatarContainer)} onClick={handleOnClick}> + <CommunityAvatar pageId={pageId} componentId={componentId} community={community} /> + </button> + {hasStoryPermission && ( - <> - <AddStoryButton onClick={handleAddIconClick} /> - <HiddenInput - ref={fileInputRef} - type="file" - accept="image/*,video/*" - onChange={handleFileChange} - /> - </> + <FileTrigger + onSelect={(e) => { + const files = Array.from(e as FileList); + onFileChange(files[0]); + }} + > + <CreateNewStoryButton pageId={pageId} componentId={componentId} /> + </FileTrigger> )} - {isErrored && <ErrorButton />} - </StoryWrapper> + {isErrored && <ErrorIcon className={clsx(styles.errorIcon)} />} + </div> <Truncate lines={1}> - <StoryTitle> - <FormattedMessage id="storyTab.title" /> - </StoryTitle> + <div className={clsx(styles.storyTitle)}>Story</div> </Truncate> - </StoryTabContainer> + </div> ); }; diff --git a/src/v4/social/components/StoryTab/StoryTabGlobalFeed.module.css b/src/v4/social/components/StoryTab/StoryTabGlobalFeed.module.css index 1b273af62..e89f4f79f 100644 --- a/src/v4/social/components/StoryTab/StoryTabGlobalFeed.module.css +++ b/src/v4/social/components/StoryTab/StoryTabGlobalFeed.module.css @@ -1,36 +1,35 @@ .storyTabContainer { display: flex; overflow: auto; - padding: 0.625rem; - background-color: var(--asc-color-white); - border-bottom: 0.0625rem solid #e6e6e6; - gap: var(--asc-spacing-s1) + padding: 0.625rem; + background-color: var(--asc-color-base-background); + gap: var(--asc-spacing-s1); } .storyTab { display: flex; flex-direction: column; align-items: center; - margin-right: 1.25rem; + margin-right: 1.25rem; cursor: pointer; } .storyTabImage { - width: 3.75rem; - height: 3.75rem; + width: 3.75rem; + height: 3.75rem; border-radius: 50%; overflow: hidden; - border: 0.125rem solid var(--asc-color-white); - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.1); + border: 0.125rem solid var(--asc-color-white); + box-shadow: 0 0.125rem 0.25rem rgb(0 0 0 / 10%); } .storyTabContent { - margin-top: 0.5rem; + margin-top: 0.5rem; text-align: center; } .storyTabTitle { - font-size: 0.875rem; + font-size: 0.875rem; font-weight: 500; color: var(--asc-color-base-default); } @@ -38,12 +37,12 @@ .storyTabIcons { display: flex; justify-content: center; - margin-top: 0.25rem; + margin-top: 0.25rem; } .storyTabIcons svg { - width: 1rem; - height: 1rem; + width: 1rem; + height: 1rem; margin: 0 0.25rem; fill: var(--asc-color-base-shade4); } @@ -56,29 +55,31 @@ } .storyTabSkeletonAvatar { - width: 4.5rem; - height: 4.5rem; + width: 4.5rem; + height: 4.5rem; border-radius: 50%; background-color: var(--asc-color-base-shade4); margin-bottom: 0.5rem; - animation: skeletonPulse 1.5s ease-in-out infinite; + animation: skeleton-pulse 1.5s ease-in-out infinite; } .storyTabSkeletonUsername { - width: 4.5rem; - height: 0.75rem; - border-radius: 0.25rem; + width: 4.5rem; + height: 0.75rem; + border-radius: 0.25rem; background-color: #f0f0f0; - animation: skeletonPulse 1.5s ease-in-out infinite; + animation: skeleton-pulse 1.5s ease-in-out infinite; } -@keyframes skeletonPulse { +@keyframes skeleton-pulse { 0% { opacity: 0.6; } + 50% { opacity: 1; } + 100% { opacity: 0.6; } diff --git a/src/v4/social/components/StoryTab/StoryTabGlobalFeed.tsx b/src/v4/social/components/StoryTab/StoryTabGlobalFeed.tsx index 1d36be6dc..f480a26bb 100644 --- a/src/v4/social/components/StoryTab/StoryTabGlobalFeed.tsx +++ b/src/v4/social/components/StoryTab/StoryTabGlobalFeed.tsx @@ -1,17 +1,28 @@ import React, { useRef, useEffect } from 'react'; import styles from './StoryTabGlobalFeed.module.css'; -import { useNavigation } from '~/social/providers/NavigationProvider'; import { StoryTabItem } from './StoryTabItem'; import { useGlobalStoryTargets } from '~/v4/social/hooks/collections/useGlobalStoryTargets'; const STORIES_PER_PAGE = 10; -export const StoryTabGlobalFeed: React.FC = () => { +interface StoryTabGlobalFeedProps { + pageId?: string; + componentId?: string; + goToViewStoryPage: (data: { + storyTarget: Amity.StoryTarget; + storyTargets: Amity.StoryTarget[]; + }) => void; +} + +export const StoryTabGlobalFeed = ({ + pageId = '*', + componentId = '*', + goToViewStoryPage, +}: StoryTabGlobalFeedProps) => { const { stories, isLoading, hasMore, loadMoreStories } = useGlobalStoryTargets({ seenState: 'smart' as Amity.StorySeenQuery, limit: STORIES_PER_PAGE, }); - const { onClickStory } = useNavigation(); const containerRef = useRef<HTMLDivElement>(null); const observerRef = useRef<IntersectionObserver | null>(null); @@ -63,15 +74,17 @@ export const StoryTabGlobalFeed: React.FC = () => { {stories.map((story) => { return ( <StoryTabItem + pageId={pageId} + componentId={componentId} key={story.targetId} targetId={story.targetId} hasUnseen={story.hasUnseen} + isErrored={story.failedStoriesCount > 0} onClick={() => - onClickStory( - story.targetId, - 'globalFeed', - stories.map((s) => s.targetId), - ) + goToViewStoryPage({ + storyTargets: stories, + storyTarget: story, + }) } size={64} /> diff --git a/src/v4/social/components/StoryTab/StoryTabItem.module.css b/src/v4/social/components/StoryTab/StoryTabItem.module.css index ad1e132a8..17435b850 100644 --- a/src/v4/social/components/StoryTab/StoryTabItem.module.css +++ b/src/v4/social/components/StoryTab/StoryTabItem.module.css @@ -16,7 +16,6 @@ position: absolute; bottom: 0; right: 0; - z-index: 2; fill: var(--asc-color-primary-default); } @@ -46,4 +45,12 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + color: var(--asc-color-secondary-default); +} + +.errorIcon { + position: absolute; + bottom: 0; + right: 0; + cursor: pointer; } diff --git a/src/v4/social/components/StoryTab/StoryTabItem.tsx b/src/v4/social/components/StoryTab/StoryTabItem.tsx index 8273d46f9..5fc1de699 100644 --- a/src/v4/social/components/StoryTab/StoryTabItem.tsx +++ b/src/v4/social/components/StoryTab/StoryTabItem.tsx @@ -1,38 +1,102 @@ import React from 'react'; -import useImage from '~/core/hooks/useImage'; -import useCommunity from '~/social/hooks/useCommunity'; -import StoryRing from './StoryRing'; -import { PrivateIcon } from '~/social/components/community/Name/styles'; -import styles from './StoryTabItem.module.css'; +import { StoryRing } from '~/v4/social/elements/StoryRing'; + import { Typography } from '~/v4/core/components'; import Verified from '~/v4/icons/Verified'; +import clsx from 'clsx'; +import useCommunity from '~/v4/core/hooks/collections/useCommunity'; +import useImage from '~/v4/core/hooks/useImage'; + +import styles from './StoryTabItem.module.css'; + +const ErrorIcon = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="16" + height="16" + fill="none" + viewBox="0 0 16 16" + {...props} + > + <circle cx="8" cy="8" r="7.25" fill="#FA4D30" stroke="#fff" strokeWidth="1.5"></circle> + <path + fill="#fff" + d="M9.25 10.75C9.25 11.453 8.687 12 8 12c-.703 0-1.25-.547-1.25-1.25 0-.688.547-1.25 1.25-1.25.688 0 1.25.563 1.25 1.25zM6.89 4.406A.378.378 0 017.267 4h1.453c.219 0 .39.188.375.406l-.203 4.25A.387.387 0 018.516 9H7.469a.387.387 0 01-.375-.344l-.203-4.25z" + ></path> + </svg> + ); +}; + +const LockIcon = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="16" + height="16" + fill="none" + viewBox="0 0 16 16" + {...props} + > + <path + fill="#000" + fillOpacity=".2" + d="M8 0c4.41 0 8 3.59 8 8s-3.59 8-8 8-8-3.59-8-8 3.59-8 8-8z" + ></path> + <path + fill="#000" + fillOpacity=".2" + d="M8 2c2.21 0 4 1.79 4 4v1h-1V6c0-1.104-.896-2-2-2s-2 .896-2 2v1H4V6c0-2.21 1.79-4 4-4z" + ></path> + </svg> + ); +}; interface StoryTabProps { + pageId: string; + componentId: string; targetId: string; hasUnseen: boolean; onClick: () => void; size: number; + isErrored?: boolean; } -export const StoryTabItem: React.FC<StoryTabProps> = ({ targetId, hasUnseen, onClick }) => { - const community = useCommunity(targetId); +export const StoryTabItem: React.FC<StoryTabProps> = ({ + pageId, + componentId, + targetId, + hasUnseen, + onClick, + isErrored, +}) => { + const { community } = useCommunity({ + communityId: targetId, + }); const communityAvatar = useImage({ fileId: community?.avatarFileId, imageSize: 'small' }); return ( - <div className={styles.container} onClick={onClick}> + <div className={clsx(styles.container)} onClick={onClick}> <div className={styles.avatarContainer}> - <StoryRing pageId="*" componentId="story_tab_component" hasUnseen={hasUnseen} /> - {community?.isOfficial && <Verified className={styles.verifiedIcon} />} + <StoryRing + pageId={pageId} + componentId={componentId} + hasUnseen={hasUnseen} + isErrored={isErrored} + /> + <div className={styles.avatarBackground}> {communityAvatar && ( <img className={styles.avatar} src={communityAvatar} alt={community?.displayName} /> )} </div> + {isErrored && <ErrorIcon className={styles.errorIcon} />} + {community?.isOfficial && !isErrored && <Verified className={styles.verifiedIcon} />} </div> - <Typography.Caption className={styles.displayName}> - {!community?.isPublic && <PrivateIcon />} + <Typography.Caption className={clsx(styles.displayName)}> + {!community?.isPublic && <LockIcon />} {community?.displayName} </Typography.Caption> </div> diff --git a/src/v4/social/components/StoryTab/styles.tsx b/src/v4/social/components/StoryTab/styles.tsx deleted file mode 100644 index 2b820c7ce..000000000 --- a/src/v4/social/components/StoryTab/styles.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import styled, { keyframes } from 'styled-components'; -import Avatar from '~/core/components/Avatar'; -import { AddIcon, ErrorIcon } from '~/icons'; - -export const ErrorButton = styled(ErrorIcon)` - position: absolute; - bottom: 0; - right: 0; - cursor: pointer; - z-index: 2; -`; - -export const AddStoryButton = styled(AddIcon)` - position: absolute; - bottom: 0; - right: 0; - cursor: pointer; - z-index: 2; -`; - -export const HiddenInput = styled.input` - display: none; -`; - -export const StoryWrapper = styled.div` - width: 3rem; - height: 3rem; - position: relative; - cursor: pointer; -`; - -export const StoryTabContainer = styled.div` - position: relative; - width: 3rem; - display: flex; - gap: 0.13rem; - flex-direction: column; - text-align: center; - padding: 1rem 0.75rem; - align-items: center; -`; - -export const StoryAvatar = styled(Avatar)` - width: 2.5rem; - height: 2.5rem; - position: absolute; - top: 0.25rem; - left: 0.25rem; - z-index: 1; - cursor: pointer; -`; - -export const StoryTitle = styled.div` - ${({ theme }) => theme.typography.caption}; - color: ${({ theme }) => theme.palette.base.main}; - cursor: pointer; -`; - -export const AddButton = styled(AddIcon)` - position: absolute; - bottom: 0; - right: 0; - cursor: pointer; - z-index: 2; -`; - -const animateRing = keyframes` - 0% { - stroke-dashoffset: 339; - } - 100% { - stroke-dashoffset: 0; - } -`; - -export const ProgressRing = styled.circle<{ uploading?: boolean }>` - animation: ${(props) => (props.uploading ? animateRing : 'none')} 2s linear 0s infinite; - -webkit-animation: ${(props) => (props.uploading ? animateRing : 'none')} 2s linear 0s infinite; - -moz-animation: ${(props) => (props.uploading ? animateRing : 'none')} 2s linear 0s infinite; -`; diff --git a/src/v4/social/components/TopNavigation/TopNavigation.module.css b/src/v4/social/components/TopNavigation/TopNavigation.module.css new file mode 100644 index 000000000..80f794e10 --- /dev/null +++ b/src/v4/social/components/TopNavigation/TopNavigation.module.css @@ -0,0 +1,21 @@ +.topNavigation { + display: flex; + justify-content: space-between; + align-items: center; + background-color: var(--asc-color-base-background); + height: 3.625rem; +} + +.topNavigationLeftPane { + display: flex; + gap: 0.625rem; + justify-content: center; + align-items: center; +} + +.topNavigationRightPane { + display: flex; + gap: 0.625rem; + justify-content: center; + align-items: center; +} diff --git a/src/v4/social/components/TopNavigation/TopNavigation.stories.tsx b/src/v4/social/components/TopNavigation/TopNavigation.stories.tsx new file mode 100644 index 000000000..3fda5e5ba --- /dev/null +++ b/src/v4/social/components/TopNavigation/TopNavigation.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { TopNavigation } from './TopNavigation'; + +export default { + title: 'v4-social/components/TopNavigation', +}; + +export const TopNavigationStory = { + render: () => { + return <TopNavigation />; + }, + + name: 'TopNavigation', +}; diff --git a/src/v4/social/components/TopNavigation/TopNavigation.tsx b/src/v4/social/components/TopNavigation/TopNavigation.tsx new file mode 100644 index 000000000..cf3c830af --- /dev/null +++ b/src/v4/social/components/TopNavigation/TopNavigation.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { PostCreationButton } from '~/v4/social/elements/PostCreationButton'; +import { GlobalSearchButton } from '~/v4/social/elements/GlobalSearchButton'; +import { HeaderLabel } from '~/v4/social/elements/HeaderLabel'; +import styles from './TopNavigation.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; + +export interface TopNavigationProps { + pageId?: string; + // onClickPostCreationButton: (event: React.MouseEvent) => void; + // createPostButtonRef: React.RefObject<HTMLDivElement>; +} + +export function TopNavigation({ + pageId = '*', + // onClickPostCreationButton, + // createPostButtonRef, +}: TopNavigationProps) { + const componentId = 'top_navigation'; + const { isExcluded, themeStyles } = useAmityComponent({ + pageId, + componentId, + }); + + const { goToSocialGlobalSearchPage } = useNavigation(); + + if (isExcluded) return null; + + return ( + <div className={styles.topNavigation} style={themeStyles}> + <div className={styles.topNavigationLeftPane}> + <HeaderLabel pageId={pageId} componentId={componentId} /> + </div> + <div className={styles.topNavigationRightPane}> + <GlobalSearchButton + pageId={pageId} + componentId={componentId} + onClick={() => goToSocialGlobalSearchPage()} + /> + <PostCreationButton + pageId={pageId} + componentId={componentId} + onClick={() => {}} + // onClick={onClickPostCreationButton} + // createPostButtonRef={createPostButtonRef} + /> + </div> + </div> + ); +} diff --git a/src/v4/social/components/TopNavigation/index.tsx b/src/v4/social/components/TopNavigation/index.tsx new file mode 100644 index 000000000..2c5d02b7a --- /dev/null +++ b/src/v4/social/components/TopNavigation/index.tsx @@ -0,0 +1 @@ +export { TopNavigation } from './TopNavigation'; diff --git a/src/v4/social/components/TopSearchBar/TopSearchBar.module.css b/src/v4/social/components/TopSearchBar/TopSearchBar.module.css new file mode 100644 index 000000000..9c3bc3c35 --- /dev/null +++ b/src/v4/social/components/TopSearchBar/TopSearchBar.module.css @@ -0,0 +1,49 @@ +.topSearchBar { + display: grid; + grid-template-columns: minmax(0, 1fr) min-content; + align-items: center; + gap: 0.5rem; + background-color: var(--asc-color-base-background); +} + +.topSearchBar__inputBar { + display: grid; + grid-template-columns: min-content minmax(0, 1fr) min-content; + align-items: center; + background-color: var(--asc-color-base-shade4); + gap: 0.5rem; + padding: 0.62rem 0.75rem; + border-radius: 0.5rem; +} + +.topSearchBar__textInput { + border: none; + background-color: var(--asc-color-base-shade4); + color: var(--asc-color-base-shade2); +} + +.topSearchBar__searchIcon { + fill: var(--asc-color-base-default); + width: 1.25rem; + height: 1.25rem; + cursor: pointer; +} + +.topSearchBar__searchIcon_img { + width: 1.25rem; + height: 1.25rem; + cursor: pointer; +} + +.topSearchBar__clearButton { + fill: var(--asc-color-base-shade3); + width: 1.25rem; + height: 1.25rem; + cursor: pointer; +} + +.topSearchBar__clearButton__img { + width: 1.25rem; + height: 1.25rem; + cursor: pointer; +} diff --git a/src/v4/social/components/TopSearchBar/TopSearchBar.stories.tsx b/src/v4/social/components/TopSearchBar/TopSearchBar.stories.tsx new file mode 100644 index 000000000..6347943f2 --- /dev/null +++ b/src/v4/social/components/TopSearchBar/TopSearchBar.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { TopSearchBar } from './TopSearchBar'; + +export default { + title: 'v4-social/components/TopSearchBar', +}; + +export const TopSearchBarStory = { + render: () => { + return <TopSearchBar search={() => {}} />; + }, + + name: 'TopSearchBar', +}; diff --git a/src/v4/social/components/TopSearchBar/TopSearchBar.tsx b/src/v4/social/components/TopSearchBar/TopSearchBar.tsx new file mode 100644 index 000000000..e963aa063 --- /dev/null +++ b/src/v4/social/components/TopSearchBar/TopSearchBar.tsx @@ -0,0 +1,66 @@ +import React, { useEffect, useState } from 'react'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { ClearButton } from '~/v4/social/elements/ClearButton'; +import { CancelButton } from '~/v4/social/elements/CancelButton'; +import { SearchIcon } from '~/v4/social/elements/SearchIcon'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; + +import styles from './TopSearchBar.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; + +export interface TopSearchBarProps { + pageId?: string; + search: (keyword: string) => void; +} + +export function TopSearchBar({ pageId = '*', search }: TopSearchBarProps) { + const componentId = 'top_search_bar'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + const { onBack } = useNavigation(); + + const [searchValue, setSearchValue] = useState(''); + + useEffect(() => { + search(searchValue); + }, [searchValue]); + + if (isExcluded) return null; + + return ( + <div className={styles.topSearchBar} style={themeStyles}> + <div className={styles.topSearchBar__inputBar}> + <SearchIcon + pageId={pageId} + componentId={componentId} + defaultClassName={styles.topSearchBar__searchIcon} + imgClassName={styles.topSearchBar__searchIcon_img} + /> + <input + className={styles.topSearchBar__textInput} + type="text" + value={searchValue} + placeholder={config.text} + onChange={(ev) => setSearchValue(ev.target.value)} + /> + {searchValue != '' ? ( + <ClearButton + pageId={pageId} + componentId={componentId} + defaultClassName={styles.topSearchBar__clearButton} + imgClassName={styles.topSearchBar__clearButton__img} + onClick={() => { + setSearchValue(''); + }} + /> + ) : null} + </div> + <CancelButton pageId={pageId} componentId={componentId} onClick={() => onBack()} /> + </div> + ); +} diff --git a/src/v4/social/components/TopSearchBar/index.tsx b/src/v4/social/components/TopSearchBar/index.tsx new file mode 100644 index 000000000..9f68ae7f0 --- /dev/null +++ b/src/v4/social/components/TopSearchBar/index.tsx @@ -0,0 +1 @@ +export { TopSearchBar } from './TopSearchBar'; diff --git a/src/v4/social/components/UserSearchResult/UserSearchItem.module.css b/src/v4/social/components/UserSearchResult/UserSearchItem.module.css new file mode 100644 index 000000000..57a641301 --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchItem.module.css @@ -0,0 +1,41 @@ +.userItem { + display: grid; + grid-template-columns: 3.75rem minmax(0, 1fr); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + width: 100%; +} + +.userItem__leftPane { + display: flex; + justify-content: center; + align-items: center; +} + +.userItem__rightPane { + display: flex; + justify-content: center; + align-items: center; + width: 100%; +} + +.userItem__avatar { + width: 2.5rem; + height: 2.5rem; +} + +.userItem__userName { + display: flex; + justify-content: start; + align-items: last baseline; + gap: 0.25rem; + width: 100%; + color: var(--asc-color-base-default); + overflow: hidden; + text-overflow: ellipsis; +} + +.userItem__userName__text { + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/src/v4/social/components/UserSearchResult/UserSearchItem.tsx b/src/v4/social/components/UserSearchResult/UserSearchItem.tsx new file mode 100644 index 000000000..a1fc8cf74 --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchItem.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { UserAvatar } from '~/v4/social/internal-components/UserAvatar/UserAvatar'; +import { Typography } from '~/v4/core/components/index'; +import styles from './UserSearchItem.module.css'; + +interface UserSearchItemProps { + user: Amity.User; +} + +export const UserSearchItem = ({ user }: UserSearchItemProps) => { + return ( + <div key={user.userId} className={styles.userItem}> + <div className={styles.userItem__leftPane}> + <UserAvatar userId={user.userId} className={styles.userItem__avatar} /> + </div> + <div className={styles.userItem__rightPane}> + <div className={styles.userItem__userName}> + <Typography.BodyBold className={styles.userItem__userName__text}> + {user.displayName} + </Typography.BodyBold> + </div> + </div> + </div> + ); +}; diff --git a/src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.module.css b/src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.module.css new file mode 100644 index 000000000..77035e40b --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.module.css @@ -0,0 +1,74 @@ +.userSearchItemSkeleton { + display: grid; + grid-template-columns: 2.5rem minmax(0, 1fr); + gap: 1rem; + padding-top: 1rem; + margin-bottom: 1.5rem; + height: 3.5rem; + background-color: var(--asc-color-base-background); + width: 100%; +} + +.userSearchItemSkeleton:not(:first-child) { + border-top: 0.0625rem solid var(--asc-color-base-shade4); +} + +.userSearchItemSkeleton__leftPane { + display: flex; + justify-content: center; + align-items: center; +} + +.userSearchItemSkeleton__information { + display: flex; + flex-direction: column; + justify-content: center; + align-items: start; + gap: 0.75rem; + width: 100%; +} + +.userSearchItemSkeleton__content { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.userSearchItemSkeleton__animation { + animation: skeleton-pulse 1.5s ease-in-out infinite; +} + +.userSearchItemSkeleton__userAvatar { + width: 2.5rem; + height: 2.5rem; + border-radius: 50%; + background-color: var(--asc-color-base-shade4); +} + +.userSearchItemSkeleton__information__title { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 8.75rem; + height: 0.5rem; +} + +.userSearchItemSkeleton__information__subtitle { + border-radius: 0.75rem; + background-color: var(--asc-color-base-shade4); + width: 6.75rem; + height: 0.5rem; +} + +@keyframes skeleton-pulse { + 0% { + opacity: 0.6; + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 0.6; + } +} diff --git a/src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.tsx b/src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.tsx new file mode 100644 index 000000000..db2450f6f --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchItemSkeleton.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './UserSearchItemSkeleton.module.css'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; + +interface UserSearchItemSkeletonProps { + pageId?: string; + componentId?: string; +} + +export const UserSearchItemSkeleton = ({ + pageId = '*', + componentId = '*', +}: UserSearchItemSkeletonProps) => { + const { accessibilityId } = useAmityComponent({ + pageId, + componentId, + }); + + return ( + <div + data-qa-anchor={accessibilityId} + className={clsx(styles.userSearchItemSkeleton, styles.userSearchItemSkeleton__animation)} + > + <div className={styles.userSearchItemSkeleton__leftPane}> + <div + className={clsx( + styles.userSearchItemSkeleton__userAvatar, + styles.userSearchItemSkeleton__animation, + )} + /> + </div> + <div + className={clsx( + styles.userSearchItemSkeleton__information, + styles.userSearchItemSkeleton__animation, + )} + > + <div + className={clsx( + styles.userSearchItemSkeleton__information__title, + styles.userSearchItemSkeleton__animation, + )} + /> + <div + className={clsx( + styles.userSearchItemSkeleton__information__subtitle, + styles.userSearchItemSkeleton__animation, + )} + /> + </div> + </div> + ); +}; diff --git a/src/v4/social/components/UserSearchResult/UserSearchResult.module.css b/src/v4/social/components/UserSearchResult/UserSearchResult.module.css new file mode 100644 index 000000000..c1001919d --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchResult.module.css @@ -0,0 +1,9 @@ +.userSearchResult { + display: flex; + flex-direction: column; + justify-content: center; + align-items: start; + width: 100%; + background-color: var(--asc-color-base-background); + overflow-x: hidden; +} diff --git a/src/v4/social/components/UserSearchResult/UserSearchResult.stories.tsx b/src/v4/social/components/UserSearchResult/UserSearchResult.stories.tsx new file mode 100644 index 000000000..5bea1f1f9 --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchResult.stories.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import useOneUser from '~/mock/useOneUser'; + +import { UserSearchResult } from './UserSearchResult'; + +export default { + title: 'v4-social/components/UserSearchResult', +}; + +export const UserSearchResultStory = { + render: () => { + const user = useOneUser(); + + if (user == null) return null; + + return <UserSearchResult userCollection={[user]} onLoadMore={() => {}} />; + }, + + name: 'UserSearchResult', +}; diff --git a/src/v4/social/components/UserSearchResult/UserSearchResult.tsx b/src/v4/social/components/UserSearchResult/UserSearchResult.tsx new file mode 100644 index 000000000..3856b1074 --- /dev/null +++ b/src/v4/social/components/UserSearchResult/UserSearchResult.tsx @@ -0,0 +1,45 @@ +import React, { useRef } from 'react'; +import styles from './UserSearchResult.module.css'; +import useIntersectionObserver from '~/v4/core/hooks/useIntersectionObserver'; +import { useAmityComponent } from '~/v4/core/hooks/uikit'; +import { UserSearchItem } from './UserSearchItem'; +import { UserSearchItemSkeleton } from './UserSearchItemSkeleton'; + +interface UserSearchResultProps { + pageId?: string; + userCollection: Amity.User[]; + isLoading: boolean; + onLoadMore: () => void; +} + +export const UserSearchResult = ({ + pageId = '*', + userCollection = [], + isLoading, + onLoadMore, +}: UserSearchResultProps) => { + const componentId = 'user_search_result'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityComponent({ + pageId, + componentId, + }); + + const intersectionRef = useRef<HTMLDivElement>(null); + + useIntersectionObserver({ onIntersect: () => onLoadMore(), ref: intersectionRef }); + + return ( + <div className={styles.userSearchResult} style={themeStyles}> + {userCollection.map((user) => ( + <UserSearchItem key={user.userId} user={user} /> + ))} + {isLoading + ? Array.from({ length: 5 }).map((_, index) => ( + <UserSearchItemSkeleton key={index} pageId={pageId} componentId={componentId} /> + )) + : null} + <div ref={intersectionRef} /> + </div> + ); +}; diff --git a/src/v4/social/components/UserSearchResult/index.tsx b/src/v4/social/components/UserSearchResult/index.tsx new file mode 100644 index 000000000..67c5b0f81 --- /dev/null +++ b/src/v4/social/components/UserSearchResult/index.tsx @@ -0,0 +1 @@ +export { UserSearchResult } from './UserSearchResult'; diff --git a/src/v4/social/components/ViewStoryPage/index.tsx b/src/v4/social/components/ViewStoryPage/index.tsx deleted file mode 100644 index 3049611e3..000000000 --- a/src/v4/social/components/ViewStoryPage/index.tsx +++ /dev/null @@ -1,323 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import Stories from 'react-insta-stories'; -import { StoryRepository } from '@amityco/ts-sdk'; -import { extractColors } from 'extract-colors'; -import { FinalColor } from 'extract-colors/lib/types/Color'; -import useImage from '~/core/hooks/useImage'; -import { useIntl } from 'react-intl'; - -import { useMedia } from 'react-use'; -import useStories from '~/social/hooks/useStories'; -import useSDK from '~/core/hooks/useSDK'; - -import { isNonNullable } from '~/v4/helpers/utils'; -import { ArrowLeftCircle, ArrowRightCircle, Trash2Icon } from '~/icons'; - -import styles from './ViewStoryPage.module.css'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; -import { CreateStoryButton } from '../../elements'; - -import { renderers } from '../../internal-components/StoryViewer/Renderers'; - -import { AmityDraftStoryPage } from '../../pages'; -import { useStoryContext } from '../../providers/StoryProvider'; -import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; -import { useNotifications } from '~/v4/core/providers/NotificationProvider'; - -interface StoryViewerProps { - pageId: 'story_page'; - targetId: string; - duration?: number; - onClose: () => void; -} - -const StoryViewer = ({ pageId, targetId, duration = 5000, onClose }: StoryViewerProps) => { - const { getConfig, isExcluded } = useCustomization(); - const pageConfig = getConfig(`${pageId}/*/*`); - const isPageExcluded = isExcluded(`${pageId}/*/*`); - const { confirm } = useConfirmContext(); - const notification = useNotifications(); - - if (isPageExcluded) return null; - - const progressBarElementConfig = getConfig(`${pageId}/*/progress_bar`); - - const { stories } = useStories({ - targetId, - targetType: 'community', - options: { - orderBy: 'asc', - sortBy: 'createdAt', - }, - }); - - const fileInputRef = useRef<HTMLInputElement>(null); - - const handleAddIconClick = (e: React.MouseEvent) => { - e.stopPropagation(); - e.preventDefault(); - - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; - - const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { - const selectedFile = event.target.files?.[0]; - if (selectedFile) { - onChange(selectedFile as File); - } - }; - - const { currentUserId } = useSDK(); - - const { formatMessage } = useIntl(); - const isMobile = useMedia('(max-width: 768px)'); - - const [currentIndex, setCurrentIndex] = useState(0); - const { file, setFile } = useStoryContext(); - const [colors, setColors] = useState<FinalColor[]>([]); - - const isStoryCreator = stories[currentIndex]?.creator?.userId === currentUserId; - - const confirmDeleteStory = (storyId: string) => { - const isLastStory = currentIndex === 0; - confirm({ - title: formatMessage({ id: 'storyViewer.action.confirmModal.title' }), - content: formatMessage({ id: 'storyViewer.action.confirmModal.content' }), - okText: formatMessage({ id: 'delete' }), - onOk: async () => { - previousStory(); - if (isLastStory) { - onClose(); - } - await StoryRepository.softDeleteStory(storyId); - notification.success({ - content: formatMessage({ id: 'storyViewer.notification.deleted' }), - }); - }, - }); - }; - - const onChange = (file: File) => { - setFile(file); - }; - - const deleteStory = async (storyId: string) => { - confirmDeleteStory(storyId); - }; - - const onCreateStory = async ( - file: File, - imageMode: 'fit' | 'fill', - metadata?: Amity.Metadata, - items?: Amity.StoryItem[], - ) => { - onClose(); - const formData = new FormData(); - formData.append('files', file); - setFile(null); - if (file?.type.includes('image')) { - const { data: imageData } = await StoryRepository.createImageStory( - 'community', - targetId, - formData, - metadata, - imageMode, - items, - ); - if (imageData) { - notification.success({ - content: formatMessage({ id: 'storyViewer.notification.success' }), - }); - } - } else { - const { data: videoData } = await StoryRepository.createVideoStory( - 'community', - targetId, - formData, - metadata, - items, - ); - if (videoData) { - notification.success({ - content: formatMessage({ id: 'storyViewer.notification.success' }), - }); - } - } - }; - - const discardStory = () => { - setFile(null); - }; - - const addStoryButton = ( - <CreateStoryButton pageId="story_page" componentId="*" onClick={handleAddIconClick} /> - ); - - const formattedStories = stories?.map((story) => { - const isImage = story?.dataType === 'image'; - const url = isImage ? story?.imageData?.fileUrl : story?.videoData?.videoUrl?.['720p']; - - return { - ...story, - url, - type: isImage ? 'image' : 'video', - actions: [ - isStoryCreator - ? { - name: 'delete', - action: () => deleteStory(story?.storyId as string), - icon: ( - <Trash2Icon - style={{ - fill: 'var(--asc-color-black)', - }} - /> - ), - } - : null, - ].filter(isNonNullable), - handleAddIconClick, - onCreateStory, - discardStory, - addStoryButton, - fileInputRef, - }; - }); - - const avatarUrl = useImage({ - fileId: stories[currentIndex]?.community?.avatarFileId, - imageSize: 'small', - }); - - const nextStory = () => { - if (currentIndex === stories.length - 1) { - onClose(); - return; - } - setCurrentIndex(currentIndex + 1); - }; - - const previousStory = () => { - if (currentIndex === 0) return; - setCurrentIndex(currentIndex - 1); - }; - - const targetRootId = 'asc-uikit-stories-viewer'; - - const storyStyles = { - width: '100%', - height: '100%', - objectFit: - stories[currentIndex]?.dataType === 'image' && - stories[currentIndex]?.data?.imageDisplayMode === 'fill' - ? 'cover' - : 'contain', - background: `linear-gradient( - 180deg, - ${colors?.length > 0 ? colors[0].hex : '#000'} 0%, - ${colors?.length > 0 ? colors[colors?.length - 1].hex : '#000'} 100% - )`, - }; - - const increaseIndex = () => { - setCurrentIndex(currentIndex + 1); - }; - - useEffect(() => { - if (stories[stories.length - 1]?.syncState === 'syncing') { - setCurrentIndex(stories.length - 1); - } - if (stories[currentIndex]) { - stories[currentIndex]?.analytics.markAsSeen(); - } - }, [currentIndex, stories]); - - useEffect(() => { - const extractColorsFromImage = async (url: string) => { - const colorsFromImage = await extractColors(url, { - crossOrigin: 'anonymous', - }); - - setColors(colorsFromImage); - }; - - if (file?.type.includes('image') || stories[currentIndex]?.dataType === 'image') { - extractColorsFromImage((stories[currentIndex]?.imageData?.fileUrl as string) ?? file); - } else { - setColors([]); - } - }, [stories, file, currentIndex]); - - if (file) { - return ( - <AmityDraftStoryPage - mediaType={ - file.type.includes('image') - ? { type: 'image', url: URL.createObjectURL(file) } - : { type: 'video', url: URL.createObjectURL(file) } - } - targetId={targetId} - targetType="community" - /> - ); - } - - return ( - <div className={styles.storyWrapper} data-qa-anchor="story_page"> - {!isMobile && ( - <button className={styles.storyArrowButton} onClick={previousStory}> - <ArrowLeftCircle /> - </button> - )} - <div className={styles.viewStoryContainer} id={targetRootId}> - <input - className={styles.hiddenInput} - ref={fileInputRef} - type="file" - accept="image/*,video/*" - onChange={handleFileChange} - /> - <div className={styles.viewStoryContent}> - <div className={styles.viewStoryOverlay} /> - {formattedStories?.length > 0 ? ( - // NOTE: Do not use isPaused prop, it will cause the first video story skipped - <Stories - progressStyles={{ - backgroundColor: - progressBarElementConfig.progress_color || 'var(--asc-color-white)', - }} - progressWrapperStyles={{ - backgroundColor: - progressBarElementConfig.background_color || 'var(--asc-color-secondary-shade3)', - }} - width="100%" - height="100%" - storyStyles={storyStyles} - preventDefault={!isMobile} - currentIndex={currentIndex} - stories={formattedStories} - // TO FIX: need to override custom type of renderers from react-insta-stories library - // @ts-ignore - renderers={renderers} - defaultInterval={duration} - onStoryStart={() => stories[currentIndex]?.analytics.markAsSeen()} - onStoryEnd={increaseIndex} - onNext={nextStory} - onPrevious={previousStory} - onAllStoriesEnd={onClose} - /> - ) : null} - </div> - </div> - {!isMobile && ( - <button className={styles.storyArrowButton} onClick={nextStory}> - <ArrowRightCircle /> - </button> - )} - </div> - ); -}; - -export default StoryViewer; diff --git a/src/v4/social/constants/memberRoles.ts b/src/v4/social/constants/memberRoles.ts new file mode 100644 index 000000000..3fe2760e6 --- /dev/null +++ b/src/v4/social/constants/memberRoles.ts @@ -0,0 +1,7 @@ +export enum MemberRoles { + MEMBER = 'member', + MODERATOR = 'moderator', + SUPER_MODERATOR = 'super-moderator', + COMMUNITY_MODERATOR = 'community-moderator', + CHANNEL_MODERATOR = 'channel-moderator', +} diff --git a/src/v4/social/constants/permissions.ts b/src/v4/social/constants/permissions.ts new file mode 100644 index 000000000..9edb4f26c --- /dev/null +++ b/src/v4/social/constants/permissions.ts @@ -0,0 +1,38 @@ +export enum Permissions { + EditUserPermission = 'EDIT_USER', + BanUserPermission = 'BAN_USER', + CreateRolePermission = 'CREATE_ROLE', + EditRolePermission = 'EDIT_ROLE', + DeleteRolePermission = 'DELETE_ROLE', + AssignRolePermission = 'ASSIGN_USER_ROLE', + EditChannelPermission = 'EDIT_CHANNEL', + EditChannelRatelimitPermission = 'EDIT_CHANNEL_RATELIMIT', + MuteChannelPermission = 'MUTE_CHANNEL', + CloseChannelPermission = 'CLOSE_CHANNEL', + AddChannelUserPermission = 'ADD_CHANNEL_USER', + EditChannelUserPermission = 'EDIT_CHANNEL_USER', + RemoveChannelUserPermission = 'REMOVE_CHANNEL_USER', + MuteChannelUserPermission = 'MUTE_CHANNEL_USER', + BanChannelUserPermission = 'BAN_CHANNEL_USER', + EditMessagePermission = 'EDIT_MESSAGE', + DeleteMessagePermission = 'DELETE_MESSAGE', + EditCommunityPermission = 'EDIT_COMMUNITY', + DeleteCommunityPermission = 'DELETE_COMMUNITY', + AddChannelCommunityPermission = 'ADD_COMMUNITY_USER', + EditChannelCommunityPermission = 'EDIT_COMMUNITY_USER', + RemoveChannelCommunityPermission = 'REMOVE_COMMUNITY_USER', + MuteChannelCommunityPermission = 'MUTE_COMMUNITY_USER', + BanChannelCommunityPermission = 'BAN_COMMUNITY_USER', + EditUserFeedPostPermission = 'EDIT_USER_FEED_POST', + DeleteUserFeedPostPermission = 'DELETE_USER_FEED_POST', + EditUserFeedCommentPermission = 'EDIT_USER_FEED_COMMENT', + DeleteUserFeedCommentPermission = 'DELETE_USER_FEED_COMMENT', + EditCommunityFeedPostPermission = 'EDIT_COMMUNITY_FEED_POST', + DeleteCommunityFeedPostPermission = 'DELETE_COMMUNITY_FEED_POST', + EditCommunityFeedCommentPermission = 'EDIT_COMMUNITY_FEED_COMMENT', + DeleteCommunityFeedCommentPermission = 'DELETE_COMMUNITY_FEED_COMMENT', + CreateCommunityCategoryPermission = 'CREATE_COMMUNITY_CATEGORY', + EditCommunityCategoryPermission = 'EDIT_COMMUNITY_CATEGORY', + DeleteCommunityCategoryPermission = 'DELETE_COMMUNITY_CATEGORY', + ManageStoryPermission = 'MANAGE_COMMUNITY_STORY', +} diff --git a/src/v4/social/constants/reactions.ts b/src/v4/social/constants/reactions.ts new file mode 100644 index 000000000..893647a0f --- /dev/null +++ b/src/v4/social/constants/reactions.ts @@ -0,0 +1,3 @@ +export const LIKE_REACTION_KEY = 'like'; +export const LOVE_REACTION_KEY = 'love'; +export const FIRE_REACTION_KEY = 'fire'; diff --git a/src/v4/social/elements/ActionButton/ActionButton.module.css b/src/v4/social/elements/ActionButton/ActionButton.module.css index 5cca3c61b..7e422f624 100644 --- a/src/v4/social/elements/ActionButton/ActionButton.module.css +++ b/src/v4/social/elements/ActionButton/ActionButton.module.css @@ -5,10 +5,10 @@ align-items: center; justify-content: center; border: none; - background-color: rgba(0, 0, 0, 0.5); + background-color: rgb(0 0 0 / 50%); color: var(--base-inverse-default); cursor: pointer; - padding: 0.1875rem 0rem; + padding: 0.1875rem 0; border-radius: 50%; transition: background-color 0.3s; flex-shrink: 0; diff --git a/src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.module.css b/src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.module.css new file mode 100644 index 000000000..0072c4005 --- /dev/null +++ b/src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.module.css @@ -0,0 +1,26 @@ +.storyButton { + background: none; + border: none; + padding: 0; + cursor: pointer; + outline: none; + display: flex; + align-items: center; + justify-content: center; +} + +.storyButton svg { + width: 2rem; + height: 1.75rem; + fill: var(--asc-color-base-inverse); +} + +.desktopOnly { + display: none; +} + +@media screen and (width >= 768px) { + .desktopOnly { + display: flex; + } +} diff --git a/src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.tsx b/src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.tsx new file mode 100644 index 000000000..24fdf8268 --- /dev/null +++ b/src/v4/social/elements/ArrowLeftButton/ArrowLeftButton.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import clsx from 'clsx'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './ArrowLeftButton.module.css'; + +interface ArrowLeftButtonProps { + pageId?: string; + componentId?: string; + onClick?: (e: React.MouseEvent) => void; +} + +const ArrowLeftButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" {...props}> + <path d="M12 23.91C5.578 23.91.375 18.709.375 12.287.375 5.864 5.578.66 12 .66s11.625 5.203 11.625 11.625S18.422 23.91 12 23.91zM6.656 13.084l6.328 6.375c.47.422 1.172.422 1.594 0l.797-.797c.422-.422.422-1.172 0-1.594l-4.781-4.781 4.781-4.735c.422-.468.422-1.171 0-1.593l-.797-.797c-.422-.422-1.172-.422-1.594 0l-6.328 6.328c-.468.469-.468 1.172 0 1.594z"></path> + </svg> +); +export const ArrowLeftButton = ({ + pageId = '*', + componentId = '*', + onClick, +}: ArrowLeftButtonProps) => { + const elementId = 'arrow_left_button'; + const { accessibilityId, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <button + data-qa-anchor={accessibilityId} + className={clsx(styles.storyButton, styles.desktopOnly)} + onClick={onClick} + style={themeStyles} + > + <ArrowLeftButtonSvg /> + </button> + ); +}; diff --git a/src/v4/social/elements/ArrowLeftButton/index.ts b/src/v4/social/elements/ArrowLeftButton/index.ts new file mode 100644 index 000000000..e9c113fb4 --- /dev/null +++ b/src/v4/social/elements/ArrowLeftButton/index.ts @@ -0,0 +1 @@ +export { ArrowLeftButton } from './ArrowLeftButton'; diff --git a/src/v4/social/elements/ArrowRightButton/ArrowRightButton.module.css b/src/v4/social/elements/ArrowRightButton/ArrowRightButton.module.css new file mode 100644 index 000000000..0072c4005 --- /dev/null +++ b/src/v4/social/elements/ArrowRightButton/ArrowRightButton.module.css @@ -0,0 +1,26 @@ +.storyButton { + background: none; + border: none; + padding: 0; + cursor: pointer; + outline: none; + display: flex; + align-items: center; + justify-content: center; +} + +.storyButton svg { + width: 2rem; + height: 1.75rem; + fill: var(--asc-color-base-inverse); +} + +.desktopOnly { + display: none; +} + +@media screen and (width >= 768px) { + .desktopOnly { + display: flex; + } +} diff --git a/src/v4/social/elements/ArrowRightButton/ArrowRightButton.tsx b/src/v4/social/elements/ArrowRightButton/ArrowRightButton.tsx new file mode 100644 index 000000000..cb3baeb3d --- /dev/null +++ b/src/v4/social/elements/ArrowRightButton/ArrowRightButton.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import clsx from 'clsx'; + +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './ArrowRightButton.module.css'; + +interface ArrowRightButtonProps { + pageId?: string; + componentId?: string; + onClick?: (e: React.MouseEvent) => void; +} + +const ArrowRightButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" {...props}> + <path d="M12 .66c6.422 0 11.625 5.204 11.625 11.626S18.422 23.91 12 23.91.375 18.708.375 12.286 5.578.66 12 .66zm5.297 10.829L10.969 5.16c-.422-.422-1.172-.422-1.594 0l-.797.797c-.422.422-.422 1.172 0 1.593l4.781 4.735-4.78 4.781c-.423.422-.423 1.172 0 1.594l.796.797c.422.422 1.172.422 1.594 0l6.328-6.375c.469-.422.469-1.125 0-1.594z"></path> + </svg> +); +export const ArrowRightButton = ({ + pageId = '*', + componentId = '*', + onClick, +}: ArrowRightButtonProps) => { + const elementId = 'arrow_right_button'; + const { accessibilityId, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <button + data-qa-anchor={accessibilityId} + className={clsx(styles.storyButton, styles.desktopOnly)} + onClick={onClick} + style={themeStyles} + > + <ArrowRightButtonSvg /> + </button> + ); +}; diff --git a/src/v4/social/elements/ArrowRightButton/index.ts b/src/v4/social/elements/ArrowRightButton/index.ts new file mode 100644 index 000000000..12597df6c --- /dev/null +++ b/src/v4/social/elements/ArrowRightButton/index.ts @@ -0,0 +1 @@ +export { ArrowRightButton } from './ArrowRightButton'; diff --git a/src/v4/social/elements/AspectRatioButton/AspectRatioButton.module.css b/src/v4/social/elements/AspectRatioButton/AspectRatioButton.module.css new file mode 100644 index 000000000..b82f214ed --- /dev/null +++ b/src/v4/social/elements/AspectRatioButton/AspectRatioButton.module.css @@ -0,0 +1,8 @@ +.aspectRatioButton { + fill: var(--asc-color-white); +} + +.aspectRatioButton__icon { + width: 1.5rem; + height: 1.5rem; +} diff --git a/src/v4/social/elements/AspectRatioButton/AspectRatioButton.tsx b/src/v4/social/elements/AspectRatioButton/AspectRatioButton.tsx index 3cb8d85ce..cc1a057de 100644 --- a/src/v4/social/elements/AspectRatioButton/AspectRatioButton.tsx +++ b/src/v4/social/elements/AspectRatioButton/AspectRatioButton.tsx @@ -1,46 +1,53 @@ import React from 'react'; +import clsx from 'clsx'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; -import { ActionButton, CustomActionButton } from './styles'; +import styles from './AspectRatioButton.module.css'; -import { isValidHttpUrl } from '~/utils'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +const AspectRatioSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" viewBox="0 0 32 32"> + <circle cx="16" cy="16" r="16" fill="#000" fillOpacity="0.5"></circle> + <path + fill="currentColor" + d="M8.125 13.578v-4.36c0-.456.352-.843.844-.843h4.36c.21 0 .421.21.421.422v.844c0 .246-.21.421-.422.421H9.813v3.516c0 .246-.211.422-.422.422h-.844a.406.406 0 01-.422-.422zM18.25 8.797c0-.211.176-.422.422-.422h4.36c.456 0 .843.387.843.844v4.36c0 .245-.21.421-.422.421h-.844a.406.406 0 01-.422-.422v-3.515h-3.515a.406.406 0 01-.422-.422v-.844zm5.203 9.703c.211 0 .422.21.422.422v4.36a.833.833 0 01-.844.843h-4.36a.406.406 0 01-.421-.422v-.844c0-.21.176-.422.422-.422h3.515v-3.515c0-.211.176-.422.422-.422h.844zm-9.703 5.203c0 .246-.21.422-.422.422h-4.36c-.491 0-.843-.352-.843-.844v-4.36c0-.21.176-.421.422-.421h.844c.21 0 .421.21.421.422v3.515h3.516c.211 0 .422.211.422.422v.844z" + ></path> + </svg> +); interface AspectRatioButtonProps { - onClick: () => void; - pageId: 'create_story_page'; - componentId: '*'; - 'data-qa-anchor'?: string; + pageId?: string; + componentId?: string; + defaultIconClassName?: string; + imgIconClassName?: string; + onPress: () => void; } -export const AspectRatioButton = ({ - pageId = 'create_story_page', +export function AspectRatioButton({ + pageId = '*', componentId = '*', - onClick = () => {}, - ...props -}: AspectRatioButtonProps) => { + defaultIconClassName, + imgIconClassName, + onPress, +}: AspectRatioButtonProps) { const elementId = 'aspect_ratio_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - const aspectRatioIcon = elementConfig?.aspect_ratio_icon; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); - if (isElementExcluded) return null; + if (isExcluded) return null; - const isRemoteImage = aspectRatioIcon && isValidHttpUrl(aspectRatioIcon); - - return isRemoteImage ? ( - <CustomActionButton - data-qa-anchor="aspect_ratio_button" - src={aspectRatioIcon} - onClick={onClick} - {...props} - /> - ) : ( - <ActionButton - data-qa-anchor="aspect_ratio_button" - name={'ExpandIcon'} - onClick={onClick} - {...props} + return ( + <IconComponent + data-qa-anchor={accessibilityId} + className={clsx(styles.aspectRatioButton)} + onPress={onPress} + defaultIcon={() => <AspectRatioSvg className={clsx(defaultIconClassName)} />} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgIconClassName)} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} /> ); -}; +} diff --git a/src/v4/social/elements/AspectRatioButton/styles.tsx b/src/v4/social/elements/AspectRatioButton/styles.tsx deleted file mode 100644 index 985425bba..000000000 --- a/src/v4/social/elements/AspectRatioButton/styles.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import styled from 'styled-components'; -import { Icon } from '~/v4/core/components'; - -export const ActionButton = styled(Icon)` - cursor: pointer; - border-radius: 50%; - padding: 0.25rem; - background-color: ${({ theme }) => theme.v4.colors.actionButton.default}; -`; - -export const CustomActionButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; -`; diff --git a/src/v4/social/elements/BackButton/BackButton.module.css b/src/v4/social/elements/BackButton/BackButton.module.css index eef495bcb..1f04120c6 100644 --- a/src/v4/social/elements/BackButton/BackButton.module.css +++ b/src/v4/social/elements/BackButton/BackButton.module.css @@ -1,15 +1,3 @@ -.uiBackButton { - width: 2rem; - height: 2rem; - position: absolute; - top: 0; - left: 0; - cursor: pointer; - border-radius: 50%; - } - - .uiBackButtonImage { - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - } \ No newline at end of file +.backButton { + fill: var(--asc-color-white); +} diff --git a/src/v4/social/elements/BackButton/BackButton.stories.tsx b/src/v4/social/elements/BackButton/BackButton.stories.tsx new file mode 100644 index 000000000..c47768193 --- /dev/null +++ b/src/v4/social/elements/BackButton/BackButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { BackButton } from './BackButton'; + +export default { + title: 'v4-social/elements/BackButton', +}; + +export const BackButtonStory = { + render: () => { + return <BackButton />; + }, + + name: 'BackButton', +}; diff --git a/src/v4/social/elements/BackButton/BackButton.tsx b/src/v4/social/elements/BackButton/BackButton.tsx index 5eaa57805..f752063be 100644 --- a/src/v4/social/elements/BackButton/BackButton.tsx +++ b/src/v4/social/elements/BackButton/BackButton.tsx @@ -1,47 +1,62 @@ import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import clsx from 'clsx'; -import { UIBackButtonImage } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { ActionButton } from '../ActionButton'; -import { ArrowLeftCircle, ArrowLeftCircle2 } from '~/icons'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import styles from './BackButton.module.css'; + +const BackButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="32" + height="32" + fill="none" + viewBox="0 0 32 32" + {...props} + > + <circle cx="16" cy="16" r="16" fill="#000" fillOpacity="0.5"></circle> + <path + fill="currentColor" + d="M16.176 23.914c-.14.176-.422.176-.598 0L8.23 16.566a.405.405 0 010-.597l7.348-7.348c.176-.176.457-.176.598 0l.703.668c.176.176.176.457 0 .598l-5.45 5.449h12.024c.211 0 .422.21.422.422v.984c0 .246-.21.422-.422.422H11.43l5.449 5.484c.176.141.176.422 0 .598l-.703.668z" + ></path> + </svg> +); interface BackButtonProps { - pageId?: 'create_story_page'; - componentId?: '*'; - onClick?: (e: React.MouseEvent) => void; - 'data-qa-anchor'?: string; + pageId?: string; + componentId?: string; + defaultClassName?: string; + imgClassName?: string; + onPress?: () => void; } export const BackButton = ({ - pageId = 'create_story_page', + pageId = '*', componentId = '*', - onClick = () => {}, + defaultClassName, + imgClassName, + onPress = () => {}, }: BackButtonProps) => { const elementId = 'back_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const backIcon = elementConfig?.back_icon; - - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); - const isRemoteImage = backIcon && isValidHttpUrl(backIcon); + if (isExcluded) return null; - return isRemoteImage ? ( - <UIBackButtonImage data-qa-anchor="back_button" src={backIcon} onClick={onClick} /> - ) : ( - <ActionButton - data-qa-anchor="back_button" - icon={ - backIcon === 'back' ? ( - <ArrowLeftCircle width={20} height={20} /> - ) : ( - <ArrowLeftCircle2 width={20} height={20} /> - ) - } - onClick={onClick} + return ( + <IconComponent + data-qa-anchor={accessibilityId} + className={clsx(styles.backButton, defaultClassName)} + defaultIcon={() => <BackButtonSvg />} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgClassName)} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + onPress={onPress} + style={themeStyles} /> ); }; diff --git a/src/v4/social/elements/BackButton/styles.tsx b/src/v4/social/elements/BackButton/styles.tsx deleted file mode 100644 index 8754fcc78..000000000 --- a/src/v4/social/elements/BackButton/styles.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import styled from 'styled-components'; -import { Icon } from '~/v4/core/components'; - -export const UIBackButton = styled(Icon)` - width: 2rem; - height: 2rem; - cursor: pointer; - border-radius: 50%; - padding: 0.375rem 0rem; - background: ${({ theme }) => theme.v4.colors.actionButton.default}; - fill: ${({ theme }) => theme.v4.colors.baseInverse.default}; -`; - -export const UIBackButtonImage = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; -`; diff --git a/src/v4/social/elements/CancelButton/CancelButton.module.css b/src/v4/social/elements/CancelButton/CancelButton.module.css new file mode 100644 index 000000000..aca2bba95 --- /dev/null +++ b/src/v4/social/elements/CancelButton/CancelButton.module.css @@ -0,0 +1,17 @@ +button { + appearance: none; + border-radius: 0; + text-align: inherit; + background: none; + box-shadow: none; + padding: 0; + cursor: pointer; + border: none; + color: inherit; + font: inherit; +} + +.clearButton { + color: var(--asc-color-base-default); + background-color: var(--asc-color-base-background); +} diff --git a/src/v4/social/elements/CancelButton/CancelButton.stories.tsx b/src/v4/social/elements/CancelButton/CancelButton.stories.tsx new file mode 100644 index 000000000..cb02fc798 --- /dev/null +++ b/src/v4/social/elements/CancelButton/CancelButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CancelButton } from './CancelButton'; + +export default { + title: 'v4-social/elements/CancelButton', +}; + +export const CancelButtonStory = { + render: () => { + return <CancelButton />; + }, + + name: 'CancelButton', +}; diff --git a/src/v4/social/elements/CancelButton/CancelButton.tsx b/src/v4/social/elements/CancelButton/CancelButton.tsx index 4a8d82f34..7cd6d74c2 100644 --- a/src/v4/social/elements/CancelButton/CancelButton.tsx +++ b/src/v4/social/elements/CancelButton/CancelButton.tsx @@ -1,53 +1,34 @@ +import { config } from 'process'; import React from 'react'; - -import { StyledRemoteImageButton } from './styles'; -import { useIntl } from 'react-intl'; -import { isValidHttpUrl } from '~/utils'; -import { useTheme } from 'styled-components'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; -import { Button } from '~/v4/core/components/Button'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import styles from './CancelButton.module.css'; interface CancelButtonProps { - pageId: '*'; - componentId: 'edit_comment_component'; + pageId?: string; + componentId?: string; onClick?: (e: React.MouseEvent) => void; - children?: React.ReactNode; - style?: React.CSSProperties; } export const CancelButton = ({ pageId = '*', - componentId = 'edit_comment_component', + componentId = '*', onClick = () => {}, - style, }: CancelButtonProps) => { - const theme = useTheme(); const elementId = 'cancel_button'; - const { formatMessage } = useIntl(); - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - const cancelButtonText = elementConfig?.cancel_button_text; - const backgroundColor = elementConfig?.background_color; - const cancelButton = elementConfig?.back_icon; - - if (isElementExcluded) return null; + const { accessibilityId, config, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); - const isRemoteImage = cancelButton && isValidHttpUrl(cancelButton); + if (isExcluded) return null; - return isRemoteImage ? ( - <StyledRemoteImageButton - src={cancelButton} - onClick={onClick} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - > - {formatMessage({ id: cancelButtonText })} - </StyledRemoteImageButton> - ) : ( - <Button variant="secondary">{formatMessage({ id: cancelButtonText })}</Button> + return ( + <button data-qa-anchor={accessibilityId} style={themeStyles} onClick={onClick}> + <Typography.Body className={styles.clearButton}>{config.cancel_button_text}</Typography.Body> + </button> ); }; diff --git a/src/v4/social/elements/CancelButton/index.tsx b/src/v4/social/elements/CancelButton/index.tsx new file mode 100644 index 000000000..43def476a --- /dev/null +++ b/src/v4/social/elements/CancelButton/index.tsx @@ -0,0 +1 @@ +export { CancelButton } from './CancelButton'; diff --git a/src/v4/social/elements/CancelButton/styles.tsx b/src/v4/social/elements/CancelButton/styles.tsx deleted file mode 100644 index 3e09de51f..000000000 --- a/src/v4/social/elements/CancelButton/styles.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import styled from 'styled-components'; - -export const StyledRemoteImageButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/ClearButton/ClearButton.module.css b/src/v4/social/elements/ClearButton/ClearButton.module.css new file mode 100644 index 000000000..b409458e9 --- /dev/null +++ b/src/v4/social/elements/ClearButton/ClearButton.module.css @@ -0,0 +1,8 @@ +.clearButton { + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + width: 1.5rem; + height: 1.5rem; +} diff --git a/src/v4/social/elements/ClearButton/ClearButton.stories.tsx b/src/v4/social/elements/ClearButton/ClearButton.stories.tsx new file mode 100644 index 000000000..42a0f70ab --- /dev/null +++ b/src/v4/social/elements/ClearButton/ClearButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { ClearButton } from './ClearButton'; + +export default { + title: 'v4-social/elements/ClearButton', +}; + +export const ClearButtonStory = { + render: () => { + return <ClearButton />; + }, + + name: 'ClearButton', +}; diff --git a/src/v4/social/elements/ClearButton/ClearButton.tsx b/src/v4/social/elements/ClearButton/ClearButton.tsx new file mode 100644 index 000000000..736bc6ff9 --- /dev/null +++ b/src/v4/social/elements/ClearButton/ClearButton.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +import styles from './ClearButton.module.css'; + +function ClearButtonSvg(props: React.SVGProps<SVGSVGElement>) { + return ( + <svg + width="18" + height="18" + viewBox="0 0 18 18" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M8.82715 17.3906C13.4238 17.3906 17.2119 13.5938 17.2119 9.00586C17.2119 4.40918 13.415 0.612305 8.82715 0.612305C4.23047 0.612305 0.442383 4.40918 0.442383 9.00586C0.442383 13.5938 4.23926 17.3906 8.82715 17.3906ZM5.88281 12.5479C5.54883 12.5479 5.28516 12.2842 5.28516 11.9502C5.28516 11.792 5.34668 11.6514 5.46973 11.5283L7.9834 9.01465L5.46973 6.49219C5.34668 6.37793 5.28516 6.22852 5.28516 6.07031C5.28516 5.74512 5.54883 5.49023 5.88281 5.49023C6.0498 5.49023 6.19043 5.54297 6.2959 5.66602L8.82715 8.17969L11.3584 5.65723C11.4902 5.52539 11.6221 5.47266 11.7803 5.47266C12.1055 5.47266 12.3691 5.73633 12.3691 6.06152C12.3691 6.22852 12.3164 6.36035 12.1934 6.4834L9.6709 9.01465L12.1846 11.5283C12.3076 11.6514 12.3691 11.7832 12.3691 11.9502C12.3691 12.2842 12.1055 12.5479 11.7627 12.5479C11.5957 12.5479 11.4551 12.4863 11.332 12.3721L8.82715 9.84961L6.32227 12.3721C6.19922 12.4863 6.0498 12.5479 5.88281 12.5479Z" /> + </svg> + ); +} + +interface ClearButtonProps { + pageId?: string; + componentId?: string; + defaultClassName?: string; + imgClassName?: string; + onPress?: () => void; +} + +export const ClearButton = ({ + pageId = '*', + componentId = '*', + defaultClassName, + imgClassName, + onPress = () => {}, +}: ClearButtonProps) => { + const elementId = 'clear_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <button data-qa-anchor={accessibilityId} className={styles.clearButton} style={themeStyles}> + <IconComponent + onPress={onPress} + defaultIcon={() => <ClearButtonSvg className={defaultClassName} />} + imgIcon={() => <img src={config.icon} alt={uiReference} className={imgClassName} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + </button> + ); +}; diff --git a/src/v4/social/elements/ClearButton/index.tsx b/src/v4/social/elements/ClearButton/index.tsx new file mode 100644 index 000000000..f8bef72ad --- /dev/null +++ b/src/v4/social/elements/ClearButton/index.tsx @@ -0,0 +1 @@ +export { ClearButton } from './ClearButton'; diff --git a/src/v4/social/elements/CloseButton/CloseButton.module.css b/src/v4/social/elements/CloseButton/CloseButton.module.css new file mode 100644 index 000000000..b2cfb2de1 --- /dev/null +++ b/src/v4/social/elements/CloseButton/CloseButton.module.css @@ -0,0 +1,28 @@ +.remoteImageButton { + width: 1.5rem; + height: 1.5rem; + cursor: pointer; + background-color: transparent; + border: none; + outline: none; + padding: var(--asc-spacing-none); + margin: var(--asc-spacing-none); + display: flex; + align-items: center; + justify-content: center; + + &:hover { + opacity: 0.8; + } + + &:active { + opacity: 0.6; + } +} + +.closeButton { + cursor: pointer; + fill: var(--asc-color-base-default); + width: 1.5rem; + height: 1.25rem; +} diff --git a/src/v4/social/elements/CloseButton/CloseButton.tsx b/src/v4/social/elements/CloseButton/CloseButton.tsx index bb2ab6ba4..ce4d1492e 100644 --- a/src/v4/social/elements/CloseButton/CloseButton.tsx +++ b/src/v4/social/elements/CloseButton/CloseButton.tsx @@ -1,42 +1,61 @@ import React from 'react'; +import styles from './CloseButton.module.css'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import clsx from 'clsx'; +import { IconComponent } from '~/v4/core/IconComponent'; -import { UICloseButton, UIRemoteImageButton } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +const CloseIconSVG = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="100%" + height="100%" + viewBox="0 0 320 512" + fill="currentColor" + {...props} + > + <path + d="M207.6 256l107.72-107.72c6.23-6.23 6.23-16.34 + 0-22.58l-25.03-25.03c-6.23-6.23-16.34-6.23-22.58 0L160 208.4 + 52.28 100.68c-6.23-6.23-16.34-6.23-22.58 0L4.68 125.7c-6.23 6.23-6.23 16.34 0 22.58L112.4 + 256 4.68 363.72c-6.23 6.23-6.23 16.34 0 22.58l25.03 25.03c6.23 6.23 16.34 6.23 22.58 0L160 + 303.6l107.72 107.72c6.23 6.23 16.34 6.23 22.58 0l25.03-25.03c6.23-6.23 6.23-16.34 + 0-22.58L207.6 256z" + /> + </svg> +); interface CloseButtonProps { - pageId: 'story_page'; - componentId: '*'; - onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; + pageId?: string; + componentId?: string; + onPress?: () => void; 'data-qa-anchor'?: string; + defaultClassName?: string; + imgClassName?: string; } export const CloseButton = ({ - pageId = 'story_page', + pageId = '*', componentId = '*', - onClick = () => {}, - style, - ...props + onPress = () => {}, + defaultClassName, + imgClassName, }: CloseButtonProps) => { const elementId = 'close_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - const closeIcon = elementConfig?.close_icon; - - if (isElementExcluded) return null; + const { isExcluded, config, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); - const isRemoteImage = closeIcon && isValidHttpUrl(closeIcon); + if (isExcluded) return null; - return isRemoteImage ? ( - <UIRemoteImageButton + return ( + <IconComponent + onPress={onPress} data-qa-anchor="close_button" - src={closeIcon} - onClick={onClick} - {...props} + defaultIcon={() => <CloseIconSVG className={clsx(styles.closeButton, defaultClassName)} />} + imgIcon={() => <img src={config.icon} alt={uiReference} className={imgClassName} />} + configIconName={config.icon} /> - ) : ( - <UICloseButton data-qa-anchor="close_button" name={'Close'} onClick={onClick} {...props} /> ); }; diff --git a/src/v4/social/elements/CloseButton/styles.tsx b/src/v4/social/elements/CloseButton/styles.tsx deleted file mode 100644 index a2b371f96..000000000 --- a/src/v4/social/elements/CloseButton/styles.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import styled from 'styled-components'; -import { Icon } from '~/v4/core/components'; - -export const UICloseButton = styled(Icon)<{ backgroundColor?: string }>` - cursor: pointer; - fill: #ffffff; - background-color: ${({ backgroundColor }) => backgroundColor}; -`; - -export const UIRemoteImageButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - background-color: transparent; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.module.css b/src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.module.css new file mode 100644 index 000000000..672ee479f --- /dev/null +++ b/src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.module.css @@ -0,0 +1,23 @@ +.commentBubbleDeletedBlock { + cursor: auto; +} + +.commentBubbleDeleted { + margin-left: 3.25rem; + display: inline-flex; + padding: 0.3125rem 0.75rem 0.3125rem 0.5rem; + justify-content: flex-start; + align-items: center; + gap: 0.625rem; + color: var(--asc-color-secondary-shade2); + background-color: var(--asc-color-base-shade4); + border-radius: 0.25rem; + margin-bottom: var(--asc-spacing-m1); +} + +.commentBubbleDeletedIcon { + cursor: auto; + width: 1rem; + height: 1rem; + fill: var(--asc-color-secondary-shade2); +} diff --git a/src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.tsx b/src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.tsx new file mode 100644 index 000000000..0feb50794 --- /dev/null +++ b/src/v4/social/elements/CommentBubbleDeleted/CommentBubbleDeleted.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import clsx from 'clsx'; +import { Typography } from '~/v4/core/components'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +import styles from './CommentBubbleDeleted.module.css'; + +const CommentBubbleDeletedSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="16" + height="16" + fill="none" + viewBox="0 0 16 16" + {...props} + > + <path d="M4.375 8.875A.361.361 0 014 8.5v-1a.38.38 0 01.375-.375h7.25c.188 0 .375.188.375.375v1a.38.38 0 01-.375.375h-7.25zM15.75 8A7.749 7.749 0 018 15.75 7.749 7.749 0 01.25 8 7.749 7.749 0 018 .25 7.749 7.749 0 0115.75 8zm-1.5 0c0-3.438-2.813-6.25-6.25-6.25A6.248 6.248 0 001.75 8 6.228 6.228 0 008 14.25 6.248 6.248 0 0014.25 8z"></path> + </svg> +); + +interface CommentBubbleDeletedProps { + pageId?: string; + componentId?: string; + defaultIconClassName?: string; + imgIconClassName?: string; +} + +export function CommentBubbleDeleted({ + pageId = '*', + componentId = '*', + defaultIconClassName, + imgIconClassName, +}: CommentBubbleDeletedProps) { + const elementId = 'comment_bubble_deleted_view'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + className={clsx(styles.commentBubbleDeletedBlock)} + defaultIcon={() => ( + <div + className={clsx(styles.commentBubbleDeleted, defaultIconClassName)} + data-qa-anchor={accessibilityId} + > + <CommentBubbleDeletedSvg + className={clsx(styles.commentBubbleDeletedIcon, defaultIconClassName)} + /> + <Typography.Caption>{config.text}</Typography.Caption> + </div> + )} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgIconClassName)} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + ); +} diff --git a/src/v4/social/elements/CommentBubbleDeleted/index.ts b/src/v4/social/elements/CommentBubbleDeleted/index.ts new file mode 100644 index 000000000..dbcb2574a --- /dev/null +++ b/src/v4/social/elements/CommentBubbleDeleted/index.ts @@ -0,0 +1 @@ +export { CommentBubbleDeleted } from './CommentBubbleDeleted'; diff --git a/src/v4/social/elements/CommentButton/CommentButton.module.css b/src/v4/social/elements/CommentButton/CommentButton.module.css index 29c15780b..c0e03d3c4 100644 --- a/src/v4/social/elements/CommentButton/CommentButton.module.css +++ b/src/v4/social/elements/CommentButton/CommentButton.module.css @@ -1,27 +1,15 @@ -.uiCommentButton { - font-family: "Inter"; - font-weight: var(--asc-text-font-weight-bold); - color: var(--asc-color-white); +.commentButton { display: flex; align-items: center; - justify-content: space-between; - gap: var(--asc-spacing-xxs2); - border-radius: 1.5rem; - padding: var(--asc-spacing-s1) var(--asc-spacing-s2); - background-color: var(--asc-color-base-default); + justify-content: start; + gap: 0.25rem; cursor: pointer; - border: none; } -.uiRemoteImageButton { - width: var(--asc-spacing-m3); - height: var(--asc-spacing-m3); - cursor: pointer; - border: none; - outline: none; - padding: var(--asc-spacing-none); - margin: var(--asc-spacing-none); - display: flex; - align-items: center; - justify-content: center; +.commentButton__icon { + fill: var(--asc-color-base-shade2); +} + +.commentButton__text { + color: var(--asc-color-base-shade2); } diff --git a/src/v4/social/elements/CommentButton/CommentButton.stories.tsx b/src/v4/social/elements/CommentButton/CommentButton.stories.tsx new file mode 100644 index 000000000..8bc4fe5ca --- /dev/null +++ b/src/v4/social/elements/CommentButton/CommentButton.stories.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { CommentButton } from './CommentButton'; + +export default { + title: 'v4-social/elements/CommentButton', +}; + +export const CommentButtonStory = { + render: () => { + return ( + <div style={{ height: 200, display: 'flex', flexDirection: 'column', justifyContent: 'end' }}> + <CommentButton /> + </div> + ); + }, + + name: 'CommentButton', +}; diff --git a/src/v4/social/elements/CommentButton/CommentButton.tsx b/src/v4/social/elements/CommentButton/CommentButton.tsx index 447b1a543..e8f3d873e 100644 --- a/src/v4/social/elements/CommentButton/CommentButton.tsx +++ b/src/v4/social/elements/CommentButton/CommentButton.tsx @@ -1,63 +1,68 @@ import React from 'react'; -import { Icon } from '~/v4/core/components'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; -import { isValidHttpUrl } from '~/utils'; -import { useTheme } from 'styled-components'; +import clsx from 'clsx'; +import { Typography } from '~/v4/core/components'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + import styles from './CommentButton.module.css'; -interface ReactButtonProps { - pageId: 'story_page'; - componentId: '*'; - onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; - children?: React.ReactNode; - 'data-qa-anchor'?: string; +const CommentSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="18" + height="16" + viewBox="0 0 18 16" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M9 0.1875C13.6816 0.1875 17.4668 3.30859 17.4668 7.09375C17.4668 10.9121 13.6816 14 9 14C7.9043 14 6.8418 13.834 5.91211 13.5352C4.91602 14.2324 3.32227 15.0625 1.29688 15.0625C0.964844 15.0625 0.666016 14.8965 0.533203 14.5977C0.433594 14.2988 0.466797 13.9668 0.699219 13.7344C0.732422 13.7344 1.76172 12.6055 2.22656 11.3105C1.13086 10.1484 0.5 8.6875 0.5 7.09375C0.5 3.30859 4.28516 0.1875 9 0.1875ZM9 12.4062C12.7852 12.4062 15.9062 10.0488 15.9062 7.09375C15.9062 4.17188 12.7852 1.78125 9 1.78125C5.18164 1.78125 2.09375 4.17188 2.09375 7.09375C2.09375 8.52148 2.79102 9.58398 3.38867 10.2148L4.08594 10.9453L3.7207 11.875C3.55469 12.3398 3.32227 12.8047 3.05664 13.2031C3.85352 12.9375 4.51758 12.5723 4.98242 12.2402L5.61328 11.7754L6.37695 12.0078C7.20703 12.2734 8.10352 12.4062 9 12.4062Z" /> + </svg> +); + +interface CommentButtonProps { + pageId?: string; + componentId?: string; + commentsCount?: number; + className?: string; + defaultIconClassName?: string; + imgIconClassName?: string; + onPress?: () => void; } -export const CommentButton = ({ - pageId = 'story_page', +export function CommentButton({ + pageId = '*', componentId = '*', - onClick = () => {}, - style, - children, - ...props -}: ReactButtonProps) => { - const theme = useTheme(); - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/*/story_comment_button`); - const isElementExcluded = isExcluded(`${pageId}/*/story_comment_button`); - const backgroundColor = elementConfig?.background_color; - const commentIcon = elementConfig?.comment_icon; + commentsCount, + className = '', + defaultIconClassName, + imgIconClassName, + onPress = () => {}, +}: CommentButtonProps) { + const elementId = 'comment_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); - if (isElementExcluded) return null; + if (isExcluded) return null; - const isRemoteImage = commentIcon && isValidHttpUrl(commentIcon); - - return isRemoteImage ? ( - <img - data-qa-anchor="comment_button" - src={commentIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - className={styles.uiRemoteImageButton} - {...props} + return ( + <IconComponent + className={clsx(className)} + data-qa-anchor={accessibilityId} + onPress={onPress} + defaultIcon={() => ( + <div className={clsx(styles.commentButton)}> + <CommentSvg className={clsx(styles.commentButton__icon, defaultIconClassName)} /> + <Typography.BodyBold className={styles.commentButton__text}> + {typeof commentsCount === 'number' ? commentsCount : config.text} + </Typography.BodyBold> + </div> + )} + imgIcon={() => <img src={config.icon} alt={uiReference} className={imgIconClassName} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} /> - ) : ( - <button - data-qa-anchor="comment_button" - onClick={onClick} - className={styles.uiCommentButton} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - {...props} - > - <Icon name={commentIcon === 'comment' ? commentIcon : 'Comment2Icon'} /> - <span data-qa-anchor="comment_button_text_view">{children}</span> - </button> ); -}; +} diff --git a/src/v4/social/elements/CommentButton/index.tsx b/src/v4/social/elements/CommentButton/index.tsx new file mode 100644 index 000000000..6687c1292 --- /dev/null +++ b/src/v4/social/elements/CommentButton/index.tsx @@ -0,0 +1 @@ +export { CommentButton } from './CommentButton'; diff --git a/src/v4/social/elements/CommunityAvatar/CommunityAvatar.module.css b/src/v4/social/elements/CommunityAvatar/CommunityAvatar.module.css new file mode 100644 index 000000000..9c7123e80 --- /dev/null +++ b/src/v4/social/elements/CommunityAvatar/CommunityAvatar.module.css @@ -0,0 +1,31 @@ +.communityAvatar__text { + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + color: var(--asc-color-base-shade4); + background-color: var(--asc-color-secondary-shade2); + text-transform: uppercase; + width: 2.5rem; + height: 2.5rem; +} + +.communityAvatar__placeholder__path { + fill: var(--asc-color-white); +} + +.communityAvatar__placeholder__rect { + fill: var(--asc-color-primary-shade3); +} + +.communityAvatar__placeholder { + width: 2.5rem; + height: 2.5rem; +} + +.communityAvatar__image { + border-radius: 50%; + object-fit: cover; + width: 2.5rem; + height: 2.5rem; +} diff --git a/src/v4/social/elements/CommunityAvatar/CommunityAvatar.stories.tsx b/src/v4/social/elements/CommunityAvatar/CommunityAvatar.stories.tsx new file mode 100644 index 000000000..fd2ed883e --- /dev/null +++ b/src/v4/social/elements/CommunityAvatar/CommunityAvatar.stories.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import useOneCommunity from '~/mock/useOneCommunity'; + +import { CommunityAvatar } from './CommunityAvatar'; + +export default { + title: 'v4-social/elements/CommunityAvatar', +}; + +export const CommunityAvatarStory = { + render: () => { + const [community, isLoading] = useOneCommunity(); + + if (community == null || isLoading) { + return null; + } + + return <CommunityAvatar community={community} />; + }, + + name: 'CommunityAvatar', +}; diff --git a/src/v4/social/elements/CommunityAvatar/CommunityAvatar.tsx b/src/v4/social/elements/CommunityAvatar/CommunityAvatar.tsx new file mode 100644 index 000000000..6c1015b50 --- /dev/null +++ b/src/v4/social/elements/CommunityAvatar/CommunityAvatar.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import useImage from '~/core/hooks/useImage'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './CommunityAvatar.module.css'; + +const CommunityAvatarSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="64" + height="64" + viewBox="0 0 64 64" + fill="none" + className={styles.communityAvatar__placeholder} + {...props} + > + <rect width="64" height="64" rx="32" className={styles.communityAvatar__placeholder__rect} /> + <path + d="M31.7539 19.2C33.2201 19.2 34.6262 19.7696 35.6629 20.7836C36.6997 21.7976 37.2821 23.1728 37.2821 24.6068C37.2821 26.0408 36.6997 27.4161 35.6629 28.4301C34.6262 29.4441 33.2201 30.0137 31.7539 30.0137C30.2877 30.0137 28.8816 29.4441 27.8449 28.4301C26.8081 27.4161 26.2257 26.0408 26.2257 24.6068C26.2257 23.1728 26.8081 21.7976 27.8449 20.7836C28.8816 19.7696 30.2877 19.2 31.7539 19.2ZM20.6975 23.062C21.582 23.062 22.4033 23.2937 23.1141 23.7108C22.8772 25.92 23.5406 28.1136 24.8989 29.8284C24.1092 31.3114 22.5297 32.331 20.6975 32.331C19.4408 32.331 18.2355 31.8427 17.3469 30.9736C16.4583 30.1044 15.959 28.9256 15.959 27.6965C15.959 26.4674 16.4583 25.2886 17.3469 24.4194C18.2355 23.5503 19.4408 23.062 20.6975 23.062ZM42.8103 23.062C44.067 23.062 45.2723 23.5503 46.1609 24.4194C47.0495 25.2886 47.5488 26.4674 47.5488 27.6965C47.5488 28.9256 47.0495 30.1044 46.1609 30.9736C45.2723 31.8427 44.067 32.331 42.8103 32.331C40.9781 32.331 39.3986 31.3114 38.6089 29.8284C39.9672 28.1136 40.6306 25.92 40.3937 23.7108C41.1045 23.2937 41.9258 23.062 42.8103 23.062ZM21.4872 38.8965C21.4872 35.6987 26.0835 33.1034 31.7539 33.1034C37.4243 33.1034 42.0206 35.6987 42.0206 38.8965V41.5999H21.4872V38.8965ZM12.8 41.5999V39.2827C12.8 37.1354 15.7853 35.3279 19.8288 34.8027C18.8969 35.8532 18.3283 37.3053 18.3283 38.8965V41.5999H12.8ZM50.7077 41.5999H45.1795V38.8965C45.1795 37.3053 44.6109 35.8532 43.679 34.8027C47.7225 35.3279 50.7077 37.1354 50.7077 39.2827V41.5999Z" + className={styles.communityAvatar__placeholder__path} + /> + </svg> +); + +export interface CommunityAvatarProps { + pageId?: string; + componentId?: string; + community?: Amity.Community | null; +} + +export function CommunityAvatar({ + pageId = '*', + componentId = '*', + community, +}: CommunityAvatarProps) { + const elementId = 'community_avatar'; + const { accessibilityId, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const avatarFile = useImage({ fileId: community?.avatarFileId }); + + if (isExcluded) return null; + + if (avatarFile == null) return <CommunityAvatarSvg style={themeStyles} />; + + return ( + <object + data={avatarFile} + type="image/png" + className={styles.communityAvatar__image} + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <CommunityAvatarSvg /> + </object> + ); +} diff --git a/src/v4/social/elements/CommunityAvatar/index.tsx b/src/v4/social/elements/CommunityAvatar/index.tsx new file mode 100644 index 000000000..44bbbb136 --- /dev/null +++ b/src/v4/social/elements/CommunityAvatar/index.tsx @@ -0,0 +1 @@ +export { CommunityAvatar } from './CommunityAvatar'; diff --git a/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.module.css b/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.module.css new file mode 100644 index 000000000..496881b71 --- /dev/null +++ b/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.module.css @@ -0,0 +1,9 @@ +.communityCategoryName { + display: flex; + padding: 0 0.5rem; + justify-content: center; + align-items: center; + border-radius: 1.25rem; + background-color: var(--asc-color-base-shade4); + color: var(--asc-color-base-default); +} diff --git a/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.stories.tsx b/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.stories.tsx new file mode 100644 index 000000000..5c21e9fc7 --- /dev/null +++ b/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CommunityCategoryName } from './CommunityCategoryName'; + +export default { + title: 'v4-social/elements/CommunityCategoryName', +}; + +export const CreateCommunityButtonStory = { + render: () => { + return <CommunityCategoryName categoryName="pet" />; + }, + + name: 'CommunityCategoryName', +}; diff --git a/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.tsx b/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.tsx new file mode 100644 index 000000000..b4d41b8bd --- /dev/null +++ b/src/v4/social/elements/CommunityCategoryName/CommunityCategoryName.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import styles from './CommunityCategoryName.module.css'; + +export interface CommunityCategoryNameProps { + pageId?: string; + componentId?: string; + categoryName: string; +} + +export function CommunityCategoryName({ + pageId = '*', + componentId = '*', + categoryName, +}: CommunityCategoryNameProps) { + const elementId = 'community_category_name'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <div + className={styles.communityCategoryName} + style={themeStyles} + data-qa-anchor={accessibilityId} + > + <Typography.Caption>{categoryName}</Typography.Caption> + </div> + ); +} diff --git a/src/v4/social/elements/CommunityCategoryName/index.tsx b/src/v4/social/elements/CommunityCategoryName/index.tsx new file mode 100644 index 000000000..cac5ecdc8 --- /dev/null +++ b/src/v4/social/elements/CommunityCategoryName/index.tsx @@ -0,0 +1 @@ +export { CommunityCategoryName } from './CommunityCategoryName'; diff --git a/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.module.css b/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.module.css new file mode 100644 index 000000000..abb86cb37 --- /dev/null +++ b/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.module.css @@ -0,0 +1,7 @@ +.communityDisplayName { + color: var(--asc-color-base-default); + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.stories.tsx b/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.stories.tsx new file mode 100644 index 000000000..fd3d0ca48 --- /dev/null +++ b/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.stories.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import useOneCommunity from '~/mock/useOneCommunity'; + +import { CommunityDisplayName } from './CommunityDisplayName'; + +export default { + title: 'v4-social/elements/CommunityDisplayName', +}; + +export const CreateCommunityButtonStory = { + render: () => { + const [community] = useOneCommunity(); + + if (community == null) { + return null; + } + + return <CommunityDisplayName community={community} />; + }, + + name: 'CommunityDisplayName', +}; diff --git a/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.tsx b/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.tsx new file mode 100644 index 000000000..6fbbe19a6 --- /dev/null +++ b/src/v4/social/elements/CommunityDisplayName/CommunityDisplayName.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './CommunityDisplayName.module.css'; + +export interface CommunityDisplayNameProps { + pageId?: string; + componentId?: string; + community: Amity.Community; +} + +export function CommunityDisplayName({ + pageId = '*', + componentId = '*', + community, +}: CommunityDisplayNameProps) { + const elementId = 'community_display_name'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <Typography.BodyBold + className={styles.communityDisplayName} + style={themeStyles} + data-qa-anchor={accessibilityId} + > + {community.displayName} + </Typography.BodyBold> + ); +} diff --git a/src/v4/social/elements/CommunityDisplayName/index.tsx b/src/v4/social/elements/CommunityDisplayName/index.tsx new file mode 100644 index 000000000..c833c7882 --- /dev/null +++ b/src/v4/social/elements/CommunityDisplayName/index.tsx @@ -0,0 +1 @@ +export { CommunityDisplayName } from './CommunityDisplayName'; diff --git a/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.module.css b/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.module.css new file mode 100644 index 000000000..31d624bc9 --- /dev/null +++ b/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.module.css @@ -0,0 +1,3 @@ +.communityMembersCount { + color: var(--asc-color-base-shade1); +} diff --git a/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.stories.tsx b/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.stories.tsx new file mode 100644 index 000000000..c5ccf2760 --- /dev/null +++ b/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CommunityMembersCount } from './CommunityMembersCount'; + +export default { + title: 'v4-social/elements/CommunityMembersCount', +}; + +export const CreateCommunityButtonStory = { + render: () => { + return <CommunityMembersCount memberCount={20} />; + }, + + name: 'CommunityMembersCount', +}; diff --git a/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.tsx b/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.tsx new file mode 100644 index 000000000..71e8f65aa --- /dev/null +++ b/src/v4/social/elements/CommunityMembersCount/CommunityMembersCount.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './CommunityMembersCount.module.css'; + +import millify from 'millify'; + +export interface CommunityMembersCountProps { + pageId?: string; + componentId?: string; + memberCount: number; +} + +export function CommunityMembersCount({ + pageId = '*', + componentId = '*', + memberCount, +}: CommunityMembersCountProps) { + const elementId = 'community_members_count'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <Typography.Caption + className={styles.communityMembersCount} + style={themeStyles} + data-qa-anchor={accessibilityId} + >{`${millify(memberCount) || 0} ${ + memberCount !== 1 ? 'members' : 'member' + }`}</Typography.Caption> + ); +} diff --git a/src/v4/social/elements/CommunityMembersCount/index.tsx b/src/v4/social/elements/CommunityMembersCount/index.tsx new file mode 100644 index 000000000..1f19cafe9 --- /dev/null +++ b/src/v4/social/elements/CommunityMembersCount/index.tsx @@ -0,0 +1 @@ +export { CommunityMembersCount } from './CommunityMembersCount'; diff --git a/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.module.css b/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.module.css new file mode 100644 index 000000000..3946c5819 --- /dev/null +++ b/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.module.css @@ -0,0 +1,8 @@ +.communityOfficialBadge { + width: 1.25rem; + height: 1.25rem; +} + +.communityOfficialBadge__iconSvg { + fill: var(--asc-color-primary-default); +} diff --git a/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.stories.tsx b/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.stories.tsx new file mode 100644 index 000000000..cea3e8e12 --- /dev/null +++ b/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CommunityOfficialBadge } from './CommunityOfficialBadge'; + +export default { + title: 'v4-social/elements/CommunityOfficialBadge', +}; + +export const CreateCommunityButtonStory = { + render: () => { + return <CommunityOfficialBadge />; + }, + + name: 'CommunityOfficialBadge', +}; diff --git a/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.tsx b/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.tsx new file mode 100644 index 000000000..caa4b526a --- /dev/null +++ b/src/v4/social/elements/CommunityOfficialBadge/CommunityOfficialBadge.tsx @@ -0,0 +1,60 @@ +import clsx from 'clsx'; +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import styles from './CommunityOfficialBadge.module.css'; + +const OfficialBadgeIconSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="21" + height="20" + viewBox="0 0 21 20" + fill="none" + {...props} + > + <path d="M9.58112 15.4777C10.2749 16.1767 10.9373 16.1715 11.6363 15.4777L12.4188 14.6953C12.4918 14.6223 12.5544 14.6014 12.6483 14.6014H13.7541C14.74 14.6014 15.2095 14.1319 15.2095 13.1461V12.0402C15.2095 11.9463 15.2355 11.8785 15.3034 11.8107L16.0858 11.023C16.7848 10.3293 16.7796 9.66681 16.0858 8.97305L15.3034 8.19061C15.2355 8.11758 15.2095 8.05499 15.2095 7.9611V6.85525C15.2095 5.86938 14.74 5.39991 13.7541 5.39991H12.6483C12.5544 5.39991 12.4866 5.37383 12.4188 5.30602L11.6363 4.52358C10.9373 3.82461 10.2749 3.82461 9.58112 4.5288L8.79868 5.30602C8.73087 5.37383 8.66306 5.39991 8.56917 5.39991H7.46332C6.47745 5.39991 6.00799 5.85894 6.00799 6.85525V7.9611C6.00799 8.05499 5.9819 8.1228 5.91409 8.19061L5.13165 8.97305C4.43268 9.66681 4.43789 10.3293 5.13165 11.023L5.91409 11.8107C5.9819 11.8785 6.00799 11.9463 6.00799 12.0402V13.1461C6.00799 14.1319 6.47745 14.6014 7.46332 14.6014H8.56917C8.66306 14.6014 8.72565 14.6223 8.79868 14.6953L9.58112 15.4777ZM9.74282 12.6714C9.56026 12.6714 9.4142 12.6036 9.29944 12.4836L7.63024 10.6162C7.54156 10.5223 7.49462 10.3919 7.49462 10.2615C7.49462 9.94849 7.71892 9.72419 8.04232 9.72419C8.21968 9.72419 8.35008 9.78157 8.46484 9.90676L9.72196 11.3099L12.2362 7.72115C12.3614 7.5438 12.497 7.47077 12.7057 7.47077C13.0291 7.47077 13.2586 7.69507 13.2586 7.99761C13.2586 8.10193 13.2169 8.23234 13.1386 8.34188L10.2123 12.4471C10.0923 12.6036 9.93583 12.6714 9.74282 12.6714Z" /> + </svg> +); + +export interface CommunityOfficialBadgeProps { + pageId?: string; + componentId?: string; +} + +export function CommunityOfficialBadge({ + pageId = '*', + componentId = '*', +}: CommunityOfficialBadgeProps) { + const elementId = 'community_official_badge'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIcon={() => ( + <OfficialBadgeIconSvg + style={themeStyles} + className={clsx(styles.communityOfficialBadge, styles.communityOfficialBadge__iconSvg)} + data-qa-anchor={accessibilityId} + /> + )} + imgIcon={() => ( + <img + data-qa-anchor={accessibilityId} + src={config.icon} + alt={uiReference} + className={styles.communityOfficialBadge} + /> + )} + configIconName={config.icon} + defaultIconName={defaultConfig.icon} + /> + ); +} diff --git a/src/v4/social/elements/CommunityOfficialBadge/index.tsx b/src/v4/social/elements/CommunityOfficialBadge/index.tsx new file mode 100644 index 000000000..0fef3fd4b --- /dev/null +++ b/src/v4/social/elements/CommunityOfficialBadge/index.tsx @@ -0,0 +1 @@ +export { CommunityOfficialBadge } from './CommunityOfficialBadge'; diff --git a/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.module.css b/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.module.css new file mode 100644 index 000000000..abdbafa04 --- /dev/null +++ b/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.module.css @@ -0,0 +1,8 @@ +.communityPrivateBadge { + width: 1.25rem; + height: 0.6875rem; +} + +.communityPrivateBadge__iconSvg { + fill: var(--asc-color-base-default); +} diff --git a/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.stories.tsx b/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.stories.tsx new file mode 100644 index 000000000..bce2a9e9b --- /dev/null +++ b/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CommunityPrivateBadge } from './CommunityPrivateBadge'; + +export default { + title: 'v4-social/elements/CommunityPrivateBadge', +}; + +export const CreateCommunityButtonStory = { + render: () => { + return <CommunityPrivateBadge />; + }, + + name: 'CommunityPrivateBadge', +}; diff --git a/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.tsx b/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.tsx new file mode 100644 index 000000000..2242b3b7c --- /dev/null +++ b/src/v4/social/elements/CommunityPrivateBadge/CommunityPrivateBadge.tsx @@ -0,0 +1,60 @@ +import clsx from 'clsx'; +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import styles from './CommunityPrivateBadge.module.css'; + +const PrivateIconSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="11" + height="12" + viewBox="0 0 11 12" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M5.60938 9.72656C5.26562 9.72656 5.00781 9.46875 5.00781 9.125V7.75C5.00781 7.42773 5.26562 7.14844 5.60938 7.14844C5.93164 7.14844 6.21094 7.42773 6.21094 7.75V9.125C6.21094 9.46875 5.93164 9.72656 5.60938 9.72656ZM10.4219 6.03125V10.8438C10.4219 11.4238 9.94922 11.875 9.39062 11.875H1.82812C1.24805 11.875 0.796875 11.4238 0.796875 10.8438V6.03125C0.796875 5.47266 1.24805 5 1.82812 5H2.51562V3.96875C2.51562 2.27148 3.89062 0.875 5.60938 0.875C7.32812 0.896484 8.70312 2.29297 8.70312 4.01172V5H9.39062C9.94922 5 10.4219 5.47266 10.4219 6.03125ZM3.54688 5H7.67188V3.96875C7.67188 2.85156 6.72656 1.90625 5.60938 1.90625C4.4707 1.90625 3.54688 2.85156 3.54688 3.96875V5ZM9.39062 6.03125H1.82812V10.8438H9.39062V6.03125Z" /> + </svg> +); + +export interface CommunityPrivateBadgeProps { + pageId?: string; + componentId?: string; +} + +export function CommunityPrivateBadge({ + pageId = '*', + componentId = '*', +}: CommunityPrivateBadgeProps) { + const elementId = 'community_private_badge'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIcon={() => ( + <PrivateIconSvg + style={themeStyles} + className={clsx(styles.communityPrivateBadge, styles.communityPrivateBadge__iconSvg)} + data-qa-anchor={accessibilityId} + /> + )} + imgIcon={() => ( + <img + data-qa-anchor={accessibilityId} + src={config.icon} + alt={uiReference} + className={styles.communityPrivateBadge} + /> + )} + configIconName={config.icon} + defaultIconName={defaultConfig.icon} + /> + ); +} diff --git a/src/v4/social/elements/CommunityPrivateBadge/index.tsx b/src/v4/social/elements/CommunityPrivateBadge/index.tsx new file mode 100644 index 000000000..472020732 --- /dev/null +++ b/src/v4/social/elements/CommunityPrivateBadge/index.tsx @@ -0,0 +1 @@ +export { CommunityPrivateBadge } from './CommunityPrivateBadge'; diff --git a/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.module.css b/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.module.css new file mode 100644 index 000000000..ef9201772 --- /dev/null +++ b/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.module.css @@ -0,0 +1,9 @@ +.createCommunityButton { + display: flex; + padding: 0.625rem 1rem; + justify-content: center; + align-items: center; + border-radius: 0.25rem; + border: 0 solid var(--asc-color-secondary-shade3); + color: var(--asc-color-primary-default); +} diff --git a/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.stories.tsx b/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.stories.tsx new file mode 100644 index 000000000..62b983f66 --- /dev/null +++ b/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CreateCommunityButton } from './CreateCommunityButton'; + +export default { + title: 'v4-social/elements/CreateCommunityButton', +}; + +export const CreateCommunityButtonStory = { + render: () => { + return <CreateCommunityButton onClick={() => console.log('CreateCommunityButton clicked')} />; + }, + + name: 'CreateCommunityButton', +}; diff --git a/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.tsx b/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.tsx new file mode 100644 index 000000000..c6936410b --- /dev/null +++ b/src/v4/social/elements/CreateCommunityButton/CreateCommunityButton.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import styles from './CreateCommunityButton.module.css'; + +export interface CreateCommunityButtonProps { + pageId?: string; + componentId?: string; + onClick: () => void; +} + +export function CreateCommunityButton({ + pageId = '*', + componentId = '*', + onClick, +}: CreateCommunityButtonProps) { + const elementId = 'create_community_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <div + className={styles.createCommunityButton} + onClick={() => onClick()} + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <IconComponent + defaultIcon={() => <></>} + imgIcon={() => <img src={config.icon} alt={uiReference} />} + configIconName={config.icon} + defaultIconName={defaultConfig.icon} + /> + <Typography.Body>{config.text}</Typography.Body> + </div> + ); +} diff --git a/src/v4/social/elements/CreateCommunityButton/index.tsx b/src/v4/social/elements/CreateCommunityButton/index.tsx new file mode 100644 index 000000000..104d3e632 --- /dev/null +++ b/src/v4/social/elements/CreateCommunityButton/index.tsx @@ -0,0 +1 @@ +export { CreateCommunityButton } from './CreateCommunityButton'; diff --git a/src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.module.css b/src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.module.css new file mode 100644 index 000000000..def70d8a3 --- /dev/null +++ b/src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.module.css @@ -0,0 +1,15 @@ +.createLivestreamButton { + display: flex; + padding: 0.75rem 0; +} + +.createLivestreamButton__text { + margin-left: 0.5rem; + color: var(--asc-color-base-default); +} + +.createLivestreamButton__icon { + fill: var(--asc-color-base-default); + width: 1.25rem; + height: 1.25rem; +} diff --git a/src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.tsx b/src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.tsx new file mode 100644 index 000000000..737211490 --- /dev/null +++ b/src/v4/social/elements/CreateLivestreamButton/CreateLivestreamButton.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { Typography } from '~/v4/core/components'; +import styles from './CreateLivestreamButton.module.css'; +import clsx from 'clsx'; + +const CreateLivestreamButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="21" + height="20" + viewBox="0 0 21 20" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M6.91406 6.80469C7.01953 6.875 7.08984 7.05078 7.08984 7.19141C7.08984 7.29688 7.05469 7.4375 6.98438 7.50781C6.42188 8.17578 6 9.40625 6 10.25C6 11.1289 6.42188 12.3594 6.98438 13.0273C7.05469 13.0977 7.08984 13.2383 7.08984 13.3438C7.08984 13.4844 7.01953 13.6602 6.91406 13.7305L6.52734 14.1172C6.42188 14.2227 6.24609 14.293 6.14062 14.293C5.96484 14.293 5.78906 14.1875 5.68359 14.082C4.91016 13.168 4.27734 11.4453 4.27734 10.25C4.27734 9.08984 4.91016 7.36719 5.68359 6.45312C5.78906 6.34766 5.96484 6.24219 6.14062 6.24219C6.24609 6.24219 6.42188 6.3125 6.52734 6.41797L6.91406 6.80469ZM4.13672 4.0625C4.34766 4.27344 4.34766 4.58984 4.13672 4.83594C2.97656 6.10156 2.0625 8.5625 2.0625 10.2852C2.0625 12.0078 2.97656 14.4336 4.13672 15.6992C4.34766 15.9453 4.34766 16.2617 4.13672 16.4727L3.75 16.8594C3.64453 16.9648 3.46875 17.0352 3.32812 17.0352C3.1875 17.0352 3.01172 16.9297 2.90625 16.8242C1.25391 14.9961 0.375 12.7109 0.375 10.25C0.375 7.82422 1.25391 5.50391 2.90625 3.71094C3.01172 3.60547 3.1875 3.53516 3.32812 3.53516C3.46875 3.53516 3.64453 3.60547 3.75 3.67578L4.13672 4.0625ZM18.0586 3.71094C19.7109 5.50391 20.625 7.82422 20.625 10.25C20.625 12.7109 19.7109 14.9961 18.0586 16.8242C17.9531 16.9297 17.7773 17 17.6367 17C17.4961 17 17.3203 16.9297 17.25 16.8594L16.8281 16.4727C16.6172 16.2617 16.6172 15.9453 16.8281 15.6992C17.9883 14.4336 18.9023 12.0078 18.9023 10.2852C18.9023 8.52734 17.9883 6.10156 16.8281 4.83594C16.6172 4.58984 16.6172 4.27344 16.8281 4.0625L17.25 3.67578C17.3203 3.57031 17.4961 3.5 17.6367 3.5C17.7773 3.5 17.9531 3.60547 18.0586 3.71094ZM10.5 8.28125C11.5547 8.28125 12.4688 9.19531 12.4688 10.25C12.4688 11.3398 11.5547 12.2188 10.5 12.2188C9.41016 12.2188 8.53125 11.3398 8.53125 10.25C8.53125 9.19531 9.41016 8.28125 10.5 8.28125ZM14.4375 6.41797C14.543 6.3125 14.7188 6.24219 14.8242 6.24219C15 6.24219 15.1758 6.34766 15.2812 6.45312C16.0547 7.36719 16.6875 9.08984 16.6875 10.25C16.6875 11.4453 16.0547 13.168 15.2812 14.082C15.1758 14.1875 15 14.293 14.8242 14.293C14.7188 14.293 14.543 14.2227 14.4375 14.1172L14.0508 13.7305C13.9453 13.6602 13.875 13.4844 13.875 13.3438C13.875 13.2383 13.9102 13.0977 13.9805 13.0273C14.543 12.3594 14.9648 11.1289 14.9648 10.25C14.9648 9.40625 14.543 8.17578 13.9805 7.50781C13.9102 7.4375 13.875 7.29688 13.875 7.19141C13.875 7.05078 13.9453 6.875 14.0508 6.80469L14.4375 6.41797Z" /> + </svg> +); + +interface CreateLivestreamButtonProps { + pageId?: string; + componentId: string; + onClick?: (e: React.MouseEvent) => void; + defaultClassName?: string; +} + +export function CreateLivestreamButton({ + pageId = '*', + componentId = '*', + onClick, + defaultClassName, +}: CreateLivestreamButtonProps) { + const elementId = 'create_livestream_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + return ( + <div + className={styles.createLivestreamButton} + onClick={() => {}} //TODO : Add event create livestream + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <IconComponent + defaultIcon={() => ( + <CreateLivestreamButtonSvg + className={clsx(styles.createLivestreamButton__icon, defaultClassName)} + /> + )} + imgIcon={() => <img src={config.image} alt={uiReference} />} + configIconName={config.image} + defaultIconName={defaultConfig.image} + /> + <Typography.Body className={styles.createLivestreamButton__text}> + {config.text} + </Typography.Body> + </div> + ); +} + +export default CreateLivestreamButton; diff --git a/src/v4/social/elements/CreateLivestreamButton/index.tsx b/src/v4/social/elements/CreateLivestreamButton/index.tsx new file mode 100644 index 000000000..9bbc187b0 --- /dev/null +++ b/src/v4/social/elements/CreateLivestreamButton/index.tsx @@ -0,0 +1 @@ +export { CreateLivestreamButton } from './CreateLivestreamButton'; diff --git a/src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.module.css b/src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.module.css new file mode 100644 index 000000000..b4c87e34a --- /dev/null +++ b/src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.module.css @@ -0,0 +1,7 @@ +.createNewStoryIcon { + position: absolute; + bottom: 0; + right: 0; + width: 1rem; + height: 1rem; +} diff --git a/src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.tsx b/src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.tsx new file mode 100644 index 000000000..4ffb62af4 --- /dev/null +++ b/src/v4/social/elements/CreateNewStoryButton/CreateNewStoryButton.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import clsx from 'clsx'; + +import styles from './CreateNewStoryButton.module.css'; + +const CreateNewStoryButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="16" + height="16" + fill="none" + viewBox="0 0 16 16" + {...props} + > + <circle cx="8" cy="8" r="7.25" fill="#1054DE" stroke="#fff" strokeWidth="1.5"></circle> + <path + fill="#fff" + d="M11.438 7.625c.156 0 .312.156.312.313v.625a.321.321 0 01-.313.312H8.626v2.813a.321.321 0 01-.313.312h-.624a.308.308 0 01-.313-.313V8.876H4.562a.309.309 0 01-.312-.313v-.624c0-.157.137-.313.313-.313h2.812V4.812c0-.156.137-.312.313-.312h.625c.156 0 .312.156.312.313v2.812h2.813z" + ></path> + </svg> +); + +interface CreateNewStoryProps { + pageId?: string; + componentId?: string; + defaultClassName?: string; + imgClassName?: string; + onPress?: () => void; +} + +export const CreateNewStoryButton = ({ + pageId = '*', + componentId = '*', + defaultClassName, + imgClassName, + onPress = () => {}, +}: CreateNewStoryProps) => { + const elementId = 'create_new_story_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + data-qa-anchor={accessibilityId} + className={clsx(styles.createNewStoryIcon, defaultClassName)} + defaultIcon={() => <CreateNewStoryButtonSvg />} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgClassName)} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + onPress={onPress} + style={themeStyles} + /> + ); +}; diff --git a/src/v4/social/elements/CreateNewStoryButton/index.ts b/src/v4/social/elements/CreateNewStoryButton/index.ts new file mode 100644 index 000000000..c7f273b91 --- /dev/null +++ b/src/v4/social/elements/CreateNewStoryButton/index.ts @@ -0,0 +1 @@ +export { CreateNewStoryButton } from './CreateNewStoryButton'; diff --git a/src/v4/social/elements/CreateNewStoryButton/ui.stories.tsx b/src/v4/social/elements/CreateNewStoryButton/ui.stories.tsx new file mode 100644 index 000000000..2f77fffe7 --- /dev/null +++ b/src/v4/social/elements/CreateNewStoryButton/ui.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { CreateNewStoryButton } from './CreateNewStoryButton'; + +export default { + title: 'v4-social/elements/CreateNewStoryButton', +}; + +export const ClearButtonStory = { + render: () => { + return <CreateNewStoryButton />; + }, + + name: 'CreateNewStoryButton', +}; diff --git a/src/v4/social/elements/CreatePollButton/CreatePollButton.module.css b/src/v4/social/elements/CreatePollButton/CreatePollButton.module.css new file mode 100644 index 000000000..12c0551e4 --- /dev/null +++ b/src/v4/social/elements/CreatePollButton/CreatePollButton.module.css @@ -0,0 +1,15 @@ +.createPollButton { + display: flex; + padding: 0.75rem 0; +} + +.createPollButton__text { + margin-left: 0.5rem; + color: var(--asc-color-base-default); +} + +.createPollButton__icon { + fill: var(--asc-color-base-default); + width: 1.25rem; + height: 1.25rem; +} diff --git a/src/v4/social/elements/CreatePollButton/CreatePollButton.tsx b/src/v4/social/elements/CreatePollButton/CreatePollButton.tsx new file mode 100644 index 000000000..83aeff8ff --- /dev/null +++ b/src/v4/social/elements/CreatePollButton/CreatePollButton.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { Typography } from '~/v4/core/components'; +import styles from './CreatePollButton.module.css'; +import clsx from 'clsx'; + +const CreatePollButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="17" + height="17" + viewBox="0 0 17 17" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M14.6875 0.375C15.6016 0.375 16.375 1.14844 16.375 2.0625V14.4375C16.375 15.3867 15.6016 16.125 14.6875 16.125H2.3125C1.36328 16.125 0.625 15.3867 0.625 14.4375V2.0625C0.625 1.14844 1.36328 0.375 2.3125 0.375H14.6875ZM14.6875 14.4375V2.0625H2.3125V14.4375H14.6875ZM4.84375 12.75C4.52734 12.75 4.28125 12.5039 4.28125 12.1875V7.6875C4.28125 7.40625 4.52734 7.125 4.84375 7.125H5.40625C5.6875 7.125 5.96875 7.40625 5.96875 7.6875V12.1875C5.96875 12.5039 5.6875 12.75 5.40625 12.75H4.84375ZM8.21875 12.75C7.90234 12.75 7.65625 12.5039 7.65625 12.1875V4.3125C7.65625 4.03125 7.90234 3.75 8.21875 3.75H8.78125C9.0625 3.75 9.34375 4.03125 9.34375 4.3125V12.1875C9.34375 12.5039 9.0625 12.75 8.78125 12.75H8.21875ZM11.5938 12.75C11.2773 12.75 11.0312 12.5039 11.0312 12.1875V9.9375C11.0312 9.65625 11.2773 9.375 11.5938 9.375H12.1562C12.4375 9.375 12.7188 9.65625 12.7188 9.9375V12.1875C12.7188 12.5039 12.4375 12.75 12.1562 12.75H11.5938Z" /> + </svg> +); + +interface CreatePollButtonProps { + pageId?: string; + componentId: string; + onClick?: (e: React.MouseEvent) => void; + defaultClassName?: string; +} + +export function CreatePollButton({ + pageId = '*', + componentId = '*', + onClick, + defaultClassName, +}: CreatePollButtonProps) { + const elementId = 'create_poll_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + return ( + <div + className={styles.createPollButton} + onClick={() => {}} //TODO : Add event create poll + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <IconComponent + defaultIcon={() => ( + <CreatePollButtonSvg className={clsx(styles.createPollButton__icon, defaultClassName)} /> + )} + imgIcon={() => <img src={config.image} alt={uiReference} />} + configIconName={config.image} + defaultIconName={defaultConfig.image} + /> + <Typography.Body className={styles.createPollButton__text}>{config.text}</Typography.Body> + </div> + ); +} + +export default CreatePollButton; diff --git a/src/v4/social/elements/CreatePollButton/index.tsx b/src/v4/social/elements/CreatePollButton/index.tsx new file mode 100644 index 000000000..d5f390e93 --- /dev/null +++ b/src/v4/social/elements/CreatePollButton/index.tsx @@ -0,0 +1 @@ +export { CreatePollButton } from './CreatePollButton'; diff --git a/src/v4/social/elements/CreatePostButton/CreatePostButton.module.css b/src/v4/social/elements/CreatePostButton/CreatePostButton.module.css new file mode 100644 index 000000000..bac185ecf --- /dev/null +++ b/src/v4/social/elements/CreatePostButton/CreatePostButton.module.css @@ -0,0 +1,16 @@ +.createPostButton { + display: flex; + padding: 0.75rem 0; + cursor: pointer; +} + +.createPostButton__text { + margin-left: 0.5rem; + color: var(--asc-color-base-default); +} + +.createPostButton__icon { + fill: var(--asc-color-base-default); + width: 1.25rem; + height: 1.25rem; +} diff --git a/src/v4/social/elements/CreatePostButton/CreatePostButton.tsx b/src/v4/social/elements/CreatePostButton/CreatePostButton.tsx new file mode 100644 index 000000000..ff7ac1aa2 --- /dev/null +++ b/src/v4/social/elements/CreatePostButton/CreatePostButton.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { Typography } from '~/v4/core/components'; +import styles from './CreatePostButton.module.css'; +import { usePageBehavior } from '~/v4/core/providers/PageBehaviorProvider'; +import clsx from 'clsx'; + +const CreatePostButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg width="21" height="20" viewBox="0 0 21 20" xmlns="http://www.w3.org/2000/svg" {...props}> + <path d="M14.0625 12.7812L15.0625 11.7812C15.2188 11.625 15.5 11.75 15.5 11.9688V16.5C15.5 17.3438 14.8125 18 14 18H3C2.15625 18 1.5 17.3438 1.5 16.5V5.5C1.5 4.6875 2.15625 4 3 4H11.5312C11.75 4 11.875 4.28125 11.7188 4.4375L10.7188 5.4375C10.6562 5.5 10.5938 5.5 10.5312 5.5H3V16.5H14V12.9688C14 12.9062 14 12.8438 14.0625 12.7812ZM18.9375 6.5L10.75 14.6875L7.90625 15C7.09375 15.0938 6.40625 14.4062 6.5 13.5938L6.8125 10.75L15 2.5625C15.7188 1.84375 16.875 1.84375 17.5938 2.5625L18.9375 3.90625C19.6562 4.625 19.6562 5.78125 18.9375 6.5ZM15.875 7.4375L14.0625 5.625L8.25 11.4375L8 13.5L10.0625 13.25L15.875 7.4375ZM17.875 4.96875L16.5312 3.625C16.4062 3.46875 16.1875 3.46875 16.0625 3.625L15.125 4.5625L16.9375 6.40625L17.9062 5.4375C18.0312 5.28125 18.0312 5.09375 17.875 4.96875Z" /> + </svg> +); + +interface CreatePostButtonProps { + pageId?: string; + componentId: string; + onClick?: (e: React.MouseEvent) => void; + defaultClassName?: string; +} + +export function CreatePostButton({ + pageId = '*', + componentId = '*', + onClick, + defaultClassName, +}: CreatePostButtonProps) { + const elementId = 'create_post_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + const { AmityCreatePostMenuComponentBehavior } = usePageBehavior(); + + if (isExcluded) return null; + + return ( + <button + className={styles.createPostButton} + onClick={() => AmityCreatePostMenuComponentBehavior.goToSelectPostTargetPage()} + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <IconComponent + defaultIcon={() => ( + <CreatePostButtonSvg className={clsx(styles.createPostButton__icon, defaultClassName)} /> + )} + imgIcon={() => <img src={config.image} alt={uiReference} />} + configIconName={config.image} + defaultIconName={defaultConfig.image} + /> + <Typography.Body className={styles.createPostButton__text}>{config.text}</Typography.Body> + </button> + ); +} + +export default CreatePostButton; diff --git a/src/v4/social/elements/CreatePostButton/index.tsx b/src/v4/social/elements/CreatePostButton/index.tsx new file mode 100644 index 000000000..32e08009a --- /dev/null +++ b/src/v4/social/elements/CreatePostButton/index.tsx @@ -0,0 +1 @@ +export { CreatePostButton } from "./CreatePostButton"; \ No newline at end of file diff --git a/src/v4/social/elements/CreateStoryButton/CreateStoryButton.module.css b/src/v4/social/elements/CreateStoryButton/CreateStoryButton.module.css new file mode 100644 index 000000000..8a15884ee --- /dev/null +++ b/src/v4/social/elements/CreateStoryButton/CreateStoryButton.module.css @@ -0,0 +1,15 @@ +.createStoryButton { + display: flex; + padding: 0.75rem 0; +} + +.createStoryButton__text { + margin-left: 0.5rem; + color: var(--asc-color-base-default); +} + +.createStoryButton__icon { + fill: var(--asc-color-base-default); + width: 1.25rem; + height: 1.25rem; +} diff --git a/src/v4/social/elements/CreateStoryButton/CreateStoryButton.tsx b/src/v4/social/elements/CreateStoryButton/CreateStoryButton.tsx index 27bc6c43e..1078a7a76 100644 --- a/src/v4/social/elements/CreateStoryButton/CreateStoryButton.tsx +++ b/src/v4/social/elements/CreateStoryButton/CreateStoryButton.tsx @@ -1,56 +1,63 @@ import React from 'react'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { Typography } from '~/v4/core/components'; +import styles from './CreateStoryButton.module.css'; +import clsx from 'clsx'; -import { IconButton, RemoteImageButton } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { useTheme } from 'styled-components'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +const CreateStoryButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg width="17" height="18" viewBox="0 0 17 18" xmlns="http://www.w3.org/2000/svg" {...props}> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M0.771159 12.2248C1.00906 12.7861 1.30474 13.3088 1.65819 13.7927C1.85468 14.0618 2.2428 14.0749 2.47778 13.8387L2.85238 13.4622C3.05585 13.2578 3.07242 12.9352 2.91359 12.6944C2.68511 12.3479 2.4918 11.9785 2.33366 11.5862C2.17162 11.1841 2.04651 10.7654 1.95831 10.33C1.90156 10.0497 1.66209 9.83785 1.37619 9.83785H0.7981C0.460143 9.83785 0.194237 10.1301 0.252477 10.463C0.359316 11.0737 0.53221 11.661 0.771159 12.2248ZM0.791992 5.77587C0.565717 6.33406 0.392758 6.91522 0.273115 7.51935C0.206005 7.85821 0.473794 8.1628 0.819238 8.1628H1.37619C1.66209 8.1628 1.90156 7.95091 1.95831 7.6707C2.04651 7.23526 2.17162 6.81652 2.33366 6.41448C2.4918 6.0221 2.68511 5.6527 2.91359 5.30628C3.07242 5.06546 3.05585 4.7429 2.85238 4.53841L2.47778 4.16192C2.2428 3.92576 1.85456 3.93884 1.65906 4.2086C1.30847 4.69235 1.01944 5.21477 0.791992 5.77587ZM5.26074 16.7265C5.81526 16.966 6.39491 17.1396 6.9997 17.247C7.33267 17.3061 7.62533 17.0401 7.62533 16.7019V16.1571C7.62533 15.8715 7.41372 15.6325 7.13436 15.5731C6.70488 15.4817 6.29562 15.3497 5.90658 15.177C5.52127 15.0061 5.14859 14.8025 4.78852 14.5662C4.5475 14.4081 4.22544 14.4327 4.02574 14.6406L3.64108 15.041C3.40868 15.2829 3.43286 15.6735 3.7084 15.8649C4.19354 16.2017 4.71098 16.4889 5.26074 16.7265ZM3.71752 2.12947C3.43846 2.32272 3.41731 2.71924 3.65673 2.95986L4.05715 3.36229C4.26214 3.56831 4.58771 3.58533 4.82847 3.42255C5.1704 3.19137 5.53324 2.99173 5.91699 2.82361C6.3137 2.64981 6.73277 2.5172 7.17418 2.42577C7.45449 2.3677 7.66699 2.12833 7.66699 1.84207V1.29669C7.66699 0.959243 7.37557 0.693429 7.04294 0.750218C6.41529 0.857371 5.82122 1.03203 5.26074 1.27419C4.71443 1.51024 4.20002 1.79533 3.71752 2.12947ZM9.82271 15.5735C9.54395 15.6315 9.33366 15.8703 9.33366 16.155V16.6953C9.33366 17.0359 9.63023 17.3024 9.96541 17.2422C11.8264 16.908 13.4005 16.0311 14.6878 14.6117C16.1184 13.0344 16.8337 11.1639 16.8337 9.00033C16.8337 6.83673 16.1184 4.96627 14.6878 3.38894C13.4005 1.96952 11.8264 1.09268 9.96541 0.758409C9.63023 0.698204 9.33366 0.964784 9.33366 1.30532V1.84562C9.33366 2.13035 9.54395 2.36916 9.82271 2.42716C11.2862 2.73166 12.5155 3.45008 13.5107 4.5824C14.6149 5.83868 15.167 7.31132 15.167 9.00033C15.167 10.6893 14.6149 12.162 13.5107 13.4182C12.5155 14.5506 11.2862 15.269 9.82271 15.5735Z" + /> + <path d="M12.7189 8.47933C12.9012 8.47933 13.0835 8.66162 13.0835 8.84391V9.57308C13.0835 9.77816 12.9012 9.93766 12.7189 9.93766H9.43766V13.2189C9.43766 13.424 9.25537 13.5835 9.07308 13.5835H8.34391C8.13883 13.5835 7.97933 13.424 7.97933 13.2189V9.93766H4.69808C4.493 9.93766 4.3335 9.77816 4.3335 9.57308V8.84391C4.3335 8.66162 4.493 8.47933 4.69808 8.47933H7.97933V5.19808C7.97933 5.01579 8.13883 4.8335 8.34391 4.8335H9.07308C9.25537 4.8335 9.43766 5.01579 9.43766 5.19808V8.47933H12.7189Z" /> + </svg> +); -interface BackButtonProps { - pageId: 'story_page'; - componentId: '*'; +interface CreateStoryButtonProps { + pageId?: string; + componentId: string; onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; - 'data-qa-anchor'?: string; + defaultClassName?: string; } -export const CreateStoryButton = ({ - pageId = 'story_page', +export function CreateStoryButton({ + pageId = '*', componentId = '*', - onClick = () => {}, - style, -}: BackButtonProps) => { - const theme = useTheme(); - const elementId = 'create_new_story_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const backgroundColor = elementConfig?.background_color; - const createStoryIcon = elementConfig?.create_new_story_icon; - - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; - - const isRemoteImage = createStoryIcon && isValidHttpUrl(createStoryIcon); + onClick, + defaultClassName, +}: CreateStoryButtonProps) { + const elementId = 'create_story_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); - return isRemoteImage ? ( - <RemoteImageButton - data-qa-anchor="create_story_icon" - src={createStoryIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - /> - ) : ( - <IconButton - data-qa-anchor="create_story_icon" - name={'AddIcon'} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - onClick={onClick} - /> + if (isExcluded) return null; + return ( + <div + className={styles.createStoryButton} + onClick={() => {}} //TODO : Add event create story + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <IconComponent + defaultIcon={() => ( + <CreateStoryButtonSvg + className={clsx(styles.createStoryButton__icon, defaultClassName)} + /> + )} + imgIcon={() => <img src={config.image} alt={uiReference} />} + configIconName={config.image} + defaultIconName={defaultConfig.image} + /> + <Typography.Body className={styles.createStoryButton__text}>{config.text}</Typography.Body> + </div> ); -}; +} + +export default CreateStoryButton; diff --git a/src/v4/social/elements/CreateStoryButton/index.tsx b/src/v4/social/elements/CreateStoryButton/index.tsx new file mode 100644 index 000000000..701322549 --- /dev/null +++ b/src/v4/social/elements/CreateStoryButton/index.tsx @@ -0,0 +1 @@ +export { CreateStoryButton } from './CreateStoryButton'; diff --git a/src/v4/social/elements/CreateStoryButton/styles.tsx b/src/v4/social/elements/CreateStoryButton/styles.tsx deleted file mode 100644 index 31fc6eeeb..000000000 --- a/src/v4/social/elements/CreateStoryButton/styles.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import styled from 'styled-components'; -import { Icon } from '~/v4/core/components'; - -export const IconButton = styled(Icon)` - width: 1rem; - height: 1rem; - position: absolute; - bottom: 0rem; - right: 0rem; - cursor: pointer; - border-radius: 50%; - z-index: 100; -`; - -export const RemoteImageButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/Description/Description.module.css b/src/v4/social/elements/Description/Description.module.css new file mode 100644 index 000000000..6f088f894 --- /dev/null +++ b/src/v4/social/elements/Description/Description.module.css @@ -0,0 +1,4 @@ +.description { + color: var(--asc-color-base-shade3); + text-align: center; +} diff --git a/src/v4/social/elements/Description/Description.stories.tsx b/src/v4/social/elements/Description/Description.stories.tsx new file mode 100644 index 000000000..c02003914 --- /dev/null +++ b/src/v4/social/elements/Description/Description.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { Description } from './Description'; + +export default { + title: 'v4-social/elements/Description', +}; + +export const DescriptionStory = { + render: () => { + return <Description />; + }, + + name: 'Description', +}; diff --git a/src/v4/social/elements/Description/Description.tsx b/src/v4/social/elements/Description/Description.tsx new file mode 100644 index 000000000..183a23f24 --- /dev/null +++ b/src/v4/social/elements/Description/Description.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import styles from './Description.module.css'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { Typography } from '~/v4/core/components'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +interface DescriptionProps { + pageId?: string; + componentId?: string; +} + +export function Description({ pageId = '*', componentId = '*' }: DescriptionProps) { + const elementId = 'description'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <Typography.Caption + className={styles.description} + style={themeStyles} + data-qa-anchor={accessibilityId} + > + {config.text} + </Typography.Caption> + ); +} diff --git a/src/v4/social/elements/Description/index.tsx b/src/v4/social/elements/Description/index.tsx new file mode 100644 index 000000000..6899644e6 --- /dev/null +++ b/src/v4/social/elements/Description/index.tsx @@ -0,0 +1 @@ +export { Description } from './Description'; diff --git a/src/v4/social/elements/DoneButton/DoneButton.module.css b/src/v4/social/elements/DoneButton/DoneButton.module.css new file mode 100644 index 000000000..bbf0c36cd --- /dev/null +++ b/src/v4/social/elements/DoneButton/DoneButton.module.css @@ -0,0 +1,3 @@ +.doneButton_text { + color: var(--asc-color-primary-default); +} diff --git a/src/v4/social/elements/DoneButton/DoneButton.tsx b/src/v4/social/elements/DoneButton/DoneButton.tsx new file mode 100644 index 000000000..f1c978a90 --- /dev/null +++ b/src/v4/social/elements/DoneButton/DoneButton.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './DoneButton.module.css'; + +export interface ExploreButtonProps { + pageId?: string; + componentId?: string; + onClick?: () => void; +} + +export function DoneButton({ pageId = '*', componentId = '*', onClick }: ExploreButtonProps) { + const elementId = 'done_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <button data-qa-anchor={accessibilityId} style={themeStyles} onClick={onClick}> + <Typography.Body className={styles.doneButton_text}> + {config.done_button_text} + </Typography.Body> + </button> + ); +} diff --git a/src/v4/social/elements/DoneButton/index.ts b/src/v4/social/elements/DoneButton/index.ts new file mode 100644 index 000000000..d18e8ca7e --- /dev/null +++ b/src/v4/social/elements/DoneButton/index.ts @@ -0,0 +1 @@ +export { DoneButton } from './DoneButton'; diff --git a/src/v4/social/elements/ExploreButton/ExploreButton.module.css b/src/v4/social/elements/ExploreButton/ExploreButton.module.css new file mode 100644 index 000000000..5bc061ac1 --- /dev/null +++ b/src/v4/social/elements/ExploreButton/ExploreButton.module.css @@ -0,0 +1,13 @@ +.exploreButton { + background-color: var(--asc-color-base-default); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + width: var(--asc-spacing-l1); + height: var(--asc-spacing-l1); +} + +.exploreButton__icon { + fill: var(--asc-color-secondary-shade4); +} diff --git a/src/v4/social/elements/ExploreButton/ExploreButton.stories.tsx b/src/v4/social/elements/ExploreButton/ExploreButton.stories.tsx new file mode 100644 index 000000000..a16e5aa00 --- /dev/null +++ b/src/v4/social/elements/ExploreButton/ExploreButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { ExploreButton } from './ExploreButton'; + +export default { + title: 'v4-social/elements/ExploreButton', +}; + +export const ExploreButtonStory = { + render: () => { + return <ExploreButton />; + }, + + name: 'ExploreButton', +}; diff --git a/src/v4/social/elements/ExploreButton/ExploreButton.tsx b/src/v4/social/elements/ExploreButton/ExploreButton.tsx new file mode 100644 index 000000000..913c44c8e --- /dev/null +++ b/src/v4/social/elements/ExploreButton/ExploreButton.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { TabButton } from '~/v4/social/internal-components/TabButton'; + +export interface ExploreButtonProps { + pageId?: string; + componentId?: string; + isActive?: boolean; + onClick?: () => void; +} + +export function ExploreButton({ + pageId = '*', + componentId = '*', + isActive, + onClick, +}: ExploreButtonProps) { + const elementId = 'explore_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <TabButton + pageId={pageId} + componentId={componentId} + elementId={elementId} + isActive={isActive} + onClick={() => onClick?.()} + data-qa-anchor={accessibilityId} + > + {config.text} + </TabButton> + ); +} diff --git a/src/v4/social/elements/ExploreButton/index.tsx b/src/v4/social/elements/ExploreButton/index.tsx new file mode 100644 index 000000000..0e994fd39 --- /dev/null +++ b/src/v4/social/elements/ExploreButton/index.tsx @@ -0,0 +1 @@ +export { ExploreButton } from './ExploreButton'; diff --git a/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.module.css b/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.module.css new file mode 100644 index 000000000..7941b7403 --- /dev/null +++ b/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.module.css @@ -0,0 +1,18 @@ +.exploreCommunitiesButton { + display: flex; + padding: 0.625rem 1rem 0.625rem 0.75rem; + justify-content: center; + align-items: center; + gap: 0.5rem; + border-radius: 0.25rem; + background: var(--asc-color-primary-default); + cursor: pointer; +} + +.exploreCommunitiesButton__icon { + fill: var(--asc-color-white); +} + +.exploreCommunitiesButton__text { + color: var(--asc-color-white); +} diff --git a/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.stories.tsx b/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.stories.tsx new file mode 100644 index 000000000..2aa274dc3 --- /dev/null +++ b/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { ExploreCommunitiesButton } from './ExploreCommunitiesButton'; + +export default { + title: 'v4-social/elements/ExploreCommunitiesButton', +}; + +export const ExploreCommunitiesButtonStory = { + render: () => { + return <ExploreCommunitiesButton />; + }, + + name: 'ExploreCommunitiesButton', +}; diff --git a/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.tsx b/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.tsx new file mode 100644 index 000000000..3aefa5cd0 --- /dev/null +++ b/src/v4/social/elements/ExploreCommunitiesButton/ExploreCommunitiesButton.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { Typography } from '~/v4/core/components'; +import styles from './ExploreCommunitiesButton.module.css'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +const Globe = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="16" + height="16" + viewBox="0 0 16 16" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M7.85254 0.25C12.1338 0.25 15.6025 3.71875 15.6025 8C15.6025 12.2812 12.1338 15.75 7.85254 15.75C3.57129 15.75 0.102539 12.2812 0.102539 8C0.102539 3.71875 3.57129 0.25 7.85254 0.25ZM13.4463 5.25C12.79 3.9375 11.6963 2.90625 10.3525 2.3125C10.79 3.125 11.1338 4.125 11.3525 5.25H13.4463ZM7.85254 1.75C7.25879 1.75 6.32129 3.0625 5.85254 5.25H9.82129C9.35254 3.0625 8.41504 1.75 7.85254 1.75ZM1.60254 8C1.60254 8.4375 1.63379 8.875 1.72754 9.25H4.13379C4.10254 8.84375 4.10254 8.4375 4.10254 8C4.10254 7.59375 4.10254 7.1875 4.13379 6.75H1.72754C1.63379 7.15625 1.60254 7.59375 1.60254 8ZM2.22754 10.75C2.88379 12.0625 3.97754 13.125 5.32129 13.7188C4.88379 12.9062 4.54004 11.9062 4.32129 10.75H2.22754ZM4.32129 5.25C4.54004 4.125 4.88379 3.125 5.32129 2.3125C3.97754 2.90625 2.88379 3.9375 2.22754 5.25H4.32129ZM7.85254 14.25C8.41504 14.25 9.35254 12.9688 9.82129 10.75H5.85254C6.32129 12.9688 7.25879 14.25 7.85254 14.25ZM10.04 9.25C10.0713 8.875 10.1025 8.4375 10.1025 8C10.1025 7.5625 10.0713 7.15625 10.04 6.75H5.63379C5.60254 7.15625 5.60254 7.5625 5.60254 8C5.60254 8.4375 5.60254 8.875 5.63379 9.25H10.04ZM10.3525 13.7188C11.6963 13.125 12.79 12.0625 13.4463 10.75H11.3525C11.1338 11.9062 10.79 12.9062 10.3525 13.7188ZM11.54 9.25H13.9775C14.04 8.875 14.1025 8.4375 14.1025 8C14.1025 7.59375 14.04 7.15625 13.9775 6.75H11.54C11.5713 7.1875 11.6025 7.59375 11.6025 8C11.6025 8.4375 11.5713 8.84375 11.54 9.25Z" /> + </svg> +); + +interface DescriptionProps { + pageId?: string; + componentId?: string; +} + +export function ExploreCommunitiesButton({ pageId = '*', componentId = '*' }: DescriptionProps) { + const elementId = 'explore_communities_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <div + className={styles.exploreCommunitiesButton} + data-qa-anchor={accessibilityId} + style={themeStyles} + > + <Globe className={styles.exploreCommunitiesButton__icon} /> + <Typography.BodyBold className={styles.exploreCommunitiesButton__text}> + {config.text} + </Typography.BodyBold> + </div> + ); +} diff --git a/src/v4/social/elements/ExploreCommunitiesButton/index.tsx b/src/v4/social/elements/ExploreCommunitiesButton/index.tsx new file mode 100644 index 000000000..37c8df07f --- /dev/null +++ b/src/v4/social/elements/ExploreCommunitiesButton/index.tsx @@ -0,0 +1 @@ +export { ExploreCommunitiesButton } from './ExploreCommunitiesButton'; diff --git a/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.module.css b/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.module.css new file mode 100644 index 000000000..9f2ba0aa0 --- /dev/null +++ b/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.module.css @@ -0,0 +1,15 @@ +.globalSearchButton { + background-color: var(--asc-color-secondary-shade4); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + width: 2rem; + height: 2rem; +} + +.globalSearchButton__icon { + fill: var(--asc-color-secondary-default); + width: 1rem; + height: 1rem; +} diff --git a/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.stories.tsx b/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.stories.tsx new file mode 100644 index 000000000..29322fc1f --- /dev/null +++ b/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { GlobalSearchButton } from './GlobalSearchButton'; + +export default { + title: 'v4-social/elements/GlobalSearchButton', +}; + +export const GlobalSearchButtonStory = { + render: () => { + return <GlobalSearchButton />; + }, + + name: 'GlobalSearchButton', +}; diff --git a/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.tsx b/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.tsx new file mode 100644 index 000000000..1f65d87a0 --- /dev/null +++ b/src/v4/social/elements/GlobalSearchButton/GlobalSearchButton.tsx @@ -0,0 +1,73 @@ +import clsx from 'clsx'; +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { getDefaultConfig, useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import styles from './GlobalSearchButton.module.css'; + +const GlobalSearchSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="17" + height="17" + viewBox="0 0 17 17" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M15.7814 14.3104C16.0627 14.6229 16.0627 15.0917 15.7502 15.3729L14.8752 16.2479C14.5939 16.5604 14.1252 16.5604 13.8127 16.2479L10.7189 13.1542C10.5627 12.9979 10.5002 12.8104 10.5002 12.6229V12.0917C9.37516 12.9667 8.00016 13.4667 6.50016 13.4667C2.90641 13.4667 0.000162125 10.5604 0.000162125 6.96667C0.000162125 3.40417 2.90641 0.466675 6.50016 0.466675C10.0627 0.466675 13.0002 3.40417 13.0002 6.96667C13.0002 8.49792 12.4689 9.87292 11.6252 10.9667H12.1252C12.3127 10.9667 12.5002 11.0604 12.6564 11.1854L15.7814 14.3104ZM6.50016 10.9667C8.68766 10.9667 10.5002 9.18542 10.5002 6.96667C10.5002 4.77917 8.68766 2.96667 6.50016 2.96667C4.28141 2.96667 2.50016 4.77917 2.50016 6.96667C2.50016 9.18542 4.28141 10.9667 6.50016 10.9667Z" /> + </svg> +); + +export interface GlobalSearchButtonProps { + pageId?: string; + componentId?: string; + defaultClassName?: string; + imgClassName?: string; + onClick?: (e: React.MouseEvent) => void; +} + +export function GlobalSearchButton({ + pageId = '*', + componentId = '*', + defaultClassName, + imgClassName, + onClick, +}: GlobalSearchButtonProps) { + const elementId = 'global_search_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIcon={() => ( + <div + style={themeStyles} + className={styles.globalSearchButton} + onClick={onClick} + data-qa-anchor={accessibilityId} + > + <GlobalSearchSvg className={clsx(styles.globalSearchButton__icon, defaultClassName)} /> + </div> + )} + imgIcon={() => ( + <img + style={themeStyles} + src={config.icon} + alt={uiReference} + className={clsx(styles.globalSearchButton__icon, imgClassName)} + onClick={onClick} + data-qa-anchor={accessibilityId} + /> + )} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + ); +} diff --git a/src/v4/social/elements/GlobalSearchButton/index.tsx b/src/v4/social/elements/GlobalSearchButton/index.tsx new file mode 100644 index 000000000..15bf518c1 --- /dev/null +++ b/src/v4/social/elements/GlobalSearchButton/index.tsx @@ -0,0 +1 @@ +export { GlobalSearchButton } from './GlobalSearchButton'; diff --git a/src/v4/social/elements/HeaderLabel/HeaderLabel.module.css b/src/v4/social/elements/HeaderLabel/HeaderLabel.module.css new file mode 100644 index 000000000..b96a45f0f --- /dev/null +++ b/src/v4/social/elements/HeaderLabel/HeaderLabel.module.css @@ -0,0 +1,3 @@ +.headerLabel { + color: var(--asc-color-base-default); +} diff --git a/src/v4/social/elements/HeaderLabel/HeaderLabel.stories.tsx b/src/v4/social/elements/HeaderLabel/HeaderLabel.stories.tsx new file mode 100644 index 000000000..33b9280b2 --- /dev/null +++ b/src/v4/social/elements/HeaderLabel/HeaderLabel.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { HeaderLabel } from './HeaderLabel'; + +export default { + title: 'v4-social/elements/HeaderLabel', +}; + +export const HeaderLabelStory = { + render: () => { + return <HeaderLabel />; + }, + + name: 'HeaderLabel', +}; diff --git a/src/v4/social/elements/HeaderLabel/HeaderLabel.tsx b/src/v4/social/elements/HeaderLabel/HeaderLabel.tsx new file mode 100644 index 000000000..6139400e6 --- /dev/null +++ b/src/v4/social/elements/HeaderLabel/HeaderLabel.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import styles from './HeaderLabel.module.css'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +export interface HeaderLabelProps { + pageId?: string; + componentId?: string; +} + +export function HeaderLabel({ pageId = '*', componentId = '*' }: HeaderLabelProps) { + const elementId = 'header_label'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <Typography.Heading + className={styles.headerLabel} + style={themeStyles} + data-qa-anchor={accessibilityId} + > + {config.text} + </Typography.Heading> + ); +} diff --git a/src/v4/social/elements/HeaderLabel/index.tsx b/src/v4/social/elements/HeaderLabel/index.tsx new file mode 100644 index 000000000..3793e798b --- /dev/null +++ b/src/v4/social/elements/HeaderLabel/index.tsx @@ -0,0 +1 @@ +export { HeaderLabel } from './HeaderLabel'; diff --git a/src/v4/social/elements/HyperLink/HyperLink.module.css b/src/v4/social/elements/HyperLink/HyperLink.module.css index 0fca5ea50..1ca00ee66 100644 --- a/src/v4/social/elements/HyperLink/HyperLink.module.css +++ b/src/v4/social/elements/HyperLink/HyperLink.module.css @@ -1,7 +1,6 @@ .hyperlink { - border: 1px solid var(--asc-color-base-shade4); color: var(--asc-color-secondary-default); - background: #ffffffcc; + background: #fffc; display: inline-flex; align-items: center; padding: var(--asc-spacing-s2) var(--asc-spacing-m1) var(--asc-spacing-s2) var(--asc-spacing-s2); diff --git a/src/v4/social/elements/HyperLinkButton/HyperLinkButton.module.css b/src/v4/social/elements/HyperLinkButton/HyperLinkButton.module.css new file mode 100644 index 000000000..caaaa6686 --- /dev/null +++ b/src/v4/social/elements/HyperLinkButton/HyperLinkButton.module.css @@ -0,0 +1,3 @@ +.hyperLinkButton { + fill: var(--asc-color-white); +} diff --git a/src/v4/social/elements/HyperLinkButton/HyperLinkButton.tsx b/src/v4/social/elements/HyperLinkButton/HyperLinkButton.tsx index c7b005af1..d99fb8841 100644 --- a/src/v4/social/elements/HyperLinkButton/HyperLinkButton.tsx +++ b/src/v4/social/elements/HyperLinkButton/HyperLinkButton.tsx @@ -1,19 +1,43 @@ import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import clsx from 'clsx'; -import { ActionButton } from '../ActionButton'; -import { LinkIcon } from '~/icons'; -import { useAmityElement } from '~/v4/core/hooks/uikit/index'; +import styles from './HyperLinkButton.module.css'; + +const HyperLinkButtonSvg = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="32" + height="32" + fill="none" + viewBox="0 0 32 32" + {...props} + > + <circle cx="16" cy="16" r="16" fill="#000" fillOpacity="0.5"></circle> + <path + fill="currentColor" + d="M18.04 14.21c1.792 1.794 1.898 4.677.316 6.575-.212.281-.07.14-2.954 3.024-1.933 1.933-5.062 1.933-6.96 0-1.934-1.899-1.934-5.028 0-6.961l2.214-2.215c.246-.246.703-.07.703.281.036.387.106.984.176 1.336.035.14 0 .281-.105.387l-1.617 1.617a2.95 2.95 0 000 4.183 2.95 2.95 0 004.183 0l2.637-2.636a2.95 2.95 0 000-4.184c-.176-.21-.563-.457-.809-.562-.14-.106-.246-.282-.21-.457.034-.387.21-.774.527-1.055l.14-.14a.435.435 0 01.492-.106c.457.246.88.527 1.266.914zm5.483-5.483c1.934 1.898 1.934 5.027 0 6.96l-2.214 2.215c-.247.246-.704.07-.704-.28a15.366 15.366 0 00-.175-1.337.397.397 0 01.105-.387l1.617-1.617a2.95 2.95 0 000-4.183 2.95 2.95 0 00-4.183 0l-2.637 2.636a2.95 2.95 0 000 4.184c.176.21.563.457.809.563.14.105.246.28.21.456a1.607 1.607 0 01-.527 1.055l-.14.14a.435.435 0 01-.493.106 5.265 5.265 0 01-1.265-.914c-1.793-1.793-1.899-4.676-.317-6.574.211-.281.07-.14 2.954-3.023 1.933-1.934 5.062-1.934 6.96 0z" + ></path> + </svg> + ); +}; interface HyperLinkButtonProps { pageId?: string; componentId?: string; - onClick: (e: React.MouseEvent) => void; + defaultClassName?: string; + imgClassName?: string; + onPress: (e: React.MouseEvent) => void; } export const HyperLinkButton = ({ pageId = '*', componentId = '*', - onClick = () => {}, + defaultClassName, + imgClassName, + onPress = () => {}, }: HyperLinkButtonProps) => { const elementId = 'story_hyperlink_button'; const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = @@ -26,9 +50,15 @@ export const HyperLinkButton = ({ if (isExcluded) return null; return ( - <ActionButton - icon={<LinkIcon fill={themeStyles?.color || 'var(--asc-color-white)'} />} - onClick={onClick} + <IconComponent + data-qa-anchor={accessibilityId} + className={clsx(styles.hyperLinkButton, defaultClassName)} + defaultIcon={() => <HyperLinkButtonSvg />} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgClassName)} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + onPress={onPress} + style={themeStyles} /> ); }; diff --git a/src/v4/social/elements/Illustration/Illustration.stories.tsx b/src/v4/social/elements/Illustration/Illustration.stories.tsx new file mode 100644 index 000000000..d9e6892f5 --- /dev/null +++ b/src/v4/social/elements/Illustration/Illustration.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { Illustration } from './Illustration'; + +export default { + title: 'v4-social/elements/Illustration', +}; + +export const IllustrationStory = { + render: () => { + return <Illustration />; + }, + + name: 'Illustration', +}; diff --git a/src/v4/social/elements/Illustration/Illustration.tsx b/src/v4/social/elements/Illustration/Illustration.tsx new file mode 100644 index 000000000..b01482c30 --- /dev/null +++ b/src/v4/social/elements/Illustration/Illustration.tsx @@ -0,0 +1,184 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; + +const DarkIllustrationSvg = () => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="161" + height="161" + viewBox="0 0 161 161" + fill="none" + > + <path + d="M130.1 24.5H34.0996C29.6813 24.5 26.0996 28.0817 26.0996 32.5V128.5C26.0996 132.918 29.6813 136.5 34.0996 136.5H130.1C134.518 136.5 138.1 132.918 138.1 128.5V32.5C138.1 28.0817 134.518 24.5 130.1 24.5Z" + fill="#292B32" + /> + <path + d="M43.7002 68.2H44.2002H151.7C152.628 68.2 153.519 68.5688 154.175 69.2251C154.831 69.8815 155.2 70.7718 155.2 71.7V91.7C155.2 92.6283 154.831 93.5185 154.175 94.1749C153.519 94.8313 152.628 95.2 151.7 95.2H43.7002C42.7719 95.2 41.8817 94.8313 41.2253 94.1749C40.5689 93.5185 40.2002 92.6283 40.2002 91.7V71.7C40.2002 70.7718 40.5689 69.8815 41.2253 69.2251C41.8817 68.5688 42.7719 68.2 43.7002 68.2Z" + fill="#292B32" + stroke="#40434E" + /> + <path + opacity="0.3" + d="M90.9002 74.1H70.1002C68.7747 74.1 67.7002 75.1745 67.7002 76.5C67.7002 77.8255 68.7747 78.9 70.1002 78.9H90.9002C92.2257 78.9 93.3002 77.8255 93.3002 76.5C93.3002 75.1745 92.2257 74.1 90.9002 74.1Z" + fill="#40434E" + /> + <path + opacity="0.15" + d="M105.3 84.5H70.1002C68.7747 84.5 67.7002 85.5745 67.7002 86.9C67.7002 88.2255 68.7747 89.3 70.1002 89.3H105.3C106.626 89.3 107.7 88.2255 107.7 86.9C107.7 85.5745 106.626 84.5 105.3 84.5Z" + fill="#40434E" + /> + <path + d="M53.6996 89.3C57.897 89.3 61.2996 85.8974 61.2996 81.7C61.2996 77.5027 57.897 74.1 53.6996 74.1C49.5022 74.1 46.0996 77.5027 46.0996 81.7C46.0996 85.8974 49.5022 89.3 53.6996 89.3Z" + fill="#40434E" + /> + <path + d="M9.2998 102.6H9.7998H117.3C118.228 102.6 119.118 102.969 119.775 103.625C120.431 104.282 120.8 105.172 120.8 106.1V126.1C120.8 127.028 120.431 127.919 119.775 128.575C119.118 129.231 118.228 129.6 117.3 129.6H9.2998C8.37155 129.6 7.48131 129.231 6.82493 128.575C6.16855 127.919 5.7998 127.028 5.7998 126.1V106.1C5.7998 105.172 6.16855 104.282 6.82493 103.625C7.48131 102.969 8.37155 102.6 9.2998 102.6Z" + fill="#292B32" + stroke="#40434E" + /> + <path + opacity="0.3" + d="M56.4998 108.5H35.6998C34.3743 108.5 33.2998 109.575 33.2998 110.9C33.2998 112.225 34.3743 113.3 35.6998 113.3H56.4998C57.8253 113.3 58.8998 112.225 58.8998 110.9C58.8998 109.575 57.8253 108.5 56.4998 108.5Z" + fill="#40434E" + /> + <path + opacity="0.15" + d="M70.8998 118.9H35.6998C34.3743 118.9 33.2998 119.975 33.2998 121.3C33.2998 122.626 34.3743 123.7 35.6998 123.7H70.8998C72.2253 123.7 73.2998 122.626 73.2998 121.3C73.2998 119.975 72.2253 118.9 70.8998 118.9Z" + fill="#40434E" + /> + <path + d="M19.3002 123.7C23.4976 123.7 26.9002 120.297 26.9002 116.1C26.9002 111.903 23.4976 108.5 19.3002 108.5C15.1028 108.5 11.7002 111.903 11.7002 116.1C11.7002 120.297 15.1028 123.7 19.3002 123.7Z" + fill="#40434E" + /> + <path + d="M9.2998 33.8H117.3C119.233 33.8 120.8 35.367 120.8 37.3V57.3C120.8 59.233 119.233 60.8 117.3 60.8H9.2998C7.36681 60.8 5.7998 59.233 5.7998 57.3V37.3C5.7998 35.367 7.36681 33.8 9.2998 33.8Z" + fill="#292B32" + stroke="#40434E" + /> + <path + opacity="0.3" + d="M54.8992 39.7H34.0992C32.7737 39.7 31.6992 40.7745 31.6992 42.1C31.6992 43.4255 32.7737 44.5 34.0992 44.5H54.8992C56.2247 44.5 57.2992 43.4255 57.2992 42.1C57.2992 40.7745 56.2247 39.7 54.8992 39.7Z" + fill="#40434E" + /> + <path + opacity="0.15" + d="M69.2992 50.1H34.0992C32.7737 50.1 31.6992 51.1745 31.6992 52.5C31.6992 53.8255 32.7737 54.9 34.0992 54.9H69.2992C70.6247 54.9 71.6992 53.8255 71.6992 52.5C71.6992 51.1745 70.6247 50.1 69.2992 50.1Z" + fill="#40434E" + /> + <path + d="M19.3002 54.9C23.4976 54.9 26.9002 51.4974 26.9002 47.3C26.9002 43.1026 23.4976 39.7 19.3002 39.7C15.1028 39.7 11.7002 43.1026 11.7002 47.3C11.7002 51.4974 15.1028 54.9 19.3002 54.9Z" + fill="#40434E" + /> + </svg> +); + +const IllustrationSvg = () => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="161" + height="160" + viewBox="0 0 161 160" + fill="none" + > + <path + d="M130.452 24H34.4521C30.0339 24 26.4521 27.5817 26.4521 32V128C26.4521 132.418 30.0339 136 34.4521 136H130.452C134.87 136 138.452 132.418 138.452 128V32C138.452 27.5817 134.87 24 130.452 24Z" + fill="#EBECEF" + /> + <path + d="M44.0522 67.7H44.5522H152.052C152.981 67.7 153.871 68.0688 154.527 68.7251C155.184 69.3815 155.552 70.2718 155.552 71.2V91.2C155.552 92.1283 155.184 93.0185 154.527 93.6749C153.871 94.3313 152.981 94.7 152.052 94.7H44.0522C43.124 94.7 42.2337 94.3313 41.5774 93.6749C40.921 93.0185 40.5522 92.1283 40.5522 91.2V71.2C40.5522 70.2718 40.921 69.3815 41.5774 68.7251C42.2337 68.0688 43.124 67.7 44.0522 67.7Z" + fill="white" + stroke="#EBECEF" + /> + <path + opacity="0.3" + d="M91.2523 73.6H70.4522C69.1268 73.6 68.0522 74.6745 68.0522 76C68.0522 77.3255 69.1268 78.4 70.4522 78.4H91.2523C92.5777 78.4 93.6523 77.3255 93.6523 76C93.6523 74.6745 92.5777 73.6 91.2523 73.6Z" + fill="#A5A9B5" + /> + <path + opacity="0.15" + d="M105.652 84H70.4522C69.1268 84 68.0522 85.0745 68.0522 86.4C68.0522 87.7255 69.1268 88.8 70.4522 88.8H105.652C106.978 88.8 108.052 87.7255 108.052 86.4C108.052 85.0745 106.978 84 105.652 84Z" + fill="#A5A9B5" + /> + <path + d="M54.0521 88.8C58.2495 88.8 61.6521 85.3974 61.6521 81.2C61.6521 77.0027 58.2495 73.6 54.0521 73.6C49.8548 73.6 46.4521 77.0027 46.4521 81.2C46.4521 85.3974 49.8548 88.8 54.0521 88.8Z" + fill="#A5A9B5" + /> + <path + d="M9.65234 102.1H10.1523H117.652C118.581 102.1 119.471 102.469 120.127 103.125C120.784 103.782 121.152 104.672 121.152 105.6V125.6C121.152 126.528 120.784 127.419 120.127 128.075C119.471 128.731 118.581 129.1 117.652 129.1H9.65234C8.72409 129.1 7.83385 128.731 7.17747 128.075C6.52109 127.419 6.15234 126.528 6.15234 125.6V105.6C6.15234 104.672 6.52109 103.782 7.17747 103.125C7.83385 102.469 8.72409 102.1 9.65234 102.1Z" + fill="white" + stroke="#EBECEF" + /> + <path + opacity="0.3" + d="M56.8523 108H36.0523C34.7269 108 33.6523 109.075 33.6523 110.4C33.6523 111.725 34.7269 112.8 36.0523 112.8H56.8523C58.1778 112.8 59.2523 111.725 59.2523 110.4C59.2523 109.075 58.1778 108 56.8523 108Z" + fill="#A5A9B5" + /> + <path + opacity="0.15" + d="M71.2523 118.4H36.0523C34.7269 118.4 33.6523 119.475 33.6523 120.8C33.6523 122.126 34.7269 123.2 36.0523 123.2H71.2523C72.5778 123.2 73.6523 122.126 73.6523 120.8C73.6523 119.475 72.5778 118.4 71.2523 118.4Z" + fill="#A5A9B5" + /> + <path + d="M19.6522 123.2C23.8496 123.2 27.2522 119.797 27.2522 115.6C27.2522 111.403 23.8496 108 19.6522 108C15.4549 108 12.0522 111.403 12.0522 115.6C12.0522 119.797 15.4549 123.2 19.6522 123.2Z" + fill="#A5A9B5" + /> + <path + d="M9.65234 33.3H117.652C119.585 33.3 121.152 34.867 121.152 36.8V56.8C121.152 58.733 119.585 60.3 117.652 60.3H9.65234C7.71935 60.3 6.15234 58.733 6.15234 56.8V36.8C6.15234 34.867 7.71935 33.3 9.65234 33.3Z" + fill="white" + stroke="#EBECEF" + /> + <path + opacity="0.3" + d="M55.2522 39.2H34.4522C33.1268 39.2 32.0522 40.2745 32.0522 41.6C32.0522 42.9255 33.1268 44 34.4522 44H55.2522C56.5777 44 57.6522 42.9255 57.6522 41.6C57.6522 40.2745 56.5777 39.2 55.2522 39.2Z" + fill="#A5A9B5" + /> + <path + opacity="0.15" + d="M69.6522 49.6H34.4522C33.1268 49.6 32.0522 50.6745 32.0522 52C32.0522 53.3255 33.1268 54.4 34.4522 54.4H69.6522C70.9777 54.4 72.0522 53.3255 72.0522 52C72.0522 50.6745 70.9777 49.6 69.6522 49.6Z" + fill="#A5A9B5" + /> + <path + d="M19.6522 54.4C23.8496 54.4 27.2522 50.9974 27.2522 46.8C27.2522 42.6026 23.8496 39.2 19.6522 39.2C15.4549 39.2 12.0522 42.6026 12.0522 46.8C12.0522 50.9974 15.4549 54.4 19.6522 54.4Z" + fill="#A5A9B5" + /> + </svg> +); + +interface IllustrationProps { + pageId?: string; + componentId?: string; +} + +export const Illustration = ({ pageId = '*', componentId = '*' }: IllustrationProps) => { + const elementId = 'illustration'; + const { + currentTheme, + accessibilityId, + config, + defaultConfig, + isExcluded, + uiReference, + themeStyles, + } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + imgIcon={() => <img src={config.icon} alt={uiReference} data-qa-anchor={accessibilityId} />} + defaultIcon={() => ( + <div data-qa-anchor={accessibilityId}> + {currentTheme === 'light' ? <IllustrationSvg /> : <DarkIllustrationSvg />} + </div> + )} + /> + ); +}; diff --git a/src/v4/social/elements/Illustration/index.tsx b/src/v4/social/elements/Illustration/index.tsx new file mode 100644 index 000000000..c334ab5f9 --- /dev/null +++ b/src/v4/social/elements/Illustration/index.tsx @@ -0,0 +1 @@ +export { Illustration } from './Illustration'; diff --git a/src/v4/social/elements/ImpressionButton/ImpressionButton.tsx b/src/v4/social/elements/ImpressionButton/ImpressionButton.tsx deleted file mode 100644 index f3d77f4e0..000000000 --- a/src/v4/social/elements/ImpressionButton/ImpressionButton.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; - -import { RemoteImageButton } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { EyeIcon } from '~/icons'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; - -interface ImpressionButtonProps { - pageId: 'story_page'; - componentId: '*'; - onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; - 'data-qa-anchor'?: string; -} - -export const ImpressionButton = ({ - pageId = 'story_page', - componentId = '*', - onClick = () => {}, - style, -}: ImpressionButtonProps) => { - const elementId = 'story_impression_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - - const impressionIcon = elementConfig?.impression_icon; - - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; - - const isRemoteImage = impressionIcon && isValidHttpUrl(impressionIcon); - - return isRemoteImage ? ( - <RemoteImageButton data-qa-anchor="reach_button" src={impressionIcon} onClick={onClick} /> - ) : ( - <EyeIcon data-qa-anchor="reach_button" width={20} height={20} onClick={onClick} /> - ); -}; diff --git a/src/v4/social/elements/ImpressionButton/index.ts b/src/v4/social/elements/ImpressionButton/index.ts deleted file mode 100644 index 99f6ea2eb..000000000 --- a/src/v4/social/elements/ImpressionButton/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { ImpressionButton } from './ImpressionButton'; diff --git a/src/v4/social/elements/ImpressionButton/styles.tsx b/src/v4/social/elements/ImpressionButton/styles.tsx deleted file mode 100644 index ea036d700..000000000 --- a/src/v4/social/elements/ImpressionButton/styles.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import styled from 'styled-components'; - -export const RemoteImageButton = styled.img` - width: 1.5rem; - height: 1.5rem; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/MenuButton/MenuButton.module.css b/src/v4/social/elements/MenuButton/MenuButton.module.css new file mode 100644 index 000000000..2aed04dc5 --- /dev/null +++ b/src/v4/social/elements/MenuButton/MenuButton.module.css @@ -0,0 +1,3 @@ +.menuButton { + fill: var(--asc-color-base-default); +} diff --git a/src/v4/social/elements/MenuButton/MenuButton.stories.tsx b/src/v4/social/elements/MenuButton/MenuButton.stories.tsx new file mode 100644 index 000000000..d95e59df1 --- /dev/null +++ b/src/v4/social/elements/MenuButton/MenuButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { MenuButton } from './MenuButton'; + +export default { + title: 'v4-social/elements/MenuButton', +}; + +export const MenuButtonStory = { + render: () => { + return <MenuButton />; + }, + + name: 'MenuButton', +}; diff --git a/src/v4/social/elements/MenuButton/MenuButton.tsx b/src/v4/social/elements/MenuButton/MenuButton.tsx new file mode 100644 index 000000000..605a08409 --- /dev/null +++ b/src/v4/social/elements/MenuButton/MenuButton.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import styles from './MenuButton.module.css'; + +const EllipsisH = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="16" + height="4" + viewBox="0 0 16 4" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M9.6875 2.25C9.6875 3.19922 8.91406 3.9375 8 3.9375C7.05078 3.9375 6.3125 3.19922 6.3125 2.25C6.3125 1.33594 7.05078 0.5625 8 0.5625C8.91406 0.5625 9.6875 1.33594 9.6875 2.25ZM13.9062 0.5625C14.8203 0.5625 15.5938 1.33594 15.5938 2.25C15.5938 3.19922 14.8203 3.9375 13.9062 3.9375C12.957 3.9375 12.2188 3.19922 12.2188 2.25C12.2188 1.33594 12.957 0.5625 13.9062 0.5625ZM2.09375 0.5625C3.00781 0.5625 3.78125 1.33594 3.78125 2.25C3.78125 3.19922 3.00781 3.9375 2.09375 3.9375C1.14453 3.9375 0.40625 3.19922 0.40625 2.25C0.40625 1.33594 1.14453 0.5625 2.09375 0.5625Z" /> + </svg> +); + +export interface MenuButtonProps { + pageId?: string; + componentId?: string; + onClick?: () => void; +} + +export function MenuButton({ pageId = '*', componentId = '*', onClick }: MenuButtonProps) { + const elementId = 'menu_button'; + const { isExcluded, accessibilityId, themeStyles, config, defaultConfig, uiReference } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <div onClick={onClick} data-qa-anchor={accessibilityId}> + <IconComponent + defaultIcon={() => <EllipsisH className={styles.menuButton} style={themeStyles} />} + imgIcon={() => <img src={config.icon} alt={uiReference} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + </div> + ); +} diff --git a/src/v4/social/elements/MenuButton/index.tsx b/src/v4/social/elements/MenuButton/index.tsx new file mode 100644 index 000000000..8e515ddf3 --- /dev/null +++ b/src/v4/social/elements/MenuButton/index.tsx @@ -0,0 +1 @@ +export { MenuButton } from './MenuButton'; diff --git a/src/v4/social/elements/ModeratorBadge/ModeratorBadge.module.css b/src/v4/social/elements/ModeratorBadge/ModeratorBadge.module.css new file mode 100644 index 000000000..752a3b660 --- /dev/null +++ b/src/v4/social/elements/ModeratorBadge/ModeratorBadge.module.css @@ -0,0 +1,28 @@ +.moderatorBadge { + display: flex; + padding: 0 0.375rem 0 0.25rem; + justify-content: center; + align-items: center; + gap: 0.0625rem; + background-color: var(--asc-color-primary-shade3); + border-radius: 1.25rem; +} + +.moderatorBadge__icon { + display: flex; + justify-content: center; + align-items: center; + height: 0.5625rem; + width: 0.75rem; + fill: var(--asc-color-primary-default); +} + +.moderatorBadge__text { + color: var(--asc-color-primary-default); + text-align: center; + font-size: 0.625rem; + font-style: normal; + font-weight: 400; + line-height: 1.125rem; + letter-spacing: -0.0063rem; +} diff --git a/src/v4/social/elements/ModeratorBadge/ModeratorBadge.stories.tsx b/src/v4/social/elements/ModeratorBadge/ModeratorBadge.stories.tsx new file mode 100644 index 000000000..8e96d2a12 --- /dev/null +++ b/src/v4/social/elements/ModeratorBadge/ModeratorBadge.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { ModeratorBadge } from './ModeratorBadge'; + +export default { + title: 'v4-social/elements/ModeratorBadge', +}; + +export const ModeratorBadgeStory = { + render: () => { + return <ModeratorBadge />; + }, + + name: 'ModeratorBadge', +}; diff --git a/src/v4/social/elements/ModeratorBadge/ModeratorBadge.tsx b/src/v4/social/elements/ModeratorBadge/ModeratorBadge.tsx new file mode 100644 index 000000000..76334e432 --- /dev/null +++ b/src/v4/social/elements/ModeratorBadge/ModeratorBadge.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import styles from './ModeratorBadge.module.css'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +const Badge = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + width="9" + height="9" + viewBox="0 0 9 9" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M7.57031 1.3125C7.85156 1.4375 8.03906 1.70312 8.03906 2C8.03906 5.46875 5.91406 7.39062 4.57031 7.95312C4.38281 8.03125 4.17969 8.03125 3.99219 7.95312C2.32031 7.25 0.539062 5.10938 0.539062 2C0.539062 1.70312 0.710938 1.4375 0.992188 1.3125L3.99219 0.0625C4.07031 0.03125 4.19531 0.015625 4.28906 0.015625C4.36719 0.015625 4.49219 0.03125 4.57031 0.0625L7.57031 1.3125ZM6.83594 3.09375C6.92969 3 6.92969 2.84375 6.83594 2.75L6.47656 2.39062C6.38281 2.29688 6.22656 2.29688 6.13281 2.39062L3.78906 4.73438L2.67969 3.64062C2.58594 3.54688 2.42969 3.54688 2.33594 3.64062L1.97656 4C1.88281 4.09375 1.88281 4.25 1.97656 4.34375L3.60156 5.96875C3.69531 6.07812 3.86719 6.07812 3.96094 5.96875L6.83594 3.09375Z" /> + </svg> + ); +}; + +interface ModeratorBadgeProps { + pageId?: string; + componentId?: string; +} + +export function ModeratorBadge({ pageId = '*', componentId = '*' }: ModeratorBadgeProps) { + const elementId = 'moderator_badge'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <div className={styles.moderatorBadge} style={themeStyles} data-qa-anchor={accessibilityId}> + <Badge className={styles.moderatorBadge__icon} /> + <div className={styles.moderatorBadge__text}>{config.text}</div> + </div> + ); +} diff --git a/src/v4/social/elements/ModeratorBadge/index.tsx b/src/v4/social/elements/ModeratorBadge/index.tsx new file mode 100644 index 000000000..a357a5bc3 --- /dev/null +++ b/src/v4/social/elements/ModeratorBadge/index.tsx @@ -0,0 +1 @@ +export { ModeratorBadge } from './ModeratorBadge'; diff --git a/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.module.css b/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.module.css new file mode 100644 index 000000000..5dff8c329 --- /dev/null +++ b/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.module.css @@ -0,0 +1,13 @@ +.myCommunitiesButton { + background-color: var(--asc-color-base-default); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + width: var(--asc-spacing-l1); + height: var(--asc-spacing-l1); +} + +.myCommunitiesButton__icon { + fill: var(--asc-color-secondary-shade4); +} diff --git a/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.stories.tsx b/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.stories.tsx new file mode 100644 index 000000000..0643fcff2 --- /dev/null +++ b/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { MyCommunitiesButton } from './MyCommunitiesButton'; + +export default { + title: 'v4-social/elements/MyCommunitiesButton', +}; + +export const MyCommunitiesButtonStory = { + render: () => { + return <MyCommunitiesButton />; + }, + + name: 'MyCommunitiesButton', +}; diff --git a/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.tsx b/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.tsx new file mode 100644 index 000000000..80fd99320 --- /dev/null +++ b/src/v4/social/elements/MyCommunitiesButton/MyCommunitiesButton.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { TabButton } from '~/v4/social/internal-components/TabButton'; + +export interface MyCommunitiesButtonProps { + pageId?: string; + componentId?: string; + isActive?: boolean; + onClick?: () => void; +} + +export function MyCommunitiesButton({ + pageId = '*', + componentId = '*', + isActive, + onClick, +}: MyCommunitiesButtonProps) { + const elementId = 'my_communities_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <TabButton + data-qa-anchor={accessibilityId} + pageId={pageId} + componentId={componentId} + elementId={elementId} + isActive={isActive} + onClick={() => onClick?.()} + > + {config.text} + </TabButton> + ); +} diff --git a/src/v4/social/elements/MyCommunitiesButton/index.tsx b/src/v4/social/elements/MyCommunitiesButton/index.tsx new file mode 100644 index 000000000..81e1d2e92 --- /dev/null +++ b/src/v4/social/elements/MyCommunitiesButton/index.tsx @@ -0,0 +1 @@ +export { MyCommunitiesButton } from './MyCommunitiesButton'; diff --git a/src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.module.css b/src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.module.css new file mode 100644 index 000000000..e5dd43e6f --- /dev/null +++ b/src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.module.css @@ -0,0 +1,10 @@ +.myTimelineAvatar { + display: flex; + align-items: center; + margin-right: var(--asc-spacing-s1); +} + +.myTimelineAvatar__userAvatar { + width: 2.5rem; + height: 2.5rem; +} diff --git a/src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.tsx b/src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.tsx new file mode 100644 index 000000000..d741a4b60 --- /dev/null +++ b/src/v4/social/elements/MyTimelineAvatar/MyTimelineAvatar.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import styles from './MyTimelineAvatar.module.css'; +import { UserAvatar } from '~/v4/social/internal-components/UserAvatar/UserAvatar'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +interface MyTimelineAvatarProps { + pageId?: string; + componentId?: string; + userId?: string | null; +} + +export function MyTimelineAvatar({ pageId = '*', componentId = '*', userId }: MyTimelineAvatarProps) { + const elementId = 'my_timeline_avatar'; + const { accessibilityId, isExcluded } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + return ( + <div className={styles.myTimelineAvatar} data-qa-anchor={accessibilityId}> + <UserAvatar className={styles.myTimelineAvatar__userAvatar} userId={userId} /> + </div> + ); +} diff --git a/src/v4/social/elements/MyTimelineAvatar/index.tsx b/src/v4/social/elements/MyTimelineAvatar/index.tsx new file mode 100644 index 000000000..082c877c5 --- /dev/null +++ b/src/v4/social/elements/MyTimelineAvatar/index.tsx @@ -0,0 +1 @@ +export { MyTimelineAvatar } from './MyTimelineAvatar' \ No newline at end of file diff --git a/src/v4/social/elements/MyTimelineText/MyTimelineText.module.css b/src/v4/social/elements/MyTimelineText/MyTimelineText.module.css new file mode 100644 index 000000000..8a7e9ae61 --- /dev/null +++ b/src/v4/social/elements/MyTimelineText/MyTimelineText.module.css @@ -0,0 +1,11 @@ +.myTimelineText { + font-size: 0.9375rem; + font-weight: var(--asc-text-font-weight-bold); + line-height: var(--asc-line-height-md); + letter-spacing: -0.015rem; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: var(--asc-color-base-default); +} diff --git a/src/v4/social/elements/MyTimelineText/MyTimelineText.tsx b/src/v4/social/elements/MyTimelineText/MyTimelineText.tsx new file mode 100644 index 000000000..aab4e9d56 --- /dev/null +++ b/src/v4/social/elements/MyTimelineText/MyTimelineText.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Typography } from '~/v4/core/components/Typography'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './MyTimelineText.module.css'; + +interface MyTimelineTextProps { + pageId?: string; + componentId?: string; +} + +export function MyTimelineText({ pageId = '*', componentId = '*' }: MyTimelineTextProps) { + const elementId = 'my_timeline_text'; + const { accessibilityId, config, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + return ( + <Typography.Body + className={styles.myTimelineText} + style={{ ...themeStyles }} + data-qa-anchor={accessibilityId} + > + {config.text} + </Typography.Body> + ); +} diff --git a/src/v4/social/elements/MyTimelineText/index.tsx b/src/v4/social/elements/MyTimelineText/index.tsx new file mode 100644 index 000000000..e01c05eb3 --- /dev/null +++ b/src/v4/social/elements/MyTimelineText/index.tsx @@ -0,0 +1 @@ +export { MyTimelineText } from './MyTimelineText'; diff --git a/src/v4/social/elements/NewsfeedButton/NewsfeedButton.module.css b/src/v4/social/elements/NewsfeedButton/NewsfeedButton.module.css new file mode 100644 index 000000000..55e1f12a5 --- /dev/null +++ b/src/v4/social/elements/NewsfeedButton/NewsfeedButton.module.css @@ -0,0 +1,13 @@ +.newsfeedButton { + background-color: var(--asc-color-base-default); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + width: var(--asc-spacing-l1); + height: var(--asc-spacing-l1); +} + +.newsfeedButton__icon { + fill: var(--asc-color-secondary-shade4); +} diff --git a/src/v4/social/elements/NewsfeedButton/NewsfeedButton.stories.tsx b/src/v4/social/elements/NewsfeedButton/NewsfeedButton.stories.tsx new file mode 100644 index 000000000..d6c27160f --- /dev/null +++ b/src/v4/social/elements/NewsfeedButton/NewsfeedButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { NewsfeedButton } from './NewsfeedButton'; + +export default { + title: 'v4-social/elements/NewsfeedButton', +}; + +export const NewsfeedButtonStory = { + render: () => { + return <NewsfeedButton />; + }, + + name: 'NewsfeedButton', +}; diff --git a/src/v4/social/elements/NewsfeedButton/NewsfeedButton.tsx b/src/v4/social/elements/NewsfeedButton/NewsfeedButton.tsx new file mode 100644 index 000000000..9a017559f --- /dev/null +++ b/src/v4/social/elements/NewsfeedButton/NewsfeedButton.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { TabButton } from '~/v4/social/internal-components/TabButton'; + +export interface NewsfeedButtonProps { + pageId?: string; + componentId?: string; + isActive?: boolean; + onClick?: () => void; +} + +export function NewsfeedButton({ + pageId = '*', + componentId = '*', + isActive, + onClick, +}: NewsfeedButtonProps) { + const elementId = 'newsfeed_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <TabButton + data-qa-anchor={accessibilityId} + pageId={pageId} + componentId={componentId} + elementId={elementId} + isActive={isActive} + onClick={() => onClick?.()} + > + {config.text} + </TabButton> + ); +} diff --git a/src/v4/social/elements/NewsfeedButton/index.tsx b/src/v4/social/elements/NewsfeedButton/index.tsx new file mode 100644 index 000000000..f975a51bd --- /dev/null +++ b/src/v4/social/elements/NewsfeedButton/index.tsx @@ -0,0 +1 @@ +export { NewsfeedButton } from './NewsfeedButton'; diff --git a/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.module.css b/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.module.css new file mode 100644 index 000000000..ff6e0e1b2 --- /dev/null +++ b/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.module.css @@ -0,0 +1,3 @@ +.overflowMenuIcon { + cursor: pointer; +} diff --git a/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.tsx b/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.tsx index 096f97a3b..51f12498a 100644 --- a/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.tsx +++ b/src/v4/social/elements/OverflowMenuButton/OverflowMenuButton.tsx @@ -1,47 +1,59 @@ +import clsx from 'clsx'; import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import styles from './OverflowMenuButton.module.css'; -import { UIOverflowButton, RemoteImageButton } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +const OverflowMenuSvg = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + fill="none" + viewBox="0 0 24 24" + {...props} + > + <path + fill="#fff" + d="M13.688 12.25c0 .95-.774 1.688-1.688 1.688-.95 0-1.688-.739-1.688-1.688 0-.914.739-1.688 1.688-1.688a1.71 1.71 0 011.688 1.688zm4.218-1.688c.914 0 1.688.774 1.688 1.688 0 .95-.774 1.688-1.688 1.688-.949 0-1.687-.739-1.687-1.688 0-.914.738-1.688 1.687-1.688zm-11.812 0c.914 0 1.687.774 1.687 1.688 0 .95-.773 1.688-1.687 1.688-.95 0-1.688-.739-1.688-1.688 0-.914.739-1.688 1.688-1.688z" + ></path> + </svg> + ); +}; interface OverflowMenuButtonProps { - pageId?: 'story_page'; - componentId?: '*'; - onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; + pageId?: string; + componentId?: string; + onPress?: () => void; + defaultClassName?: string; + imgClassName?: string; 'data-qa-anchor'?: string; } export const OverflowMenuButton = ({ - pageId = 'story_page', + pageId = '*', componentId = '*', - onClick = () => {}, - style, - ...props + onPress = () => {}, + defaultClassName, + imgClassName, }: OverflowMenuButtonProps) => { const elementId = 'overflow_menu'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; + const { config, defaultConfig, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); - const overflowMenuIcon = elementConfig?.overflow_menu_icon; - const isRemoteImage = overflowMenuIcon && isValidHttpUrl(overflowMenuIcon); - - return isRemoteImage ? ( - <RemoteImageButton - data-qa-anchor="overflow_menu_button" - src={overflowMenuIcon} - onClick={onClick} - {...props} - /> - ) : ( - <UIOverflowButton - data-qa-anchor="overflow_menu_button" - name={'EllipsisH'} - onClick={onClick} - {...props} + return ( + <IconComponent + onPress={onPress} + defaultIcon={() => ( + <OverflowMenuSvg className={clsx(styles.overflowMenuIcon, defaultClassName)} /> + )} + imgIcon={() => <img src={config.icon} alt={uiReference} className={imgClassName} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} /> ); }; diff --git a/src/v4/social/elements/OverflowMenuButton/styles.tsx b/src/v4/social/elements/OverflowMenuButton/styles.tsx deleted file mode 100644 index b7217bcdc..000000000 --- a/src/v4/social/elements/OverflowMenuButton/styles.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import styled from 'styled-components'; -import { Icon } from '~/v4/core/components'; - -export const UIOverflowButton = styled(Icon)<{ backgroundColor?: string }>` - cursor: pointer; - fill: #ffffff; - background-color: ${({ backgroundColor }) => backgroundColor}; -`; - -export const RemoteImageButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - background-color: transparent; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/PostCreationButton/PostCreationButton.module.css b/src/v4/social/elements/PostCreationButton/PostCreationButton.module.css new file mode 100644 index 000000000..efd771ff9 --- /dev/null +++ b/src/v4/social/elements/PostCreationButton/PostCreationButton.module.css @@ -0,0 +1,18 @@ +.postCreationButton { + background-color: var(--asc-color-secondary-shade4); + display: flex; + justify-content: center; + align-items: center; + position: relative; + border-radius: 50%; + width: 2rem; + height: 2rem; + + /* cursor: pointer; */ +} + +.postCreationButton__icon { + fill: var(--asc-color-secondary-default); + width: 1rem; + height: 1rem; +} diff --git a/src/v4/social/elements/PostCreationButton/PostCreationButton.stories.tsx b/src/v4/social/elements/PostCreationButton/PostCreationButton.stories.tsx new file mode 100644 index 000000000..63a4b1aa9 --- /dev/null +++ b/src/v4/social/elements/PostCreationButton/PostCreationButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { PostCreationButton } from './PostCreationButton'; + +export default { + title: 'v4-social/elements/PostCreationButton', +}; + +export const PostCreationButtonStory = { + render: () => { + return <PostCreationButton />; + }, + + name: 'PostCreationButton', +}; diff --git a/src/v4/social/elements/PostCreationButton/PostCreationButton.tsx b/src/v4/social/elements/PostCreationButton/PostCreationButton.tsx new file mode 100644 index 000000000..1bc8c6dee --- /dev/null +++ b/src/v4/social/elements/PostCreationButton/PostCreationButton.tsx @@ -0,0 +1,77 @@ +import clsx from 'clsx'; +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { getDefaultConfig, useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { useGenerateStylesShadeColors } from '~/v4/core/providers/ThemeProvider'; +import styles from './PostCreationButton.module.css'; + +const PostCreationButtonSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="14" + height="15" + viewBox="0 0 14 15" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M13.0002 5.96667C13.5314 5.96667 14.0002 6.43542 14.0002 6.96667V7.96667C14.0002 8.52917 13.5314 8.96667 13.0002 8.96667H8.50016V13.4667C8.50016 14.0292 8.03141 14.4667 7.50016 14.4667H6.50016C5.93766 14.4667 5.50016 14.0292 5.50016 13.4667V8.96667H1.00016C0.437662 8.96667 0.000162125 8.52917 0.000162125 7.96667V6.96667C0.000162125 6.43542 0.437662 5.96667 1.00016 5.96667H5.50016V1.46667C5.50016 0.935425 5.93766 0.466675 6.50016 0.466675H7.50016C8.03141 0.466675 8.50016 0.935425 8.50016 1.46667V5.96667H13.0002Z" /> + </svg> +); + +export interface PostCreationButtonProps { + pageId?: string; + componentId?: string; + defaultClassName?: string; + imgClassName?: string; + onClick?: (e: React.MouseEvent) => void; + // createPostButtonRef: React.RefObject<HTMLDivElement>; +} + +export function PostCreationButton({ + pageId = '*', + componentId = '*', + defaultClassName, + imgClassName, + onClick, + // createPostButtonRef, +}: PostCreationButtonProps) { + const elementId = 'post_creation_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIcon={() => ( + <div + style={themeStyles} + className={styles.postCreationButton} + onClick={onClick} + data-qa-anchor={accessibilityId} + // ref={createPostButtonRef} + > + <PostCreationButtonSvg + className={clsx(styles.postCreationButton__icon, defaultClassName)} + /> + </div> + )} + imgIcon={() => ( + <img + src={config.icon} + alt={uiReference} + className={clsx(styles.postCreationButton, imgClassName)} + onClick={onClick} + data-qa-anchor={accessibilityId} + /> + )} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + ); +} diff --git a/src/v4/social/elements/PostCreationButton/index.tsx b/src/v4/social/elements/PostCreationButton/index.tsx new file mode 100644 index 000000000..fdac36a62 --- /dev/null +++ b/src/v4/social/elements/PostCreationButton/index.tsx @@ -0,0 +1 @@ +export { PostCreationButton } from './PostCreationButton'; diff --git a/src/v4/social/elements/ReactButton/ReactButton.tsx b/src/v4/social/elements/ReactButton/ReactButton.tsx deleted file mode 100644 index e0686c2b0..000000000 --- a/src/v4/social/elements/ReactButton/ReactButton.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import { Icon } from '~/v4/core/components/'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; -import { UIReactButton, UIRemoteImageButton } from './styles'; -import { useTheme } from 'styled-components'; - -interface ReactButtonProps { - isLiked: boolean; - pageId?: 'story_page'; - componentId?: string; - onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; - children?: React.ReactNode; - 'data-qa-anchor'?: string; -} - -export const ReactButton = ({ - isLiked, - pageId = 'story_page', - componentId = '*', - onClick = () => {}, - style, - children, - ...props -}: ReactButtonProps) => { - const theme = useTheme(); - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/*/story_reaction_button`); - const isElementExcluded = isExcluded(`${pageId}/*/story_reaction_button`); - const backgroundColor = elementConfig.background_color; - const likedIcon = elementConfig.liked_icon; - const unlikedIcon = elementConfig.unliked_icon; - - if (isElementExcluded) return null; - - const isLikedRemoteImage = - likedIcon && (likedIcon.startsWith('http://') || likedIcon.startsWith('https://')); - - const isUnlikedRemoteImage = - unlikedIcon && (unlikedIcon.startsWith('http://') || unlikedIcon.startsWith('https://')); - - return isLiked ? ( - isLikedRemoteImage ? ( - <UIRemoteImageButton - data-qa-anchor="reaction_button" - src={likedIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - {...props} - > - <span data-qa-anchor="reaction_button_text_view">{children}</span> - </UIRemoteImageButton> - ) : ( - <UIReactButton data-qa-anchor="reaction_button" onClick={onClick} {...props}> - <Icon name={likedIcon || 'LikedIcon'} /> - <span data-qa-anchor="reaction_button_text_view">{children}</span> - </UIReactButton> - ) - ) : isUnlikedRemoteImage ? ( - <UIRemoteImageButton - data-qa-anchor="reaction_button" - src={unlikedIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: backgroundColor || theme.v4.colors.secondary.default, - }} - {...props} - > - <span data-qa-anchor="reaction_button_text_view">{children}</span> - </UIRemoteImageButton> - ) : ( - <UIReactButton data-qa-anchor="reaction_button" onClick={onClick} {...props}> - <Icon name={unlikedIcon || 'LikeIcon'} /> - <span data-qa-anchor="reaction_button_text_view">{children}</span> - </UIReactButton> - ); -}; diff --git a/src/v4/social/elements/ReactButton/index.ts b/src/v4/social/elements/ReactButton/index.ts deleted file mode 100644 index adb77263e..000000000 --- a/src/v4/social/elements/ReactButton/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { ReactButton } from './ReactButton'; diff --git a/src/v4/social/elements/ReactButton/styles.tsx b/src/v4/social/elements/ReactButton/styles.tsx deleted file mode 100644 index 467d54247..000000000 --- a/src/v4/social/elements/ReactButton/styles.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import styled from 'styled-components'; - -export const UIReactButton = styled.button` - ${({ theme }) => theme.typography.bodyBold}; - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.25rem; - border-radius: 1.5rem; - padding: 0.5rem 0.625rem; - background-color: #292b32; - cursor: pointer; - border: none; - color: ${({ theme }) => theme.v4.colors.baseInverse.default}; -`; - -export const UIRemoteImageButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - color: ${({ theme }) => theme.colors.baseInverse.default}; -`; diff --git a/src/v4/social/elements/ReactionButton/Crying.tsx b/src/v4/social/elements/ReactionButton/Crying.tsx new file mode 100644 index 000000000..72597127f --- /dev/null +++ b/src/v4/social/elements/ReactionButton/Crying.tsx @@ -0,0 +1,42 @@ +import React from 'react'; + +const Crying = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="33" + viewBox="0 0 32 33" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clip-path="url(#clip0_1709_7904)"> + <path + d="M16 32.5C24.8366 32.5 32 25.3366 32 16.5C32 7.66344 24.8366 0.5 16 0.5C7.16344 0.5 0 7.66344 0 16.5C0 25.3366 7.16344 32.5 16 32.5Z" + fill="#FFD54F" + /> + <path + d="M9.33317 15.1667C10.8059 15.1667 11.9998 13.9728 11.9998 12.5C11.9998 11.0273 10.8059 9.83337 9.33317 9.83337C7.86041 9.83337 6.6665 11.0273 6.6665 12.5C6.6665 13.9728 7.86041 15.1667 9.33317 15.1667Z" + fill="#6D4C41" + /> + <path + d="M22.6667 15.1667C24.1394 15.1667 25.3333 13.9728 25.3333 12.5C25.3333 11.0273 24.1394 9.83337 22.6667 9.83337C21.1939 9.83337 20 11.0273 20 12.5C20 13.9728 21.1939 15.1667 22.6667 15.1667Z" + fill="#6D4C41" + /> + <path + d="M21.0248 27.3372C20.674 27.3372 20.3232 27.2038 20.0564 26.9352C17.8894 24.7682 14.1108 24.7682 11.9456 26.9352C11.4103 27.4705 10.5423 27.4705 10.007 26.9352C9.47163 26.4016 9.47163 25.5319 10.007 24.9966C11.6076 23.396 13.7362 22.5153 16.0001 22.5153C18.264 22.5153 20.3926 23.396 21.9932 24.9984C22.5286 25.5337 22.5286 26.4016 21.9932 26.937C21.7264 27.2038 21.3756 27.3372 21.0248 27.3372Z" + fill="#6D4C41" + /> + <path + d="M24.8228 16.5987C24.4495 16.0587 23.5508 16.0587 23.1775 16.5987C22.6228 17.4014 21.3335 19.3881 21.3335 20.5001C21.3335 21.9707 22.5295 23.1667 24.0002 23.1667C25.4708 23.1667 26.6668 21.9707 26.6668 20.5001C26.6668 19.3881 25.3775 17.4014 24.8228 16.5987Z" + fill="#00BCD4" + /> + </g> + <defs> + <clipPath id="clip0_1709_7904"> + <rect width="32" height="32" fill="white" transform="translate(0 0.5)" /> + </clipPath> + </defs> + </svg> +); + +export default Crying; diff --git a/src/v4/social/elements/ReactionButton/Fire.tsx b/src/v4/social/elements/ReactionButton/Fire.tsx new file mode 100644 index 000000000..a93727cd2 --- /dev/null +++ b/src/v4/social/elements/ReactionButton/Fire.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +const Fire = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="33" + viewBox="0 0 32 33" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <circle cx="16" cy="16.5" r="16" fill="url(#paint0_linear_1709_7888)" /> + <g clip-path="url(#clip0_1709_7888)"> + <path + d="M21.8752 10.2903C21.3417 9.70788 20.5123 8.92173 20.1595 10.6968C20.0395 11.3004 19.7591 11.7656 19.5189 12.1402C19.2599 10.8296 18.4808 9.47308 17.7467 8.55843C17.472 8.21623 16.4973 6.85588 16.3101 4.58008C16.2821 4.24043 15.8787 4.08093 15.6263 4.31003C13.2147 6.49923 11.891 9.51013 11.8419 12.8998C11.8419 12.8998 10.8377 12.0533 10.2921 10.4786C10.1452 10.0546 9.57671 9.97368 9.33006 10.3486C9.28271 10.4206 9.23881 10.4927 9.19921 10.5627C7.33856 13.8527 6.44351 17.848 7.27096 21.565C8.65446 27.7898 17.8062 29.5301 22.6511 25.6177C27.3914 21.7899 25.8846 14.6654 21.8752 10.2903Z" + fill="#ED694A" + /> + <path + d="M20.4125 14.8409C20.0185 14.4107 19.4058 13.83 19.1452 15.1411C19.0566 15.5869 18.8495 15.9306 18.6721 16.2073C18.4809 15.2392 17.9054 14.2372 17.3632 13.5617C17.1603 13.3089 16.4404 12.3042 16.302 10.6231C16.2814 10.3722 15.9834 10.2545 15.797 10.4237C14.0158 12.0406 13.038 14.2646 13.0018 16.7682C13.0018 16.7682 12.26 16.143 11.8571 14.9799C11.7486 14.6667 11.3287 14.607 11.1465 14.8839C11.1116 14.9371 11.0791 14.9904 11.0499 15.0421C9.67554 17.4721 9.01444 20.4231 9.62559 23.1686C10.6475 27.7664 17.4071 29.0518 20.9857 26.162C24.4869 23.3347 23.3739 18.0725 20.4125 14.8409Z" + fill="#F4A32C" + /> + <path + d="M19.077 18.9949C18.8103 18.7037 18.3955 18.3106 18.2191 19.1982C18.1592 19.5 18.0189 19.7326 17.8988 19.9199C17.7693 19.2645 17.3798 18.5863 17.0127 18.129C16.8754 17.9579 16.3881 17.2777 16.2944 16.1398C16.2804 15.9699 16.0787 15.8902 15.9525 16.0048C14.7467 17.0994 14.0849 18.6049 14.0603 20.2996C14.0603 20.2996 13.5582 19.8764 13.2855 19.0891C13.212 18.8771 12.9278 18.8366 12.8045 19.0241C12.7808 19.06 12.7589 19.0961 12.739 19.1311C11.8087 20.7761 11.3612 22.7737 11.7749 24.6323C12.4666 27.7447 17.0425 28.6149 19.4649 26.6586C20.2945 25.9887 20.8088 25.0448 20.9131 24.0006C21.0706 22.4191 20.4619 20.5062 19.077 18.9949Z" + fill="#F4D44E" + /> + <path + d="M17.838 22.85C17.6894 22.6878 17.4583 22.4688 17.36 22.9632C17.3266 23.1314 17.2485 23.261 17.1816 23.3653C17.1094 23.0002 16.8924 22.6223 16.6879 22.3676C16.6114 22.2722 16.3399 21.8933 16.2877 21.2593C16.2799 21.1647 16.1675 21.1203 16.0972 21.1841C15.4255 21.7939 15.0567 22.6327 15.043 23.5769C15.043 23.5769 14.7633 23.3411 14.6113 22.9024C14.5704 22.7843 14.412 22.7617 14.3434 22.8662C14.3302 22.8863 14.318 22.9064 14.307 22.9259C13.7887 23.8424 13.5393 24.9553 13.7698 25.9907C14.2947 28.3523 18.5971 28.2807 18.861 25.6388C18.9486 24.7577 18.6095 23.6919 17.838 22.85Z" + fill="#EAE9E8" + /> + <path + d="M14.7688 26.4597C14.5383 25.5334 14.7876 24.5379 15.3059 23.7181C15.3169 23.7006 15.3292 23.6827 15.3423 23.6647C15.411 23.5713 15.5694 23.5914 15.6103 23.6971C15.7622 24.0895 16.042 24.3004 16.042 24.3004C16.0532 23.6064 16.3046 22.9764 16.7664 22.4711C16.6631 22.3281 16.3472 21.9833 16.2877 21.2597C16.2799 21.165 16.1675 21.1207 16.0972 21.1844C15.4255 21.7943 15.0567 22.633 15.043 23.5772C15.043 23.5772 14.7633 23.3414 14.6113 22.9028C14.5704 22.7847 14.412 22.7621 14.3434 22.8666C14.3302 22.8867 14.318 22.9068 14.307 22.9263C13.7887 23.8427 13.5393 24.9557 13.7698 25.9911C13.9831 26.9509 14.8594 27.5277 15.8282 27.6669C15.3056 27.4102 14.904 27.0038 14.7688 26.4597Z" + fill="#F7E7A1" + /> + </g> + <defs> + <linearGradient + id="paint0_linear_1709_7888" + x1="7.2" + y1="7.7" + x2="24.8" + y2="29.3" + gradientUnits="userSpaceOnUse" + > + <stop stop-color="#FFF09F" /> + <stop offset="1" stop-color="#FCCF5A" /> + </linearGradient> + <clipPath id="clip0_1709_7888"> + <rect width="25.6" height="25.6" fill="white" transform="translate(3.2002 2.09998)" /> + </clipPath> + </defs> + </svg> +); + +export default Fire; diff --git a/src/v4/social/elements/ReactionButton/Happy.tsx b/src/v4/social/elements/ReactionButton/Happy.tsx new file mode 100644 index 000000000..9ff7a58cf --- /dev/null +++ b/src/v4/social/elements/ReactionButton/Happy.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +const Happy = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g id="Reactions" clip-path="url(#clip0_1709_1751)"> + <path + id="Vector" + d="M16 32C24.8366 32 32 24.8366 32 16C32 7.16344 24.8366 0 16 0C7.16344 0 0 7.16344 0 16C0 24.8366 7.16344 32 16 32Z" + fill="#FFD54F" + /> + <path + id="Vector_2" + d="M27.2933 19.9601C26.9867 20.9334 26.5867 21.8267 26.0667 22.6667H5.93332C5.41332 21.8267 5.01332 20.9334 4.70665 19.9601C4.61332 19.6534 4.66665 19.3334 4.86665 19.0801C5.05332 18.8134 5.34665 18.6667 5.66665 18.6667H26.3333C26.6533 18.6667 26.9467 18.8134 27.1333 19.0801C27.3333 19.3334 27.3867 19.6534 27.2933 19.9601Z" + fill="white" + /> + <path + id="Vector_3" + d="M26.0664 22.6667C23.9598 26.1201 20.1864 28.2934 15.9998 28.2934C11.8131 28.2934 8.03977 26.1201 5.93311 22.6667H26.0664Z" + fill="#E53935" + /> + <path + id="Vector_4" + d="M12.3332 13.6668C11.7812 13.6668 11.3332 13.2188 11.3332 12.6668C11.3332 11.9322 10.7358 11.3335 9.99984 11.3335C9.26384 11.3335 8.6665 11.9322 8.6665 12.6668C8.6665 13.2188 8.2185 13.6668 7.6665 13.6668C7.1145 13.6668 6.6665 13.2188 6.6665 12.6668C6.6665 10.8295 8.16117 9.3335 9.99984 9.3335C11.8385 9.3335 13.3332 10.8295 13.3332 12.6668C13.3332 13.2188 12.8852 13.6668 12.3332 13.6668Z" + fill="#6D4C41" + /> + <path + id="Vector_5" + d="M24.3332 13.6668C23.7812 13.6668 23.3332 13.2188 23.3332 12.6668C23.3332 11.9322 22.7358 11.3335 21.9998 11.3335C21.2638 11.3335 20.6665 11.9322 20.6665 12.6668C20.6665 13.2188 20.2185 13.6668 19.6665 13.6668C19.1145 13.6668 18.6665 13.2188 18.6665 12.6668C18.6665 10.8295 20.1612 9.3335 21.9998 9.3335C23.8385 9.3335 25.3332 10.8295 25.3332 12.6668C25.3332 13.2188 24.8852 13.6668 24.3332 13.6668Z" + fill="#6D4C41" + /> + </g> + <defs> + <clipPath id="clip0_1709_1751"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +export default Happy; diff --git a/src/v4/social/elements/ReactionButton/Like.tsx b/src/v4/social/elements/ReactionButton/Like.tsx new file mode 100644 index 000000000..7bbb9fa9f --- /dev/null +++ b/src/v4/social/elements/ReactionButton/Like.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +const Like = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <circle cx="16" cy="16" r="16" fill="url(#paint0_linear_1709_1733)" /> + <path + d="M10.7752 12.1C11.2221 12.1 11.6002 12.4782 11.6002 12.925V21.175C11.6002 21.6563 11.2221 22 10.7752 22H8.0252C7.54395 22 7.2002 21.6563 7.2002 21.175V12.925C7.2002 12.4782 7.54395 12.1 8.0252 12.1H10.7752ZM9.4002 20.625C9.84707 20.625 10.2252 20.2813 10.2252 19.8C10.2252 19.3532 9.84707 18.975 9.4002 18.975C8.91895 18.975 8.5752 19.3532 8.5752 19.8C8.5752 20.2813 8.91895 20.625 9.4002 20.625ZM20.4002 7.2188C20.4002 8.66255 19.5064 9.48755 19.2314 10.45H22.7377C23.8721 10.45 24.7658 11.4125 24.7658 12.4782C24.8002 13.0969 24.5252 13.75 24.1127 14.1625C24.4564 14.9532 24.3877 16.0875 23.8033 16.8782C24.0783 17.7719 23.8033 18.8719 23.2189 19.4563C23.3908 20.075 23.3221 20.5907 23.0127 21.0032C22.3252 22 20.5721 22 19.0939 22H18.9908C17.3408 22 16.0002 21.4157 14.9002 20.9344C14.3502 20.6938 13.6283 20.3844 13.0783 20.3844C12.8721 20.35 12.7002 20.1782 12.7002 19.9719V12.6157C12.7002 12.5125 12.7346 12.4094 12.8033 12.3063C14.1783 10.9657 14.7627 9.5563 15.8627 8.42192C16.3783 7.9063 16.5502 7.15005 16.7564 6.3938C16.8939 5.77505 17.2033 4.40005 17.9252 4.40005C18.7502 4.40005 20.4002 4.67505 20.4002 7.2188Z" + fill="white" + /> + <defs> + <linearGradient + id="paint0_linear_1709_1733" + x1="12" + y1="3.2" + x2="26.4" + y2="39.2" + gradientUnits="userSpaceOnUse" + > + <stop stop-color="#63A1FF" /> + <stop offset="1" stop-color="#0041BE" /> + </linearGradient> + </defs> + </svg> +); + +export default Like; diff --git a/src/v4/social/elements/ReactionButton/Love.tsx b/src/v4/social/elements/ReactionButton/Love.tsx new file mode 100644 index 000000000..83b621c52 --- /dev/null +++ b/src/v4/social/elements/ReactionButton/Love.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +const Love = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g id="Reactions"> + <circle id="Ellipse 2" cx="16" cy="16" r="16" fill="url(#paint0_linear_1709_1738)" /> + <path + id="circle" + d="M22.4466 10.5836C20.7296 9.07415 18.2009 9.36319 16.6088 11.0332L16.0156 11.6755L15.3912 11.0332C13.8303 9.36319 11.2704 9.07415 9.55338 10.5836C7.58661 12.3179 7.49295 15.401 9.24119 17.2637L15.2976 23.687C15.6722 24.1045 16.3278 24.1045 16.7024 23.687L22.7588 17.2637C24.507 15.401 24.4134 12.3179 22.4466 10.5836Z" + fill="white" + /> + </g> + <defs> + <linearGradient + id="paint0_linear_1709_1738" + x1="7.2" + y1="7.2" + x2="28" + y2="39.2" + gradientUnits="userSpaceOnUse" + > + <stop stop-color="#EE5C91" /> + <stop offset="0.833333" stop-color="#E02222" /> + </linearGradient> + </defs> + </svg> +); + +export default Love; diff --git a/src/v4/social/elements/ReactionButton/ReactionButton.module.css b/src/v4/social/elements/ReactionButton/ReactionButton.module.css new file mode 100644 index 000000000..a4516b4ba --- /dev/null +++ b/src/v4/social/elements/ReactionButton/ReactionButton.module.css @@ -0,0 +1,114 @@ +.reactButton { + display: flex; + align-items: center; + justify-content: start; + gap: 0.25rem; + position: relative; + cursor: pointer; + -webkit-touch-callout: none; + user-select: none; + touch-action: none; +} + +.reactButton * { + -webkit-touch-callout: none; + user-select: none; +} + +.reactButton__icon { + width: 1.25rem; + height: 1.25rem; +} + +.reactButton__icon[data-has-my-reaction='false'] { + fill: var(--asc-color-base-shade2); +} + +.reactButton__reactionsText { + color: var(--asc-color-base-shade2); +} + +.reactButton__reactionsText[data-has-my-reaction='true'] { + color: var(--asc-color-primary-default); + text-transform: capitalize; +} + +.reactButton__panel { + position: absolute; + + /* bottom: calc(0.25rem + 0.44rem); */ + top: 0; + left: 0; + transform: translateY(calc(-100% - 0.81rem)); + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.375rem; + border-radius: 1.75rem; + background-color: var(--asc-color-base-background); + box-shadow: var(--asc-box-shadow-03); +} + +.reactButton__panel__reaction { + padding: 0.25rem 0.44rem; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + position: relative; +} + +.reactButton__panel__reaction__text { + display: none; + padding: 0 0.375rem; + align-items: center; + gap: 0.0625rem; + border-radius: 1.25rem; + background: rgb(0 0 0 / 50%); + color: var(--asc-color-white); + text-align: center; + font-size: 0.625rem; + font-style: normal; + font-weight: 400; + line-height: 1.125rem; /* 180% */ + letter-spacing: -0.0063rem; + position: absolute; + top: 0; + transform: translateY(-100%); +} + +.reactButton__panel__reaction:hover > .reactButton__panel__reaction__text, +.reactButton__panel__reaction[data-touch-over='true'] > .reactButton__panel__reaction__text { + display: flex; +} + +.reactButton__panel__reaction:hover, +.reactButton__panel__reaction[data-touch-over='true'] { + animation: reaction-scale 250ms ease-out; + scale: 1.5; +} + +.reactButton__panel__reaction[data-active='true'] { + animation: reaction-click 250ms ease-out; +} + +@keyframes reaction-scale { + from { + scale: 1; + } + + to { + scale: 1.5; + } +} + +@keyframes reaction-click { + from { + scale: 1.5; + } + + to { + scale: 2; + } +} diff --git a/src/v4/social/elements/ReactionButton/ReactionButton.stories.tsx b/src/v4/social/elements/ReactionButton/ReactionButton.stories.tsx new file mode 100644 index 000000000..7a1a92e73 --- /dev/null +++ b/src/v4/social/elements/ReactionButton/ReactionButton.stories.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { ReactionButton } from './ReactionButton'; + +export default { + title: 'v4-social/elements/ReactionButton', +}; + +export const ReactionButtonStory = { + render: () => { + return ( + <div style={{ height: 200, display: 'flex', flexDirection: 'column', justifyContent: 'end' }}> + <ReactionButton myReactions={[]} onReactionClick={() => {}} reactionsCount={0} /> + </div> + ); + }, + + name: 'ReactionButton', +}; diff --git a/src/v4/social/elements/ReactionButton/ReactionButton.tsx b/src/v4/social/elements/ReactionButton/ReactionButton.tsx new file mode 100644 index 000000000..8416f47cf --- /dev/null +++ b/src/v4/social/elements/ReactionButton/ReactionButton.tsx @@ -0,0 +1,331 @@ +import React, { useEffect, useRef, useState } from 'react'; +import clsx from 'clsx'; +import { Typography } from '~/v4/core/components'; +import { IconComponent } from '~/v4/core/IconComponent'; +import Crying from '~/v4/social/elements/ReactionButton/Crying'; +import Fire from '~/v4/social/elements/ReactionButton/Fire'; +import Happy from '~/v4/social/elements/ReactionButton/Happy'; +import Like from '~/v4/social/elements/ReactionButton/Like'; +import Love from '~/v4/social/elements/ReactionButton/Love'; +import styles from './ReactionButton.module.css'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +const LikeSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="17" + height="18" + viewBox="0 0 17 18" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M15.9727 9.6543C16.1055 10.418 16.0059 11.1484 15.6738 11.7461C15.7734 12.543 15.541 13.373 15.0762 13.9707C15.043 15.8301 13.9141 17.125 11.3574 17.125C11.125 17.125 10.8594 17.125 10.5938 17.125C7.20703 17.125 6.17773 15.8633 4.68359 15.8301C4.58398 16.2617 4.15234 16.5938 3.6875 16.5938H1.5625C0.964844 16.5938 0.5 16.1289 0.5 15.5312V7.5625C0.5 6.99805 0.964844 6.5 1.5625 6.5H4.81641C5.44727 5.96875 6.34375 4.50781 7.10742 3.74414C7.57227 3.2793 7.43945 0.125 9.49805 0.125C11.3906 0.125 12.6523 1.1875 12.6523 3.61133C12.6523 4.24219 12.5195 4.74023 12.3535 5.17188H13.582C15.1758 5.17188 16.4375 6.5332 16.4375 7.99414C16.4375 8.625 16.2715 9.15625 15.9727 9.6543ZM13.9141 11.4473C14.6445 10.7832 14.5449 9.75391 14.0801 9.25586C14.4121 9.25586 14.8438 8.625 14.8438 8.02734C14.8105 7.39648 14.2793 6.76562 13.582 6.76562H10.1289C10.1289 5.50391 11.0586 4.90625 11.0586 3.61133C11.0586 2.81445 11.0586 1.71875 9.49805 1.71875C8.86719 2.34961 9.16602 3.94336 8.23633 4.87305C7.33984 5.76953 6.04492 8.09375 5.08203 8.09375H4.75V14.3027C6.50977 14.3027 8.07031 15.5312 10.4277 15.5312H11.6895C12.8516 15.5312 13.7148 14.9668 13.4492 13.373C13.9473 13.0742 14.3457 12.1445 13.9141 11.4473ZM3.42188 14.4688C3.42188 14.0371 3.05664 13.6719 2.625 13.6719C2.16016 13.6719 1.82812 14.0371 1.82812 14.4688C1.82812 14.9336 2.16016 15.2656 2.625 15.2656C3.05664 15.2656 3.42188 14.9336 3.42188 14.4688Z" /> + </svg> +); + +interface ReactionButtonProps { + pageId?: string; + componentId?: string; + myReactions: string[]; + reactionsCount?: number; + defaultIconClassName?: string; + imgIconClassName?: string; + onReactionClick: (reactionKey: string) => void; +} + +const MOUSE_DURATION = 250; + +export function ReactionButton({ + pageId = '*', + componentId = '*', + myReactions, + reactionsCount, + defaultIconClassName, + imgIconClassName, + onReactionClick, +}: ReactionButtonProps) { + const elementId = 'reaction_button'; + const { isExcluded, accessibilityId, config, defaultConfig, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + const clickTimerRef = useRef(0); + const touchTimerRef = useRef<NodeJS.Timeout | null>(null); + const [isShowReactionPanel, setIsShowReactionPanel] = useState(false); + + const likeRef = useRef<HTMLDivElement>(null); + const loveRef = useRef<HTMLDivElement>(null); + const fireRef = useRef<HTMLDivElement>(null); + const happyRef = useRef<HTMLDivElement>(null); + const cryingRef = useRef<HTMLDivElement>(null); + + const myReaction = myReactions && myReactions.length > 0 ? myReactions[0] : null; + const hasMyReaction = myReaction != null; + + const [selectedReaction, setSelectedReaction] = useState<string | null>(null); + const [activeReaction, setActiveReaction] = useState<string | null>(null); + + useEffect(() => { + if (selectedReaction) { + setTimeout(() => { + setSelectedReaction(null); + setIsShowReactionPanel(false); + }, 250); + } + }, [selectedReaction]); + + const hideReactionPanel = (ev: MouseEvent) => { + ev.preventDefault(); + ev.stopPropagation(); + setIsShowReactionPanel(false); + }; + + useEffect(() => { + if (isShowReactionPanel) { + window.addEventListener('click', hideReactionPanel); + } else { + window.removeEventListener('click', hideReactionPanel); + } + }, [isShowReactionPanel]); + + if (isExcluded) return null; + + const renderMyReaction = () => { + switch (myReaction) { + case 'like': + return <Like className={styles.reactButton__icon} />; + case 'love': + return <Love className={styles.reactButton__icon} />; + case 'fire': + return <Fire className={styles.reactButton__icon} />; + case 'happy': + return <Happy className={styles.reactButton__icon} />; + case 'crying': + return <Crying className={styles.reactButton__icon} />; + default: + return null; + } + }; + + return ( + <div + className={styles.reactButton} + data-qa-anchor={accessibilityId} + style={themeStyles} + onMouseDown={(ev) => { + ev.preventDefault(); + ev.stopPropagation(); + + clickTimerRef.current = Date.now(); + + touchTimerRef.current = setTimeout(() => { + setIsShowReactionPanel(true); + }, MOUSE_DURATION); + }} + onTouchStart={(ev) => { + ev.preventDefault(); + ev.stopPropagation(); + + clickTimerRef.current = Date.now(); + + touchTimerRef.current = setTimeout(() => { + setIsShowReactionPanel(true); + }, MOUSE_DURATION); + }} + onMouseMove={(ev) => { + ev.preventDefault(); + ev.stopPropagation(); + + if ( + likeRef.current && + likeRef.current.offsetLeft < ev.clientX && + ev.clientX < likeRef.current.offsetLeft + likeRef.current.clientWidth + ) { + setActiveReaction('like'); + return; + } + if ( + loveRef.current && + loveRef.current.offsetLeft < ev.clientX && + ev.clientX < loveRef.current.offsetLeft + loveRef.current.clientWidth + ) { + setActiveReaction('love'); + return; + } + if ( + fireRef.current && + fireRef.current.offsetLeft < ev.clientX && + ev.clientX < fireRef.current.offsetLeft + fireRef.current.clientWidth + ) { + setActiveReaction('fire'); + return; + } + if ( + happyRef.current && + happyRef.current.offsetLeft < ev.clientX && + ev.clientX < happyRef.current.offsetLeft + happyRef.current.clientWidth + ) { + setActiveReaction('happy'); + return; + } + if ( + cryingRef.current && + cryingRef.current.offsetLeft < ev.clientX && + ev.clientX < cryingRef.current.offsetLeft + cryingRef.current.clientWidth + ) { + setActiveReaction('crying'); + return; + } + + setActiveReaction(null); + }} + onTouchMove={(ev) => { + ev.preventDefault(); + ev.stopPropagation(); + + if ( + likeRef.current && + likeRef.current.offsetLeft < ev.touches[0].clientX && + ev.touches[0].clientX < likeRef.current.offsetLeft + likeRef.current.clientWidth + ) { + setActiveReaction('like'); + return; + } + if ( + loveRef.current && + loveRef.current.offsetLeft < ev.touches[0].clientX && + ev.touches[0].clientX < loveRef.current.offsetLeft + loveRef.current.clientWidth + ) { + setActiveReaction('love'); + return; + } + if ( + fireRef.current && + fireRef.current.offsetLeft < ev.touches[0].clientX && + ev.touches[0].clientX < fireRef.current.offsetLeft + fireRef.current.clientWidth + ) { + setActiveReaction('fire'); + return; + } + if ( + happyRef.current && + happyRef.current.offsetLeft < ev.touches[0].clientX && + ev.touches[0].clientX < happyRef.current.offsetLeft + happyRef.current.clientWidth + ) { + setActiveReaction('happy'); + return; + } + if ( + cryingRef.current && + cryingRef.current.offsetLeft < ev.touches[0].clientX && + ev.touches[0].clientX < cryingRef.current.offsetLeft + cryingRef.current.clientWidth + ) { + setActiveReaction('crying'); + return; + } + + setActiveReaction(null); + }} + onTouchEnd={(ev) => { + touchTimerRef.current && clearTimeout(touchTimerRef.current); + touchTimerRef.current = null; + setIsShowReactionPanel(false); + if (activeReaction) { + setSelectedReaction(activeReaction); + onReactionClick(activeReaction); + setActiveReaction(null); + } else { + setSelectedReaction('like'); + onReactionClick('like'); + } + }} + onMouseUp={(ev) => { + touchTimerRef.current && clearTimeout(touchTimerRef.current); + touchTimerRef.current = null; + setIsShowReactionPanel(false); + if (activeReaction) { + setSelectedReaction(activeReaction); + onReactionClick(activeReaction); + setActiveReaction(null); + } else { + setSelectedReaction('like'); + onReactionClick('like'); + } + }} + > + {myReaction ? ( + renderMyReaction() + ) : ( + <IconComponent + defaultIcon={() => ( + <LikeSvg + className={clsx(styles.reactButton__icon, defaultIconClassName)} + data-has-my-reaction="false" + /> + )} + imgIcon={() => <img src={config.icon} alt={uiReference} className={imgIconClassName} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + )} + <Typography.BodyBold + className={styles.reactButton__reactionsText} + data-has-my-reaction={hasMyReaction} + > + {typeof reactionsCount === 'number' ? reactionsCount : myReaction || config.text} + </Typography.BodyBold> + {isShowReactionPanel ? ( + <div className={styles.reactButton__panel}> + <div + className={styles.reactButton__panel__reaction} + data-active={selectedReaction === 'like'} + data-touch-over={activeReaction === 'like'} + ref={likeRef} + > + <div className={styles.reactButton__panel__reaction__text}>Like</div> + <Like /> + </div> + <div + className={styles.reactButton__panel__reaction} + data-active={selectedReaction === 'love'} + data-touch-over={activeReaction === 'love'} + ref={loveRef} + > + <div className={styles.reactButton__panel__reaction__text}>Love</div> + <Love /> + </div> + <div + className={styles.reactButton__panel__reaction} + data-active={selectedReaction === 'fire'} + data-touch-over={activeReaction === 'fire'} + ref={fireRef} + > + <div className={styles.reactButton__panel__reaction__text}>Fire</div> + <Fire /> + </div> + <div + className={styles.reactButton__panel__reaction} + data-active={selectedReaction === 'happy'} + data-touch-over={activeReaction === 'happy'} + ref={happyRef} + > + <div className={styles.reactButton__panel__reaction__text}>Happy</div> + <Happy /> + </div> + <div + className={styles.reactButton__panel__reaction} + data-active={selectedReaction === 'crying'} + data-touch-over={activeReaction === 'crying'} + ref={cryingRef} + > + <div className={styles.reactButton__panel__reaction__text}>Crying</div> + <Crying /> + </div> + </div> + ) : null} + </div> + ); +} diff --git a/src/v4/social/elements/ReactionButton/index.tsx b/src/v4/social/elements/ReactionButton/index.tsx new file mode 100644 index 000000000..158a510c2 --- /dev/null +++ b/src/v4/social/elements/ReactionButton/index.tsx @@ -0,0 +1 @@ +export { ReactionButton } from './ReactionButton'; diff --git a/src/v4/social/elements/SaveButton/SaveButton.tsx b/src/v4/social/elements/SaveButton/SaveButton.tsx index 2eb105f85..5c051389a 100644 --- a/src/v4/social/elements/SaveButton/SaveButton.tsx +++ b/src/v4/social/elements/SaveButton/SaveButton.tsx @@ -1,57 +1,39 @@ import React from 'react'; -import { PrimaryButton } from '~/core/components/Button'; +import clsx from 'clsx'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; -import { RemoteImageButton } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { useTheme } from 'styled-components'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import { Button } from '~/v4/core/components'; interface SaveButtonProps { - pageId: '*'; - componentId: 'edit_comment_component'; - onClick?: (e: React.MouseEvent) => void; - children?: React.ReactNode; - style?: React.CSSProperties; - 'data-qa-anchor'?: string; + pageId?: string; + componentId?: string; + className?: string; + onClick?: () => void; } -export const SaveButton = ({ +export function SaveButton({ pageId = '*', - componentId = 'edit_comment_component', + componentId = '*', onClick, - style, -}: SaveButtonProps) => { - const theme = useTheme(); + className, +}: SaveButtonProps) { const elementId = 'save_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); + const { accessibilityId, config, isExcluded } = useAmityElement({ + pageId, + componentId, + elementId, + }); - if (isElementExcluded) return null; + if (isExcluded) return null; - const saveIcon = elementConfig?.save_icon; - const isRemoteImage = saveIcon && isValidHttpUrl(saveIcon); - - return isRemoteImage ? ( - <RemoteImageButton - data-qa-anchor="edit_comment_component/save_button" - src={saveIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: elementConfig?.background_color || theme.v4.colors.secondary.default, - }} - /> - ) : ( - <PrimaryButton - data-qa-anchor="edit_comment_component/save_button" + return ( + <Button + variant="primary" + className={clsx(className)} + data-qa-anchor={accessibilityId} onClick={onClick} - style={{ - ...style, - backgroundColor: elementConfig?.background_color || theme.v4.colors.secondary.default, - }} > - {elementConfig?.save_button_text} - </PrimaryButton> + {config.text} + </Button> ); -}; +} diff --git a/src/v4/social/elements/SaveButton/styles.tsx b/src/v4/social/elements/SaveButton/styles.tsx deleted file mode 100644 index e43fd8e7c..000000000 --- a/src/v4/social/elements/SaveButton/styles.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import styled from 'styled-components'; - -export const RemoteImageButton = styled.img` - width: 24px; - height: 24px; - cursor: pointer; - background-color: transparent; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/SearchIcon/SearchIcon.stories.tsx b/src/v4/social/elements/SearchIcon/SearchIcon.stories.tsx new file mode 100644 index 000000000..a76869aec --- /dev/null +++ b/src/v4/social/elements/SearchIcon/SearchIcon.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { SearchIcon } from './SearchIcon'; + +export default { + title: 'v4-social/elements/SearchIcon', +}; + +export const SearchIconStory = { + render: () => { + return <SearchIcon />; + }, + + name: 'SearchIcon', +}; diff --git a/src/v4/social/elements/SearchIcon/SearchIcon.tsx b/src/v4/social/elements/SearchIcon/SearchIcon.tsx new file mode 100644 index 000000000..fa89fc0fa --- /dev/null +++ b/src/v4/social/elements/SearchIcon/SearchIcon.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { IconComponent } from '~/v4/core/IconComponent'; + +const SearchIconSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="17" + height="17" + viewBox="0 0 17 17" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M16.7109 14.6562C16.8672 14.8125 16.8672 15.0625 16.7109 15.1875L15.9922 15.9062C15.8672 16.0625 15.6172 16.0625 15.4609 15.9062L11.6797 12.125C11.6172 12.0312 11.5859 11.9375 11.5859 11.8438V11.4375C10.4297 12.4062 8.96094 13 7.33594 13C3.74219 13 0.835938 10.0938 0.835938 6.5C0.835938 2.9375 3.74219 0 7.33594 0C10.8984 0 13.8359 2.9375 13.8359 6.5C13.8359 8.125 13.2109 9.625 12.2422 10.75H12.6484C12.7422 10.75 12.8359 10.8125 12.9297 10.875L16.7109 14.6562ZM7.33594 11.5C10.0859 11.5 12.3359 9.28125 12.3359 6.5C12.3359 3.75 10.0859 1.5 7.33594 1.5C4.55469 1.5 2.33594 3.75 2.33594 6.5C2.33594 9.28125 4.55469 11.5 7.33594 11.5Z" /> + </svg> +); + +export interface SearchIconProps { + pageId?: string; + componentId?: string; + defaultClassName?: string; + imgClassName?: string; +} + +export function SearchIcon({ + pageId = '*', + componentId = '*', + defaultClassName, + imgClassName, +}: SearchIconProps) { + const elementId = 'search_icon'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIcon={() => <SearchIconSvg className={defaultClassName} style={themeStyles} />} + imgIcon={() => ( + <img src={config.icon} alt={uiReference} className={imgClassName} style={themeStyles} /> + )} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + ); +} diff --git a/src/v4/social/elements/SearchIcon/index.tsx b/src/v4/social/elements/SearchIcon/index.tsx new file mode 100644 index 000000000..18ac949b0 --- /dev/null +++ b/src/v4/social/elements/SearchIcon/index.tsx @@ -0,0 +1 @@ +export { SearchIcon } from './SearchIcon'; diff --git a/src/v4/social/elements/ShareButton/ShareButton.module.css b/src/v4/social/elements/ShareButton/ShareButton.module.css new file mode 100644 index 000000000..ebbc14ce7 --- /dev/null +++ b/src/v4/social/elements/ShareButton/ShareButton.module.css @@ -0,0 +1,15 @@ +.shareButton { + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; + cursor: pointer; +} + +.shareButton__icon { + fill: var(--asc-color-base-shade2); +} + +.shareButton__text { + color: var(--asc-color-base-shade2); +} diff --git a/src/v4/social/elements/ShareButton/ShareButton.stories.tsx b/src/v4/social/elements/ShareButton/ShareButton.stories.tsx new file mode 100644 index 000000000..c273a2ed9 --- /dev/null +++ b/src/v4/social/elements/ShareButton/ShareButton.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { ShareButton } from './ShareButton'; + +export default { + title: 'v4-social/elements/ShareButton', +}; + +export const ShareButtonStory = { + render: () => { + return <ShareButton />; + }, + + name: 'ShareButton', +}; diff --git a/src/v4/social/elements/ShareButton/ShareButton.tsx b/src/v4/social/elements/ShareButton/ShareButton.tsx new file mode 100644 index 000000000..0bd8d15d7 --- /dev/null +++ b/src/v4/social/elements/ShareButton/ShareButton.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import clsx from 'clsx'; +import { Typography } from '~/v4/core/components'; +import { IconComponent } from '~/v4/core/IconComponent'; +import styles from './ShareButton.module.css'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +const ShareSvg = ({ ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + width="18" + height="16" + viewBox="0 0 18 16" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M10.0625 7.09375H10.8594C11.291 7.09375 11.6562 7.45898 11.6562 7.89062V8.6875V9.65039L15.6406 6.03125L11.6562 2.44531V3.375V4.17188C11.6562 4.63672 11.291 4.96875 10.8594 4.96875H10.0625H6.34375C3.98633 4.96875 2.09375 6.89453 2.09375 9.21875C2.09375 9.75 2.12695 10.2148 2.25977 10.6133C2.82422 8.58789 4.65039 7.09375 6.875 7.09375H10.0625ZM10.0625 8.6875V8.7207H8.46875H6.875C5.11523 8.7207 3.6875 10.1484 3.6875 11.9082C3.6875 12.4727 3.82031 12.9043 3.98633 13.2363C4.05273 13.3359 4.08594 13.4023 4.15234 13.502C4.25195 13.6016 4.31836 13.7012 4.41797 13.7676C4.41797 13.8008 4.45117 13.8008 4.45117 13.834C4.61719 14 4.7168 14.1992 4.7168 14.4316C4.7168 14.7969 4.45117 15.0625 4.08594 15.0625C3.98633 15.0625 3.88672 15.0625 3.82031 15.0293C3.7207 14.9629 3.58789 14.8965 3.45508 14.7969C3.35547 14.7305 3.25586 14.6641 3.15625 14.5977C3.02344 14.498 2.89062 14.3984 2.75781 14.2988C1.76172 13.4355 0.5 11.8086 0.5 9.21875C0.5 5.99805 3.08984 3.375 6.34375 3.375H8.46875H10.0625V1.78125V1.25C10.0625 0.851562 10.2949 0.453125 10.6934 0.287109C11.0586 0.121094 11.5234 0.1875 11.8223 0.486328L17.1348 5.26758C17.3672 5.4668 17.5 5.73242 17.5 6.03125C17.5 6.36328 17.3672 6.62891 17.1348 6.82812L11.8223 11.6094C11.5234 11.9082 11.0586 11.9746 10.6934 11.8086C10.2949 11.6426 10.0625 11.2441 10.0625 10.8125V10.2812V8.6875Z" /> + </svg> +); + +export interface ShareButtonProps { + pageId?: string; + componentId?: string; + defaultIconClassName?: string; + imgIconClassName?: string; +} + +export function ShareButton({ + pageId = '*', + componentId = '*', + defaultIconClassName, + imgIconClassName, +}: ShareButtonProps) { + const elementId = 'share_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + // return ( + // <div className={styles.shareButton} data-qa-anchor={accessibilityId} style={themeStyles}> + // <IconComponent + // defaultIcon={() => ( + // <ShareSvg className={clsx(styles.shareButton__icon, defaultIconClassName)} /> + // )} + // imgIcon={() => <img src={config.icon} alt={uiReference} className={imgIconClassName} />} + // defaultIconName={defaultConfig.icon} + // configIconName={config.icon} + // /> + // <Typography.BodyBold className={styles.shareButton__text}>{config.text}</Typography.BodyBold> + // </div> + // ); + return null; +} diff --git a/src/v4/social/elements/ShareButton/index.tsx b/src/v4/social/elements/ShareButton/index.tsx new file mode 100644 index 000000000..64ddefe86 --- /dev/null +++ b/src/v4/social/elements/ShareButton/index.tsx @@ -0,0 +1 @@ +export { ShareButton } from './ShareButton'; diff --git a/src/v4/social/elements/ShareButton/styles.module.css b/src/v4/social/elements/ShareButton/styles.module.css new file mode 100644 index 000000000..6ee263f80 --- /dev/null +++ b/src/v4/social/elements/ShareButton/styles.module.css @@ -0,0 +1,14 @@ +.shareButton { + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; +} + +.shareButton__icon { + fill: var(--asc-color-secondary-shade4); +} + +.shareButton__text { + color: var(--asc-color-base-shade2); +} diff --git a/src/v4/social/elements/ShareStoryButton/ShareStoryButton.module.css b/src/v4/social/elements/ShareStoryButton/ShareStoryButton.module.css index bbc519e58..0992c06ed 100644 --- a/src/v4/social/elements/ShareStoryButton/ShareStoryButton.module.css +++ b/src/v4/social/elements/ShareStoryButton/ShareStoryButton.module.css @@ -1,4 +1,4 @@ -.uiShareStoryButton { +.shareStoryButton { display: inline-flex; height: 2.5rem; padding: 0.375rem 0.5rem 0.375rem 0.25rem; @@ -12,23 +12,10 @@ color: var(--asc-color-black); } -.uiShareStoryButton > span { - font-weight: var(--asc-text-font-weight-bold); - font-family: var(--asc-text-global-font-family); - font-size: var(--asc-text-font-size-md); - line-height: var(--asc-line-height-md); +.shareStoryButton[data-hideAvatar='true'] { + display: none; } .shareStoryIcon { margin-left: var(--asc-spacing-s1); } - -.remoteImageIcon { - width: 1.5rem; - height: 1.5rem; - background-color: transparent; - border: none; - outline: none; - padding: 0; - margin: 0; -} diff --git a/src/v4/social/elements/ShareStoryButton/ShareStoryButton.tsx b/src/v4/social/elements/ShareStoryButton/ShareStoryButton.tsx index 297d0dacc..13d351080 100644 --- a/src/v4/social/elements/ShareStoryButton/ShareStoryButton.tsx +++ b/src/v4/social/elements/ShareStoryButton/ShareStoryButton.tsx @@ -1,60 +1,64 @@ import React from 'react'; +import clsx from 'clsx'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit/index'; -import { useIntl } from 'react-intl'; -import { isValidHttpUrl } from '~/utils'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; -import { Icon } from '~/v4/core/components/Icon'; -import { backgroundImage as communityBackgroundImage } from '~/v4/icons/Community'; import styles from './ShareStoryButton.module.css'; -import { Avatar } from '~/v4/core/components'; +import { CommunityAvatar } from '~/v4/social/elements/CommunityAvatar'; + +const ArrowRightIcon = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="15" + height="14" + fill="none" + viewBox="0 0 15 14" + {...props} + > + <path + fill="currentColor" + d="M6.813.219c.125-.157.375-.157.53 0l6.532 6.531a.36.36 0 010 .531l-6.531 6.532c-.157.156-.407.156-.532 0l-.625-.594c-.156-.156-.156-.406 0-.531l4.844-4.876H.375A.361.361 0 010 7.438v-.875a.38.38 0 01.375-.375h10.656L6.187 1.345c-.156-.125-.156-.375 0-.532L6.813.22z" + ></path> + </svg> + ); +}; interface ShareButtonProps { onClick: () => void; - pageId: 'create_story_page'; - componentId: '*'; - avatar?: string; - style?: React.CSSProperties; - 'data-qa-anchor'?: string; + community?: Amity.Community | null; + pageId?: string; + componentId?: string; } export const ShareStoryButton = ({ - pageId = 'create_story_page', + pageId = '*', componentId = '*', + community, onClick, - avatar, }: ShareButtonProps) => { const elementId = 'share_story_button'; - const { formatMessage } = useIntl(); - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; + const { config, isExcluded } = useAmityElement({ + pageId, + componentId, + elementId, + }); - const shareIcon = elementConfig?.share_icon; - const isRemoteImage = shareIcon && isValidHttpUrl(shareIcon); + if (isExcluded) return null; return ( <button role="button" - className={styles.uiShareStoryButton} + className={clsx(styles.shareStoryButton)} data-qa-anchor="share_story_button" onClick={onClick} + data-hideAvatar={config?.hide_avatar} > - {!elementConfig?.hide_avatar && ( - <Avatar - data-qa-anchor="share_story_button_image_view" - size="small" - avatar={avatar} - backgroundImage={communityBackgroundImage} - /> - )} - <span>{formatMessage({ id: 'storyDraft.button.shareStory' })}</span> - {isRemoteImage ? ( - <img src={shareIcon} alt="Share Story Icon" className={styles.remoteImageIcon} /> - ) : ( - <Icon className={styles.shareStoryIcon} name={'ArrowRight2Icon'} /> + {!config?.hide_avatar && ( + <CommunityAvatar pageId={pageId} componentId={componentId} community={community} /> )} + <Typography.BodyBold>{config?.text || 'Share story'}</Typography.BodyBold> + <ArrowRightIcon /> </button> ); }; diff --git a/src/v4/social/elements/SpeakerButton/SpeakerButton.module.css b/src/v4/social/elements/SpeakerButton/SpeakerButton.module.css new file mode 100644 index 000000000..0bb2463b9 --- /dev/null +++ b/src/v4/social/elements/SpeakerButton/SpeakerButton.module.css @@ -0,0 +1,12 @@ +.speakerButton { + fill: var(--asc-color-white); + position: absolute; + top: 96px; + left: 24px; + z-index: 99999; +} + +.speakerButton__icon { + width: 1.5rem; + height: 1.5rem; +} diff --git a/src/v4/social/elements/SpeakerButton/SpeakerButton.tsx b/src/v4/social/elements/SpeakerButton/SpeakerButton.tsx index b8e3aa765..28bbf5296 100644 --- a/src/v4/social/elements/SpeakerButton/SpeakerButton.tsx +++ b/src/v4/social/elements/SpeakerButton/SpeakerButton.tsx @@ -1,86 +1,81 @@ import React from 'react'; +import clsx from 'clsx'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; -import { ActionButton, CustomActionButton } from './styles'; -import { isValidHttpUrl } from '~/utils'; -import { useTheme } from 'styled-components'; -import { useCustomization } from '~/v4/core/providers/CustomizationProvider'; +import styles from './SpeakerButton.module.css'; + +const SpeakerMuteSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="32" + height="32" + fill="none" + viewBox="0 0 32 32" + {...props} + > + <circle cx="16" cy="16" r="16" fill="#000" fillOpacity="0.5"></circle> + <path + fill="#fff" + d="M15.121 9.781c.527-.527 1.441-.176 1.441.598v11.777c0 .774-.914 1.125-1.44.598l-3.13-3.129H8.406c-.492 0-.844-.352-.844-.844V13.72c0-.457.352-.844.844-.844h3.586l3.13-3.094zm9.316 6.469c0 2.25-1.16 4.29-3.023 5.52-.422.246-.95.105-1.16-.282a.845.845 0 01.246-1.16 4.807 4.807 0 002.25-4.078 4.792 4.792 0 00-2.25-4.043.845.845 0 01-.246-1.16.824.824 0 011.16-.281c1.863 1.23 3.023 3.27 3.023 5.484zm-4.992-2.672c.985.527 1.617 1.582 1.617 2.672 0 1.125-.632 2.18-1.617 2.707-.422.246-.914.105-1.16-.316a.869.869 0 01.352-1.16c.422-.247.738-.704.738-1.231 0-.492-.316-.95-.738-1.195a.87.87 0 01-.352-1.16c.246-.422.738-.563 1.16-.317z" + ></path> + </svg> +); + +const SpeakerUnmuteSvg = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="32" + height="32" + fill="none" + viewBox="0 0 32 32" + {...props} + > + <circle cx="16" cy="16" r="16" fill="#000" fillOpacity="0.5"></circle> + <path + fill="#fff" + d="M25.781 22.344a.467.467 0 01.094.687l-.594.782c-.187.218-.5.28-.718.093L6.188 9.688A.468.468 0 016.093 9l.625-.781a.468.468 0 01.687-.094l4.75 3.656 1.563-1.531c.469-.469 1.281-.156 1.281.531v3.188l2.469 1.937a1.234 1.234 0 00-.625-.969.773.773 0 01-.313-1.03c.219-.376.657-.5 1.032-.282A2.739 2.739 0 0119 16c0 .344-.094.625-.188.938l1.22.937c.28-.563.468-1.188.468-1.875a4.26 4.26 0 00-2-3.594.75.75 0 01-.219-1.031c.219-.344.688-.469 1.032-.25C20.968 12.188 22 14.031 22 16a5.727 5.727 0 01-.75 2.813l1.188.937c.656-1.125 1.03-2.406 1.03-3.719 0-2.468-1.218-4.781-3.312-6.125-.343-.219-.437-.687-.218-1.062A.795.795 0 0121 8.625c2.5 1.656 4 4.406 4 7.375 0 1.688-.5 3.281-1.375 4.656l2.156 1.688zM7 13.75c0-.25.125-.469.344-.625L15 19.031v2.219c0 .688-.813 1-1.281.531L10.938 19H7.75a.722.722 0 01-.75-.75v-4.5z" + ></path> + </svg> + ); +}; interface SpeakerButtonProps { - pageId: 'story_page'; - componentId: '*'; isMuted: boolean; - onClick?: (e: React.MouseEvent) => void; - style?: React.CSSProperties; - 'data-qa-anchor'?: string; + pageId?: string; + componentId?: string; + defaultIconClassName?: string; + imgIconClassName?: string; + onPress: () => void; } -export const SpeakerButton = ({ - pageId = 'story_page', +export function SpeakerButton({ + isMuted, + pageId = '*', componentId = '*', - isMuted = false, - onClick = () => {}, - style, - ...props -}: SpeakerButtonProps) => { - const theme = useTheme(); + defaultIconClassName, + imgIconClassName, + onPress, +}: SpeakerButtonProps) { const elementId = 'speaker_button'; - const { getConfig, isExcluded } = useCustomization(); - const elementConfig = getConfig(`${pageId}/${componentId}/${elementId}`); - const isElementExcluded = isExcluded(`${pageId}/${componentId}/${elementId}`); - - if (isElementExcluded) return null; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); - const mutedIcon = elementConfig?.mute_icon; - const unmutedIcon = elementConfig?.unmute_icon; + if (isExcluded) return null; - const isMutedRemoteImage = mutedIcon && isValidHttpUrl(mutedIcon); - const isUnmutedRemoteImage = unmutedIcon && isValidHttpUrl(unmutedIcon); - - return isMuted ? ( - isMutedRemoteImage ? ( - <CustomActionButton - data-qa-anchor="video_audio_button" - src={mutedIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: elementConfig?.background_color || theme.v4.colors.base.default, - }} - {...props} - /> - ) : ( - <ActionButton - data-qa-anchor="video_audio_button" - name={'UnmuteCircle'} - onClick={onClick} - style={{ - ...style, - backgroundColor: elementConfig?.background_color || theme.v4.colors.base.default, - }} - {...props} - /> - ) - ) : isUnmutedRemoteImage ? ( - <CustomActionButton - data-qa-anchor="video_audio_button" - src={unmutedIcon} - onClick={onClick} - style={{ - ...style, - backgroundColor: elementConfig?.background_color || theme.v4.colors.base.default, - }} - {...props} - /> - ) : ( - <ActionButton - data-qa-anchor="video_audio_button" - name={'MuteCircle'} - onClick={onClick} - style={{ - ...style, - backgroundColor: elementConfig?.background_color || theme.v4.colors.base.default, - }} - {...props} + return ( + <IconComponent + data-qa-anchor={accessibilityId} + className={clsx(styles.speakerButton)} + onPress={onPress} + defaultIcon={() => (isMuted ? <SpeakerUnmuteSvg /> : <SpeakerMuteSvg />)} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgIconClassName)} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} /> ); -}; +} diff --git a/src/v4/social/elements/SpeakerButton/styles.tsx b/src/v4/social/elements/SpeakerButton/styles.tsx deleted file mode 100644 index 401b4dcaa..000000000 --- a/src/v4/social/elements/SpeakerButton/styles.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import styled from 'styled-components'; -import { Icon } from '~/v4/core/components'; - -export const ActionButton = styled(Icon)` - width: 1.5rem; - height: 1.5rem; - padding: 0.25rem; - cursor: pointer; - border-radius: 50%; - position: absolute; - top: 96px; - left: 24px; - z-index: 99999; -`; - -export const CustomActionButton = styled.img` - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - background-color: transparent; - border: none; - outline: none; - padding: 0; - margin: 0; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - opacity: 0.8; - } - - &:active { - opacity: 0.6; - } -`; diff --git a/src/v4/social/elements/StoryCommentButton/StoryCommentButton.module.css b/src/v4/social/elements/StoryCommentButton/StoryCommentButton.module.css new file mode 100644 index 000000000..9e10a7467 --- /dev/null +++ b/src/v4/social/elements/StoryCommentButton/StoryCommentButton.module.css @@ -0,0 +1,17 @@ +.storyCommentButton { + display: flex; + padding: var(--asc-spacing-s1) var(--asc-spacing-s2); + align-items: center; + gap: var(--asc-spacing-xxs3); + border-radius: var(--asc-border-radius-full); + background: var(--asc-color-secondary-default); + color: var(--asc-color-white); + cursor: pointer; +} + +.storyCommentIcon { + display: flex; + align-items: center; + justify-content: center; + gap: var(--asc-spacing-xxs2); +} diff --git a/src/v4/social/elements/StoryCommentButton/StoryCommentButton.tsx b/src/v4/social/elements/StoryCommentButton/StoryCommentButton.tsx new file mode 100644 index 000000000..8448a095e --- /dev/null +++ b/src/v4/social/elements/StoryCommentButton/StoryCommentButton.tsx @@ -0,0 +1,77 @@ +import clsx from 'clsx'; +import millify from 'millify'; +import React from 'react'; +import { PressEvent } from 'react-aria'; +import { Typography } from '~/v4/core/components/index'; +import { useAmityElement } from '~/v4/core/hooks/uikit/index'; +import { IconComponent } from '~/v4/core/IconComponent'; + +import styles from './StoryCommentButton.module.css'; + +const StoryCommentSvg = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + fill="none" + viewBox="0 0 20 20" + {...props} + > + <path + fill="#A5A9B5" + d="M10 2.188c4.682 0 8.5 3.12 8.5 6.906C18.5 12.912 14.682 16 10 16c-1.295 0-2.49-.232-3.586-.63-.797.663-2.457 1.693-4.648 1.693-.133 0-.2-.034-.266-.133-.033-.1 0-.233.066-.3 0-.032 1.395-1.493 1.827-3.187-1.196-1.195-1.893-2.69-1.893-4.35 0-3.784 3.785-6.905 8.5-6.905z" + ></path> + </svg> + ); +}; + +interface StoryCommentButtonProps { + commentsCount: number; + onPress: (e: PressEvent) => void; + pageId?: string; + componentId?: string; + imgClassName?: string; +} + +export const StoryCommentButton = ({ + pageId = '*', + componentId = '*', + onPress, + commentsCount, + imgClassName, +}: StoryCommentButtonProps) => { + const elementId = 'story_comment_button'; + const { isExcluded, accessibilityId, defaultConfig, config, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + data-qa-anchor={accessibilityId} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + className={clsx(styles.storyCommentButton)} + imgIcon={() => ( + <img + src={config.icon} + alt={uiReference} + className={clsx(imgClassName)} + style={themeStyles} + /> + )} + defaultIcon={() => ( + <div className={clsx(styles.storyCommentIcon)}> + <StoryCommentSvg /> + <Typography.BodyBold>{millify(commentsCount)}</Typography.BodyBold> + </div> + )} + onPress={onPress} + /> + ); +}; diff --git a/src/v4/social/elements/StoryCommentButton/index.ts b/src/v4/social/elements/StoryCommentButton/index.ts new file mode 100644 index 000000000..5ac4972a8 --- /dev/null +++ b/src/v4/social/elements/StoryCommentButton/index.ts @@ -0,0 +1 @@ +export { StoryCommentButton } from './StoryCommentButton'; diff --git a/src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.module.css b/src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.module.css new file mode 100644 index 000000000..f8cddca08 --- /dev/null +++ b/src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.module.css @@ -0,0 +1,6 @@ +.impressionButton { + display: flex; + align-items: center; + gap: var(--asc-spacing-xxs2); + cursor: auto; +} diff --git a/src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.tsx b/src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.tsx new file mode 100644 index 000000000..272a13993 --- /dev/null +++ b/src/v4/social/elements/StoryImpressionButton/StoryImpressionButton.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import clsx from 'clsx'; +import { Typography } from '~/v4/core/components'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +import styles from './StoryImpressionButton.module.css'; +import millify from 'millify'; + +const StoryImpressionSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + fill="none" + viewBox="0 0 20 20" + {...props} + > + <path + fill="#A5A9B5" + d="M10 6.5c1.938 0 3.5 1.594 3.5 3.5 0 1.938-1.563 3.5-3.5 3.5A3.494 3.494 0 016.5 10c0-.281.063-.688.156-.969.188.125.594.219.844.219.938 0 1.75-.781 1.75-1.75-.031-.219-.125-.625-.25-.844.281-.062.719-.125 1-.156zm8.875 3.063a1.142 1.142 0 010 .906C17.187 13.78 13.812 16 10 16c-3.844 0-7.219-2.219-8.906-5.531a1.142 1.142 0 010-.906C2.78 6.25 6.156 4 10 4c3.813 0 7.188 2.25 8.875 5.563zM10 14.5c3.063 0 5.906-1.719 7.406-4.5-1.5-2.781-4.343-4.5-7.406-4.5-3.094 0-5.938 1.719-7.438 4.5 1.5 2.781 4.344 4.5 7.438 4.5z" + ></path> + </svg> +); + +interface StoryImpressionButtonButtonProps { + pageId?: string; + componentId?: string; + reach?: number | null; + defaultIconClassName?: string; + imgIconClassName?: string; +} + +export function StoryImpressionButton({ + pageId = '*', + componentId = '*', + reach = 0, + defaultIconClassName, + imgIconClassName, +}: StoryImpressionButtonButtonProps) { + const elementId = 'story_impression_button'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <IconComponent + defaultIcon={() => ( + <div + className={clsx(styles.impressionButton, defaultIconClassName)} + data-qa-anchor={accessibilityId} + > + <StoryImpressionSvg /> + <Typography.BodyBold>{reach}</Typography.BodyBold> + </div> + )} + imgIcon={() => <img src={config.icon} alt={uiReference} className={imgIconClassName} />} + defaultIconName={defaultConfig.icon} + configIconName={config.icon} + /> + ); +} diff --git a/src/v4/social/elements/StoryImpressionButton/index.ts b/src/v4/social/elements/StoryImpressionButton/index.ts new file mode 100644 index 000000000..a0950d25a --- /dev/null +++ b/src/v4/social/elements/StoryImpressionButton/index.ts @@ -0,0 +1 @@ +export { StoryImpressionButton } from './StoryImpressionButton'; diff --git a/src/v4/social/elements/StoryProgressBar/StoryProgressBar.module.css b/src/v4/social/elements/StoryProgressBar/StoryProgressBar.module.css new file mode 100644 index 000000000..a9b5ffd70 --- /dev/null +++ b/src/v4/social/elements/StoryProgressBar/StoryProgressBar.module.css @@ -0,0 +1,24 @@ +.progressBarContainer { + position: absolute; + top: 0.5rem; + left: 0.5rem; + right: 0.5rem; + height: 0.125rem; + display: flex; + justify-content: space-between; + align-items: center; + z-index: 10; +} + +.progressSegment { + height: 100%; + background-color: rgb(255 255 255 / 50%); + border-radius: 0.0625rem; + overflow: hidden; +} + +.progressBar { + height: 100%; + background-color: var(--asc-color-white); + transition: width 0.1s linear; +} diff --git a/src/v4/social/elements/StoryProgressBar/StoryProgressBar.tsx b/src/v4/social/elements/StoryProgressBar/StoryProgressBar.tsx new file mode 100644 index 000000000..88b89f25b --- /dev/null +++ b/src/v4/social/elements/StoryProgressBar/StoryProgressBar.tsx @@ -0,0 +1,102 @@ +import React, { useEffect, useState } from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit/index'; +import clsx from 'clsx'; +import styles from './StoryProgressBar.module.css'; + +interface ProgressBarProps { + duration: number; + currentIndex: number; + storiesCount: number; + isPaused: boolean; + onComplete: () => void; + pageId?: string; + componentId?: string; +} + +export const StoryProgressBar: React.FC<ProgressBarProps> = React.memo( + ({ + pageId = '*', + componentId = '*', + duration, + currentIndex, + storiesCount, + isPaused, + onComplete, + }) => { + const elementId = 'progress_bar'; + const { config, isExcluded } = useAmityElement({ + pageId, + componentId, + elementId, + }); + const [segments, setSegments] = useState<number[]>(new Array(storiesCount).fill(0)); + const [lastIndex, setLastIndex] = useState(currentIndex); + + const backgroundColor = config?.backgroundColor; + const progressColor = config?.progressColor; + + useEffect(() => { + if (currentIndex < lastIndex) { + setSegments((prevSegments) => { + const newSegments = [...prevSegments]; + newSegments[currentIndex] = 0; + return newSegments; + }); + } + setLastIndex(currentIndex); + }, [currentIndex, lastIndex]); + + useEffect(() => { + let interval: NodeJS.Timeout; + + if (!isPaused) { + interval = setInterval(() => { + setSegments((prevSegments) => { + const newSegments = [...prevSegments]; + if (newSegments[currentIndex] < 100) { + newSegments[currentIndex] += (100 / duration) * 100; + if (newSegments[currentIndex] >= 100) { + newSegments[currentIndex] = 100; + onComplete(); + } + } + return newSegments; + }); + }, 100); + } + + return () => { + if (interval) clearInterval(interval); + }; + }, [duration, currentIndex, isPaused, onComplete]); + + if (isExcluded) return null; + + return ( + <div + className={clsx(styles.progressBarContainer)} + style={{ backgroundColor } as React.CSSProperties} + > + {segments.map((progress, index) => ( + <div + key={index} + className={clsx(styles.progressSegment)} + style={{ + width: `calc(${100 / storiesCount}% - 4px)`, + }} + > + <div + className={clsx(styles.progressBar)} + style={ + { + width: `${index < currentIndex ? 100 : index === currentIndex ? progress : 0}%`, + backgroundColor: progressColor, + } as React.CSSProperties + } + /> + </div> + ))} + </div> + ); + }, +); diff --git a/src/v4/social/elements/StoryProgressBar/index.ts b/src/v4/social/elements/StoryProgressBar/index.ts new file mode 100644 index 000000000..3d82aa21f --- /dev/null +++ b/src/v4/social/elements/StoryProgressBar/index.ts @@ -0,0 +1 @@ +export { StoryProgressBar } from './StoryProgressBar'; diff --git a/src/v4/social/elements/StoryReactionButton/StoryReactionButton.module.css b/src/v4/social/elements/StoryReactionButton/StoryReactionButton.module.css new file mode 100644 index 000000000..1032c4c10 --- /dev/null +++ b/src/v4/social/elements/StoryReactionButton/StoryReactionButton.module.css @@ -0,0 +1,17 @@ +.storyReactionButton { + display: flex; + padding: var(--asc-spacing-s1) var(--asc-spacing-s2); + align-items: center; + gap: var(--asc-spacing-xxs3); + border-radius: var(--asc-border-radius-full); + background: var(--asc-color-secondary-default); + color: var(--asc-color-white); + cursor: pointer; +} + +.storyReactionIcon { + display: flex; + align-items: center; + justify-content: center; + gap: var(--asc-spacing-xxs2); +} diff --git a/src/v4/social/elements/StoryReactionButton/StoryReactionButton.tsx b/src/v4/social/elements/StoryReactionButton/StoryReactionButton.tsx new file mode 100644 index 000000000..cec901262 --- /dev/null +++ b/src/v4/social/elements/StoryReactionButton/StoryReactionButton.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import clsx from 'clsx'; +import { IconComponent } from '~/v4/core/IconComponent'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +import styles from './StoryReactionButton.module.css'; +import { Typography } from '~/v4/core/components/index'; +import millify from 'millify'; + +const StoryReactionSvg = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + fill="none" + viewBox="0 0 20 20" + {...props} + > + <path + fill="#A5A9B5" + d="M17.793 11.025c.148.854.037 1.67-.334 2.338a3.437 3.437 0 01-.668 2.487c-.037 2.078-1.299 3.525-4.156 3.525h-.854c-3.785 0-4.935-1.41-6.605-1.447-.112.482-.594.853-1.114.853H1.688c-.667 0-1.187-.52-1.187-1.187V8.687c0-.63.52-1.187 1.188-1.187h3.636c.705-.594 1.707-2.227 2.56-3.08.52-.52.372-4.045 2.673-4.045 2.115 0 3.525 1.188 3.525 3.896 0 .706-.148 1.262-.334 1.745h1.373c1.781 0 3.191 1.521 3.191 3.154 0 .705-.185 1.299-.519 1.855zm-2.3 2.004c.816-.742.704-1.892.185-2.449.37 0 .853-.705.853-1.373-.037-.705-.63-1.41-1.41-1.41h-3.86c0-1.41 1.04-2.078 1.04-3.526 0-.89 0-2.115-1.744-2.115-.705.705-.372 2.487-1.41 3.526-1.002 1.002-2.45 3.6-3.526 3.6H5.25v6.939c1.967 0 3.71 1.373 6.346 1.373h1.41c1.299 0 2.264-.631 1.967-2.412.556-.334 1.002-1.373.52-2.153zM3.765 16.406a.903.903 0 00-.891-.89.88.88 0 00-.89.89c0 .52.37.89.89.89a.88.88 0 00.89-.89z" + ></path> + </svg> + ); +}; + +const StoryMyReactionSvg = (props: React.SVGProps<SVGSVGElement>) => { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + fill="none" + viewBox="0 0 24 24" + {...props} + > + <circle cx="12" cy="12" r="12" fill="url(#paint0_linear_7702_34939)"></circle> + <path + fill="#fff" + d="M7.486 10.575H5.42a.611.611 0 00-.62.619v6.187c0 .361.258.619.62.619h2.066c.336 0 .62-.258.62-.619v-6.187a.628.628 0 00-.62-.62zm-1.033 6.394a.596.596 0 01-.62-.62c0-.334.258-.618.62-.618.336 0 .62.284.62.619 0 .36-.284.619-.62.619zm8.264-10.055c0-1.908-1.24-2.114-1.859-2.114-.542 0-.775 1.031-.878 1.495-.155.567-.284 1.134-.672 1.521-.826.851-1.265 1.908-2.298 2.913a.415.415 0 00-.078.232v5.518c0 .154.13.283.284.31.414 0 .956.231 1.37.412.826.36 1.833.799 3.073.799h.077c1.11 0 2.428 0 2.944-.748.233-.31.285-.696.155-1.16.44-.438.646-1.263.44-1.934.439-.593.49-1.443.232-2.036.31-.31.516-.8.49-1.264 0-.799-.67-1.52-1.523-1.52h-2.635c.207-.723.878-1.341.878-2.424z" + ></path> + <defs> + <linearGradient + id="paint0_linear_7702_34939" + x1="9" + x2="19.8" + y1="2.4" + y2="29.4" + gradientUnits="userSpaceOnUse" + > + <stop stopColor="#5B9DFF"></stop> + <stop offset="1" stopColor="#0041BE"></stop> + </linearGradient> + </defs> + </svg> + ); +}; + +interface StoryReactionButtonProps { + myReactions?: string[]; + reactionsCount: number; + pageId?: string; + componentId?: string; + defaultIconClassName?: string; + imgIconClassName?: string; + onPress: () => void; +} + +export const StoryReactionButton = ({ + myReactions = [], + reactionsCount, + pageId = '*', + componentId = '*', + defaultIconClassName, + imgIconClassName, + onPress, +}: StoryReactionButtonProps) => { + const elementId = 'story_reaction_button'; + const { isExcluded, accessibilityId, config, uiReference } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const hasMyReactions = myReactions.length > 0; + + if (isExcluded) return null; + + return ( + <IconComponent + data-qa-anchor={accessibilityId} + className={clsx(styles.storyReactionButton)} + defaultIcon={() => ( + <div className={clsx(styles.storyReactionIcon, defaultIconClassName)}> + {hasMyReactions ? <StoryMyReactionSvg /> : <StoryReactionSvg />} + <Typography.BodyBold>{millify(reactionsCount)}</Typography.BodyBold> + </div> + )} + imgIcon={() => <img src={config.icon} alt={uiReference} className={clsx(imgIconClassName)} />} + onPress={onPress} + /> + ); +}; diff --git a/src/v4/social/elements/StoryReactionButton/index.ts b/src/v4/social/elements/StoryReactionButton/index.ts new file mode 100644 index 000000000..cf80af8db --- /dev/null +++ b/src/v4/social/elements/StoryReactionButton/index.ts @@ -0,0 +1 @@ +export { StoryReactionButton } from './StoryReactionButton'; diff --git a/src/v4/social/elements/StoryRing/StoryRing.module.css b/src/v4/social/elements/StoryRing/StoryRing.module.css new file mode 100644 index 000000000..5752587d1 --- /dev/null +++ b/src/v4/social/elements/StoryRing/StoryRing.module.css @@ -0,0 +1,26 @@ +.emptyStateRing { + stroke: var(--asc-color-secondary-shade4); + stroke-width: 2; + fill: none; +} + +.errorRing { + stroke: var(--asc-color-alert); +} + +.uploadingProgressRing { + stroke-dasharray: 339; + stroke-dashoffset: 339; + transform: rotate(-90deg); + animation: progress 2s linear infinite; +} + +@keyframes progress { + 0% { + stroke-dashoffset: 339; + } + + 100% { + stroke-dashoffset: 0; + } +} diff --git a/src/v4/social/elements/StoryRing/StoryRing.tsx b/src/v4/social/elements/StoryRing/StoryRing.tsx new file mode 100644 index 000000000..9a6c86826 --- /dev/null +++ b/src/v4/social/elements/StoryRing/StoryRing.tsx @@ -0,0 +1,235 @@ +import React from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +import styles from './StoryRing.module.css'; + +const EmptyStateRingSvg = ({ + pageId, + componentId, + elementId, + size, +}: { + pageId: string; + componentId: string; + elementId: string; + size: number; +}) => { + const { config } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const progressColors = config?.progress_color as string[]; + + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + fill="none" + viewBox={`0 0 ${size} ${size}`} + > + <defs> + <linearGradient + id="story-ring-gradient" + x1="35.4004" + y1="1.875" + x2="10.6504" + y2="45.75" + gradientUnits="userSpaceOnUse" + > + <stop stopColor={progressColors[0]} /> + <stop offset={1} stopColor={progressColors[1]} /> + </linearGradient> + </defs> + <circle cx={size / 2} cy={size / 2} r={size / 2 - 1} className={styles.emptyStateRing} /> + </svg> + ); +}; + +const HasSeenRingSvg = ({ + pageId, + componentId, + elementId, + size, +}: { + pageId: string; + componentId: string; + elementId: string; + size: number; +}) => { + const { config } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const progressColors = config?.progress_color as string[]; + + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + fill="none" + viewBox={`0 0 ${size} ${size}`} + > + <defs> + <linearGradient + id="story-ring-gradient" + x1="35.4004" + y1="1.875" + x2="10.6504" + y2="45.75" + gradientUnits="userSpaceOnUse" + > + <stop stopColor={progressColors[0]} /> + <stop offset={1} stopColor={progressColors[1]} /> + </linearGradient> + </defs> + <circle + cx={size / 2} + cy={size / 2} + r={size / 2 - 1} + strokeWidth="2" + strokeLinecap="round" + stroke="url(#story-ring-gradient)" + fill="none" + strokeDasharray={339} + strokeDashoffset={0} + /> + </svg> + ); +}; + +const UploadingRingSvg = ({ + pageId, + componentId, + elementId, + size, +}: { + pageId: string; + componentId: string; + elementId: string; + size: number; +}) => { + const { config } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const progressColors = config?.progress_color as string[]; + + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + fill="none" + viewBox={`0 0 ${size} ${size}`} + > + <defs> + <linearGradient + id="story-ring-gradient" + x1="35.4004" + y1="1.875" + x2="10.6504" + y2="45.75" + gradientUnits="userSpaceOnUse" + > + <stop stopColor={progressColors[0]} /> + <stop offset={1} stopColor={progressColors[1]} /> + </linearGradient> + </defs> + <circle + className={styles.uploadingProgressRing} + cx={size / 2} + cy={size / 2} + r={size / 2 - 1} + strokeWidth="2" + strokeLinecap="round" + stroke="url(#story-ring-gradient)" + fill="none" + strokeDasharray={339} + strokeDashoffset={339} + transform={`rotate(-90 ${size / 2} ${size / 2})`} + /> + </svg> + ); +}; + +interface StoryRingProps extends React.SVGProps<SVGSVGElement> { + pageId?: string; + componentId?: string; + hasUnseen?: boolean; + uploading?: boolean; + isErrored?: boolean; + size?: number; +} + +export const StoryRing = ({ + pageId = '*', + componentId = '*', + hasUnseen = false, + uploading = false, + isErrored = false, + size = 64, + ...props +}: StoryRingProps) => { + const elementId = 'story_ring'; + const { isExcluded, config } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + if (isErrored) { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + fill="none" + viewBox={`0 0 ${size} ${size}`} + {...props} + > + <circle + cx={size / 2} + cy={size / 2} + r={size / 2 - 1} + stroke={getComputedStyle(document.documentElement).getPropertyValue('--asc-color-alert')} + strokeWidth="2" + ></circle> + </svg> + ); + } + + if (uploading) { + return ( + <UploadingRingSvg + pageId={pageId} + componentId={componentId} + elementId={elementId} + size={size} + /> + ); + } + + if (hasUnseen) { + return ( + <HasSeenRingSvg pageId={pageId} componentId={componentId} elementId={elementId} size={size} /> + ); + } + + return ( + <EmptyStateRingSvg + pageId={pageId} + componentId={componentId} + elementId={elementId} + size={size} + /> + ); +}; diff --git a/src/v4/social/elements/StoryRing/index.tsx b/src/v4/social/elements/StoryRing/index.tsx new file mode 100644 index 000000000..ef21c319c --- /dev/null +++ b/src/v4/social/elements/StoryRing/index.tsx @@ -0,0 +1 @@ +export { StoryRing } from './StoryRing'; diff --git a/src/v4/social/elements/Timestamp/Timestamp.module.css b/src/v4/social/elements/Timestamp/Timestamp.module.css new file mode 100644 index 000000000..0a4e578ec --- /dev/null +++ b/src/v4/social/elements/Timestamp/Timestamp.module.css @@ -0,0 +1,3 @@ +.timestamp { + color: var(--asc-color-base-shade2); +} diff --git a/src/v4/social/elements/Timestamp/Timestamp.stories.tsx b/src/v4/social/elements/Timestamp/Timestamp.stories.tsx new file mode 100644 index 000000000..0e78e4efc --- /dev/null +++ b/src/v4/social/elements/Timestamp/Timestamp.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { Timestamp } from './Timestamp'; + +export default { + title: 'v4-social/elements/Timestamp', +}; + +export const TimestampStory = { + render: () => { + return <Timestamp timestamp={20} />; + }, + + name: 'Timestamp', +}; diff --git a/src/v4/social/elements/Timestamp/Timestamp.tsx b/src/v4/social/elements/Timestamp/Timestamp.tsx new file mode 100644 index 000000000..0a068a448 --- /dev/null +++ b/src/v4/social/elements/Timestamp/Timestamp.tsx @@ -0,0 +1,89 @@ +import React, { ReactNode } from 'react'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import styles from './Timestamp.module.css'; +import dayjs from 'dayjs'; +import relativeTime from 'dayjs/plugin/relativeTime'; +import updateLocale from 'dayjs/plugin/updateLocale'; +import { Typography } from '~/v4/core/components'; + +dayjs.extend(updateLocale); +dayjs.extend(relativeTime); + +dayjs.updateLocale('en', { + relativeTime: { + future: 'in %s', + past: '%s', + s: 'Just now', + m: '1m', + mm: '%dm', + h: '1h', + hh: '%dh', + d: '1d', + dd: '%dd', + M: function (number: number, withoutSuffix: string, key: string, isFuture: boolean) { + if (isFuture) return number + 'M'; + const date = dayjs().subtract(number, 'M'); + const currentDate = dayjs(); + if (date.get('year') === currentDate.get('year')) { + return date.format('D MMM'); + } + return date.format('D MMM YYYY'); + }, + MM: function (number: number, withoutSuffix: string, key: string, isFuture: boolean) { + if (isFuture) return number + 'M'; + const date = dayjs().subtract(number, 'M'); + const currentDate = dayjs(); + if (date.get('year') === currentDate.get('year')) { + return date.format('D MMM'); + } + return date.format('D MMM YYYY'); + }, + y: function (number: number, withoutSuffix: string, key: string, isFuture: boolean) { + if (isFuture) return number + 'y'; + const date = dayjs().subtract(number, 'y'); + const currentDate = dayjs(); + if (date.get('year') === currentDate.get('year')) { + return date.format('D MMM'); + } + return date.format('D MMM YYYY'); + }, + yy: function (number: number, withoutSuffix: string, key: string, isFuture: boolean) { + if (isFuture) return number + 'y'; + const date = dayjs().subtract(number, 'y'); + const currentDate = dayjs(); + if (date.get('year') === currentDate.get('year')) { + return date.format('D MMM'); + } + return date.format('D MMM YYYY'); + }, + }, +}); + +interface TimestampProps { + pageId?: string; + componentId?: string; + timestamp: Date | string; +} + +export function Timestamp({ pageId = '*', componentId = '*', timestamp }: TimestampProps) { + const elementId = 'timestamp'; + const { accessibilityId, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + const relativeTimeStr = dayjs(timestamp).fromNow(); + + if (isExcluded) return null; + + return ( + <Typography.Caption + className={styles.timestamp} + style={themeStyles} + data-qa-anchor={accessibilityId} + > + {relativeTimeStr} + </Typography.Caption> + ); +} diff --git a/src/v4/social/elements/Timestamp/index.tsx b/src/v4/social/elements/Timestamp/index.tsx new file mode 100644 index 000000000..aae66e6a7 --- /dev/null +++ b/src/v4/social/elements/Timestamp/index.tsx @@ -0,0 +1 @@ +export { Timestamp } from './Timestamp'; diff --git a/src/v4/social/elements/Title/Title.module.css b/src/v4/social/elements/Title/Title.module.css new file mode 100644 index 000000000..57e4598ff --- /dev/null +++ b/src/v4/social/elements/Title/Title.module.css @@ -0,0 +1,4 @@ +.title { + color: var(--asc-color-base-shade3); + text-align: center; +} diff --git a/src/v4/social/elements/Title/Title.stories.tsx b/src/v4/social/elements/Title/Title.stories.tsx new file mode 100644 index 000000000..9535dbb52 --- /dev/null +++ b/src/v4/social/elements/Title/Title.stories.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import { Title } from './Title'; + +export default { + title: 'v4-social/elements/Title', +}; + +export const TitleStory = { + render: () => { + return <Title />; + }, + + name: 'Title', +}; diff --git a/src/v4/social/elements/Title/Title.tsx b/src/v4/social/elements/Title/Title.tsx new file mode 100644 index 000000000..fa05f0a5b --- /dev/null +++ b/src/v4/social/elements/Title/Title.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import styles from './Title.module.css'; +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import clsx from 'clsx'; + +interface TitleProps { + pageId?: string; + componentId?: string; + titleClassName?: string; +} + +export function Title({ pageId = '*', componentId = '*', titleClassName }: TitleProps) { + const elementId = 'title'; + const { accessibilityId, config, isExcluded, themeStyles } = useAmityElement({ + pageId, + componentId, + elementId, + }); + + if (isExcluded) return null; + + return ( + <Typography.Title + className={clsx(styles.title, titleClassName)} + style={themeStyles} + data-qa-anchor={accessibilityId} + > + {config.text} + </Typography.Title> + ); +} diff --git a/src/v4/social/elements/Title/index.tsx b/src/v4/social/elements/Title/index.tsx new file mode 100644 index 000000000..177576b64 --- /dev/null +++ b/src/v4/social/elements/Title/index.tsx @@ -0,0 +1 @@ +export { Title } from './Title'; diff --git a/src/v4/social/elements/index.ts b/src/v4/social/elements/index.ts index db4ec65b3..f1cc29ff7 100644 --- a/src/v4/social/elements/index.ts +++ b/src/v4/social/elements/index.ts @@ -1,14 +1,14 @@ export { AspectRatioButton } from './AspectRatioButton'; -export { BackButton } from './BackButton/BackButton'; -export { CloseButton } from './CloseButton/CloseButton'; -export { CancelButton } from './CancelButton/CancelButton'; -export { CommentButton } from './CommentButton'; -export { CreateStoryButton } from './CreateStoryButton/CreateStoryButton'; -export { HyperLinkButton } from './HyperLinkButton/HyperLinkButton'; -export { ImpressionButton } from './ImpressionButton'; -export { OverflowMenuButton } from './OverflowMenuButton/OverflowMenuButton'; -export { ReactButton } from './ReactButton'; +export { BackButton } from './BackButton'; +export { CloseButton } from './CloseButton'; +export { CancelButton } from './CancelButton'; +export { CreateStoryButton } from './CreateStoryButton'; +export { HyperLinkButton } from './HyperLinkButton'; +export { StoryImpressionButton } from './StoryImpressionButton'; +export { OverflowMenuButton } from './OverflowMenuButton'; +export { ReactionButton } from './ReactionButton'; export { SaveButton } from './SaveButton'; -export { ShareStoryButton } from './ShareStoryButton/ShareStoryButton'; +export { ShareStoryButton } from './ShareStoryButton'; export { SpeakerButton } from './SpeakerButton'; export { HyperLink } from './HyperLink'; +export { CreateNewStoryButton } from './CreateNewStoryButton'; diff --git a/src/v4/social/hooks/collections/useCommunitiesCollection.ts b/src/v4/social/hooks/collections/useCommunitiesCollection.ts new file mode 100644 index 000000000..210bdc16d --- /dev/null +++ b/src/v4/social/hooks/collections/useCommunitiesCollection.ts @@ -0,0 +1,18 @@ +import { CommunityRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +export default function useCommunitiesCollection( + queryParams?: Parameters<typeof CommunityRepository.getCommunities>[0], + shouldCall?: () => boolean, +) { + const { items, ...rest } = useLiveCollection({ + fetcher: CommunityRepository.getCommunities, + params: queryParams as Parameters<typeof CommunityRepository.getCommunities>[0], + shouldCall: () => !!queryParams && (shouldCall ? shouldCall?.() : true), + }); + + return { + communities: items, + ...rest, + }; +} diff --git a/src/v4/social/hooks/collections/useCommunityMembersCollection.ts b/src/v4/social/hooks/collections/useCommunityMembersCollection.ts new file mode 100644 index 000000000..be5668978 --- /dev/null +++ b/src/v4/social/hooks/collections/useCommunityMembersCollection.ts @@ -0,0 +1,15 @@ +import { CommunityRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/core/hooks/useLiveCollection'; + +export default function useCommunityMembersCollection(communityId?: string, limit: number = 5) { + const { items, ...rest } = useLiveCollection({ + fetcher: CommunityRepository.Membership.getMembers, + params: { communityId: communityId as string, limit, memberships: ['member'] }, + shouldCall: () => !!communityId, + }); + + return { + members: items, + ...rest, + }; +} diff --git a/src/v4/social/hooks/collections/useCommunityModeratorsCollection.ts b/src/v4/social/hooks/collections/useCommunityModeratorsCollection.ts new file mode 100644 index 000000000..e6a7ae273 --- /dev/null +++ b/src/v4/social/hooks/collections/useCommunityModeratorsCollection.ts @@ -0,0 +1,18 @@ +import { CommunityRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; +import { MemberRoles } from '~/v4/social/constants/memberRoles'; + +const { COMMUNITY_MODERATOR } = MemberRoles; + +export default function useCommunityModeratorsCollection(communityId?: string) { + const { items, ...rest } = useLiveCollection({ + fetcher: CommunityRepository.Membership.getMembers, + params: { communityId: communityId as string, roles: [COMMUNITY_MODERATOR] }, + shouldCall: () => !!communityId, + }); + + return { + moderators: items, + ...rest, + }; +} diff --git a/src/v4/social/hooks/collections/useGlobalStoryTargets.ts b/src/v4/social/hooks/collections/useGlobalStoryTargets.ts new file mode 100644 index 000000000..959cd327b --- /dev/null +++ b/src/v4/social/hooks/collections/useGlobalStoryTargets.ts @@ -0,0 +1,26 @@ +import { StoryRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +export const useGlobalStoryTargets = ( + params: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>, +) => { + const { items, hasMore, loadMore, ...rest } = useLiveCollection({ + fetcher: StoryRepository.getGlobalStoryTargets, + params, + shouldCall: () => true, + }); + + const loadMoreStories = () => { + if (hasMore) { + loadMore(); + } + }; + + + return { + stories: items, + hasMore, + loadMoreStories, + ...rest, + }; +}; diff --git a/src/v4/social/hooks/collections/useReactionsCollection.ts b/src/v4/social/hooks/collections/useReactionsCollection.ts new file mode 100644 index 000000000..e58c66f9c --- /dev/null +++ b/src/v4/social/hooks/collections/useReactionsCollection.ts @@ -0,0 +1,18 @@ +import { ReactionRepository } from '@amityco/ts-sdk'; + +import useLiveCollection from '~/core/hooks/useLiveCollection'; + +type UseReactionsCollectionParams = Parameters<typeof ReactionRepository.getReactions>[0]; + +export const useReactionsCollection = (params: UseReactionsCollectionParams) => { + const { items, ...rest } = useLiveCollection({ + fetcher: ReactionRepository.getReactions, + params, + shouldCall: () => !!params.referenceId && !!params.referenceType, + }); + + return { + reactions: items, + ...rest, + }; +}; diff --git a/src/v4/social/hooks/index.ts b/src/v4/social/hooks/index.ts index e19849fde..518c834d5 100644 --- a/src/v4/social/hooks/index.ts +++ b/src/v4/social/hooks/index.ts @@ -1,3 +1,10 @@ export * from './collections/useReactionsCollection'; export { useGetActiveStoriesByTarget } from './useGetActiveStories'; export { useCommentFlaggedByMe } from './useCommentFlaggedByMe'; +export { default as useCommunityPermission } from './useCommunityPermission'; +export { useCommunityInfo } from './useCommunityInfo'; +export { default as useCategoriesByIds } from './useCategoriesByIds'; +export { default as useCommunityStoriesSubscription } from './useCommunityStoriesSubscription'; +export { default as useGetStoryByStoryId } from './useGetStoryByStoryId'; +export { default as useLiveCollection } from './useLiveCollection'; +export { useUserQueryByDisplayName } from './useUserQueryByDisplayName'; diff --git a/src/v4/social/hooks/useCategoriesByIds.ts b/src/v4/social/hooks/useCategoriesByIds.ts new file mode 100644 index 000000000..981e36ec7 --- /dev/null +++ b/src/v4/social/hooks/useCategoriesByIds.ts @@ -0,0 +1,23 @@ +import { CategoryRepository } from '@amityco/ts-sdk'; +import { useEffect, useState } from 'react'; + +const useCategoriesByIds = (categoryIds?: string[]) => { + const [categories, setCategories] = useState<Amity.Category[]>([]); + + useEffect(() => { + async function run() { + if (categoryIds == null || categoryIds.length === 0) return; + const categories = await Promise.all( + categoryIds.map( + async (categoryId) => (await CategoryRepository.getCategory(categoryId)).data, + ), + ); + setCategories(categories); + } + run(); + }, [categoryIds]); + + return categories; +}; + +export default useCategoriesByIds; diff --git a/src/v4/social/hooks/useCommentFlaggedByMe.ts b/src/v4/social/hooks/useCommentFlaggedByMe.ts new file mode 100644 index 000000000..50fbfa908 --- /dev/null +++ b/src/v4/social/hooks/useCommentFlaggedByMe.ts @@ -0,0 +1,70 @@ +import React, { useEffect, useState } from 'react'; +import { CommentRepository } from '@amityco/ts-sdk'; +import { useQuery } from '@tanstack/react-query'; +import { useNotifications } from '~/v4/core/providers/NotificationProvider'; + +export const useCommentFlaggedByMe = (commentId?: string) => { + const notification = useNotifications(); + const [isFlaggedByMe, setIsFlaggedByMe] = useState(false); + + const { data, isLoading, refetch } = useQuery({ + queryKey: ['asc-uikit', 'CommentRepository', 'isCommentFlaggedByMe', commentId], + queryFn: () => { + return CommentRepository.isCommentFlaggedByMe(commentId as string); + }, + enabled: commentId != null, + }); + + useEffect(() => { + if (data != null) { + setIsFlaggedByMe(data); + } + }, [data]); + + const flagComment = async () => { + if (commentId == null) return; + try { + setIsFlaggedByMe(true); + await CommentRepository.flagComment(commentId); + } catch (_error) { + setIsFlaggedByMe(false); + } finally { + refetch(); + } + }; + + const unflagComment = async () => { + if (commentId == null) return; + try { + setIsFlaggedByMe(false); + await CommentRepository.unflagComment(commentId); + } catch (_error) { + setIsFlaggedByMe(true); + } finally { + refetch(); + } + }; + + const toggleFlagComment = async () => { + if (commentId == null) return; + if (isFlaggedByMe) { + await unflagComment(); + notification.success({ + content: 'Comment unreported', + }); + } else { + await flagComment(); + notification.success({ + content: 'Comment reported', + }); + } + }; + + return { + isLoading, + isFlaggedByMe, + flagComment, + unflagComment, + toggleFlagComment, + }; +}; diff --git a/src/v4/social/hooks/useCommunityInfo.ts b/src/v4/social/hooks/useCommunityInfo.ts new file mode 100644 index 000000000..10696952e --- /dev/null +++ b/src/v4/social/hooks/useCommunityInfo.ts @@ -0,0 +1,55 @@ +import { useMemo } from 'react'; +import { CommunityRepository } from '@amityco/ts-sdk'; +import useCommunityPermission from '~/social/hooks/useCommunityPermission'; +import usePostsCollection from '~/social/hooks/collections/usePostsCollection'; +import useImage from '~/v4/core/hooks/useImage'; +import useCommunity from '~/v4/core/hooks/collections/useCommunity'; +import useCategoriesByIds from '~/v4/social/hooks/useCategoriesByIds'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; + +export const useCommunityInfo = (communityId?: string) => { + const { onEditCommunity } = useNavigation(); + const { community } = useCommunity({ + communityId, + shouldCall: () => !!communityId, + }); + const avatarFileUrl = useImage({ fileId: community?.avatarFileId, imageSize: 'medium' }); + + const { posts: reviewingPosts } = usePostsCollection({ + targetType: 'community', + targetId: communityId, + feedType: 'reviewing', + }); + + const categories = useCategoriesByIds(community?.categoryIds); + + const { canReview, canEdit } = useCommunityPermission({ community }); + + const pendingPostsCount = useMemo(() => { + return reviewingPosts?.length || 0; + }, [reviewingPosts]); + + type updateCommunityFnType = typeof CommunityRepository.updateCommunity; + + const updateCommunity = (payload: Parameters<updateCommunityFnType>[1]) => + communityId && CommunityRepository.updateCommunity(communityId, payload); + + const joinCommunity = () => communityId && CommunityRepository.joinCommunity(communityId); + const leaveCommunity = () => communityId && CommunityRepository.leaveCommunity(communityId); + const closeCommunity = () => communityId && CommunityRepository.deleteCommunity(communityId); + + return { + community, + reviewingPosts, + avatarFileUrl, + communityCategories: categories, + pendingPostsCount, + canEditCommunity: canEdit, + canReviewCommunityPosts: canReview, + onEditCommunity, + joinCommunity, + leaveCommunity, + updateCommunity, + closeCommunity, + }; +}; diff --git a/src/v4/social/hooks/useCommunityPermission.ts b/src/v4/social/hooks/useCommunityPermission.ts new file mode 100644 index 000000000..722357aad --- /dev/null +++ b/src/v4/social/hooks/useCommunityPermission.ts @@ -0,0 +1,21 @@ +import useSDK from '~/v4/core/hooks/useSDK'; +import useCommunityModeratorsCollection from '~/v4/social/hooks/collections/useCommunityModeratorsCollection'; + +const useCommunityPermission = ({ community }: { community?: Amity.Community | null }) => { + const { currentUserId, userRoles } = useSDK(); + const { moderators } = useCommunityModeratorsCollection(community?.communityId); + + const moderator = moderators.find((moderator) => moderator.userId === currentUserId); + + const isGlobalAdmin = userRoles.find((role) => role === 'global-admin') != null; + + const isModerator = moderator != null; + + return { + isModerator, + canEdit: isGlobalAdmin || isModerator, + canReview: isGlobalAdmin || isModerator, + }; +}; + +export default useCommunityPermission; diff --git a/src/v4/social/hooks/useCommunityStoriesSubscription.ts b/src/v4/social/hooks/useCommunityStoriesSubscription.ts new file mode 100644 index 000000000..b5e26e928 --- /dev/null +++ b/src/v4/social/hooks/useCommunityStoriesSubscription.ts @@ -0,0 +1,29 @@ +import { StoryRepository, getCommunityStoriesTopic } from '@amityco/ts-sdk'; +import useSubscription from '~/v4/core/hooks/subscriptions/useSubscription'; + +export default function useCommunityStoriesSubscription({ + targetId, + targetType, + shouldSubscribe = () => true, + callback, +}: { + targetId: string; + targetType: Amity.StoryTargetType; + shouldSubscribe?: () => boolean; + callback?: Amity.Listener; +}) { + return useSubscription({ + fetcher: StoryRepository.getActiveStoriesByTarget, + params: { + targetId, + targetType, + }, + callback, + shouldSubscribe: () => !!targetId && shouldSubscribe(), + getSubscribedTopic: () => + getCommunityStoriesTopic({ + targetId, + targetType, + }), + }); +} diff --git a/src/v4/social/hooks/useGetActiveStories.ts b/src/v4/social/hooks/useGetActiveStories.ts new file mode 100644 index 000000000..11ee4037e --- /dev/null +++ b/src/v4/social/hooks/useGetActiveStories.ts @@ -0,0 +1,15 @@ +import { StoryRepository } from '@amityco/ts-sdk'; +import useLiveCollection from '~/v4/core/hooks/useLiveCollection'; + +export const useGetActiveStoriesByTarget = (params: Amity.GetStoriesByTargetParam) => { + const { items, ...rest } = useLiveCollection({ + fetcher: StoryRepository.getActiveStoriesByTarget, + params, + shouldCall: () => true, + }); + + return { + stories: items, + ...rest, + }; +}; diff --git a/src/v4/social/hooks/useLiveCollection.ts b/src/v4/social/hooks/useLiveCollection.ts new file mode 100644 index 000000000..a78b0dd14 --- /dev/null +++ b/src/v4/social/hooks/useLiveCollection.ts @@ -0,0 +1,80 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useSDKLiveCollectionConnector } from '~/v4/core/providers/SDKConnectorProvider'; + + +function useLiveCollection<TCallback, TParams>({ + fetcher, + params, + callback = () => {}, + config, + shouldCall = () => true, +}: { + fetcher: ( + params: Amity.LiveCollectionParams<TParams>, + callback: Amity.LiveCollectionCallback<TCallback>, + config?: Amity.LiveCollectionConfig, + ) => Amity.Unsubscriber; + params: Amity.LiveCollectionParams<TParams>; + callback?: Amity.LiveCollectionCallback<TCallback>; + config?: Amity.LiveCollectionConfig; + shouldCall?: () => boolean; +}): { + items: TCallback[]; + isLoading: boolean; + hasMore: boolean; + loadMore: () => void; + error: Error | null; + loadMoreHasBeenCalled: boolean; +} { + const { subscribe } = useSDKLiveCollectionConnector(); + const [loadMoreHasBeenCalled, setLoadMoreHasBeenCalled] = useState(false); + const [isLoading, setIsLoading] = useState(shouldCall ? shouldCall() : true); + const [items, setItems] = useState<TCallback[]>([]); + const [error, setError] = useState<Error | null>(null); + const [hasMore, setHasMore] = useState(false); + const loadMoreFnRef = useRef<(() => void) | null>(null); + + const loadMore = useCallback(() => { + if (loadMoreFnRef.current) { + setLoadMoreHasBeenCalled(true); + loadMoreFnRef.current?.(); + } + }, [loadMoreFnRef, loadMoreHasBeenCalled, isLoading, setIsLoading]); + + const callbackFn = useCallback( + (response) => { + if (!shouldCall()) return; + if (response.data) setItems(response.data); + setIsLoading(response.loading); + setHasMore(response.hasNextPage); + setError(response.error); + loadMoreFnRef.current = response.onNextPage; + callback(response); + }, + [shouldCall, setItems, setIsLoading, setHasMore, loadMoreFnRef, callback], + ); + + useEffect(() => { + if (!shouldCall()) return; + const { unsubscribe } = subscribe({ + fetcher, + params, + callback: callbackFn, + }); + + return () => { + unsubscribe(); + }; + }, [params, shouldCall]); + + return { + items, + hasMore, + isLoading, + loadMore, + error, + loadMoreHasBeenCalled, + }; +} + +export default useLiveCollection; diff --git a/src/v4/social/hooks/useUserQueryByDisplayName.ts b/src/v4/social/hooks/useUserQueryByDisplayName.ts new file mode 100644 index 000000000..ab8916988 --- /dev/null +++ b/src/v4/social/hooks/useUserQueryByDisplayName.ts @@ -0,0 +1,56 @@ +import { UserRepository } from '@amityco/ts-sdk'; +import { useEffect, useRef, useState } from 'react'; + +const MINIMUM_STRING_LENGTH_TO_TRIGGER_QUERY = 1; + +export const useUserQueryByDisplayName = ( + displayName: string, + minLength: number = MINIMUM_STRING_LENGTH_TO_TRIGGER_QUERY, +) => { + const [items, setItems] = useState<Amity.User[]>([]); + const [isLoading, setIsLoading] = useState(false); + const [hasMore, setHasMore] = useState(false); + const [loadMoreHasBeenCalled, setLoadMoreHasBeenCalled] = useState(false); + const loadMoreRef = useRef<(() => void) | null>(null); + const unSubRef = useRef<(() => void) | null>(null); + + const loadMore = () => { + if (loadMoreRef.current) { + loadMoreRef.current(); + setLoadMoreHasBeenCalled(true); + } + }; + + useEffect(() => { + if (displayName.length < minLength) return; + + if (unSubRef.current) { + unSubRef.current(); + unSubRef.current = null; + } + + const unSubFn = UserRepository.searchUserByDisplayName( + { displayName, limit: 10 }, + (response) => { + setHasMore(response.hasNextPage || false); + setIsLoading(response.loading); + loadMoreRef.current = response.onNextPage || null; + setItems(response.data); + }, + ); + unSubRef.current = unSubFn; + + return () => { + unSubRef.current?.(); + unSubRef.current = null; + }; + }, [displayName, minLength]); + + return { + users: items, + isLoading, + hasMore, + loadMore, + loadMoreHasBeenCalled, + }; +}; diff --git a/src/v4/social/internal-components/Badege/Badge.tsx b/src/v4/social/internal-components/Badege/Badge.tsx deleted file mode 100644 index d70e5cf73..000000000 --- a/src/v4/social/internal-components/Badege/Badge.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import styles from './Badge.module.css'; -import { BadgeProps } from './types'; - -export const Badge = ({ icon, communityRole }: BadgeProps) => { - return ( - <div className={styles.badge}> - {icon} - {communityRole} - </div> - ); -}; diff --git a/src/v4/social/internal-components/Badege/index.ts b/src/v4/social/internal-components/Badege/index.ts deleted file mode 100644 index 26a9e305c..000000000 --- a/src/v4/social/internal-components/Badege/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Badge } from './Badge'; diff --git a/src/v4/social/internal-components/Badege/types.ts b/src/v4/social/internal-components/Badege/types.ts deleted file mode 100644 index 16228ce56..000000000 --- a/src/v4/social/internal-components/Badege/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface BadgeProps { - icon: React.ReactNode; - communityRole: string; -} diff --git a/src/v4/social/internal-components/Comment/Comment.module.css b/src/v4/social/internal-components/Comment/Comment.module.css index e7bf63915..46a8e9a08 100644 --- a/src/v4/social/internal-components/Comment/Comment.module.css +++ b/src/v4/social/internal-components/Comment/Comment.module.css @@ -30,7 +30,6 @@ text-align: center; color: var(--asc-color-base-shade2); background-color: var(--asc-color-base-background); - border-top: 1px solid var(--asc-color-base-shade4); } .deletedCommentBlock:first-child { diff --git a/src/v4/social/internal-components/Comment/CommentText.module.css b/src/v4/social/internal-components/Comment/CommentText.module.css index abcd23fcf..433b00dba 100644 --- a/src/v4/social/internal-components/Comment/CommentText.module.css +++ b/src/v4/social/internal-components/Comment/CommentText.module.css @@ -3,7 +3,7 @@ word-break: break-word; color: var(--asc-color-base-default); background-color: var(--asc-color-base-shade4); - border-radius: 0 0.75rem 0.75rem 0.75rem; + border-radius: 0 0.75rem 0.75rem; padding: 0.75rem; display: inline-block; white-space: pre-wrap; @@ -20,3 +20,8 @@ .readMoreButton:hover { text-decoration: underline; } + +.mentionHighlightTag { + cursor: pointer; + color: var(--asc-color-primary-default); +} diff --git a/src/v4/social/internal-components/Comment/CommentText.tsx b/src/v4/social/internal-components/Comment/CommentText.tsx index 693df78e6..569571385 100644 --- a/src/v4/social/internal-components/Comment/CommentText.tsx +++ b/src/v4/social/internal-components/Comment/CommentText.tsx @@ -1,13 +1,21 @@ -import React, { useMemo, useState } from 'react'; +import React, { ReactNode, useMemo, useState } from 'react'; import { FormattedMessage } from 'react-intl'; import Truncate from 'react-truncate-markup'; import clsx from 'clsx'; import { findChunks, Mentioned } from '~/v4/helpers/utils'; -import MentionHighlightTag from '~/core/components/MentionHighlightTag'; import { processChunks } from '~/core/components/ChunkHighlighter'; import Linkify from '~/core/components/Linkify'; import styles from './CommentText.module.css'; +interface MentionHighlightTagProps { + children: ReactNode; + mentionee: Mentioned; +} + +const MentionHighlightTag = ({ children }: MentionHighlightTagProps) => { + return <span className={styles.mentionHighlightTag}>{children}</span>; +}; + const COMMENT_MAX_LINES = 8; interface CommentTextProps { diff --git a/src/v4/social/internal-components/Comment/UIComment.module.css b/src/v4/social/internal-components/Comment/UIComment.module.css index fe9e36cd3..84035a6f7 100644 --- a/src/v4/social/internal-components/Comment/UIComment.module.css +++ b/src/v4/social/internal-components/Comment/UIComment.module.css @@ -1,10 +1,10 @@ .avatar { - margin-right: 0.5rem; + margin-right: var(--asc-spacing-s1); } .container { display: flex; - gap: 1rem; + gap: var(--asc-spacing-m1); width: 100%; } @@ -14,18 +14,18 @@ } .editedMark { - margin-left: 0.3125rem; + margin-left: var(--asc-spacing-xxs2); color: var(--asc-color-neutral-shade1); font-size: var(--asc-text-font-size-sm); font-weight: var(--asc-text-font-weight-normal); line-height: var(--asc-line-height-sm); } -.editedMark:before { +.editedMark::before { content: '('; } -.editedMark:after { +.editedMark::after { content: ')'; } @@ -33,20 +33,20 @@ display: flex; justify-content: flex-start; align-items: center; - gap: 0.75rem; + gap: var(--asc-spacing-s2); } .reactionsWrapper { display: flex; align-items: center; - gap: 0.5rem; + gap: var(--asc-spacing-s1); } .interactionBar { display: flex; width: 100%; justify-content: space-between; - padding: 0.25rem 1rem 0.75rem 0rem; + padding: var(--asc-spacing-xxs2) var(--asc-spacing-m1) var(--asc-spacing-s2) 0; align-items: center; } @@ -58,27 +58,27 @@ .buttonContainer { display: flex; justify-content: flex-end; - margin-top: 0.5rem; + margin-top: var(--asc-spacing-s1); } .buttonContainer > * { - margin-left: 0.5rem; + margin-left: var(--asc-spacing-s1); } .commentEditTextarea { font-size: var(--asc-text-font-size-md); font-weight: var(--asc-text-font-weight-normal); line-height: var(--asc-line-height-lg); - border-radius: 0 0.75rem 0.75rem 0.75rem; + border-radius: 0 var(--asc-border-radius-lg) var(--asc-border-radius-lg); height: 7.5rem; - padding: 0.75rem; + padding: var(--asc-spacing-s2); } .reactionListButtonContainer { display: flex; align-items: center; justify-content: center; - gap: 0.5rem; + gap: var(--asc-spacing-s1); color: var(--asc-color-base-shade2); } @@ -95,7 +95,7 @@ width: 1.25rem; height: 1.25rem; border-radius: 50%; - margin-left: -0.25rem; + margin-left: calc(-1 * var(--asc-spacing-xxs2)); } .reactionIcon:first-child { @@ -103,23 +103,23 @@ } .commentInteractionButton { - padding: 0.25rem; + padding: var(--asc-spacing-xxs2); display: flex; align-items: center; - gap: 0.5rem; + gap: var(--asc-spacing-s1); color: var(--asc-color-base-shade2); cursor: pointer; border: none; } .likeButton { - padding: 0.25rem; + padding: var(--asc-spacing-xxs2); color: var(--asc-color-base-shade2); border: none; } .liked { - padding: 0.25rem; + padding: var(--asc-spacing-xxs2); color: var(--asc-color-primary-default); border: none; } @@ -127,13 +127,13 @@ .reactionListButton { border: none; color: var(--asc-color-primary-default); - padding: 0; + padding: var(--asc-spacing-xxs2); } .content { display: inline-flex; flex-direction: column; - gap: 0.25rem; + gap: var(--asc-spacing-xxs2); width: 100%; } @@ -141,7 +141,7 @@ display: inline-flex; justify-content: flex-start; align-items: center; - gap: 0.125rem; + gap: var(--asc-spacing-xxs2); color: var(--asc-color-base-default); } @@ -152,3 +152,8 @@ text-align: center; color: var(--asc-color-base-shade2); } + +.moderatorBadge__container { + display: flex; + margin-bottom: var(--asc-spacing-xxs2); +} diff --git a/src/v4/social/internal-components/Comment/UIComment.tsx b/src/v4/social/internal-components/Comment/UIComment.tsx index 927ff22d1..09a421751 100644 --- a/src/v4/social/internal-components/Comment/UIComment.tsx +++ b/src/v4/social/internal-components/Comment/UIComment.tsx @@ -18,6 +18,7 @@ import InputText from '~/v4/core/components/InputText'; import { Avatar, Typography } from '~/v4/core/components'; import Button from '~/v4/core/components/Button/Button'; import clsx from 'clsx'; +import { ModeratorBadge } from '../../elements/ModeratorBadge/ModeratorBadge'; interface StyledCommentProps { commentId?: string; @@ -74,6 +75,7 @@ interface StyledCommentProps { referenceType?: Amity.Comment['referenceType']; referenceId?: Amity.Comment['referenceId']; onClickReactionList: () => void; + isModerator?: boolean; } const UIComment = ({ @@ -104,6 +106,7 @@ const UIComment = ({ referenceType, commentId, onClickReactionList, + isModerator, }: StyledCommentProps) => { return ( <div className={styles.container}> @@ -113,6 +116,12 @@ const UIComment = ({ <Typography.CaptionBold>{authorName}</Typography.CaptionBold> </div> + {isModerator && ( + <div className={styles.moderatorBadge__container}> + <ModeratorBadge /> + </div> + )} + {isEditing ? ( <div className={styles.commentEditContainer}> <InputText diff --git a/src/v4/social/internal-components/Comment/index.tsx b/src/v4/social/internal-components/Comment/index.tsx index 00fc0a068..573f7dbd2 100644 --- a/src/v4/social/internal-components/Comment/index.tsx +++ b/src/v4/social/internal-components/Comment/index.tsx @@ -37,6 +37,7 @@ import { TrashIcon, PenIcon, FlagIcon, MinusCircleIcon } from '~/v4/social/icons import { LoadingIndicator } from '~/v4/social/internal-components/LoadingIndicator'; import useCommunityMembersCollection from '~/v4/social/hooks/collections/useCommunityMembersCollection'; import { useCommentFlaggedByMe } from '~/v4/social/hooks'; +import { isModerator } from '~/helpers/permissions'; const REPLIES_PER_PAGE = 5; @@ -48,6 +49,8 @@ function getCommentData(comment: Amity.Comment | null) { } interface CommentProps { + pageId?: string; + componentId: string; commentId: string; readonly?: boolean; userRoles?: string[]; @@ -61,7 +64,13 @@ interface CommentProps { shouldAllowInteraction?: boolean; } -export const Comment = ({ commentId, readonly, onClickReply }: CommentProps) => { +export const Comment = ({ + pageId = '*', + componentId = '*', + commentId, + readonly, + onClickReply, +}: CommentProps) => { const comment = useComment(commentId); const story = useGetStoryByStoryId(comment?.referenceId); const { members } = useCommunityMembersCollection(story?.community?.communityId); @@ -73,7 +82,7 @@ export const Comment = ({ commentId, readonly, onClickReply }: CommentProps) => const commentAuthor = useUser(comment?.userId); const commentAuthorAvatar = useImage({ fileId: commentAuthor?.avatarFileId, imageSize: 'small' }); - const { userRoles } = useSDK(); + const { userRoles, currentUserId } = useSDK(); const { toggleFlagComment, isFlaggedByMe } = useCommentFlaggedByMe(commentId); const [isEditing, setIsEditing] = useState(false); @@ -82,10 +91,6 @@ export const Comment = ({ commentId, readonly, onClickReply }: CommentProps) => const toggleBottomSheet = () => setBottomSheet((prev) => !prev); - useCommentSubscription({ - commentId, - }); - const { text, markup, mentions, onChange, queryMentionees, resetState, clearAll } = useMention({ targetId: story?.targetId, targetType: story?.targetType, @@ -178,7 +183,8 @@ export const Comment = ({ commentId, readonly, onClickReply }: CommentProps) => const title = isReplyComment ? 'reply.delete' : 'comment.delete'; const content = isReplyComment ? 'reply.deleteBody' : 'comment.deleteBody'; confirm({ - 'data-qa-anchor': 'delete-comment', + pageId, + componentId, title: <FormattedMessage id={title} />, content: <FormattedMessage id={content} />, cancelText: formatMessage({ id: 'comment.deleteConfirmCancelText' }), @@ -187,8 +193,8 @@ export const Comment = ({ commentId, readonly, onClickReply }: CommentProps) => }); }; - const { currentUserId } = useSDK(); const currentMember = members.find((member) => member.userId === currentUserId); + const isCommunityModerator = isModerator(currentMember?.roles); const isMember = isCommunityMember(currentMember); const options = [ @@ -279,6 +285,7 @@ export const Comment = ({ commentId, readonly, onClickReply }: CommentProps) => onClickReactionList={() => { setSelectedCommentId(comment.commentId); }} + isModerator={isCommunityModerator} /> ); diff --git a/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.module.css b/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.module.css index df0923e47..7e4bd4904 100644 --- a/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.module.css +++ b/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.module.css @@ -1,62 +1,61 @@ .avatar { - margin-right: 8px; + margin-right: 8px; } .replyContainer { - display: flex; - padding: 10px 12px 10px 16px; - align-items: center; - justify-content: space-between; - gap: 12px; - background: var(--asc-color-base-shade4); - transform: translateY(100%); - transition: transform 0.5s ease-in-out; + display: flex; + padding: 10px 12px 10px 16px; + align-items: center; + justify-content: space-between; + gap: 12px; + background: var(--asc-color-base-shade4); + transform: translateY(100%); + transition: transform 0.5s ease-in-out; } .replyingToText { - color: var(--asc-color-base-shade2); - font-size: var(--asc-text-font-size-sm); - font-weight: var(--asc-text-font-weight-normal); - line-height: var(--asc-line-height-sm); + color: var(--asc-color-base-shade2); + font-size: var(--asc-text-font-size-sm); + font-weight: var(--asc-text-font-weight-normal); + line-height: var(--asc-line-height-sm); } .replyingToUsername { - color: var(--asc-color-base-shade2); - font-size: var(--asc-text-font-size-sm); - font-weight: var(--asc-text-font-weight-bold); - line-height: var(--asc-line-height-sm); + color: var(--asc-color-base-shade2); + font-size: var(--asc-text-font-size-sm); + font-weight: var(--asc-text-font-weight-bold); + line-height: var(--asc-line-height-sm); } .animatedReplyContainer { - transform: translateY(0%); + transform: translateY(0%); } .commentComposeBarContainer { - width: 100%; - background: var(--asc-color-base-background); - display: flex; - gap: var(--asc-spacing-s1); - align-items: center; + width: 100%; + background: var(--asc-color-base-background); + display: flex; + gap: var(--asc-spacing-s1); + align-items: center; } .commentComposeBarInput { - outline: none; - flex-grow: 1; - font: inherit; - font-size: 14px; - resize: vertical; - border-radius: 1.25rem; - color: var(--asc-color-base-shade2); - background-color: var(--asc-color-base-shade4); - border-radius: 20px; + outline: none; + flex-grow: 1; + font: inherit; + font-size: 14px; + resize: vertical; + color: var(--asc-color-base-shade2); + background-color: var(--asc-color-base-shade4); + border-radius: 20px; } .addCommentButton { - color: var(--asc-color-primary-default) !important; - cursor: pointer !important; - padding: 0.625rem; - background-color: transparent; - border: none; - font-size: var(--asc-text-font-size-sm); - font-weight: var(--asc-text-font-weight-bold); -} \ No newline at end of file + color: var(--asc-color-primary-default) !important; + cursor: pointer !important; + padding: 0.625rem; + background-color: transparent; + border: none; + font-size: var(--asc-text-font-size-sm); + font-weight: var(--asc-text-font-weight-bold); +} diff --git a/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.tsx b/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.tsx index 73aa98d1e..efbb07195 100644 --- a/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.tsx +++ b/src/v4/social/internal-components/CommentComposeBar/CommentComposeBar.tsx @@ -21,6 +21,7 @@ const COMMENT_LENGTH_LIMIT = 50000; interface CommentComposeBarProps { targetId: string; + targetType: string; className?: string; userToReply?: Amity.User['displayName'] | null; onSubmit: (text: string, mentionees: Mentionees, metadata: Metadata) => void; @@ -28,14 +29,19 @@ interface CommentComposeBarProps { isReplying?: boolean; } -export const CommentComposeBar = ({ userToReply, onSubmit, targetId }: CommentComposeBarProps) => { +export const CommentComposeBar = ({ + userToReply, + onSubmit, + targetId, + targetType, +}: CommentComposeBarProps) => { const { currentUserId } = useSDK(); const user = useUser(currentUserId); const avatarFileUrl = useImage({ fileId: user?.avatarFileId, imageSize: 'small' }); const { text, markup, mentions, mentionees, metadata, onChange, clearAll, queryMentionees } = useMention({ targetId: targetId, - targetType: 'community', + targetType, }); const { formatMessage } = useIntl(); const { info } = useConfirmContext(); diff --git a/src/v4/social/internal-components/CommentList/CommentList.module.css b/src/v4/social/internal-components/CommentList/CommentList.module.css index b84f93ef2..7c4fdba82 100644 --- a/src/v4/social/internal-components/CommentList/CommentList.module.css +++ b/src/v4/social/internal-components/CommentList/CommentList.module.css @@ -1,7 +1,7 @@ .commentListContainer { max-height: calc(100vh - 16rem); - overflow-y: auto; overflow: hidden; + overflow-y: auto; margin-bottom: 1rem; } diff --git a/src/v4/social/internal-components/CommentList/CommentList.tsx b/src/v4/social/internal-components/CommentList/CommentList.tsx index 2582dbd8a..cd9cf1ca0 100644 --- a/src/v4/social/internal-components/CommentList/CommentList.tsx +++ b/src/v4/social/internal-components/CommentList/CommentList.tsx @@ -1,14 +1,16 @@ import React, { memo } from 'react'; -import { useIntl } from 'react-intl'; -import { Comment } from '../Comment'; +import { Comment } from '~/v4/social/internal-components/Comment/'; import styles from './CommentList.module.css'; import { ExpandIcon } from '~/v4/social/icons'; import { LoadMoreWrapper } from '~/v4/core/components/LoadMoreWrapper/LoadMoreWrapper'; import useCommentsCollection from '~/v4/social/hooks/collections/useCommentsCollection'; +import { CommentBubbleDeleted } from '~/v4/social/elements/CommentBubbleDeleted'; interface CommentListProps { parentId?: string; + pageId?: string; + componentId?: string; referenceId?: string; referenceType: Amity.CommentReferenceType; readonly?: boolean; @@ -21,6 +23,8 @@ interface CommentListProps { } export const CommentList = ({ + pageId = '*', + componentId = '*', parentId, referenceId, referenceType, @@ -39,13 +43,12 @@ export const CommentList = ({ includeDeleted, }); - const { formatMessage } = useIntl(); const isReplyComment = !!parentId; const commentCount = comments?.length; const loadMoreText = isReplyComment - ? formatMessage({ id: 'collapsible.viewMoreReplies' }, { count: commentCount }) - : formatMessage({ id: 'collapsible.viewMoreComments' }); + ? `View ${commentCount === 1 ? '1 reply' : `${commentCount} replies`}` + : 'View more comments'; const prependIcon = isReplyComment ? ( <div className={styles.tabIconContainer}> @@ -53,20 +56,20 @@ export const CommentList = ({ </div> ) : null; - if (comments?.length === 0 && referenceType === 'story') { - return ( - <div className={styles.noCommentsContainer}> - {formatMessage({ id: 'storyViewer.commentSheet.empty' })} - </div> - ); + if (comments.length === 0 && isReplyComment) { + return <CommentBubbleDeleted componentId="comment_tray_component" />; } - if (comments?.length === 0) return null; + if (comments?.length === 0) { + return <div className={styles.noCommentsContainer}>No comments yet</div>; + } const renderComments = () => { return comments.map((comment) => ( <Comment key={comment.commentId} + pageId={pageId} + componentId={componentId} commentId={comment.commentId} readonly={readonly} onClickReply={() => onClickReply?.(comment as Amity.Comment)} diff --git a/src/v4/social/internal-components/ImageViewer/ImageViewer.module.css b/src/v4/social/internal-components/ImageViewer/ImageViewer.module.css new file mode 100644 index 000000000..1a37cfa07 --- /dev/null +++ b/src/v4/social/internal-components/ImageViewer/ImageViewer.module.css @@ -0,0 +1,101 @@ +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--asc-color-black); + z-index: 1000; +} + +.modalContent { + background-color: var(--asc-color-base-background); + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: 100%; +} + +.closeButton { + position: absolute; + top: 10px; + left: 10px; + font-size: 24px; + cursor: pointer; +} + +.fullImage { + max-width: 100vw; + max-height: 100vh; + width: 100%; + height: auto; + object-fit: contain; +} + +.nextButton { + width: 2rem; + height: 2rem; +} + +.prevButton { + width: 2rem; + height: 2rem; +} + +.overlayPanel { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; +} + +.overlayPanel__prev, +.overlayPanel__next { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + opacity: 0.5; + background-color: var(--asc-color-black); + flex-basis: 2.5rem; + cursor: pointer; +} + +.overlayPanel__prev:hover, +.overlayPanel__next:hover { + opacity: 0.8; +} + +.overlayPanel__prevButton, +.overlayPanel__nextButton { + width: 2rem; + height: 2rem; + fill: var(--asc-color-base-shade4); + border-radius: 50%; + background-color: var(--asc-color-base-shade3); + padding: 0.375rem; +} + +.overlayPanel__prevButton { + transform: rotate(180deg); +} + +.overlayPanel__middle { + flex: 1 1 auto; +} + +.imageViewer__clearButton { + fill: var(--asc-color-base-shade3); + width: 2rem; + height: 2rem; + cursor: pointer; +} + +.imageViewer__clearButton__img { + width: 2rem; + height: 2rem; + cursor: pointer; +} diff --git a/src/v4/social/internal-components/ImageViewer/ImageViewer.tsx b/src/v4/social/internal-components/ImageViewer/ImageViewer.tsx new file mode 100644 index 000000000..942b68ef0 --- /dev/null +++ b/src/v4/social/internal-components/ImageViewer/ImageViewer.tsx @@ -0,0 +1,96 @@ +import React, { useState } from 'react'; +import useImage from '~/core/hooks/useImage'; +import usePostByIds from '~/social/hooks/usePostByIds'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import { ClearButton } from '../../elements/ClearButton/ClearButton'; +import styles from './ImageViewer.module.css'; + +const AngleRight = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="6" + height="9" + viewBox="0 0 6 9" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M5.13281 4.71094L1.71094 8.17969C1.59375 8.29688 1.40625 8.29688 1.3125 8.17969L0.84375 7.71094C0.726562 7.59375 0.726562 7.42969 0.84375 7.3125L3.60938 4.5L0.84375 1.71094C0.726562 1.59375 0.726562 1.40625 0.84375 1.3125L1.3125 0.84375C1.40625 0.726562 1.59375 0.726562 1.71094 0.84375L5.13281 4.3125C5.25 4.42969 5.25 4.59375 5.13281 4.71094Z" /> + </svg> +); + +interface ImageViewerProps { + pageId?: string; + componentId?: string; + elementId?: string; + post: Amity.Post; + initialImageIndex: number; + onClose(): void; +} + +export function ImageViewer({ + pageId = '*', + componentId = '*', + elementId = '*', + post, + initialImageIndex, + onClose, +}: ImageViewerProps) { + const { themeStyles } = useAmityElement({ pageId, componentId, elementId }); + + const [selectedImageIndex, setSelectedImageIndex] = useState(initialImageIndex); + + const posts = usePostByIds(post?.children || []); + + const imagePosts = posts.filter((post) => post.dataType === 'image'); + + const selectedPost = imagePosts[selectedImageIndex]; + + const imageUrl = useImage({ fileId: selectedPost?.data?.fileId }); + const hasNext = selectedImageIndex < imagePosts.length - 1; + const hasPrev = selectedImageIndex > 0; + + const next = () => { + if (!hasNext) { + return; + } + setSelectedImageIndex((prev) => prev + 1); + }; + + const prev = () => { + if (!hasPrev) { + return; + } + setSelectedImageIndex((prev) => prev - 1); + }; + + return ( + <div style={themeStyles}> + <div className={styles.modal} onClick={onClose}> + <div className={styles.modalContent} onClick={(e) => e.stopPropagation()}> + <img src={imageUrl} alt={selectedPost?.data?.fileId || ''} className={styles.fullImage} /> + <div className={styles.overlayPanel}> + {hasPrev && ( + <div className={styles.overlayPanel__prev} onClick={prev}> + <AngleRight className={styles.overlayPanel__prevButton} /> + </div> + )} + <div className={styles.overlayPanel__middle} /> + {hasNext && ( + <div className={styles.overlayPanel__next} onClick={next}> + <AngleRight className={styles.overlayPanel__nextButton} /> + </div> + )} + </div> + <span className={styles.closeButton} onClick={onClose}> + <ClearButton + pageId={pageId} + componentId={componentId} + defaultClassName={styles.imageViewer__clearButton} + imgClassName={styles.imageViewer__clearButton__img} + /> + </span> + </div> + </div> + </div> + ); +} diff --git a/src/v4/social/internal-components/ImageViewer/index.tsx b/src/v4/social/internal-components/ImageViewer/index.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/v4/social/internal-components/Linkify/Linkify.module.css b/src/v4/social/internal-components/Linkify/Linkify.module.css new file mode 100644 index 000000000..8303889b4 --- /dev/null +++ b/src/v4/social/internal-components/Linkify/Linkify.module.css @@ -0,0 +1,8 @@ +.link { + color: var(--asc-color-primary-shade1); + text-decoration: none; +} + +.link:hover { + text-decoration: underline; +} diff --git a/src/v4/social/internal-components/Linkify/Linkify.tsx b/src/v4/social/internal-components/Linkify/Linkify.tsx new file mode 100644 index 000000000..6b0e17dc2 --- /dev/null +++ b/src/v4/social/internal-components/Linkify/Linkify.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Linkify from 'linkify-react'; + +import styles from './Linkify.module.css'; + +type UiKitLinkifyProps = Omit<React.ComponentProps<typeof Linkify>, 'componentDecorator'>; + +export const UiKitLinkify = (props: UiKitLinkifyProps) => ( + <Linkify + componentDecorator={(decoratedHref?: string, decoratedText?: string, key?: string) => ( + <a + className={styles.link} + key={key} + target="blank" + rel="noopener noreferrer" + href={decoratedHref} + > + {decoratedText} + </a> + )} + {...props} + /> +); diff --git a/src/v4/social/internal-components/Linkify/index.tsx b/src/v4/social/internal-components/Linkify/index.tsx new file mode 100644 index 000000000..e6b15dbe5 --- /dev/null +++ b/src/v4/social/internal-components/Linkify/index.tsx @@ -0,0 +1 @@ +export { UiKitLinkify as Linkify } from './Linkify'; diff --git a/src/v4/social/internal-components/PostMenu/PostMenu.module.css b/src/v4/social/internal-components/PostMenu/PostMenu.module.css new file mode 100644 index 000000000..98973f662 --- /dev/null +++ b/src/v4/social/internal-components/PostMenu/PostMenu.module.css @@ -0,0 +1,53 @@ +.postMenu { + height: 100%; + width: 100%; +} + +.postMenu__item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.75rem 1.25rem; + cursor: pointer; + width: 100%; + box-sizing: border-box; +} + +.postMenu__item:focus { + outline: none; +} + +.postMenu__item:hover { + background-color: var(--asc-color-base-shade4); + border-radius: var(--asc-border-radius-md); +} + +.postMenu__editPost__text { + color: var(--asc-color-secondary-default); +} + +.postMenu__editPost__icon { + fill: var(--asc-color-secondary-default); + width: 1.5rem; + height: 1.25rem; +} + +.postMenu__reportPost__text { + color: var(--asc-color-secondary-default); +} + +.postMenu__reportPost__icon { + fill: var(--asc-color-secondary-default); + width: 1.5rem; + height: 1.25rem; +} + +.postMenu__deletePost__text { + color: var(--asc-color-alert); +} + +.postMenu__deletePost__icon { + fill: var(--asc-color-alert); + width: 1.5rem; + height: 1.25rem; +} diff --git a/src/v4/social/internal-components/PostMenu/PostMenu.tsx b/src/v4/social/internal-components/PostMenu/PostMenu.tsx new file mode 100644 index 000000000..5b30f292b --- /dev/null +++ b/src/v4/social/internal-components/PostMenu/PostMenu.tsx @@ -0,0 +1,184 @@ +import React, { useMemo } from 'react'; +import { PostRepository } from '@amityco/ts-sdk'; +import { useMutation } from '@tanstack/react-query'; +import { usePostPermissions } from '~/v4/core/hooks/usePostPermissions'; +import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; +import { useNotifications } from '~/v4/core/providers/NotificationProvider'; + +import styles from './PostMenu.module.css'; +import { usePostFlaggedByMe } from '~/v4/core/hooks/usePostFlaggedByMe'; +import useCommunity from '~/v4/core/hooks/collections/useCommunity'; + +const PenSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="20" + height="19" + viewBox="0 0 20 19" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M18.3804 2.25391C19.2593 3.13281 19.2593 4.53906 18.3804 5.41797L15.7437 8.05469L14.5483 9.25L5.97021 17.8281L1.9624 18.25C1.92725 18.25 1.89209 18.25 1.85693 18.25C1.36475 18.25 0.978027 17.8281 1.04834 17.3359L1.47021 13.3281L10.0483 4.75L11.2437 3.55469L13.8804 0.917969C14.3022 0.496094 14.8999 0.25 15.4624 0.25C16.0249 0.25 16.6226 0.496094 17.0444 0.917969L18.3804 2.25391ZM5.19678 16.2109L13.353 8.08984L14.4429 7L12.2983 4.85547L11.2085 5.94531L3.0874 14.1016L2.84131 16.457L5.19678 16.2109ZM17.1851 4.22266C17.396 4.01172 17.396 3.66016 17.1851 3.44922L15.8491 2.11328C15.7085 1.97266 15.5327 1.9375 15.4624 1.9375C15.3921 1.9375 15.2163 1.97266 15.0757 2.11328L13.4937 3.66016L15.6382 5.80469L17.1851 4.22266Z" /> + </svg> +); + +const TrashSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="16" + height="19" + viewBox="0 0 16 19" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M15.3608 3.0625C15.6421 3.0625 15.9233 3.34375 15.9233 3.625V4.1875C15.9233 4.50391 15.6421 4.75 15.3608 4.75H14.7983L14.0249 16.668C13.9897 17.5469 13.2163 18.25 12.3374 18.25H3.72412C2.84521 18.25 2.07178 17.5469 2.03662 16.668L1.29834 4.75H0.73584C0.419434 4.75 0.17334 4.50391 0.17334 4.1875V3.625C0.17334 3.34375 0.419434 3.0625 0.73584 3.0625H3.61865L4.81396 1.09375C5.09521 0.636719 5.72803 0.25 6.25537 0.25H9.80615C10.3335 0.25 10.9663 0.636719 11.2476 1.09375L12.4429 3.0625H15.3608ZM6.25537 1.9375L5.5874 3.0625H10.4741L9.80615 1.9375H6.25537ZM12.3374 16.5625L13.0757 4.75H2.98584L3.72412 16.5625H12.3374Z" /> + </svg> +); + +const FlagSvg = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + width="19" + height="19" + viewBox="0 0 19 19" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path d="M12.3125 3.0625C13.543 3.0625 14.8789 2.64062 16.1445 2.07812C17.2344 1.62109 18.5 2.42969 18.5 3.625V12.0625C18.5 12.6602 18.1836 13.1875 17.7266 13.5039C16.7773 14.1016 15.2656 14.875 13.1914 14.875C10.8008 14.875 9.21875 13.75 7.49609 13.75C5.52734 13.75 4.33203 14.1719 3.03125 14.7695V17.6875C3.03125 18.0039 2.75 18.25 2.46875 18.25H1.90625C1.58984 18.25 1.34375 18.0039 1.34375 17.6875V3.41406C0.816406 3.13281 0.5 2.57031 0.5 1.9375C0.5 0.988281 1.30859 0.214844 2.29297 0.285156C3.10156 0.320312 3.76953 0.953125 3.83984 1.76172C3.83984 1.79688 3.875 1.90234 3.875 1.9375C3.875 2.11328 3.80469 2.35938 3.76953 2.5C4.54297 2.18359 5.49219 1.9375 6.61719 1.9375C9.00781 1.9375 10.5898 3.0625 12.3125 3.0625ZM16.8125 12.0625V3.625C15.6875 4.15234 13.8242 4.75 12.3125 4.75C10.2031 4.75 8.72656 3.625 6.61719 3.625C5.14062 3.625 3.76953 4.22266 3.03125 4.75V12.9062C4.12109 12.4141 5.98438 12.0625 7.49609 12.0625C9.60547 12.0625 11.082 13.1875 13.1914 13.1875C14.668 13.1875 16.0391 12.625 16.8125 12.0625Z" /> + </svg> +); + +interface PostMenuProps { + post: Amity.Post; + pageId?: string; + componentId?: string; + elementId?: string; + onCloseMenu: () => void; +} + +export const PostMenu = ({ + post, + pageId = '*', + componentId = '*', + elementId = '*', + onCloseMenu, +}: PostMenuProps) => { + const { success, error } = useNotifications(); + + const { community } = useCommunity({ + communityId: post?.targetId, + shouldCall: () => post?.targetType === 'community', + }); + + const { isCommunityModerator, isOwner } = usePostPermissions({ post, community }); + + const { showEditPostButton, showDeletePostButton, showReportPostButton } = useMemo(() => { + if (isCommunityModerator) { + if (isOwner) { + return { + showEditPostButton: true, + showDeletePostButton: true, + showReportPostButton: false, + }; + } else { + return { + showEditPostButton: false, + showDeletePostButton: true, + showReportPostButton: true, + }; + } + } else { + if (isOwner) { + return { + showEditPostButton: true, + showDeletePostButton: true, + showReportPostButton: false, + }; + } else { + return { + showEditPostButton: false, + showDeletePostButton: false, + showReportPostButton: true, + }; + } + } + }, [isCommunityModerator, isOwner]); + + const { isFlaggedByMe, isLoading, mutateReportPost, mutateUnReportPost } = usePostFlaggedByMe({ + post, + isFlaggable: showReportPostButton, + onReportSuccess: () => { + success({ content: 'Post reported' }); + }, + onReportError: () => { + error({ content: 'Failed to report post' }); + }, + onUnreportSuccess: () => { + success({ content: 'Post unreported' }); + }, + onUnreportError: () => { + error({ content: 'Failed to unreport post' }); + }, + }); + + const { confirm } = useConfirmContext(); + + const { mutateAsync: mutateDeletePost } = useMutation({ + mutationFn: async () => { + onCloseMenu(); + return PostRepository.hardDeletePost(post.postId); + }, + onSuccess: () => { + success({ content: 'Post deleted' }); + }, + onError: () => { + error({ content: 'Failed to delete post' }); + }, + }); + + const onDeleteClick = () => { + onCloseMenu(); + confirm({ + title: 'Delete post', + content: 'This post will be permanently deleted.', + cancelText: 'Cancel', + okText: 'Delete', + onOk: () => mutateDeletePost(), + pageId, + componentId, + }); + }; + + return ( + <div className={styles.postMenu}> + {/* <button className={styles.postMenu__item} onClick={onEdit}> + <PenSvg className={styles.postMenu__editPost__icon} /> + <span>Edit post</span> + </button> */} + {showReportPostButton ? ( + <button + className={styles.postMenu__item} + disabled={isLoading} + onClick={() => { + if (isFlaggedByMe) { + mutateUnReportPost(); + } else { + mutateReportPost(); + } + }} + > + <FlagSvg className={styles.postMenu__reportPost__icon} /> + <span className={styles.postMenu__reportPost__text}> + {isFlaggedByMe ? 'Unreport post' : 'Report post'} + </span> + </button> + ) : null} + {showDeletePostButton ? ( + <button className={styles.postMenu__item} onClick={() => onDeleteClick()}> + <TrashSvg className={styles.postMenu__deletePost__icon} /> + <span className={styles.postMenu__deletePost__text}>Delete post</span> + </button> + ) : null} + </div> + ); +}; diff --git a/src/v4/social/internal-components/PostMenu/index.tsx b/src/v4/social/internal-components/PostMenu/index.tsx new file mode 100644 index 000000000..092f2cb26 --- /dev/null +++ b/src/v4/social/internal-components/PostMenu/index.tsx @@ -0,0 +1 @@ +export { PostMenu } from './PostMenu'; diff --git a/src/v4/social/internal-components/StoryCommentComposeBar/StoryCommentComposeBar.module.css b/src/v4/social/internal-components/StoryCommentComposeBar/StoryCommentComposeBar.module.css index df442ae37..66cde8bd3 100644 --- a/src/v4/social/internal-components/StoryCommentComposeBar/StoryCommentComposeBar.module.css +++ b/src/v4/social/internal-components/StoryCommentComposeBar/StoryCommentComposeBar.module.css @@ -1,44 +1,44 @@ .storyCommentComposerBarContainer { - padding: 0 1rem; - } - - .disabledCommentComposerBarContainer { - display: flex; - justify-content: center; - align-items: center; - gap: 0.5rem; - padding: 0.625rem 1rem; - border-top: 1px solid #e3e4e8; - color: var(--asc-color-base-shade2); - } - - .replyingBlock { - display: flex; - align-items: center; - justify-content: space-between; - padding: 0.625rem 1rem; - background-color: var(--asc-color-base-shade4); - margin-bottom: 1rem; - } - - .replyingToText { - font-size: var(--asc-text-font-size-sm); - font-weight: var(--asc-text-font-weight-normal); - line-height: var(--asc-line-height-sm); - color: var(--asc-color-base-shade1); - } - - .replyingToUsername { - font-weight: var(--asc-text-font-weight-bold); - } - - .closeButton { - fill: var(--asc-color-base-shade2); - width: 1.25rem; - height: 1.25rem; - cursor: pointer; - } + padding: 0 1rem; +} - .commentComposeBar { - background: red; - } \ No newline at end of file +.disabledCommentComposerBarContainer { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; + padding: 0.625rem 1rem; + border-top: 1px solid #e3e4e8; + color: var(--asc-color-base-shade2); +} + +.replyingBlock { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.625rem 1rem; + background-color: var(--asc-color-base-shade4); + margin-bottom: 1rem; +} + +.replyingToText { + font-size: var(--asc-text-font-size-sm); + font-weight: var(--asc-text-font-weight-normal); + line-height: var(--asc-line-height-sm); + color: var(--asc-color-base-shade1); +} + +.replyingToUsername { + font-weight: var(--asc-text-font-weight-bold); +} + +.closeButton { + fill: var(--asc-color-base-shade2); + width: 1.25rem; + height: 1.25rem; + cursor: pointer; +} + +.commentComposeBar { + background: red; +} diff --git a/src/v4/social/internal-components/StoryPreview/StoryPreview.module.css b/src/v4/social/internal-components/StoryPreview/StoryPreview.module.css index 8baf236c1..c290f3fd0 100644 --- a/src/v4/social/internal-components/StoryPreview/StoryPreview.module.css +++ b/src/v4/social/internal-components/StoryPreview/StoryPreview.module.css @@ -1,81 +1,81 @@ .storyPreview_title { - color: var(--asc-color-white); + color: var(--asc-color-white); } .storyPreview_description { - color: var(--asc-color-white); + color: var(--asc-color-white); } .storyPreviewContainer { - width: 100%; - height: 100%; - position: relative; - } - - .headerContainer { - position: absolute; - top: 10px; - left: 10px; - right: 10px; - z-index: 1; - display: flex; - align-items: center; - padding: 0.75rem 0 0.625rem 0; - } - - .progressBar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 0.125rem; - border-radius: 0.25rem; - background-color: rgba(255, 255, 255, 0.3); - } - - .progressFill { - height: 100%; - background-color: white; - transition: width 0.1s linear; - } - - .userInfo { - width: 100%; - display: flex; - justify-content: flex-start; - align-items: center; - gap: 0.5rem; - } - - .storyPreviewTitle { - color: white; - } - - .nameContainer { - display: flex; - align-items: center; - gap: 0.25rem; - } - - .hyperLinkContainer { - position: absolute; - bottom: 0; - z-index: 1; - display: flex; - justify-content: center; - align-items: center; - padding: 0.75rem 1rem 0.625rem 1rem; - left: 50%; - transform: translateX(-50%); - } - - .mediaContainer { - width: 100%; - height: 100%; - } - - .media { - width: 100%; - height: 100%; - object-fit: cover; - } \ No newline at end of file + width: 100%; + height: 100%; + position: relative; +} + +.headerContainer { + position: absolute; + top: 10px; + left: 10px; + right: 10px; + z-index: 1; + display: flex; + align-items: center; + padding: 0.75rem 0 0.625rem; +} + +.progressBar { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 0.125rem; + border-radius: 0.25rem; + background-color: rgb(255 255 255 / 30%); +} + +.progressFill { + height: 100%; + background-color: white; + transition: width 0.1s linear; +} + +.userInfo { + width: 100%; + display: flex; + justify-content: flex-start; + align-items: center; + gap: 0.5rem; +} + +.storyPreviewTitle { + color: white; +} + +.nameContainer { + display: flex; + align-items: center; + gap: 0.25rem; +} + +.hyperLinkContainer { + position: absolute; + bottom: 0; + z-index: 1; + display: flex; + justify-content: center; + align-items: center; + padding: 0.75rem 1rem 0.625rem; + left: 50%; + transform: translateX(-50%); +} + +.mediaContainer { + width: 100%; + height: 100%; +} + +.media { + width: 100%; + height: 100%; + object-fit: cover; +} diff --git a/src/v4/social/internal-components/StoryPreview/StoryPreview.tsx b/src/v4/social/internal-components/StoryPreview/StoryPreview.tsx index bb077752e..f7b93ad95 100644 --- a/src/v4/social/internal-components/StoryPreview/StoryPreview.tsx +++ b/src/v4/social/internal-components/StoryPreview/StoryPreview.tsx @@ -1,11 +1,11 @@ import React, { useEffect, useRef, useState } from 'react'; -import UserAvatar from '~/v4/chat/components/UserAvatar'; -import { backgroundImage as communityBackgroundImage } from '~/icons/Community'; +import Community from '~/v4/icons/Community'; import Verified from '~/v4/social/icons/verified'; import { Typography } from '~/v4/core/components'; import { HyperLink } from '~/v4/social/elements/HyperLink'; import TruncateMarkup from 'react-truncate-markup'; import styles from './StoryPreview.module.css'; +import { Avatar } from '~/v4/core/components/Avatar/'; type AmityStoryMediaType = { type: 'image'; url: string } | { type: 'video'; url: string }; @@ -109,7 +109,7 @@ export const StoryPreview: React.FC<StoryPreviewProps> = ({ <div className={styles.progressFill} style={{ width: `${progress}%` }} /> </div> <div className={styles.userInfo}> - <UserAvatar avatarUrl={avatar} defaultImage={communityBackgroundImage} /> + <Avatar avatar={avatar} defaultImage={<Community />} /> <Typography.BodyBold className={styles.storyPreviewTitle}> <span className={styles.nameContainer}> {title} {isOfficial && <Verified fill="white" />} diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/AutoPlayContent.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/AutoPlayContent.tsx index 6fa161af7..f4067eab6 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/AutoPlayContent.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/AutoPlayContent.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; -import { Renderer, Tester } from 'react-insta-stories/dist/interfaces'; +import { CustomRendererProps, RendererProps, Tester } from './types'; -export const renderer: Renderer = (props) => { +export const renderer = (props: CustomRendererProps) => { useEffect(() => { props.action('play'); }, [props.story]); diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Default.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/Default.tsx index 381b968a8..98971f825 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Default.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Default.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; -import { Renderer, Tester } from 'react-insta-stories/dist/interfaces'; +import { CustomRenderer, Tester } from './types'; -export const renderer: Renderer = ({ story, action }) => { +export const renderer: CustomRenderer = ({ story, action }) => { useEffect(() => { action('play'); }, [story]); diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Image.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/Image.tsx index 62fad1c09..8ff838b96 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Image.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Image.tsx @@ -1,45 +1,49 @@ -import React, { useState, useEffect } from 'react'; -import { Tester } from 'react-insta-stories/dist/interfaces'; - -import styles from './Renderers.module.css'; -import { useNavigation } from '~/social/providers/NavigationProvider'; -import useImage from '~/core/hooks/useImage'; - -import { checkStoryPermission, formatTimeAgo } from '~/utils'; - -import useSDK from '~/core/hooks/useSDK'; +import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { useIntl } from 'react-intl'; - -import { LIKE_REACTION_KEY } from '~/constants'; import Truncate from 'react-truncate-markup'; - -import { CustomRenderer } from './types'; - +import { + CustomRenderer, + Tester, +} from '~/v4/social/internal-components/StoryViewer/Renderers/types'; import { CommentTray } from '~/v4/social/components'; import { HyperLink } from '~/v4/social/elements/HyperLink'; -import Footer from './Wrappers/Footer'; -import Header from './Wrappers/Header'; -import { PageTypes } from '~/social/constants'; +import Footer from '~/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer'; +import Header from '~/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header'; import { motion, PanInfo, useAnimationControls } from 'framer-motion'; -import useUser from '~/core/hooks/useUser'; import { BottomSheet } from '~/v4/core/components/BottomSheet'; import { Typography } from '~/v4/core/components'; import { Button } from '~/v4/core/components/Button'; -import { isAdmin, isModerator } from '~/helpers/permissions'; +import useCommunityMembersCollection from '~/v4/social/hooks/collections/useCommunityMembersCollection'; +import useSDK from '~/v4/core/hooks/useSDK'; +import useUser from '~/v4/core/hooks/objects/useUser'; +import { LIKE_REACTION_KEY } from '~/v4/social/constants/reactions'; +import { checkStoryPermission, formatTimeAgo, isAdmin, isModerator } from '~/v4/social/utils'; -export const renderer: CustomRenderer = ({ story, action, config }) => { +import styles from './Renderers.module.css'; +import clsx from 'clsx'; + +import { StoryProgressBar } from '~/v4/social/elements/StoryProgressBar/StoryProgressBar'; +import useCommunityStoriesSubscription from '~/v4/social/hooks/useCommunityStoriesSubscription'; + +export const renderer: CustomRenderer = ({ + story, + action, + config, + onClose, + onSwipeDown, + onClickCommunity, +}) => { const { formatMessage } = useIntl(); - const { page, onChangePage, onClickCommunity } = useNavigation(); const [loaded, setLoaded] = useState(false); const [isOpenBottomSheet, setIsOpenBottomSheet] = useState(false); const [isOpenCommentSheet, setIsOpenCommentSheet] = useState(false); - const [isPaused, setIsPaused] = useState(false); - const { width, height, loader, storyStyles } = config; + const { loader } = config; const { client } = useSDK(); const isLiked = !!(story && story.myReactions && story.myReactions.includes(LIKE_REACTION_KEY)); - const totalLikes = story.reactions[LIKE_REACTION_KEY] || 0; + const reactionsCount = story.reactionsCount || 0; + const { storyId, syncState, @@ -49,30 +53,22 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { creator, community, actions, - handleAddIconClick, addStoryButton, fileInputRef, + storyStyles, + myReactions, + currentIndex, + storiesCount, + increaseIndex, + pageId, } = story; - const isJoined = community?.isJoined || false; - - const avatarUrl = useImage({ - fileId: community?.avatarFileId || '', - imageSize: 'small', - }); + const { members } = useCommunityMembersCollection(community?.communityId as string); + const member = members?.find((member) => member.userId === client?.userId); + const isMember = member != null; - const user = useUser(client?.userId); - - const heading = <div data-qa-anchor="community_display_name">{community?.displayName}</div>; - const subheading = - createdAt && creator?.displayName ? ( - <span> - <span data-qa-anchor="created_at">{formatTimeAgo(createdAt as string)}</span> • By{' '} - <span data-qa-anchor="creator_display_name">{creator?.displayName}</span> - </span> - ) : ( - '' - ); + const { user } = useUser(client?.userId); + const controls = useAnimationControls(); const isOfficial = community?.isOfficial || false; const isCreator = creator?.userId === user?.userId; @@ -81,17 +77,30 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { const haveStoryPermission = isGlobalAdmin || isCommunityModerator || checkStoryPermission(client, community?.communityId); - const computedStyles = { - ...rendererStyles.storyContent, - ...(storyStyles || {}), - }; + const heading = useMemo( + () => <div data-qa-anchor="community_display_name">{community?.displayName}</div>, + [community?.displayName], + ); + const subheading = useMemo( + () => + createdAt && creator?.displayName ? ( + <span> + <span data-qa-anchor="created_at">{formatTimeAgo(createdAt as string)}</span> • By{' '} + <span data-qa-anchor="creator_display_name">{creator?.displayName}</span> + </span> + ) : ( + '' + ), + [createdAt, creator?.displayName], + ); + const targetRootId = 'asc-uikit-stories-viewer'; const imageLoaded = () => { setLoaded(true); if (isPaused) { setIsPaused(false); } - action('play'); + action('play', true); }; const play = () => setIsPaused(false); @@ -102,10 +111,6 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { const openCommentSheet = () => setIsOpenCommentSheet(true); const closeCommentSheet = () => setIsOpenCommentSheet(false); - const targetRootId = 'asc-uikit-stories-viewer'; - - const controls = useAnimationControls(); - const handleSwipeDown = () => { controls .start({ @@ -113,11 +118,7 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { transition: { duration: 0.3, ease: 'easeOut' }, }) .then(() => { - if (page.type === PageTypes.ViewStory && page.storyType === 'globalFeed') { - onChangePage(PageTypes.NewsFeed); - } else { - onClickCommunity(community?.communityId as string); - } + onSwipeDown?.(); }); }; @@ -135,34 +136,39 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { } }; + const handleOnClose = () => { + onClose(); + }; + + const handleProgressComplete = () => { + increaseIndex(); + }; + useEffect(() => { if (isPaused || isOpenBottomSheet || isOpenCommentSheet) { action('pause', true); } else { action('play', true); } - }, [isPaused, isOpenBottomSheet, isOpenCommentSheet]); + }, [isPaused, isOpenBottomSheet, isOpenCommentSheet, action]); useEffect(() => { + action('pause', true); if (fileInputRef.current) { - fileInputRef.current.addEventListener('click', () => { - action('pause', true); - }); - fileInputRef.current.addEventListener('cancel', () => { - action('play', true); - }); + const handleClick = () => action('pause', true); + const handleCancel = () => action('play', true); + + fileInputRef.current.addEventListener('click', handleClick); + fileInputRef.current.addEventListener('cancel', handleCancel); + + return () => { + if (fileInputRef.current) { + fileInputRef.current.removeEventListener('cancel', handleCancel); + fileInputRef.current.removeEventListener('click', handleClick); + } + }; } - return () => { - if (fileInputRef.current) { - fileInputRef.current.removeEventListener('cancel', () => { - action('play', true); - }); - fileInputRef.current.removeEventListener('click', () => { - action('pause', true); - }); - } - }; - }, []); + }, [action, fileInputRef]); return ( <motion.div @@ -175,8 +181,16 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { onDragEnd={handleDragEnd} whileDrag={{ scale: 0.95, borderRadius: '8px', cursor: 'grabbing' }} > + <StoryProgressBar + pageId={pageId} + duration={5000} + currentIndex={currentIndex} + storiesCount={storiesCount} + isPaused={isPaused || isOpenBottomSheet || isOpenCommentSheet} + onComplete={handleProgressComplete} + /> <Header - avatar={avatarUrl} + community={community} heading={heading} subheading={subheading} isHaveActions={actions?.length > 0} @@ -186,32 +200,29 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { onPlay={play} onPause={pause} onAction={openBottomSheet} - onAddStory={handleAddIconClick} - onClickCommunity={() => onClickCommunity(community?.communityId as string)} - onClose={() => { - if (page.type === PageTypes.ViewStory && page.storyType === 'globalFeed') { - onChangePage(PageTypes.NewsFeed); - return; - } - onClickCommunity(community?.communityId as string); - }} + onClickCommunity={() => onClickCommunity?.()} + onClose={handleOnClose} addStoryButton={addStoryButton} /> - <img - className={styles.storyImage} - data-qa-anchor="image_view" - style={computedStyles} - src={story.url} - onLoad={imageLoaded} - alt="Story Image" - /> + <div + className={clsx(styles.storyImageContainer)} + style={ + { + '--asc-story-image-background': storyStyles?.background, + } as React.CSSProperties + } + > + <img + className={styles.storyImage} + data-qa-anchor="image_view" + src={story.url} + onLoad={imageLoaded} + alt="Story Image" + /> + </div> - {!loaded && ( - <div className={styles.loadingOverlay} style={{ width, height }}> - {loader || <div>loading...</div>} - </div> - )} + {!loaded && <div className={styles.loadingOverlay}>{loader || <div>loading...</div>}</div>} <BottomSheet rootId={targetRootId} @@ -222,6 +233,7 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { > {actions?.map((bottomSheetAction) => ( <Button + key={bottomSheetAction.name} className={styles.actionButton} onClick={() => { bottomSheetAction.action(); @@ -249,7 +261,7 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { referenceType="story" community={community as Amity.Community} shouldAllowCreation={community?.allowCommentInStory} - shouldAllowInteraction={isJoined} + shouldAllowInteraction={isMember} /> </BottomSheet> @@ -280,29 +292,17 @@ export const renderer: CustomRenderer = ({ story, action, config }) => { syncState={syncState} reach={reach} commentsCount={commentsCount} - totalLikes={totalLikes} + reactionsCount={reactionsCount} isLiked={isLiked} + myReactions={myReactions} onClickComment={openCommentSheet} showImpression={isCreator || haveStoryPermission} + isMember={isMember} /> </motion.div> ); }; -const rendererStyles = { - story: { - display: 'flex', - position: 'relative', - overflow: 'hidden', - }, - storyContent: { - width: 'auto', - maxWidth: '100%', - maxHeight: '100%', - margin: 'auto', - }, -}; - export const tester: Tester = (story) => { return { condition: !story.content && (!story.type || story.type === 'image'), diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Renderers.module.css b/src/v4/social/internal-components/StoryViewer/Renderers/Renderers.module.css index 9cc7a4d32..3d4aed3e2 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Renderers.module.css +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Renderers.module.css @@ -2,7 +2,7 @@ position: absolute; width: 2rem; height: 2rem; - background-color: rgba(0, 0, 0, 0.5); + background-color: rgb(0 0 0 / 50%); border-radius: 50%; border: none; top: 6rem; @@ -50,22 +50,31 @@ } .loadingOverlay { + width: 100%; + height: 100%; position: absolute; left: 0; top: 0; - background: rgba(0, 0, 0, 0.9); + background: rgb(0 0 0 / 90%); z-index: 9; display: flex; justify-content: center; align-items: center; - color: #ccc; +} + +.storyImageContainer { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background: var(--asc-story-image-background); } .storyImage { - width: auto; - max-width: 100%; - max-height: 100%; - margin: auto; + width: 100%; + height: 100%; + object-fit: contain; } .playStoryButton { @@ -142,10 +151,6 @@ background-color: #292b32; } -.storyContent { - flex: 1; -} - .header { height: 5rem; padding: var(--asc-spacing-s2) var(--asc-spacing-m1) var(--asc-spacing-s2) var(--asc-spacing-m1); @@ -247,6 +252,7 @@ max-width: 100%; max-height: 100%; margin: auto; + flex: 1; } .actionButton { @@ -259,3 +265,19 @@ color: var(--asc-color-base-default); background-color: var(--asc-color-base-background); } + +.navigationOverlay { + position: absolute; + top: 0; + bottom: 0; + width: 50%; + z-index: 10; +} + +.leftOverlay { + left: 0; +} + +.rightOverlay { + right: 0; +} diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Video.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/Video.tsx index f536ea8c0..4b5e8fbf4 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Video.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Video.tsx @@ -1,42 +1,52 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { Tester } from 'react-insta-stories/dist/interfaces'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; -import useImage from '~/core/hooks/useImage'; -import { checkStoryPermission, formatTimeAgo } from '~/utils'; -import { useNavigation } from '~/social/providers/NavigationProvider'; import { useIntl } from 'react-intl'; -import useSDK from '~/core/hooks/useSDK'; - -import { LIKE_REACTION_KEY } from '~/constants'; import Truncate from 'react-truncate-markup'; -import { CustomRenderer } from './types'; -import { LoadingOverlay, StoryVideo } from './styles'; +import { + CustomRenderer, + Tester, +} from '~/v4/social/internal-components/StoryViewer/Renderers/types'; import { SpeakerButton } from '~/v4/social/elements'; -import Header from './Wrappers/Header'; + import { BottomSheet, Button, Typography } from '~/v4/core/components'; import { CommentTray } from '~/v4/social/components'; import { HyperLink } from '~/v4/social/elements/HyperLink'; -import Footer from './Wrappers/Footer'; -import { PageTypes } from '~/social/constants'; +import Header from '~/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header'; +import Footer from '~/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer'; + import { motion, PanInfo, useAnimationControls } from 'framer-motion'; -import rendererStyles from './Renderers.module.css'; -import useUser from '~/core/hooks/useUser'; -import { isAdmin, isModerator } from '~/helpers/permissions'; +import useCommunityMembersCollection from '~/v4/social/hooks/collections/useCommunityMembersCollection'; +import useSDK from '~/v4/core/hooks/useSDK'; +import useUser from '~/v4/core/hooks/objects/useUser'; + +import clsx from 'clsx'; +import { LIKE_REACTION_KEY } from '~/v4/social/constants/reactions'; +import { checkStoryPermission, formatTimeAgo, isAdmin, isModerator } from '~/v4/social/utils'; -export const renderer: CustomRenderer = ({ story, action, config, messageHandler }) => { +import rendererStyles from './Renderers.module.css'; +import { StoryProgressBar } from '~/v4/social/elements/StoryProgressBar/StoryProgressBar'; + +export const renderer: CustomRenderer = ({ + story, + action, + config, + messageHandler, + onSwipeDown, + onClose, + onClickCommunity, +}) => { const { formatMessage } = useIntl(); - const { page, onClickCommunity, onChangePage } = useNavigation(); const [loaded, setLoaded] = useState(false); const [muted, setMuted] = useState(false); const [isPaused, setIsPaused] = useState(false); const [isOpenBottomSheet, setIsOpenBottomSheet] = useState(false); const [isOpenCommentSheet, setIsOpenCommentSheet] = useState(false); - const { width, height, loader, storyStyles } = config; + const { loader } = config; const { client } = useSDK(); - const user = useUser(client?.userId); + const { user } = useUser(client?.userId); const isLiked = !!(story && story.myReactions && story.myReactions.includes(LIKE_REACTION_KEY)); const totalLikes = story?.reactions[LIKE_REACTION_KEY] || 0; @@ -50,17 +60,18 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler creator, community, actions, - handleAddIconClick, addStoryButton, fileInputRef, + myReactions, + currentIndex, + storiesCount, + increaseIndex, + pageId, } = story; - const isJoined = community?.isJoined || false; - - const avatarUrl = useImage({ - fileId: community?.avatarFileId || '', - imageSize: 'small', - }); + const { members } = useCommunityMembersCollection(community?.communityId as string); + const member = members?.find((member) => member.userId === client?.userId); + const isMember = member != null; const heading = <div data-qa-anchor="community_display_name">{community?.displayName}</div>; const subheading = @@ -80,21 +91,11 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler const haveStoryPermission = isGlobalAdmin || isCommunityModerator || checkStoryPermission(client, community?.communityId); - const computedStyles = { - ...storyContentStyles, - ...(storyStyles || {}), - }; - const vid = useRef<HTMLVideoElement>(null); const controls = useAnimationControls(); - const onWaiting = () => { - action('pause', true); - }; - - const onPlaying = () => { - action('play', true); - }; + const onWaiting = () => action('pause', true); + const onPlaying = () => action('play', true); const videoLoaded = () => { messageHandler('UPDATE_VIDEO_DURATION', { duration: vid?.current?.duration }); @@ -136,11 +137,7 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler transition: { duration: 0.3, ease: 'easeOut' }, }) .then(() => { - if (page.type === PageTypes.ViewStory && page.storyType === 'globalFeed') { - onChangePage(PageTypes.NewsFeed); - } else { - onClickCommunity(community?.communityId as string); - } + onSwipeDown?.(); }); }; @@ -160,6 +157,14 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler } }; + const handleOnClose = () => { + onClose(); + }; + + const handleProgressComplete = useCallback(() => { + increaseIndex(); + }, [increaseIndex]); + useEffect(() => { if (vid.current) { if (isPaused || isOpenBottomSheet || isOpenCommentSheet) { @@ -195,7 +200,7 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler return ( <motion.div - className={rendererStyles.rendererContainer} + className={clsx(rendererStyles.rendererContainer)} animate={controls} drag="y" dragConstraints={{ top: 0, bottom: 0 }} @@ -204,14 +209,22 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler onDragEnd={handleDragEnd} whileDrag={{ scale: 0.95, borderRadius: '8px', cursor: 'grabbing' }} > + <StoryProgressBar + pageId={pageId} + duration={5000} + currentIndex={currentIndex} + storiesCount={storiesCount} + isPaused={isPaused || isOpenBottomSheet || isOpenCommentSheet} + onComplete={handleProgressComplete} + /> <SpeakerButton pageId="story_page" componentId="*" isMuted={muted} - onClick={muted ? unmute : mute} + onPress={muted ? unmute : mute} /> <Header - avatar={avatarUrl} + community={community} heading={heading} subheading={subheading} isHaveActions={actions?.length > 0} @@ -223,21 +236,14 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler onMute={mute} onUnmute={unmute} onAction={openBottomSheet} - onAddStory={handleAddIconClick} - onClickCommunity={() => onClickCommunity(community?.communityId as string)} - onClose={() => { - if (page.type === PageTypes.ViewStory && page.storyType === 'globalFeed') { - onChangePage(PageTypes.NewsFeed); - return; - } - onClickCommunity(community?.communityId as string); - }} + onClickCommunity={() => onClickCommunity?.()} + onClose={handleOnClose} addStoryButton={addStoryButton} /> - <StoryVideo + <video data-qa-anchor="video_view" ref={vid} - style={computedStyles} + className={clsx(rendererStyles.storyVideo)} src={story?.videoData?.fileUrl || story?.videoData?.videoUrl?.original} controls={false} onLoadedData={videoLoaded} @@ -246,12 +252,9 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler onPlaying={onPlaying} muted={muted} autoPlay - webkit-playsinline="true" /> {!loaded && ( - <LoadingOverlay width={width} height={height}> - {loader || <div>loading...</div>} - </LoadingOverlay> + <div className={clsx(rendererStyles.loadingOverlay)}>{loader || <div>loading...</div>}</div> )} <BottomSheet @@ -263,7 +266,7 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler > {actions?.map((bottomSheetAction) => ( <Button - className={rendererStyles.actionButton} + className={clsx(rendererStyles.actionButton)} onClick={() => { bottomSheetAction.action(); }} @@ -288,11 +291,11 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler referenceType={'story'} community={community as Amity.Community} shouldAllowCreation={community?.allowCommentInStory} - shouldAllowInteraction={isJoined} + shouldAllowInteraction={isMember} /> </BottomSheet> {story.items?.[0]?.data?.url && ( - <div className={rendererStyles.hyperLinkContainer}> + <div className={clsx(rendererStyles.hyperLinkContainer)}> <HyperLink href={ story.items[0].data.url.startsWith('http') @@ -317,23 +320,17 @@ export const renderer: CustomRenderer = ({ story, action, config, messageHandler syncState={syncState} reach={reach} commentsCount={commentsCount} - totalLikes={totalLikes} + reactionsCount={totalLikes} isLiked={isLiked} onClickComment={openCommentSheet} + myReactions={myReactions} showImpression={isCreator || haveStoryPermission} + isMember={isMember} /> </motion.div> ); }; -const storyContentStyles = { - width: 'auto', - maxWidth: '100%', - maxHeight: '100%', - margin: 'auto', - position: 'relative' as const, -}; - export const tester: Tester = (story) => { return { condition: story.type === 'video', diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/Footer.module.css b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/Footer.module.css index cdd243bbf..86df665b9 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/Footer.module.css +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/Footer.module.css @@ -56,3 +56,16 @@ justify-content: space-between; gap: var(--asc-spacing-s2); } + +.viewStoryCommentButton { + display: flex; + padding: 8px 10px; + align-items: center; + gap: 0.5rem; + border-radius: 24px; + background: var(--asc-color-secondary-default); +} + +.viewStoryCommentIcon { + fill: var(--asc-color-white); +} diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/index.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/index.tsx index 8e0cbe87b..c7ceb79eb 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/index.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/index.tsx @@ -1,13 +1,16 @@ -import React, { useEffect, useState } from 'react'; -import styles from './Footer.module.css'; +import React from 'react'; import { DotsIcon, ErrorIcon } from '~/icons'; -import { useIntl } from 'react-intl'; -import millify from 'millify'; import { ReactionRepository } from '@amityco/ts-sdk'; import { LIKE_REACTION_KEY } from '~/constants'; import Spinner from '~/social/components/Spinner'; -import { CommentButton, ImpressionButton, ReactButton } from '~/v4/social/elements'; +import { useNotifications } from '~/v4/core/providers/NotificationProvider'; + +import styles from './Footer.module.css'; +import clsx from 'clsx'; +import { StoryCommentButton } from '~/v4/social/elements/StoryCommentButton/StoryCommentButton'; +import { StoryReactionButton } from '~/v4/social/elements/StoryReactionButton/StoryReactionButton'; +import { StoryImpressionButton } from '~/v4/social/elements/StoryImpressionButton/StoryImpressionButton'; const Footer: React.FC< React.PropsWithChildren<{ @@ -15,25 +18,35 @@ const Footer: React.FC< showImpression: boolean; reach: number | null; commentsCount: number; - totalLikes: number; + reactionsCount: number; isLiked: boolean; onClickComment: () => void; syncState?: Amity.SyncState; + isMember?: boolean; + myReactions?: string[]; }> > = ({ syncState, reach, commentsCount, - totalLikes, + reactionsCount, isLiked, storyId, onClickComment, showImpression, + isMember, + myReactions, }) => { - const { formatMessage } = useIntl(); + const notification = useNotifications(); - const handleLike = async () => { + const handleClickReaction = async () => { try { + if (!isMember) { + notification.show({ + content: 'You need to be a member to like this story', + }); + return; + } if (!isLiked) { await ReactionRepository.addReaction('story', storyId, LIKE_REACTION_KEY); } else { @@ -49,7 +62,7 @@ const Footer: React.FC< <div className={styles.viewStoryCompostBarContainer}> <div className={styles.viewStoryUploadingWrapper}> <Spinner width={20} height={20} /> - {formatMessage({ id: 'storyViewer.footer.uploading' })} + Uploading... </div> </div> ); @@ -60,7 +73,7 @@ const Footer: React.FC< <div className={styles.viewStoryFailedCompostBarContainer}> <div className={styles.viewStoryFailedCompostBarWrapper}> <ErrorIcon /> - {formatMessage({ id: 'storyViewer.footer.failed' })} + <span>Failed to upload</span> </div> <DotsIcon /> </div> @@ -72,18 +85,17 @@ const Footer: React.FC< <div> {showImpression && ( <div className={styles.viewStoryCompostBarViewIconContainer}> - <ImpressionButton pageId="story_page" componentId="*" /> - {millify(reach || 0)} + <StoryImpressionButton reach={reach} /> </div> )} </div> <div className={styles.viewStoryCompostBarEngagementContainer}> - <CommentButton onClick={onClickComment} pageId="story_page" componentId="*"> - {millify(commentsCount) || 0} - </CommentButton> - <ReactButton onClick={handleLike} pageId="story_page" isLiked={isLiked}> - {millify(totalLikes || 0)} - </ReactButton> + <StoryCommentButton commentsCount={commentsCount} onPress={onClickComment} /> + <StoryReactionButton + myReactions={myReactions} + reactionsCount={reactionsCount} + onPress={handleClickReaction} + /> </div> </div> ); diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/styles.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/styles.tsx deleted file mode 100644 index 3ab262511..000000000 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Footer/styles.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import styled from 'styled-components'; -import { EyeIcon } from '~/icons'; - -export const ViewCountIcon = styled(EyeIcon)` - color: #a5a9b5; -`; - -export const StoryContainer = styled.div` - position: relative; - display: flex; - flex-direction: column; - align-items: center; -`; - -export const ViewStoryInfoContainer = styled.div` - display: flex; - flex-direction: column; - justify-content: flex-start; - width: 100%; -`; - -export const StoryTabBarContainer = styled.div` - display: flex; - flex-direction: column; - align-items: center; - padding: 0.5rem; - height: 5rem; -`; - -export const ViewStoryUploadingWrapper = styled.div` - display: flex; - align-items: center; - justify-content: flex-start; - gap: 0.5rem; -`; - -export const ViewStoryCompostBarContainer = styled.div` - position: absolute; - bottom: 0; - width: 100%; - height: 3.5rem; - display: flex; - justify-content: space-between; - align-items: center; - padding: 0.75rem; - background-color: #000; - color: ${({ theme }) => theme.v4.colors.baseInverse.default}; - z-index: 100; -`; - -export const ViewStoryFailedCompostBarContainer = styled.div` - position: absolute; - bottom: 0; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - height: 3.5rem; - padding: 0.75rem; - background-color: ${({ theme }) => theme.palette.alert.main}; - color: #ffffff; - z-index: 0; -`; - -export const ViewStoryFailedCompostBarWrapper = styled.div` - display: flex; - align-items: center; - justify-content: flex-start; - gap: 0.5rem; - width: 100%; -`; - -export const ViewStoryCompostBarViewIconContainer = styled.div` - ${({ theme }) => theme.typography.bodyBold}; - color: #fff; - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.25rem; -`; - -export const ViewStoryCompostBarEngagementContainer = styled.div` - ${({ theme }) => theme.typography.bodyBold}; - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.75rem; -`; - -export const ViewStoryCompostBarEngagementButton = styled.button` - ${({ theme }) => theme.typography.bodyBold}; - color: #fff; - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.25rem; - border-radius: 1.5rem; - padding: 0.5rem 0.625rem; - background-color: #292b32; - cursor: pointer; - border: none; -`; - -export const ViewStoryContainer = styled.div` - position: relative; - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - background-color: black; -`; diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/Header.module.css b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/Header.module.css index 8294adf3d..5c6bf4bdb 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/Header.module.css +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/Header.module.css @@ -1,219 +1,219 @@ .iconButton { - position: absolute; - width: 2rem; - height: 2rem; - background-color: rgba(var(--asc-color-black), 0.5); - border-radius: 50%; - border: none; - top: 6rem; - left: 1.25rem; - z-index: 9999; - cursor: pointer; - } - - .rendererContainer { - position: relative; - width: 100%; - height: 100%; - } - - .storyVideo { - width: 100%; - height: 100%; - object-fit: contain; - } - - .muteCircleIcon { - width: 100%; - height: 100%; - } - - .unmuteCircleIcon { - width: 100%; - height: 100%; - } - - .loadingOverlay { - position: absolute; - left: 0; - top: 0; - background: rgba(var(--asc-color-black), 0.9); - z-index: 9; - display: flex; - justify-content: center; - align-items: center; - color: var(--asc-color-base-shade3); - } - - .storyImage { - width: auto; - max-width: 100%; - max-height: 100%; - margin: auto; - } - - .playStoryButton { - color: var(--asc-color-white); - cursor: pointer; - } - - .pauseStoryButton { - color: var(--asc-color-white); - cursor: pointer; - } - - .closeButton { - color: var(--asc-color-white); - width: 1.25rem; - height: 1.25rem; - cursor: pointer; - } - - .verifiedBadge { - fill: var(--asc-color-white); - } - - .dotsButton { - width: 1.5rem; - height: 1.5rem; - cursor: pointer; - color: var(--asc-color-white); - } - - .viewStoryInfoContainer { - display: flex; - flex-direction: column; - justify-content: flex-start; - width: 100%; - } - - .viewStoryCompostBarContainer { - width: 100%; - display: flex; - position: absolute; - justify-content: space-between; - align-items: center; - height: 3.5rem; - padding: 0.75rem; - background-color: var(--asc-color-black); - bottom: 0; - } - - .viewStoryCompostBarViewIconContainer { - display: flex; - align-items: center; - justify-content: space-between; - color: var(--asc-color-white); - gap: 0.25rem; - } - - .viewStoryCompostBarEngagementContainer { - display: flex; - align-items: center; - justify-content: space-between; - color: var(--asc-color-white); - gap: 0.75rem; - } - - .viewStoryCompostBarEngagementIconContainer { - display: flex; - align-items: center; - justify-content: space-between; - color: var(--asc-color-white); - gap: 0.25rem; - border-radius: 50%; - padding: 0.5rem 0.625rem; - background-color: var(--asc-color-secondary-default); - } - - .storyContent { - flex: 1; - } - - .header { - height: 5rem; - padding: 0.75rem 1rem 0.625rem 1rem; - } - - .viewStoryContainer { - position: relative; - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - background-color: var(--asc-color-black); - } - - .viewStoryHeaderContainer { - z-index: 99999; - position: absolute; - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; - padding: 1.5rem 1rem 0.625rem 1rem; - gap: 0.5rem; - } - - .avatarContainer { - position: relative; - width: 2.5rem; - height: 2.5rem; - border-radius: 50%; - flex-shrink: 0; - } - - .addStoryButton { - position: absolute; - bottom: 0; - right: 0; - } - - .addStoryButton:hover { - cursor: pointer; - } - - .viewStoryHeaderListActionsContainer { - display: flex; - gap: 1.25rem; - justify-content: flex-end; - align-items: center; - } - - .viewStoryHeadingInfoContainer { - display: inline-flex; - justify-content: space-between; - gap: 0.75rem; - align-items: center; - } - - .viewStoryHeading { - cursor: pointer; - display: flex; - gap: 0.25rem; - color: var(--asc-color-white); - font-size: var(--asc-text-font-size-sm); - font-style: normal; - font-weight: var(--asc-text-font-weight-bold); - line-height: var(--asc-line-height-md); - letter-spacing: -0.24px; - margin-right: 0.25rem; - align-items: center; - } - - .viewStoryHeadingTitle { - width: auto; - max-width: 11.688rem; - } - - .viewStorySubHeading { - display: inline-flex; - gap: 0.25rem; - margin-bottom: 0.25rem; - color: var(--asc-color-white); - font-size: var(--asc-text-font-size-xs); - font-style: normal; - font-weight: var(--asc-text-font-weight-normal); - line-height: var(--asc-line-height-md); - letter-spacing: -0.1px; - } \ No newline at end of file + position: absolute; + width: 2rem; + height: 2rem; + background-color: color(var(--asc-color-black), 0.5); + border-radius: 50%; + border: none; + top: 6rem; + left: 1.25rem; + z-index: 9999; + cursor: pointer; +} + +.rendererContainer { + position: relative; + width: 100%; + height: 100%; +} + +.storyVideo { + width: 100%; + height: 100%; + object-fit: contain; +} + +.muteCircleIcon { + width: 100%; + height: 100%; +} + +.unmuteCircleIcon { + width: 100%; + height: 100%; +} + +.loadingOverlay { + position: absolute; + left: 0; + top: 0; + background: rgb(var(--asc-color-black) 0.9); + z-index: 9; + display: flex; + justify-content: center; + align-items: center; + color: var(--asc-color-base-shade3); +} + +.storyImage { + width: auto; + max-width: 100%; + max-height: 100%; + margin: auto; +} + +.playStoryButton { + fill: var(--asc-color-white); + cursor: pointer; +} + +.pauseStoryButton { + fill: var(--asc-color-white); + cursor: pointer; +} + +.closeButton { + fill: var(--asc-color-white); + width: 1.25rem; + height: 1.25rem; + cursor: pointer; +} + +.verifiedBadge { + fill: var(--asc-color-white); +} + +.dotsButton { + width: 1.5rem; + height: 1.5rem; + cursor: pointer; + color: var(--asc-color-white); +} + +.viewStoryInfoContainer { + display: flex; + flex-direction: column; + justify-content: flex-start; + width: 100%; +} + +.viewStoryCompostBarContainer { + width: 100%; + display: flex; + position: absolute; + justify-content: space-between; + align-items: center; + height: 3.5rem; + padding: 0.75rem; + background-color: var(--asc-color-black); + bottom: 0; +} + +.viewStoryCompostBarViewIconContainer { + display: flex; + align-items: center; + justify-content: space-between; + color: var(--asc-color-white); + gap: 0.25rem; +} + +.viewStoryCompostBarEngagementContainer { + display: flex; + align-items: center; + justify-content: space-between; + color: var(--asc-color-white); + gap: 0.75rem; +} + +.viewStoryCompostBarEngagementIconContainer { + display: flex; + align-items: center; + justify-content: space-between; + color: var(--asc-color-white); + gap: 0.25rem; + border-radius: 50%; + padding: 0.5rem 0.625rem; + background-color: var(--asc-color-secondary-default); +} + +.storyContent { + flex: 1; +} + +.header { + height: 5rem; + padding: 0.75rem 1rem 0.625rem; +} + +.viewStoryContainer { + position: relative; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + background-color: var(--asc-color-black); +} + +.viewStoryHeaderContainer { + z-index: 99999; + position: absolute; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem 1rem 0.625rem; + gap: 0.5rem; +} + +.avatarContainer { + position: relative; + width: 2.5rem; + height: 2.5rem; + border-radius: 50%; + flex-shrink: 0; +} + +.addStoryButton { + position: absolute; + bottom: 0; + right: 0; +} + +.addStoryButton:hover { + cursor: pointer; +} + +.viewStoryHeaderListActionsContainer { + display: flex; + gap: 1.25rem; + justify-content: flex-end; + align-items: center; +} + +.viewStoryHeadingInfoContainer { + display: inline-flex; + justify-content: space-between; + gap: 0.75rem; + align-items: center; +} + +.viewStoryHeading { + cursor: pointer; + display: flex; + gap: 0.25rem; + color: var(--asc-color-white); + font-size: var(--asc-text-font-size-sm); + font-style: normal; + font-weight: var(--asc-text-font-weight-bold); + line-height: var(--asc-line-height-md); + letter-spacing: -0.24px; + margin-right: 0.25rem; + align-items: center; +} + +.viewStoryHeadingTitle { + width: auto; + max-width: 11.688rem; +} + +.viewStorySubHeading { + display: inline-flex; + gap: 0.25rem; + margin-bottom: 0.25rem; + color: var(--asc-color-white); + font-size: var(--asc-text-font-size-xs); + font-style: normal; + font-weight: var(--asc-text-font-weight-normal); + line-height: var(--asc-line-height-md); + letter-spacing: -0.1px; +} diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/index.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/index.tsx index 0237b22cf..1c6cf6ea8 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/index.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/Wrappers/Header/index.tsx @@ -1,12 +1,12 @@ import React from 'react'; -import styles from './Header.module.css'; import Truncate from 'react-truncate-markup'; -import Avatar from '~/core/components/Avatar'; -import { backgroundImage as communityBackgroundImage } from '~/icons/Community'; - import { PauseIcon, PlayIcon } from '~/icons'; import { CloseButton, OverflowMenuButton } from '~/v4/social/elements'; import Verified from '~/v4/social/icons/verified'; +import clsx from 'clsx'; +import { CommunityAvatar } from '~/v4/social/elements/CommunityAvatar'; + +import styles from './Header.module.css'; const Header: React.FC< React.PropsWithChildren<{ @@ -14,9 +14,8 @@ const Header: React.FC< onPause: () => void; onAction: () => void; onClose: () => void; - onAddStory: (e: React.MouseEvent<Element, MouseEvent>) => void; onClickCommunity: () => void; - avatar?: string; + community?: Amity.Community | null; heading?: React.ReactNode; subheading?: React.ReactNode; isOfficial?: boolean; @@ -28,7 +27,7 @@ const Header: React.FC< addStoryButton?: React.ReactNode; }> > = ({ - avatar, + community, heading, subheading, isHaveActions, @@ -46,12 +45,7 @@ const Header: React.FC< <div className={styles.viewStoryHeaderContainer}> <div className={styles.viewStoryHeadingInfoContainer}> <div className={styles.avatarContainer}> - <Avatar - data-qa-anchor="community_avatar" - avatar={avatar} - backgroundImage={communityBackgroundImage} - /> - + <CommunityAvatar pageId="story_page" community={community} /> {haveStoryPermission && addStoryButton} </div> <div className={styles.viewStoryInfoContainer}> @@ -84,10 +78,12 @@ const Header: React.FC< onClick={onPause} /> )} - {isHaveActions && ( - <OverflowMenuButton pageId="story_page" componentId="*" onClick={onAction} /> - )} - <CloseButton pageId="story_page" componentId="*" onClick={onClose} /> + {isHaveActions && <OverflowMenuButton pageId="story_page" onPress={onAction} />} + <CloseButton + defaultClassName={clsx(styles.closeButton)} + pageId="story_page" + onPress={onClose} + /> </div> </div> ); diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/index.tsx b/src/v4/social/internal-components/StoryViewer/Renderers/index.tsx index 9d188b8dd..6c09caccd 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/index.tsx +++ b/src/v4/social/internal-components/StoryViewer/Renderers/index.tsx @@ -2,5 +2,11 @@ import image from './Image'; import video from './Video'; import defaultRenderer from './Default'; import autoplayContent from './AutoPlayContent'; +import { CustomRenderer, Tester } from './types'; -export const renderers = [image, video, autoplayContent, defaultRenderer]; +export const renderers: { renderer: CustomRenderer; tester: Tester }[] = [ + image, + video, + autoplayContent, + defaultRenderer, +]; diff --git a/src/v4/social/internal-components/StoryViewer/Renderers/types.ts b/src/v4/social/internal-components/StoryViewer/Renderers/types.ts index 08c67236a..056796ac5 100644 --- a/src/v4/social/internal-components/StoryViewer/Renderers/types.ts +++ b/src/v4/social/internal-components/StoryViewer/Renderers/types.ts @@ -1,19 +1,40 @@ -import { Action, Story } from 'react-insta-stories/dist/interfaces'; - -export type CustomRenderer = React.FC<{ - story: Amity.Story & - Story & { - actions: Array<{ - name: string; - action: () => void; - icon: JSX.Element; - }>; - onChange: (file: File) => void; - handleAddIconClick: (e: React.MouseEvent<Element, MouseEvent>) => void; - addStoryButton: JSX.Element; - fileInputRef: React.RefObject<HTMLInputElement>; +import Stories from 'react-insta-stories'; + +import React from 'react'; + +type StoriesProps = React.ComponentProps<typeof Stories>; + +export type RendererObject = NonNullable<StoriesProps['renderers']>[number]; + +export type RendererProps = React.ComponentProps<RendererObject['renderer']>; +export type Renderer = RendererObject['renderer']; +export type Tester = RendererObject['tester']; + +type Action = RendererProps['action']; +type Story = RendererProps['story']; + +export type CustomStory = Story & + Amity.Story & { + actions: Array<{ + name: string; + action: () => void; + icon: JSX.Element; + }>; + onChange: (file: File) => void; + handleAddIconClick: (e: React.MouseEvent<Element, MouseEvent>) => void; + addStoryButton: JSX.Element; + fileInputRef: React.RefObject<HTMLInputElement>; + storyStyles: { + background: string; }; - action: Action; + currentIndex: number; + storiesCount: number; + increaseIndex: () => void; + pageId?: string; + }; + +export type CustomRendererProps = RendererProps & { + story: CustomStory; config: { width?: number | string; height?: number | string; @@ -21,10 +42,15 @@ export type CustomRenderer = React.FC<{ header?: () => JSX.Element; storyStyles?: object; }; + onClose: () => void; + onSwipeDown?: () => void; + onClickCommunity?: () => void; messageHandler: ( type: string, data: any, ) => { ack: 'OK' | 'ERROR'; }; -}>; +}; + +export type CustomRenderer = React.FC<CustomRendererProps>; diff --git a/src/v4/social/internal-components/TabButton/TabButton.module.css b/src/v4/social/internal-components/TabButton/TabButton.module.css new file mode 100644 index 000000000..e058e951c --- /dev/null +++ b/src/v4/social/internal-components/TabButton/TabButton.module.css @@ -0,0 +1,22 @@ +.tabButton { + display: flex; + align-items: center; + padding: var(--asc-spacing-s1) var(--asc-spacing-s2); + background: var(--asc-color-base-background, #fff); + border: 1px solid var(--asc-color-base-shade4); + border-radius: 1.5rem; + cursor: pointer; + color: var(--asc-color-base-shade1); + white-space: nowrap; +} + +.tabButton[data-active='true'] { + font-weight: 600; + color: var(--asc-color-white); + background-color: var(--asc-color-primary-default); + border: 1px solid transparent; +} + +.tabButton__text { + font-size: 1.0625rem; +} diff --git a/src/v4/social/internal-components/TabButton/TabButton.stories.tsx b/src/v4/social/internal-components/TabButton/TabButton.stories.tsx new file mode 100644 index 000000000..0deadf01b --- /dev/null +++ b/src/v4/social/internal-components/TabButton/TabButton.stories.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { TabButton } from './TabButton'; + +export default { + title: 'v4-social/internal-components/TabButton', +}; + +export const TabButtonStory = { + render: () => { + return <TabButton>Tab Name</TabButton>; + }, +}; diff --git a/src/v4/social/internal-components/TabButton/TabButton.tsx b/src/v4/social/internal-components/TabButton/TabButton.tsx new file mode 100644 index 000000000..120d7ae0d --- /dev/null +++ b/src/v4/social/internal-components/TabButton/TabButton.tsx @@ -0,0 +1,50 @@ +import React, { ReactNode } from 'react'; + +import { Typography } from '~/v4/core/components'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +import styles from './TabButton.module.css'; + +export interface TabButtonProps extends React.HTMLAttributes<HTMLButtonElement> { + pageId?: string; + componentId?: string; + elementId?: string; + children: ReactNode; + isActive?: boolean; +} + +export function TabButton({ + pageId = '*', + componentId = '*', + elementId = '*', + children, + isActive = false, + ...rest +}: TabButtonProps) { + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + return ( + <button + style={themeStyles} + className={styles.tabButton} + data-active={isActive} + data-qa-anchor={accessibilityId} + {...rest} + > + {isActive ? ( + <Typography.Title data-active={isActive} className={styles.tabButton__text}> + {children} + </Typography.Title> + ) : ( + <Typography.Caption data-active={isActive} className={styles.tabButton__text}> + {children} + </Typography.Caption> + )} + </button> + ); +} diff --git a/src/v4/social/internal-components/TabButton/index.tsx b/src/v4/social/internal-components/TabButton/index.tsx new file mode 100644 index 000000000..0a8a06ff0 --- /dev/null +++ b/src/v4/social/internal-components/TabButton/index.tsx @@ -0,0 +1 @@ +export { TabButton } from './TabButton'; diff --git a/src/v4/social/internal-components/TabsBar/TabsBar.module.css b/src/v4/social/internal-components/TabsBar/TabsBar.module.css new file mode 100644 index 000000000..a377b2e4d --- /dev/null +++ b/src/v4/social/internal-components/TabsBar/TabsBar.module.css @@ -0,0 +1,28 @@ +button, +fieldset, +input { + all: unset; +} + +.tabsRoot { + display: flex; + flex-direction: column; + background-color: var(--asc-color-base-background); +} + +.tabsList { + display: flex; + flex-shrink: 0; + border-bottom: 1px solid var(--asc-color-base-shade4); + gap: 1.25rem; +} + +.tabsTrigger { + height: 3rem; + color: var(--asc-color-base-shade3); +} + +.tabsTrigger[data-state='active'] { + color: var(--asc-color-primary-default); + border-bottom: 0.125rem solid var(--asc-color-primary-default); +} diff --git a/src/v4/social/internal-components/TabsBar/TabsBar.stories.tsx b/src/v4/social/internal-components/TabsBar/TabsBar.stories.tsx new file mode 100644 index 000000000..03784411d --- /dev/null +++ b/src/v4/social/internal-components/TabsBar/TabsBar.stories.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { TabsBar } from './TabsBar'; + +export default { + title: 'v4-social/internal-components/TabsBar', +}; + +export const TabsBarStory = { + render: () => { + const tabs = [ + { label: 'tab1', value: 'tab1', content: () => 'Tab 1' }, + { label: 'tab2', value: 'tab2', content: () => 'Tab 2' }, + { label: 'tab3', value: 'tab3', content: () => 'Tab 3' }, + ]; + + const [activeTab, setActiveTab] = React.useState('tab1'); + + return ( + <TabsBar activeTab={activeTab} tabs={tabs} onTabChange={(newTab) => setActiveTab(newTab)} /> + ); + }, +}; diff --git a/src/v4/social/internal-components/TabsBar/TabsBar.tsx b/src/v4/social/internal-components/TabsBar/TabsBar.tsx new file mode 100644 index 000000000..8556a44d3 --- /dev/null +++ b/src/v4/social/internal-components/TabsBar/TabsBar.tsx @@ -0,0 +1,52 @@ +import React, { ReactNode } from 'react'; +import * as Tabs from '@radix-ui/react-tabs'; +import { Typography } from '~/v4/core/components'; +import styles from './TabsBar.module.css'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; + +interface TabsBarProps { + pageId?: string; + componentId?: string; + elementId?: string; + tabs: { value: string; label: string; content: () => ReactNode }[]; + activeTab: string; + onTabChange: (tabName: string) => void; +} + +export const TabsBar = ({ + tabs, + activeTab, + onTabChange, + pageId = '*', + componentId = '*', + elementId = '*', +}: TabsBarProps) => { + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityElement({ + pageId, + componentId, + elementId, + }); + + return ( + <Tabs.Root + style={themeStyles} + className={styles.tabsRoot} + value={activeTab} + onValueChange={(newValue) => onTabChange(newValue)} + > + <Tabs.List className={styles.tabsList}> + {tabs.map((tab) => ( + <Tabs.Trigger value={tab.value} className={styles.tabsTrigger}> + <Typography.Title>{tab.label}</Typography.Title> + </Tabs.Trigger> + ))} + </Tabs.List> + {tabs.map((tab) => ( + <Tabs.Content value={tab.value}>{tab.content()}</Tabs.Content> + ))} + </Tabs.Root> + ); +}; + +export default TabsBar; diff --git a/src/v4/social/internal-components/TabsBar/index.tsx b/src/v4/social/internal-components/TabsBar/index.tsx new file mode 100644 index 000000000..a7157de09 --- /dev/null +++ b/src/v4/social/internal-components/TabsBar/index.tsx @@ -0,0 +1 @@ +export { TabsBar } from './TabsBar'; diff --git a/src/v4/social/internal-components/UserAvatar/UserAvatar.module.css b/src/v4/social/internal-components/UserAvatar/UserAvatar.module.css new file mode 100644 index 000000000..31f91329c --- /dev/null +++ b/src/v4/social/internal-components/UserAvatar/UserAvatar.module.css @@ -0,0 +1,31 @@ +.userAvatar__text { + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + width: 2rem; + height: 2rem; + color: var(--asc-color-base-shade4); + background-color: var(--asc-color-secondary-shade2); + text-transform: uppercase; +} + +.userAvatar__placeholder__path { + fill: var(--asc-color-white); +} + +.userAvatar__placeholder__rect { + fill: var(--asc-color-primary-shade3); +} + +.userAvatar__placeholder { + width: 2rem; + height: 2rem; +} + +.userAvatar__img { + border-radius: 50%; + object-fit: cover; + width: 2rem; + height: 2rem; +} diff --git a/src/v4/social/internal-components/UserAvatar/UserAvatar.stories.tsx b/src/v4/social/internal-components/UserAvatar/UserAvatar.stories.tsx new file mode 100644 index 000000000..ccefd2cee --- /dev/null +++ b/src/v4/social/internal-components/UserAvatar/UserAvatar.stories.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { UserAvatar } from './UserAvatar'; + +export default { + title: 'v4-social/internal-components/UserAvatar', +}; + +export const UserAvatarStory = { + render: () => { + return <UserAvatar userId={'Web-Test'} />; + }, +}; diff --git a/src/v4/social/internal-components/UserAvatar/UserAvatar.tsx b/src/v4/social/internal-components/UserAvatar/UserAvatar.tsx new file mode 100644 index 000000000..bd94f799d --- /dev/null +++ b/src/v4/social/internal-components/UserAvatar/UserAvatar.tsx @@ -0,0 +1,46 @@ +import clsx from 'clsx'; +import React from 'react'; +import useUser from '~/v4/core/hooks/objects/useUser'; +import useImage from '~/v4/core/hooks/useImage'; +import styles from './UserAvatar.module.css'; + +const UserSvg = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="64" + height="64" + viewBox="0 0 64 64" + fill="none" + className={clsx(styles.userAvatar__placeholder, className)} + {...props} + > + <rect width="64" height="64" rx="32" className={styles.userAvatar__placeholder__rect} /> + <path + d="M37.0007 21.0099C35.8159 19.851 34.2089 19.2 32.5333 19.2C30.8576 19.2 29.2506 19.851 28.0658 21.0099C26.881 22.1687 26.2153 23.7405 26.2153 25.3793C26.2153 27.0182 26.881 28.5899 28.0658 29.7488C29.2506 30.9076 30.8576 31.5586 32.5333 31.5586C34.2089 31.5586 35.8159 30.9076 37.0007 29.7488C38.1856 28.5899 38.8512 27.0182 38.8512 25.3793C38.8512 23.7405 38.1856 22.1687 37.0007 21.0099Z" + className={styles.userAvatar__placeholder__path} + /> + <path + d="M32.5333 35.0897C26.0529 35.0897 20.7999 38.0557 20.7999 41.7104V44.8H44.2666V41.7104C44.2666 38.0557 39.0137 35.0897 32.5333 35.0897Z" + className={styles.userAvatar__placeholder__path} + /> + </svg> +); + +interface UserAvatarProps { + userId?: string | null; + className?: string; +} + +export function UserAvatar({ userId, className }: UserAvatarProps) { + const { user } = useUser(userId); + + const userImage = useImage({ fileId: user?.avatar?.fileId }); + + if (user == null || userId == null || userImage == null) return <UserSvg className={className} />; + + return ( + <object data={userImage} type="image/png" className={clsx(styles.userAvatar__img, className)}> + <UserSvg className={className} /> + </object> + ); +} diff --git a/src/v4/social/internal-components/UserAvatar/index.tsx b/src/v4/social/internal-components/UserAvatar/index.tsx new file mode 100644 index 000000000..930fb2e3a --- /dev/null +++ b/src/v4/social/internal-components/UserAvatar/index.tsx @@ -0,0 +1 @@ +export { UserAvatar } from './UserAvatar'; diff --git a/src/v4/social/internal-components/VideoPreview/VideoPreview.tsx b/src/v4/social/internal-components/VideoPreview/VideoPreview.tsx index 2449f0334..2237e0d5f 100644 --- a/src/v4/social/internal-components/VideoPreview/VideoPreview.tsx +++ b/src/v4/social/internal-components/VideoPreview/VideoPreview.tsx @@ -1,12 +1,12 @@ import React from 'react'; -type BaseVideoPreviewProps = { +type VideoPreviewProps = { src: string; mimeType?: string; mediaFit?: string; } & React.VideoHTMLAttributes<HTMLVideoElement>; -export const BaseVideoPreview = React.forwardRef<HTMLVideoElement, BaseVideoPreviewProps>( +export const VideoPreview = React.forwardRef<HTMLVideoElement, VideoPreviewProps>( ({ src, mimeType, mediaFit, ...props }, ref) => ( <video controls controlsList="nodownload" {...props} ref={ref} data-qa-anchor="video-preview"> <source src={src} type={mimeType} /> diff --git a/src/v4/social/internal-components/VideoPreview/index.ts b/src/v4/social/internal-components/VideoPreview/index.ts index 442a23464..259a74c07 100644 --- a/src/v4/social/internal-components/VideoPreview/index.ts +++ b/src/v4/social/internal-components/VideoPreview/index.ts @@ -1 +1 @@ -export { BaseVideoPreview } from './VideoPreview'; +export { VideoPreview } from './VideoPreview'; diff --git a/src/v4/social/internal-components/VideoViewer/VideoViewer.module.css b/src/v4/social/internal-components/VideoViewer/VideoViewer.module.css new file mode 100644 index 000000000..44fb5d7d3 --- /dev/null +++ b/src/v4/social/internal-components/VideoViewer/VideoViewer.module.css @@ -0,0 +1,101 @@ +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--asc-color-black); + z-index: 1000; +} + +.modalContent { + background-color: var(--asc-color-base-background); + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: 100%; +} + +.closeButton { + position: absolute; + top: 10px; + left: 10px; + font-size: 24px; + cursor: pointer; +} + +.fullImage { + max-width: 100vw; + max-height: 100vh; + width: 100%; + height: auto; + object-fit: contain; +} + +.nextButton { + width: 2rem; + height: 2rem; +} + +.prevButton { + width: 2rem; + height: 2rem; +} + +.overlayPanel { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; +} + +.overlayPanel__prev, +.overlayPanel__next { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + opacity: 0.5; + background-color: var(--asc-color-black); + flex-basis: 2.5rem; + cursor: pointer; +} + +.overlayPanel__prev:hover, +.overlayPanel__next:hover { + opacity: 0.8; +} + +.overlayPanel__prevButton, +.overlayPanel__nextButton { + width: 2rem; + height: 2rem; + fill: var(--asc-color-base-shade4); + border-radius: 50%; + background-color: var(--asc-color-base-shade3); + padding: 0.375rem; +} + +.overlayPanel__prevButton { + transform: rotate(180deg); +} + +.overlayPanel__middle { + flex: 1 1 auto; +} + +.videoViewer__clearButton { + fill: var(--asc-color-base-shade3); + width: 2rem; + height: 2rem; + cursor: pointer; +} + +.videoViewer__clearButton__img { + width: 2rem; + height: 2rem; + cursor: pointer; +} diff --git a/src/v4/social/internal-components/VideoViewer/VideoViewer.tsx b/src/v4/social/internal-components/VideoViewer/VideoViewer.tsx new file mode 100644 index 000000000..b61fccdd0 --- /dev/null +++ b/src/v4/social/internal-components/VideoViewer/VideoViewer.tsx @@ -0,0 +1,133 @@ +import React, { memo, useMemo, useState } from 'react'; +import useFile from '~/core/hooks/useFile'; +import { VideoFileStatus } from '~/social/constants'; +import usePostByIds from '~/social/hooks/usePostByIds'; +import { useAmityElement } from '~/v4/core/hooks/uikit'; +import AngleRight from '~/v4/icons/AngleRight'; +import { ClearButton } from '~/v4/social/elements/ClearButton/ClearButton'; +import styles from './VideoViewer.module.css'; + +const VideoPlayer = memo(({ videoFileId }: { videoFileId: string }) => { + const file: Amity.File<'video'> | undefined = useFile<Amity.File<'video'>>(videoFileId); + + /* + * It's possible that certain video formats uploaded by the user are not + * playable by the browser. So it's best to use the transcoded video file + * which is an mp4 format to play video. + * + * Note: the below logic needs to be smarter based on users bandwidth and also + * should be switchable by the user, which would require a ui update + */ + const url = useMemo(() => { + if (file == null) return null; + if (file.status === VideoFileStatus.Transcoded) { + const { videoUrl } = file; + + return ( + videoUrl?.['1080p'] || + videoUrl?.['720p'] || + videoUrl?.['480p'] || + videoUrl?.['360p'] || + videoUrl?.original || + file.fileUrl + ); + } + return file.fileUrl; + }, [file]); + + if (url == null) return <></>; + + return ( + <video controls controlsList="nodownload" autoPlay className={styles.fullImage}> + <source src={url} type="video/mp4" /> + <p> + Your browser does not support this format of video. Please try again later once the server + transcodes the video into an playable format(mp4). + </p> + </video> + ); +}); + +interface VideoViewerProps { + pageId?: string; + componentId?: string; + elementId?: string; + post: Amity.Post; + onClose(): void; + initialVideoIndex: number; +} + +export function VideoViewer({ + pageId = '*', + componentId = '*', + elementId = '*', + post, + initialVideoIndex, + onClose, +}: VideoViewerProps) { + const { themeStyles } = useAmityElement({ pageId, componentId, elementId }); + + const [selectedVideoIndex, setSelectedVideoIndex] = useState(initialVideoIndex); + + const posts = usePostByIds(post?.children || []); + + const videoPosts = posts.filter((post) => post.dataType === 'video'); + + const videoFileId = useMemo(() => { + return ( + videoPosts?.[selectedVideoIndex]?.data.videoFileId.high || + videoPosts?.[selectedVideoIndex]?.data.videoFileId.medium || + videoPosts?.[selectedVideoIndex]?.data.videoFileId.low || + videoPosts?.[selectedVideoIndex]?.data.videoFileId.original || + undefined + ); + }, [videoPosts, selectedVideoIndex]); + + const hasNext = selectedVideoIndex < videoPosts.length - 1; + const hasPrev = selectedVideoIndex > 0; + + const next = () => { + if (!hasNext) { + return; + } + setSelectedVideoIndex((prev) => prev + 1); + }; + + const prev = () => { + if (!hasPrev) { + return; + } + setSelectedVideoIndex((prev) => prev - 1); + }; + + return ( + <div style={themeStyles}> + <div className={styles.modal} onClick={onClose}> + <div className={styles.modalContent} onClick={(e) => e.stopPropagation()}> + <VideoPlayer videoFileId={videoFileId} /> + <div className={styles.overlayPanel}> + {hasPrev && ( + <div className={styles.overlayPanel__prev} onClick={prev}> + <AngleRight className={styles.overlayPanel__prevButton} /> + </div> + )} + <div className={styles.overlayPanel__middle} /> + {hasNext && ( + <div className={styles.overlayPanel__next} onClick={next}> + <AngleRight className={styles.overlayPanel__nextButton} /> + </div> + )} + </div> + <span className={styles.closeButton} onClick={onClose}> + <ClearButton + pageId={pageId} + componentId={componentId} + defaultClassName={styles.videoViewer__clearButton} + imgClassName={styles.videoViewer__clearButton__img} + /> + </span> + </div> + </div> + </div> + ); +} diff --git a/src/v4/social/internal-components/VideoViewer/index.tsx b/src/v4/social/internal-components/VideoViewer/index.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/v4/social/pages/Application/Application.module.css b/src/v4/social/pages/Application/Application.module.css index 85a1fbe2a..31f5946a4 100644 --- a/src/v4/social/pages/Application/Application.module.css +++ b/src/v4/social/pages/Application/Application.module.css @@ -1,24 +1,24 @@ .applicationContainer { - height: 100%; - width: 100%; - } - + height: 100%; + width: 100%; +} + +.styledCommunitySideMenu { + display: none; +} + +@media (width >= 768px) { .styledCommunitySideMenu { - display: none; - } - - @media (min-width: 768px) { - .styledCommunitySideMenu { - min-height: 100%; - display: block; - } + min-height: 100%; + display: block; } - - .wrapper { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - } \ No newline at end of file +} + +.wrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; +} diff --git a/src/v4/social/pages/Application/index.tsx b/src/v4/social/pages/Application/index.tsx index 6c4c2d057..7f7ff625a 100644 --- a/src/v4/social/pages/Application/index.tsx +++ b/src/v4/social/pages/Application/index.tsx @@ -1,82 +1,31 @@ -import React, { useEffect, useState } from 'react'; -import styles from './Application.module.css'; -import { PageTypes } from '~/social/constants'; -import MainLayout from '~/social/layouts/Main'; -import CommunitySideMenu from '~/social/components/CommunitySideMenu'; -import ExplorePage from '~/social/pages/Explore'; -import NewsFeedPage from '~/social/pages/NewsFeed'; -import UserFeedPage from '~/social/pages/UserFeed'; -import CategoryCommunitiesPage from '~/social/pages/CategoryCommunities'; -import CommunityEditPage from '~/social/pages/CommunityEdit'; -import ProfileSettings from '~/social/components/ProfileSettings'; -import { useNavigation } from '~/social/providers/NavigationProvider'; -import useSDK from '~/core/hooks/useSDK'; -import { AmityViewStoryPage } from '~/v4/social/pages/StoryPage'; -import { StoryProvider } from '~/v4/social/providers/StoryProvider'; -import CommunityFeed from '~/social/pages/CommunityFeed'; +import React from 'react'; -const Community = () => { - const { page } = useNavigation(); - const { client } = useSDK(); - const [socialSettings, setSocialSettings] = useState<Amity.SocialSettings | null>(null); - const [open, setOpen] = useState(false); +import { SocialHomePage } from '~/v4/social/pages/SocialHomePage'; +import { PostDetailPage } from '~/v4/social/pages/PostDetailPage'; +import { PageTypes, useNavigation } from '~/v4/core/providers/NavigationProvider'; +import { StoryProvider } from '~/v4/social/providers/StoryProvider'; +import { SocialGlobalSearchPage } from '~/v4/social/pages/SocialGlobalSearchPage'; +import { ViewStoryPage } from '~/v4/social/pages/StoryPage'; +import { SelectPostTargetPage } from '../SelectPostTargetPage'; - const toggleOpen = () => { - setOpen(!open); - }; +import styles from './Application.module.css'; - useEffect(() => { - if (client === null) return; - async function run() { - const settings = await client?.getSocialSettings(); - if (settings) { - setSocialSettings(settings); - } - } - run(); - }, [client]); +const Application = () => { + const { page } = useNavigation(); return ( <StoryProvider> <div className={styles.applicationContainer}> - <MainLayout - aside={ - <div className={styles.styledCommunitySideMenu}> - <CommunitySideMenu activeCommunity={page.communityId} /> - </div> - } - > - {page.type === PageTypes.Explore && <ExplorePage />} - {page.type === PageTypes.NewsFeed && ( - <NewsFeedPage toggleOpen={toggleOpen} isOpen={open} /> - )} - {page.type === PageTypes.CommunityFeed && ( - <CommunityFeed - communityId={page.communityId} - isNewCommunity={page.isNewCommunity} - isOpen={open} - toggleOpen={toggleOpen} - /> - )} - {page.type === PageTypes.ViewStory && page.storyType && ( - <div className={styles.wrapper}> - <AmityViewStoryPage type={page.storyType} /> - </div> - )} - {page.type === PageTypes.CommunityEdit && ( - <CommunityEditPage communityId={page.communityId} tab={page.tab} /> - )} - {page.type === PageTypes.Category && ( - <CategoryCommunitiesPage categoryId={page.categoryId} /> - )} - {page.type === PageTypes.UserFeed && ( - <UserFeedPage userId={page.userId} socialSettings={socialSettings} /> - )} - {page.type === PageTypes.UserEdit && <ProfileSettings userId={page.userId} />} - </MainLayout> + {page.type === PageTypes.SocialHomePage && <SocialHomePage />} + {page.type === PageTypes.SocialGlobalSearchPage && <SocialGlobalSearchPage />} + {page.type === PageTypes.PostDetailPage && <PostDetailPage id={page.context.postId} />} + {page.type === PageTypes.ViewStoryPage && ( + <ViewStoryPage type="globalFeed" targetId={page.context.targetId} /> + )} + {/* {page.type === PageTypes.SelectPostTargetPage && <SelectPostTargetPage />} */} </div> </StoryProvider> ); }; -export default Community; +export default Application; diff --git a/src/v4/social/pages/DraftsPage/DraftsPage.module.css b/src/v4/social/pages/DraftsPage/DraftsPage.module.css index 280baf472..e0f3fb9e5 100644 --- a/src/v4/social/pages/DraftsPage/DraftsPage.module.css +++ b/src/v4/social/pages/DraftsPage/DraftsPage.module.css @@ -1,11 +1,22 @@ -.draftPage { +.draftPageContainer { + aspect-ratio: 9 / 16; + max-width: 23.4375rem; /* 375px */ + max-height: 100%; + width: 100%; + height: auto; + position: relative; display: flex; flex-direction: column; - width: 23.438rem; - height: 40.875rem; - position: relative; - font-family: var(--asc-text-global-font-family); - font-style: var(--asc-text-global-font-style); +} + +@media (width <= 768px) { + .draftPageContainer { + max-width: 100%; + max-height: 100vh; + width: 100%; + height: 100%; + aspect-ratio: auto; + } } .headerContainer { @@ -16,12 +27,28 @@ z-index: 1; } -.header { +.storyWrapper { display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + gap: 1rem; + overflow: hidden; +} + +.header { width: 100%; justify-content: space-between; + position: absolute; + top: 0; + left: 0; + right: 0; + display: flex; align-items: center; - padding: var(--asc-spacing-m1); + padding: var(--asc-spacing-s1); + background-color: transparent; + color: var(--asc-color-white); } .topRightButtons { @@ -32,10 +59,7 @@ } .mainContainer { - width: 100%; - height: 100%; flex: 1; - position: relative; display: flex; justify-content: center; align-items: center; @@ -44,9 +68,12 @@ border-top-right-radius: var(--asc-border-radius-lg); background: linear-gradient( 180deg, - var(--draft-image-container-color-0, var(--asc-color-black)) 0%, - var(--draft-image-container-color-last, var(--asc-color-black)) 100% + var(--asc-draft-image-container-color-0, var(--asc-color-black)) 0%, + var(--asc-draft-image-container-color-last, var(--asc-color-black)) 100% ); + position: relative; + width: 100%; + height: 100%; } .previewImage { @@ -80,13 +107,14 @@ .playPauseButton { position: absolute; - top: 10px; - right: 10px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); background: none; border: none; - cursor: pointer; color: var(--asc-color-white); - font-size: 1.5rem; + font-size: 3rem; + cursor: pointer; } .progressBar { @@ -95,11 +123,12 @@ left: 0; right: 0; height: 4px; + background-color: rgb(255 255 255 / 30%); } .progressFill { height: 100%; - background-color: var(--asc-color-primary-default); + background-color: var(--asc-color-white); transition: width 0.1s linear; } @@ -124,63 +153,3 @@ width: 100%; height: 100%; } - -.mainContainer { - position: relative; - width: 100%; - height: 100%; -} - -.header { - position: absolute; - top: 0; - left: 0; - right: 0; - display: flex; - align-items: center; - padding: var(--asc-spacing-s1); - background-color: transparent; - color: var(--color-white); -} - -.progressBar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background-color: rgba(255, 255, 255, 0.3); -} - -.progressFill { - height: 100%; - background-color: var(--color-white); - transition: width 0.1s linear; -} - -.userInfo { - display: flex; - flex-direction: column; - margin-left: 10px; -} - -.name { - font-size: 16px; - font-weight: bold; -} - -.description { - font-size: 14px; -} - -.playPauseButton { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: none; - border: none; - color: var(--color-white); - font-size: 48px; - cursor: pointer; -} diff --git a/src/v4/social/pages/DraftsPage/DraftsPage.tsx b/src/v4/social/pages/DraftsPage/DraftsPage.tsx index 09ba86a42..63a2f5b8b 100644 --- a/src/v4/social/pages/DraftsPage/DraftsPage.tsx +++ b/src/v4/social/pages/DraftsPage/DraftsPage.tsx @@ -2,11 +2,7 @@ import React, { useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; import { extractColors } from 'extract-colors'; import { readFileAsync } from '~/helpers'; - -import styles from './DraftsPage.module.css'; import { SubmitHandler } from 'react-hook-form'; - -import { usePageBehavior } from '~/v4/core/providers/PageBehaviorProvider'; import { AspectRatioButton, BackButton, @@ -16,32 +12,47 @@ import { } from '~/v4/social/elements'; import { useStoryContext } from '~/v4/social/providers/StoryProvider'; import { StoryRepository } from '@amityco/ts-sdk'; - import { HyperLinkConfig } from '~/v4/social/components'; import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; import { useNotifications } from '~/v4/core/providers/NotificationProvider'; -import { useNavigation } from '~/social/providers/NavigationProvider'; -import { PageTypes } from '~/social/constants'; -import { BaseVideoPreview } from '../../internal-components/VideoPreview'; import { useCommunityInfo } from '~/social/components/CommunityInfo/hooks'; +import { usePageBehavior } from '~/v4/core/providers/PageBehaviorProvider'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; + +import styles from './DraftsPage.module.css'; +import { VideoPreview } from '~/v4/social/internal-components/VideoPreview'; -type AmityStoryMediaType = { type: 'image'; url: string } | { type: 'video'; url: string }; +export type AmityStoryMediaType = { type: 'image'; url: string } | { type: 'video'; url: string }; -type AmityDraftStoryPageProps = { - targetId?: string; +export type AmityDraftStoryPageProps = { + targetId: string; targetType: Amity.StoryTargetType; mediaType?: AmityStoryMediaType; + storyType: 'communityFeed' | 'globalFeed'; }; -type HyperLinkFormInputs = { +export type HyperLinkFormInputs = { url: string; customText?: string; }; -const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStoryPageProps) => { - const { page, onChangePage, onClickCommunity } = useNavigation(); +export const PlainDraftStoryPage = ({ + targetId, + targetType, + mediaType, + goToCommunityPage, + goToGlobalFeedPage, + onDiscardCreateStory, + storyType, +}: AmityDraftStoryPageProps & { + goToCommunityPage: (communityId: string) => void; + goToGlobalFeedPage: () => void; + onDiscardCreateStory: () => void; + storyType: 'communityFeed' | 'globalFeed'; +}) => { + const pageId = 'create_story_page'; const { file, setFile } = useStoryContext(); - const { navigationBehavior } = usePageBehavior(); + const { community } = useCommunityInfo(targetId); const [isHyperLinkBottomSheetOpen, setIsHyperLinkBottomSheetOpen] = useState(false); const { confirm } = useConfirmContext(); const notification = useNotifications(); @@ -65,8 +76,6 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor setIsHyperLinkBottomSheetOpen(false); }; - const community = useCommunityInfo(targetId); - const { formatMessage } = useIntl(); const [imageMode, setImageMode] = useState<'fit' | 'fill'>('fit'); @@ -90,12 +99,10 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor const formData = new FormData(); formData.append('files', file); setFile(null); - if (page.type === PageTypes.ViewStory && page.storyType === 'globalFeed') { - onChangePage(PageTypes.NewsFeed); + if (storyType === 'globalFeed') { + goToGlobalFeedPage(); } else { - if (page.communityId) { - onClickCommunity(page.communityId); - } + goToCommunityPage(targetId); } if (mediaType?.type === 'image' && targetId) { const { data: imageData } = await StoryRepository.createImageStory( @@ -140,7 +147,7 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor okText: formatMessage({ id: 'delete' }), onOk: () => { setFile(null); - navigationBehavior.onCloseAction(); + onDiscardCreateStory(); }, }); }; @@ -212,24 +219,16 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor }, [file, imageMode, mediaType]); return ( - <> - <div id="asc-uikit-create-story" className={styles.draftPage}> + <div className={styles.storyWrapper}> + <div id="asc-uikit-create-story" className={styles.draftPageContainer}> <div className={styles.headerContainer}> <div className={styles.header}> - <BackButton pageId="create_story_page" componentId="*" onClick={discardCreateStory} /> + <BackButton pageId={pageId} onPress={discardCreateStory} /> <div className={styles.topRightButtons}> {mediaType?.type === 'image' && ( - <AspectRatioButton - pageId="create_story_page" - componentId="*" - onClick={onClickImageMode} - /> + <AspectRatioButton pageId={pageId} onPress={onClickImageMode} /> )} - <HyperLinkButton - pageId="create_story_page" - componentId="*" - onClick={handleOnClickHyperLinkActionButton} - /> + <HyperLinkButton pageId={pageId} onPress={handleOnClickHyperLinkActionButton} /> </div> </div> </div> @@ -257,11 +256,12 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor /> </div> ) : mediaType?.type === 'video' ? ( - <BaseVideoPreview + <VideoPreview + mediaFit="contain" className={styles.videoPreview} src={file ? URL.createObjectURL(file) : mediaType.url} - mediaFit="contain" autoPlay + loop controls={false} /> ) : null} @@ -274,7 +274,7 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor )} <HyperLinkConfig - pageId="*" + pageId={pageId} isOpen={isHyperLinkBottomSheetOpen} onClose={handleHyperLinkBottomSheetClose} onSubmit={onSubmitHyperLink} @@ -284,16 +284,30 @@ const AmityDraftStoryPage = ({ targetId, targetType, mediaType }: AmityDraftStor <div className={styles.footer}> <ShareStoryButton - pageId="create_story_page" - componentId="*" + community={community} + pageId={pageId} onClick={() => onCreateStory(file, imageMode, {}, hyperLink[0]?.data?.url ? hyperLink : []) } - avatar={community.avatarFileUrl} /> </div> </div> - </> + </div> + ); +}; + +export const AmityDraftStoryPage = (props: AmityDraftStoryPageProps) => { + const { page } = useNavigation(); + const { AmityDraftStoryPageBehavior } = usePageBehavior(); + + return ( + <PlainDraftStoryPage + {...props} + onDiscardCreateStory={() => AmityDraftStoryPageBehavior.onCloseAction()} + goToCommunityPage={(communityId) => AmityDraftStoryPageBehavior.onCloseAction()} + goToGlobalFeedPage={() => AmityDraftStoryPageBehavior.onCloseAction()} + storyType={page.type === 'communityFeed' ? 'communityFeed' : 'globalFeed'} + /> ); }; diff --git a/src/v4/social/pages/PostDetailPage/PostDetailPage.module.css b/src/v4/social/pages/PostDetailPage/PostDetailPage.module.css new file mode 100644 index 000000000..8d0815c06 --- /dev/null +++ b/src/v4/social/pages/PostDetailPage/PostDetailPage.module.css @@ -0,0 +1,105 @@ +.postDetailPage { + display: flex; + flex-direction: column; + position: relative; + height: 100%; + background-color: var(--asc-color-base-background); +} + +.postDetailPage__container { + overflow-y: scroll; + scrollbar-width: none; + -ms-overflow-style: none; +} + +.postDetailPage__container::-webkit-scrollbar { + display: none; +} + +.postDetailPage__topBar { + display: grid; + grid-template-columns: min-content 1fr min-content; + padding-inline: 0.75rem 1rem; + height: 3.625rem; + align-items: center; + gap: 0.5rem; + position: absolute; + left: 0; + right: 0; + top: 0; + background-color: var(--asc-color-base-background); +} + +.postDetailPage__topBar__title { + text-align: center; +} + +.postDetailPage__topBar__menuBar { + cursor: pointer; +} + +.postDetailPage__postContent { + padding: 0.5rem 1rem; +} + +.postDetailPage__backIcon { + fill: var(--asc-color-base-default); + cursor: pointer; +} + +.postDetailPage__comments__divider { + height: 0.0625rem; + width: 100%; + background-color: var(--asc-color-base-shade4); + animation: skeleton-pulse 1.5s ease-in-out infinite; +} + +.postDetailPage__comments__divider[data-is-loading='true'] { + height: 0.5rem; + width: 100%; + background-color: var(--asc-color-base-shade4); +} + +.postDetailPage__reactions_and_comments { + display: flex; + justify-content: space-between; + padding: 0.5rem 1rem; +} + +.postDetailPage__reactionsBar { + display: flex; + justify-content: center; + align-items: center; + gap: 0.25rem; +} + +.postDetailPage__commentsCount { + color: var(--asc-color-base-shade2); +} + +.postDetailPage__comments { + display: flex; + flex-direction: column; + gap: 1rem; + padding: 0.75rem 1rem; +} + +.postDetailPage__commentComposeBar { + display: flex; + gap: 0.5rem; + padding: 0.5rem 1rem; +} + +@keyframes skeleton-pulse { + 0% { + opacity: 0.6; + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 0.6; + } +} diff --git a/src/v4/social/pages/PostDetailPage/PostDetailPage.stories.tsx b/src/v4/social/pages/PostDetailPage/PostDetailPage.stories.tsx new file mode 100644 index 000000000..a567b3954 --- /dev/null +++ b/src/v4/social/pages/PostDetailPage/PostDetailPage.stories.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import useOnePostWithCommentAndReactions from '~/mock/useOnePostWithCommentsAndReactions'; +import { PostDetailPage } from './PostDetailPage'; + +export default { + title: 'v4-social/pages/PostDetailPage', +}; + +export const PostDetailPageStories = { + render: () => { + const [post, isLoading] = useOnePostWithCommentAndReactions(); + + if (isLoading && !post) return null; + + return <PostDetailPage id={post?.postId} />; + }, +}; diff --git a/src/v4/social/pages/PostDetailPage/PostDetailPage.tsx b/src/v4/social/pages/PostDetailPage/PostDetailPage.tsx new file mode 100644 index 000000000..c15c9a65a --- /dev/null +++ b/src/v4/social/pages/PostDetailPage/PostDetailPage.tsx @@ -0,0 +1,117 @@ +import React, { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { CommentRepository } from '@amityco/ts-sdk'; + +import { Typography } from '~/v4/core/components'; +import { PostContent, PostContentSkeleton } from '~/v4/social/components/PostContent'; +import { MenuButton } from '~/v4/social/elements/MenuButton'; +import { PostMenu } from '~/v4/social/internal-components/PostMenu/PostMenu'; +import usePost from '~/v4/core/hooks/objects/usePost'; + +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; +import { BackButton } from '~/v4/social/elements/BackButton'; +import { useAmityPage } from '~/v4/core/hooks/uikit'; +import CommentList from '~/v4/social/internal-components/CommentList/CommentList'; +import CommentComposeBar from '~/v4/social/internal-components/CommentComposeBar/CommentComposeBar'; +import { Mentionees, Metadata } from '~/v4/helpers/utils'; +import styles from './PostDetailPage.module.css'; +import { useDrawer } from '~/v4/core/providers/DrawerProvider'; + +interface PostDetailPageProps { + id: string; +} + +export function PostDetailPage({ id }: PostDetailPageProps) { + const pageId = 'post_detail_page'; + const { post, isLoading: isPostLoading, error } = usePost(id); + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityPage({ + pageId, + }); + const { onBack } = useNavigation(); + const [replyComment, setReplyComment] = useState<Amity.Comment | null>(null); + + const { setDrawerData, removeDrawerData } = useDrawer(); + + const { mutateAsync } = useMutation({ + mutationFn: async ({ + text, + mentionees, + metadata, + }: { + text: string; + mentionees: Mentionees; + metadata: Metadata; + }) => { + const referenceId = replyComment ? replyComment.referenceId : post?.postId; + const referenceType = replyComment ? replyComment.referenceType : 'post'; + const parentId = replyComment ? replyComment.commentId : undefined; + + await CommentRepository.createComment({ + referenceId, + referenceType, + data: { + text: text, + }, + parentId, + metadata, + mentionees: mentionees as Amity.UserMention[], + }); + }, + }); + + return ( + <div className={styles.postDetailPage} style={themeStyles}> + <div className={styles.postDetailPage__container}> + <div className={styles.postDetailPage__postContent}> + {isPostLoading ? ( + <PostContentSkeleton pageId={pageId} /> + ) : post ? ( + <PostContent pageId={pageId} post={post} type="detail" /> + ) : null} + </div> + <div className={styles.postDetailPage__comments__divider} data-is-loading={isPostLoading} /> + <div className={styles.postDetailPage__comments}> + <CommentList + referenceId={post?.postId} + referenceType={'post'} + onClickReply={(comment) => setReplyComment(comment)} + /> + </div> + </div> + <div className={styles.postDetailPage__topBar}> + <BackButton + pageId={pageId} + defaultClassName={styles.postDetailPage__backIcon} + onClick={() => onBack()} + /> + <Typography.Title className={styles.postDetailPage__topBar__title}>Post</Typography.Title> + <div className={styles.postDetailPage__topBar__menuBar}> + <MenuButton + pageId={pageId} + onClick={() => + setDrawerData({ + content: ( + <PostMenu post={post} onCloseMenu={() => removeDrawerData()} pageId={pageId} /> + ), + }) + } + /> + </div> + </div> + <div className={styles.postDetailPage__commentComposeBar}> + <CommentComposeBar + targetId={post?.postId} + targetType={'post'} + userToReply={replyComment?.creator?.displayName || undefined} + isReplying={!!replyComment} + onSubmit={async (text, mentionees, metadata) => { + await mutateAsync({ text, mentionees, metadata }); + setReplyComment(null); + }} + onCancelReply={() => setReplyComment(null)} + /> + </div> + </div> + ); +} diff --git a/src/v4/social/pages/PostDetailPage/index.tsx b/src/v4/social/pages/PostDetailPage/index.tsx new file mode 100644 index 000000000..ab8b9f0d8 --- /dev/null +++ b/src/v4/social/pages/PostDetailPage/index.tsx @@ -0,0 +1 @@ +export { PostDetailPage } from './PostDetailPage'; diff --git a/src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.module.css b/src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.module.css new file mode 100644 index 000000000..a57d1b193 --- /dev/null +++ b/src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.module.css @@ -0,0 +1,48 @@ +.selectPostTargetPage { + max-width: 100vw; + height: 100vh; + padding: var(--asc-spacing-none) var(--asc-spacing-m1); + background-color: var(--asc-color-base-background); +} + +.selectPostTargetPage__topBar { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--asc-spacing-m1) var(--asc-spacing-none); +} + +.selectPostTargetPage__timeline { + display: flex; + align-items: center; + padding: var(--asc-spacing-s1) var(--asc-spacing-none); +} + +.selectPostTargetPage__line { + margin-top: var(--asc-spacing-s1); + border-top: 1px solid var(--asc-color-base-shade4); +} + +.selectPostTargetPage__myCommunities { + display: flex; + text-align: left; + color: var(--asc-color-base-default); + padding: var(--asc-spacing-m1) var(--asc-spacing-none) var(--asc-spacing-s1); + font-size: 0.9375rem; + line-height: var(--asc-line-height-md); + letter-spacing: -0.015rem; + opacity: 0.4; +} + +.selectPostTargetPage__communityAvatar { + margin-right: var(--asc-spacing-s1); +} + +.selectPostTargetPage__closeButton { + display: flex; + fill: var(--asc-color-base-default); +} + +.selectPostTargetPage__title { + color: var(--asc-color-base-default); +} diff --git a/src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.tsx b/src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.tsx new file mode 100644 index 000000000..7cae309e0 --- /dev/null +++ b/src/v4/social/pages/SelectPostTargetPage/SelectPostTargetPage.tsx @@ -0,0 +1,86 @@ +import React, { useRef } from 'react'; +import styles from './SelectPostTargetPage.module.css'; +import { useAmityPage } from '~/v4/core/hooks/uikit'; +import { CloseButton } from '~/v4/social/elements/CloseButton/CloseButton'; +import { Title } from '~/v4/social/elements/Title/Title'; +import { MyTimelineAvatar } from '~/v4/social/elements/MyTimelineAvatar'; +import { MyTimelineText } from '~/v4/social/elements/MyTimelineText'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; +import { CommunityOfficialBadge } from '~/v4/social/elements/CommunityOfficialBadge'; +import useCommunitiesCollection from '~/v4/social/hooks/collections/useCommunitiesCollection'; +import { CommunityPrivateBadge } from '~/v4/social/elements/CommunityPrivateBadge'; +import { CommunityDisplayName } from '~/v4/social/elements/CommunityDisplayName'; +import { CommunityAvatar } from '~/v4/social/elements/CommunityAvatar'; +import useIntersectionObserver from '~/v4/core/hooks/useIntersectionObserver'; +import useUser from '~/v4/core/hooks/objects/useUser'; + +export function SelectPostTargetPage() { + const pageId = 'select_post_target_page'; + const { themeStyles } = useAmityPage({ + pageId, + }); + const { onBack } = useNavigation(); + const { communities, hasMore, loadMore, isLoading } = useCommunitiesCollection({ + sortBy: 'displayName', + limit: 20, + }); + const intersectionRef = useRef<HTMLDivElement>(null); + const { user } = useUser(); + + useIntersectionObserver({ + onIntersect: () => { + if (hasMore && isLoading === false) { + loadMore(); + } + }, + ref: intersectionRef, + }); + + const renderCommunity = communities.map((community) => { + return ( + <div + onClick={() => { + //TODO: Navigate to create post page + }} + key={community.communityId} + className={styles.selectPostTargetPage__timeline} + > + <div className={styles.selectPostTargetPage__communityAvatar}> + <CommunityAvatar pageId={pageId} community={community} /> + </div> + <CommunityDisplayName pageId={pageId} community={community} /> + <div> + {community.isOfficial && <CommunityOfficialBadge />} + {!community.isPublic && <CommunityPrivateBadge />} + </div> + </div> + ); + }); + + return ( + <div className={styles.selectPostTargetPage} style={themeStyles}> + <div className={styles.selectPostTargetPage__topBar}> + <CloseButton + imgClassName={styles.selectPostTargetPage__closeButton} + pageId={pageId} + onClick={onBack} + /> + <Title pageId={pageId} titleClassName={styles.selectPostTargetPage__title} /> + <div /> + </div> + <div + onClick={() => { + // TODO: Navigate to create post page + }} + className={styles.selectPostTargetPage__timeline} + > + <MyTimelineAvatar pageId={pageId} userId={user?.userId} /> + <MyTimelineText pageId={pageId} /> + </div> + <div className={styles.selectPostTargetPage__line} /> + <div className={styles.selectPostTargetPage__myCommunities}>My Communities</div> + {renderCommunity} + <div ref={intersectionRef} /> + </div> + ); +} diff --git a/src/v4/social/pages/SelectPostTargetPage/index.tsx b/src/v4/social/pages/SelectPostTargetPage/index.tsx new file mode 100644 index 000000000..f8931ab0b --- /dev/null +++ b/src/v4/social/pages/SelectPostTargetPage/index.tsx @@ -0,0 +1 @@ +export { SelectPostTargetPage } from './SelectPostTargetPage'; diff --git a/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.module.css b/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.module.css new file mode 100644 index 000000000..5a811d338 --- /dev/null +++ b/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.module.css @@ -0,0 +1,24 @@ +.socialGlobalSearchPage { + display: flex; + flex-direction: column; + gap: 0.5rem; + width: 100%; + padding: 1rem; + background-color: var(--asc-color-base-background); +} + +.socialGlobalSearchPage__tabs { + display: flex; + gap: 0.5rem; + width: 100%; + overflow-y: scroll; +} + +.socialGlobalSearchPage__postContents { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.5rem; + height: 100%; +} diff --git a/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.stories.tsx b/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.stories.tsx new file mode 100644 index 000000000..1e2cd4c74 --- /dev/null +++ b/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.stories.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { SocialGlobalSearchPage } from './SocialGlobalSearchPage'; + +export default { + title: 'v4-social/pages/SocialGlobalSearchPage', +}; + +export const SocialGlobalSearchPageStories = { + render: () => { + return <SocialGlobalSearchPage />; + }, +}; diff --git a/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.tsx b/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.tsx new file mode 100644 index 000000000..bf9e8bb74 --- /dev/null +++ b/src/v4/social/pages/SocialGlobalSearchPage/SocialGlobalSearchPage.tsx @@ -0,0 +1,100 @@ +import React, { useCallback, useState } from 'react'; +import styles from './SocialGlobalSearchPage.module.css'; + +import { TopSearchBar } from '~/v4/social/components/TopSearchBar'; +import { CommunitySearchResult } from '~/v4/social/components/CommunitySearchResult'; +import { TabsBar } from '~/v4/social/internal-components/TabsBar'; +import useCommunitiesCollection from '~/v4/core/hooks/collections/useCommunitiesCollection'; +import { useAmityPage } from '~/v4/core/hooks/uikit'; +import { UserSearchResult } from '../../components/UserSearchResult'; +import { useUserQueryByDisplayName } from '~/v4/core/hooks/collections/useUsersCollection'; + +enum AmityGlobalSearchType { + Community = 'community', + User = 'user', +} + +const useGlobalSearchViewModel = () => { + const [searchKeyword, setSearchKeyword] = useState<string>(''); + + const [searchType, setSearchType] = useState<AmityGlobalSearchType>( + AmityGlobalSearchType.Community, + ); + const communityCollection = useCommunitiesCollection( + { displayName: searchKeyword, limit: 20 }, + () => searchType === AmityGlobalSearchType.Community, + ); + const userCollection = useUserQueryByDisplayName({ displayName: searchKeyword, limit: 20 }); + + const search = useCallback((keyword: string) => { + setSearchKeyword(keyword); + }, []); + + return { + userCollection, + communityCollection, + searchType, + search, + setSearchType, + }; +}; + +export function SocialGlobalSearchPage() { + const pageId = 'social_global_search_page'; + const { accessibilityId, config, defaultConfig, isExcluded, uiReference, themeStyles } = + useAmityPage({ + pageId, + }); + + const [activeTab, setActiveTab] = useState('communities'); + + const { userCollection, communityCollection, searchType, search, setSearchType } = + useGlobalSearchViewModel(); + + const tabs = [ + { + value: 'communities', + label: 'Communities', + content: () => ( + <CommunitySearchResult + pageId={pageId} + communityCollection={communityCollection.communities} + isLoading={communityCollection.isLoading} + onLoadMore={() => { + if (communityCollection.hasMore && communityCollection.isLoading === false) { + communityCollection.loadMore(); + } + }} + /> + ), + }, + { + value: 'users', + label: 'Users', + content: () => ( + <UserSearchResult + pageId={pageId} + userCollection={userCollection.users} + isLoading={userCollection.isLoading} + onLoadMore={() => { + if (userCollection.hasMore && userCollection.isLoading === false) { + userCollection.loadMore(); + } + }} + /> + ), + }, + ]; + + return ( + <div className={styles.socialGlobalSearchPage} style={themeStyles}> + <TopSearchBar pageId={pageId} search={search} /> + <TabsBar + pageId={pageId} + tabs={tabs} + activeTab={activeTab} + onTabChange={(newTab) => setActiveTab(newTab)} + /> + </div> + ); +} diff --git a/src/v4/social/pages/SocialGlobalSearchPage/index.tsx b/src/v4/social/pages/SocialGlobalSearchPage/index.tsx new file mode 100644 index 000000000..828cd7b6e --- /dev/null +++ b/src/v4/social/pages/SocialGlobalSearchPage/index.tsx @@ -0,0 +1 @@ +export { SocialGlobalSearchPage } from './SocialGlobalSearchPage'; diff --git a/src/v4/social/pages/SocialHomePage/SocialHomePage.module.css b/src/v4/social/pages/SocialHomePage/SocialHomePage.module.css new file mode 100644 index 000000000..d4f63f76d --- /dev/null +++ b/src/v4/social/pages/SocialHomePage/SocialHomePage.module.css @@ -0,0 +1,38 @@ +.socialHomePage { + display: flex; + flex-direction: column; + height: 3.625rem; + width: 100%; + background-color: var(--asc-color-base-background); +} + +.socialHomePage__topBar { + width: 100%; + padding-left: 1rem; + padding-right: 1rem; + background-color: var(--asc-color-base-background); +} + +.socialHomePage__tabs { + display: inline-flex; + flex-wrap: nowrap; + gap: 0.5rem; + overflow-y: scroll; + width: 100%; + padding: 0.75rem 0; + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.socialHomePage__tabs::-webkit-scrollbar { + display: none; +} + +.socialHomePage__contents { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.5rem; + flex: 1; +} diff --git a/src/v4/social/pages/SocialHomePage/SocialHomePage.stories.tsx b/src/v4/social/pages/SocialHomePage/SocialHomePage.stories.tsx new file mode 100644 index 000000000..3cf2ef890 --- /dev/null +++ b/src/v4/social/pages/SocialHomePage/SocialHomePage.stories.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { SocialHomePage } from './SocialHomePage'; + +export default { + title: 'v4-social/pages/SocialHomePage', +}; + +export const SocialHomePageStories = { + render: () => { + return <SocialHomePage />; + }, +}; diff --git a/src/v4/social/pages/SocialHomePage/SocialHomePage.tsx b/src/v4/social/pages/SocialHomePage/SocialHomePage.tsx new file mode 100644 index 000000000..9db2cb64c --- /dev/null +++ b/src/v4/social/pages/SocialHomePage/SocialHomePage.tsx @@ -0,0 +1,89 @@ +import React, { useEffect, useRef, useState } from 'react'; +import styles from './SocialHomePage.module.css'; + +import { TopNavigation } from '~/v4/social/components/TopNavigation'; +import { MyCommunities } from '~/v4/social/components/MyCommunities'; +import { NewsfeedButton } from '~/v4/social/elements/NewsfeedButton'; +import { ExploreButton } from '~/v4/social/elements/ExploreButton'; +import { MyCommunitiesButton } from '~/v4/social/elements/MyCommunitiesButton'; +import { Newsfeed } from '~/v4/social/components/Newsfeed'; +import { useAmityPage } from '~/v4/core/hooks/uikit'; +// import { CreatePostMenu } from '~/v4/social/components/CreatePostMenu'; + +enum EnumTabNames { + Newsfeed = 'Newsfeed', + Explore = 'Explore', + MyCommunities = 'My communities', +} + +export function SocialHomePage() { + const pageId = 'social_home_page'; + const { themeStyles } = useAmityPage({ + pageId, + }); + + const [activeTab, setActiveTab] = useState(EnumTabNames.Newsfeed); + + // const [isShowCreatePostMenu, setIsShowCreatePostMenu] = useState(false); + // const createPostMenuRef = useRef<HTMLDivElement | null>(null); + // const createPostButtonRef = useRef<HTMLDivElement>(null); + + // const handleClickButton = (event: React.MouseEvent) => { + // event.stopPropagation(); + // setIsShowCreatePostMenu((prev) => !prev); + // }; + + // Hide code for current release + + // useEffect(() => { + // const handleClickOutside = (event: MouseEvent) => { + // if ( + // createPostMenuRef.current && + // !createPostMenuRef.current.contains(event.target as Node) && + // createPostButtonRef.current !== event.target + // ) { + // setIsShowCreatePostMenu(false); + // } + // }; + + // document.addEventListener('mousedown', handleClickOutside); + // return () => { + // document.removeEventListener('mousedown', handleClickOutside); + // }; + // }, []); + + return ( + <div className={styles.socialHomePage} style={themeStyles}> + <div className={styles.socialHomePage__topBar}> + <TopNavigation + pageId={pageId} + // onClickPostCreationButton={handleClickButton} + // createPostButtonRef={createPostButtonRef} + /> + {/* {isShowCreatePostMenu && ( + <div ref={createPostMenuRef}> + <CreatePostMenu pageId={pageId} /> + </div> + )} */} + <div className={styles.socialHomePage__tabs}> + <NewsfeedButton + pageId={pageId} + isActive={activeTab === EnumTabNames.Newsfeed} + onClick={() => setActiveTab(EnumTabNames.Newsfeed)} + /> + <ExploreButton pageId={pageId} isActive={activeTab === EnumTabNames.Explore} /> + <MyCommunitiesButton + pageId={pageId} + isActive={activeTab === EnumTabNames.MyCommunities} + onClick={() => setActiveTab(EnumTabNames.MyCommunities)} + /> + </div> + </div> + <div className={styles.socialHomePage__contents}> + {activeTab === EnumTabNames.Newsfeed && <Newsfeed pageId={pageId} />} + {activeTab === EnumTabNames.Explore && <div>Explore</div>} + {activeTab === EnumTabNames.MyCommunities && <MyCommunities pageId={pageId} />} + </div> + </div> + ); +} diff --git a/src/v4/social/pages/SocialHomePage/index.tsx b/src/v4/social/pages/SocialHomePage/index.tsx new file mode 100644 index 000000000..71c95f184 --- /dev/null +++ b/src/v4/social/pages/SocialHomePage/index.tsx @@ -0,0 +1 @@ +export { SocialHomePage } from './SocialHomePage'; diff --git a/src/v4/social/pages/StoryPage/CommunityFeedStory.tsx b/src/v4/social/pages/StoryPage/CommunityFeedStory.tsx index 2001ec515..b7cfe7a1b 100644 --- a/src/v4/social/pages/StoryPage/CommunityFeedStory.tsx +++ b/src/v4/social/pages/StoryPage/CommunityFeedStory.tsx @@ -1,46 +1,68 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import useStories from '~/social/hooks/useStories'; - import useSDK from '~/core/hooks/useSDK'; - -import { useMedia } from 'react-use'; import { useIntl } from 'react-intl'; - import { FinalColor } from 'extract-colors/lib/types/Color'; import { StoryRepository } from '@amityco/ts-sdk'; -import { CreateStoryButton } from '../../elements'; +import { CreateNewStoryButton } from '~/v4/social/elements/CreateNewStoryButton'; import { Trash2Icon } from '~/icons'; import { isNonNullable } from '~/v4/helpers/utils'; import { extractColors } from 'extract-colors'; -import { useNavigation } from '~/social/providers/NavigationProvider'; - -import { - HiddenInput, - StoryArrowLeftButton, - StoryArrowRightButton, - StoryWrapper, - ViewStoryContainer, - ViewStoryContent, - ViewStoryOverlay, -} from '../../internal-components/StoryViewer/styles'; import Stories from 'react-insta-stories'; -import { renderers } from '../../internal-components/StoryViewer/Renderers'; -import { AmityDraftStoryPage } from '..'; +import { renderers } from '~/v4/social/internal-components/StoryViewer/Renderers'; import { checkStoryPermission } from '~/utils'; -import { useStoryContext } from '../../providers/StoryProvider'; +import { useStoryContext } from '~/v4/social/providers/StoryProvider'; import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; import { useNotifications } from '~/v4/core/providers/NotificationProvider'; +import { + RendererObject, + CustomRendererProps, +} from '~/v4/social/internal-components/StoryViewer/Renderers/types'; + +import clsx from 'clsx'; +import { ArrowLeftButton } from '~/v4/social/elements/ArrowLeftButton'; +import { ArrowRightButton } from '~/v4/social/elements/ArrowRightButton'; + +import styles from './StoryPage.module.css'; +import { useAmityPage } from '~/v4/core/hooks/uikit'; +import { FileTrigger } from 'react-aria-components'; interface CommunityFeedStoryProps { + pageId?: string; communityId: string; + onBack: () => void; + onClose: (communityId: string) => void; + onSwipeDown: (communityId: string) => void; + onClickCommunity: (communityId: string) => void; + goToDraftStoryPage: ({ + targetId, + targetType, + mediaType, + storyType, + }: { + targetId: string; + targetType: string; + mediaType: any; + storyType: 'communityFeed' | 'globalFeed'; + }) => void; } const DURATION = 5000; -export const CommunityFeedStory = ({ communityId }: CommunityFeedStoryProps) => { - const { onBack } = useNavigation(); +export const CommunityFeedStory = ({ + pageId = '*', + communityId, + onBack, + onClose, + onSwipeDown, + onClickCommunity, + goToDraftStoryPage, +}: CommunityFeedStoryProps) => { + const { accessibilityId } = useAmityPage({ + pageId, + }); const { confirm } = useConfirmContext(); const notification = useNotifications(); @@ -53,28 +75,30 @@ export const CommunityFeedStory = ({ communityId }: CommunityFeedStoryProps) => }, }); - const fileInputRef = useRef<HTMLInputElement>(null); - - const handleAddIconClick = (e: React.MouseEvent) => { - e.stopPropagation(); - e.preventDefault(); + const communityFeedRenderers = useMemo( + () => + renderers.map(({ renderer, tester }) => { + const newRenderer = (props: CustomRendererProps) => + renderer({ + ...props, + onClose: () => onClose(communityId), + onSwipeDown: () => onSwipeDown(communityId), + onClickCommunity: () => onClickCommunity(communityId), + }); - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; + return { + renderer: newRenderer, + tester, + }; + }), + [renderers, onClose, onSwipeDown, onClickCommunity, communityId], + ); - const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { - const selectedFile = event.target.files?.[0]; - if (selectedFile) { - onChange(selectedFile as File); - } - }; + const fileInputRef = useRef<HTMLInputElement>(null); const { client, currentUserId } = useSDK(); const { formatMessage } = useIntl(); - const isMobile = useMedia('(max-width: 768px)'); const [currentIndex, setCurrentIndex] = useState(0); const { file, setFile } = useStoryContext(); @@ -84,107 +108,163 @@ export const CommunityFeedStory = ({ communityId }: CommunityFeedStoryProps) => const isModerator = checkStoryPermission(client, communityId); const confirmDeleteStory = (storyId: string) => { - const isLastStory = currentIndex === 0; confirm({ + pageId, title: formatMessage({ id: 'storyViewer.action.confirmModal.title' }), content: formatMessage({ id: 'storyViewer.action.confirmModal.content' }), okText: formatMessage({ id: 'delete' }), onOk: async () => { - previousStory(); - if (isLastStory) onBack(); await StoryRepository.softDeleteStory(storyId); notification.success({ content: formatMessage({ id: 'storyViewer.notification.deleted' }), }); + if (stories.length === 1) onClose(communityId); }, }); }; - const onChange = (file: File) => { - setFile(file); - }; - const deleteStory = async (storyId: string) => { confirmDeleteStory(storyId); }; - const onCreateStory = async ( - file: File, - imageMode: 'fit' | 'fill', - metadata?: Amity.Metadata, - items?: Amity.StoryItem[], - ) => { - try { - const formData = new FormData(); - formData.append('files', file); - setFile(null); - if (file?.type.includes('image')) { - const { data: imageData } = await StoryRepository.createImageStory( - 'community', - communityId, - formData, - metadata, - imageMode, - items, - ); - if (imageData) { - notification.success({ - content: formatMessage({ id: 'storyViewer.notification.success' }), - }); - } - } else { - const { data: videoData } = await StoryRepository.createVideoStory( - 'community', - communityId, - formData, - metadata, - items, - ); - if (videoData) { - notification.success({ - content: formatMessage({ id: 'storyViewer.notification.success' }), - }); + const onCreateStory = useCallback( + async ( + file: File, + imageMode: 'fit' | 'fill', + metadata?: Amity.Metadata, + items?: Amity.StoryItem[], + ) => { + try { + const formData = new FormData(); + formData.append('files', file); + setFile(null); + if (file?.type.includes('image') && currentUserId) { + const { data: imageData } = await StoryRepository.createImageStory( + 'user', + currentUserId, + formData, + metadata, + imageMode, + items, + ); + if (imageData) { + notification.success({ + content: formatMessage({ id: 'storyViewer.notification.success' }), + }); + } + } else { + if (currentUserId) { + const { data: videoData } = await StoryRepository.createVideoStory( + 'user', + currentUserId, + formData, + metadata, + items, + ); + if (videoData) { + notification.success({ + content: formatMessage({ id: 'storyViewer.notification.success' }), + }); + } + } } + } catch (error) { + notification.error({ + content: formatMessage({ id: 'storyViewer.notification.error' }), + }); } - } catch (error) { - notification.error({ - content: formatMessage({ id: 'storyViewer.notification.error' }), - }); - } - }; + }, + [currentUserId, formatMessage, notification, setFile], + ); const discardStory = () => { setFile(null); }; + const addStoryButton = useMemo( + () => ( + <FileTrigger + ref={fileInputRef} + onSelect={(e) => { + const files = Array.from(e as FileList); + setFile(files[0]); + }} + > + <CreateNewStoryButton pageId={pageId} /> + </FileTrigger> + ), + [pageId, setFile], + ); - const addStoryButton = ( - <CreateStoryButton pageId="story_page" componentId="*" onClick={handleAddIconClick} /> + const storyStyles = useMemo( + () => ({ + width: '100%', + height: '100%', + objectFit: + stories[currentIndex]?.dataType === 'image' && + stories[currentIndex]?.data?.imageDisplayMode === 'fill' + ? 'cover' + : 'contain', + background: `linear-gradient( + 180deg, + ${colors?.length > 0 ? colors[0].hex : '#000'} 0%, + ${colors?.length > 0 ? colors[colors?.length - 1].hex : '#000'} 100% + )`, + }), + [stories, currentIndex, colors], ); - const formattedStories = stories?.map((story) => { - const isImage = story?.dataType === 'image'; - const url = isImage ? story?.imageData?.fileUrl : story?.videoData?.videoUrl?.['720p']; - - return { - ...story, - url, - type: isImage ? 'image' : 'video', - actions: [ - isStoryCreator || isModerator - ? { - name: 'delete', - action: () => deleteStory(story?.storyId as string), - icon: <Trash2Icon />, - } - : null, - ].filter(isNonNullable), - handleAddIconClick, + const increaseIndex = () => { + setCurrentIndex((prevIndex) => prevIndex + 1); + }; + + const formattedStories = useMemo( + () => + stories?.map((story) => { + const isImage = story?.dataType === 'image'; + const url = isImage ? story?.imageData?.fileUrl : story?.videoData?.videoUrl?.['720p']; + + return { + ...story, + url, + type: isImage ? 'image' : 'video', + actions: [ + isStoryCreator || isModerator + ? { + name: 'delete', + action: () => deleteStory(story?.storyId as string), + icon: ( + <Trash2Icon + fill={getComputedStyle(document.documentElement).getPropertyValue( + '--asc-color-base-default', + )} + /> + ), + } + : null, + ].filter(isNonNullable), + onCreateStory, + discardStory, + addStoryButton, + fileInputRef, + storyStyles, + currentIndex, + storiesCount: stories?.length, + increaseIndex, + pageId, + }; + }), + [ + stories, + deleteStory, onCreateStory, discardStory, addStoryButton, fileInputRef, - }; - }); + storyStyles, + currentIndex, + increaseIndex, + ], + ); const nextStory = () => { if (currentIndex === stories.length - 1) { @@ -201,27 +281,6 @@ export const CommunityFeedStory = ({ communityId }: CommunityFeedStoryProps) => const targetRootId = 'asc-uikit-stories-viewer'; - const storyStyles = { - width: '100%', - height: '100%', - objectFit: - stories[currentIndex]?.dataType === 'image' && - stories[currentIndex]?.data?.imageDisplayMode === 'fill' - ? 'cover' - : 'contain', - background: `linear-gradient( - 180deg, - ${colors?.length > 0 ? colors[0].hex : '#000'} 0%, - ${colors?.length > 0 ? colors[colors?.length - 1].hex : '#000'} 100% - )`, - }; - - const increaseIndex = () => { - setCurrentIndex(currentIndex + 1); - }; - - console.log(currentIndex); - useEffect(() => { if (stories[stories.length - 1]?.syncState === 'syncing') { setCurrentIndex(stories.length - 1); @@ -232,6 +291,16 @@ export const CommunityFeedStory = ({ communityId }: CommunityFeedStoryProps) => }, [currentIndex, stories]); useEffect(() => { + if (stories.every((story) => story?.isSeen)) return; + const firstUnseenStoryIndex = stories.findIndex((story) => !story?.isSeen); + + if (firstUnseenStoryIndex !== -1) { + setCurrentIndex(firstUnseenStoryIndex); + } + }, [stories]); + + useEffect(() => { + if (!stories) return; const extractColorsFromImage = async (url: string) => { const colorsFromImage = await extractColors(url, { crossOrigin: 'anonymous', @@ -245,61 +314,48 @@ export const CommunityFeedStory = ({ communityId }: CommunityFeedStoryProps) => } else { setColors([]); } - }, [stories, file, currentIndex]); + }, [stories, currentIndex]); if (file) { - return ( - <AmityDraftStoryPage - mediaType={ - file.type.includes('image') - ? { type: 'image', url: URL.createObjectURL(file) } - : { type: 'video', url: URL.createObjectURL(file) } - } - targetId={communityId} - targetType="community" - /> - ); + goToDraftStoryPage({ + targetId: communityId, + targetType: 'community', + mediaType: file.type.includes('image') + ? { type: 'image', url: URL.createObjectURL(file) } + : { type: 'video', url: URL.createObjectURL(file) }, + storyType: 'communityFeed', + }); } return ( - <StoryWrapper data-qa-anchor="story_page"> - {!isMobile && ( - <StoryArrowLeftButton data-qa-anchor="arrow_left_button" onClick={previousStory} /> - )} - <ViewStoryContainer id={targetRootId}> - <HiddenInput - ref={fileInputRef} - type="file" - accept="image/*,video/*" - onChange={handleFileChange} - /> - <ViewStoryContent> - <ViewStoryOverlay /> + <div className={clsx(styles.storyWrapper)} data-qa-anchor={accessibilityId}> + <ArrowLeftButton onClick={previousStory} /> + <div id={targetRootId} className={clsx(styles.viewStoryContainer)}> + <div className={clsx(styles.viewStoryContent)}> + <div className={clsx(styles.overlayLeft)} onClick={previousStory} /> + <div className={clsx(styles.overlayRight)} onClick={nextStory} /> + <div className={clsx(styles.viewStoryOverlay)} /> {formattedStories?.length > 0 ? ( // NOTE: Do not use isPaused prop, it will cause the first video story skipped <Stories - width="100%" - height="100%" - storyStyles={storyStyles} - preventDefault={!isMobile} + progressWrapperStyles={{ + display: 'none', + }} + preventDefault currentIndex={currentIndex} stories={formattedStories} - // TO FIX: need to override custom type of renderers from react-insta-stories library - // @ts-ignore - renderers={renderers} + renderers={communityFeedRenderers as RendererObject[]} defaultInterval={DURATION} onStoryStart={() => stories[currentIndex]?.analytics.markAsSeen()} onStoryEnd={increaseIndex} onNext={nextStory} onPrevious={previousStory} - onAllStoriesEnd={onBack} + onAllStoriesEnd={nextStory} /> ) : null} - </ViewStoryContent> - </ViewStoryContainer> - {!isMobile && ( - <StoryArrowRightButton data-qa-anchor="arrow_right_button" onClick={nextStory} /> - )} - </StoryWrapper> + </div> + </div> + <ArrowRightButton onClick={nextStory} /> + </div> ); }; diff --git a/src/v4/social/pages/StoryPage/GlobalFeedStory.tsx b/src/v4/social/pages/StoryPage/GlobalFeedStory.tsx index 4404ef090..5f55a4a11 100644 --- a/src/v4/social/pages/StoryPage/GlobalFeedStory.tsx +++ b/src/v4/social/pages/StoryPage/GlobalFeedStory.tsx @@ -1,263 +1,307 @@ -import React, { useEffect, useRef, useState } from 'react'; -import useStories from '~/social/hooks/useStories'; -import useSDK from '~/core/hooks/useSDK'; -import { useMedia } from 'react-use'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useIntl } from 'react-intl'; import { FinalColor } from 'extract-colors/lib/types/Color'; import { StoryRepository } from '@amityco/ts-sdk'; -import { CreateStoryButton } from '../../elements'; -import { Trash2Icon } from '~/icons'; import { isNonNullable } from '~/v4/helpers/utils'; import { extractColors } from 'extract-colors'; -import { useNavigation } from '~/social/providers/NavigationProvider'; -import { - HiddenInput, - StoryArrowLeftButton, - StoryArrowRightButton, - StoryWrapper, - ViewStoryContainer, - ViewStoryContent, - ViewStoryOverlay, -} from '../../internal-components/StoryViewer/styles'; import Stories from 'react-insta-stories'; -import { renderers } from '../../internal-components/StoryViewer/Renderers'; -import { AmityDraftStoryPage } from '..'; +import { renderers } from '~/v4/social/internal-components/StoryViewer/Renderers'; import { checkStoryPermission } from '~/utils'; -import { useStoryContext } from '../../providers/StoryProvider'; +import { useStoryContext } from '~/v4/social/providers/StoryProvider'; import { useConfirmContext } from '~/v4/core/providers/ConfirmProvider'; import { useNotifications } from '~/v4/core/providers/NotificationProvider'; -import { PageTypes } from '~/social/constants'; +import { useGetActiveStoriesByTarget } from '~/v4/social/hooks/useGetActiveStories'; +import { ArrowLeftButton } from '~/v4/social/elements/ArrowLeftButton/ArrowLeftButton'; +import clsx from 'clsx'; +import { ArrowRightButton } from '~/v4/social/elements/ArrowRightButton/ArrowRightButton'; +import useSDK from '~/v4/core/hooks/useSDK'; +import { + CustomRendererProps, + RendererObject, +} from '~/v4/social/internal-components/StoryViewer/Renderers/types'; +import { TrashIcon } from '~/v4/social/icons'; +import { CreateNewStoryButton } from '~/v4/social/elements/CreateNewStoryButton'; + +import styles from './StoryPage.module.css'; +import { useAmityPage } from '~/v4/core/hooks/uikit/index'; +import { FileTrigger } from 'react-aria-components'; const DURATION = 5000; interface GlobalFeedStoryProps { + pageId?: string; targetId: string; + targetIds: string[]; + onChangePage?: () => void; + onClickStory: (targetId: string) => void; + goToDraftStoryPage: (data: { + mediaType: { type: 'image' | 'video'; url: string }; + targetId: string; + targetType: string; + storyType: 'globalFeed'; + }) => void; + onClose: (targetId: string) => void; + onSwipeDown: (targetId: string) => void; + onClickCommunity: (targetId: string) => void; } -export const GlobalFeedStory: React.FC<GlobalFeedStoryProps> = () => { - const { page } = useNavigation(); - const { onClickStory, onChangePage } = useNavigation(); +export const GlobalFeedStory: React.FC<GlobalFeedStoryProps> = ({ + pageId = '*', + targetId, + targetIds, + onChangePage, + onClickStory, + goToDraftStoryPage, + onClose, + onSwipeDown, + onClickCommunity, +}) => { + const { accessibilityId } = useAmityPage({ pageId }); const { confirm } = useConfirmContext(); const notification = useNotifications(); + const { formatMessage } = useIntl(); + const { client, currentUserId } = useSDK(); + const { file, setFile } = useStoryContext(); + + const [currentIndex, setCurrentIndex] = useState(0); + const [colors, setColors] = useState<FinalColor[]>([]); + + const fileInputRef = useRef<HTMLInputElement>(null); - const { stories } = useStories({ + const { stories } = useGetActiveStoriesByTarget({ targetType: 'community', - targetId: - page.type === PageTypes.ViewStory && page.storyType === 'globalFeed' && page.targetId - ? page.targetId - : '', + targetId, options: { orderBy: 'asc', sortBy: 'createdAt', }, }); - const fileInputRef = useRef<HTMLInputElement>(null); - - const handleAddIconClick = (e: React.MouseEvent) => { - e.stopPropagation(); - e.preventDefault(); + const isStoryCreator = stories[currentIndex]?.creator?.userId === currentUserId; + const isModerator = checkStoryPermission(client, stories[currentIndex]?.targetId); - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; + const previousStory = () => { + if (currentIndex === 0) { + const currentTargetIndex = targetIds.indexOf(targetId); + const previousTargetIndex = currentTargetIndex - 1; - const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => { - const selectedFile = event.target.files?.[0]; - if (selectedFile) { - onChange(selectedFile as File); + if (previousTargetIndex >= 0) { + const previousTargetId = targetIds[previousTargetIndex]; + onClickStory(previousTargetId); + } else { + onChangePage?.(); + } + setCurrentIndex(0); + return; } + setCurrentIndex((prevIndex) => prevIndex - 1); }; - const { client, currentUserId } = useSDK(); - - const { formatMessage } = useIntl(); - const isMobile = useMedia('(max-width: 768px)'); - - const [currentIndex, setCurrentIndex] = useState(0); - const { file, setFile } = useStoryContext(); - const [colors, setColors] = useState<FinalColor[]>([]); - - const isStoryCreator = stories[currentIndex]?.creator?.userId === currentUserId; - const isModerator = checkStoryPermission(client, stories[currentIndex]?.targetId); - const confirmDeleteStory = (storyId: string) => { const isLastStory = currentIndex === 0; confirm({ + pageId, title: formatMessage({ id: 'storyViewer.action.confirmModal.title' }), content: formatMessage({ id: 'storyViewer.action.confirmModal.content' }), okText: formatMessage({ id: 'delete' }), onOk: async () => { previousStory(); - if (isLastStory) onChangePage(PageTypes.NewsFeed); + if (isLastStory) onChangePage?.(); await StoryRepository.softDeleteStory(storyId); notification.success({ content: formatMessage({ id: 'storyViewer.notification.deleted' }), }); + if (isLastStory && stories.length > 1) { + setCurrentIndex((prevIndex) => prevIndex - 1); + } else if (stories.length === 1) { + onChangePage?.(); + } }, }); }; - const onChange = (file: File) => { - setFile(file); - }; - - const deleteStory = async (storyId: string) => { + const deleteStory = (storyId: string) => { confirmDeleteStory(storyId); }; - const onCreateStory = async ( - file: File, - imageMode: 'fit' | 'fill', - metadata?: Amity.Metadata, - items?: Amity.StoryItem[], - ) => { - try { - const formData = new FormData(); - formData.append('files', file); - setFile(null); - if (file?.type.includes('image') && currentUserId) { - const { data: imageData } = await StoryRepository.createImageStory( - 'user', - currentUserId, - formData, - metadata, - imageMode, - items, - ); - if (imageData) { - notification.success({ - content: formatMessage({ id: 'storyViewer.notification.success' }), - }); - } - } else { - if (currentUserId) { - const { data: videoData } = await StoryRepository.createVideoStory( + const onCreateStory = useCallback( + async ( + file: File, + imageMode: 'fit' | 'fill', + metadata?: Amity.Metadata, + items?: Amity.StoryItem[], + ) => { + try { + const formData = new FormData(); + formData.append('files', file); + setFile(null); + if (file?.type.includes('image') && currentUserId) { + const { data: imageData } = await StoryRepository.createImageStory( 'user', currentUserId, formData, metadata, + imageMode, items, ); - if (videoData) { + if (imageData) { notification.success({ content: formatMessage({ id: 'storyViewer.notification.success' }), }); } + } else { + if (currentUserId) { + const { data: videoData } = await StoryRepository.createVideoStory( + 'user', + currentUserId, + formData, + metadata, + items, + ); + if (videoData) { + notification.success({ + content: formatMessage({ id: 'storyViewer.notification.success' }), + }); + } + } } + } catch (error) { + notification.error({ + content: formatMessage({ id: 'storyViewer.notification.error' }), + }); } - } catch (error) { - notification.error({ - content: formatMessage({ id: 'storyViewer.notification.error' }), - }); - } - }; + }, + [currentUserId, formatMessage, notification, setFile], + ); const discardStory = () => { setFile(null); }; - const addStoryButton = ( - <CreateStoryButton pageId="story_page" componentId="*" onClick={handleAddIconClick} /> + const addStoryButton = useMemo( + () => ( + <FileTrigger + ref={fileInputRef} + onSelect={(e) => { + const files = Array.from(e as FileList); + setFile(files[0]); + }} + > + <CreateNewStoryButton pageId={pageId} /> + </FileTrigger> + ), + [pageId, setFile], ); - const formattedStories = stories?.map((story) => { - const isImage = story?.dataType === 'image'; - const url = isImage ? story?.imageData?.fileUrl : story?.videoData?.videoUrl?.['720p']; - - return { - ...story, - url, - type: isImage ? 'image' : 'video', - actions: [ - isStoryCreator || isModerator - ? { - name: 'delete', - action: () => deleteStory(story?.storyId as string), - icon: ( - <Trash2Icon - fill={getComputedStyle(document.documentElement).getPropertyValue( - '--asc-color-base-default', - )} - /> - ), - } - : null, - ].filter(isNonNullable), - handleAddIconClick, + const storyStyles = useMemo( + () => ({ + width: '100%', + height: '100%', + objectFit: + stories[currentIndex]?.dataType === 'image' && + stories[currentIndex]?.data?.imageDisplayMode === 'fill' + ? 'cover' + : 'contain', + background: `linear-gradient( + 180deg, + ${colors?.length > 0 ? colors[0].hex : '#000'} 0%, + ${colors?.length > 0 ? colors[colors?.length - 1].hex : '#000'} 100% + )`, + }), + [stories, currentIndex, colors], + ); + + const increaseIndex = () => { + setCurrentIndex((prevIndex) => prevIndex + 1); + }; + + const formattedStories = useMemo( + () => + stories?.map((story) => { + const isImage = story?.dataType === 'image'; + const url = isImage ? story?.imageData?.fileUrl : story?.videoData?.videoUrl?.['720p']; + + return { + ...story, + url, + type: isImage ? 'image' : 'video', + actions: [ + isStoryCreator || isModerator + ? { + name: 'delete', + action: () => deleteStory(story?.storyId as string), + icon: ( + <TrashIcon + fill={getComputedStyle(document.documentElement).getPropertyValue( + '--asc-color-base-default', + )} + /> + ), + } + : null, + ].filter(isNonNullable), + onCreateStory, + discardStory, + addStoryButton, + fileInputRef, + storyStyles, + currentIndex, + storiesCount: stories?.length, + increaseIndex, + pageId, + }; + }), + [ + stories, + deleteStory, onCreateStory, discardStory, addStoryButton, fileInputRef, - }; - }); + storyStyles, + currentIndex, + increaseIndex, + ], + ); const nextStory = () => { - if ( - page.type === PageTypes.ViewStory && - page.targetIds && - page.targetId && - currentIndex === formattedStories?.length - 1 - ) { - const currentTargetIndex = page.targetIds.indexOf(page.targetId); + if (currentIndex === formattedStories?.length - 1) { + const currentTargetIndex = targetIds.indexOf(targetId); const nextTargetIndex = currentTargetIndex + 1; - if (nextTargetIndex < page.targetIds.length) { - const nextTargetId = page.targetIds[nextTargetIndex]; - onClickStory(nextTargetId, 'globalFeed', page.targetIds); + if (nextTargetIndex < targetIds.length) { + const nextTargetId = targetIds[nextTargetIndex]; + onClickStory(nextTargetId); } else { - onChangePage(PageTypes.NewsFeed); + onChangePage?.(); } setCurrentIndex(0); return; } - setCurrentIndex(currentIndex + 1); + setCurrentIndex((prevIndex) => prevIndex + 1); }; - const previousStory = () => { - if ( - page.type === PageTypes.ViewStory && - page.targetIds && - page.targetId && - currentIndex === 0 - ) { - const currentTargetIndex = page.targetIds.indexOf(page.targetId); - const previousTargetIndex = currentTargetIndex - 1; + const globalFeedRenderers = useMemo( + () => + renderers.map(({ renderer, tester }) => { + const newRenderer = (props: CustomRendererProps) => + renderer({ + ...props, + onClose: () => onClose(targetId), + onSwipeDown: () => onSwipeDown(targetId), + onClickCommunity: () => onClickCommunity(targetId), + }); - if (previousTargetIndex >= 0) { - const previousTargetId = page.targetIds[previousTargetIndex]; - onClickStory(previousTargetId, 'globalFeed', page.targetIds); - } else { - onChangePage(PageTypes.NewsFeed); - } - setCurrentIndex(0); - return; - } - setCurrentIndex(currentIndex - 1); - }; + return { + renderer: newRenderer, + tester, + }; + }), + [renderers, onClose, onSwipeDown, onClickCommunity, targetId], + ); const targetRootId = 'asc-uikit-stories-viewer'; - const storyStyles = { - width: '100%', - height: '100%', - objectFit: - stories[currentIndex]?.dataType === 'image' && - stories[currentIndex]?.data?.imageDisplayMode === 'fill' - ? 'cover' - : 'contain', - background: `linear-gradient( - 180deg, - ${colors?.length > 0 ? colors[0].hex : '#000'} 0%, - ${colors?.length > 0 ? colors[colors?.length - 1].hex : '#000'} 100% - )`, - }; - - const increaseIndex = () => { - setCurrentIndex(currentIndex + 1); - }; - useEffect(() => { if (stories[stories.length - 1]?.syncState === 'syncing') { setCurrentIndex(stories.length - 1); @@ -268,6 +312,16 @@ export const GlobalFeedStory: React.FC<GlobalFeedStoryProps> = () => { }, [currentIndex, stories]); useEffect(() => { + if (stories.every((story) => story?.isSeen)) return; + const firstUnseenStoryIndex = stories.findIndex((story) => !story?.isSeen); + + if (firstUnseenStoryIndex !== -1) { + setCurrentIndex(firstUnseenStoryIndex); + } + }, [stories]); + + useEffect(() => { + if (!stories) return; const extractColorsFromImage = async (url: string) => { const colorsFromImage = await extractColors(url, { crossOrigin: 'anonymous', @@ -276,53 +330,43 @@ export const GlobalFeedStory: React.FC<GlobalFeedStoryProps> = () => { setColors(colorsFromImage); }; - if (file?.type.includes('image') || stories[currentIndex]?.dataType === 'image') { - extractColorsFromImage((stories[currentIndex]?.imageData?.fileUrl as string) ?? file); + if (stories[currentIndex]?.dataType === 'image') { + extractColorsFromImage(stories[currentIndex]?.imageData?.fileUrl as string); } else { setColors([]); } - }, [stories, file, currentIndex]); - - if (file && page.type === PageTypes.ViewStory && page.storyType === 'globalFeed') { - return ( - <AmityDraftStoryPage - mediaType={ - file.type.includes('image') - ? { type: 'image', url: URL.createObjectURL(file) } - : { type: 'video', url: URL.createObjectURL(file) } - } - targetId={page.targetId} - targetType="community" - /> - ); + }, [stories, currentIndex]); + + if (file) { + goToDraftStoryPage({ + targetId, + targetType: 'community', + mediaType: file.type.includes('image') + ? { type: 'image', url: URL.createObjectURL(file) } + : { type: 'video', url: URL.createObjectURL(file) }, + storyType: 'globalFeed', + }); } return ( - <StoryWrapper data-qa-anchor="story_page"> - {!isMobile && ( - <StoryArrowLeftButton data-qa-anchor="arrow_left_button" onClick={previousStory} /> - )} - <ViewStoryContainer id={targetRootId}> - <HiddenInput - ref={fileInputRef} - type="file" - accept="image/*,video/*" - onChange={handleFileChange} - /> - <ViewStoryContent> - <ViewStoryOverlay /> + <div className={clsx(styles.storyWrapper)} data-qa-anchor={accessibilityId}> + <ArrowLeftButton onClick={previousStory} /> + <div id={targetRootId} className={clsx(styles.viewStoryContainer)}> + <div className={clsx(styles.viewStoryContent)}> + <div className={clsx(styles.overlayLeft)} onClick={previousStory} /> + <div className={clsx(styles.overlayRight)} onClick={nextStory} /> + <div className={clsx(styles.viewStoryOverlay)} /> {formattedStories?.length > 0 ? ( // NOTE: Do not use isPaused prop, it will cause the first video story skipped <Stories - width="100%" - height="100%" - storyStyles={storyStyles} - preventDefault={!isMobile} + // hide default progress bar + progressWrapperStyles={{ + display: 'none', + }} + preventDefault currentIndex={currentIndex} stories={formattedStories} - // TO FIX: need to override custom type of renderers from react-insta-stories library - // @ts-ignore - renderers={renderers} + renderers={globalFeedRenderers as RendererObject[]} defaultInterval={DURATION} onStoryStart={() => stories[currentIndex]?.analytics.markAsSeen()} onStoryEnd={increaseIndex} @@ -331,11 +375,9 @@ export const GlobalFeedStory: React.FC<GlobalFeedStoryProps> = () => { onAllStoriesEnd={nextStory} /> ) : null} - </ViewStoryContent> - </ViewStoryContainer> - {!isMobile && ( - <StoryArrowRightButton data-qa-anchor="arrow_right_button" onClick={nextStory} /> - )} - </StoryWrapper> + </div> + </div> + <ArrowRightButton onClick={nextStory} /> + </div> ); }; diff --git a/src/v4/social/pages/StoryPage/StoryPage.module.css b/src/v4/social/pages/StoryPage/StoryPage.module.css new file mode 100644 index 000000000..f412db33c --- /dev/null +++ b/src/v4/social/pages/StoryPage/StoryPage.module.css @@ -0,0 +1,58 @@ +.overlayLeft { + position: absolute; + top: 0; + left: 0; + width: 50%; + height: 100%; + z-index: 9999; +} + +.overlayRight { + position: absolute; + top: 0; + right: 0; + width: 50%; + height: 100%; + z-index: 9999; +} + +.viewStoryContent { + position: relative; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + z-index: 2; +} + +.viewStoryOverlay { + position: absolute; + width: 100%; + height: 100%; + background: linear-gradient(180deg, rgb(0 0 0 / 16%) 55.05%, rgb(255 255 255 / 0%) 96.52%); + z-index: 3; +} + +.hiddenInput { + display: none; +} + +.viewStoryContainer { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-width: 23.4375rem; + flex-shrink: 0; +} + +.storyWrapper { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + gap: 1rem; + overflow: hidden; +} diff --git a/src/v4/social/pages/StoryPage/ViewGlobalFeedStory.tsx b/src/v4/social/pages/StoryPage/ViewGlobalFeedStory.tsx new file mode 100644 index 000000000..989008154 --- /dev/null +++ b/src/v4/social/pages/StoryPage/ViewGlobalFeedStory.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { useGlobalStoryTargets } from '~/v4/social/hooks/collections/useGlobalStoryTargets'; +import { GlobalFeedStory } from '~/v4/social/pages/StoryPage/GlobalFeedStory'; +import { AmityStoryMediaType } from '~/v4/social/pages/DraftsPage/DraftsPage'; + +export const ViewGlobalFeedStoryPage = ({ + pageId = '*', + targetId, + onChangePage, + onClickStory, + goToDraftStoryPage, + onClose, + onSwipeDown, + onClickCommunity, +}: { + pageId?: string; + targetId: string; + onChangePage?: () => void; + onClickStory: (targetId: string) => void; + goToDraftStoryPage: ({ + targetId, + targetType, + mediaType, + storyType, + }: { + targetId: string; + targetType: string; + mediaType: AmityStoryMediaType; + storyType: 'globalFeed'; + }) => void; + onClose: (targetId: string) => void; + onSwipeDown: (targetId: string) => void; + onClickCommunity: (targetId: string) => void; +}) => { + const { stories } = useGlobalStoryTargets({ + seenState: 'smart' as Amity.StorySeenQuery, + limit: 10, + }); + + return ( + <GlobalFeedStory + pageId={pageId} + targetId={targetId} + targetIds={stories.map((s) => s.targetId)} + onChangePage={onChangePage} + onClickStory={onClickStory} + goToDraftStoryPage={goToDraftStoryPage} + onClose={onClose} + onSwipeDown={onSwipeDown} + onClickCommunity={onClickCommunity} + /> + ); +}; diff --git a/src/v4/social/pages/StoryPage/ViewStoryPage.tsx b/src/v4/social/pages/StoryPage/ViewStoryPage.tsx index 1551ac395..041f7a54e 100644 --- a/src/v4/social/pages/StoryPage/ViewStoryPage.tsx +++ b/src/v4/social/pages/StoryPage/ViewStoryPage.tsx @@ -1,24 +1,59 @@ import React from 'react'; -import { CommunityFeedStory } from './CommunityFeedStory'; -import { useNavigation } from '~/social/providers/NavigationProvider'; -import { PageTypes } from '~/social/constants'; -import { GlobalFeedStory } from './GlobalFeedStory'; +import { CommunityFeedStory } from '~/v4/social/pages/StoryPage/CommunityFeedStory'; +import { useNavigation } from '~/v4/core/providers/NavigationProvider'; +import { usePageBehavior } from '~/v4/core/providers/PageBehaviorProvider'; +import { ViewGlobalFeedStoryPage } from './ViewGlobalFeedStory'; +import { useAmityPage } from '~/v4/core/hooks/uikit/index'; -type AmityViewStoryPageType = 'communityFeed' | 'globalFeed'; +type ViewStoryPageType = 'communityFeed' | 'globalFeed'; interface AmityViewStoryPageProps { - type: AmityViewStoryPageType; + type: ViewStoryPageType; + targetId: string; } -const AmityViewStoryPage: React.FC<AmityViewStoryPageProps> = ({ type }) => { - const { page } = useNavigation(); +const ViewStoryPage: React.FC<AmityViewStoryPageProps> = ({ type, targetId }) => { + const pageId = 'story_page'; + const { AmityStoryViewPageBehavior } = usePageBehavior(); + const { onBack, goToViewStoryPage, goToDraftStoryPage, onClickCommunity } = useNavigation(); - if (page.type !== PageTypes.ViewStory || !page.targetId) return null; - - if (type === 'communityFeed') return <CommunityFeedStory communityId={page.targetId} />; - if (type === 'globalFeed') return <GlobalFeedStory targetId={page.targetId} />; + if (type === 'communityFeed') + return ( + <CommunityFeedStory + pageId={pageId} + communityId={targetId} + onBack={onBack} + onClose={(communityId) => onClickCommunity(communityId)} + onSwipeDown={(communityId) => onClickCommunity(communityId)} + onClickCommunity={(communityId) => onClickCommunity(communityId)} + goToDraftStoryPage={({ targetId, targetType, mediaType, storyType }) => + goToDraftStoryPage({ targetId, targetType, mediaType, storyType }) + } + /> + ); + if (type === 'globalFeed') + return ( + <ViewGlobalFeedStoryPage + pageId={pageId} + targetId={targetId} + onChangePage={() => AmityStoryViewPageBehavior.onCloseAction()} + onClose={() => AmityStoryViewPageBehavior.onCloseAction()} + onSwipeDown={() => AmityStoryViewPageBehavior.onCloseAction()} + onClickStory={(targetId) => + goToViewStoryPage({ + storyType: 'globalFeed', + targetId, + targetType: 'community', + }) + } + goToDraftStoryPage={({ targetId, targetType, mediaType, storyType }) => + goToDraftStoryPage({ targetId, targetType, mediaType, storyType }) + } + onClickCommunity={(targetId) => onClickCommunity(targetId)} + /> + ); return null; }; -export default AmityViewStoryPage; +export default ViewStoryPage; diff --git a/src/v4/social/pages/StoryPage/index.tsx b/src/v4/social/pages/StoryPage/index.tsx index a076468d9..52443d10f 100644 --- a/src/v4/social/pages/StoryPage/index.tsx +++ b/src/v4/social/pages/StoryPage/index.tsx @@ -1 +1 @@ -export { default as AmityViewStoryPage } from './ViewStoryPage'; +export { default as ViewStoryPage } from './ViewStoryPage'; diff --git a/src/v4/social/pages/index.ts b/src/v4/social/pages/index.ts index 4bc69f1a8..55c7a0ff8 100644 --- a/src/v4/social/pages/index.ts +++ b/src/v4/social/pages/index.ts @@ -1,2 +1,2 @@ export { AmityDraftStoryPage } from './DraftsPage'; -export { AmityViewStoryPage } from './StoryPage'; +export { ViewStoryPage } from './StoryPage'; diff --git a/src/v4/social/utils/index.ts b/src/v4/social/utils/index.ts new file mode 100644 index 000000000..0aadd9aa5 --- /dev/null +++ b/src/v4/social/utils/index.ts @@ -0,0 +1,212 @@ +// // TODO: refactor to align with SDK roles once available. + +import { isCommunityMember, isCommunityPost, isPostUnderReview } from '~/v4/helpers/utils'; +import { MemberRoles } from '~/v4/social/constants/memberRoles'; +import { Permissions } from '~/v4/social/constants/permissions'; + +const ADMIN = 'global-admin'; +const { COMMUNITY_MODERATOR, CHANNEL_MODERATOR, MODERATOR, SUPER_MODERATOR } = MemberRoles; + +export const isModerator = (userRoles?: string[]) => { + if (!userRoles?.length) { + return false; + } + + const roles: string[] = [COMMUNITY_MODERATOR, CHANNEL_MODERATOR, MODERATOR, SUPER_MODERATOR]; + + return userRoles.some((role) => roles.includes(role)); +}; + +export const isAdmin = (userRoles?: string[]) => { + if (!userRoles?.length) { + return false; + } + + return userRoles.includes(ADMIN); +}; + +/** + * + * @deprecated + */ +function isPostModerator({ + user, + communityUser, + post, +}: { + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; + post?: Amity.Post; +}) { + const hasModeratorPermissions = + isAdmin(user?.roles) || isModerator(user?.roles) || isModerator(communityUser?.roles); + + if (isCommunityPost(post)) { + return hasModeratorPermissions && isCommunityMember(communityUser); + } + + return hasModeratorPermissions; +} + +/** + * + * @deprecated + */ +export function canEditCommunity({ + user, + communityUser, +}: { + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; +}) { + return isAdmin(user?.roles) || isModerator(user?.roles) || isModerator(communityUser?.roles); +} + +/** + * + * @deprecated + */ +export function canReviewCommunityPosts(data: { + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; +}) { + return canEditCommunity(data); +} + +/** + * + * @deprecated + */ +export function canDeletePost({ + userId, + user, + communityUser, + post, + community, +}: { + userId?: string; + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; + post?: Amity.Post; + community?: Amity.Community; +}) { + const isPostModer = isPostModerator({ user, communityUser, post }); + const isMyPost = post?.postedUserId === userId; + + if (isCommunityPost(post)) { + const isUnderReview = isPostUnderReview(post, community); + const isMember = isCommunityMember(communityUser); + + return (!isUnderReview && isPostModer) || (isMyPost && isMember); + } + + return isPostModer || isMyPost; +} + +/** + * + * @deprecated + */ +export function canEditPost({ + userId, + user, + communityUser, + post, + community, + childrenPosts = [], +}: { + userId?: string; + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; + post?: Amity.Post; + community?: Amity.Community; + childrenPosts?: Amity.Post[]; +}) { + if ( + childrenPosts.find( + (childPost) => childPost.dataType === 'liveStream' || childPost.dataType === 'poll', + ) + ) { + return false; + } + + const isPostModer = isPostModerator({ user, communityUser, post }); + const isMyPost = post?.postedUserId === userId; + + if (isCommunityPost(post)) { + if (isPostUnderReview(post, community)) { + return false; + } + + return isPostModer || (isMyPost && isCommunityMember(communityUser)); + } + + return isPostModer || isMyPost; +} + +/** + * + * @deprecated + */ +export function canReportPost({ + userId, + user, + communityUser, + post, + community, +}: { + userId?: string; + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; + post?: Amity.Post; + community?: Amity.Community; +}) { + const isPostModer = isPostModerator({ user, communityUser, post }); + const isMyPost = post?.postedUserId === userId; + + if (isCommunityPost(post)) { + if (isPostUnderReview(post, community)) { + return false; + } + + return isMyPost === false && (isPostModer || isCommunityMember(communityUser)); + } + + return isMyPost === false; +} + +export const checkStoryPermission = ( + client: Amity.Client | null | undefined, + communityId?: string, +): boolean => { + if (!client) { + return false; + } + + if (communityId) { + const communityPermission = client + .hasPermission(Permissions.ManageStoryPermission) + .community(communityId); + return communityPermission; + } + + return false; +}; + +export function formatTimeAgo(dateString: string | Date | undefined) { + if (!dateString) return; + const givenDate = new Date(dateString); + const currentDate = new Date(); + + const timeDifferenceInSeconds = Math.floor((currentDate.getTime() - givenDate.getTime()) / 1000); + + if (timeDifferenceInSeconds < 60) { + return 'Just now'; + } else if (timeDifferenceInSeconds >= 60 && timeDifferenceInSeconds < 3600) { + const minutes = Math.floor(timeDifferenceInSeconds / 60); + return `${minutes}m`; + } else { + const hours = Math.floor(timeDifferenceInSeconds / 3600); + return `${hours}h`; + } +} diff --git a/src/v4/styles/global.css b/src/v4/styles/global.css index 579508fd3..a09bb11a1 100644 --- a/src/v4/styles/global.css +++ b/src/v4/styles/global.css @@ -1,6 +1,7 @@ @import url('../styles/typography.module.css'); +@import url('../../../node_modules/modern-normalize/modern-normalize.css'); -/* +/* The @supports rule is used to check if the browser supports the 'font-variation-settings' CSS property. If supported, it means the browser can handle variable fonts. In this case, if the browser supports 'font-variation-settings', we set the font-family to 'Inter var', which is the variable font version of Inter. @@ -18,32 +19,29 @@ */ :root { color-scheme: light dark; + /* Set the default font-family to 'Inter', with fallback to sans-serif. This ensures that the Inter font is used if available, otherwise, the browser's default sans-serif font will be used. */ - font-family: 'Inter', sans-serif; + font-family: Inter, sans-serif; /* color palette */ --asc-color-alert: #fa4d30; - --asc-color-black: #000000; - --asc-color-white: #ffffff; - + --asc-color-black: #000; + --asc-color-white: #fff; --asc-color-primary-default: #1054de; --asc-color-primary-shade1: #4a82f2; --asc-color-primary-shade2: #a0bdf8; --asc-color-primary-shade3: #d9e5fc; - --asc-color-primary-shade4: #ffffff; - - --asc-color-base-inverse: #000000; - + --asc-color-primary-shade4: #fff; + --asc-color-base-inverse: #000; --asc-color-base-default: #292b32; --asc-color-base-shade1: #636878; --asc-color-base-shade2: #898e9e; --asc-color-base-shade3: #a5a9b5; --asc-color-base-shade4: #ebecef; --asc-color-base-shade5: #f9f9fa; - --asc-color-secondary-default: #292b32; --asc-color-secondary-shade1: #636878; --asc-color-secondary-shade2: #898e9e; @@ -52,7 +50,7 @@ --asc-color-secondary-shade5: #f9f9fa; /* Font */ - --asc-text-global-font-family: Inter, -apple-system, BlinkMacSystemFont, Arial, sans-serif; + --asc-text-global-font-family: inter, -apple-system, blinkmacsystemfont, arial, sans-serif; --asc-text-global-font-style: normal; /* Font Sizes */ @@ -111,14 +109,63 @@ --asc-spacing-xl3: 6rem; /* 96px */ /* Box Shadow */ - --asc-box-shadow-01: 0px 0.5px 2px 0px rgba(96, 97, 112, 0.16), - 0px 0px 1px 0px rgba(40, 41, 61, 0.08); - --asc-box-shadow-02: 0px 0.5px 2px 0px rgba(96, 97, 112, 0.16), - 0px 0px 1px 0px rgba(40, 41, 61, 0.08); - --asc-box-shadow-03: 0px 2px 4px 0px rgba(96, 97, 112, 0.16), - 0px 0px 1px 0px rgba(40, 41, 61, 0.04); - --asc-box-shadow-04: 0px 4px 8px 0px rgba(96, 97, 112, 0.2), 0px 0px 2px 0px rgba(40, 41, 61, 0.1); - --asc-box-shadow-05: 0px 8px 16px 0px rgba(96, 97, 112, 0.16), - 0px 2px 4px 0px rgba(40, 41, 61, 0.04); + --asc-box-shadow-01: 0px 0.5px 2px 0px rgb(96 97 112 / 16%), 0px 0px 1px 0px rgb(40 41 61 / 8%); + --asc-box-shadow-02: 0px 0.5px 2px 0px rgb(96 97 112 / 16%), 0px 0px 1px 0px rgb(40 41 61 / 8%); + --asc-box-shadow-03: 0px 2px 4px 0px rgb(96 97 112 / 16%), 0px 0px 1px 0px rgb(40 41 61 / 4%); + --asc-box-shadow-04: 0px 4px 8px 0px rgb(96 97 112 / 20%), 0px 0px 2px 0px rgb(40 41 61 / 10%); + --asc-box-shadow-05: 0px 8px 16px 0px rgb(96 97 112 / 16%), 0px 2px 4px 0px rgb(40 41 61 / 4%); } +@media (prefers-color-scheme: light) { + :root { + --asc-color-alert: #fa4d30; + --asc-color-black: #000; + --asc-color-white: #fff; + --asc-color-primary-default: #1054de; + --asc-color-primary-shade1: #4a82f2; + --asc-color-primary-shade2: #a0bdf8; + --asc-color-primary-shade3: #d9e5fc; + --asc-color-primary-shade4: #fff; + --asc-color-base-inverse: #000; + --asc-color-base-default: #292b32; + --asc-color-base-shade1: #636878; + --asc-color-base-shade2: #898e9e; + --asc-color-base-shade3: #a5a9b5; + --asc-color-base-shade4: #ebecef; + --asc-color-base-shade5: #f9f9fa; + --asc-color-secondary-default: #292b32; + --asc-color-secondary-shade1: #636878; + --asc-color-secondary-shade2: #898e9e; + --asc-color-secondary-shade3: #a5a9b5; + --asc-color-secondary-shade4: #ebecef; + --asc-color-secondary-shade5: #f9f9fa; + --asc-color-base-background: #fff; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --asc-color-alert: #fa4d30; + --asc-color-black: #000; + --asc-color-white: #fff; + --asc-color-primary-default: #1054de; + --asc-color-primary-shade1: #4a82f2; + --asc-color-primary-shade2: #a0bdf8; + --asc-color-primary-shade3: #d9e5fc; + --asc-color-primary-shade4: #fff; + --asc-color-base-inverse: #fff; + --asc-color-base-default: #ebecef; + --asc-color-base-shade1: #a5a9b5; + --asc-color-base-shade2: #6e7487; + --asc-color-base-shade3: #40434e; + --asc-color-base-shade4: #292b32; + --asc-color-base-shade5: #f9f9fa; + --asc-color-secondary-default: #292b32; + --asc-color-secondary-shade1: #636878; + --asc-color-secondary-shade2: #898e9e; + --asc-color-secondary-shade3: #a5a9b5; + --asc-color-secondary-shade4: #ebecef; + --asc-color-secondary-shade5: #f9f9fa; + --asc-color-base-background: #191919; + } +} diff --git a/src/v4/styles/typography.module.css b/src/v4/styles/typography.module.css index 869d802c7..6d9d09266 100644 --- a/src/v4/styles/typography.module.css +++ b/src/v4/styles/typography.module.css @@ -1,4 +1,4 @@ -@import './global.css'; +@import url('./global.css'); .typography { padding: 0; @@ -36,9 +36,11 @@ } .typography-caption { - font-weight: var(--asc-text-font-weight-normal); - font-size: var(--asc-text-font-size-xs); - line-height: var(--asc-line-height-xs); + font-size: 0.8125rem; + font-style: normal; + font-weight: 400; + line-height: 1.125rem; /* 138.462% */ + letter-spacing: -0.0063rem; } .typography-caption-bold { diff --git a/src/v4/utils/permissions.ts b/src/v4/utils/permissions.ts new file mode 100644 index 000000000..f4f141e07 --- /dev/null +++ b/src/v4/utils/permissions.ts @@ -0,0 +1,47 @@ +// // TODO: refactor to align with SDK roles once available. +import { MemberRoles } from '~/social/constants'; +import { isCommunityMember, isCommunityPost, isPostUnderReview } from '~/helpers/utils'; + +const ADMIN = 'global-admin'; +const { COMMUNITY_MODERATOR, CHANNEL_MODERATOR, MODERATOR, SUPER_MODERATOR } = MemberRoles; + +export const isModerator = (userRoles?: string[]) => { + if (!userRoles?.length) { + return false; + } + + const roles: string[] = [COMMUNITY_MODERATOR, CHANNEL_MODERATOR, MODERATOR, SUPER_MODERATOR]; + + return userRoles.some((role) => roles.includes(role)); +}; + +export const isAdmin = (userRoles?: string[]) => { + if (!userRoles?.length) { + return false; + } + + return userRoles.includes(ADMIN); +}; + +/** + * + * @deprecated + */ +function isPostModerator({ + user, + communityUser, + post, +}: { + user?: Pick<Amity.User, 'roles'>; + communityUser?: Amity.Membership<'community'>; + post?: Amity.Post; +}) { + const hasModeratorPermissions = + isAdmin(user?.roles) || isModerator(user?.roles) || isModerator(communityUser?.roles); + + if (isCommunityPost(post)) { + return hasModeratorPermissions && isCommunityMember(communityUser); + } + + return hasModeratorPermissions; +}