fix: cookie banner design and settings

This commit is contained in:
Jeffrey 2026-02-18 14:13:25 +01:00
parent cbeae1bf85
commit 3a8f58682d
7 changed files with 23675 additions and 51 deletions

View File

@ -1,5 +1,4 @@
import type { Metadata } from 'next'
import { getPayload } from 'payload'
import config from '@payload-config'
import { AnnouncementBarComponent } from '@/components/AnnouncementBar/AnnouncementBar'
@ -7,7 +6,6 @@ import { cn } from '@/utilities/ui'
import { GeistMono } from 'geist/font/mono'
import { GeistSans } from 'geist/font/sans'
import React from 'react'
import { AdminBar } from '@/components/AdminBar'
import { Footer } from '@/Footer/Component'
import { Header } from '@/Header/Component'
@ -16,20 +14,17 @@ import { InitTheme } from '@/providers/Theme/InitTheme'
import { mergeOpenGraph } from '@/utilities/mergeOpenGraph'
import { draftMode } from 'next/headers'
import { getCachedGlobal } from '@/utilities/getGlobals'
import './globals.css'
import { getServerSideURL } from '@/utilities/getURL'
import { PopupAnnouncementComponent } from '@/globals/PopupAnnouncement/Component'
import { HeadInjection, FooterInjection } from '@/components/HeadInjection'
import { CookieConsent } from '@/components/CookieConsent'
import { MatomoScript } from '@/components/MatomoScript'
import { HeadInjection, FooterInjection } from '@/components/HeadInjection'
import { PopupAnnouncementComponent } from '@/globals/PopupAnnouncement/Component'
import './globals.css'
import { getServerSideURL } from '@/utilities/getURL'
async function AnnouncementBarWrapper() {
const payload = await getPayload({ config })
const announcement = await payload.findGlobal({ slug: 'announcement-bar' })
if (!announcement?.enabled) return null
return (
<AnnouncementBarComponent
text={announcement.text}
@ -44,27 +39,27 @@ async function AnnouncementBarWrapper() {
export default async function RootLayout({ children }: { children: React.ReactNode }) {
const { isEnabled } = await draftMode()
const popupData = await getCachedGlobal('popup-announcement', 1)() as any
const [siteSettings, popupData] = await Promise.all([
getCachedGlobal('site-settings', 1)() as any,
getCachedGlobal('popup-announcement', 1)() as any,
])
let privacyPolicyUrl = '/integritetspolicy'
let matomoEnabled = false
let matomoCode = ''
const cc = siteSettings?.cookieConsent
const privacyPolicyUrl = cc?.privacyPolicyUrl ?? '/integritetspolicy'
const acceptedDays = parseInt(cc?.acceptedDays ?? '365', 10)
const declinedDays = parseInt(cc?.declinedDays ?? '30', 10)
const cookieEnabled = cc?.enabled ?? true
try {
const siteSettings = await getCachedGlobal('site-settings', 0)() as any
if (siteSettings?.cookieConsent?.privacyPolicyUrl) {
privacyPolicyUrl = siteSettings.cookieConsent.privacyPolicyUrl
}
if (siteSettings?.matomo?.enabled && siteSettings?.matomo?.code) {
matomoEnabled = true
matomoCode = siteSettings.matomo.code
}
} catch {
// use defaults
}
const matomoEnabled = Boolean(siteSettings?.matomo?.enabled && siteSettings?.matomo?.code)
const matomoCode = siteSettings?.matomo?.code ?? ''
return (
<html className={cn(GeistSans.variable, GeistMono.variable)} lang="sv" suppressHydrationWarning style={{colorScheme: "light"}}>
<html
className={cn(GeistSans.variable, GeistMono.variable)}
lang="sv"
suppressHydrationWarning
style={{ colorScheme: 'light' }}
>
<head>
<InitTheme />
<link href="/favicon.ico" rel="icon" sizes="32x32" />
@ -81,10 +76,14 @@ export default async function RootLayout({ children }: { children: React.ReactNo
{children}
<Footer />
<PopupAnnouncementComponent {...popupData} />
<CookieConsent privacyPolicyUrl={privacyPolicyUrl} />
{matomoEnabled && (
<MatomoScript code={matomoCode} />
{cookieEnabled && (
<CookieConsent
privacyPolicyUrl={privacyPolicyUrl}
acceptedDays={acceptedDays}
declinedDays={declinedDays}
/>
)}
{matomoEnabled && <MatomoScript code={matomoCode} />}
<FooterInjection />
</Providers>
</body>

View File

@ -3,7 +3,12 @@
import React, { useState, useEffect, useCallback } from 'react'
const COOKIE_NAME = 'fd-cookie-consent'
const COOKIE_EXPIRY_DAYS = 365
const COOKIE_TIMESTAMP_NAME = 'fd-cookie-consent-ts'
// Default expiry durations (in days)
// 0 = session only (sessionStorage, not persisted across browser close)
const DEFAULT_ACCEPTED_DAYS = 365
const DEFAULT_DECLINED_DAYS = 30
type ConsentStatus = 'accepted' | 'declined' | null
@ -14,18 +19,46 @@ function getCookie(name: string): string | null {
}
function setCookie(name: string, value: string, days: number) {
const expires = new Date(Date.now() + days * 864e5).toUTCString()
document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`
if (days === 0) {
// Session cookie — no expires attribute
document.cookie = `${name}=${encodeURIComponent(value)}; path=/; SameSite=Lax`
} else {
const expires = new Date(Date.now() + days * 864e5).toUTCString()
document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`
}
}
function deleteCookie(name: string) {
document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`
}
/**
* Check whether the stored consent is still valid for the given number of days.
* If days = 0, we rely purely on the session cookie existing (no timestamp check).
*/
function isConsentExpired(days: number): boolean {
if (days === 0) return false // Session cookies handle their own expiry
const ts = getCookie(COOKIE_TIMESTAMP_NAME)
if (!ts) return true
const storedAt = parseInt(ts, 10)
if (isNaN(storedAt)) return true
return Date.now() - storedAt > days * 864e5
}
interface CookieConsentProps {
privacyPolicyUrl?: string
/** Days to remember "Acceptera" — 0 = browser session only */
acceptedDays?: number
/** Days to remember "Avvisa" before asking again — 0 = browser session only */
declinedDays?: number
onAccept?: () => void
onDecline?: () => void
}
export const CookieConsent: React.FC<CookieConsentProps> = ({
privacyPolicyUrl = '/integritetspolicy',
acceptedDays = DEFAULT_ACCEPTED_DAYS,
declinedDays = DEFAULT_DECLINED_DAYS,
onAccept,
onDecline,
}) => {
@ -33,62 +66,102 @@ export const CookieConsent: React.FC<CookieConsentProps> = ({
useEffect(() => {
const consent = getCookie(COOKIE_NAME)
if (!consent) {
// No consent stored at all — show the banner
const timer = setTimeout(() => setVisible(true), 800)
return () => clearTimeout(timer)
}
}, [])
// Consent exists — check if it has expired for its type
const expiryDays = consent === 'accepted' ? acceptedDays : declinedDays
if (isConsentExpired(expiryDays)) {
// Consent period has lapsed — clear old cookies and ask again
deleteCookie(COOKIE_NAME)
deleteCookie(COOKIE_TIMESTAMP_NAME)
const timer = setTimeout(() => setVisible(true), 800)
return () => clearTimeout(timer)
}
}, [acceptedDays, declinedDays])
const handleAccept = useCallback(() => {
setCookie(COOKIE_NAME, 'accepted', COOKIE_EXPIRY_DAYS)
setCookie(COOKIE_NAME, 'accepted', acceptedDays)
setCookie(COOKIE_TIMESTAMP_NAME, String(Date.now()), acceptedDays)
setVisible(false)
if (typeof window !== 'undefined' && window._paq) {
window._paq.push(['setConsentGiven'])
}
onAccept?.()
}, [onAccept])
}, [acceptedDays, onAccept])
const handleDecline = useCallback(() => {
setCookie(COOKIE_NAME, 'declined', COOKIE_EXPIRY_DAYS)
setCookie(COOKIE_NAME, 'declined', declinedDays)
setCookie(COOKIE_TIMESTAMP_NAME, String(Date.now()), declinedDays)
setVisible(false)
if (typeof window !== 'undefined' && window._paq) {
window._paq.push(['forgetConsentGiven'])
}
onDecline?.()
}, [onDecline])
}, [declinedDays, onDecline])
if (!visible) return null
const policyLink = <a href={privacyPolicyUrl} className="text-fd-yellow underline hover:text-fd-yellow/80 transition-colors">Läs vår integritetspolicy</a>
const policyLink = (
<a
href={privacyPolicyUrl}
className="text-fd-yellow underline hover:text-fd-yellow/80 transition-colors"
>
Läs vår integritetspolicy
</a>
)
return (
<div className="fixed bottom-0 left-0 right-0 z-[9999] p-4 md:p-6" role="dialog" aria-label="Cookiesamtycke">
<div className="max-w-[1200px] mx-auto bg-fd-navy rounded-[30px] md:rounded-[70px] shadow-2xl p-6 md:p-8 lg:p-10">
<div className="flex flex-col md:flex-row md:items-center gap-6">
<div className="flex-1">
<h3 className="text-fd-yellow font-joey-bold text-lg md:text-xl mb-2">
<div
className="fixed bottom-0 left-0 right-0 z-[9999] w-full bg-fd-navy shadow-[0_-4px_32px_rgba(0,0,0,0.35)]"
role="dialog"
aria-label="Cookiesamtycke"
>
{/* Inner layout — full-width, no rounded corners */}
<div className="w-full px-6 py-6 md:px-12 md:py-8 lg:px-20">
<div className="max-w-[1400px] mx-auto flex flex-col md:flex-row md:items-center gap-5 md:gap-8">
{/* Text block */}
<div className="flex-1 min-w-0">
<h3 className="text-fd-yellow font-joey-bold text-lg md:text-xl mb-1.5">
Vi använder cookies
</h3>
<p className="text-white font-joey text-sm md:text-base leading-relaxed">
Vi använder cookies för att förbättra din upplevelse vår webbplats och analysera trafik.
Genom att klicka &quot;Acceptera&quot; godkänner du vår användning av cookies.{' '}
<p className="text-white/85 font-joey text-sm md:text-base leading-relaxed">
Vi använder cookies för att förbättra din upplevelse vår webbplats och analysera
trafik. Genom att klicka &quot;Acceptera&quot; godkänner du vår användning av
cookies.{' '}
{policyLink}
</p>
</div>
<div className="flex flex-col sm:flex-row gap-3 flex-shrink-0">
<button onClick={handleDecline} className="inline-flex items-center justify-center px-6 py-2.5 rounded-full font-joey-bold text-white border-2 border-white hover:bg-white/10 transition-colors text-sm md:text-base">
{/* Action buttons */}
<div className="flex flex-row gap-3 flex-shrink-0">
<button
onClick={handleDecline}
className="inline-flex items-center justify-center px-6 py-2.5 font-joey-bold text-white border-2 border-white/60 hover:border-white hover:bg-white/10 transition-all text-sm md:text-base rounded-full"
>
Avvisa
</button>
<button onClick={handleAccept} className="inline-flex items-center justify-center px-6 py-2.5 rounded-full font-joey-bold text-fd-navy bg-fd-yellow hover:bg-fd-yellow/90 transition-colors text-sm md:text-base">
<button
onClick={handleAccept}
className="inline-flex items-center justify-center px-6 py-2.5 font-joey-bold text-fd-navy bg-fd-yellow hover:bg-fd-yellow/90 transition-colors text-sm md:text-base rounded-full"
>
Acceptera
</button>
</div>
</div>
</div>
</div>
)
}
// ─── Utility exports (unchanged) ─────────────────────────────────────────────
export function getConsentStatus(): ConsentStatus {
const value = getCookie(COOKIE_NAME)
if (value === 'accepted' || value === 'declined') return value

View File

@ -73,6 +73,42 @@ export const SiteSettings: GlobalConfig = {
condition: (_, siblingData) => Boolean(siblingData?.enabled),
},
},
{
name: 'acceptedDays',
type: 'select',
label: 'Hur länge sparas "Acceptera"-val',
defaultValue: '365',
admin: {
condition: (_, siblingData) => Boolean(siblingData?.enabled),
description:
'Hur många dagar besökarens accept-val sparas innan bannern visas igen. "Webbläsarsession" = försvinner när fliken/webbläsaren stängs.',
},
options: [
{ label: 'Webbläsarsession (session)', value: '0' },
{ label: '30 dagar', value: '30' },
{ label: '90 dagar', value: '90' },
{ label: '180 dagar', value: '180' },
{ label: '365 dagar (rekommenderat)', value: '365' },
],
},
{
name: 'declinedDays',
type: 'select',
label: 'Hur länge sparas "Avvisa"-val',
defaultValue: '30',
admin: {
condition: (_, siblingData) => Boolean(siblingData?.enabled),
description:
'Hur många dagar bannern döljs när besökaren avvisat. Efter detta visas bannern igen. Kortare tid = fler chanser att få samtycke.',
},
options: [
{ label: 'Webbläsarsession (session)', value: '0' },
{ label: '7 dagar', value: '7' },
{ label: '14 dagar', value: '14' },
{ label: '30 dagar (rekommenderat)', value: '30' },
{ label: '90 dagar', value: '90' },
],
},
],
},
{
@ -93,7 +129,8 @@ export const SiteSettings: GlobalConfig = {
admin: {
language: 'javascript',
condition: (_, siblingData) => Boolean(siblingData?.enabled),
description: 'Klistra in spårningskoden från Matomo (Administration → Tracking Code). Samtyckesgating läggs till automatiskt — du behöver inte ändra något i koden.',
description:
'Klistra in spårningskoden från Matomo (Administration → Tracking Code). Samtyckesgating läggs till automatiskt — du behöver inte ändra något i koden.',
},
},
],

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,635 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_pages_blocks_fd_spacer_section_background" AS ENUM('white', 'navy', 'gray', 'yellow', 'transparent');
CREATE TYPE "public"."enum_pages_blocks_fd_icon_bar_section_background" AS ENUM('white', 'gray', 'navy', 'yellow');
CREATE TYPE "public"."enum_pages_blocks_fd_usp_checklist_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_tech_properties_section_background" AS ENUM('navy', 'white', 'gray', 'yellow');
CREATE TYPE "public"."enum_pages_blocks_fd_usp_table_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_header_text_image_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_contact_form_section_background" AS ENUM('white', 'gray', 'navy', 'navyGradient');
CREATE TYPE "public"."enum_pages_blocks_fd_contact_form_layout" AS ENUM('standard', 'withImage', 'card');
CREATE TYPE "public"."enum_pages_blocks_fd_text_section_background" AS ENUM('white', 'navy', 'gray', 'yellow');
CREATE TYPE "public"."enum_pages_blocks_fd_cta_banner_section_background" AS ENUM('yellow', 'navy', 'gray', 'white');
CREATE TYPE "public"."enum_pages_blocks_fd_cta_banner_alignment" AS ENUM('center', 'left');
CREATE TYPE "public"."enum_pages_blocks_fd_cta_banner_size" AS ENUM('small', 'medium', 'large');
CREATE TYPE "public"."enum_pages_blocks_fd_testimonial_layout" AS ENUM('grid', 'featured');
CREATE TYPE "public"."enum_pages_blocks_fd_testimonial_section_background" AS ENUM('gray', 'white', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_team_columns" AS ENUM('2', '3', '4');
CREATE TYPE "public"."enum_pages_blocks_fd_team_card_style" AS ENUM('navy', 'white', 'gray');
CREATE TYPE "public"."enum_pages_blocks_fd_team_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_spacer_section_background" AS ENUM('white', 'navy', 'gray', 'yellow', 'transparent');
CREATE TYPE "public"."enum__pages_v_blocks_fd_icon_bar_section_background" AS ENUM('white', 'gray', 'navy', 'yellow');
CREATE TYPE "public"."enum__pages_v_blocks_fd_usp_checklist_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_tech_properties_section_background" AS ENUM('navy', 'white', 'gray', 'yellow');
CREATE TYPE "public"."enum__pages_v_blocks_fd_usp_table_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_header_text_image_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_contact_form_section_background" AS ENUM('white', 'gray', 'navy', 'navyGradient');
CREATE TYPE "public"."enum__pages_v_blocks_fd_contact_form_layout" AS ENUM('standard', 'withImage', 'card');
CREATE TYPE "public"."enum__pages_v_blocks_fd_text_section_background" AS ENUM('white', 'navy', 'gray', 'yellow');
CREATE TYPE "public"."enum__pages_v_blocks_fd_cta_banner_section_background" AS ENUM('yellow', 'navy', 'gray', 'white');
CREATE TYPE "public"."enum__pages_v_blocks_fd_cta_banner_alignment" AS ENUM('center', 'left');
CREATE TYPE "public"."enum__pages_v_blocks_fd_cta_banner_size" AS ENUM('small', 'medium', 'large');
CREATE TYPE "public"."enum__pages_v_blocks_fd_testimonial_layout" AS ENUM('grid', 'featured');
CREATE TYPE "public"."enum__pages_v_blocks_fd_testimonial_section_background" AS ENUM('gray', 'white', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_team_columns" AS ENUM('2', '3', '4');
CREATE TYPE "public"."enum__pages_v_blocks_fd_team_card_style" AS ENUM('navy', 'white', 'gray');
CREATE TYPE "public"."enum__pages_v_blocks_fd_team_section_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_site_settings_cookie_consent_accepted_days" AS ENUM('0', '30', '90', '180', '365');
CREATE TYPE "public"."enum_site_settings_cookie_consent_declined_days" AS ENUM('0', '7', '14', '30', '90');
CREATE TABLE "pages_blocks_fd_cta_banner" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"heading" varchar DEFAULT 'Redo att komma igång?',
"subheading" varchar,
"cta_text" varchar DEFAULT 'Kontakta oss',
"cta_link" varchar DEFAULT '/kontakt',
"secondary_cta_text" varchar,
"secondary_cta_link" varchar,
"section_background" "enum_pages_blocks_fd_cta_banner_section_background" DEFAULT 'yellow',
"alignment" "enum_pages_blocks_fd_cta_banner_alignment" DEFAULT 'center',
"size" "enum_pages_blocks_fd_cta_banner_size" DEFAULT 'medium',
"block_name" varchar
);
CREATE TABLE "pages_blocks_fd_testimonial_testimonials" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"quote" varchar,
"author_name" varchar,
"author_role" varchar,
"author_company" varchar,
"avatar_id" integer
);
CREATE TABLE "pages_blocks_fd_testimonial" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"heading" varchar,
"layout" "enum_pages_blocks_fd_testimonial_layout" DEFAULT 'grid',
"section_background" "enum_pages_blocks_fd_testimonial_section_background" DEFAULT 'gray',
"block_name" varchar
);
CREATE TABLE "pages_blocks_fd_team_members" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"photo_id" integer,
"name" varchar,
"role" varchar,
"bio" varchar,
"email" varchar,
"linkedin" varchar
);
CREATE TABLE "pages_blocks_fd_team" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"heading" varchar,
"subheading" varchar,
"columns" "enum_pages_blocks_fd_team_columns" DEFAULT '3',
"card_style" "enum_pages_blocks_fd_team_card_style" DEFAULT 'navy',
"section_background" "enum_pages_blocks_fd_team_section_background" DEFAULT 'white',
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_fd_cta_banner" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" serial PRIMARY KEY NOT NULL,
"heading" varchar DEFAULT 'Redo att komma igång?',
"subheading" varchar,
"cta_text" varchar DEFAULT 'Kontakta oss',
"cta_link" varchar DEFAULT '/kontakt',
"secondary_cta_text" varchar,
"secondary_cta_link" varchar,
"section_background" "enum__pages_v_blocks_fd_cta_banner_section_background" DEFAULT 'yellow',
"alignment" "enum__pages_v_blocks_fd_cta_banner_alignment" DEFAULT 'center',
"size" "enum__pages_v_blocks_fd_cta_banner_size" DEFAULT 'medium',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_fd_testimonial_testimonials" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" serial PRIMARY KEY NOT NULL,
"quote" varchar,
"author_name" varchar,
"author_role" varchar,
"author_company" varchar,
"avatar_id" integer,
"_uuid" varchar
);
CREATE TABLE "_pages_v_blocks_fd_testimonial" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" serial PRIMARY KEY NOT NULL,
"heading" varchar,
"layout" "enum__pages_v_blocks_fd_testimonial_layout" DEFAULT 'grid',
"section_background" "enum__pages_v_blocks_fd_testimonial_section_background" DEFAULT 'gray',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_fd_team_members" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" serial PRIMARY KEY NOT NULL,
"photo_id" integer,
"name" varchar,
"role" varchar,
"bio" varchar,
"email" varchar,
"linkedin" varchar,
"_uuid" varchar
);
CREATE TABLE "_pages_v_blocks_fd_team" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" serial PRIMARY KEY NOT NULL,
"heading" varchar,
"subheading" varchar,
"columns" "enum__pages_v_blocks_fd_team_columns" DEFAULT '3',
"card_style" "enum__pages_v_blocks_fd_team_card_style" DEFAULT 'navy',
"section_background" "enum__pages_v_blocks_fd_team_section_background" DEFAULT 'white',
"_uuid" varchar,
"block_name" varchar
);
ALTER TABLE "pages_hero_links" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "pages_rels" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_version_hero_links" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_rels" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "search_categories" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "search" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "search_rels" DISABLE ROW LEVEL SECURITY;
DROP TABLE "pages_hero_links" CASCADE;
DROP TABLE "pages_rels" CASCADE;
DROP TABLE "_pages_v_version_hero_links" CASCADE;
DROP TABLE "_pages_v_rels" CASCADE;
DROP TABLE "search_categories" CASCADE;
DROP TABLE "search" CASCADE;
DROP TABLE "search_rels" CASCADE;
ALTER TABLE "pages" DROP CONSTRAINT "pages_hero_media_id_media_id_fk";
ALTER TABLE "_pages_v" DROP CONSTRAINT "_pages_v_version_hero_media_id_media_id_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_search_fk";
DROP INDEX "pages_hero_hero_media_idx";
DROP INDEX "_pages_v_version_hero_version_hero_media_idx";
DROP INDEX "payload_locked_documents_rels_search_id_idx";
DROP INDEX "pages_slug_idx";
DROP INDEX "posts_slug_idx";
ALTER TABLE "pages_blocks_fd_faq_items" ALTER COLUMN "answer" SET DATA TYPE jsonb;
ALTER TABLE "pages_blocks_fd_usp_table_rows" ALTER COLUMN "description" SET DATA TYPE jsonb;
ALTER TABLE "pages_blocks_fd_contact_form" ALTER COLUMN "description" SET DEFAULT 'Berätta om era mål — vårt team kontaktar er och hjälper er hitta rätt lösning.';
ALTER TABLE "pages_blocks_fd_text" ALTER COLUMN "body" SET DATA TYPE jsonb;
ALTER TABLE "_pages_v_blocks_fd_faq_items" ALTER COLUMN "answer" SET DATA TYPE jsonb;
ALTER TABLE "_pages_v_blocks_fd_usp_table_rows" ALTER COLUMN "description" SET DATA TYPE jsonb;
ALTER TABLE "_pages_v_blocks_fd_contact_form" ALTER COLUMN "description" SET DEFAULT 'Berätta om era mål — vårt team kontaktar er och hjälper er hitta rätt lösning.';
ALTER TABLE "_pages_v_blocks_fd_text" ALTER COLUMN "body" SET DATA TYPE jsonb;
ALTER TABLE "pages_blocks_fd_spacer" ADD COLUMN "section_background" "enum_pages_blocks_fd_spacer_section_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_icon_bar" ADD COLUMN "section_background" "enum_pages_blocks_fd_icon_bar_section_background" DEFAULT 'gray';
ALTER TABLE "pages_blocks_fd_usp_checklist" ADD COLUMN "section_background" "enum_pages_blocks_fd_usp_checklist_section_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_tech_properties" ADD COLUMN "section_background" "enum_pages_blocks_fd_tech_properties_section_background" DEFAULT 'navy';
ALTER TABLE "pages_blocks_fd_usp_table" ADD COLUMN "section_background" "enum_pages_blocks_fd_usp_table_section_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_header_text_image" ADD COLUMN "section_background" "enum_pages_blocks_fd_header_text_image_section_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_contact_form" ADD COLUMN "section_background" "enum_pages_blocks_fd_contact_form_section_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_contact_form" ADD COLUMN "layout" "enum_pages_blocks_fd_contact_form_layout" DEFAULT 'standard';
ALTER TABLE "pages_blocks_fd_contact_form" ADD COLUMN "external_api_enabled" boolean DEFAULT false;
ALTER TABLE "pages_blocks_fd_contact_form" ADD COLUMN "external_api_endpoint" varchar;
ALTER TABLE "pages_blocks_fd_contact_form" ADD COLUMN "external_api_auth_token" varchar;
ALTER TABLE "pages_blocks_fd_locations_grid" ADD COLUMN "heading" varchar;
ALTER TABLE "pages_blocks_fd_alternate_hero" ADD COLUMN "heading" varchar;
ALTER TABLE "pages_blocks_fd_statistics" ADD COLUMN "heading" varchar;
ALTER TABLE "pages_blocks_fd_partners_logos" ADD COLUMN "heading" varchar DEFAULT 'Våra partners';
ALTER TABLE "pages_blocks_fd_service_chooser" ADD COLUMN "heading" varchar DEFAULT 'Välj din bransch';
ALTER TABLE "pages_blocks_fd_data_table" ADD COLUMN "heading" varchar;
ALTER TABLE "pages_blocks_fd_text" ADD COLUMN "section_background" "enum_pages_blocks_fd_text_section_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_spacer" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_spacer_section_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_icon_bar" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_icon_bar_section_background" DEFAULT 'gray';
ALTER TABLE "_pages_v_blocks_fd_usp_checklist" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_usp_checklist_section_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_tech_properties" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_tech_properties_section_background" DEFAULT 'navy';
ALTER TABLE "_pages_v_blocks_fd_usp_table" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_usp_table_section_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_header_text_image" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_header_text_image_section_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_contact_form" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_contact_form_section_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_contact_form" ADD COLUMN "layout" "enum__pages_v_blocks_fd_contact_form_layout" DEFAULT 'standard';
ALTER TABLE "_pages_v_blocks_fd_contact_form" ADD COLUMN "external_api_enabled" boolean DEFAULT false;
ALTER TABLE "_pages_v_blocks_fd_contact_form" ADD COLUMN "external_api_endpoint" varchar;
ALTER TABLE "_pages_v_blocks_fd_contact_form" ADD COLUMN "external_api_auth_token" varchar;
ALTER TABLE "_pages_v_blocks_fd_locations_grid" ADD COLUMN "heading" varchar;
ALTER TABLE "_pages_v_blocks_fd_alternate_hero" ADD COLUMN "heading" varchar;
ALTER TABLE "_pages_v_blocks_fd_statistics" ADD COLUMN "heading" varchar;
ALTER TABLE "_pages_v_blocks_fd_partners_logos" ADD COLUMN "heading" varchar DEFAULT 'Våra partners';
ALTER TABLE "_pages_v_blocks_fd_service_chooser" ADD COLUMN "heading" varchar DEFAULT 'Välj din bransch';
ALTER TABLE "_pages_v_blocks_fd_data_table" ADD COLUMN "heading" varchar;
ALTER TABLE "_pages_v_blocks_fd_text" ADD COLUMN "section_background" "enum__pages_v_blocks_fd_text_section_background" DEFAULT 'white';
ALTER TABLE "site_settings" ADD COLUMN "cookie_consent_accepted_days" "enum_site_settings_cookie_consent_accepted_days" DEFAULT '365';
ALTER TABLE "site_settings" ADD COLUMN "cookie_consent_declined_days" "enum_site_settings_cookie_consent_declined_days" DEFAULT '30';
ALTER TABLE "pages_blocks_fd_cta_banner" ADD CONSTRAINT "pages_blocks_fd_cta_banner_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_fd_testimonial_testimonials" ADD CONSTRAINT "pages_blocks_fd_testimonial_testimonials_avatar_id_media_id_fk" FOREIGN KEY ("avatar_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_fd_testimonial_testimonials" ADD CONSTRAINT "pages_blocks_fd_testimonial_testimonials_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_fd_testimonial"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_fd_testimonial" ADD CONSTRAINT "pages_blocks_fd_testimonial_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_fd_team_members" ADD CONSTRAINT "pages_blocks_fd_team_members_photo_id_media_id_fk" FOREIGN KEY ("photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_fd_team_members" ADD CONSTRAINT "pages_blocks_fd_team_members_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_fd_team"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_fd_team" ADD CONSTRAINT "pages_blocks_fd_team_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_cta_banner" ADD CONSTRAINT "_pages_v_blocks_fd_cta_banner_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_testimonial_testimonials" ADD CONSTRAINT "_pages_v_blocks_fd_testimonial_testimonials_avatar_id_media_id_fk" FOREIGN KEY ("avatar_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_testimonial_testimonials" ADD CONSTRAINT "_pages_v_blocks_fd_testimonial_testimonials_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v_blocks_fd_testimonial"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_testimonial" ADD CONSTRAINT "_pages_v_blocks_fd_testimonial_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_team_members" ADD CONSTRAINT "_pages_v_blocks_fd_team_members_photo_id_media_id_fk" FOREIGN KEY ("photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_team_members" ADD CONSTRAINT "_pages_v_blocks_fd_team_members_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v_blocks_fd_team"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_fd_team" ADD CONSTRAINT "_pages_v_blocks_fd_team_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "pages_blocks_fd_cta_banner_order_idx" ON "pages_blocks_fd_cta_banner" USING btree ("_order");
CREATE INDEX "pages_blocks_fd_cta_banner_parent_id_idx" ON "pages_blocks_fd_cta_banner" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_fd_cta_banner_path_idx" ON "pages_blocks_fd_cta_banner" USING btree ("_path");
CREATE INDEX "pages_blocks_fd_testimonial_testimonials_order_idx" ON "pages_blocks_fd_testimonial_testimonials" USING btree ("_order");
CREATE INDEX "pages_blocks_fd_testimonial_testimonials_parent_id_idx" ON "pages_blocks_fd_testimonial_testimonials" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_fd_testimonial_testimonials_avatar_idx" ON "pages_blocks_fd_testimonial_testimonials" USING btree ("avatar_id");
CREATE INDEX "pages_blocks_fd_testimonial_order_idx" ON "pages_blocks_fd_testimonial" USING btree ("_order");
CREATE INDEX "pages_blocks_fd_testimonial_parent_id_idx" ON "pages_blocks_fd_testimonial" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_fd_testimonial_path_idx" ON "pages_blocks_fd_testimonial" USING btree ("_path");
CREATE INDEX "pages_blocks_fd_team_members_order_idx" ON "pages_blocks_fd_team_members" USING btree ("_order");
CREATE INDEX "pages_blocks_fd_team_members_parent_id_idx" ON "pages_blocks_fd_team_members" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_fd_team_members_photo_idx" ON "pages_blocks_fd_team_members" USING btree ("photo_id");
CREATE INDEX "pages_blocks_fd_team_order_idx" ON "pages_blocks_fd_team" USING btree ("_order");
CREATE INDEX "pages_blocks_fd_team_parent_id_idx" ON "pages_blocks_fd_team" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_fd_team_path_idx" ON "pages_blocks_fd_team" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_fd_cta_banner_order_idx" ON "_pages_v_blocks_fd_cta_banner" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_fd_cta_banner_parent_id_idx" ON "_pages_v_blocks_fd_cta_banner" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_fd_cta_banner_path_idx" ON "_pages_v_blocks_fd_cta_banner" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_fd_testimonial_testimonials_order_idx" ON "_pages_v_blocks_fd_testimonial_testimonials" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_fd_testimonial_testimonials_parent_id_idx" ON "_pages_v_blocks_fd_testimonial_testimonials" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_fd_testimonial_testimonials_avatar_idx" ON "_pages_v_blocks_fd_testimonial_testimonials" USING btree ("avatar_id");
CREATE INDEX "_pages_v_blocks_fd_testimonial_order_idx" ON "_pages_v_blocks_fd_testimonial" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_fd_testimonial_parent_id_idx" ON "_pages_v_blocks_fd_testimonial" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_fd_testimonial_path_idx" ON "_pages_v_blocks_fd_testimonial" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_fd_team_members_order_idx" ON "_pages_v_blocks_fd_team_members" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_fd_team_members_parent_id_idx" ON "_pages_v_blocks_fd_team_members" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_fd_team_members_photo_idx" ON "_pages_v_blocks_fd_team_members" USING btree ("photo_id");
CREATE INDEX "_pages_v_blocks_fd_team_order_idx" ON "_pages_v_blocks_fd_team" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_fd_team_parent_id_idx" ON "_pages_v_blocks_fd_team" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_fd_team_path_idx" ON "_pages_v_blocks_fd_team" USING btree ("_path");
CREATE INDEX "pages_slug_idx" ON "pages" USING btree ("slug");
CREATE INDEX "posts_slug_idx" ON "posts" USING btree ("slug");
ALTER TABLE "pages_blocks_fd_spacer" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_icon_bar" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_usp_checklist" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_tech_properties" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_usp_table" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_header_text_image" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_contact_form" DROP COLUMN "background";
ALTER TABLE "pages_blocks_fd_locations_grid" DROP COLUMN "title";
ALTER TABLE "pages_blocks_fd_alternate_hero" DROP COLUMN "title";
ALTER TABLE "pages_blocks_fd_statistics" DROP COLUMN "title";
ALTER TABLE "pages_blocks_fd_partners_logos" DROP COLUMN "title";
ALTER TABLE "pages_blocks_fd_service_chooser" DROP COLUMN "title";
ALTER TABLE "pages_blocks_fd_data_table" DROP COLUMN "title";
ALTER TABLE "pages_blocks_fd_text" DROP COLUMN "background";
ALTER TABLE "pages" DROP COLUMN "hero_type";
ALTER TABLE "pages" DROP COLUMN "hero_rich_text";
ALTER TABLE "pages" DROP COLUMN "hero_media_id";
ALTER TABLE "pages" DROP COLUMN "generate_slug";
ALTER TABLE "_pages_v_blocks_fd_spacer" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_icon_bar" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_usp_checklist" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_tech_properties" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_usp_table" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_header_text_image" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_contact_form" DROP COLUMN "background";
ALTER TABLE "_pages_v_blocks_fd_locations_grid" DROP COLUMN "title";
ALTER TABLE "_pages_v_blocks_fd_alternate_hero" DROP COLUMN "title";
ALTER TABLE "_pages_v_blocks_fd_statistics" DROP COLUMN "title";
ALTER TABLE "_pages_v_blocks_fd_partners_logos" DROP COLUMN "title";
ALTER TABLE "_pages_v_blocks_fd_service_chooser" DROP COLUMN "title";
ALTER TABLE "_pages_v_blocks_fd_data_table" DROP COLUMN "title";
ALTER TABLE "_pages_v_blocks_fd_text" DROP COLUMN "background";
ALTER TABLE "_pages_v" DROP COLUMN "version_hero_type";
ALTER TABLE "_pages_v" DROP COLUMN "version_hero_rich_text";
ALTER TABLE "_pages_v" DROP COLUMN "version_hero_media_id";
ALTER TABLE "_pages_v" DROP COLUMN "version_generate_slug";
ALTER TABLE "posts" DROP COLUMN "generate_slug";
ALTER TABLE "_posts_v" DROP COLUMN "version_generate_slug";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "search_id";
DROP TYPE "public"."enum_pages_hero_links_link_type";
DROP TYPE "public"."enum_pages_hero_links_link_appearance";
DROP TYPE "public"."enum_pages_blocks_fd_spacer_background";
DROP TYPE "public"."enum_pages_blocks_fd_icon_bar_background";
DROP TYPE "public"."enum_pages_blocks_fd_usp_checklist_background";
DROP TYPE "public"."enum_pages_blocks_fd_tech_properties_background";
DROP TYPE "public"."enum_pages_blocks_fd_usp_table_background";
DROP TYPE "public"."enum_pages_blocks_fd_header_text_image_background";
DROP TYPE "public"."enum_pages_blocks_fd_contact_form_background";
DROP TYPE "public"."enum_pages_blocks_fd_text_background";
DROP TYPE "public"."enum_pages_hero_type";
DROP TYPE "public"."enum__pages_v_version_hero_links_link_type";
DROP TYPE "public"."enum__pages_v_version_hero_links_link_appearance";
DROP TYPE "public"."enum__pages_v_blocks_fd_spacer_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_icon_bar_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_usp_checklist_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_tech_properties_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_usp_table_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_header_text_image_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_contact_form_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_text_background";
DROP TYPE "public"."enum__pages_v_version_hero_type";`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_pages_hero_links_link_type" AS ENUM('reference', 'custom');
CREATE TYPE "public"."enum_pages_hero_links_link_appearance" AS ENUM('default', 'outline');
CREATE TYPE "public"."enum_pages_blocks_fd_spacer_background" AS ENUM('white', 'navy', 'gray', 'yellow', 'transparent');
CREATE TYPE "public"."enum_pages_blocks_fd_icon_bar_background" AS ENUM('white', 'gray', 'navy', 'yellow');
CREATE TYPE "public"."enum_pages_blocks_fd_usp_checklist_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_tech_properties_background" AS ENUM('navy', 'white', 'gray', 'yellow');
CREATE TYPE "public"."enum_pages_blocks_fd_usp_table_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_header_text_image_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum_pages_blocks_fd_contact_form_background" AS ENUM('white', 'gray');
CREATE TYPE "public"."enum_pages_blocks_fd_text_background" AS ENUM('white', 'navy', 'gray', 'yellow');
CREATE TYPE "public"."enum_pages_hero_type" AS ENUM('none', 'highImpact', 'mediumImpact', 'lowImpact');
CREATE TYPE "public"."enum__pages_v_version_hero_links_link_type" AS ENUM('reference', 'custom');
CREATE TYPE "public"."enum__pages_v_version_hero_links_link_appearance" AS ENUM('default', 'outline');
CREATE TYPE "public"."enum__pages_v_blocks_fd_spacer_background" AS ENUM('white', 'navy', 'gray', 'yellow', 'transparent');
CREATE TYPE "public"."enum__pages_v_blocks_fd_icon_bar_background" AS ENUM('white', 'gray', 'navy', 'yellow');
CREATE TYPE "public"."enum__pages_v_blocks_fd_usp_checklist_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_tech_properties_background" AS ENUM('navy', 'white', 'gray', 'yellow');
CREATE TYPE "public"."enum__pages_v_blocks_fd_usp_table_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_header_text_image_background" AS ENUM('white', 'gray', 'navy');
CREATE TYPE "public"."enum__pages_v_blocks_fd_contact_form_background" AS ENUM('white', 'gray');
CREATE TYPE "public"."enum__pages_v_blocks_fd_text_background" AS ENUM('white', 'navy', 'gray', 'yellow');
CREATE TYPE "public"."enum__pages_v_version_hero_type" AS ENUM('none', 'highImpact', 'mediumImpact', 'lowImpact');
CREATE TABLE "pages_hero_links" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"link_type" "enum_pages_hero_links_link_type" DEFAULT 'reference',
"link_new_tab" boolean,
"link_url" varchar,
"link_label" varchar,
"link_appearance" "enum_pages_hero_links_link_appearance" DEFAULT 'default'
);
CREATE TABLE "pages_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"pages_id" integer,
"posts_id" integer
);
CREATE TABLE "_pages_v_version_hero_links" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" serial PRIMARY KEY NOT NULL,
"link_type" "enum__pages_v_version_hero_links_link_type" DEFAULT 'reference',
"link_new_tab" boolean,
"link_url" varchar,
"link_label" varchar,
"link_appearance" "enum__pages_v_version_hero_links_link_appearance" DEFAULT 'default',
"_uuid" varchar
);
CREATE TABLE "_pages_v_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"pages_id" integer,
"posts_id" integer
);
CREATE TABLE "search_categories" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"relation_to" varchar,
"category_i_d" varchar,
"title" varchar
);
CREATE TABLE "search" (
"id" serial PRIMARY KEY NOT NULL,
"title" varchar,
"priority" numeric,
"slug" varchar,
"meta_title" varchar,
"meta_description" varchar,
"meta_image_id" integer,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "search_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"posts_id" integer
);
ALTER TABLE "pages_blocks_fd_cta_banner" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "pages_blocks_fd_testimonial_testimonials" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "pages_blocks_fd_testimonial" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "pages_blocks_fd_team_members" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "pages_blocks_fd_team" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_fd_cta_banner" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_fd_testimonial_testimonials" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_fd_testimonial" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_fd_team_members" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_fd_team" DISABLE ROW LEVEL SECURITY;
DROP TABLE "pages_blocks_fd_cta_banner" CASCADE;
DROP TABLE "pages_blocks_fd_testimonial_testimonials" CASCADE;
DROP TABLE "pages_blocks_fd_testimonial" CASCADE;
DROP TABLE "pages_blocks_fd_team_members" CASCADE;
DROP TABLE "pages_blocks_fd_team" CASCADE;
DROP TABLE "_pages_v_blocks_fd_cta_banner" CASCADE;
DROP TABLE "_pages_v_blocks_fd_testimonial_testimonials" CASCADE;
DROP TABLE "_pages_v_blocks_fd_testimonial" CASCADE;
DROP TABLE "_pages_v_blocks_fd_team_members" CASCADE;
DROP TABLE "_pages_v_blocks_fd_team" CASCADE;
DROP INDEX "pages_slug_idx";
DROP INDEX "posts_slug_idx";
ALTER TABLE "pages_blocks_fd_faq_items" ALTER COLUMN "answer" SET DATA TYPE varchar;
ALTER TABLE "pages_blocks_fd_usp_table_rows" ALTER COLUMN "description" SET DATA TYPE varchar;
ALTER TABLE "pages_blocks_fd_contact_form" ALTER COLUMN "description" SET DEFAULT 'Tell us about your goals, our team will reach out to you and help you achieve the right solution.';
ALTER TABLE "pages_blocks_fd_text" ALTER COLUMN "body" SET DATA TYPE varchar;
ALTER TABLE "_pages_v_blocks_fd_faq_items" ALTER COLUMN "answer" SET DATA TYPE varchar;
ALTER TABLE "_pages_v_blocks_fd_usp_table_rows" ALTER COLUMN "description" SET DATA TYPE varchar;
ALTER TABLE "_pages_v_blocks_fd_contact_form" ALTER COLUMN "description" SET DEFAULT 'Tell us about your goals, our team will reach out to you and help you achieve the right solution.';
ALTER TABLE "_pages_v_blocks_fd_text" ALTER COLUMN "body" SET DATA TYPE varchar;
ALTER TABLE "pages_blocks_fd_spacer" ADD COLUMN "background" "enum_pages_blocks_fd_spacer_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_icon_bar" ADD COLUMN "background" "enum_pages_blocks_fd_icon_bar_background" DEFAULT 'gray';
ALTER TABLE "pages_blocks_fd_usp_checklist" ADD COLUMN "background" "enum_pages_blocks_fd_usp_checklist_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_tech_properties" ADD COLUMN "background" "enum_pages_blocks_fd_tech_properties_background" DEFAULT 'navy';
ALTER TABLE "pages_blocks_fd_usp_table" ADD COLUMN "background" "enum_pages_blocks_fd_usp_table_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_header_text_image" ADD COLUMN "background" "enum_pages_blocks_fd_header_text_image_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_contact_form" ADD COLUMN "background" "enum_pages_blocks_fd_contact_form_background" DEFAULT 'white';
ALTER TABLE "pages_blocks_fd_locations_grid" ADD COLUMN "title" varchar;
ALTER TABLE "pages_blocks_fd_alternate_hero" ADD COLUMN "title" varchar;
ALTER TABLE "pages_blocks_fd_statistics" ADD COLUMN "title" varchar;
ALTER TABLE "pages_blocks_fd_partners_logos" ADD COLUMN "title" varchar DEFAULT 'Våra partners';
ALTER TABLE "pages_blocks_fd_service_chooser" ADD COLUMN "title" varchar DEFAULT 'Välj din bransch';
ALTER TABLE "pages_blocks_fd_data_table" ADD COLUMN "title" varchar;
ALTER TABLE "pages_blocks_fd_text" ADD COLUMN "background" "enum_pages_blocks_fd_text_background" DEFAULT 'white';
ALTER TABLE "pages" ADD COLUMN "hero_type" "enum_pages_hero_type" DEFAULT 'lowImpact';
ALTER TABLE "pages" ADD COLUMN "hero_rich_text" jsonb;
ALTER TABLE "pages" ADD COLUMN "hero_media_id" integer;
ALTER TABLE "pages" ADD COLUMN "generate_slug" boolean DEFAULT true;
ALTER TABLE "_pages_v_blocks_fd_spacer" ADD COLUMN "background" "enum__pages_v_blocks_fd_spacer_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_icon_bar" ADD COLUMN "background" "enum__pages_v_blocks_fd_icon_bar_background" DEFAULT 'gray';
ALTER TABLE "_pages_v_blocks_fd_usp_checklist" ADD COLUMN "background" "enum__pages_v_blocks_fd_usp_checklist_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_tech_properties" ADD COLUMN "background" "enum__pages_v_blocks_fd_tech_properties_background" DEFAULT 'navy';
ALTER TABLE "_pages_v_blocks_fd_usp_table" ADD COLUMN "background" "enum__pages_v_blocks_fd_usp_table_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_header_text_image" ADD COLUMN "background" "enum__pages_v_blocks_fd_header_text_image_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_contact_form" ADD COLUMN "background" "enum__pages_v_blocks_fd_contact_form_background" DEFAULT 'white';
ALTER TABLE "_pages_v_blocks_fd_locations_grid" ADD COLUMN "title" varchar;
ALTER TABLE "_pages_v_blocks_fd_alternate_hero" ADD COLUMN "title" varchar;
ALTER TABLE "_pages_v_blocks_fd_statistics" ADD COLUMN "title" varchar;
ALTER TABLE "_pages_v_blocks_fd_partners_logos" ADD COLUMN "title" varchar DEFAULT 'Våra partners';
ALTER TABLE "_pages_v_blocks_fd_service_chooser" ADD COLUMN "title" varchar DEFAULT 'Välj din bransch';
ALTER TABLE "_pages_v_blocks_fd_data_table" ADD COLUMN "title" varchar;
ALTER TABLE "_pages_v_blocks_fd_text" ADD COLUMN "background" "enum__pages_v_blocks_fd_text_background" DEFAULT 'white';
ALTER TABLE "_pages_v" ADD COLUMN "version_hero_type" "enum__pages_v_version_hero_type" DEFAULT 'lowImpact';
ALTER TABLE "_pages_v" ADD COLUMN "version_hero_rich_text" jsonb;
ALTER TABLE "_pages_v" ADD COLUMN "version_hero_media_id" integer;
ALTER TABLE "_pages_v" ADD COLUMN "version_generate_slug" boolean DEFAULT true;
ALTER TABLE "posts" ADD COLUMN "generate_slug" boolean DEFAULT true;
ALTER TABLE "_posts_v" ADD COLUMN "version_generate_slug" boolean DEFAULT true;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "search_id" integer;
ALTER TABLE "pages_hero_links" ADD CONSTRAINT "pages_hero_links_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_rels" ADD CONSTRAINT "pages_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_rels" ADD CONSTRAINT "pages_rels_pages_fk" FOREIGN KEY ("pages_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_rels" ADD CONSTRAINT "pages_rels_posts_fk" FOREIGN KEY ("posts_id") REFERENCES "public"."posts"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_version_hero_links" ADD CONSTRAINT "_pages_v_version_hero_links_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_rels" ADD CONSTRAINT "_pages_v_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_rels" ADD CONSTRAINT "_pages_v_rels_pages_fk" FOREIGN KEY ("pages_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_rels" ADD CONSTRAINT "_pages_v_rels_posts_fk" FOREIGN KEY ("posts_id") REFERENCES "public"."posts"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "search_categories" ADD CONSTRAINT "search_categories_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."search"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "search" ADD CONSTRAINT "search_meta_image_id_media_id_fk" FOREIGN KEY ("meta_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "search_rels" ADD CONSTRAINT "search_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."search"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "search_rels" ADD CONSTRAINT "search_rels_posts_fk" FOREIGN KEY ("posts_id") REFERENCES "public"."posts"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "pages_hero_links_order_idx" ON "pages_hero_links" USING btree ("_order");
CREATE INDEX "pages_hero_links_parent_id_idx" ON "pages_hero_links" USING btree ("_parent_id");
CREATE INDEX "pages_rels_order_idx" ON "pages_rels" USING btree ("order");
CREATE INDEX "pages_rels_parent_idx" ON "pages_rels" USING btree ("parent_id");
CREATE INDEX "pages_rels_path_idx" ON "pages_rels" USING btree ("path");
CREATE INDEX "pages_rels_pages_id_idx" ON "pages_rels" USING btree ("pages_id");
CREATE INDEX "pages_rels_posts_id_idx" ON "pages_rels" USING btree ("posts_id");
CREATE INDEX "_pages_v_version_hero_links_order_idx" ON "_pages_v_version_hero_links" USING btree ("_order");
CREATE INDEX "_pages_v_version_hero_links_parent_id_idx" ON "_pages_v_version_hero_links" USING btree ("_parent_id");
CREATE INDEX "_pages_v_rels_order_idx" ON "_pages_v_rels" USING btree ("order");
CREATE INDEX "_pages_v_rels_parent_idx" ON "_pages_v_rels" USING btree ("parent_id");
CREATE INDEX "_pages_v_rels_path_idx" ON "_pages_v_rels" USING btree ("path");
CREATE INDEX "_pages_v_rels_pages_id_idx" ON "_pages_v_rels" USING btree ("pages_id");
CREATE INDEX "_pages_v_rels_posts_id_idx" ON "_pages_v_rels" USING btree ("posts_id");
CREATE INDEX "search_categories_order_idx" ON "search_categories" USING btree ("_order");
CREATE INDEX "search_categories_parent_id_idx" ON "search_categories" USING btree ("_parent_id");
CREATE INDEX "search_slug_idx" ON "search" USING btree ("slug");
CREATE INDEX "search_meta_meta_image_idx" ON "search" USING btree ("meta_image_id");
CREATE INDEX "search_updated_at_idx" ON "search" USING btree ("updated_at");
CREATE INDEX "search_created_at_idx" ON "search" USING btree ("created_at");
CREATE INDEX "search_rels_order_idx" ON "search_rels" USING btree ("order");
CREATE INDEX "search_rels_parent_idx" ON "search_rels" USING btree ("parent_id");
CREATE INDEX "search_rels_path_idx" ON "search_rels" USING btree ("path");
CREATE INDEX "search_rels_posts_id_idx" ON "search_rels" USING btree ("posts_id");
ALTER TABLE "pages" ADD CONSTRAINT "pages_hero_media_id_media_id_fk" FOREIGN KEY ("hero_media_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v" ADD CONSTRAINT "_pages_v_version_hero_media_id_media_id_fk" FOREIGN KEY ("version_hero_media_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_search_fk" FOREIGN KEY ("search_id") REFERENCES "public"."search"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "pages_hero_hero_media_idx" ON "pages" USING btree ("hero_media_id");
CREATE INDEX "_pages_v_version_hero_version_hero_media_idx" ON "_pages_v" USING btree ("version_hero_media_id");
CREATE INDEX "payload_locked_documents_rels_search_id_idx" ON "payload_locked_documents_rels" USING btree ("search_id");
CREATE UNIQUE INDEX "pages_slug_idx" ON "pages" USING btree ("slug");
CREATE UNIQUE INDEX "posts_slug_idx" ON "posts" USING btree ("slug");
ALTER TABLE "pages_blocks_fd_spacer" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_icon_bar" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_usp_checklist" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_tech_properties" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_usp_table" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_header_text_image" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_contact_form" DROP COLUMN "section_background";
ALTER TABLE "pages_blocks_fd_contact_form" DROP COLUMN "layout";
ALTER TABLE "pages_blocks_fd_contact_form" DROP COLUMN "external_api_enabled";
ALTER TABLE "pages_blocks_fd_contact_form" DROP COLUMN "external_api_endpoint";
ALTER TABLE "pages_blocks_fd_contact_form" DROP COLUMN "external_api_auth_token";
ALTER TABLE "pages_blocks_fd_locations_grid" DROP COLUMN "heading";
ALTER TABLE "pages_blocks_fd_alternate_hero" DROP COLUMN "heading";
ALTER TABLE "pages_blocks_fd_statistics" DROP COLUMN "heading";
ALTER TABLE "pages_blocks_fd_partners_logos" DROP COLUMN "heading";
ALTER TABLE "pages_blocks_fd_service_chooser" DROP COLUMN "heading";
ALTER TABLE "pages_blocks_fd_data_table" DROP COLUMN "heading";
ALTER TABLE "pages_blocks_fd_text" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_spacer" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_icon_bar" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_usp_checklist" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_tech_properties" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_usp_table" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_header_text_image" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_contact_form" DROP COLUMN "section_background";
ALTER TABLE "_pages_v_blocks_fd_contact_form" DROP COLUMN "layout";
ALTER TABLE "_pages_v_blocks_fd_contact_form" DROP COLUMN "external_api_enabled";
ALTER TABLE "_pages_v_blocks_fd_contact_form" DROP COLUMN "external_api_endpoint";
ALTER TABLE "_pages_v_blocks_fd_contact_form" DROP COLUMN "external_api_auth_token";
ALTER TABLE "_pages_v_blocks_fd_locations_grid" DROP COLUMN "heading";
ALTER TABLE "_pages_v_blocks_fd_alternate_hero" DROP COLUMN "heading";
ALTER TABLE "_pages_v_blocks_fd_statistics" DROP COLUMN "heading";
ALTER TABLE "_pages_v_blocks_fd_partners_logos" DROP COLUMN "heading";
ALTER TABLE "_pages_v_blocks_fd_service_chooser" DROP COLUMN "heading";
ALTER TABLE "_pages_v_blocks_fd_data_table" DROP COLUMN "heading";
ALTER TABLE "_pages_v_blocks_fd_text" DROP COLUMN "section_background";
ALTER TABLE "site_settings" DROP COLUMN "cookie_consent_accepted_days";
ALTER TABLE "site_settings" DROP COLUMN "cookie_consent_declined_days";
DROP TYPE "public"."enum_pages_blocks_fd_spacer_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_icon_bar_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_usp_checklist_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_tech_properties_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_usp_table_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_header_text_image_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_contact_form_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_contact_form_layout";
DROP TYPE "public"."enum_pages_blocks_fd_text_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_cta_banner_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_cta_banner_alignment";
DROP TYPE "public"."enum_pages_blocks_fd_cta_banner_size";
DROP TYPE "public"."enum_pages_blocks_fd_testimonial_layout";
DROP TYPE "public"."enum_pages_blocks_fd_testimonial_section_background";
DROP TYPE "public"."enum_pages_blocks_fd_team_columns";
DROP TYPE "public"."enum_pages_blocks_fd_team_card_style";
DROP TYPE "public"."enum_pages_blocks_fd_team_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_spacer_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_icon_bar_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_usp_checklist_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_tech_properties_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_usp_table_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_header_text_image_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_contact_form_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_contact_form_layout";
DROP TYPE "public"."enum__pages_v_blocks_fd_text_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_cta_banner_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_cta_banner_alignment";
DROP TYPE "public"."enum__pages_v_blocks_fd_cta_banner_size";
DROP TYPE "public"."enum__pages_v_blocks_fd_testimonial_layout";
DROP TYPE "public"."enum__pages_v_blocks_fd_testimonial_section_background";
DROP TYPE "public"."enum__pages_v_blocks_fd_team_columns";
DROP TYPE "public"."enum__pages_v_blocks_fd_team_card_style";
DROP TYPE "public"."enum__pages_v_blocks_fd_team_section_background";
DROP TYPE "public"."enum_site_settings_cookie_consent_accepted_days";
DROP TYPE "public"."enum_site_settings_cookie_consent_declined_days";`)
}

View File

@ -4,6 +4,7 @@ import * as migration_20260216_171613 from './20260216_171613';
import * as migration_20260216_183152 from './20260216_183152';
import * as migration_20260216_184110 from './20260216_184110';
import * as migration_20260216_184342 from './20260216_184342';
import * as migration_20260218_130902 from './20260218_130902';
export const migrations = [
{
@ -34,6 +35,11 @@ export const migrations = [
{
up: migration_20260216_184342.up,
down: migration_20260216_184342.down,
name: '20260216_184342'
name: '20260216_184342',
},
{
up: migration_20260218_130902.up,
down: migration_20260218_130902.down,
name: '20260218_130902'
},
];

View File

@ -2874,6 +2874,14 @@ export interface SiteSetting {
cookieConsent?: {
enabled?: boolean | null;
privacyPolicyUrl?: string | null;
/**
* Hur många dagar besökarens accept-val sparas innan bannern visas igen. "Webbläsarsession" = försvinner när fliken/webbläsaren stängs.
*/
acceptedDays?: ('0' | '30' | '90' | '180' | '365') | null;
/**
* Hur många dagar bannern döljs när besökaren avvisat. Efter detta visas bannern igen. Kortare tid = fler chanser att samtycke.
*/
declinedDays?: ('0' | '7' | '14' | '30' | '90') | null;
};
matomo?: {
enabled?: boolean | null;
@ -3013,6 +3021,8 @@ export interface SiteSettingsSelect<T extends boolean = true> {
| {
enabled?: T;
privacyPolicyUrl?: T;
acceptedDays?: T;
declinedDays?: T;
};
matomo?:
| T