diff --git a/media/based-in-sweden-logo.png b/media/based-in-sweden-logo.png new file mode 100644 index 0000000..d9eaa9d Binary files /dev/null and b/media/based-in-sweden-logo.png differ diff --git a/media/iso_sbcert.png b/media/iso_sbcert.png new file mode 100644 index 0000000..ef80255 Binary files /dev/null and b/media/iso_sbcert.png differ diff --git a/media/uc-sigill-lm-1200x1452.webp b/media/uc-sigill-lm-1200x1452.webp new file mode 100644 index 0000000..0c97c50 Binary files /dev/null and b/media/uc-sigill-lm-1200x1452.webp differ diff --git a/media/uc-sigill-lm-400x484.webp b/media/uc-sigill-lm-400x484.webp new file mode 100644 index 0000000..4865281 Binary files /dev/null and b/media/uc-sigill-lm-400x484.webp differ diff --git a/media/uc-sigill-lm-800x968.webp b/media/uc-sigill-lm-800x968.webp new file mode 100644 index 0000000..2264f33 Binary files /dev/null and b/media/uc-sigill-lm-800x968.webp differ diff --git a/media/uc-sigill-lm.png b/media/uc-sigill-lm.png new file mode 100644 index 0000000..07af423 Binary files /dev/null and b/media/uc-sigill-lm.png differ diff --git a/next.config.js b/next.config.js index cb02c1f..aea3c4e 100644 --- a/next.config.js +++ b/next.config.js @@ -1,5 +1,4 @@ import { withPayload } from '@payloadcms/next/withPayload' - import redirects from './redirects.js' const NEXT_PUBLIC_SERVER_URL = process.env.VERCEL_PROJECT_PRODUCTION_URL @@ -8,12 +7,33 @@ const NEXT_PUBLIC_SERVER_URL = process.env.VERCEL_PROJECT_PRODUCTION_URL const ContentSecurityPolicy = ` default-src 'self'; - script-src 'self' 'unsafe-inline' https://layerandmesh.lime-forms.com https://matomo.layermesh.se https://maps.googleapis.com; - style-src 'self' 'unsafe-inline' https://layerandmesh.lime-forms.com https://fonts.googleapis.com; - img-src 'self' data: blob: https://matomo.layermesh.se https://img.youtube.com https://i.vimeocdn.com https://maps.googleapis.com https://maps.gstatic.com; - font-src 'self' https://fonts.gstatic.com; - connect-src 'self' https://matomo.layermesh.se https://layerandmesh.lime-forms.com https://maps.googleapis.com; - frame-src 'self' https://www.youtube.com https://www.youtube-nocookie.com https://player.vimeo.com https://www.google.com https://maps.google.com; + script-src 'self' 'unsafe-inline' + https://layerandmesh.lime-forms.com + https://matomo.layermesh.se + https://maps.googleapis.com + https://maps.gstatic.com; + style-src 'self' 'unsafe-inline' + https://layerandmesh.lime-forms.com; + img-src 'self' data: blob: + https://matomo.layermesh.se + https://img.youtube.com + https://*.vimeocdn.com + https://maps.googleapis.com + https://maps.gstatic.com; + font-src 'self'; + connect-src 'self' + https://matomo.layermesh.se + https://layerandmesh.lime-forms.com + https://maps.googleapis.com + https://*.googleapis.com; + frame-src 'self' + https://www.youtube.com + https://www.youtube-nocookie.com + https://player.vimeo.com + https://www.google.com + https://maps.google.com; + worker-src 'self'; + media-src 'self' https://player.vimeo.com; object-src 'none'; base-uri 'self'; form-action 'self' https://layerandmesh.lime-forms.com; @@ -26,6 +46,10 @@ const securityHeaders = [ key: 'Content-Security-Policy', value: ContentSecurityPolicy.replace(/\s{2,}/g, ' ').trim(), }, + { + key: 'Strict-Transport-Security', + value: 'max-age=63072000; includeSubDomains', + }, { key: 'X-Frame-Options', value: 'SAMEORIGIN', @@ -40,7 +64,7 @@ const securityHeaders = [ }, { key: 'Permissions-Policy', - value: 'camera=(), microphone=(), geolocation=()', + value: 'camera=(), microphone=(), geolocation=(), payment=(), usb=(), accelerometer=(), gyroscope=()', }, ] @@ -52,9 +76,8 @@ const nextConfig = { }, images: { remotePatterns: [ - ...[NEXT_PUBLIC_SERVER_URL /* 'https://example.com' */].map((item) => { + ...[NEXT_PUBLIC_SERVER_URL].map((item) => { const url = new URL(item) - return { hostname: url.hostname, protocol: url.protocol.replace(':', ''), @@ -68,7 +91,6 @@ const nextConfig = { '.js': ['.ts', '.tsx', '.js', '.jsx'], '.mjs': ['.mts', '.mjs'], } - return webpackConfig }, reactStrictMode: true, @@ -83,4 +105,4 @@ const nextConfig = { }, } -export default withPayload(nextConfig, { devBundleServerPackages: false }) +export default withPayload(nextConfig, { devBundleServerPackages: false }) \ No newline at end of file diff --git a/src/Footer/Component.tsx b/src/Footer/Component.tsx index ff942c6..45cf5ac 100644 --- a/src/Footer/Component.tsx +++ b/src/Footer/Component.tsx @@ -63,7 +63,7 @@ export async function Footer() { {certMarks.length > 0 && ( -
+
{certMarks.map((mark, i) => { const media = mark.image as Media | null | undefined if (!media) return null @@ -71,7 +71,7 @@ export async function Footer() { ) @@ -81,14 +81,12 @@ export async function Footer() { href={mark.linkUrl} target="_blank" rel="noopener noreferrer" - className="opacity-80 hover:opacity-100 transition-opacity" + className="transition-opacity hover:opacity-80" > {imgEl} ) : ( - - {imgEl} - + {imgEl} ) })}
@@ -125,7 +123,31 @@ export async function Footer() { {/* Left + center: copyright text and legal nav links */}
-

{bottomLeft}

+ {/* Mobile-only cert marks — shown above copyright, hidden on sm+ (handled in top bar) */} + {certMarks.length > 0 && ( +
+ {certMarks.map((mark, i) => { + const media = mark.image as Media | null | undefined + if (!media) return null + const imgEl = ( + + ) + return mark.linkUrl ? ( + + {imgEl} + + ) : ( + {imgEl} + ) + })} +
+ )} +

{bottomLeft}

{navItems.length > 0 && (