chore: upgrade dependencies

This commit is contained in:
Petri Partio
2025-03-24 08:57:21 +02:00
parent 967b52d8b1
commit adadf8eba2
15 changed files with 76 additions and 2806 deletions

View File

@@ -1,15 +1,43 @@
@tailwind base; @import 'tailwindcss';
@tailwind components;
@tailwind utilities;
@layer utilities { @custom-variant dark (&:is(.dark *));
.text-balance {
@theme {
--breakpoint-*: initial;
--breakpoint-xs: 440px;
--breakpoint-sm: 640px;
--breakpoint-md: 768px;
--breakpoint-lg: 1024px;
--breakpoint-xl: 1280px;
--breakpoint-2xl: 1536px;
--text-xxs: 0.625rem;
}
/*
The default border color has changed to `currentColor` in Tailwind CSS v4,
so we've added these compatibility styles to make sure everything still
looks the same as it did with Tailwind CSS v3.
If we ever want to remove these styles, we need to add an explicit border
color utility to any element that depends on these defaults.
*/
@layer base {
*,
::after,
::before,
::backdrop,
::file-selector-button {
border-color: var(--color-gray-200, currentColor);
}
}
@utility text-balance {
text-wrap: balance; text-wrap: balance;
} }
.text-shadow { @utility text-shadow {
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); text-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
} }
.title-highlight { .title-highlight {
@@ -118,3 +146,7 @@ input[type='checkbox']:focus + .checkbox {
opacity: 20%; opacity: 20%;
animation: fadeInOut 4s ease-in-out infinite; animation: fadeInOut 4s ease-in-out infinite;
} }
button {
cursor: pointer;
}

View File

@@ -30,7 +30,7 @@ export default async function Home() {
<Hero /> <Hero />
<div className="text-shadow py-16 lg:my-24"> <div className="text-shadow py-16 lg:my-24">
<h2 className="mx-auto max-w-screen-xs text-center text-2xl font-extrabold md:max-w-none md:text-3xl"> <h2 className="mx-auto max-w-(--breakpoint-xs) text-center text-2xl font-extrabold md:max-w-none md:text-3xl">
Suosituimmat keskustelunaiheet tänään Suosituimmat keskustelunaiheet tänään
</h2> </h2>

BIN
bun.lockb

Binary file not shown.

View File

@@ -1,5 +1,5 @@
export default function BottomFade() { export default function BottomFade() {
return ( return (
<div className="pointer-events-none fixed bottom-0 left-0 right-0 z-50 h-32 bg-gradient-to-t from-[#070b1e] to-black/0"></div> <div className="pointer-events-none fixed right-0 bottom-0 left-0 z-50 h-32 bg-linear-to-t from-[#070b1e] to-black/0"></div>
); );
} }

View File

@@ -4,18 +4,18 @@ const DELAYS = shuffle([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1
export default function ChannelGrid({ channels }: { channels: Channel[] }) { export default function ChannelGrid({ channels }: { channels: Channel[] }) {
return ( return (
<div className="mt-8 grid gap-3 rounded-3xl border-t border-t-pink-100/10 bg-gradient-to-b from-black/10 to-black/0 p-6 backdrop-blur-sm xs:grid-cols-2 sm:grid-cols-3 md:grid-cols-4 md:p-12"> <div className="xs:grid-cols-2 mt-8 grid gap-3 rounded-3xl border-t border-t-pink-100/10 bg-linear-to-b from-black/10 to-black/0 p-6 backdrop-blur-xs sm:grid-cols-3 md:grid-cols-4 md:p-12">
{channels.map((channel, i) => ( {channels.map((channel, i) => (
<div key={channel.id} className="relative h-[5.5rem]"> <div key={channel.id} className="relative h-[5.5rem]">
<div <div
className="fade-in-out absolute bottom-0 left-0 right-0 top-0 z-0 rounded-[9px] bg-fuchsia-200/40" className="fade-in-out absolute top-0 right-0 bottom-0 left-0 z-0 rounded-[9px] bg-fuchsia-200/40"
style={{ style={{
WebkitMask: 'linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0))', WebkitMask: 'linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0))',
animationDelay: `${DELAYS[i] * 2}s`, animationDelay: `${DELAYS[i] * 2}s`,
}} }}
></div> ></div>
<div <div
className="absolute bottom-0 left-0 right-0 top-0 z-10 m-px rounded-[8px] bg-[#2c0c33]" className="absolute top-0 right-0 bottom-0 left-0 z-10 m-px rounded-[8px] bg-[#2c0c33]"
style={{ WebkitMask: 'linear-gradient(to bottom, rgba(0,0,0,.9), rgba(0,0,0,0))' }} style={{ WebkitMask: 'linear-gradient(to bottom, rgba(0,0,0,.9), rgba(0,0,0,0))' }}
></div> ></div>
<div className="relative z-20 flex flex-col items-center justify-center gap-1 px-3 py-6 font-mono"> <div className="relative z-20 flex flex-col items-center justify-center gap-1 px-3 py-6 font-mono">

View File

@@ -14,7 +14,7 @@ export default function FeatureImage({
return ( return (
<div className="relative rounded-[18px] p-px shadow-2xl"> <div className="relative rounded-[18px] p-px shadow-2xl">
<div <div
className="fade-in-out absolute bottom-0 left-0 right-0 top-0 z-0 rounded-[17px] bg-gradient-to-tr from-[#4d094e] to-pink-500/70 p-[2px]" className="fade-in-out absolute top-0 right-0 bottom-0 left-0 z-0 rounded-[17px] bg-linear-to-tr from-[#4d094e] to-pink-500/70 p-[2px]"
style={{ style={{
WebkitMask: 'linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0))', WebkitMask: 'linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0))',
animationDelay: `${Math.floor(Math.random() * 5) + 1 * 0.5}s`, animationDelay: `${Math.floor(Math.random() * 5) + 1 * 0.5}s`,

View File

@@ -93,12 +93,12 @@ export default function Form() {
</h2> </h2>
<div className="mx-auto my-5 max-w-[300px] gap-2 space-y-2 sm:grid sm:max-w-none sm:grid-cols-4 sm:space-y-0"> <div className="mx-auto my-5 max-w-[300px] gap-2 space-y-2 sm:grid sm:max-w-none sm:grid-cols-4 sm:space-y-0">
<div className="col-span-3 flex rounded-[5px] bg-gradient-to-b from-fuchsia-50/30 to-fuchsia-800/50 md:rounded-[9px]"> <div className="col-span-3 flex rounded-[5px] bg-linear-to-b from-fuchsia-50/30 to-fuchsia-800/50 md:rounded-[9px]">
<input <input
type="email" type="email"
name="email" name="email"
required required
className={`m-px block grow rounded bg-gradient-to-b from-[#0b0b21] to-[#1e092e] px-3 py-2 text-fuchsia-100 placeholder:text-fuchsia-100/25 md:rounded-lg md:px-4 md:py-4 lg:px-5 lg:py-5 lg:text-lg ${isSubmitting ? 'opacity-75' : ''}`} className={`m-px block grow rounded-sm bg-linear-to-b from-[#0b0b21] to-[#1e092e] px-3 py-2 text-fuchsia-100 placeholder:text-fuchsia-100/25 md:rounded-lg md:px-4 md:py-4 lg:px-5 lg:py-5 lg:text-lg ${isSubmitting ? 'opacity-75' : ''}`}
placeholder="minna.meikalainen@example.org" placeholder="minna.meikalainen@example.org"
tabIndex={1} tabIndex={1}
/> />
@@ -107,23 +107,23 @@ export default function Form() {
<button <button
tabIndex={3} tabIndex={3}
type="submit" type="submit"
className="text-shadow bg-button block h-full w-full rounded border border-pink-400 border-b-pink-600 border-t-pink-300 px-3 py-2 font-bold sm:text-base md:rounded-lg md:px-4 md:py-4 lg:px-5 lg:py-5 lg:text-lg" className="text-shadow bg-button block h-full w-full rounded-sm border border-pink-400 border-t-pink-300 border-b-pink-600 px-3 py-2 font-bold sm:text-base md:rounded-lg md:px-4 md:py-4 lg:px-5 lg:py-5 lg:text-lg"
> >
{isSubmitting ? <Spinner /> : 'Liity'} {isSubmitting ? <Spinner /> : 'Liity'}
</button> </button>
</div> </div>
</div> </div>
<label className="flex select-none flex-wrap items-center justify-center gap-2 font-mono text-xxs sm:text-xs"> <label className="text-xxs flex flex-wrap items-center justify-center gap-2 font-mono select-none sm:text-xs">
<div className="relative h-5 w-5"> <div className="relative h-5 w-5">
<input <input
type="checkbox" type="checkbox"
name="terms" name="terms"
required required
className="h-3 w-3 opacity-5 focus:outline-none" className="h-3 w-3 opacity-5 focus:outline-hidden"
tabIndex={2} tabIndex={2}
/> />
<div className="checkbox absolute left-0 top-0 flex h-full w-full items-center justify-center rounded border border-white bg-transparent transition-colors"> <div className="checkbox absolute top-0 left-0 flex h-full w-full items-center justify-center rounded-sm border border-white bg-transparent transition-colors">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" className="h-5 w-5"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" className="h-5 w-5">
<path <path
fillRule="evenodd" fillRule="evenodd"
@@ -159,7 +159,7 @@ export default function Form() {
{message && ( {message && (
<> <>
<div className="text-shadow text-balance rounded-2xl border-t border-t-pink-100/10 bg-gradient-to-b from-black/20 to-black/0 p-10 text-center font-mono text-sm backdrop-blur-sm"> <div className="text-shadow rounded-2xl border-t border-t-pink-100/10 bg-linear-to-b from-black/20 to-black/0 p-10 text-center font-mono text-sm text-balance backdrop-blur-xs">
{message} {message}
</div> </div>
{isSuccess && ( {isSuccess && (

View File

@@ -3,7 +3,7 @@ import Form from './Form';
export default function Hero() { export default function Hero() {
return ( return (
<div className="text-shadow mx-auto flex flex-col items-center justify-center" id="liity"> <div className="text-shadow mx-auto flex flex-col items-center justify-center" id="liity">
<h1 className="my-14 text-center text-2xl font-extrabold leading-tight sm:max-w-[80%] sm:text-3xl md:my-24 md:text-4xl lg:my-32 lg:text-5xl"> <h1 className="my-14 text-center text-2xl leading-tight font-extrabold sm:max-w-[80%] sm:text-3xl md:my-24 md:text-4xl lg:my-32 lg:text-5xl">
Koodiklinikka on Suomen suurin <span className="title-highlight">ohjelmistoalan yhteisö</span>, joka tuo alan Koodiklinikka on Suomen suurin <span className="title-highlight">ohjelmistoalan yhteisö</span>, joka tuo alan
ammattilaiset ja harrastajat yhteen ammattilaiset ja harrastajat yhteen
</h1> </h1>

View File

@@ -22,7 +22,7 @@ export default function Nav() {
}, []); }, []);
return ( return (
<nav className="fixed left-0 top-0 z-50 h-32 w-full"> <nav className="fixed top-0 left-0 z-50 h-32 w-full">
<Wrapper> <Wrapper>
<div className="relative flex items-center justify-between py-5 sm:px-6 md:px-12"> <div className="relative flex items-center justify-between py-5 sm:px-6 md:px-12">
<div className="shrink-0"> <div className="shrink-0">
@@ -40,7 +40,7 @@ export default function Nav() {
<div ref={navRef} className="relative"> <div ref={navRef} className="relative">
<button <button
type="button" type="button"
className="relative top-3 -mr-6 -mt-6 rounded-full bg-black/0 p-6 hover:bg-black/20 lg:hidden" className="relative top-3 -mt-6 -mr-6 rounded-full bg-black/0 p-6 hover:bg-black/20 lg:hidden"
onMouseDown={() => setNavOpen(!navOpen)} onMouseDown={() => setNavOpen(!navOpen)}
> >
<svg <svg
@@ -55,7 +55,7 @@ export default function Nav() {
</svg> </svg>
</button> </button>
<div <div
className={`${navOpen ? 'flex' : 'hidden'} text-shadow absolute right-0 top-12 flex-col divide-white/15 rounded-lg bg-black/90 py-2 text-xs uppercase tracking-widest text-pink-100 backdrop-blur-md lg:static lg:-mr-6 lg:flex lg:flex-row lg:divide-x lg:bg-transparent lg:backdrop-blur-none`} className={`${navOpen ? 'flex' : 'hidden'} text-shadow absolute top-12 right-0 flex-col divide-white/15 rounded-lg bg-black/90 py-2 text-xs tracking-widest text-pink-100 uppercase backdrop-blur-md lg:static lg:-mr-6 lg:flex lg:flex-row lg:divide-x lg:bg-transparent lg:backdrop-blur-none`}
> >
<NavLink href="https://github.com/koodiklinikka">GitHub</NavLink> <NavLink href="https://github.com/koodiklinikka">GitHub</NavLink>
<NavLink href="https://koodiklinikka.slack.com">Slack</NavLink> <NavLink href="https://koodiklinikka.slack.com">Slack</NavLink>

View File

@@ -6,7 +6,7 @@ export default function Spinner() {
fill="none" fill="none"
viewBox="0 0 24 24" viewBox="0 0 24 24"
> >
<circle className="opacity-35" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> <circle className="opacity-35" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
<path <path
fill="currentColor" fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"

2
next-env.d.ts vendored
View File

@@ -2,4 +2,4 @@
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

View File

@@ -12,23 +12,24 @@
}, },
"dependencies": { "dependencies": {
"lodash.shuffle": "4.2.0", "lodash.shuffle": "4.2.0",
"next": "15.0.3", "next": "15.2.3",
"react": "18.3.1", "react": "19.0.0",
"react-confetti": "6.1.0", "react-confetti": "6.4.0",
"react-dom": "^18" "react-dom": "19.0.0"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/postcss": "4.0.15",
"@types/lodash.shuffle": "4.2.9", "@types/lodash.shuffle": "4.2.9",
"@types/node": "22.9.0", "@types/node": "22.13.12",
"@types/react": "18.3.12", "@types/react": "19.0.12",
"@types/react-dom": "18.3.1", "@types/react-dom": "19.0.4",
"eslint": "9.15.0", "eslint": "9.23.0",
"eslint-config-next": "15.0.3", "eslint-config-next": "15.2.3",
"postcss": "8.4.49", "postcss": "8.5.3",
"prettier": "3.3.3", "prettier": "3.5.3",
"prettier-plugin-tailwindcss": "0.6.8", "prettier-plugin-tailwindcss": "0.6.11",
"tailwindcss": "3.4.15", "tailwindcss": "4.0.15",
"typescript": "5.6.3" "typescript": "5.8.2"
}, },
"prettier": { "prettier": {
"printWidth": 120, "printWidth": 120,

View File

@@ -1,7 +1,7 @@
/** @type {import('postcss-load-config').Config} */ /** @type {import('postcss-load-config').Config} */
const config = { const config = {
plugins: { plugins: {
tailwindcss: {}, '@tailwindcss/postcss': {},
}, },
}; };

View File

@@ -1,28 +0,0 @@
import type { Config } from 'tailwindcss';
const config = {
darkMode: ['class'],
content: ['./pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
prefix: '',
plugins: [],
theme: {
screens: {
xs: '440px', // => @media (min-width: 440px) { ... }
sm: '640px', // => @media (min-width: 640px) { ... }
md: '768px', // => @media (min-width: 768px) { ... }
lg: '1024px', // => @media (min-width: 1024px) { ... }
xl: '1280px', // => @media (min-width: 1280px) { ... }
'2xl': '1536px', // => @media (min-width: 1536px) { ... }
},
extend: {
fontSize: {
xxs: '0.625rem',
},
},
},
} satisfies Config;
export default config;

2735
yarn.lock

File diff suppressed because it is too large Load Diff