Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
"playerUpgradeLaunch": "Launch",
"playerUpgradeExtraJump": "Extra Jump",
"playerUpgradeMapPlayerCount": "Player Count",
"playerUpgradeDeathHeadBattery": "Death Head Battery",
"playerUpgradeHealth": "Health Upgrade",
"playerUpgradeCrouchRest": "Crouch Rest",
"playerUpgradeTumbleClimb": "Tumble Climb",
Expand Down
1 change: 1 addition & 0 deletions messages/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
"playerUpgradeLaunch": "Lançamento",
"playerUpgradeExtraJump": "Salto Extra",
"playerUpgradeMapPlayerCount": "Contagem de Jogadores",
"playerUpgradeDeathHeadBattery": "Bateria do Death Head",
"playerUpgradeHealth": "Vida",
"playerUpgradeCrouchRest": "Descanso ao Agachar",
"playerUpgradeTumbleClimb": "Escalada ao Cair",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,4 @@
},
"license": "MIT",
"packageManager": "pnpm@10.33.0"
}
}
3,471 changes: 2,562 additions & 909 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions src/components/dark-mode-toggle.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,14 @@ export function DarkModeToggle() {
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon">
<Sun className="scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90" />
<Moon className="absolute scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0" />
<Sun
className="scale-100 rotate-0 transition-all dark:scale-0
dark:-rotate-90"
/>
<Moon
className="absolute scale-0 rotate-90 transition-all dark:scale-100
dark:rotate-0"
/>
<span className="sr-only">{t('toggle')}</span>
</Button>
</DropdownMenuTrigger>
Expand Down
10 changes: 5 additions & 5 deletions src/components/ui/accordion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ function AccordionTrigger({
<AccordionPrimitive.Trigger
data-slot="accordion-trigger"
className={cn(
`focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start
justify-between gap-4 rounded-md py-4 text-left text-sm font-medium
transition-all outline-none focus-visible:ring-[3px]
`focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1
items-start justify-between gap-4 rounded-md py-4 text-left text-sm
font-medium transition-all outline-none focus-visible:ring-[3px]
disabled:pointer-events-none disabled:opacity-50
[&[data-state=open]>svg]:rotate-180`,
className
Expand All @@ -46,8 +46,8 @@ function AccordionTrigger({
>
{children}
<ChevronDownIcon
className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5
transition-transform duration-200"
className="text-muted-foreground pointer-events-none size-4 shrink-0
translate-y-0.5 transition-transform duration-200"
/>
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>
Expand Down
16 changes: 8 additions & 8 deletions src/components/ui/alert-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ function AlertDialogOverlay({
data-slot="alert-dialog-overlay"
className={cn(
`data-[state=open]:animate-in data-[state=closed]:animate-out
data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50
bg-black/50`,
data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0
z-50 bg-black/50`,
className
)}
{...props}
Expand All @@ -56,12 +56,12 @@ function AlertDialogContent({
<AlertDialogPrimitive.Content
data-slot="alert-dialog-content"
className={cn(
`bg-background data-[state=open]:animate-in data-[state=closed]:animate-out
data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0
data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%]
left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%]
translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200
sm:max-w-lg`,
`bg-background data-[state=open]:animate-in
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid
w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%]
gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg`,
className
)}
{...props}
Expand Down
5 changes: 3 additions & 2 deletions src/components/ui/card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ function CardHeader({ className, ...props }: React.ComponentProps<'div'>) {
<div
data-slot="card-header"
className={cn(
`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start
gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,
`@container/card-header grid auto-rows-min grid-rows-[auto_auto]
items-start gap-1.5 px-6
has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,
className
)}
{...props}
Expand Down
28 changes: 15 additions & 13 deletions src/components/ui/dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ function DialogOverlay({
data-slot="dialog-overlay"
className={cn(
`data-[state=open]:animate-in data-[state=closed]:animate-out
data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50
bg-black/50`,
data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0
z-50 bg-black/50`,
className
)}
{...props}
Expand All @@ -59,23 +59,25 @@ function DialogContent({
<DialogPrimitive.Content
data-slot="dialog-content"
className={cn(
`bg-background data-[state=open]:animate-in data-[state=closed]:animate-out
data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0
data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%]
left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%]
translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200
sm:max-w-lg`,
`bg-background data-[state=open]:animate-in
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid
w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%]
gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg`,
className
)}
{...props}
>
{children}
<DialogPrimitive.Close
className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent
data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs
opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2
focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none
[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
className="ring-offset-background focus:ring-ring
data-[state=open]:bg-accent data-[state=open]:text-muted-foreground
absolute top-4 right-4 rounded-xs opacity-70 transition-opacity
hover:opacity-100 focus:ring-2 focus:ring-offset-2
focus:outline-hidden disabled:pointer-events-none
[&_svg]:pointer-events-none [&_svg]:shrink-0
[&_svg:not([class*='size-'])]:size-4"
>
<XIcon />
<span className="sr-only">Close</span>
Expand Down
53 changes: 31 additions & 22 deletions src/components/ui/dropdown-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@ function DropdownMenuContent({
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2
data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2
data-[side=left]:slide-in-from-right-2
data-[side=right]:slide-in-from-left-2
data-[side=top]:slide-in-from-bottom-2 z-50
max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem]
origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden
overflow-y-auto rounded-md border p-1 shadow-md`,
origin-(--radix-dropdown-menu-content-transform-origin)
overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md`,
className
)}
{...props}
Expand Down Expand Up @@ -88,11 +89,11 @@ function DropdownMenuItem({
dark:data-[variant=destructive]:focus:bg-destructive/20
data-[variant=destructive]:focus:text-destructive
data-[variant=destructive]:*:[svg]:!text-destructive
[&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default
items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none
data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8
[&_svg]:pointer-events-none [&_svg]:shrink-0
[&_svg:not([class*='size-'])]:size-4`,
[&_svg:not([class*='text-'])]:text-muted-foreground relative flex
cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm
outline-hidden select-none data-[disabled]:pointer-events-none
data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none
[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,
className
)}
{...props}
Expand All @@ -110,17 +111,20 @@ function DropdownMenuCheckboxItem({
<DropdownMenuPrimitive.CheckboxItem
data-slot="dropdown-menu-checkbox-item"
className={cn(
`focus:bg-accent focus:text-accent-foreground relative flex cursor-default
items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden
select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50
[&_svg]:pointer-events-none [&_svg]:shrink-0
`focus:bg-accent focus:text-accent-foreground relative flex
cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm
outline-hidden select-none data-[disabled]:pointer-events-none
data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0
[&_svg:not([class*='size-'])]:size-4`,
className
)}
checked={checked}
{...props}
>
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
<span
className="pointer-events-none absolute left-2 flex size-3.5
items-center justify-center"
>
<DropdownMenuPrimitive.ItemIndicator>
<CheckIcon className="size-4" />
</DropdownMenuPrimitive.ItemIndicator>
Expand Down Expand Up @@ -150,16 +154,19 @@ function DropdownMenuRadioItem({
<DropdownMenuPrimitive.RadioItem
data-slot="dropdown-menu-radio-item"
className={cn(
`focus:bg-accent focus:text-accent-foreground relative flex cursor-default
items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden
select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50
[&_svg]:pointer-events-none [&_svg]:shrink-0
`focus:bg-accent focus:text-accent-foreground relative flex
cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm
outline-hidden select-none data-[disabled]:pointer-events-none
data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0
[&_svg:not([class*='size-'])]:size-4`,
className
)}
{...props}
>
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
<span
className="pointer-events-none absolute left-2 flex size-3.5
items-center justify-center"
>
<DropdownMenuPrimitive.ItemIndicator>
<CircleIcon className="size-2 fill-current" />
</DropdownMenuPrimitive.ItemIndicator>
Expand Down Expand Up @@ -237,9 +244,10 @@ function DropdownMenuSubTrigger({
data-slot="dropdown-menu-sub-trigger"
data-inset={inset}
className={cn(
`focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent
data-[state=open]:text-accent-foreground flex cursor-default items-center
rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8`,
`focus:bg-accent focus:text-accent-foreground
data-[state=open]:bg-accent data-[state=open]:text-accent-foreground
flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm
outline-hidden select-none data-[inset]:pl-8`,
className
)}
{...props}
Expand All @@ -262,7 +270,8 @@ function DropdownMenuSubContent({
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95
data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2
data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2
data-[side=left]:slide-in-from-right-2
data-[side=right]:slide-in-from-left-2
data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem]
origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden
rounded-md border p-1 shadow-lg`,
Expand Down
17 changes: 9 additions & 8 deletions src/components/ui/input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
type={type}
data-slot="input"
className={cn(
`file:text-foreground placeholder:text-muted-foreground selection:bg-primary
selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full
min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs
transition-[color,box-shadow] outline-none file:inline-flex file:h-7
file:border-0 file:bg-transparent file:text-sm file:font-medium
disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50
md:text-sm`,
'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',
`file:text-foreground placeholder:text-muted-foreground
selection:bg-primary selection:text-primary-foreground dark:bg-input/30
border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent
px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none
file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm
file:font-medium disabled:pointer-events-none
disabled:cursor-not-allowed disabled:opacity-50 md:text-sm`,
`focus-visible:border-ring focus-visible:ring-ring/50
focus-visible:ring-[3px]`,
`aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40
aria-invalid:border-destructive`,
className
Expand Down
3 changes: 2 additions & 1 deletion src/components/ui/number-ticker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ export function NumberTicker({
<span
ref={ref}
className={cn(
'inline-block font-mono tracking-wider text-black tabular-nums dark:text-white',
`inline-block font-mono tracking-wider text-black tabular-nums
dark:text-white`,
className
)}
{...props}
Expand Down
11 changes: 6 additions & 5 deletions src/components/ui/tooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,19 @@ function TooltipContent({
`bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2
data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2
data-[side=left]:slide-in-from-right-2
data-[side=right]:slide-in-from-left-2
data-[side=top]:slide-in-from-bottom-2 z-50 w-fit
origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs
text-balance`,
origin-(--radix-tooltip-content-transform-origin) rounded-md px-3
py-1.5 text-xs text-balance`,
className
)}
{...props}
>
{children}
<TooltipPrimitive.Arrow
className="bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45
rounded-[2px]"
className="bg-primary fill-primary z-50 size-2.5
translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"
/>
</TooltipPrimitive.Content>
</TooltipPrimitive.Portal>
Expand Down
2 changes: 2 additions & 0 deletions src/consts/upgrades-icon.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { UpgradeType } from '@/hooks/use-player-upgrades'
import {
ArrowBigUp,
Battery,
CircleChevronUp,
Cross,
Zap,
Expand All @@ -22,6 +23,7 @@ import {
export const UPGRADES_ICON: Record<UpgradeType, LucideIcon> = {
playerHealth: Cross,
playerUpgradeCrouchRest: Sofa,
playerUpgradeDeathHeadBattery: Battery,
playerUpgradeHealth: Cross,
playerUpgradeTumbleClimb: Move,
playerUpgradeTumbleWings: Feather,
Expand Down
1 change: 1 addition & 0 deletions src/hooks/use-player-upgrades.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export enum upgradeType {
Launch = 'playerUpgradeLaunch',
ExtraJump = 'playerUpgradeExtraJump',
MapPlayerCount = 'playerUpgradeMapPlayerCount',
DeathHeadBattery = 'playerUpgradeDeathHeadBattery',
Stamina = 'playerUpgradeStamina',
Health = 'playerHealth',
UpgradeHealth = 'playerUpgradeHealth',
Expand Down
1 change: 1 addition & 0 deletions src/model/save-game.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export interface DictionaryOfDictionariesValue {
playerUpgradeStamina: { [key: string]: number }
playerUpgradeExtraJump: { [key: string]: number }
playerUpgradeLaunch: { [key: string]: number }
playerUpgradeDeathHeadBattery?: { [key: string]: number }
playerUpgradeMapPlayerCount: { [key: string]: number }
playerUpgradeSpeed: { [key: string]: number }
playerUpgradeStrength: { [key: string]: number }
Expand Down
14 changes: 3 additions & 11 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
Expand All @@ -23,9 +19,7 @@
}
],
"paths": {
"@/*": [
"./src/*"
]
"@/*": ["./src/*"]
}
},
"include": [
Expand All @@ -35,7 +29,5 @@
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules"
]
"exclude": ["node_modules"]
}
Loading