a tool for shared writing and social publishing
0

Configure Feed

Select the types of activity you want to include in your feed.

move tabs into sidebar

celine (Apr 27, 2026, 11:34 PM EDT) b86d49a6 641dfc3f

+166 -721
+3
actions/getIdentityData.ts
··· 12 12 let auth_token = 13 13 cookieStore.get("auth_token")?.value || 14 14 cookieStore.get("external_auth_token")?.value; 15 + console.log("AUTH_TOKEN: " + auth_token); 15 16 let auth_res = auth_token 16 17 ? await supabaseServerClient 17 18 .from("email_auth_tokens") ··· 47 48 .eq("confirmed", true) 48 49 .single() 49 50 : null; 51 + console.log("GETTING IDENTITY", auth_res); 52 + if (auth_res?.error) console.log(auth_res.error); 50 53 if (!auth_res?.data?.identities) return null; 51 54 52 55 // Transform embedded entitlements into a keyed record, filtering expired
+8 -1
app/(home-pages)/home/Actions/AccountSettings.tsx
··· 16 16 align={isMobile ? "center" : "start"} 17 17 className={`w-xs bg-white!`} 18 18 arrowFill="bg-white" 19 - trigger={<ActionButton smallOnMobile icon=<PaintSmall /> label="Theme" />} 19 + trigger={ 20 + <ActionButton 21 + secondary 22 + smallOnMobile 23 + icon=<PaintSmall /> 24 + label="Theme" 25 + /> 26 + } 20 27 > 21 28 <ThemeSetterContent entityID={props.entityID} home /> 22 29 </Popover>
+6
app/globals.css
··· 486 486 @apply rounded-md; 487 487 } 488 488 489 + .light-container { 490 + background: color-mix(in oklab, rgb(var(--primary)), rgb(var(--bg-page)) 95%); 491 + @apply border; 492 + @apply border-border-light; 493 + @apply rounded-md; 494 + } 489 495 .frosted-container { 490 496 background: rgba(var(--bg-page), 0.75); 491 497 @apply border;
+1
app/lish/[did]/[publication]/dashboard/Actions.tsx
··· 38 38 asChild 39 39 trigger={ 40 40 <ActionButton 41 + secondary 41 42 id="pub-share-button" 42 43 icon=<ShareSmall /> 43 44 label="Share"
+15 -13
components/ActionBar/ActionButton.tsx
··· 15 15 label: React.ReactNode; 16 16 primary?: boolean; 17 17 secondary?: boolean; 18 - nav?: boolean; 19 18 className?: string; 20 19 subtext?: string; 21 20 labelOnMobile?: boolean; ··· 29 28 label, 30 29 primary, 31 30 secondary, 32 - nav, 33 31 labelOnMobile, 34 32 smallOnMobile, 35 33 subtext, ··· 47 45 } 48 46 }, [sidebar, inOpenPopover]); 49 47 50 - let showLabelOnMobile = 51 - labelOnMobile !== false && (primary || secondary || nav); 48 + let showLabelOnMobile = labelOnMobile !== false && (primary || secondary); 52 49 53 50 return ( 54 51 <button 55 52 {...buttonProps} 56 53 ref={ref} 57 54 className={` 58 - actionButton relative font-bold 55 + actionButton relative 59 56 rounded-md border 60 57 flex gap-2 items-start justify-start 61 - sm:w-full sm:max-w-full p-1 58 + sm:w-full sm:max-w-full py-0.5 px-1 62 59 w-max 60 + outline-2 outline-transparent outline-offset-1 63 61 ${smallOnMobile && "sm:text-base text-sm py-0! sm:py-1! sm:h-fit h-6 items-center!"} 64 62 ${ 65 63 primary 66 - ? "bg-accent-1 border-accent-1 text-accent-2 transparent-outline sm:hover:outline-accent-contrast focus:outline-accent-1 outline-offset-1 " 64 + ? "bg-accent-1 border-accent-1 text-accent-2 sm:hover:outline-accent-contrast focus:outline-accent-1 font-bold" 67 65 : secondary 68 - ? " bg-bg-page border-accent-contrast text-accent-contrast transparent-outline focus:outline-accent-contrast sm:hover:outline-accent-contrast outline-offset-1" 69 - : nav 70 - ? "border-transparent text-secondary sm:hover:border-border justify-start! max-w-full" 71 - : "border-transparent text-accent-contrast sm:hover:border-accent-contrast" 66 + ? "border-accent-contrast sm:hover:outline-accent-contrast focus:outline-accent-1 text-accent-contrast hover:border-accent-contrast focus:border-accent-contrast font-bold" 67 + : "border-transparent text-secondary sm:hover:border-border justify-start! max-w-full" 72 68 } 73 69 ${className} 74 70 `} 75 71 > 76 - <div className="shrink-0 flex flex-row gap-0.5">{icon}</div> 72 + <div 73 + className={`shrink-0 flex flex-row gap-0.5 ${!primary && !secondary && "text-tertiary"}`} 74 + > 75 + {icon} 76 + </div> 77 77 <div 78 78 className={`flex flex-col ${subtext && "leading-snug"} sm:max-w-full min-w-0 mr-1 ${sidebar.open ? "block" : showLabelOnMobile ? "sm:hidden block" : "hidden"}`} 79 79 style={{ width: "-webkit-fill-available" }} 80 80 > 81 81 <div className="truncate text-left">{label}</div> 82 82 {subtext && ( 83 - <div className="text-xs text-tertiary font-normal text-left"> 83 + <div 84 + className={`text-xs ${secondary ? "text-accent-contrast" : "text-tertiary"} font-normal text-left`} 85 + > 84 86 {subtext} 85 87 </div> 86 88 )}
+60 -42
components/ActionBar/DesktopNavigation.tsx
··· 1 1 import { useIdentityData } from "components/IdentityProvider"; 2 2 import { 3 3 navPages, 4 - HomeButton, 4 + NotificationButton, 5 5 ReaderButton, 6 - NotificationButton, 7 6 WriterButton, 8 7 } from "./NavigationButtons"; 9 8 import { PublicationButtons } from "./Publications"; ··· 12 11 import { ProfileButton } from "./ProfileButton"; 13 12 import { ActionButton } from "./ActionButton"; 14 13 import { AccountSmall } from "components/Icons/AccountSmall"; 14 + import { TabsSmall } from "components/Icons/TabsSmall"; 15 15 16 16 export const DesktopNavigation = (props: { 17 17 currentPage: navPages; 18 18 publication?: string; 19 + actions?: React.ReactNode; 20 + tabs?: { [name: string]: { icon?: React.ReactNode } }; 21 + currentTab?: string; 22 + onTabClick?: (tab: string) => void; 23 + onTabHover?: (tab: string) => void; 19 24 }) => { 20 25 let { identity } = useIdentityData(); 21 26 let thisPublication = identity?.publications?.find( 22 27 (pub) => pub.uri === props.publication, 23 28 ); 24 29 25 - let currentlyWriter = 30 + let isWriterPage = 26 31 props.currentPage === "home" || 27 32 props.currentPage === "looseleafs" || 28 33 props.currentPage === "pub"; 34 + 29 35 return ( 30 - <div className="flex flex-col gap-3"> 31 - <Sidebar alwaysOpen> 32 - {identity ? ( 33 - <> 34 - <ProfileButton /> 35 - {identity.atp_did && ( 36 - <NotificationButton 37 - current={props.currentPage === "notifications"} 38 - /> 39 - )} 40 - </> 41 - ) : ( 42 - <LoginModal 43 - asChild 44 - trigger={ 45 - <ActionButton 46 - secondary 47 - icon={<AccountSmall />} 48 - label="Log In/Sign Up" 49 - /> 50 - } 36 + <Sidebar alwaysOpen> 37 + {props.actions} 38 + 39 + {props.tabs && Object.keys(props.tabs).length > 1 && ( 40 + <> 41 + <hr className="border-border-light border-dashed my-1" /> 42 + {Object.keys(props.tabs).map((t) => ( 43 + <ActionButton 44 + key={t} 45 + icon={props.tabs![t].icon ?? <TabsSmall />} 46 + label={t} 47 + className={ 48 + t === props.currentTab ? "bg-bg-page! border-border-light!" : "" 49 + } 50 + onClick={() => props.onTabClick?.(t)} 51 + onMouseEnter={() => props.onTabHover?.(t)} 52 + onPointerDown={() => props.onTabHover?.(t)} 53 + /> 54 + ))} 55 + </> 56 + )} 57 + 58 + {props.currentPage === "home" && ( 59 + <> 60 + <hr className="border-border-light my-1" /> 61 + <PublicationButtons 62 + currentPage={props.currentPage} 63 + currentPubUri={thisPublication?.uri} 51 64 /> 52 - )} 53 - </Sidebar> 65 + </> 66 + )} 54 67 55 - <Sidebar alwaysOpen> 68 + <div className="flex-1" /> 69 + <WriterButton /> 70 + {isWriterPage && ( 56 71 <ReaderButton 57 - current={props.currentPage === "reader"} 58 72 subs={ 59 73 identity?.publication_subscriptions?.length !== 0 && 60 74 identity?.publication_subscriptions?.length !== undefined 61 75 } 62 76 /> 63 - <WriterButton 64 - currentPage={props.currentPage} 65 - currentPubUri={thisPublication?.uri} 77 + )} 78 + {identity?.atp_did && ( 79 + <NotificationButton current={props.currentPage === "notifications"} /> 80 + )} 81 + {identity ? ( 82 + <ProfileButton /> 83 + ) : ( 84 + <LoginModal 85 + asChild 86 + trigger={ 87 + <ActionButton 88 + secondary 89 + icon={<AccountSmall />} 90 + label="Log In/Sign Up" 91 + /> 92 + } 66 93 /> 67 - {currentlyWriter && ( 68 - <> 69 - <hr className="border-border-light border-dashed" /> 70 - <PublicationButtons 71 - currentPage={props.currentPage} 72 - currentPubUri={thisPublication?.uri} 73 - /> 74 - </> 75 - )} 76 - </Sidebar> 77 - </div> 94 + )} 95 + </Sidebar> 78 96 ); 79 97 };
-13
components/ActionBar/NavigationButtons.tsx
··· 27 27 return ( 28 28 <SpeedyLink href={"/home"} className="hover:!no-underline"> 29 29 <ActionButton 30 - nav 31 30 icon={<HomeSmall />} 32 31 label="Home" 33 32 className={`${props.current ? "bg-bg-page! border-border-light!" : ""} w-full! ${props.className}`} ··· 37 36 }; 38 37 39 38 export const WriterButton = (props: { 40 - currentPage: navPages; 41 39 currentPubUri?: string; 42 40 compactOnMobile?: boolean; 43 41 }) => { 44 - let current = 45 - props.currentPage === "home" || 46 - props.currentPage === "looseleafs" || 47 - props.currentPage === "pub"; 48 - 49 42 return ( 50 43 <SpeedyLink href={"/home"} className="hover:!no-underline"> 51 44 <ActionButton 52 - nav 53 45 labelOnMobile={!props.compactOnMobile} 54 46 icon={<WriterSmall />} 55 47 label="Write" 56 - className={`${current ? "bg-bg-page! border-border-light!" : ""}`} 57 48 /> 58 49 </SpeedyLink> 59 50 ); 60 51 }; 61 52 62 53 export const ReaderButton = (props: { 63 - current?: boolean; 64 54 subs: boolean; 65 55 compactOnMobile?: boolean; 66 56 }) => { 67 57 return ( 68 58 <SpeedyLink href={"/reader"} className="hover:no-underline!"> 69 59 <ActionButton 70 - nav 71 60 labelOnMobile={!props.compactOnMobile} 72 61 icon={<ReaderUnreadSmall />} 73 62 label="Read" 74 - className={props.current ? "bg-bg-page! border-border-light!" : ""} 75 63 /> 76 64 </SpeedyLink> 77 65 ); ··· 84 72 return ( 85 73 <SpeedyLink href={"/notifications"} className="hover:no-underline!"> 86 74 <ActionButton 87 - nav 88 75 labelOnMobile={false} 89 76 icon={ 90 77 unreads ? (
-1
components/ActionBar/ProfileButton.tsx
··· 32 32 className="w-xs py-1!" 33 33 trigger={ 34 34 <ActionButton 35 - nav 36 35 labelOnMobile={false} 37 36 icon={ 38 37 record ? (
+10 -21
components/ActionBar/Publications.tsx
··· 15 15 import { PublishSmall } from "components/Icons/PublishSmall"; 16 16 import { Popover } from "components/Popover"; 17 17 import { ButtonPrimary, ButtonSecondary } from "components/Buttons"; 18 - import { useIsMobile } from "src/hooks/isMobile"; 18 + import { useIsInitialRender, useIsMobile } from "src/hooks/isMobile"; 19 19 import { useState } from "react"; 20 20 import { LooseLeafSmall } from "components/Icons/LooseleafSmall"; 21 21 import { type navPages } from "./NavigationButtons"; ··· 45 45 > 46 46 {hasLooseleafs && ( 47 47 <> 48 - <SpeedyLink 49 - href={`/looseleafs`} 50 - className={`flex gap-2 items-start text-secondary font-bold hover:no-underline! hover:text-accent-contrast w-full `} 51 - > 48 + <SpeedyLink href={`/looseleafs`} className={` hover:no-underline! `}> 52 49 {/*TODO How should i get if this is the current page or not? 53 50 theres not "pub" to check the uri for. Do i need to add it as an option to NavPages? thats kinda annoying*/} 54 - <ActionButton 55 - label="Looseleafs" 56 - icon={<LooseLeafSmall />} 57 - nav 58 - className={`w-full! ${ 59 - props.currentPage === "looseleafs" 60 - ? "bg-bg-page! border-border!" 61 - : "" 62 - } 63 - ${props.optionClassName}`} 64 - /> 51 + <ActionButton label="Looseleafs" icon={<LooseLeafSmall />} /> 65 52 </SpeedyLink> 53 + <hr className="border-border-light border-dashed my-1" /> 66 54 </> 67 55 )} 68 56 ··· 100 88 return ( 101 89 <SpeedyLink 102 90 href={`${getBasePublicationURL(props)}/dashboard`} 103 - className={`flex gap-2 items-start text-secondary font-bold hover:no-underline! hover:text-accent-contrast w-full `} 91 + className={`hover:no-underline! `} 104 92 > 105 93 <ActionButton 106 94 label={record.name} 107 95 icon={<PubIcon record={record} uri={props.uri} />} 108 - nav 109 96 className={`w-full! ${props.current ? "bg-bg-page! border-border!" : ""} ${props.className}`} 110 97 /> 111 98 </SpeedyLink> ··· 113 100 }; 114 101 115 102 const PubListEmpty = () => { 116 - let isMobile = useIsMobile(); 103 + let initialRender = useIsInitialRender(); 104 + let mobile = useIsMobile(); 105 + let isMobile = !initialRender && mobile; 117 106 118 107 let [state, setState] = useState<"default" | "info">("default"); 119 108 if (isMobile && state == "default") 120 109 return ( 121 110 <ActionButton 122 111 label="Publish" 112 + secondary 123 113 icon={<PublishSmall />} 124 - nav 125 114 subtext="Start a blog on ATProto!" 126 115 onClick={() => { 127 116 setState("info"); ··· 139 128 asChild 140 129 trigger={ 141 130 <ActionButton 131 + secondary 142 132 label="Publish" 143 133 icon={<PublishSmall />} 144 - nav 145 134 subtext="Start a blog on ATProto!" 146 135 /> 147 136 }
+6 -3
components/ActionBar/Sidebar.tsx
··· 1 1 "use client"; 2 2 import { uv } from "colorjs.io/fn"; 3 3 import { Media } from "components/Media"; 4 + import { useCardBorderHidden } from "components/Pages/useCardBorderHidden"; 4 5 import { createContext, useState } from "react"; 5 6 6 7 export const SidebarContext = createContext({ ··· 16 17 let [sidebarExpanded, setSidebarExpanded] = useState(false); 17 18 let [childForceOpen, setChildForceOpen] = useState(false); 18 19 let open = sidebarExpanded || childForceOpen; 20 + let cardBorderHidden = useCardBorderHidden(); 19 21 return ( 20 22 <Media mobile={false}> 21 23 <SidebarContext ··· 25 27 }} 26 28 > 27 29 <div 30 + style={{ height: "-webkit-fill-available" }} 28 31 className={` 29 32 actionSidebar 30 33 ${!props.alwaysOpen ? "absolute top-0 left-0 z-10 w-max" : "w-[192px] max-w-[192px]"} 31 - h-fit p-[6px] 32 - flex flex-col gap-1 justify-start border 33 - rounded-md bg-bg-page ${open && !props.alwaysOpen ? "border-border-light" : "frosted-container"} 34 + p-[6px] my-6 35 + flex flex-col gap-0.5 justify-start border 36 + rounded-md ${cardBorderHidden ? "light-container" : "frosted-container"} 34 37 ${props.className} 35 38 `} 36 39 onMouseOver={() => {
+1
components/IdentityProvider.tsx
··· 54 54 channel.unsubscribe(); 55 55 }; 56 56 }, [identity?.atp_did]); 57 + console.log("IDENTITY", identity); 57 58 return ( 58 59 <IdentityContext.Provider value={{ identity, mutate }}> 59 60 {props.children}
+1 -1
components/Media.tsx
··· 31 31 if (initialRender) 32 32 return ( 33 33 <div 34 - className={`${props.mobile ? "sm:hidden contents" : "hidden sm:contents"} ${props.className}`} 34 + className={`mediaContentContainer ${props.mobile ? "sm:hidden contents" : "hidden sm:contents"} ${props.className}`} 35 35 > 36 36 {props.children} 37 37 </div>
+52 -70
components/PageLayouts/DashboardLayout.tsx
··· 3 3 import { useSearchParams } from "next/navigation"; 4 4 import { Header } from "../PageHeader"; 5 5 import { Footer } from "components/ActionBar/Footer"; 6 - import { Sidebar } from "components/ActionBar/Sidebar"; 7 - import { DesktopNavigation } from "components/ActionBar/DesktopNavigation"; 8 - 9 6 import { MobileNavigation } from "components/ActionBar/MobileNavigation"; 10 - import { 11 - navPages, 12 - NotificationButton, 13 - } from "components/ActionBar/NavigationButtons"; 7 + import { navPages } from "components/ActionBar/NavigationButtons"; 8 + import { DesktopNavigation } from "components/ActionBar/DesktopNavigation"; 14 9 import { create } from "zustand"; 15 10 import { Popover } from "components/Popover"; 16 11 import { Checkbox } from "components/Checkbox"; ··· 23 18 import { SearchTiny } from "components/Icons/SearchTiny"; 24 19 import { InterfaceState, useIdentityData } from "components/IdentityProvider"; 25 20 import { updateIdentityInterfaceState } from "actions/updateIdentityInterfaceState"; 26 - import Link from "next/link"; 27 - import { ExternalLinkTiny } from "components/Icons/ExternalLinkTiny"; 28 21 import { usePreserveScroll } from "src/hooks/usePreserveScroll"; 29 22 import { Tab } from "components/Tab"; 30 - import { PubIcon, PublicationButtons } from "components/ActionBar/Publications"; 31 23 32 24 export type DashboardState = { 33 25 display?: "grid" | "list"; ··· 149 141 const searchParams = useSearchParams(); 150 142 const tabParam = searchParams.get("tab"); 151 143 152 - // Initialize tab from search param if valid, otherwise use default 153 144 const initialTab = 154 145 tabParam && props.tabs[tabParam] ? tabParam : props.defaultTab; 155 146 let [tab, setTab] = useState<keyof T>(initialTab); 156 147 157 - // Custom setter that updates both state and URL 158 148 const setTabWithUrl = (newTab: keyof T) => { 159 149 setTab(newTab); 160 150 const params = new URLSearchParams(searchParams.toString()); ··· 177 167 <div 178 168 className={`dashboard pwa-padding relative max-w-(--breakpoint-lg) w-full h-full mx-auto flex sm:flex-row flex-col sm:items-stretch sm:px-6`} 179 169 > 180 - <MediaContents mobile={false}> 181 - <div className="flex flex-col gap-3 my-6"> 182 - <DesktopNavigation 183 - currentPage={props.currentPage} 184 - publication={props.publication} 185 - /> 186 - {props.actions && <Sidebar alwaysOpen>{props.actions}</Sidebar>} 187 - </div> 188 - </MediaContents> 170 + <DesktopNavigation 171 + currentPage={props.currentPage} 172 + publication={props.publication} 173 + actions={props.actions} 174 + tabs={props.tabs} 175 + currentTab={tab as string} 176 + onTabClick={(t) => setTabWithUrl(t as keyof T)} 177 + onTabHover={props.onTabHover} 178 + /> 189 179 <div 190 180 className={`w-full h-full flex flex-col gap-2 relative overflow-y-scroll pt-3 pb-3 px-3 sm:pt-8 sm:pb-6 sm:pl-8 sm:pr-4 `} 191 181 ref={ref} ··· 195 185 <PageTitle pageTitle={props.pageTitle} actions={props.actions} /> 196 186 )} 197 187 198 - {Object.keys(props.tabs).length <= 1 && !controls ? null : ( 199 - <> 200 - <Header> 201 - {headerState === "default" ? ( 202 - <> 203 - {Object.keys(props.tabs).length > 1 && ( 204 - <div className="pubDashTabs flex flex-row gap-1"> 205 - {Object.keys(props.tabs).map((t) => { 206 - return ( 207 - <Tab 208 - key={t} 209 - name={t} 210 - icon={props.tabs[t].icon} 211 - selected={t === tab} 212 - onSelect={() => setTabWithUrl(t)} 213 - onMouseEnter={() => props.onTabHover?.(t)} 214 - onPointerDown={() => props.onTabHover?.(t)} 215 - /> 216 - ); 217 - })} 218 - </div> 219 - )} 220 - {props.publication && controls && ( 221 - <button 222 - className={`sm:hidden block text-tertiary`} 223 - onClick={() => { 224 - setHeaderState("controls"); 225 - }} 226 - > 227 - <SortSmall /> 228 - </button> 229 - )} 230 - <div 231 - className={`sm:block ${props.publication && "hidden"} grow`} 232 - > 233 - {controls} 188 + {!controls && Object.keys(props.tabs).length <= 1 ? null : ( 189 + <Header> 190 + {headerState === "default" ? ( 191 + <> 192 + {Object.keys(props.tabs).length > 1 && ( 193 + <div className="sm:hidden pubDashTabs flex flex-row gap-1"> 194 + {Object.keys(props.tabs).map((t) => ( 195 + <Tab 196 + key={t} 197 + name={t} 198 + icon={props.tabs[t].icon} 199 + selected={t === tab} 200 + onSelect={() => setTabWithUrl(t)} 201 + onMouseEnter={() => props.onTabHover?.(t)} 202 + onPointerDown={() => props.onTabHover?.(t)} 203 + /> 204 + ))} 234 205 </div> 235 - </> 236 - ) : ( 237 - <> 238 - {controls} 206 + )} 207 + {props.publication && controls && ( 239 208 <button 240 - className="text-tertiary" 241 - onClick={() => { 242 - setHeaderState("default"); 243 - }} 209 + className={`sm:hidden block text-tertiary`} 210 + onClick={() => setHeaderState("controls")} 244 211 > 245 - <TabsSmall /> 212 + <SortSmall /> 246 213 </button> 247 - </> 248 - )} 249 - </Header> 250 - </> 214 + )} 215 + <div 216 + className={`sm:block ${props.publication && "hidden"} grow`} 217 + > 218 + {controls} 219 + </div> 220 + </> 221 + ) : ( 222 + <> 223 + {controls} 224 + <button 225 + className="text-tertiary" 226 + onClick={() => setHeaderState("default")} 227 + > 228 + <TabsSmall /> 229 + </button> 230 + </> 231 + )} 232 + </Header> 251 233 )} 252 234 {content} 253 235 </div>
+3 -2
components/ThemeManager/ThemeSetter.tsx
··· 80 80 asChild 81 81 side={isMobile ? "top" : "right"} 82 82 align={isMobile ? "center" : "start"} 83 - trigger={<ActionButton icon={<PaintSmall />} label="Theme" />} 83 + trigger={<ActionButton secondary icon={<PaintSmall />} label="Theme" />} 84 84 > 85 85 <ThemeSetterContent {...props} /> 86 86 </Popover> ··· 260 260 ?.data.value; 261 261 262 262 // Read font values directly since the popover is portalled outside .leafletWrapper 263 - let headingFontId = useEntity(props.entityID, "theme/heading-font")?.data.value; 263 + let headingFontId = useEntity(props.entityID, "theme/heading-font")?.data 264 + .value; 264 265 let bodyFontId = useEntity(props.entityID, "theme/body-font")?.data.value; 265 266 let bodyFontFamily = getFontFamilyValue(getFontConfig(bodyFontId)); 266 267 let headingFontFamily = getFontFamilyValue(getFontConfig(headingFontId));
-554
package-lock.json
··· 2940 2940 "node": ">=6.0.0" 2941 2941 } 2942 2942 }, 2943 - "node_modules/@jridgewell/source-map": { 2944 - "version": "0.3.11", 2945 - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", 2946 - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", 2947 - "license": "MIT", 2948 - "optional": true, 2949 - "peer": true, 2950 - "dependencies": { 2951 - "@jridgewell/gen-mapping": "^0.3.5", 2952 - "@jridgewell/trace-mapping": "^0.3.25" 2953 - } 2954 - }, 2955 2943 "node_modules/@jridgewell/sourcemap-codec": { 2956 2944 "version": "1.5.5", 2957 2945 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", ··· 9656 9644 "@types/ms": "*" 9657 9645 } 9658 9646 }, 9659 - "node_modules/@types/eslint": { 9660 - "version": "9.6.1", 9661 - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", 9662 - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", 9663 - "license": "MIT", 9664 - "optional": true, 9665 - "peer": true, 9666 - "dependencies": { 9667 - "@types/estree": "*", 9668 - "@types/json-schema": "*" 9669 - } 9670 - }, 9671 - "node_modules/@types/eslint-scope": { 9672 - "version": "3.7.7", 9673 - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", 9674 - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", 9675 - "license": "MIT", 9676 - "optional": true, 9677 - "peer": true, 9678 - "dependencies": { 9679 - "@types/eslint": "*", 9680 - "@types/estree": "*" 9681 - } 9682 - }, 9683 9647 "node_modules/@types/estree": { 9684 9648 "version": "1.0.8", 9685 9649 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", ··· 10253 10217 } 10254 10218 } 10255 10219 }, 10256 - "node_modules/@webassemblyjs/ast": { 10257 - "version": "1.14.1", 10258 - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", 10259 - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", 10260 - "license": "MIT", 10261 - "optional": true, 10262 - "peer": true, 10263 - "dependencies": { 10264 - "@webassemblyjs/helper-numbers": "1.13.2", 10265 - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" 10266 - } 10267 - }, 10268 - "node_modules/@webassemblyjs/floating-point-hex-parser": { 10269 - "version": "1.13.2", 10270 - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", 10271 - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", 10272 - "license": "MIT", 10273 - "optional": true, 10274 - "peer": true 10275 - }, 10276 - "node_modules/@webassemblyjs/helper-api-error": { 10277 - "version": "1.13.2", 10278 - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", 10279 - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", 10280 - "license": "MIT", 10281 - "optional": true, 10282 - "peer": true 10283 - }, 10284 - "node_modules/@webassemblyjs/helper-buffer": { 10285 - "version": "1.14.1", 10286 - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", 10287 - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", 10288 - "license": "MIT", 10289 - "optional": true, 10290 - "peer": true 10291 - }, 10292 - "node_modules/@webassemblyjs/helper-numbers": { 10293 - "version": "1.13.2", 10294 - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", 10295 - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", 10296 - "license": "MIT", 10297 - "optional": true, 10298 - "peer": true, 10299 - "dependencies": { 10300 - "@webassemblyjs/floating-point-hex-parser": "1.13.2", 10301 - "@webassemblyjs/helper-api-error": "1.13.2", 10302 - "@xtuc/long": "4.2.2" 10303 - } 10304 - }, 10305 - "node_modules/@webassemblyjs/helper-wasm-bytecode": { 10306 - "version": "1.13.2", 10307 - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", 10308 - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", 10309 - "license": "MIT", 10310 - "optional": true, 10311 - "peer": true 10312 - }, 10313 - "node_modules/@webassemblyjs/helper-wasm-section": { 10314 - "version": "1.14.1", 10315 - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", 10316 - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", 10317 - "license": "MIT", 10318 - "optional": true, 10319 - "peer": true, 10320 - "dependencies": { 10321 - "@webassemblyjs/ast": "1.14.1", 10322 - "@webassemblyjs/helper-buffer": "1.14.1", 10323 - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 10324 - "@webassemblyjs/wasm-gen": "1.14.1" 10325 - } 10326 - }, 10327 - "node_modules/@webassemblyjs/ieee754": { 10328 - "version": "1.13.2", 10329 - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", 10330 - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", 10331 - "license": "MIT", 10332 - "optional": true, 10333 - "peer": true, 10334 - "dependencies": { 10335 - "@xtuc/ieee754": "^1.2.0" 10336 - } 10337 - }, 10338 - "node_modules/@webassemblyjs/leb128": { 10339 - "version": "1.13.2", 10340 - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", 10341 - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", 10342 - "license": "Apache-2.0", 10343 - "optional": true, 10344 - "peer": true, 10345 - "dependencies": { 10346 - "@xtuc/long": "4.2.2" 10347 - } 10348 - }, 10349 - "node_modules/@webassemblyjs/utf8": { 10350 - "version": "1.13.2", 10351 - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", 10352 - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", 10353 - "license": "MIT", 10354 - "optional": true, 10355 - "peer": true 10356 - }, 10357 - "node_modules/@webassemblyjs/wasm-edit": { 10358 - "version": "1.14.1", 10359 - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", 10360 - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", 10361 - "license": "MIT", 10362 - "optional": true, 10363 - "peer": true, 10364 - "dependencies": { 10365 - "@webassemblyjs/ast": "1.14.1", 10366 - "@webassemblyjs/helper-buffer": "1.14.1", 10367 - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 10368 - "@webassemblyjs/helper-wasm-section": "1.14.1", 10369 - "@webassemblyjs/wasm-gen": "1.14.1", 10370 - "@webassemblyjs/wasm-opt": "1.14.1", 10371 - "@webassemblyjs/wasm-parser": "1.14.1", 10372 - "@webassemblyjs/wast-printer": "1.14.1" 10373 - } 10374 - }, 10375 - "node_modules/@webassemblyjs/wasm-gen": { 10376 - "version": "1.14.1", 10377 - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", 10378 - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", 10379 - "license": "MIT", 10380 - "optional": true, 10381 - "peer": true, 10382 - "dependencies": { 10383 - "@webassemblyjs/ast": "1.14.1", 10384 - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 10385 - "@webassemblyjs/ieee754": "1.13.2", 10386 - "@webassemblyjs/leb128": "1.13.2", 10387 - "@webassemblyjs/utf8": "1.13.2" 10388 - } 10389 - }, 10390 - "node_modules/@webassemblyjs/wasm-opt": { 10391 - "version": "1.14.1", 10392 - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", 10393 - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", 10394 - "license": "MIT", 10395 - "optional": true, 10396 - "peer": true, 10397 - "dependencies": { 10398 - "@webassemblyjs/ast": "1.14.1", 10399 - "@webassemblyjs/helper-buffer": "1.14.1", 10400 - "@webassemblyjs/wasm-gen": "1.14.1", 10401 - "@webassemblyjs/wasm-parser": "1.14.1" 10402 - } 10403 - }, 10404 - "node_modules/@webassemblyjs/wasm-parser": { 10405 - "version": "1.14.1", 10406 - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", 10407 - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", 10408 - "license": "MIT", 10409 - "optional": true, 10410 - "peer": true, 10411 - "dependencies": { 10412 - "@webassemblyjs/ast": "1.14.1", 10413 - "@webassemblyjs/helper-api-error": "1.13.2", 10414 - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 10415 - "@webassemblyjs/ieee754": "1.13.2", 10416 - "@webassemblyjs/leb128": "1.13.2", 10417 - "@webassemblyjs/utf8": "1.13.2" 10418 - } 10419 - }, 10420 - "node_modules/@webassemblyjs/wast-printer": { 10421 - "version": "1.14.1", 10422 - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", 10423 - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", 10424 - "license": "MIT", 10425 - "optional": true, 10426 - "peer": true, 10427 - "dependencies": { 10428 - "@webassemblyjs/ast": "1.14.1", 10429 - "@xtuc/long": "4.2.2" 10430 - } 10431 - }, 10432 - "node_modules/@xtuc/ieee754": { 10433 - "version": "1.2.0", 10434 - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 10435 - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 10436 - "license": "BSD-3-Clause", 10437 - "optional": true, 10438 - "peer": true 10439 - }, 10440 - "node_modules/@xtuc/long": { 10441 - "version": "4.2.2", 10442 - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 10443 - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 10444 - "license": "Apache-2.0", 10445 - "optional": true, 10446 - "peer": true 10447 - }, 10448 10220 "node_modules/@yornaath/batshit": { 10449 10221 "version": "0.14.0", 10450 10222 "resolved": "https://registry.npmjs.org/@yornaath/batshit/-/batshit-0.14.0.tgz", ··· 10506 10278 "acorn": "^8" 10507 10279 } 10508 10280 }, 10509 - "node_modules/acorn-import-phases": { 10510 - "version": "1.0.4", 10511 - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", 10512 - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", 10513 - "license": "MIT", 10514 - "optional": true, 10515 - "peer": true, 10516 - "engines": { 10517 - "node": ">=10.13.0" 10518 - }, 10519 - "peerDependencies": { 10520 - "acorn": "^8.14.0" 10521 - } 10522 - }, 10523 10281 "node_modules/acorn-jsx": { 10524 10282 "version": "5.3.2", 10525 10283 "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", ··· 10558 10316 "funding": { 10559 10317 "type": "github", 10560 10318 "url": "https://github.com/sponsors/epoberezkin" 10561 - } 10562 - }, 10563 - "node_modules/ajv-formats": { 10564 - "version": "2.1.1", 10565 - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 10566 - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 10567 - "license": "MIT", 10568 - "optional": true, 10569 - "peer": true, 10570 - "dependencies": { 10571 - "ajv": "^8.0.0" 10572 - }, 10573 - "peerDependencies": { 10574 - "ajv": "^8.0.0" 10575 - }, 10576 - "peerDependenciesMeta": { 10577 - "ajv": { 10578 - "optional": true 10579 - } 10580 - } 10581 - }, 10582 - "node_modules/ajv-keywords": { 10583 - "version": "5.1.0", 10584 - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 10585 - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 10586 - "license": "MIT", 10587 - "optional": true, 10588 - "peer": true, 10589 - "dependencies": { 10590 - "fast-deep-equal": "^3.1.3" 10591 - }, 10592 - "peerDependencies": { 10593 - "ajv": "^8.8.2" 10594 10319 } 10595 10320 }, 10596 10321 "node_modules/ansi-regex": { ··· 11399 11124 "node": ">=18" 11400 11125 } 11401 11126 }, 11402 - "node_modules/chrome-trace-event": { 11403 - "version": "1.0.4", 11404 - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", 11405 - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", 11406 - "license": "MIT", 11407 - "optional": true, 11408 - "peer": true, 11409 - "engines": { 11410 - "node": ">=6.0" 11411 - } 11412 - }, 11413 11127 "node_modules/citty": { 11414 11128 "version": "0.2.2", 11415 11129 "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", ··· 13044 12758 "engines": { 13045 12759 "node": ">= 0.4" 13046 12760 } 13047 - }, 13048 - "node_modules/es-module-lexer": { 13049 - "version": "2.0.0", 13050 - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", 13051 - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", 13052 - "license": "MIT", 13053 - "optional": true, 13054 - "peer": true 13055 12761 }, 13056 12762 "node_modules/es-object-atoms": { 13057 12763 "version": "1.1.1", ··· 15860 15566 "node": ">= 0.4" 15861 15567 } 15862 15568 }, 15863 - "node_modules/jest-worker": { 15864 - "version": "27.5.1", 15865 - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 15866 - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 15867 - "license": "MIT", 15868 - "optional": true, 15869 - "peer": true, 15870 - "dependencies": { 15871 - "@types/node": "*", 15872 - "merge-stream": "^2.0.0", 15873 - "supports-color": "^8.0.0" 15874 - }, 15875 - "engines": { 15876 - "node": ">= 10.13.0" 15877 - } 15878 - }, 15879 - "node_modules/jest-worker/node_modules/supports-color": { 15880 - "version": "8.1.1", 15881 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 15882 - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 15883 - "license": "MIT", 15884 - "optional": true, 15885 - "peer": true, 15886 - "dependencies": { 15887 - "has-flag": "^4.0.0" 15888 - }, 15889 - "engines": { 15890 - "node": ">=10" 15891 - }, 15892 - "funding": { 15893 - "url": "https://github.com/chalk/supports-color?sponsor=1" 15894 - } 15895 - }, 15896 15569 "node_modules/jiti": { 15897 15570 "version": "2.6.0", 15898 15571 "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz", ··· 16390 16063 "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", 16391 16064 "license": "MIT" 16392 16065 }, 16393 - "node_modules/loader-runner": { 16394 - "version": "4.3.1", 16395 - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", 16396 - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", 16397 - "license": "MIT", 16398 - "optional": true, 16399 - "peer": true, 16400 - "engines": { 16401 - "node": ">=6.11.5" 16402 - }, 16403 - "funding": { 16404 - "type": "opencollective", 16405 - "url": "https://opencollective.com/webpack" 16406 - } 16407 - }, 16408 16066 "node_modules/locate-path": { 16409 16067 "version": "6.0.0", 16410 16068 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ··· 16901 16559 "url": "https://github.com/sponsors/sindresorhus" 16902 16560 } 16903 16561 }, 16904 - "node_modules/merge-stream": { 16905 - "version": "2.0.0", 16906 - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 16907 - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 16908 - "license": "MIT", 16909 - "optional": true, 16910 - "peer": true 16911 - }, 16912 16562 "node_modules/merge2": { 16913 16563 "version": "1.4.1", 16914 16564 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", ··· 17838 17488 "engines": { 17839 17489 "node": ">= 0.6" 17840 17490 } 17841 - }, 17842 - "node_modules/neo-async": { 17843 - "version": "2.6.2", 17844 - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 17845 - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 17846 - "license": "MIT", 17847 - "optional": true, 17848 - "peer": true 17849 17491 }, 17850 17492 "node_modules/next": { 17851 17493 "version": "16.2.3", ··· 21443 21085 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", 21444 21086 "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" 21445 21087 }, 21446 - "node_modules/schema-utils": { 21447 - "version": "4.3.3", 21448 - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", 21449 - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", 21450 - "license": "MIT", 21451 - "optional": true, 21452 - "peer": true, 21453 - "dependencies": { 21454 - "@types/json-schema": "^7.0.9", 21455 - "ajv": "^8.9.0", 21456 - "ajv-formats": "^2.1.1", 21457 - "ajv-keywords": "^5.1.0" 21458 - }, 21459 - "engines": { 21460 - "node": ">= 10.13.0" 21461 - }, 21462 - "funding": { 21463 - "type": "opencollective", 21464 - "url": "https://opencollective.com/webpack" 21465 - } 21466 - }, 21467 21088 "node_modules/selderee": { 21468 21089 "version": "0.11.0", 21469 21090 "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", ··· 22372 21993 "integrity": "sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ==", 22373 21994 "license": "ISC" 22374 21995 }, 22375 - "node_modules/terser": { 22376 - "version": "5.46.1", 22377 - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", 22378 - "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", 22379 - "license": "BSD-2-Clause", 22380 - "optional": true, 22381 - "peer": true, 22382 - "dependencies": { 22383 - "@jridgewell/source-map": "^0.3.3", 22384 - "acorn": "^8.15.0", 22385 - "commander": "^2.20.0", 22386 - "source-map-support": "~0.5.20" 22387 - }, 22388 - "bin": { 22389 - "terser": "bin/terser" 22390 - }, 22391 - "engines": { 22392 - "node": ">=10" 22393 - } 22394 - }, 22395 - "node_modules/terser-webpack-plugin": { 22396 - "version": "5.4.0", 22397 - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", 22398 - "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", 22399 - "license": "MIT", 22400 - "optional": true, 22401 - "peer": true, 22402 - "dependencies": { 22403 - "@jridgewell/trace-mapping": "^0.3.25", 22404 - "jest-worker": "^27.4.5", 22405 - "schema-utils": "^4.3.0", 22406 - "terser": "^5.31.1" 22407 - }, 22408 - "engines": { 22409 - "node": ">= 10.13.0" 22410 - }, 22411 - "funding": { 22412 - "type": "opencollective", 22413 - "url": "https://opencollective.com/webpack" 22414 - }, 22415 - "peerDependencies": { 22416 - "webpack": "^5.1.0" 22417 - }, 22418 - "peerDependenciesMeta": { 22419 - "@swc/core": { 22420 - "optional": true 22421 - }, 22422 - "esbuild": { 22423 - "optional": true 22424 - }, 22425 - "uglify-js": { 22426 - "optional": true 22427 - } 22428 - } 22429 - }, 22430 - "node_modules/terser/node_modules/commander": { 22431 - "version": "2.20.3", 22432 - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 22433 - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 22434 - "license": "MIT", 22435 - "optional": true, 22436 - "peer": true 22437 - }, 22438 21996 "node_modules/thread-stream": { 22439 21997 "version": "2.7.0", 22440 21998 "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", ··· 23190 22748 "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 23191 22749 "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" 23192 22750 }, 23193 - "node_modules/watchpack": { 23194 - "version": "2.5.1", 23195 - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", 23196 - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", 23197 - "license": "MIT", 23198 - "optional": true, 23199 - "peer": true, 23200 - "dependencies": { 23201 - "glob-to-regexp": "^0.4.1", 23202 - "graceful-fs": "^4.1.2" 23203 - }, 23204 - "engines": { 23205 - "node": ">=10.13.0" 23206 - } 23207 - }, 23208 22751 "node_modules/web-namespaces": { 23209 22752 "version": "2.0.1", 23210 22753 "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", ··· 23231 22774 "node": ">=12" 23232 22775 } 23233 22776 }, 23234 - "node_modules/webpack": { 23235 - "version": "5.106.2", 23236 - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", 23237 - "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", 23238 - "license": "MIT", 23239 - "optional": true, 23240 - "peer": true, 23241 - "dependencies": { 23242 - "@types/eslint-scope": "^3.7.7", 23243 - "@types/estree": "^1.0.8", 23244 - "@types/json-schema": "^7.0.15", 23245 - "@webassemblyjs/ast": "^1.14.1", 23246 - "@webassemblyjs/wasm-edit": "^1.14.1", 23247 - "@webassemblyjs/wasm-parser": "^1.14.1", 23248 - "acorn": "^8.16.0", 23249 - "acorn-import-phases": "^1.0.3", 23250 - "browserslist": "^4.28.1", 23251 - "chrome-trace-event": "^1.0.2", 23252 - "enhanced-resolve": "^5.20.0", 23253 - "es-module-lexer": "^2.0.0", 23254 - "eslint-scope": "5.1.1", 23255 - "events": "^3.2.0", 23256 - "glob-to-regexp": "^0.4.1", 23257 - "graceful-fs": "^4.2.11", 23258 - "loader-runner": "^4.3.1", 23259 - "mime-db": "^1.54.0", 23260 - "neo-async": "^2.6.2", 23261 - "schema-utils": "^4.3.3", 23262 - "tapable": "^2.3.0", 23263 - "terser-webpack-plugin": "^5.3.17", 23264 - "watchpack": "^2.5.1", 23265 - "webpack-sources": "^3.3.4" 23266 - }, 23267 - "bin": { 23268 - "webpack": "bin/webpack.js" 23269 - }, 23270 - "engines": { 23271 - "node": ">=10.13.0" 23272 - }, 23273 - "funding": { 23274 - "type": "opencollective", 23275 - "url": "https://opencollective.com/webpack" 23276 - }, 23277 - "peerDependenciesMeta": { 23278 - "webpack-cli": { 23279 - "optional": true 23280 - } 23281 - } 23282 - }, 23283 22777 "node_modules/webpack-bundle-analyzer": { 23284 22778 "version": "4.10.1", 23285 22779 "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", ··· 23335 22829 "utf-8-validate": { 23336 22830 "optional": true 23337 22831 } 23338 - } 23339 - }, 23340 - "node_modules/webpack-sources": { 23341 - "version": "3.3.4", 23342 - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", 23343 - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", 23344 - "license": "MIT", 23345 - "optional": true, 23346 - "peer": true, 23347 - "engines": { 23348 - "node": ">=10.13.0" 23349 - } 23350 - }, 23351 - "node_modules/webpack/node_modules/eslint-scope": { 23352 - "version": "5.1.1", 23353 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 23354 - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 23355 - "license": "BSD-2-Clause", 23356 - "optional": true, 23357 - "peer": true, 23358 - "dependencies": { 23359 - "esrecurse": "^4.3.0", 23360 - "estraverse": "^4.1.1" 23361 - }, 23362 - "engines": { 23363 - "node": ">=8.0.0" 23364 - } 23365 - }, 23366 - "node_modules/webpack/node_modules/estraverse": { 23367 - "version": "4.3.0", 23368 - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 23369 - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 23370 - "license": "BSD-2-Clause", 23371 - "optional": true, 23372 - "peer": true, 23373 - "engines": { 23374 - "node": ">=4.0" 23375 - } 23376 - }, 23377 - "node_modules/webpack/node_modules/mime-db": { 23378 - "version": "1.54.0", 23379 - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 23380 - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 23381 - "license": "MIT", 23382 - "optional": true, 23383 - "peer": true, 23384 - "engines": { 23385 - "node": ">= 0.6" 23386 22832 } 23387 22833 }, 23388 22834 "node_modules/whatwg-url": {