diff --git a/apps/staking/.vscode/snippets.code-snippets b/apps/staking/.vscode/snippets.code-snippets
new file mode 100644
index 00000000..276ff6ba
--- /dev/null
+++ b/apps/staking/.vscode/snippets.code-snippets
@@ -0,0 +1,20 @@
+{
+ // Place your session-website workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
+ // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
+ // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
+ // used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
+ // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
+ // Placeholders with the same ids are connected.
+ "cn Class Definition": {
+ "scope": "typescriptreact",
+ "prefix": ["cl", "class"],
+ "body": ["className={cn('$0')}"],
+ "description": "Define classes using cn package",
+ },
+ "cn to existing Class Definition": {
+ "scope": "typescriptreact",
+ "prefix": ["cn"],
+ "body": ["cn($0'')"],
+ "description": "Define classes using cn package when className is already defined",
+ },
+}
diff --git a/apps/staking/app/page.tsx b/apps/staking/app/page.tsx
index aa52bfee..7e2fb455 100644
--- a/apps/staking/app/page.tsx
+++ b/apps/staking/app/page.tsx
@@ -1,5 +1,7 @@
+import { Footer } from '@/components/Footer';
import { URL } from '@/lib/constants';
import { ButtonDataTestId } from '@/testing/data-test-ids';
+import { cn } from '@session/ui/lib/utils';
import { Button } from '@session/ui/ui/button';
import { useTranslations } from 'next-intl';
import Image from 'next/image';
@@ -8,55 +10,78 @@ import Link from 'next/link';
export default function LandingPage() {
const dictionary = useTranslations('home');
return (
-
-
-
- {dictionary.rich('title')}
-
-
-
-
- {dictionary('buttons.primary')}
-
-
-
-
- {dictionary('buttons.secondary')}
-
-
+
+
+
+
+ {dictionary.rich('title')}
+
+
+
+
+ {dictionary('buttons.primary')}
+
+
+
+
+ {dictionary('buttons.secondary')}
+
+
+
+
+ {dictionary('buttons.primary')}
+
+
+
+
+ {dictionary('buttons.secondary')}
+
+
+
-
-
-
- {dictionary('buttons.primary')}
-
-
-
-
- {dictionary('buttons.secondary')}
-
-
+
+
-
-
-
+
);
}
diff --git a/apps/staking/components/Footer.tsx b/apps/staking/components/Footer.tsx
new file mode 100644
index 00000000..a1eddec0
--- /dev/null
+++ b/apps/staking/components/Footer.tsx
@@ -0,0 +1,28 @@
+import { EXTERNAL_ROUTES, ROUTES, SOCIALS } from '@/lib/constants';
+import { Footer as FooterComp } from '@session/ui/components/Footer';
+import { cn } from '@session/ui/lib/utils';
+
+import { useTranslations } from 'next-intl';
+export function Footer() {
+ const dictionary = useTranslations('navigation');
+
+ const menuItems = [...ROUTES, ...EXTERNAL_ROUTES].map(
+ ({ dictionaryKey, href, linkType = 'internal' }) => ({
+ title: dictionary(dictionaryKey),
+ href: href,
+ linkType,
+ })
+ );
+
+ const socialLinks = Object.values(SOCIALS);
+
+ return (
+
+ );
+}
diff --git a/apps/staking/components/Header.tsx b/apps/staking/components/Header.tsx
index 07626e67..82a1e971 100644
--- a/apps/staking/components/Header.tsx
+++ b/apps/staking/components/Header.tsx
@@ -1,6 +1,6 @@
'use client';
-import type { LocaleKey } from '@/lib/locale-util';
+import { EXTERNAL_ROUTES, ROUTES } from '@/lib/constants';
import { ButtonDataTestId } from '@/testing/data-test-ids';
import { HamburgerIcon } from '@session/ui/icons/HamburgerIcon';
import { cn } from '@session/ui/lib/utils';
@@ -19,16 +19,6 @@ import { usePathname } from 'next/navigation';
import { WalletModalButtonWithLocales } from './WalletModalButtonWithLocales';
import { WalletNetworkDropdownWithLocales } from './WalletNetworkDropdownWithLocales';
-type LinkItem = {
- href: string;
- dictionaryKey: keyof Omit
;
-};
-
-const links: LinkItem[] = [
- { dictionaryKey: 'stake', href: '/stake' },
- { dictionaryKey: 'myStakes', href: '/mystakes' },
-] as const;
-
type NavLinkProps = {
href: string;
pathname: string;
@@ -55,20 +45,20 @@ export default function Header() {
const dictionary = useTranslations('navigation');
const pathname = usePathname();
return (
-
-
+
+
-
- {links.map(({ dictionaryKey, href }) => (
+
+ {ROUTES.map(({ dictionaryKey, href }) => (
))}
-
+
- {isConnected ? : null}
+ {isConnected ? : null}
@@ -92,7 +82,7 @@ function DropdownHamburgerMenu() {
@@ -100,35 +90,23 @@ function DropdownHamburgerMenu() {
- console.log('lang')}
- aria-label={dictionary('ariaLanguage')}
- >
- {dictionary('language')}
-
- {links.map(({ dictionaryKey, href }) => (
+ {ROUTES.map(({ dictionaryKey, href }) => (
+
+ ))}
+ {EXTERNAL_ROUTES.map(({ dictionaryKey, href }) => (
))}
-
- {dictionary('support')}
-
-
- {dictionary('faucet')}
-
);
diff --git a/apps/staking/lib/constants.ts b/apps/staking/lib/constants.ts
index fc743dbe..6a17edd3 100644
--- a/apps/staking/lib/constants.ts
+++ b/apps/staking/lib/constants.ts
@@ -1,6 +1,8 @@
/* eslint-disable @typescript-eslint/no-duplicate-enum-values */
import { CHAIN } from '@session/contracts/chains';
+import { Social, SocialLink } from '@session/ui/components/SocialLinkList';
+import { LocaleKey } from './locale-util';
/** TODO - Change this to MAINNET when we launch mainnet */
export const preferredChain = CHAIN.TESTNET as const;
@@ -8,7 +10,6 @@ export const preferredChain = CHAIN.TESTNET as const;
export enum URL {
ARB_SEP_FAUCET = 'https://faucet.quicknode.com/arbitrum/sepolia',
SESSION_NODE_DOCS = 'https://docs.getsession.org/session-nodes',
- DISCORD_INVITE = 'https://discord.com/invite/J5BTQdCfXN',
INCENTIVE_PROGRAM = 'https://token.getsession.org/testnet-incentive-program',
LEARN_MORE_DAILY_REWARDS = 'https://docs.getsession.org/',
LEARN_MORE_TOTAL_REWARDS = 'https://docs.getsession.org/',
@@ -22,6 +23,15 @@ export enum COMMUNITY_DATE {
OXEN_SERVICE_NODE_BONUS_PROGRAM = '2024-06-12',
}
+export const SOCIALS: Partial
> = {
+ [Social.Discord]: { name: Social.Discord, link: 'https://discord.com/invite/J5BTQdCfXN' },
+ [Social.X]: { name: Social.X, link: 'https://x.com/session_token' },
+ [Social.Youtube]: { name: Social.Youtube, link: 'https://www.youtube.com/@sessiontv' },
+ [Social.Session]: { name: Social.Session, link: 'https://getsession.org/' },
+ [Social.Github]: { name: Social.Github, link: 'https://github.com/oxen-io/websites' },
+ [Social.RSS]: { name: Social.RSS, link: 'https://token.getsession.org/blog/feed' },
+};
+
export enum FAUCET {
MIN_ETH_BALANCE = 0.01,
DRIP = 240,
@@ -46,3 +56,21 @@ export enum NETWORK {
MAINNET = 'Mainnet',
TESTNET = 'Testnet',
}
+
+type LinkItem = {
+ href: string;
+ dictionaryKey: keyof Omit;
+ linkType?: 'internal' | 'external';
+};
+
+export const ROUTES: LinkItem[] = [
+ { dictionaryKey: 'stake', href: '/stake' },
+ { dictionaryKey: 'myStakes', href: '/mystakes' },
+ { dictionaryKey: 'faucet', href: '/faucet' },
+] as const;
+
+export const EXTERNAL_ROUTES: LinkItem[] = [
+ { dictionaryKey: 'tokenSite', href: 'https://token.getsession.org', linkType: 'external' },
+ { dictionaryKey: 'support', href: '/support', linkType: 'external' },
+ { dictionaryKey: 'docs', href: 'https://docs.getsession.org', linkType: 'external' },
+] as const;
diff --git a/apps/staking/locales/en.json b/apps/staking/locales/en.json
index 1649dec5..26dbf1d1 100644
--- a/apps/staking/locales/en.json
+++ b/apps/staking/locales/en.json
@@ -15,6 +15,7 @@
"stake": "Stake Now",
"myStakes": "My Stakes",
"docs": "Docs",
+ "tokenSite": "Session Token",
"support": "Support",
"faucet": "Faucet",
"hamburgerDropdown": {
@@ -25,7 +26,8 @@
"ariaSupport": "Go to support page",
"faucet": "Faucet",
"ariaFaucet": "Go to faucet page"
- }
+ },
+ "managedBy": "/ Managed by the Session Network"
},
"wallet": {
"modalButton": {
diff --git a/apps/staking/next.config.mjs b/apps/staking/next.config.mjs
index 106dc442..8dd89dab 100644
--- a/apps/staking/next.config.mjs
+++ b/apps/staking/next.config.mjs
@@ -27,6 +27,15 @@ const nextConfig = {
config.externals.push('pino-pretty', 'lokijs', 'encoding');
return config;
},
+ redirects: async () => {
+ return [
+ {
+ source: '/support',
+ destination: 'https://discord.com/invite/J5BTQdCfXN',
+ permanent: false,
+ },
+ ];
+ },
rewrites: async () => {
return [
{
diff --git a/apps/staking/package.json b/apps/staking/package.json
index 3b71e660..c3de352d 100644
--- a/apps/staking/package.json
+++ b/apps/staking/package.json
@@ -28,6 +28,7 @@
"react-hook-form": "^7.51.5",
"rtl-detect": "^1.1.2",
"server-only": "^0.0.1",
+ "sharp": "0.32.6",
"wagmi": "2.9.10",
"zod": "^3.23.8"
},
diff --git a/packages/ui/components/Footer.tsx b/packages/ui/components/Footer.tsx
new file mode 100644
index 00000000..8366e1d7
--- /dev/null
+++ b/packages/ui/components/Footer.tsx
@@ -0,0 +1,138 @@
+import Image from 'next/image';
+import Link from 'next/link';
+import { cn } from '../lib/utils';
+import SocialLinkList, { SocialLink } from './SocialLinkList';
+import { Button, ButtonProps } from './ui/button';
+
+const BottomJsx = ({
+ footerCopyright,
+ className,
+}: {
+ footerCopyright?: string;
+ className?: string;
+}) => (
+
+
+ {footerCopyright ? © {footerCopyright} : null}
+ {footerCopyright ? All rights reserved. : null}
+
+
+);
+
+export type FooterItem = {
+ title: string;
+ slug?: string;
+ href?: string;
+ linkType?: 'internal' | 'external';
+};
+
+export type FooterProps = {
+ logo: { src: string; alt: string };
+ menuItems: Array;
+ socialLinks: Array;
+ footerCTA?: ButtonProps;
+ footerManagedBy: string;
+ footerCopyright?: string;
+ className?: string;
+};
+
+export function Footer(props: FooterProps) {
+ const { logo, menuItems, socialLinks, footerCTA, footerManagedBy, footerCopyright, className } =
+ props;
+
+ return (
+
+ );
+}
diff --git a/packages/ui/components/SocialLinkList.tsx b/packages/ui/components/SocialLinkList.tsx
new file mode 100644
index 00000000..015d2faa
--- /dev/null
+++ b/packages/ui/components/SocialLinkList.tsx
@@ -0,0 +1,100 @@
+import { DiscordIcon } from '../icons/socials/DiscordIcon';
+import { FacebookIcon } from '../icons/socials/FacebookIcon';
+import { GithubIcon } from '../icons/socials/GithubIcon';
+import { InstagramIcon } from '../icons/socials/InstagramIcon';
+import { LinkedInIcon } from '../icons/socials/LinkedInIcon';
+import { RSSIcon } from '../icons/socials/RSSIcon';
+import { RedditIcon } from '../icons/socials/RedditIcon';
+import { SessionIcon } from '../icons/socials/SessionIcon';
+import { TelegramIcon } from '../icons/socials/TelegramIcon';
+import { VimeoIcon } from '../icons/socials/VimeoIcon';
+import { WhatsappIcon } from '../icons/socials/WhatsappIcon';
+import { XIcon } from '../icons/socials/XIcon';
+import { YoutubeIcon } from '../icons/socials/YoutubeIcon';
+import { cn } from '../lib/utils';
+
+export enum Social {
+ Discord = 'discord',
+ Facebook = 'facebook',
+ Github = 'github',
+ Instagram = 'instagram',
+ LinkedIn = 'linkedin',
+ Reddit = 'reddit',
+ RSS = 'rss',
+ Session = 'session',
+ Telegram = 'telegram',
+ Vimeo = 'vimeo',
+ Whatsapp = 'whatsapp',
+ X = 'x',
+ Youtube = 'youtube',
+}
+
+function getSocialIcon(social: Social) {
+ switch (social) {
+ case Social.Discord:
+ return ;
+ case Social.Facebook:
+ return ;
+ case Social.Github:
+ return ;
+ case Social.Instagram:
+ return ;
+ case Social.LinkedIn:
+ return ;
+ case Social.Reddit:
+ return ;
+ case Social.RSS:
+ return ;
+ case Social.Session:
+ return ;
+ case Social.Telegram:
+ return ;
+ case Social.Vimeo:
+ return ;
+ case Social.Whatsapp:
+ return ;
+ case Social.X:
+ return ;
+ case Social.Youtube:
+ return ;
+ default:
+ }
+}
+
+export type SocialLink = {
+ name: Social;
+ link: string;
+};
+
+export type SocialLinkListProps = {
+ socialLinks: Array;
+ className?: string;
+};
+
+export default function SocialLinkList(props: SocialLinkListProps) {
+ const { socialLinks, className } = props;
+
+ return (
+
+ {socialLinks?.map((item, index) => {
+ const { link, name } = item;
+
+ return (
+
+
+ {getSocialIcon(name)}
+
+
+ );
+ })}
+
+ );
+}
diff --git a/packages/ui/icons/SessionTokenIcon.tsx b/packages/ui/icons/SessionTokenIcon.tsx
index dc59e8e9..35c69096 100644
--- a/packages/ui/icons/SessionTokenIcon.tsx
+++ b/packages/ui/icons/SessionTokenIcon.tsx
@@ -18,10 +18,10 @@ export const SessionTokenIcon = forwardRef((props,
y2="199.3"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
+
+
+
+
((props,
gradientTransform="matrix(2.5 0 0 2.7 -486.7 -293.9)"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
((props,
gradientTransform="matrix(1.3 0 0 2.5 -37.4 -268.6)"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
((props,
y2="414.2"
gradientUnits="userSpaceOnUse"
>
-
-
-
+
+
+
((props,
gradientTransform="matrix(2.8 0 0 3.3 -967.7 -199.1)"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
((props,
gradientTransform="matrix(2.6 0 0 2.6 -348.3 -479.8)"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
((props,
/>
-
+
((props,
/>
-
+
((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/FacebookIcon.tsx b/packages/ui/icons/socials/FacebookIcon.tsx
new file mode 100644
index 00000000..9be7853a
--- /dev/null
+++ b/packages/ui/icons/socials/FacebookIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const FacebookIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/GithubIcon.tsx b/packages/ui/icons/socials/GithubIcon.tsx
new file mode 100644
index 00000000..7e09d97f
--- /dev/null
+++ b/packages/ui/icons/socials/GithubIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const GithubIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/InstagramIcon.tsx b/packages/ui/icons/socials/InstagramIcon.tsx
new file mode 100644
index 00000000..8677925d
--- /dev/null
+++ b/packages/ui/icons/socials/InstagramIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const InstagramIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/LinkedInIcon.tsx b/packages/ui/icons/socials/LinkedInIcon.tsx
new file mode 100644
index 00000000..2dae7dfd
--- /dev/null
+++ b/packages/ui/icons/socials/LinkedInIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const LinkedInIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/RSSIcon.tsx b/packages/ui/icons/socials/RSSIcon.tsx
new file mode 100644
index 00000000..6f89fbff
--- /dev/null
+++ b/packages/ui/icons/socials/RSSIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const RSSIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/RedditIcon.tsx b/packages/ui/icons/socials/RedditIcon.tsx
new file mode 100644
index 00000000..bd720527
--- /dev/null
+++ b/packages/ui/icons/socials/RedditIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const RedditIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/SessionIcon.tsx b/packages/ui/icons/socials/SessionIcon.tsx
new file mode 100644
index 00000000..35edf094
--- /dev/null
+++ b/packages/ui/icons/socials/SessionIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const SessionIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/TelegramIcon.tsx b/packages/ui/icons/socials/TelegramIcon.tsx
new file mode 100644
index 00000000..13fc05dc
--- /dev/null
+++ b/packages/ui/icons/socials/TelegramIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const TelegramIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/VimeoIcon.tsx b/packages/ui/icons/socials/VimeoIcon.tsx
new file mode 100644
index 00000000..b98bc86a
--- /dev/null
+++ b/packages/ui/icons/socials/VimeoIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const VimeoIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/WhatsappIcon.tsx b/packages/ui/icons/socials/WhatsappIcon.tsx
new file mode 100644
index 00000000..dfb5934b
--- /dev/null
+++ b/packages/ui/icons/socials/WhatsappIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const WhatsappIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/icons/socials/XIcon.tsx b/packages/ui/icons/socials/XIcon.tsx
new file mode 100644
index 00000000..dc0e51f7
--- /dev/null
+++ b/packages/ui/icons/socials/XIcon.tsx
@@ -0,0 +1,15 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const XIcon = forwardRef((props, ref) => (
+
+
+
+
+
+
+
+
+
+
+));
diff --git a/packages/ui/icons/socials/YoutubeIcon.tsx b/packages/ui/icons/socials/YoutubeIcon.tsx
new file mode 100644
index 00000000..92bc194e
--- /dev/null
+++ b/packages/ui/icons/socials/YoutubeIcon.tsx
@@ -0,0 +1,8 @@
+import { forwardRef } from 'react';
+import { SVGAttributes } from '../types';
+
+export const YoutubeIcon = forwardRef((props, ref) => (
+
+
+
+));
diff --git a/packages/ui/tailwind.config.ts b/packages/ui/tailwind.config.ts
index b19b52c2..9eac24e8 100644
--- a/packages/ui/tailwind.config.ts
+++ b/packages/ui/tailwind.config.ts
@@ -1,9 +1,8 @@
import type { Config } from 'tailwindcss';
export default {
- mode: 'jit',
darkMode: ['class'],
- content: ['./**/*.{ts,tsx}'],
+ content: { relative: true, files: ['./**/*.{ts,tsx}'] },
prefix: '',
theme: {
container: {
diff --git a/packages/wallet/components/WalletButton.tsx b/packages/wallet/components/WalletButton.tsx
index fa2ce3d5..8456268e 100644
--- a/packages/wallet/components/WalletButton.tsx
+++ b/packages/wallet/components/WalletButton.tsx
@@ -37,9 +37,9 @@ export function WalletButton({
disabled={isLoading}
className={cn(
'group',
- 'select-none justify-end overflow-x-hidden',
+ 'select-none justify-end overflow-x-hidden text-xs',
isConnected
- ? 'bg-session-green hover:bg-session-green hover:text-session-black h-full w-full max-w-36 border-2 px-0 py-0 transition-all duration-1000 ease-in-out hover:brightness-110 motion-reduce:transition-none lg:hover:max-w-full lg:focus:max-w-full lg:active:max-w-full'
+ ? 'bg-session-green hover:bg-session-green hover:text-session-black h-full w-full max-w-28 border-2 px-0 py-0 transition-all duration-1000 ease-in-out hover:brightness-110 motion-reduce:transition-none sm:max-w-36 lg:hover:max-w-full lg:focus:max-w-full lg:active:max-w-full'
: 'px-3 py-2',
forceBalanceOpen && 'lg:max-w-full'
)}
@@ -52,7 +52,7 @@ export function WalletButton({
{!hideBalance ? (
-
+
{name}
>
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2d40030f..78a2660f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -125,6 +125,9 @@ importers:
server-only:
specifier: ^0.0.1
version: 0.0.1
+ sharp:
+ specifier: 0.32.6
+ version: 0.32.6
wagmi:
specifier: 2.9.10
version: 2.9.10(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.5(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3)))(@tanstack/query-core@5.32.1)(@tanstack/react-query@5.32.1(react@18.3.1))(@types/react@18.3.1)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.5(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.5(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)
@@ -1820,8 +1823,8 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@panva/hkdf@1.2.0':
- resolution: {integrity: sha512-97ZQvZJ4gJhi24Io6zI+W7B67I82q1I8i3BSzQ4OyZj1z4OW87/ruF26lrMES58inTKLy2KgVIDcx8PU4AaANQ==}
+ '@panva/hkdf@1.2.1':
+ resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==}
'@parcel/watcher-android-arm64@2.4.1':
resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==}
@@ -3431,6 +3434,9 @@ packages:
axobject-query@3.2.1:
resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
+ b4a@1.6.6:
+ resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==}
+
babel-core@7.0.0-bridge.0:
resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==}
peerDependencies:
@@ -3482,6 +3488,21 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ bare-events@2.4.2:
+ resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==}
+
+ bare-fs@2.3.1:
+ resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==}
+
+ bare-os@2.4.0:
+ resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==}
+
+ bare-path@2.1.3:
+ resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==}
+
+ bare-stream@2.1.3:
+ resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==}
+
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -3723,6 +3744,13 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
colorette@1.4.0:
resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==}
@@ -4465,6 +4493,9 @@ packages:
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ fast-fifo@1.3.2:
+ resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
+
fast-glob@3.3.2:
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
engines: {node: '>=8.6.0'}
@@ -4906,6 +4937,9 @@ packages:
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
is-async-function@2.0.0:
resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
engines: {node: '>= 0.4'}
@@ -5313,8 +5347,8 @@ packages:
joi@17.13.1:
resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==}
- jose@4.15.7:
- resolution: {integrity: sha512-L7ioP+JAuZe8v+T5+zVI9Tx8LtU8BL7NxkyDFVMv+Qr3JW0jSoYDedLtodaXwfqMpeCyx4WXFNyu9tJt4WvC1A==}
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -5863,6 +5897,9 @@ packages:
node-addon-api@5.1.0:
resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==}
+ node-addon-api@6.1.0:
+ resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
+
node-addon-api@7.1.0:
resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==}
engines: {node: ^16 || ^18 || >= 20}
@@ -6400,6 +6437,9 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ queue-tick@1.0.1:
+ resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
+
queue@6.0.2:
resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
@@ -6782,6 +6822,10 @@ packages:
resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
engines: {node: '>=8'}
+ sharp@0.32.6:
+ resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==}
+ engines: {node: '>=14.15.0'}
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -6810,6 +6854,9 @@ packages:
simple-get@4.0.1:
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -6931,6 +6978,9 @@ packages:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
+ streamx@2.18.0:
+ resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==}
+
strict-uri-encode@2.0.0:
resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
engines: {node: '>=4'}
@@ -7094,10 +7144,16 @@ packages:
tar-fs@2.1.1:
resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
+ tar-fs@3.0.6:
+ resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==}
+
tar-stream@2.2.0:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
+ tar-stream@3.1.7:
+ resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
+
temp-dir@2.0.0:
resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
engines: {node: '>=8'}
@@ -7131,6 +7187,9 @@ packages:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'}
+ text-decoder@1.1.0:
+ resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==}
+
text-extensions@2.4.0:
resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
engines: {node: '>=8'}
@@ -9556,7 +9615,7 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
- '@panva/hkdf@1.2.0': {}
+ '@panva/hkdf@1.2.1': {}
'@parcel/watcher-android-arm64@2.4.1':
optional: true
@@ -11808,6 +11867,8 @@ snapshots:
dependencies:
dequal: 2.0.3
+ b4a@1.6.6: {}
+
babel-core@7.0.0-bridge.0(@babel/core@7.24.6):
dependencies:
'@babel/core': 7.24.6
@@ -11896,6 +11957,29 @@ snapshots:
balanced-match@1.0.2: {}
+ bare-events@2.4.2:
+ optional: true
+
+ bare-fs@2.3.1:
+ dependencies:
+ bare-events: 2.4.2
+ bare-path: 2.1.3
+ bare-stream: 2.1.3
+ optional: true
+
+ bare-os@2.4.0:
+ optional: true
+
+ bare-path@2.1.3:
+ dependencies:
+ bare-os: 2.4.0
+ optional: true
+
+ bare-stream@2.1.3:
+ dependencies:
+ streamx: 2.18.0
+ optional: true
+
base64-js@1.5.1: {}
better-sqlite3-multiple-ciphers@11.1.2:
@@ -12138,6 +12222,16 @@ snapshots:
color-name@1.1.4: {}
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+
colorette@1.4.0: {}
colorette@2.0.20: {}
@@ -13032,6 +13126,8 @@ snapshots:
fast-deep-equal@3.1.3: {}
+ fast-fifo@1.3.2: {}
+
fast-glob@3.3.2:
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -13488,6 +13584,8 @@ snapshots:
is-arrayish@0.2.1: {}
+ is-arrayish@0.3.2: {}
+
is-async-function@2.0.0:
dependencies:
has-tostringtag: 1.0.2
@@ -14064,7 +14162,7 @@ snapshots:
'@sideway/formula': 3.0.1
'@sideway/pinpoint': 2.0.0
- jose@4.15.7: {}
+ jose@4.15.9: {}
js-tokens@4.0.0: {}
@@ -14695,9 +14793,9 @@ snapshots:
next-auth@4.24.7(next@14.2.3(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.24.6
- '@panva/hkdf': 1.2.0
+ '@panva/hkdf': 1.2.1
cookie: 0.5.0
- jose: 4.15.7
+ jose: 4.15.9
next: 14.2.3(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
oauth: 0.9.15
openid-client: 5.6.5
@@ -14757,6 +14855,8 @@ snapshots:
node-addon-api@5.1.0: {}
+ node-addon-api@6.1.0: {}
+
node-addon-api@7.1.0: {}
node-dir@0.1.17:
@@ -14911,7 +15011,7 @@ snapshots:
openid-client@5.6.5:
dependencies:
- jose: 4.15.7
+ jose: 4.15.9
lru-cache: 6.0.0
object-hash: 2.2.0
oidc-token-hash: 5.0.3
@@ -15229,6 +15329,8 @@ snapshots:
queue-microtask@1.2.3: {}
+ queue-tick@1.0.1: {}
+
queue@6.0.2:
dependencies:
inherits: 2.0.4
@@ -15685,6 +15787,17 @@ snapshots:
dependencies:
kind-of: 6.0.3
+ sharp@0.32.6:
+ dependencies:
+ color: 4.2.3
+ detect-libc: 2.0.3
+ node-addon-api: 6.1.0
+ prebuild-install: 7.1.2
+ semver: 7.6.2
+ simple-get: 4.0.1
+ tar-fs: 3.0.6
+ tunnel-agent: 0.6.0
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
@@ -15712,6 +15825,10 @@ snapshots:
once: 1.4.0
simple-concat: 1.0.1
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+
sisteransi@1.0.5: {}
slash@3.0.0: {}
@@ -15832,6 +15949,14 @@ snapshots:
streamsearch@1.1.0: {}
+ streamx@2.18.0:
+ dependencies:
+ fast-fifo: 1.3.2
+ queue-tick: 1.0.1
+ text-decoder: 1.1.0
+ optionalDependencies:
+ bare-events: 2.4.2
+
strict-uri-encode@2.0.0: {}
string-argv@0.3.2: {}
@@ -16021,6 +16146,14 @@ snapshots:
pump: 3.0.0
tar-stream: 2.2.0
+ tar-fs@3.0.6:
+ dependencies:
+ pump: 3.0.0
+ tar-stream: 3.1.7
+ optionalDependencies:
+ bare-fs: 2.3.1
+ bare-path: 2.1.3
+
tar-stream@2.2.0:
dependencies:
bl: 4.1.0
@@ -16029,6 +16162,12 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
+ tar-stream@3.1.7:
+ dependencies:
+ b4a: 1.6.6
+ fast-fifo: 1.3.2
+ streamx: 2.18.0
+
temp-dir@2.0.0: {}
temp@0.8.4:
@@ -16057,6 +16196,10 @@ snapshots:
glob: 7.2.3
minimatch: 3.1.2
+ text-decoder@1.1.0:
+ dependencies:
+ b4a: 1.6.6
+
text-extensions@2.4.0: {}
text-table@0.2.0: {}