add hover transition to the footer
All checks were successful
Deploy SSR / deploy (push) Successful in 1m43s
All checks were successful
Deploy SSR / deploy (push) Successful in 1m43s
This commit is contained in:
parent
21e39be003
commit
f705218bfd
244
pnpm-lock.yaml
generated
244
pnpm-lock.yaml
generated
@ -16,28 +16,28 @@ importers:
|
|||||||
version: 2.1.5(react@18.3.1)
|
version: 2.1.5(react@18.3.1)
|
||||||
'@hookform/resolvers':
|
'@hookform/resolvers':
|
||||||
specifier: ^3.9.0
|
specifier: ^3.9.0
|
||||||
version: 3.9.0(react-hook-form@7.53.0)
|
version: 3.9.0(react-hook-form@7.53.0(react@18.3.1))
|
||||||
'@radix-ui/react-avatar':
|
'@radix-ui/react-avatar':
|
||||||
specifier: ^1.1.0
|
specifier: ^1.1.0
|
||||||
version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-icons':
|
'@radix-ui/react-icons':
|
||||||
specifier: ^1.3.0
|
specifier: ^1.3.0
|
||||||
version: 1.3.0(react@18.3.1)
|
version: 1.3.0(react@18.3.1)
|
||||||
'@radix-ui/react-label':
|
'@radix-ui/react-label':
|
||||||
specifier: ^2.1.0
|
specifier: ^2.1.0
|
||||||
version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-scroll-area':
|
'@radix-ui/react-scroll-area':
|
||||||
specifier: ^1.1.0
|
specifier: ^1.1.0
|
||||||
version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-slot':
|
'@radix-ui/react-slot':
|
||||||
specifier: ^1.1.0
|
specifier: ^1.1.0
|
||||||
version: 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
version: 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-toast':
|
'@radix-ui/react-toast':
|
||||||
specifier: ^1.2.1
|
specifier: ^1.2.1
|
||||||
version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-tooltip':
|
'@radix-ui/react-tooltip':
|
||||||
specifier: ^1.1.2
|
specifier: ^1.1.2
|
||||||
version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@tanstack/react-query':
|
'@tanstack/react-query':
|
||||||
specifier: ^5.55.4
|
specifier: ^5.55.4
|
||||||
version: 5.56.2(react@18.3.1)
|
version: 5.56.2(react@18.3.1)
|
||||||
@ -61,7 +61,7 @@ importers:
|
|||||||
version: 1.1.7(@types/react@18.3.5)(dexie@4.0.8)(react@18.3.1)
|
version: 1.1.7(@types/react@18.3.5)(dexie@4.0.8)(react@18.3.1)
|
||||||
framer-motion:
|
framer-motion:
|
||||||
specifier: ^11.5.4
|
specifier: ^11.5.4
|
||||||
version: 11.5.4(react-dom@18.3.1)(react@18.3.1)
|
version: 11.5.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
ky:
|
ky:
|
||||||
specifier: ^1.7.2
|
specifier: ^1.7.2
|
||||||
version: 1.7.2
|
version: 1.7.2
|
||||||
@ -70,13 +70,13 @@ importers:
|
|||||||
version: 0.441.0(react@18.3.1)
|
version: 0.441.0(react@18.3.1)
|
||||||
next:
|
next:
|
||||||
specifier: 14.2.11
|
specifier: 14.2.11
|
||||||
version: 14.2.11(react-dom@18.3.1)(react@18.3.1)
|
version: 14.2.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
next-build-id:
|
next-build-id:
|
||||||
specifier: ^3.0.0
|
specifier: ^3.0.0
|
||||||
version: 3.0.0
|
version: 3.0.0
|
||||||
next-themes:
|
next-themes:
|
||||||
specifier: ^0.3.0
|
specifier: ^0.3.0
|
||||||
version: 0.3.0(react-dom@18.3.1)(react@18.3.1)
|
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
react:
|
react:
|
||||||
specifier: ^18
|
specifier: ^18
|
||||||
version: 18.3.1
|
version: 18.3.1
|
||||||
@ -2087,7 +2087,7 @@ snapshots:
|
|||||||
'@floating-ui/core': 1.6.7
|
'@floating-ui/core': 1.6.7
|
||||||
'@floating-ui/utils': 0.2.7
|
'@floating-ui/utils': 0.2.7
|
||||||
|
|
||||||
'@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1)':
|
'@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@floating-ui/dom': 1.6.10
|
'@floating-ui/dom': 1.6.10
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
@ -2101,7 +2101,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
|
||||||
'@hookform/resolvers@3.9.0(react-hook-form@7.53.0)':
|
'@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))':
|
||||||
dependencies:
|
dependencies:
|
||||||
react-hook-form: 7.53.0(react@18.3.1)
|
react-hook-form: 7.53.0(react@18.3.1)
|
||||||
|
|
||||||
@ -2199,62 +2199,69 @@ snapshots:
|
|||||||
|
|
||||||
'@radix-ui/primitive@1.1.0': {}
|
'@radix-ui/primitive@1.1.0': {}
|
||||||
|
|
||||||
'@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-context@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-context@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-direction@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-direction@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/primitive': 1.1.0
|
'@radix-ui/primitive': 1.1.0
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-icons@1.3.0(react@18.3.1)':
|
'@radix-ui/react-icons@1.3.0(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -2263,161 +2270,178 @@ snapshots:
|
|||||||
'@radix-ui/react-id@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-id@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
'@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
|
||||||
dependencies:
|
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
|
||||||
'@types/react': 18.3.5
|
'@types/react': 18.3.5
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
|
'@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
|
dependencies:
|
||||||
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@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-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1)
|
'@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/rect': 1.1.0
|
'@radix-ui/rect': 1.1.0
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/number': 1.1.0
|
'@radix-ui/number': 1.1.0
|
||||||
'@radix-ui/primitive': 1.1.0
|
'@radix-ui/primitive': 1.1.0
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-slot@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-slot@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/primitive': 1.1.0
|
'@radix-ui/primitive': 1.1.0
|
||||||
'@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
'@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/primitive': 1.1.0
|
'@radix-ui/primitive': 1.1.0
|
||||||
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
'@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/rect': 1.1.0
|
'@radix-ui/rect': 1.1.0
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
|
||||||
'@radix-ui/react-use-size@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
'@radix-ui/react-use-size@1.1.0(@types/react@18.3.5)(react@18.3.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1)
|
||||||
'@types/react': 18.3.5
|
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
optionalDependencies:
|
||||||
'@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)':
|
|
||||||
dependencies:
|
|
||||||
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1)
|
|
||||||
'@types/react': 18.3.5
|
'@types/react': 18.3.5
|
||||||
'@types/react-dom': 18.3.0
|
|
||||||
|
'@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||||
|
dependencies:
|
||||||
|
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@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-dom: 18.3.1(react@18.3.1)
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/react': 18.3.5
|
||||||
|
'@types/react-dom': 18.3.0
|
||||||
|
|
||||||
'@radix-ui/rect@1.1.0': {}
|
'@radix-ui/rect@1.1.0': {}
|
||||||
|
|
||||||
@ -2460,7 +2484,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/semver@7.5.8': {}
|
'@types/semver@7.5.8': {}
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.6.2)':
|
'@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.11.0
|
'@eslint-community/regexpp': 4.11.0
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
||||||
@ -2475,6 +2499,7 @@ snapshots:
|
|||||||
natural-compare: 1.4.0
|
natural-compare: 1.4.0
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
ts-api-utils: 1.3.0(typescript@5.6.2)
|
ts-api-utils: 1.3.0(typescript@5.6.2)
|
||||||
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@ -2487,6 +2512,7 @@ snapshots:
|
|||||||
'@typescript-eslint/visitor-keys': 7.2.0
|
'@typescript-eslint/visitor-keys': 7.2.0
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@ -2503,6 +2529,7 @@ snapshots:
|
|||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
ts-api-utils: 1.3.0(typescript@5.6.2)
|
ts-api-utils: 1.3.0(typescript@5.6.2)
|
||||||
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@ -2519,6 +2546,7 @@ snapshots:
|
|||||||
minimatch: 9.0.3
|
minimatch: 9.0.3
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
ts-api-utils: 1.3.0(typescript@5.6.2)
|
ts-api-utils: 1.3.0(typescript@5.6.2)
|
||||||
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@ -2955,15 +2983,16 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@next/eslint-plugin-next': 14.2.11
|
'@next/eslint-plugin-next': 14.2.11
|
||||||
'@rushstack/eslint-patch': 1.10.4
|
'@rushstack/eslint-patch': 1.10.4
|
||||||
'@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.6.2)
|
'@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
|
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
|
||||||
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
||||||
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0)
|
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0)
|
||||||
eslint-plugin-react: 7.35.2(eslint@8.57.0)
|
eslint-plugin-react: 7.35.2(eslint@8.57.0)
|
||||||
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
|
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
|
||||||
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
@ -2978,38 +3007,39 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0):
|
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nolyfill/is-core-module': 1.0.39
|
'@nolyfill/is-core-module': 1.0.39
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
enhanced-resolve: 5.17.1
|
enhanced-resolve: 5.17.1
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0)
|
||||||
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
|
||||||
fast-glob: 3.3.2
|
fast-glob: 3.3.2
|
||||||
get-tsconfig: 4.8.0
|
get-tsconfig: 4.8.0
|
||||||
is-bun-module: 1.1.0
|
is-bun-module: 1.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
|
optionalDependencies:
|
||||||
|
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@typescript-eslint/parser'
|
- '@typescript-eslint/parser'
|
||||||
- eslint-import-resolver-node
|
- eslint-import-resolver-node
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0):
|
eslint-module-utils@2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
|
||||||
debug: 3.2.7
|
debug: 3.2.7
|
||||||
|
optionalDependencies:
|
||||||
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
|
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0):
|
eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rtsao/scc': 1.1.0
|
'@rtsao/scc': 1.1.0
|
||||||
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
|
||||||
array-includes: 3.1.8
|
array-includes: 3.1.8
|
||||||
array.prototype.findlastindex: 1.2.5
|
array.prototype.findlastindex: 1.2.5
|
||||||
array.prototype.flat: 1.3.2
|
array.prototype.flat: 1.3.2
|
||||||
@ -3018,7 +3048,7 @@ snapshots:
|
|||||||
doctrine: 2.1.0
|
doctrine: 2.1.0
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
|
eslint-module-utils: 2.9.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0)
|
||||||
hasown: 2.0.2
|
hasown: 2.0.2
|
||||||
is-core-module: 2.15.1
|
is-core-module: 2.15.1
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
@ -3028,6 +3058,8 @@ snapshots:
|
|||||||
object.values: 1.2.0
|
object.values: 1.2.0
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
tsconfig-paths: 3.15.0
|
tsconfig-paths: 3.15.0
|
||||||
|
optionalDependencies:
|
||||||
|
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- eslint-import-resolver-typescript
|
- eslint-import-resolver-typescript
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
@ -3195,11 +3227,12 @@ snapshots:
|
|||||||
cross-spawn: 7.0.3
|
cross-spawn: 7.0.3
|
||||||
signal-exit: 4.1.0
|
signal-exit: 4.1.0
|
||||||
|
|
||||||
framer-motion@11.5.4(react-dom@18.3.1)(react@18.3.1):
|
framer-motion@11.5.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
tslib: 2.7.0
|
||||||
|
optionalDependencies:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
tslib: 2.7.0
|
|
||||||
|
|
||||||
fs.realpath@1.0.0: {}
|
fs.realpath@1.0.0: {}
|
||||||
|
|
||||||
@ -3571,12 +3604,12 @@ snapshots:
|
|||||||
|
|
||||||
next-build-id@3.0.0: {}
|
next-build-id@3.0.0: {}
|
||||||
|
|
||||||
next-themes@0.3.0(react-dom@18.3.1)(react@18.3.1):
|
next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
|
||||||
next@14.2.11(react-dom@18.3.1)(react@18.3.1):
|
next@14.2.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@next/env': 14.2.11
|
'@next/env': 14.2.11
|
||||||
'@swc/helpers': 0.5.5
|
'@swc/helpers': 0.5.5
|
||||||
@ -3715,8 +3748,9 @@ snapshots:
|
|||||||
postcss-load-config@4.0.2(postcss@8.4.45):
|
postcss-load-config@4.0.2(postcss@8.4.45):
|
||||||
dependencies:
|
dependencies:
|
||||||
lilconfig: 3.1.2
|
lilconfig: 3.1.2
|
||||||
postcss: 8.4.45
|
|
||||||
yaml: 2.5.1
|
yaml: 2.5.1
|
||||||
|
optionalDependencies:
|
||||||
|
postcss: 8.4.45
|
||||||
|
|
||||||
postcss-nested@6.2.0(postcss@8.4.45):
|
postcss-nested@6.2.0(postcss@8.4.45):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { BeatSaverMap as BSMap } from "@/common/service/types/beatsaver/beatsaver-map";
|
import { BeatSaverMapToken as BSMap } from "@/common/model/token/beatsaver/beat-saver-map-token";
|
||||||
import { Entity } from "dexie";
|
import { Entity } from "dexie";
|
||||||
import Database from "../database";
|
import Database from "../database";
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
||||||
import { ScoreSort } from "@/common/service/score-sort";
|
import { ScoreSort } from "@/common/service/score-sort";
|
||||||
|
|
||||||
@ -8,7 +8,11 @@ export const leaderboards = {
|
|||||||
search: true,
|
search: true,
|
||||||
},
|
},
|
||||||
queries: {
|
queries: {
|
||||||
lookupScores: (player: ScoreSaberPlayer, sort: ScoreSort, page: number) =>
|
lookupScores: (
|
||||||
|
player: ScoreSaberPlayerToken,
|
||||||
|
sort: ScoreSort,
|
||||||
|
page: number,
|
||||||
|
) =>
|
||||||
scoresaberService.lookupPlayerScores({
|
scoresaberService.lookupPlayerScores({
|
||||||
playerId: player.id,
|
playerId: player.id,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
|
57
src/common/model/score/impl/scoresaber-score.ts
Normal file
57
src/common/model/score/impl/scoresaber-score.ts
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import Score from "@/common/model/score/score";
|
||||||
|
import { Modifier } from "@/common/model/score/modifier";
|
||||||
|
import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token";
|
||||||
|
|
||||||
|
export default class ScoreSaberScore extends Score {
|
||||||
|
constructor(
|
||||||
|
score: number,
|
||||||
|
weight: number | undefined,
|
||||||
|
rank: number,
|
||||||
|
worth: number,
|
||||||
|
modifiers: Modifier[],
|
||||||
|
misses: number,
|
||||||
|
badCuts: number,
|
||||||
|
fullCombo: boolean,
|
||||||
|
timestamp: Date,
|
||||||
|
) {
|
||||||
|
super(
|
||||||
|
score,
|
||||||
|
weight,
|
||||||
|
rank,
|
||||||
|
worth,
|
||||||
|
modifiers,
|
||||||
|
misses,
|
||||||
|
badCuts,
|
||||||
|
fullCombo,
|
||||||
|
timestamp,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a {@link ScoreSaberScore} from a {@link ScoreSaberScoreToken}.
|
||||||
|
*
|
||||||
|
* @param token the token to convert
|
||||||
|
*/
|
||||||
|
public static fromToken(token: ScoreSaberScoreToken): ScoreSaberScore {
|
||||||
|
const modifiers: Modifier[] = token.modifiers.split(",").map((mod) => {
|
||||||
|
mod = mod.toUpperCase();
|
||||||
|
const modifier = Modifier[mod as keyof typeof Modifier];
|
||||||
|
if (modifier === undefined) {
|
||||||
|
throw new Error(`Unknown modifier: ${mod}`);
|
||||||
|
}
|
||||||
|
return modifier;
|
||||||
|
});
|
||||||
|
|
||||||
|
return new ScoreSaberScore(
|
||||||
|
token.baseScore,
|
||||||
|
token.weight,
|
||||||
|
token.rank,
|
||||||
|
token.pp,
|
||||||
|
modifiers,
|
||||||
|
token.missedNotes,
|
||||||
|
token.badCuts,
|
||||||
|
token.fullCombo,
|
||||||
|
new Date(token.timeSet),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
18
src/common/model/score/modifier.ts
Normal file
18
src/common/model/score/modifier.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* The score modifiers.
|
||||||
|
*/
|
||||||
|
export enum Modifier {
|
||||||
|
DA = "Disappearing Arrows",
|
||||||
|
FS = "Faster Song",
|
||||||
|
SF = "Super Fast Song",
|
||||||
|
SS = "Slower Song",
|
||||||
|
GN = "Ghost Notes",
|
||||||
|
NA = "No Arrows",
|
||||||
|
NO = "No Obstacles",
|
||||||
|
SA = "Strict Angles",
|
||||||
|
SC = "Small Notes",
|
||||||
|
PM = "Pro Mode",
|
||||||
|
CS = "Fail on Saber Clash",
|
||||||
|
IF = "One Life",
|
||||||
|
BE = "Battery Energy",
|
||||||
|
}
|
116
src/common/model/score/score.ts
Normal file
116
src/common/model/score/score.ts
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
import { Modifier } from "@/common/model/score/modifier";
|
||||||
|
|
||||||
|
export default class Score {
|
||||||
|
/**
|
||||||
|
* The base score for the score.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _score: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The weight of the score, or undefined if not ranked.s
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _weight: number | undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The rank for the score.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _rank: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The worth of the score (this could be pp, ap, cr, etc.),
|
||||||
|
* or undefined if not ranked.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _worth: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The modifiers used on the score.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _modifiers: Modifier[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The amount missed notes.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _misses: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The amount of bad cuts.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _badCuts: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether every note was hit.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _fullCombo: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time the score was set.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private readonly _timestamp: Date;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
score: number,
|
||||||
|
weight: number | undefined,
|
||||||
|
rank: number,
|
||||||
|
worth: number,
|
||||||
|
modifiers: Modifier[],
|
||||||
|
misses: number,
|
||||||
|
badCuts: number,
|
||||||
|
fullCombo: boolean,
|
||||||
|
timestamp: Date,
|
||||||
|
) {
|
||||||
|
this._score = score;
|
||||||
|
this._weight = weight;
|
||||||
|
this._rank = rank;
|
||||||
|
this._worth = worth;
|
||||||
|
this._modifiers = modifiers;
|
||||||
|
this._misses = misses;
|
||||||
|
this._badCuts = badCuts;
|
||||||
|
this._fullCombo = fullCombo;
|
||||||
|
this._timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
get score(): number {
|
||||||
|
return this._score;
|
||||||
|
}
|
||||||
|
|
||||||
|
get weight(): number | undefined {
|
||||||
|
return this._weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
get rank(): number {
|
||||||
|
return this._rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
get worth(): number {
|
||||||
|
return this._worth;
|
||||||
|
}
|
||||||
|
|
||||||
|
get modifiers(): Modifier[] {
|
||||||
|
return this._modifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
get misses(): number {
|
||||||
|
return this._misses;
|
||||||
|
}
|
||||||
|
|
||||||
|
get badCuts(): number {
|
||||||
|
return this._badCuts;
|
||||||
|
}
|
||||||
|
|
||||||
|
get fullCombo(): boolean {
|
||||||
|
return this._fullCombo;
|
||||||
|
}
|
||||||
|
|
||||||
|
get timestamp(): Date {
|
||||||
|
return this._timestamp;
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
export default interface BeatSaverAccount {
|
export default interface BeatSaverAccountToken {
|
||||||
/**
|
/**
|
||||||
* The id of the mapper
|
* The id of the mapper
|
||||||
*/
|
*/
|
@ -1,4 +1,4 @@
|
|||||||
export default interface BeatSaverMapMetadata {
|
export default interface BeatSaverMapMetadataToken {
|
||||||
/**
|
/**
|
||||||
* The bpm of the song.
|
* The bpm of the song.
|
||||||
*/
|
*/
|
@ -1,4 +1,4 @@
|
|||||||
export default interface BeatSaverMapStats {
|
export default interface BeatSaverMapStatsToken {
|
||||||
/**
|
/**
|
||||||
* The amount of time the map has been played.
|
* The amount of time the map has been played.
|
||||||
*/
|
*/
|
24
src/common/model/token/beatsaver/beat-saver-map-token.ts
Normal file
24
src/common/model/token/beatsaver/beat-saver-map-token.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import BeatSaverAccountToken from "./beat-saver-account-token";
|
||||||
|
import BeatSaverMapMetadataToken from "./beat-saver-map-metadata-token";
|
||||||
|
import BeatSaverMapStatsToken from "./beat-saver-map-stats-token";
|
||||||
|
|
||||||
|
export interface BeatSaverMapToken {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
uploader: BeatSaverAccountToken;
|
||||||
|
metadata: BeatSaverMapMetadataToken;
|
||||||
|
stats: BeatSaverMapStatsToken;
|
||||||
|
uploaded: string;
|
||||||
|
automapper: boolean;
|
||||||
|
ranked: boolean;
|
||||||
|
qualified: boolean;
|
||||||
|
// todo: versions
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
lastPublishedAt: string;
|
||||||
|
tags: string[];
|
||||||
|
declaredAi: string;
|
||||||
|
blRanked: boolean;
|
||||||
|
blQualified: boolean;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
export interface ScoreSaberBadge {
|
export interface ScoreSaberBadgeToken {
|
||||||
/**
|
/**
|
||||||
* The description of the badge.
|
* The description of the badge.
|
||||||
*/
|
*/
|
@ -1,4 +1,4 @@
|
|||||||
export default interface ScoreSaberDifficulty {
|
export default interface ScoreSaberDifficultyToken {
|
||||||
leaderboardId: number;
|
leaderboardId: number;
|
||||||
difficulty: number;
|
difficulty: number;
|
||||||
gameMode: string;
|
gameMode: string;
|
@ -1,4 +1,4 @@
|
|||||||
export default interface ScoreSaberLeaderboardPlayerInfo {
|
export default interface ScoreSaberLeaderboardPlayerInfoToken {
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
profilePicture: string;
|
profilePicture: string;
|
@ -0,0 +1,14 @@
|
|||||||
|
import ScoreSaberMetadataToken from "./score-saber-metadata-token";
|
||||||
|
import ScoreSaberScoreToken from "./score-saber-score-token";
|
||||||
|
|
||||||
|
export default interface ScoreSaberLeaderboardScoresPageToken {
|
||||||
|
/**
|
||||||
|
* The scores on this page.
|
||||||
|
*/
|
||||||
|
scores: ScoreSaberScoreToken[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata for the page.
|
||||||
|
*/
|
||||||
|
metadata: ScoreSaberMetadataToken;
|
||||||
|
}
|
@ -1,13 +1,13 @@
|
|||||||
import ScoreSaberDifficulty from "./scoresaber-difficulty";
|
import ScoreSaberDifficultyToken from "./score-saber-difficulty-token";
|
||||||
|
|
||||||
export default interface ScoreSaberLeaderboard {
|
export default interface ScoreSaberLeaderboardToken {
|
||||||
id: number;
|
id: number;
|
||||||
songHash: string;
|
songHash: string;
|
||||||
songName: string;
|
songName: string;
|
||||||
songSubName: string;
|
songSubName: string;
|
||||||
songAuthorName: string;
|
songAuthorName: string;
|
||||||
levelAuthorName: string;
|
levelAuthorName: string;
|
||||||
difficulty: ScoreSaberDifficulty;
|
difficulty: ScoreSaberDifficultyToken;
|
||||||
maxScore: number;
|
maxScore: number;
|
||||||
createdDate: string;
|
createdDate: string;
|
||||||
rankedDate: string;
|
rankedDate: string;
|
||||||
@ -22,5 +22,5 @@ export default interface ScoreSaberLeaderboard {
|
|||||||
plays: boolean;
|
plays: boolean;
|
||||||
dailyPlays: boolean;
|
dailyPlays: boolean;
|
||||||
coverImage: string;
|
coverImage: string;
|
||||||
difficulties: ScoreSaberDifficulty[];
|
difficulties: ScoreSaberDifficultyToken[];
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
export default interface ScoreSaberMetadata {
|
export default interface ScoreSaberMetadataToken {
|
||||||
/**
|
/**
|
||||||
* The total amount of returned results.
|
* The total amount of returned results.
|
||||||
*/
|
*/
|
@ -0,0 +1,14 @@
|
|||||||
|
import ScoreSaberLeaderboardToken from "./score-saber-leaderboard-token";
|
||||||
|
import ScoreSaberScoreToken from "./score-saber-score-token";
|
||||||
|
|
||||||
|
export default interface ScoreSaberPlayerScoreToken {
|
||||||
|
/**
|
||||||
|
* The score of the player score.
|
||||||
|
*/
|
||||||
|
score: ScoreSaberScoreToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The leaderboard the score was set on.
|
||||||
|
*/
|
||||||
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
import ScoreSaberMetadataToken from "./score-saber-metadata-token";
|
||||||
|
import ScoreSaberPlayerScoreToken from "./score-saber-player-score-token";
|
||||||
|
|
||||||
|
export default interface ScoreSaberPlayerScoresPageToken {
|
||||||
|
/**
|
||||||
|
* The scores on this page.
|
||||||
|
*/
|
||||||
|
playerScores: ScoreSaberPlayerScoreToken[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata for the page.
|
||||||
|
*/
|
||||||
|
metadata: ScoreSaberMetadataToken;
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
import ScoreSaberPlayerToken from "./score-saber-player-token";
|
||||||
|
|
||||||
|
export interface ScoreSaberPlayerSearchToken {
|
||||||
|
/**
|
||||||
|
* The players that were found
|
||||||
|
*/
|
||||||
|
players: ScoreSaberPlayerToken[];
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
import { ScoreSaberBadge } from "./scoresaber-badge";
|
import { ScoreSaberBadgeToken } from "./score-saber-badge-token";
|
||||||
import ScoreSaberScoreStats from "./scoresaber-score-stats";
|
import ScoreSaberScoreStatsToken from "./score-saber-score-stats-token";
|
||||||
|
|
||||||
export default interface ScoreSaberPlayer {
|
export default interface ScoreSaberPlayerToken {
|
||||||
/**
|
/**
|
||||||
* The ID of the player.
|
* The ID of the player.
|
||||||
*/
|
*/
|
||||||
@ -50,7 +50,7 @@ export default interface ScoreSaberPlayer {
|
|||||||
/**
|
/**
|
||||||
* The badges the player has.
|
* The badges the player has.
|
||||||
*/
|
*/
|
||||||
badges: ScoreSaberBadge[] | null;
|
badges: ScoreSaberBadgeToken[] | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The previous 50 days of rank history.
|
* The previous 50 days of rank history.
|
||||||
@ -60,7 +60,7 @@ export default interface ScoreSaberPlayer {
|
|||||||
/**
|
/**
|
||||||
* The score stats of the player.
|
* The score stats of the player.
|
||||||
*/
|
*/
|
||||||
scoreStats: ScoreSaberScoreStats;
|
scoreStats: ScoreSaberScoreStatsToken;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The permissions of the player. (bitwise)
|
* The permissions of the player. (bitwise)
|
@ -1,4 +1,4 @@
|
|||||||
export default interface ScoreSaberScoreStats {
|
export default interface ScoreSaberScoreStatsToken {
|
||||||
/**
|
/**
|
||||||
* The total amount of score accumulated over all scores.
|
* The total amount of score accumulated over all scores.
|
||||||
*/
|
*/
|
@ -1,9 +1,9 @@
|
|||||||
import ScoreSaberLeaderboard from "./scoresaber-leaderboard";
|
import ScoreSaberLeaderboardToken from "./score-saber-leaderboard-token";
|
||||||
import ScoreSaberLeaderboardPlayerInfo from "./scoresaber-leaderboard-player-info";
|
import ScoreSaberLeaderboardPlayerInfoToken from "./score-saber-leaderboard-player-info-token";
|
||||||
|
|
||||||
export default interface ScoreSaberScore {
|
export default interface ScoreSaberScoreToken {
|
||||||
id: string;
|
id: string;
|
||||||
leaderboardPlayerInfo: ScoreSaberLeaderboardPlayerInfo;
|
leaderboardPlayerInfo: ScoreSaberLeaderboardPlayerInfoToken;
|
||||||
rank: number;
|
rank: number;
|
||||||
baseScore: number;
|
baseScore: number;
|
||||||
modifiedScore: number;
|
modifiedScore: number;
|
||||||
@ -21,5 +21,5 @@ export default interface ScoreSaberScore {
|
|||||||
deviceHmd: string;
|
deviceHmd: string;
|
||||||
deviceControllerLeft: string;
|
deviceControllerLeft: string;
|
||||||
deviceControllerRight: string;
|
deviceControllerRight: string;
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
||||||
import { db } from "../../database/database";
|
import { db } from "../../database/database";
|
||||||
import Service from "../service";
|
import Service from "../service";
|
||||||
import { BeatSaverMap as BSMap } from "../types/beatsaver/beatsaver-map";
|
import { BeatSaverMapToken as BSMap } from "@/common/model/token/beatsaver/beat-saver-map-token";
|
||||||
|
|
||||||
const API_BASE = "https://api.beatsaver.com";
|
const API_BASE = "https://api.beatsaver.com";
|
||||||
const LOOKUP_MAP_BY_HASH_ENDPOINT = `${API_BASE}/maps/hash/:query`;
|
const LOOKUP_MAP_BY_HASH_ENDPOINT = `${API_BASE}/maps/hash/:query`;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import Service from "../service";
|
import Service from "../service";
|
||||||
import { ScoreSort } from "../score-sort";
|
import { ScoreSort } from "../score-sort";
|
||||||
import ScoreSaberLeaderboardScoresPage from "../types/scoresaber/scoresaber-leaderboard-scores-page";
|
import ScoreSaberLeaderboardScoresPageToken from "@/common/model/token/scoresaber/score-saber-leaderboard-scores-page-token";
|
||||||
import ScoreSaberPlayer from "../types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import ScoreSaberPlayerScoresPage from "../types/scoresaber/scoresaber-player-scores-page";
|
import ScoreSaberPlayerScoresPageToken from "@/common/model/token/scoresaber/score-saber-player-scores-page-token";
|
||||||
import { ScoreSaberPlayerSearch } from "../types/scoresaber/scoresaber-player-search";
|
import { ScoreSaberPlayerSearchToken } from "@/common/model/token/scoresaber/score-saber-player-search-token";
|
||||||
|
|
||||||
const API_BASE = "https://scoresaber.com/api";
|
const API_BASE = "https://scoresaber.com/api";
|
||||||
const SEARCH_PLAYERS_ENDPOINT = `${API_BASE}/players?search=:query`;
|
const SEARCH_PLAYERS_ENDPOINT = `${API_BASE}/players?search=:query`;
|
||||||
@ -26,10 +26,10 @@ class ScoreSaberService extends Service {
|
|||||||
async searchPlayers(
|
async searchPlayers(
|
||||||
query: string,
|
query: string,
|
||||||
useProxy = true,
|
useProxy = true,
|
||||||
): Promise<ScoreSaberPlayerSearch | undefined> {
|
): Promise<ScoreSaberPlayerSearchToken | undefined> {
|
||||||
const before = performance.now();
|
const before = performance.now();
|
||||||
this.log(`Searching for players matching "${query}"...`);
|
this.log(`Searching for players matching "${query}"...`);
|
||||||
const results = await this.fetch<ScoreSaberPlayerSearch>(
|
const results = await this.fetch<ScoreSaberPlayerSearchToken>(
|
||||||
useProxy,
|
useProxy,
|
||||||
SEARCH_PLAYERS_ENDPOINT.replace(":query", query),
|
SEARCH_PLAYERS_ENDPOINT.replace(":query", query),
|
||||||
);
|
);
|
||||||
@ -56,10 +56,10 @@ class ScoreSaberService extends Service {
|
|||||||
async lookupPlayer(
|
async lookupPlayer(
|
||||||
playerId: string,
|
playerId: string,
|
||||||
useProxy = true,
|
useProxy = true,
|
||||||
): Promise<ScoreSaberPlayer | undefined> {
|
): Promise<ScoreSaberPlayerToken | undefined> {
|
||||||
const before = performance.now();
|
const before = performance.now();
|
||||||
this.log(`Looking up player "${playerId}"...`);
|
this.log(`Looking up player "${playerId}"...`);
|
||||||
const response = await this.fetch<ScoreSaberPlayer>(
|
const response = await this.fetch<ScoreSaberPlayerToken>(
|
||||||
useProxy,
|
useProxy,
|
||||||
LOOKUP_PLAYER_ENDPOINT.replace(":id", playerId),
|
LOOKUP_PLAYER_ENDPOINT.replace(":id", playerId),
|
||||||
);
|
);
|
||||||
@ -94,12 +94,12 @@ class ScoreSaberService extends Service {
|
|||||||
page: number;
|
page: number;
|
||||||
search?: string;
|
search?: string;
|
||||||
useProxy?: boolean;
|
useProxy?: boolean;
|
||||||
}): Promise<ScoreSaberPlayerScoresPage | undefined> {
|
}): Promise<ScoreSaberPlayerScoresPageToken | undefined> {
|
||||||
const before = performance.now();
|
const before = performance.now();
|
||||||
this.log(
|
this.log(
|
||||||
`Looking up scores for player "${playerId}", sort "${sort}", page "${page}"${search ? `, search "${search}"` : ""}...`,
|
`Looking up scores for player "${playerId}", sort "${sort}", page "${page}"${search ? `, search "${search}"` : ""}...`,
|
||||||
);
|
);
|
||||||
const response = await this.fetch<ScoreSaberPlayerScoresPage>(
|
const response = await this.fetch<ScoreSaberPlayerScoresPageToken>(
|
||||||
useProxy,
|
useProxy,
|
||||||
LOOKUP_PLAYER_SCORES_ENDPOINT.replace(":id", playerId)
|
LOOKUP_PLAYER_SCORES_ENDPOINT.replace(":id", playerId)
|
||||||
.replace(":limit", 8 + "")
|
.replace(":limit", 8 + "")
|
||||||
@ -128,12 +128,12 @@ class ScoreSaberService extends Service {
|
|||||||
leaderboardId: string,
|
leaderboardId: string,
|
||||||
page: number,
|
page: number,
|
||||||
useProxy = true,
|
useProxy = true,
|
||||||
): Promise<ScoreSaberLeaderboardScoresPage | undefined> {
|
): Promise<ScoreSaberLeaderboardScoresPageToken | undefined> {
|
||||||
const before = performance.now();
|
const before = performance.now();
|
||||||
this.log(
|
this.log(
|
||||||
`Looking up scores for leaderboard "${leaderboardId}", page "${page}"...`,
|
`Looking up scores for leaderboard "${leaderboardId}", page "${page}"...`,
|
||||||
);
|
);
|
||||||
const response = await this.fetch<ScoreSaberLeaderboardScoresPage>(
|
const response = await this.fetch<ScoreSaberLeaderboardScoresPageToken>(
|
||||||
useProxy,
|
useProxy,
|
||||||
LOOKUP_LEADERBOARD_SCORES_ENDPOINT.replace(":id", leaderboardId).replace(
|
LOOKUP_LEADERBOARD_SCORES_ENDPOINT.replace(":id", leaderboardId).replace(
|
||||||
":page",
|
":page",
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
import BeatSaverAccount from "./beatsaver-account";
|
|
||||||
import BeatSaverMapMetadata from "./beatsaver-map-metadata";
|
|
||||||
import BeatSaverMapStats from "./beatsaver-map-stats";
|
|
||||||
|
|
||||||
export interface BeatSaverMap {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
description: string;
|
|
||||||
uploader: BeatSaverAccount;
|
|
||||||
metadata: BeatSaverMapMetadata;
|
|
||||||
stats: BeatSaverMapStats;
|
|
||||||
uploaded: string;
|
|
||||||
automapper: boolean;
|
|
||||||
ranked: boolean;
|
|
||||||
qualified: boolean;
|
|
||||||
// todo: versions
|
|
||||||
createdAt: string;
|
|
||||||
updatedAt: string;
|
|
||||||
lastPublishedAt: string;
|
|
||||||
tags: string[];
|
|
||||||
declaredAi: string;
|
|
||||||
blRanked: boolean;
|
|
||||||
blQualified: boolean;
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
import ScoreSaberMetadata from "./scoresaber-metadata";
|
|
||||||
import ScoreSaberScore from "./scoresaber-score";
|
|
||||||
|
|
||||||
export default interface ScoreSaberLeaderboardScoresPage {
|
|
||||||
/**
|
|
||||||
* The scores on this page.
|
|
||||||
*/
|
|
||||||
scores: ScoreSaberScore[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The metadata for the page.
|
|
||||||
*/
|
|
||||||
metadata: ScoreSaberMetadata;
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
import ScoreSaberLeaderboard from "./scoresaber-leaderboard";
|
|
||||||
import ScoreSaberScore from "./scoresaber-score";
|
|
||||||
|
|
||||||
export default interface ScoreSaberPlayerScore {
|
|
||||||
/**
|
|
||||||
* The score of the player score.
|
|
||||||
*/
|
|
||||||
score: ScoreSaberScore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The leaderboard the score was set on.
|
|
||||||
*/
|
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
import ScoreSaberMetadata from "./scoresaber-metadata";
|
|
||||||
import ScoreSaberPlayerScore from "./scoresaber-player-score";
|
|
||||||
|
|
||||||
export default interface ScoreSaberPlayerScoresPage {
|
|
||||||
/**
|
|
||||||
* The scores on this page.
|
|
||||||
*/
|
|
||||||
playerScores: ScoreSaberPlayerScore[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The metadata for the page.
|
|
||||||
*/
|
|
||||||
metadata: ScoreSaberMetadata;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
import ScoreSaberPlayer from "./scoresaber-player";
|
|
||||||
|
|
||||||
export interface ScoreSaberPlayerSearch {
|
|
||||||
/**
|
|
||||||
* The players that were found
|
|
||||||
*/
|
|
||||||
players: ScoreSaberPlayer[];
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
import * as Comlink from "comlink";
|
import * as Comlink from "comlink";
|
||||||
import { WorkerApi } from "@/common/workers/worker";
|
import { WorkerApi } from "@/common/worker/worker";
|
||||||
|
|
||||||
export const scoresaberReloadedWorker = () =>
|
export const scoresaberReloadedWorker = () =>
|
||||||
Comlink.wrap<WorkerApi>(new Worker(new URL("./worker.ts", import.meta.url)));
|
Comlink.wrap<WorkerApi>(new Worker(new URL("./worker.ts", import.meta.url)));
|
@ -32,7 +32,7 @@ export default function Footer() {
|
|||||||
return (
|
return (
|
||||||
<Link
|
<Link
|
||||||
key={index}
|
key={index}
|
||||||
className="px-2 text-pp hover:brightness-75"
|
className="px-2 text-pp hover:brightness-75 transition-all transform-gpu"
|
||||||
href={item.link}
|
href={item.link}
|
||||||
>
|
>
|
||||||
{item.name}
|
{item.name}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import { zodResolver } from "@hookform/resolvers/zod";
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
@ -25,7 +25,7 @@ export default function SearchPlayer() {
|
|||||||
username: "",
|
username: "",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const [results, setResults] = useState<ScoreSaberPlayer[] | undefined>();
|
const [results, setResults] = useState<ScoreSaberPlayerToken[] | undefined>();
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
async function onSubmit({ username }: z.infer<typeof formSchema>) {
|
async function onSubmit({ username }: z.infer<typeof formSchema>) {
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import ScoreSaberScore from "@/common/service/types/scoresaber/scoresaber-score";
|
import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
score: ScoreSaberScore;
|
score: ScoreSaberScoreToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function LeaderboardPlayer({ score }: Props) {
|
export default function LeaderboardPlayer({ score }: Props) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import ScoreSaberLeaderboard from "@/common/service/types/scoresaber/scoresaber-leaderboard";
|
import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token";
|
||||||
import ScoreSaberScore from "@/common/service/types/scoresaber/scoresaber-score";
|
import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token";
|
||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import StatValue from "@/components/stat-value";
|
import StatValue from "@/components/stat-value";
|
||||||
import { XMarkIcon } from "@heroicons/react/24/solid";
|
import { XMarkIcon } from "@heroicons/react/24/solid";
|
||||||
@ -8,15 +8,15 @@ import clsx from "clsx";
|
|||||||
type Badge = {
|
type Badge = {
|
||||||
name: string;
|
name: string;
|
||||||
create: (
|
create: (
|
||||||
score: ScoreSaberScore,
|
score: ScoreSaberScoreToken,
|
||||||
leaderboard: ScoreSaberLeaderboard,
|
leaderboard: ScoreSaberLeaderboardToken,
|
||||||
) => string | React.ReactNode | undefined;
|
) => string | React.ReactNode | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const badges: Badge[] = [
|
const badges: Badge[] = [
|
||||||
{
|
{
|
||||||
name: "PP",
|
name: "PP",
|
||||||
create: (score: ScoreSaberScore) => {
|
create: (score: ScoreSaberScoreToken) => {
|
||||||
const pp = score.pp;
|
const pp = score.pp;
|
||||||
if (pp === 0) {
|
if (pp === 0) {
|
||||||
return undefined;
|
return undefined;
|
||||||
@ -26,14 +26,17 @@ const badges: Badge[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Accuracy",
|
name: "Accuracy",
|
||||||
create: (score: ScoreSaberScore, leaderboard: ScoreSaberLeaderboard) => {
|
create: (
|
||||||
|
score: ScoreSaberScoreToken,
|
||||||
|
leaderboard: ScoreSaberLeaderboardToken,
|
||||||
|
) => {
|
||||||
const acc = (score.baseScore / leaderboard.maxScore) * 100;
|
const acc = (score.baseScore / leaderboard.maxScore) * 100;
|
||||||
return `${acc.toFixed(2)}%`;
|
return `${acc.toFixed(2)}%`;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Full Combo",
|
name: "Full Combo",
|
||||||
create: (score: ScoreSaberScore) => {
|
create: (score: ScoreSaberScoreToken) => {
|
||||||
const fullCombo = score.missedNotes === 0;
|
const fullCombo = score.missedNotes === 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -55,8 +58,8 @@ const badges: Badge[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
score: ScoreSaberScore;
|
score: ScoreSaberScoreToken;
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function LeaderboardScoreStats({ score, leaderboard }: Props) {
|
export default function LeaderboardScoreStats({ score, leaderboard }: Props) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import ScoreSaberLeaderboard from "@/common/service/types/scoresaber/scoresaber-leaderboard";
|
import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token";
|
||||||
import ScoreSaberScore from "@/common/service/types/scoresaber/scoresaber-score";
|
import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token";
|
||||||
import LeaderboardPlayer from "./leaderboard-player";
|
import LeaderboardPlayer from "./leaderboard-player";
|
||||||
import LeaderboardScoreStats from "./leaderboard-score-stats";
|
import LeaderboardScoreStats from "./leaderboard-score-stats";
|
||||||
import ScoreRankInfo from "@/components/score/score-rank-info";
|
import ScoreRankInfo from "@/components/score/score-rank-info";
|
||||||
@ -10,12 +10,12 @@ type Props = {
|
|||||||
/**
|
/**
|
||||||
* The score to display.
|
* The score to display.
|
||||||
*/
|
*/
|
||||||
score: ScoreSaberScore;
|
score: ScoreSaberScoreToken;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The leaderboard to display.
|
* The leaderboard to display.
|
||||||
*/
|
*/
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function LeaderboardScore({ score, leaderboard }: Props) {
|
export default function LeaderboardScore({ score, leaderboard }: Props) {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
||||||
import ScoreSaberLeaderboard from "@/common/service/types/scoresaber/scoresaber-leaderboard";
|
import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token";
|
||||||
import ScoreSaberLeaderboardScoresPage from "@/common/service/types/scoresaber/scoresaber-leaderboard-scores-page";
|
import ScoreSaberLeaderboardScoresPageToken from "@/common/model/token/scoresaber/score-saber-leaderboard-scores-page-token";
|
||||||
import useWindowDimensions from "@/hooks/use-window-dimensions";
|
import useWindowDimensions from "@/hooks/use-window-dimensions";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
@ -12,7 +12,7 @@ import Pagination from "../input/pagination";
|
|||||||
import LeaderboardScore from "./leaderboard-score";
|
import LeaderboardScore from "./leaderboard-score";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function LeaderboardScores({ leaderboard }: Props) {
|
export default function LeaderboardScores({ leaderboard }: Props) {
|
||||||
@ -20,7 +20,7 @@ export default function LeaderboardScores({ leaderboard }: Props) {
|
|||||||
|
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
const [currentScores, setCurrentScores] = useState<
|
const [currentScores, setCurrentScores] = useState<
|
||||||
ScoreSaberLeaderboardScoresPage | undefined
|
ScoreSaberLeaderboardScoresPageToken | undefined
|
||||||
>();
|
>();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
import { scoresaberService } from "@/common/service/impl/scoresaber";
|
||||||
import { ScoreSort } from "@/common/service/score-sort";
|
import { ScoreSort } from "@/common/service/score-sort";
|
||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import ScoreSaberPlayerScoresPage from "@/common/service/types/scoresaber/scoresaber-player-scores-page";
|
import ScoreSaberPlayerScoresPageToken from "@/common/model/token/scoresaber/score-saber-player-scores-page-token";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import PlayerHeader from "./player-header";
|
import PlayerHeader from "./player-header";
|
||||||
import PlayerRankChart from "./player-rank-chart";
|
import PlayerRankChart from "./player-rank-chart";
|
||||||
@ -12,8 +12,8 @@ import PlayerScores from "./player-scores";
|
|||||||
const REFRESH_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
const REFRESH_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
initialPlayerData: ScoreSaberPlayer;
|
initialPlayerData: ScoreSaberPlayerToken;
|
||||||
initialScoreData?: ScoreSaberPlayerScoresPage;
|
initialScoreData?: ScoreSaberPlayerScoresPageToken;
|
||||||
sort: ScoreSort;
|
sort: ScoreSort;
|
||||||
page: number;
|
page: number;
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import { GlobeAmericasIcon } from "@heroicons/react/24/solid";
|
import { GlobeAmericasIcon } from "@heroicons/react/24/solid";
|
||||||
import Card from "../card";
|
import Card from "../card";
|
||||||
@ -13,29 +13,29 @@ const playerData = [
|
|||||||
icon: () => {
|
icon: () => {
|
||||||
return <GlobeAmericasIcon className="h-5 w-5" />;
|
return <GlobeAmericasIcon className="h-5 w-5" />;
|
||||||
},
|
},
|
||||||
render: (player: ScoreSaberPlayer) => {
|
render: (player: ScoreSaberPlayerToken) => {
|
||||||
return <p>#{formatNumberWithCommas(player.rank)}</p>;
|
return <p>#{formatNumberWithCommas(player.rank)}</p>;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
showWhenInactiveOrBanned: false,
|
showWhenInactiveOrBanned: false,
|
||||||
icon: (player: ScoreSaberPlayer) => {
|
icon: (player: ScoreSaberPlayerToken) => {
|
||||||
return <CountryFlag country={player.country.toLowerCase()} size={15} />;
|
return <CountryFlag country={player.country.toLowerCase()} size={15} />;
|
||||||
},
|
},
|
||||||
render: (player: ScoreSaberPlayer) => {
|
render: (player: ScoreSaberPlayerToken) => {
|
||||||
return <p>#{formatNumberWithCommas(player.countryRank)}</p>;
|
return <p>#{formatNumberWithCommas(player.countryRank)}</p>;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
showWhenInactiveOrBanned: true,
|
showWhenInactiveOrBanned: true,
|
||||||
render: (player: ScoreSaberPlayer) => {
|
render: (player: ScoreSaberPlayerToken) => {
|
||||||
return <p className="text-pp">{formatNumberWithCommas(player.pp)}pp</p>;
|
return <p className="text-pp">{formatNumberWithCommas(player.pp)}pp</p>;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
player: ScoreSaberPlayer;
|
player: ScoreSaberPlayerToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function PlayerHeader({ player }: Props) {
|
export default function PlayerHeader({ player }: Props) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import {
|
import {
|
||||||
CategoryScale,
|
CategoryScale,
|
||||||
@ -86,7 +86,7 @@ export const options: any = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
player: ScoreSaberPlayer;
|
player: ScoreSaberPlayerToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function PlayerRankChart({ player }: Props) {
|
export default function PlayerRankChart({ player }: Props) {
|
||||||
|
@ -11,13 +11,13 @@ import Pagination from "../input/pagination";
|
|||||||
import { Button } from "../ui/button";
|
import { Button } from "../ui/button";
|
||||||
import { leaderboards } from "@/common/leaderboards";
|
import { leaderboards } from "@/common/leaderboards";
|
||||||
import { ScoreSort } from "@/common/service/score-sort";
|
import { ScoreSort } from "@/common/service/score-sort";
|
||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
import ScoreSaberPlayerScoresPage from "@/common/service/types/scoresaber/scoresaber-player-scores-page";
|
import ScoreSaberPlayerScoresPageToken from "@/common/model/token/scoresaber/score-saber-player-scores-page-token";
|
||||||
import Score from "@/components/score/score";
|
import Score from "@/components/score/score";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
initialScoreData?: ScoreSaberPlayerScoresPage;
|
initialScoreData?: ScoreSaberPlayerScoresPageToken;
|
||||||
player: ScoreSaberPlayer;
|
player: ScoreSaberPlayerToken;
|
||||||
sort: ScoreSort;
|
sort: ScoreSort;
|
||||||
page: number;
|
page: number;
|
||||||
};
|
};
|
||||||
@ -88,7 +88,7 @@ export default function PlayerScores({
|
|||||||
});
|
});
|
||||||
const [previousPage, setPreviousPage] = useState(page);
|
const [previousPage, setPreviousPage] = useState(page);
|
||||||
const [currentScores, setCurrentScores] = useState<
|
const [currentScores, setCurrentScores] = useState<
|
||||||
ScoreSaberPlayerScoresPage | undefined
|
ScoreSaberPlayerScoresPageToken | undefined
|
||||||
>(initialScoreData);
|
>(initialScoreData);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
@ -1,57 +1,59 @@
|
|||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import StatValue from "@/components/stat-value";
|
import StatValue from "@/components/stat-value";
|
||||||
import ScoreSaberPlayer from "@/common/service/types/scoresaber/scoresaber-player";
|
import ScoreSaberPlayerToken from "@/common/model/token/scoresaber/score-saber-player-token";
|
||||||
|
|
||||||
type Badge = {
|
type Badge = {
|
||||||
name: string;
|
name: string;
|
||||||
color?: string;
|
color?: string;
|
||||||
create: (player: ScoreSaberPlayer) => string | React.ReactNode | undefined;
|
create: (
|
||||||
|
player: ScoreSaberPlayerToken,
|
||||||
|
) => string | React.ReactNode | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const badges: Badge[] = [
|
const badges: Badge[] = [
|
||||||
{
|
{
|
||||||
name: "Ranked Play Count",
|
name: "Ranked Play Count",
|
||||||
color: "bg-pp",
|
color: "bg-pp",
|
||||||
create: (player: ScoreSaberPlayer) => {
|
create: (player: ScoreSaberPlayerToken) => {
|
||||||
return formatNumberWithCommas(player.scoreStats.rankedPlayCount);
|
return formatNumberWithCommas(player.scoreStats.rankedPlayCount);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Total Ranked Score",
|
name: "Total Ranked Score",
|
||||||
color: "bg-pp",
|
color: "bg-pp",
|
||||||
create: (player: ScoreSaberPlayer) => {
|
create: (player: ScoreSaberPlayerToken) => {
|
||||||
return formatNumberWithCommas(player.scoreStats.totalRankedScore);
|
return formatNumberWithCommas(player.scoreStats.totalRankedScore);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Average Ranked Accuracy",
|
name: "Average Ranked Accuracy",
|
||||||
color: "bg-pp",
|
color: "bg-pp",
|
||||||
create: (player: ScoreSaberPlayer) => {
|
create: (player: ScoreSaberPlayerToken) => {
|
||||||
return player.scoreStats.averageRankedAccuracy.toFixed(2) + "%";
|
return player.scoreStats.averageRankedAccuracy.toFixed(2) + "%";
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Total Play Count",
|
name: "Total Play Count",
|
||||||
create: (player: ScoreSaberPlayer) => {
|
create: (player: ScoreSaberPlayerToken) => {
|
||||||
return formatNumberWithCommas(player.scoreStats.totalPlayCount);
|
return formatNumberWithCommas(player.scoreStats.totalPlayCount);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Total Score",
|
name: "Total Score",
|
||||||
create: (player: ScoreSaberPlayer) => {
|
create: (player: ScoreSaberPlayerToken) => {
|
||||||
return formatNumberWithCommas(player.scoreStats.totalScore);
|
return formatNumberWithCommas(player.scoreStats.totalScore);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Total Replays Watched",
|
name: "Total Replays Watched",
|
||||||
create: (player: ScoreSaberPlayer) => {
|
create: (player: ScoreSaberPlayerToken) => {
|
||||||
return formatNumberWithCommas(player.scoreStats.replaysWatched);
|
return formatNumberWithCommas(player.scoreStats.replaysWatched);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
player: ScoreSaberPlayer;
|
player: ScoreSaberPlayerToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function PlayerStats({ player }: Props) {
|
export default function PlayerStats({ player }: Props) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { copyToClipboard } from "@/common/browser-utils";
|
import { copyToClipboard } from "@/common/browser-utils";
|
||||||
import ScoreSaberPlayerScore from "@/common/service/types/scoresaber/scoresaber-player-score";
|
import ScoreSaberPlayerScoreToken from "@/common/model/token/scoresaber/score-saber-player-score-token";
|
||||||
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
||||||
import { songNameToYouTubeLink } from "@/common/youtube-utils";
|
import { songNameToYouTubeLink } from "@/common/youtube-utils";
|
||||||
import BeatSaverLogo from "@/components/logos/beatsaver-logo";
|
import BeatSaverLogo from "@/components/logos/beatsaver-logo";
|
||||||
@ -12,7 +12,7 @@ import LeaderboardButton from "./leaderboard-button";
|
|||||||
import ScoreButton from "./score-button";
|
import ScoreButton from "./score-button";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
playerScore: ScoreSaberPlayerScore;
|
playerScore: ScoreSaberPlayerScoreToken;
|
||||||
beatSaverMap?: BeatSaverMap;
|
beatSaverMap?: BeatSaverMap;
|
||||||
isLeaderboardExpanded: boolean;
|
isLeaderboardExpanded: boolean;
|
||||||
setIsLeaderboardExpanded: Dispatch<SetStateAction<boolean>>;
|
setIsLeaderboardExpanded: Dispatch<SetStateAction<boolean>>;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import ScoreSaberLeaderboard from "@/common/service/types/scoresaber/scoresaber-leaderboard";
|
import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token";
|
||||||
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
||||||
import { getDifficultyFromScoreSaberDifficulty } from "@/common/scoresaber-utils";
|
import { getDifficultyFromScoreSaberDifficulty } from "@/common/scoresaber-utils";
|
||||||
import { songDifficultyToColor } from "@/common/song-utils";
|
import { songDifficultyToColor } from "@/common/song-utils";
|
||||||
@ -9,7 +9,7 @@ import clsx from "clsx";
|
|||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
beatSaverMap?: BeatSaverMap;
|
beatSaverMap?: BeatSaverMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import ScoreSaberScore from "@/common/service/types/scoresaber/scoresaber-score";
|
import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token";
|
||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import { timeAgo } from "@/common/time-utils";
|
import { timeAgo } from "@/common/time-utils";
|
||||||
import { GlobeAmericasIcon } from "@heroicons/react/24/solid";
|
import { GlobeAmericasIcon } from "@heroicons/react/24/solid";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
score: ScoreSaberScore;
|
score: ScoreSaberScoreToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function ScoreRankInfo({ score }: Props) {
|
export default function ScoreRankInfo({ score }: Props) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import ScoreSaberLeaderboard from "@/common/service/types/scoresaber/scoresaber-leaderboard";
|
import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token";
|
||||||
import ScoreSaberScore from "@/common/service/types/scoresaber/scoresaber-score";
|
import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token";
|
||||||
import { formatNumberWithCommas } from "@/common/number-utils";
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
||||||
import StatValue from "@/components/stat-value";
|
import StatValue from "@/components/stat-value";
|
||||||
import { XMarkIcon } from "@heroicons/react/24/solid";
|
import { XMarkIcon } from "@heroicons/react/24/solid";
|
||||||
@ -9,12 +9,12 @@ import { accuracyToColor } from "@/common/song-utils";
|
|||||||
type Badge = {
|
type Badge = {
|
||||||
name: string;
|
name: string;
|
||||||
color?: (
|
color?: (
|
||||||
score: ScoreSaberScore,
|
score: ScoreSaberScoreToken,
|
||||||
leaderboard: ScoreSaberLeaderboard,
|
leaderboard: ScoreSaberLeaderboardToken,
|
||||||
) => string | undefined;
|
) => string | undefined;
|
||||||
create: (
|
create: (
|
||||||
score: ScoreSaberScore,
|
score: ScoreSaberScoreToken,
|
||||||
leaderboard: ScoreSaberLeaderboard,
|
leaderboard: ScoreSaberLeaderboardToken,
|
||||||
) => string | React.ReactNode | undefined;
|
) => string | React.ReactNode | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ const badges: Badge[] = [
|
|||||||
color: () => {
|
color: () => {
|
||||||
return "bg-pp";
|
return "bg-pp";
|
||||||
},
|
},
|
||||||
create: (score: ScoreSaberScore) => {
|
create: (score: ScoreSaberScoreToken) => {
|
||||||
const pp = score.pp;
|
const pp = score.pp;
|
||||||
if (pp === 0) {
|
if (pp === 0) {
|
||||||
return undefined;
|
return undefined;
|
||||||
@ -34,18 +34,24 @@ const badges: Badge[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Accuracy",
|
name: "Accuracy",
|
||||||
color: (score: ScoreSaberScore, leaderboard: ScoreSaberLeaderboard) => {
|
color: (
|
||||||
|
score: ScoreSaberScoreToken,
|
||||||
|
leaderboard: ScoreSaberLeaderboardToken,
|
||||||
|
) => {
|
||||||
const acc = (score.baseScore / leaderboard.maxScore) * 100;
|
const acc = (score.baseScore / leaderboard.maxScore) * 100;
|
||||||
return accuracyToColor(acc);
|
return accuracyToColor(acc);
|
||||||
},
|
},
|
||||||
create: (score: ScoreSaberScore, leaderboard: ScoreSaberLeaderboard) => {
|
create: (
|
||||||
|
score: ScoreSaberScoreToken,
|
||||||
|
leaderboard: ScoreSaberLeaderboardToken,
|
||||||
|
) => {
|
||||||
const acc = (score.baseScore / leaderboard.maxScore) * 100;
|
const acc = (score.baseScore / leaderboard.maxScore) * 100;
|
||||||
return `${acc.toFixed(2)}%`;
|
return `${acc.toFixed(2)}%`;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Score",
|
name: "Score",
|
||||||
create: (score: ScoreSaberScore) => {
|
create: (score: ScoreSaberScoreToken) => {
|
||||||
return `${formatNumberWithCommas(score.baseScore)}`;
|
return `${formatNumberWithCommas(score.baseScore)}`;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -59,7 +65,7 @@ const badges: Badge[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Full Combo",
|
name: "Full Combo",
|
||||||
create: (score: ScoreSaberScore) => {
|
create: (score: ScoreSaberScoreToken) => {
|
||||||
const fullCombo = score.missedNotes === 0;
|
const fullCombo = score.missedNotes === 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -81,8 +87,8 @@ const badges: Badge[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
score: ScoreSaberScore;
|
score: ScoreSaberScoreToken;
|
||||||
leaderboard: ScoreSaberLeaderboard;
|
leaderboard: ScoreSaberLeaderboardToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function ScoreStats({ score, leaderboard }: Props) {
|
export default function ScoreStats({ score, leaderboard }: Props) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { beatsaverService } from "@/common/service/impl/beatsaver";
|
import { beatsaverService } from "@/common/service/impl/beatsaver";
|
||||||
import ScoreSaberPlayerScore from "@/common/service/types/scoresaber/scoresaber-player-score";
|
import ScoreSaberPlayerScoreToken from "@/common/model/token/scoresaber/score-saber-player-score-token";
|
||||||
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
import BeatSaverMap from "@/common/database/types/beatsaver-map";
|
||||||
import LeaderboardScores from "@/components/leaderboard/leaderboard-scores";
|
import LeaderboardScores from "@/components/leaderboard/leaderboard-scores";
|
||||||
import { useCallback, useEffect, useState } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
@ -14,7 +14,7 @@ type Props = {
|
|||||||
/**
|
/**
|
||||||
* The score to display.
|
* The score to display.
|
||||||
*/
|
*/
|
||||||
playerScore: ScoreSaberPlayerScore;
|
playerScore: ScoreSaberPlayerScoreToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Score({ playerScore }: Props) {
|
export default function Score({ playerScore }: Props) {
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
"**/*.tsx",
|
"**/*.tsx",
|
||||||
".next/types/**/*.ts",
|
".next/types/**/*.ts",
|
||||||
"tailwind.config.ts",
|
"tailwind.config.ts",
|
||||||
"src/components/leaderboard/leaderboard-score-statstsx"
|
|
||||||
],
|
],
|
||||||
"exclude": ["node_modules"]
|
"exclude": ["node_modules"]
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user