Compare commits
@@ -1,5 +1,8 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
site-config.json
|
||||||
|
!site-config.json.example
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
/node_modules
|
||||||
/.pnp
|
/.pnp
|
||||||
|
|||||||
+7
-1
@@ -10,7 +10,13 @@ stages:
|
|||||||
script:
|
script:
|
||||||
- echo "Building Docker-image..."
|
- echo "Building Docker-image..."
|
||||||
|
|
||||||
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG -t $CI_REGISTRY_IMAGE:latest .
|
- >
|
||||||
|
docker build
|
||||||
|
--label "org.opencontainers.image.url=$CI_PROJECT_URL"
|
||||||
|
--label "org.opencontainers.image.source=$CI_PROJECT_URL"
|
||||||
|
-t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
|
||||||
|
-t $CI_REGISTRY_IMAGE:latest .
|
||||||
|
|
||||||
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
|
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
|
||||||
- docker push $CI_REGISTRY_IMAGE:latest
|
- docker push $CI_REGISTRY_IMAGE:latest
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ FROM node:alpine AS runner
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
RUN apk add --no-cache tzdata
|
||||||
|
ENV TZ="Europe/Stockholm"
|
||||||
|
|
||||||
RUN mkdir -p data
|
RUN mkdir -p data
|
||||||
|
|
||||||
|
|||||||
+27
-5
@@ -5,8 +5,9 @@
|
|||||||
import { useActionState, useEffect, useState } from 'react';
|
import { useActionState, useEffect, useState } from 'react';
|
||||||
import { FaPlus, FaTrash, FaArrowUp, FaArrowDown } from 'react-icons/fa'; // Importera pilarna
|
import { FaPlus, FaTrash, FaArrowUp, FaArrowDown } from 'react-icons/fa'; // Importera pilarna
|
||||||
import { saveConfigAction } from './actions';
|
import { saveConfigAction } from './actions';
|
||||||
|
import { SiteConfig } from '../lib/config';
|
||||||
|
|
||||||
export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
export default function AdminForm({ initialConfig }: { initialConfig: SiteConfig }) {
|
||||||
const [state, formAction, isPending] = useActionState(saveConfigAction, null);
|
const [state, formAction, isPending] = useActionState(saveConfigAction, null);
|
||||||
const [showToast, setShowToast] = useState(false);
|
const [showToast, setShowToast] = useState(false);
|
||||||
|
|
||||||
@@ -49,9 +50,12 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (state?.success) {
|
if (state?.success) {
|
||||||
setShowToast(true);
|
const showTimer = setTimeout(() => setShowToast(true), 0);
|
||||||
const timer = setTimeout(() => setShowToast(false), 3000);
|
const hideTimer = setTimeout(() => setShowToast(false), 3000);
|
||||||
return () => clearTimeout(timer);
|
return () => {
|
||||||
|
clearTimeout(showTimer);
|
||||||
|
clearTimeout(hideTimer);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}, [state]);
|
}, [state]);
|
||||||
|
|
||||||
@@ -87,9 +91,17 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label className="block text-sm font-bold mb-1">Regeltext (HTML tillåtet)</label>
|
||||||
|
<p className="text-xs text-gray-500 mb-2">
|
||||||
|
Du kan använda <b>{"<a target=\"_blank\" href=\"länk\">text</a>"}</b> för länkar och <b>{"<i>text</i>"}</b> för kursiv text.
|
||||||
|
</p>
|
||||||
|
<textarea name="rulesText" defaultValue={initialConfig.beachPage.rulesText} className="w-full border p-2 rounded h-48" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label className="block text-sm font-bold mb-1">Meddelande vid stängd anmälan</label>
|
<label className="block text-sm font-bold mb-1">Meddelande vid stängd anmälan</label>
|
||||||
<textarea name="closeReason" defaultValue={initialConfig.beachPage.closeReason} className="w-full border p-2 rounded h-20" />
|
<textarea name="closeReason" defaultValue={initialConfig.beachPage.closeReason} className="w-full border p-2 rounded h-32" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@@ -121,6 +133,11 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label className="block text-sm font-bold mb-1">Intro-text ovanför klasserna</label>
|
||||||
|
<textarea name="classesIntroText" defaultValue={initialConfig.beachPage.classesIntroText} className="w-full border p-2 rounded h-16" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
{classes.map((c, index) => (
|
{classes.map((c, index) => (
|
||||||
<div key={index} className="flex flex-col md:flex-row gap-3 items-center w-full">
|
<div key={index} className="flex flex-col md:flex-row gap-3 items-center w-full">
|
||||||
@@ -180,6 +197,11 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="mt-2">
|
||||||
|
<label className="block text-sm font-bold mb-1">Avslutande text under klasserna</label>
|
||||||
|
<textarea name="classesOutroText" defaultValue={initialConfig.beachPage.classesOutroText} className="w-full border p-2 rounded h-16" />
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Dold JSON-sträng för Server Action */}
|
{/* Dold JSON-sträng för Server Action */}
|
||||||
<input type="hidden" name="classesJSON" value={JSON.stringify(classes)} />
|
<input type="hidden" name="classesJSON" value={JSON.stringify(classes)} />
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
import { getConfig, updateConfig } from '../lib/config';
|
import { getConfig, updateConfig } from '../lib/config';
|
||||||
import { revalidatePath } from 'next/cache';
|
import { revalidatePath } from 'next/cache';
|
||||||
|
|
||||||
export async function saveConfigAction(prevState: any, formData: FormData) {
|
export async function saveConfigAction(prevState: { success?: boolean } | null | unknown, formData: FormData) {
|
||||||
const config = await getConfig();
|
const config = await getConfig();
|
||||||
|
|
||||||
let parsedClasses = [];
|
let parsedClasses = [];
|
||||||
@@ -26,6 +26,9 @@ export async function saveConfigAction(prevState: any, formData: FormData) {
|
|||||||
closeReason: formData.get('closeReason') as string,
|
closeReason: formData.get('closeReason') as string,
|
||||||
otherInfo: formData.get('otherInfo') as string,
|
otherInfo: formData.get('otherInfo') as string,
|
||||||
prizesText: formData.get('prizesText') as string,
|
prizesText: formData.get('prizesText') as string,
|
||||||
|
rulesText: formData.get('rulesText') as string,
|
||||||
|
classesIntroText: formData.get('classesIntroText') as string,
|
||||||
|
classesOutroText: formData.get('classesOutroText') as string,
|
||||||
isClosedOverride: formData.get('isClosedOverride') === 'on',
|
isClosedOverride: formData.get('isClosedOverride') === 'on',
|
||||||
classes: parsedClasses,
|
classes: parsedClasses,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,12 @@ import { IoIosMail } from "react-icons/io";
|
|||||||
import Footer from '../components/Footer';
|
import Footer from '../components/Footer';
|
||||||
import Header from '../components/Header';
|
import Header from '../components/Header';
|
||||||
import BeachRegistrationForm from './BeachRegistrationForm';
|
import BeachRegistrationForm from './BeachRegistrationForm';
|
||||||
|
import { SiteConfig } from '../lib/config';
|
||||||
|
import Image from 'next/image';
|
||||||
|
import matsommar from "../../public/images/hk-mosf.webp";
|
||||||
|
|
||||||
export default function BeachClientPage({ config, turnstileSiteKey }: { config: any, turnstileSiteKey: string }) {
|
|
||||||
|
export default function BeachClientPage({ config, turnstileSiteKey }: { config: SiteConfig, turnstileSiteKey: string }) {
|
||||||
const [timeInfo, setTimeInfo] = useState({
|
const [timeInfo, setTimeInfo] = useState({
|
||||||
dateStr: 'Laddar...',
|
dateStr: 'Laddar...',
|
||||||
matchStr: 'Laddar...',
|
matchStr: 'Laddar...',
|
||||||
@@ -54,9 +58,9 @@ export default function BeachClientPage({ config, turnstileSiteKey }: { config:
|
|||||||
{/* Logotyp med subtil hover-effekt */}
|
{/* Logotyp med subtil hover-effekt */}
|
||||||
<div className="relative group cursor-default">
|
<div className="relative group cursor-default">
|
||||||
<div className="absolute -inset-4 bg-white/20 blur-2xl rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-700" />
|
<div className="absolute -inset-4 bg-white/20 blur-2xl rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-700" />
|
||||||
<img
|
<Image
|
||||||
className="w-full max-w-62.5 md:max-w-75 relative drop-shadow-2xl transform hover:scale-105 transition-transform duration-500"
|
className="w-full max-w-62.5 md:max-w-75 relative drop-shadow-2xl transform hover:scale-105 transition-transform duration-500"
|
||||||
src="/images/hk-mosf.webp"
|
src={matsommar}
|
||||||
alt="Mat- & Sommarfesten"
|
alt="Mat- & Sommarfesten"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -130,20 +134,19 @@ export default function BeachClientPage({ config, turnstileSiteKey }: { config:
|
|||||||
<FaClipboardList size={24} />
|
<FaClipboardList size={24} />
|
||||||
<h4 className="font-beachday text-2xl uppercase tracking-[0.05em] text-black">Regler</h4>
|
<h4 className="font-beachday text-2xl uppercase tracking-[0.05em] text-black">Regler</h4>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-gray-700 text-base leading-relaxed">
|
<div
|
||||||
Matcherna spelas 4v4 med <a target="_blank" rel="noreferrer" className="text-[#39979f] font-bold hover:underline" href="https://www.volleyboll.se/forbundet/valkommen-till-volleyboll/grenar-och-spelformer/volleyboll">inomhusregler</a>,
|
className="text-gray-700 text-base leading-relaxed [&_a]:text-[#39979f] [&_a]:font-bold [&_a:hover]:underline [&_i]:italic [&_em]:italic"
|
||||||
förutom poängräkningen som följer reglerna för <a target="_blank" rel="noreferrer" className="text-[#39979f] font-bold hover:underline" href="https://www.volleyboll.se/forbundet/valkommen-till-volleyboll/grenar-och-spelformer/beachvolley">beachvolley</a>.
|
dangerouslySetInnerHTML={{ __html: config.beachPage?.rulesText || "" }}
|
||||||
Turneringsformen som kommer spelas är <span className='italic'>Double Elimination</span> vilket betyder att alla lag spelar minst två matcher under dagen.
|
/>
|
||||||
</p>
|
|
||||||
|
|
||||||
<div className="flex items-center gap-3 text-[#cc8124] mt-6">
|
<div className="flex items-center gap-3 text-[#cc8124] mt-6">
|
||||||
<FaUsers size={24} />
|
<FaUsers size={24} />
|
||||||
<h4 className="font-beachday text-2xl uppercase tracking-[0.05em] text-black">Klasser</h4>
|
<h4 className="font-beachday text-2xl uppercase tracking-[0.05em] text-black">Klasser</h4>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-gray-700 text-sm space-y-3">
|
<div className="text-gray-700 text-sm space-y-3">
|
||||||
<p className="leading-snug">Turneringen kommer att delas upp i flera olika klasser beroende på antal anmälda lag och dess nivå:</p>
|
<p className="leading-snug">{config.beachPage?.classesIntroText}</p>
|
||||||
<div className="flex gap-2 flex-wrap">
|
<div className="flex gap-2 flex-wrap">
|
||||||
{classesData.map((c: any, i: number) => (
|
{classesData.map((c: { name: string; color: string; desc?: string }, i: number) => (
|
||||||
<span
|
<span
|
||||||
key={i}
|
key={i}
|
||||||
className="px-2.5 py-1 rounded-md font-bold border text-xs tracking-wider"
|
className="px-2.5 py-1 rounded-md font-bold border text-xs tracking-wider"
|
||||||
@@ -153,7 +156,7 @@ export default function BeachClientPage({ config, turnstileSiteKey }: { config:
|
|||||||
</span>
|
</span>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p className="italic text-xs text-gray-500">Gör en gissning på er nivå i anmälan – skriv gärna något extra om ni är osäkra. Vi meddelar om det skulle bli ändringar.</p>
|
<p className="italic text-xs text-gray-500">{config.beachPage?.classesOutroText}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -233,6 +236,6 @@ export default function BeachClientPage({ config, turnstileSiteKey }: { config:
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<Footer />
|
<Footer />
|
||||||
</div>
|
</div >
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -3,14 +3,16 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { Turnstile, TurnstileInstance } from '@marsidev/react-turnstile';
|
import { Turnstile, TurnstileInstance } from '@marsidev/react-turnstile';
|
||||||
import React, { useRef, useActionState, useEffect } from 'react';
|
import React, { useRef, useActionState, useEffect, useState } from 'react';
|
||||||
import { FaUser, FaEnvelope, FaPhone, FaUsers, FaTrophy, FaCheckCircle, FaExclamationTriangle } from "react-icons/fa";
|
import { FaUser, FaEnvelope, FaPhone, FaUsers, FaTrophy, FaCheckCircle, FaExclamationTriangle } from "react-icons/fa";
|
||||||
import { submitRegistration } from './actions';
|
import { submitRegistration } from './actions';
|
||||||
|
import { SiteConfig } from '../lib/config';
|
||||||
|
|
||||||
export default function BeachRegistrationForm({ config, turnstileSiteKey }: { config: any, turnstileSiteKey: string }) {
|
export default function BeachRegistrationForm({ config, turnstileSiteKey }: { config: SiteConfig, turnstileSiteKey: string }) {
|
||||||
const [state, formAction, isPending] = useActionState(submitRegistration, null);
|
const [state, formAction, isPending] = useActionState(submitRegistration, null);
|
||||||
const formRef = useRef<HTMLFormElement>(null);
|
const formRef = useRef<HTMLFormElement>(null);
|
||||||
const turnstileRef = useRef<TurnstileInstance>(null);
|
const turnstileRef = useRef<TurnstileInstance>(null);
|
||||||
|
const [token, setToken] = useState<string | null>(null);
|
||||||
|
|
||||||
const classesData = Array.isArray(config.beachPage?.classes)
|
const classesData = Array.isArray(config.beachPage?.classes)
|
||||||
? config.beachPage.classes
|
? config.beachPage.classes
|
||||||
@@ -21,13 +23,13 @@ export default function BeachRegistrationForm({ config, turnstileSiteKey }: { co
|
|||||||
];
|
];
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Rensa endast vid lyckad inskickning
|
|
||||||
if (state?.success) {
|
if (state?.success) {
|
||||||
formRef.current?.reset();
|
formRef.current?.reset();
|
||||||
turnstileRef.current?.reset();
|
turnstileRef.current?.reset();
|
||||||
|
setToken(null);
|
||||||
} else if (state?.success === false) {
|
} else if (state?.success === false) {
|
||||||
// Återställ Turnstile så de kan försöka igen vid fel
|
|
||||||
turnstileRef.current?.reset();
|
turnstileRef.current?.reset();
|
||||||
|
setToken(null);
|
||||||
}
|
}
|
||||||
}, [state]);
|
}, [state]);
|
||||||
|
|
||||||
@@ -107,7 +109,7 @@ export default function BeachRegistrationForm({ config, turnstileSiteKey }: { co
|
|||||||
<div className="flex-2">
|
<div className="flex-2">
|
||||||
<label className="font-bold text-[#39979f] mb-3 block text-sm uppercase">Välj klass</label>
|
<label className="font-bold text-[#39979f] mb-3 block text-sm uppercase">Välj klass</label>
|
||||||
<div className={`grid grid-cols-2 md:grid-cols-${Math.min(classesData.length, 3)} gap-3`}>
|
<div className={`grid grid-cols-2 md:grid-cols-${Math.min(classesData.length, 3)} gap-3`}>
|
||||||
{classesData.map((c: any) => (
|
{classesData.map((c: { name: string; color: string; desc?: string }) => (
|
||||||
<LevelButton
|
<LevelButton
|
||||||
key={c.name}
|
key={c.name}
|
||||||
value={c.name}
|
value={c.name}
|
||||||
@@ -130,7 +132,15 @@ export default function BeachRegistrationForm({ config, turnstileSiteKey }: { co
|
|||||||
|
|
||||||
<input type="text" name="website" className="hidden" tabIndex={-1} />
|
<input type="text" name="website" className="hidden" tabIndex={-1} />
|
||||||
|
|
||||||
<div className="flex justify-center py-2"><Turnstile ref={turnstileRef} siteKey={turnstileSiteKey} options={{ theme: 'light' }}/></div>
|
<div className="flex justify-center py-2">
|
||||||
|
<Turnstile
|
||||||
|
ref={turnstileRef}
|
||||||
|
siteKey={turnstileSiteKey}
|
||||||
|
onSuccess={(token) => setToken(token)}
|
||||||
|
onExpire={() => setToken(null)}
|
||||||
|
options={{ theme: 'light' }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
{state && (
|
{state && (
|
||||||
<div className={`flex items-center gap-3 p-5 rounded-2xl font-bold transition-all ${state.success ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'}`}>
|
<div className={`flex items-center gap-3 p-5 rounded-2xl font-bold transition-all ${state.success ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'}`}>
|
||||||
@@ -141,7 +151,7 @@ export default function BeachRegistrationForm({ config, turnstileSiteKey }: { co
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={isPending}
|
disabled={isPending || !token}
|
||||||
className="w-full py-5 bg-[#39979f] text-white rounded-2xl font-bold text-xl uppercase tracking-wide shadow-xl hover:bg-[#fdb84b] hover:text-[#39979f] transition-all active:scale-[0.98] disabled:bg-gray-300 disabled:text-gray-500"
|
className="w-full py-5 bg-[#39979f] text-white rounded-2xl font-bold text-xl uppercase tracking-wide shadow-xl hover:bg-[#fdb84b] hover:text-[#39979f] transition-all active:scale-[0.98] disabled:bg-gray-300 disabled:text-gray-500"
|
||||||
>
|
>
|
||||||
{isPending ? 'Skickar...' : 'Skicka anmälan'}
|
{isPending ? 'Skickar...' : 'Skicka anmälan'}
|
||||||
@@ -153,7 +163,7 @@ export default function BeachRegistrationForm({ config, turnstileSiteKey }: { co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Uppdaterad med defaultChecked support
|
// Uppdaterad med defaultChecked support
|
||||||
function LevelButton({ value, label, desc, color, defaultChecked }: any) {
|
function LevelButton({ value, label, desc, color, defaultChecked }: { value: string; label: string; desc?: string; color: string; defaultChecked?: boolean }) {
|
||||||
return (
|
return (
|
||||||
<label className="cursor-pointer flex-1 relative" style={{ '--class-color': color } as React.CSSProperties}>
|
<label className="cursor-pointer flex-1 relative" style={{ '--class-color': color } as React.CSSProperties}>
|
||||||
<input
|
<input
|
||||||
@@ -173,7 +183,7 @@ function LevelButton({ value, label, desc, color, defaultChecked }: any) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function InputGroup({ icon, ...props }: any) {
|
function InputGroup({ icon, ...props }: React.InputHTMLAttributes<HTMLInputElement> & { icon: React.ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<div className="relative group">
|
<div className="relative group">
|
||||||
<div className="absolute left-4 top-1/2 -translate-y-1/2 text-[#e6be8a] group-focus-within:text-[#39979f] transition-colors">
|
<div className="absolute left-4 top-1/2 -translate-y-1/2 text-[#e6be8a] group-focus-within:text-[#39979f] transition-colors">
|
||||||
|
|||||||
+14
-8
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
import nodemailer from 'nodemailer';
|
import nodemailer from 'nodemailer';
|
||||||
|
|
||||||
export async function submitRegistration(prevState: any, formData: FormData) {
|
export async function submitRegistration(prevState: unknown, formData: FormData) {
|
||||||
// 1. Spara all rådata direkt för att kunna skicka tillbaka den vid fel
|
// 1. Spara all rådata direkt för att kunna skicka tillbaka den vid fel
|
||||||
const rawData = {
|
const rawData = {
|
||||||
name: formData.get('name') as string,
|
name: formData.get('name') as string,
|
||||||
@@ -41,7 +41,7 @@ export async function submitRegistration(prevState: any, formData: FormData) {
|
|||||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||||
body: new URLSearchParams({
|
body: new URLSearchParams({
|
||||||
secret: secretKey,
|
secret: secretKey,
|
||||||
response: turnstileToken?.toString() || '',
|
response: String(turnstileToken || ''),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ export async function submitRegistration(prevState: any, formData: FormData) {
|
|||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
message: 'Säkerhetsverifieringen misslyckades. Ladda om sidan och försök igen.',
|
message: 'Säkerhetsverifieringen misslyckades. Ladda om sidan och försök igen.',
|
||||||
values: rawData // Returnerar värdena så användaren slipper skriva om dem
|
values: rawData
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -75,10 +75,16 @@ export async function submitRegistration(prevState: any, formData: FormData) {
|
|||||||
|
|
||||||
// 5. Nodemailer setup
|
// 5. Nodemailer setup
|
||||||
const transporter = nodemailer.createTransport({
|
const transporter = nodemailer.createTransport({
|
||||||
host: process.env.SMTP_HOST || 'localhost',
|
host: process.env.SMTP_HOST,
|
||||||
port: 25,
|
port: 587,
|
||||||
secure: false,
|
secure: false,
|
||||||
tls: { rejectUnauthorized: false }
|
auth: {
|
||||||
|
user: process.env.SMTP_USER,
|
||||||
|
pass: process.env.SMTP_PASS,
|
||||||
|
},
|
||||||
|
tls: {
|
||||||
|
rejectUnauthorized: false
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -95,7 +101,7 @@ export async function submitRegistration(prevState: any, formData: FormData) {
|
|||||||
|
|
||||||
// Mail till klubben
|
// Mail till klubben
|
||||||
await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
from: `"Beach-anmälan: ${rawData.name}" <no-reply@lerbergetsvolleyboll.se>`,
|
from: `"Beach-anmälan: ${rawData.name}" <${process.env.SMTP_USER}>`,
|
||||||
to: 'beach@lerbergetsvolleyboll.se',
|
to: 'beach@lerbergetsvolleyboll.se',
|
||||||
replyTo: rawData.email,
|
replyTo: rawData.email,
|
||||||
subject: `Anmälan: ${rawData.team}`,
|
subject: `Anmälan: ${rawData.team}`,
|
||||||
@@ -143,7 +149,7 @@ export async function submitRegistration(prevState: any, formData: FormData) {
|
|||||||
|
|
||||||
// Bekräftelse till användaren
|
// Bekräftelse till användaren
|
||||||
await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
from: `"LVS" <no-reply@lerbergetsvolleyboll.se>`,
|
from: `"LVS" <${process.env.SMTP_USER}>`,
|
||||||
to: rawData.email,
|
to: rawData.email,
|
||||||
replyTo: `"LVS Beach" <beach@lerbergetsvolleyboll.se>`,
|
replyTo: `"LVS Beach" <beach@lerbergetsvolleyboll.se>`,
|
||||||
subject: `Vi har tagit emot din anmälan för ${rawData.team}`,
|
subject: `Vi har tagit emot din anmälan för ${rawData.team}`,
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
// app/components/Header.tsx
|
// app/components/Header.tsx
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import Image from 'next/image';
|
||||||
|
import logo from '../../public/images/logo.svg';
|
||||||
|
|
||||||
export default function Header() {
|
export default function Header() {
|
||||||
return (
|
return (
|
||||||
<header className="bg-black flex justify-center sticky top-0 z-40 shadow-lg">
|
<header className="bg-black flex justify-center sticky top-0 z-40 shadow-lg">
|
||||||
<div className="w-85 mx-auto text-center">
|
<div className="w-fit mx-auto text-center">
|
||||||
<Link href="/" className="inline-block group">
|
<Link href="/" className="inline-block group">
|
||||||
<img
|
<Image
|
||||||
src="/images/logo.svg"
|
src={logo}
|
||||||
|
loading="eager"
|
||||||
alt="Lerbergets Volleybollsällskap"
|
alt="Lerbergets Volleybollsällskap"
|
||||||
className="max-h-32 min-h-16 my-4 md:max-h-52 md:min-h-24 md:my-6 mx-auto block transition-all duration-500 ease-out group-hover:scale-105 group-active:scale-95"
|
className="w-auto max-h-24 min-h-16 my-4 md:max-h-32 md:min-h-24 md:my-6 mx-auto block transition-all duration-500 ease-out group-hover:scale-105 group-active:scale-95"
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ import MemberModal from './Modals/Member';
|
|||||||
import SubscribeModal from './Modals/Subscribe';
|
import SubscribeModal from './Modals/Subscribe';
|
||||||
import { FaFacebookSquare, FaInstagram } from "react-icons/fa";
|
import { FaFacebookSquare, FaInstagram } from "react-icons/fa";
|
||||||
import { IoIosMail } from "react-icons/io";
|
import { IoIosMail } from "react-icons/io";
|
||||||
|
import Image from 'next/image';
|
||||||
|
import player from "../../public/images/player.svg";
|
||||||
|
import laget from "../../public/images/laget.se.svg";
|
||||||
|
|
||||||
export default function HomeClientContent() {
|
export default function HomeClientContent() {
|
||||||
const [activeModal, setActiveModal] = useState<'member' | 'subscribe' | null>(null);
|
const [activeModal, setActiveModal] = useState<'member' | 'subscribe' | null>(null);
|
||||||
@@ -36,7 +39,7 @@ export default function HomeClientContent() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="hidden md:flex md:relative w-64 md:w-75 player-animation">
|
<div className="hidden md:flex md:relative w-64 md:w-75 player-animation">
|
||||||
<img src="/images/player.svg" alt="Spelare" className="w-full h-auto" />
|
<Image src={player} alt="Spelare" className="w-full h-auto" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -73,7 +76,7 @@ export default function HomeClientContent() {
|
|||||||
</SocialIcon>
|
</SocialIcon>
|
||||||
|
|
||||||
<SocialIcon title="Laget.se" href="https://www.laget.se/LVS">
|
<SocialIcon title="Laget.se" href="https://www.laget.se/LVS">
|
||||||
<img src="/images/laget.se.svg" alt="Laget.se" className="h-18 w-18" />
|
<Image src={laget} alt="Laget.se" className="h-18 w-18" />
|
||||||
</SocialIcon>
|
</SocialIcon>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,13 @@
|
|||||||
import { ModalProps } from "@/app/types";
|
import { ModalProps } from "@/app/types";
|
||||||
import Modal from "./Modal";
|
import Modal from "./Modal";
|
||||||
import ModalAction from "./ModalAction";
|
import ModalAction from "./ModalAction";
|
||||||
|
import Image from 'next/image';
|
||||||
|
import logo from "../../../public/images/logo-black.svg";
|
||||||
|
|
||||||
export default function MemberModal({ onClose }: ModalProps) {
|
export default function MemberModal({ onClose }: ModalProps) {
|
||||||
return (
|
return (
|
||||||
<Modal onClose={onClose}>
|
<Modal onClose={onClose}>
|
||||||
<img src="/images/logo-black.svg" alt="Logo" className="h-25" />
|
<Image src={logo} alt="Logo" className="h-25 max-w-fit" />
|
||||||
<h2 className="text-[#406185] my-2.5 text-2xl font-bold uppercase">Registrera dig</h2>
|
<h2 className="text-[#406185] my-2.5 text-2xl font-bold uppercase">Registrera dig</h2>
|
||||||
<p className="text-[#406185] my-2.5">Trycka på knappen nedan för att starta registreringen. Du kommer att skickas till laget.se</p>
|
<p className="text-[#406185] my-2.5">Trycka på knappen nedan för att starta registreringen. Du kommer att skickas till laget.se</p>
|
||||||
|
|
||||||
|
|||||||
+21
-2
@@ -5,11 +5,27 @@ import path from 'node:path';
|
|||||||
|
|
||||||
const configPath = path.join(process.cwd(), 'data', 'site-config.json');
|
const configPath = path.join(process.cwd(), 'data', 'site-config.json');
|
||||||
|
|
||||||
|
export interface SiteConfig {
|
||||||
|
showBeachPromo: boolean;
|
||||||
|
beachPage: {
|
||||||
|
matchStart: string;
|
||||||
|
festivalLink: string;
|
||||||
|
closeReason: string;
|
||||||
|
otherInfo: string;
|
||||||
|
prizesText: string;
|
||||||
|
rulesText?: string;
|
||||||
|
classesIntroText?: string;
|
||||||
|
classesOutroText?: string;
|
||||||
|
isClosedOverride: boolean;
|
||||||
|
classes: Array<{ name: string; color: string; desc: string }>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export async function getConfig() {
|
export async function getConfig() {
|
||||||
try {
|
try {
|
||||||
const data = await fs.readFile(configPath, 'utf-8');
|
const data = await fs.readFile(configPath, 'utf-8');
|
||||||
return JSON.parse(data);
|
return JSON.parse(data);
|
||||||
} catch (error) {
|
} catch {
|
||||||
return {
|
return {
|
||||||
showBeachPromo: true,
|
showBeachPromo: true,
|
||||||
beachPage: {
|
beachPage: {
|
||||||
@@ -17,6 +33,9 @@ export async function getConfig() {
|
|||||||
isClosedOverride: false,
|
isClosedOverride: false,
|
||||||
closeReason: "Det är hela 26 lag anmälda och vi kan tyvärr inte ta emot fler anmälningar.\r\n\r\nVi är glada över förväntan och bjuder in alla andra till att komma och kolla men vi har tyvärr inte kapaciteten till att ha med fler lag.",
|
closeReason: "Det är hela 26 lag anmälda och vi kan tyvärr inte ta emot fler anmälningar.\r\n\r\nVi är glada över förväntan och bjuder in alla andra till att komma och kolla men vi har tyvärr inte kapaciteten till att ha med fler lag.",
|
||||||
festivalLink: "https://www.kullahalvon.com/upptacka--uppleva/kultur--noje/evenemang-pa-kullahalvon/mat---sommarfesten.html",
|
festivalLink: "https://www.kullahalvon.com/upptacka--uppleva/kultur--noje/evenemang-pa-kullahalvon/mat---sommarfesten.html",
|
||||||
|
rulesText: "Matcherna spelas 4v4 med <a target=\"_blank\" href=\"https://www.volleyboll.se/forbundet/valkommen-till-volleyboll/grenar-och-spelformer/volleyboll\">inomhusregler</a>, förutom poängräkningen som följer reglerna för <a target=\"_blank\" href=\"https://www.volleyboll.se/forbundet/valkommen-till-volleyboll/grenar-och-spelformer/beachvolley\">beachvolley</a>. Turneringsformen som kommer spelas är <i>Double Elimination</i> vilket betyder att alla lag spelar minst två matcher under dagen.",
|
||||||
|
classesIntroText: "Turneringen kommer att delas upp i flera olika klasser beroende på antal anmälda lag och dess nivå:",
|
||||||
|
classesOutroText: "Gör en gissning på er nivå i anmälan – skriv gärna något extra om ni är osäkra. Vi meddelar om det skulle bli ändringar.",
|
||||||
otherInfo: "Turneringen uppskattas hålla på till ca 17-18 tiden\r\nDet kommer finnas duschmöjligheter i anslutning till stranden.",
|
otherInfo: "Turneringen uppskattas hålla på till ca 17-18 tiden\r\nDet kommer finnas duschmöjligheter i anslutning till stranden.",
|
||||||
prizesText: "Det kommer att finnas fina priser till alla pallplatser! 🏆"
|
prizesText: "Det kommer att finnas fina priser till alla pallplatser! 🏆"
|
||||||
}
|
}
|
||||||
@@ -25,6 +44,6 @@ export async function getConfig() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export async function updateConfig(newConfig: any) {
|
export async function updateConfig(newConfig: SiteConfig) {
|
||||||
await fs.writeFile(configPath, JSON.stringify(newConfig, null, 2));
|
await fs.writeFile(configPath, JSON.stringify(newConfig, null, 2));
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
import { cookies } from 'next/headers';
|
import { cookies } from 'next/headers';
|
||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
|
|
||||||
export async function loginAction(prevState: any, formData: FormData) {
|
export async function loginAction(prevState: { success?: boolean } | null | unknown, formData: FormData) {
|
||||||
const password = formData.get('password');
|
const password = formData.get('password');
|
||||||
|
|
||||||
if (password === process.env.ADMIN_PASSWORD) {
|
if (password === process.env.ADMIN_PASSWORD) {
|
||||||
|
|||||||
@@ -3,14 +3,17 @@
|
|||||||
"beachPage": {
|
"beachPage": {
|
||||||
"matchStart": "2026-06-13T10:00",
|
"matchStart": "2026-06-13T10:00",
|
||||||
"isClosedOverride": false,
|
"isClosedOverride": false,
|
||||||
"closeReason": "Det är hela 26 lag anmälda och vi kan tyvärr inte ta emot fler anmälningar. Vi är glada över förväntan och bjuder in alla andra till att komma och kolla men vi har tyvärr inte kapaciteten till att ha med fler lag.",
|
"closeReason": "Det är hela 26 lag anmälda och vi kan tyvärr inte ta emot fler anmälningar.\r\n\r\nVi är glada över förväntan och bjuder in alla andra till att komma och kolla men vi har tyvärr inte kapaciteten till att ha med fler lag.",
|
||||||
"festivalLink": "https://www.kullahalvon.com/upptacka--uppleva/kultur--noje/evenemang-pa-kullahalvon/mat---sommarfesten.html",
|
"festivalLink": "https://www.kullahalvon.com/upptacka--uppleva/kultur--noje/evenemang-pa-kullahalvon/mat---sommarfesten.html",
|
||||||
"otherInfo": "Turneringen uppskattas hålla på till ca 17-18 tiden\r\nDet kommer finnas duschmöjligheter i anslutning till stranden.",
|
"rulesText": "Matcherna spelas 4v4 med <a target=\"_blank\" href=\"https://www.volleyboll.se/forbundet/valkommen-till-volleyboll/grenar-och-spelformer/volleyboll\">inomhusregler</a>, förutom poängräkningen som följer reglerna för <a target=\"_blank\" href=\"https://www.volleyboll.se/forbundet/valkommen-till-volleyboll/grenar-och-spelformer/beachvolley\">beachvolley</a>. Turneringsformen som kommer spelas är <i>Double Elimination</i> vilket betyder att alla lag spelar minst två matcher under dagen.",
|
||||||
"prizesText": "Det kommer att finnas fina priser till alla pallplatser!",
|
"classesIntroText": "Turneringen kommer att delas upp i flera olika klasser beroende på antal anmälda lag och dess nivå:",
|
||||||
|
"classesOutroText": "Gör en gissning på er nivå i anmälan – skriv gärna något extra om ni är osäkra. Vi meddelar om det skulle bli ändringar.",
|
||||||
|
"otherInfo": "Turneringen uppskattas hålla på till ca 17-18 tiden\r\nDet kommer finnas duschmöjligheter i anslutning till stranden.\r\nDet kommer fotograferas och filmas under dagen.",
|
||||||
|
"prizesText": "Fina priser väntar för alla som kniper en pallplats!",
|
||||||
"classes": [
|
"classes": [
|
||||||
{
|
{
|
||||||
"name": "Grön",
|
"name": "Grön",
|
||||||
"color": "#07be15",
|
"color": "#16a34a",
|
||||||
"desc": "Nybörjare"
|
"desc": "Nybörjare"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -18,10 +21,15 @@
|
|||||||
"color": "#2563eb",
|
"color": "#2563eb",
|
||||||
"desc": "Spelat lite"
|
"desc": "Spelat lite"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Röd",
|
||||||
|
"color": "#e22400",
|
||||||
|
"desc": "Spelat mycket"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Svart",
|
"name": "Svart",
|
||||||
"color": "#111827",
|
"color": "#111827",
|
||||||
"desc": "Spelat mycket"
|
"desc": "Elit"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,3 +3,5 @@ TURNSTILE_SECRET=1x0000000000000000000000000000000AA
|
|||||||
|
|
||||||
ADMIN_PASSWORD=PASSWORD
|
ADMIN_PASSWORD=PASSWORD
|
||||||
SMTP_HOST=smtp.example.com
|
SMTP_HOST=smtp.example.com
|
||||||
|
SMTP_USER=USER
|
||||||
|
SMTP_PASS=PASSWORD
|
||||||
|
|||||||
Generated
+146
-146
@@ -1332,9 +1332,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/node": {
|
"node_modules/@tailwindcss/node": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
|
||||||
"integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==",
|
"integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1344,37 +1344,37 @@
|
|||||||
"lightningcss": "1.32.0",
|
"lightningcss": "1.32.0",
|
||||||
"magic-string": "^0.30.21",
|
"magic-string": "^0.30.21",
|
||||||
"source-map-js": "^1.2.1",
|
"source-map-js": "^1.2.1",
|
||||||
"tailwindcss": "4.2.2"
|
"tailwindcss": "4.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide": {
|
"node_modules/@tailwindcss/oxide": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
|
||||||
"integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==",
|
"integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 20"
|
"node": ">= 20"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@tailwindcss/oxide-android-arm64": "4.2.2",
|
"@tailwindcss/oxide-android-arm64": "4.2.4",
|
||||||
"@tailwindcss/oxide-darwin-arm64": "4.2.2",
|
"@tailwindcss/oxide-darwin-arm64": "4.2.4",
|
||||||
"@tailwindcss/oxide-darwin-x64": "4.2.2",
|
"@tailwindcss/oxide-darwin-x64": "4.2.4",
|
||||||
"@tailwindcss/oxide-freebsd-x64": "4.2.2",
|
"@tailwindcss/oxide-freebsd-x64": "4.2.4",
|
||||||
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2",
|
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
|
||||||
"@tailwindcss/oxide-linux-arm64-gnu": "4.2.2",
|
"@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
|
||||||
"@tailwindcss/oxide-linux-arm64-musl": "4.2.2",
|
"@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
|
||||||
"@tailwindcss/oxide-linux-x64-gnu": "4.2.2",
|
"@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
|
||||||
"@tailwindcss/oxide-linux-x64-musl": "4.2.2",
|
"@tailwindcss/oxide-linux-x64-musl": "4.2.4",
|
||||||
"@tailwindcss/oxide-wasm32-wasi": "4.2.2",
|
"@tailwindcss/oxide-wasm32-wasi": "4.2.4",
|
||||||
"@tailwindcss/oxide-win32-arm64-msvc": "4.2.2",
|
"@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
|
||||||
"@tailwindcss/oxide-win32-x64-msvc": "4.2.2"
|
"@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-android-arm64": {
|
"node_modules/@tailwindcss/oxide-android-arm64": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
|
||||||
"integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==",
|
"integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -1389,9 +1389,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
|
||||||
"integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==",
|
"integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -1406,9 +1406,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
|
||||||
"integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==",
|
"integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -1423,9 +1423,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
|
||||||
"integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==",
|
"integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -1440,9 +1440,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
|
||||||
"integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==",
|
"integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -1457,9 +1457,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
|
||||||
"integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==",
|
"integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -1477,9 +1477,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
|
||||||
"integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==",
|
"integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -1497,9 +1497,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
|
||||||
"integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==",
|
"integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -1517,9 +1517,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
|
||||||
"integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==",
|
"integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -1537,9 +1537,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
|
||||||
"integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==",
|
"integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
|
||||||
"bundleDependencies": [
|
"bundleDependencies": [
|
||||||
"@napi-rs/wasm-runtime",
|
"@napi-rs/wasm-runtime",
|
||||||
"@emnapi/core",
|
"@emnapi/core",
|
||||||
@@ -1567,9 +1567,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
|
||||||
"integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==",
|
"integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -1584,9 +1584,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
|
||||||
"integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==",
|
"integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -1601,17 +1601,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/postcss": {
|
"node_modules/@tailwindcss/postcss": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz",
|
||||||
"integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==",
|
"integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alloc/quick-lru": "^5.2.0",
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
"@tailwindcss/node": "4.2.2",
|
"@tailwindcss/node": "4.2.4",
|
||||||
"@tailwindcss/oxide": "4.2.2",
|
"@tailwindcss/oxide": "4.2.4",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"tailwindcss": "4.2.2"
|
"tailwindcss": "4.2.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tybys/wasm-util": {
|
"node_modules/@tybys/wasm-util": {
|
||||||
@@ -1687,17 +1687,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz",
|
||||||
"integrity": "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==",
|
"integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/regexpp": "^4.12.2",
|
"@eslint-community/regexpp": "^4.12.2",
|
||||||
"@typescript-eslint/scope-manager": "8.58.2",
|
"@typescript-eslint/scope-manager": "8.59.0",
|
||||||
"@typescript-eslint/type-utils": "8.58.2",
|
"@typescript-eslint/type-utils": "8.59.0",
|
||||||
"@typescript-eslint/utils": "8.58.2",
|
"@typescript-eslint/utils": "8.59.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.58.2",
|
"@typescript-eslint/visitor-keys": "8.59.0",
|
||||||
"ignore": "^7.0.5",
|
"ignore": "^7.0.5",
|
||||||
"natural-compare": "^1.4.0",
|
"natural-compare": "^1.4.0",
|
||||||
"ts-api-utils": "^2.5.0"
|
"ts-api-utils": "^2.5.0"
|
||||||
@@ -1710,7 +1710,7 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@typescript-eslint/parser": "^8.58.2",
|
"@typescript-eslint/parser": "^8.59.0",
|
||||||
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
|
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
|
||||||
"typescript": ">=4.8.4 <6.1.0"
|
"typescript": ">=4.8.4 <6.1.0"
|
||||||
}
|
}
|
||||||
@@ -1726,16 +1726,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz",
|
||||||
"integrity": "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==",
|
"integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "8.58.2",
|
"@typescript-eslint/scope-manager": "8.59.0",
|
||||||
"@typescript-eslint/types": "8.58.2",
|
"@typescript-eslint/types": "8.59.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.58.2",
|
"@typescript-eslint/typescript-estree": "8.59.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.58.2",
|
"@typescript-eslint/visitor-keys": "8.59.0",
|
||||||
"debug": "^4.4.3"
|
"debug": "^4.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1751,14 +1751,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/project-service": {
|
"node_modules/@typescript-eslint/project-service": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz",
|
||||||
"integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==",
|
"integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/tsconfig-utils": "^8.58.2",
|
"@typescript-eslint/tsconfig-utils": "^8.59.0",
|
||||||
"@typescript-eslint/types": "^8.58.2",
|
"@typescript-eslint/types": "^8.59.0",
|
||||||
"debug": "^4.4.3"
|
"debug": "^4.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1773,14 +1773,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz",
|
||||||
"integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==",
|
"integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.58.2",
|
"@typescript-eslint/types": "8.59.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.58.2"
|
"@typescript-eslint/visitor-keys": "8.59.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -1791,9 +1791,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/tsconfig-utils": {
|
"node_modules/@typescript-eslint/tsconfig-utils": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz",
|
||||||
"integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==",
|
"integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1808,15 +1808,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz",
|
||||||
"integrity": "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==",
|
"integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.58.2",
|
"@typescript-eslint/types": "8.59.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.58.2",
|
"@typescript-eslint/typescript-estree": "8.59.0",
|
||||||
"@typescript-eslint/utils": "8.58.2",
|
"@typescript-eslint/utils": "8.59.0",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"ts-api-utils": "^2.5.0"
|
"ts-api-utils": "^2.5.0"
|
||||||
},
|
},
|
||||||
@@ -1833,9 +1833,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz",
|
||||||
"integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==",
|
"integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1847,16 +1847,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz",
|
||||||
"integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==",
|
"integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/project-service": "8.58.2",
|
"@typescript-eslint/project-service": "8.59.0",
|
||||||
"@typescript-eslint/tsconfig-utils": "8.58.2",
|
"@typescript-eslint/tsconfig-utils": "8.59.0",
|
||||||
"@typescript-eslint/types": "8.58.2",
|
"@typescript-eslint/types": "8.59.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.58.2",
|
"@typescript-eslint/visitor-keys": "8.59.0",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"minimatch": "^10.2.2",
|
"minimatch": "^10.2.2",
|
||||||
"semver": "^7.7.3",
|
"semver": "^7.7.3",
|
||||||
@@ -1927,16 +1927,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz",
|
||||||
"integrity": "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==",
|
"integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.9.1",
|
"@eslint-community/eslint-utils": "^4.9.1",
|
||||||
"@typescript-eslint/scope-manager": "8.58.2",
|
"@typescript-eslint/scope-manager": "8.59.0",
|
||||||
"@typescript-eslint/types": "8.58.2",
|
"@typescript-eslint/types": "8.59.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.58.2"
|
"@typescript-eslint/typescript-estree": "8.59.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -1951,13 +1951,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz",
|
||||||
"integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==",
|
"integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.58.2",
|
"@typescript-eslint/types": "8.59.0",
|
||||||
"eslint-visitor-keys": "^5.0.0"
|
"eslint-visitor-keys": "^5.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -2568,9 +2568,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/baseline-browser-mapping": {
|
"node_modules/baseline-browser-mapping": {
|
||||||
"version": "2.10.19",
|
"version": "2.10.21",
|
||||||
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz",
|
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz",
|
||||||
"integrity": "sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==",
|
"integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bin": {
|
"bin": {
|
||||||
"baseline-browser-mapping": "dist/cli.cjs"
|
"baseline-browser-mapping": "dist/cli.cjs"
|
||||||
@@ -2698,9 +2698,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001788",
|
"version": "1.0.30001790",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz",
|
||||||
"integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==",
|
"integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -2957,9 +2957,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.340",
|
"version": "1.5.344",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz",
|
||||||
"integrity": "sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==",
|
"integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
@@ -5207,9 +5207,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.37",
|
"version": "2.0.38",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
|
||||||
"integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==",
|
"integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
@@ -5724,15 +5724,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/safe-array-concat": {
|
"node_modules/safe-array-concat": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
|
||||||
"integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
|
"integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"call-bind": "^1.0.8",
|
"call-bind": "^1.0.9",
|
||||||
"call-bound": "^1.0.2",
|
"call-bound": "^1.0.4",
|
||||||
"get-intrinsic": "^1.2.6",
|
"get-intrinsic": "^1.3.0",
|
||||||
"has-symbols": "^1.1.0",
|
"has-symbols": "^1.1.0",
|
||||||
"isarray": "^2.0.5"
|
"isarray": "^2.0.5"
|
||||||
},
|
},
|
||||||
@@ -6216,16 +6216,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tailwindcss": {
|
"node_modules/tailwindcss": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
|
||||||
"integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==",
|
"integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.3.2",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
|
||||||
"integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==",
|
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -6448,16 +6448,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/typescript-eslint": {
|
"node_modules/typescript-eslint": {
|
||||||
"version": "8.58.2",
|
"version": "8.59.0",
|
||||||
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.2.tgz",
|
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz",
|
||||||
"integrity": "sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==",
|
"integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/eslint-plugin": "8.58.2",
|
"@typescript-eslint/eslint-plugin": "8.59.0",
|
||||||
"@typescript-eslint/parser": "8.58.2",
|
"@typescript-eslint/parser": "8.59.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.58.2",
|
"@typescript-eslint/typescript-estree": "8.59.0",
|
||||||
"@typescript-eslint/utils": "8.58.2"
|
"@typescript-eslint/utils": "8.59.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user