@import 'tailwindcss'; @import 'tw-animate-css'; @config '../../../tailwind.config.mjs'; @custom-variant dark (&:is([data-theme='dark'] *)); @custom-variant sm (@media (width >= theme(--breakpoint-sm))); @custom-variant md (@media (width >= theme(--breakpoint-md))); @custom-variant lg (@media (width >= theme(--breakpoint-lg))); @custom-variant xl (@media (width >= theme(--breakpoint-xl))); @custom-variant 2xl (@media (width >= theme(--breakpoint-2xl))); @layer base { h1, h2, h3, h4, h5, h6 { font-weight: unset; font-size: unset; } } @plugin "@tailwindcss/typography"; @source inline("lg:col-span-4"); @source inline("lg:col-span-6"); @source inline("lg:col-span-8"); @source inline("lg:col-span-12"); @source inline("border-border"); @source inline("bg-card"); @source inline("border-error"); @source inline("bg-error/30"); @source inline("border-success"); @source inline("bg-success/30"); @source inline("border-warning"); @source inline("bg-warning/30"); @theme { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; --breakpoint-2xl: 86rem; --font-mono: var(--font-geist-mono); --font-sans: var(--font-geist-sans); } @layer utilities { .container { width: 100%; margin-inline: auto; padding-inline: 1rem; } @variant sm { .container { max-width: var(--breakpoint-sm); } } @variant md { .container { max-width: var(--breakpoint-md); padding-inline: 2rem; } } @variant lg { .container { max-width: var(--breakpoint-lg); } } @variant xl { .container { max-width: var(--breakpoint-xl); } } @variant 2xl { .container { max-width: var(--breakpoint-2xl); } } } /* ============================================ PAYLOAD CMS / SHADCN UI TOKENS (do not modify — used by admin panel) ============================================ */ :root { --background: oklch(100% 0 0deg); --foreground: oklch(14.5% 0 0deg); --card: oklch(96.5% 0.005 265deg); --card-foreground: oklch(14.5% 0 0deg); --popover: oklch(100% 0 0deg); --popover-foreground: oklch(14.5% 0 0deg); --primary: oklch(20.5% 0 0deg); --primary-foreground: oklch(98.5% 0 0deg); --secondary: oklch(97% 0 0deg); --secondary-foreground: oklch(20.5% 0 0deg); --muted: oklch(97% 0 0deg); --muted-foreground: oklch(55.6% 0 0deg); --accent: oklch(97% 0 0deg); --accent-foreground: oklch(20.5% 0 0deg); --destructive: oklch(57.7% 0.245 27.325deg); --destructive-foreground: oklch(57.7% 0.245 27.325deg); --border: oklch(92.2% 0 0deg); --input: oklch(92.2% 0 0deg); --ring: oklch(70.8% 0 0deg); --chart-1: oklch(64.6% 0.222 41.116deg); --chart-2: oklch(60% 0.118 184.704deg); --chart-3: oklch(39.8% 0.07 227.392deg); --chart-4: oklch(82.8% 0.189 84.429deg); --chart-5: oklch(76.9% 0.188 70.08deg); --radius: 0.625rem; --sidebar: oklch(98.5% 0 0deg); --sidebar-foreground: oklch(14.5% 0 0deg); --sidebar-primary: oklch(20.5% 0 0deg); --sidebar-primary-foreground: oklch(98.5% 0 0deg); --sidebar-accent: oklch(97% 0 0deg); --sidebar-accent-foreground: oklch(20.5% 0 0deg); --sidebar-border: oklch(92.2% 0 0deg); --sidebar-ring: oklch(70.8% 0 0deg); --success: oklch(78% 0.08 200deg); --warning: oklch(89% 0.1 75deg); --error: oklch(75% 0.15 25deg); } [data-theme='dark'] { --background: oklch(14.5% 0 0deg); --foreground: oklch(98.5% 0 0deg); --card: oklch(17% 0 0deg); --card-foreground: oklch(98.5% 0 0deg); --popover: oklch(14.5% 0 0deg); --popover-foreground: oklch(98.5% 0 0deg); --primary: oklch(98.5% 0 0deg); --primary-foreground: oklch(20.5% 0 0deg); --secondary: oklch(26.9% 0 0deg); --secondary-foreground: oklch(98.5% 0 0deg); --muted: oklch(26.9% 0 0deg); --muted-foreground: oklch(70.8% 0 0deg); --accent: oklch(26.9% 0 0deg); --accent-foreground: oklch(98.5% 0 0deg); --destructive: oklch(39.6% 0.141 25.723deg); --destructive-foreground: oklch(63.7% 0.237 25.331deg); --border: oklch(26.9% 0 0deg); --input: oklch(26.9% 0 0deg); --ring: oklch(43.9% 0 0deg); --chart-1: oklch(48.8% 0.243 264.376deg); --chart-2: oklch(69.6% 0.17 162.48deg); --chart-3: oklch(76.9% 0.188 70.08deg); --chart-4: oklch(62.7% 0.265 303.9deg); --chart-5: oklch(64.5% 0.246 16.439deg); --sidebar: oklch(20.5% 0 0deg); --sidebar-foreground: oklch(98.5% 0 0deg); --sidebar-primary: oklch(48.8% 0.243 264.376deg); --sidebar-primary-foreground: oklch(98.5% 0 0deg); --sidebar-accent: oklch(26.9% 0 0deg); --sidebar-accent-foreground: oklch(98.5% 0 0deg); --sidebar-border: oklch(26.9% 0 0deg); --sidebar-ring: oklch(43.9% 0 0deg); --success: oklch(28% 0.1 200deg); --warning: oklch(35% 0.08 70deg); --error: oklch(45% 0.1 25deg); } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --color-chart-1: var(--chart-1); --color-chart-2: var(--chart-2); --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); --color-success: var(--success); --color-warning: var(--warning); --color-error: var(--error); } @layer base { * { @apply border-border outline-ring/50; } body { @apply bg-background text-foreground min-h-[100vh] flex flex-col; font-variant-ligatures: none; } } html { opacity: 0; } html[data-theme='dark'], html[data-theme='light'] { opacity: initial; } /* ============================================ FIBER DIREKT DESIGN SYSTEM ============================================ */ /* ---- Font Faces ---- */ @font-face { font-family: 'FS Joey'; src: url('/fonts/fs-joey-regular.otf') format('opentype'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'FS Joey'; src: url('/fonts/fs-joey-italic.otf') format('opentype'); font-weight: 400; font-style: italic; font-display: swap; } @font-face { font-family: 'FS Joey Medium'; src: url('/fonts/fs-joey-medium.otf') format('opentype'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'FS Joey Bold'; src: url('/fonts/fs-joey-bold.otf') format('opentype'); font-weight: 700; font-style: normal; font-display: swap; } @font-face { font-family: 'FS Joey Heavy'; src: url('/fonts/fs-joey-heavy.otf') format('opentype'); font-weight: 900; font-style: normal; font-display: swap; } /* ---- Theme Tokens ---- */ /* This single @theme block registers ALL Fiber Direkt design tokens. Tailwind v4 auto-generates utility classes from these: --color-fd-navy → bg-fd-navy, text-fd-navy, border-fd-navy, etc. --font-joey → font-joey --text-fd-* → text-fd-display, text-fd-h1, etc. */ @theme { /* ---- Fonts ---- */ --font-joey: 'FS Joey', system-ui, -apple-system, BlinkMacSystemFont, sans-serif; --font-joey-italic: 'FS Joey', system-ui, -apple-system, BlinkMacSystemFont, sans-serif; --font-joey-medium: 'FS Joey Medium', 'FS Joey', system-ui, sans-serif; --font-joey-bold: 'FS Joey Bold', 'FS Joey', system-ui, sans-serif; --font-joey-heavy: 'FS Joey Heavy', 'FS Joey', system-ui, sans-serif; /* ============================= COLORS — Full Brand Palette ============================= */ /* Navy scale */ --color-fd-navy-950: #060D14; --color-fd-navy-900: #0A1825; --color-fd-navy: #0E2338; /* primary — bg-fd-navy, text-fd-navy */ --color-fd-navy-700: #153350; --color-fd-navy-600: #1C4368; --color-fd-navy-500: #245580; --color-fd-navy-400: #3D7199; --color-fd-navy-300: #6A94B3; --color-fd-navy-200: #9DB8CC; --color-fd-navy-100: #CFDBE6; --color-fd-navy-50: #E7EDF2; /* Yellow scale */ --color-fd-yellow-950: #3D3000; --color-fd-yellow-900: #5C4800; --color-fd-yellow-800: #7A6000; --color-fd-yellow-700: #B38C00; --color-fd-yellow-600: #D4A600; --color-fd-yellow: #FECC02; /* primary — bg-fd-yellow, text-fd-yellow */ --color-fd-yellow-400: #FED835; --color-fd-yellow-300: #FEE468; --color-fd-yellow-200: #FFEF9B; --color-fd-yellow-100: #FFF7CD; --color-fd-yellow-50: #FFFBE6; /* Mint scale */ --color-fd-mint-950: #052E14; --color-fd-mint-900: #0A4D22; --color-fd-mint-800: #116B32; --color-fd-mint-700: #1A8A44; --color-fd-mint-600: #25A957; --color-fd-mint-500: #3EC76E; --color-fd-mint: #67EF8B; /* primary — bg-fd-mint, text-fd-mint */ --color-fd-mint-300: #8DF4A8; --color-fd-mint-200: #B3F8C5; --color-fd-mint-100: #D9FCE2; --color-fd-mint-50: #ECFDF0; /* Neutral grays */ --color-fd-gray: #F0F0F0; /* section alt backgrounds */ --color-fd-gray-warm: #F8F8F6; --color-fd-gray-cool: #F5F7F9; --color-fd-gray-200: #C8CCD0; --color-fd-gray-300: #A9AEB5; --color-fd-gray-400: #8A919A; --color-fd-gray-500: #6B737E; --color-fd-gray-600: #41474F; --color-fd-gray-700: #2D3239; --color-fd-gray-800: #1A1D21; /* Semantic surfaces (for block backgrounds) */ --color-fd-surface: #FFFFFF; --color-fd-surface-alt: #F0F0F0; --color-fd-surface-navy: #0E2338; --color-fd-surface-navy-light: #153350; --color-fd-surface-yellow: #FFFBE6; --color-fd-surface-mint: #ECFDF0; /* Semantic text (for auto-resolving text on any bg) */ --color-fd-text: #0E2338; --color-fd-text-secondary: #41474F; --color-fd-text-muted: #6B737E; --color-fd-text-disabled: #8A919A; --color-fd-text-on-dark: #FFFFFF; --color-fd-text-on-dark-muted: #9DB8CC; --color-fd-text-accent: #FECC02; /* ============================= TYPOGRAPHY — 9-Level Scale ============================= Uses clamp() for fluid scaling: no breakpoint prefixes needed. min = mobile, preferred = viewport-relative, max = desktop. Usage: text-fd-display, text-fd-h1, text-fd-body, etc. */ /* Level 1 — Display / Hero H1 */ --text-fd-display: clamp(2.25rem, 5vw + 0.5rem, 4.875rem); /* 36px → 78px */ --text-fd-display--line-height: 1.05; --text-fd-display--letter-spacing: -0.02em; /* Level 2 — Section H1 */ --text-fd-h1: clamp(1.75rem, 3.5vw + 0.25rem, 3.125rem); /* 28px → 50px */ --text-fd-h1--line-height: 1.15; --text-fd-h1--letter-spacing: -0.01em; /* Level 3 — Block titles / H2 */ --text-fd-h2: clamp(1.375rem, 2.5vw + 0.25rem, 2.25rem); /* 22px → 36px */ --text-fd-h2--line-height: 1.2; /* Level 4 — Card titles / H3 */ --text-fd-h3: clamp(1.125rem, 2vw + 0.125rem, 1.75rem); /* 18px → 28px */ --text-fd-h3--line-height: 1.3; /* Level 5 — Subheadings / H4 */ --text-fd-h4: clamp(1rem, 1.5vw + 0.125rem, 1.375rem); /* 16px → 22px */ --text-fd-h4--line-height: 1.4; /* Level 6 — Lead / large body */ --text-fd-body-lg: clamp(0.9375rem, 1.2vw + 0.125rem, 1.25rem); /* 15px → 20px */ --text-fd-body-lg--line-height: 1.6; /* Level 7 — Body text */ --text-fd-body: clamp(0.875rem, 1vw + 0.125rem, 1.0625rem); /* 14px → 17px */ --text-fd-body--line-height: 1.7; /* Level 8 — Small / captions */ --text-fd-small: clamp(0.8125rem, 0.9vw + 0.0625rem, 0.9375rem); /* 13px → 15px */ --text-fd-small--line-height: 1.6; /* Level 9 — Extra small / fine print */ --text-fd-xs: clamp(0.6875rem, 0.75vw + 0.0625rem, 0.8125rem); /* 11px → 13px */ --text-fd-xs--line-height: 1.5; /* Button text (matches h4 range but with tighter line height) */ --text-fd-btn: clamp(1rem, 1.5vw + 0.125rem, 1.375rem); --text-fd-btn--line-height: 1.2; } /* ============================================ FIBER DIREKT — COMPONENT UTILITY CLASSES ============================================ */ @layer components { /* ---- CTA Buttons ---- Usage: Kom igång Läs mer Kontakta oss (on navy backgrounds) */ .fd-btn-primary { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 2rem; background-color: var(--color-fd-yellow); color: var(--color-fd-navy); font-family: var(--font-joey-bold); font-size: var(--text-fd-btn); line-height: var(--text-fd-btn--line-height); border-radius: 9999px; text-decoration: none; cursor: pointer; border: 2px solid transparent; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .fd-btn-primary:hover { background-color: var(--color-fd-navy); color: var(--color-fd-yellow); box-shadow: 0 8px 24px -4px rgba(14, 35, 56, 0.3); transform: translateY(-2px); } .fd-btn-primary:active { transform: translateY(0); box-shadow: 0 4px 12px -2px rgba(254, 204, 2, 0.25); } .fd-btn-secondary { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 2rem; background-color: transparent; color: var(--color-fd-navy); font-family: var(--font-joey-bold); font-size: var(--text-fd-btn); line-height: var(--text-fd-btn--line-height); border-radius: 9999px; border: 2px solid var(--color-fd-navy); text-decoration: none; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .fd-btn-secondary:hover { background-color: var(--color-fd-navy); color: #FFFFFF; box-shadow: 0 8px 24px -4px rgba(14, 35, 56, 0.3); transform: translateY(-2px); } .fd-btn-secondary:active { transform: translateY(0); box-shadow: 0 4px 12px -2px rgba(14, 35, 56, 0.2); } .fd-btn-secondary-dark { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 2rem; background-color: transparent; color: #FFFFFF; font-family: var(--font-joey-bold); font-size: var(--text-fd-btn); line-height: var(--text-fd-btn--line-height); border-radius: 9999px; border: 2px solid #FFFFFF; text-decoration: none; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .fd-btn-secondary-dark:hover { background-color: #FFFFFF; color: var(--color-fd-navy); box-shadow: 0 8px 24px -4px rgba(255, 255, 255, 0.25); transform: translateY(-2px); } .fd-btn-secondary-dark:active { transform: translateY(0); box-shadow: 0 4px 12px -2px rgba(255, 255, 255, 0.15); } /* Navy-filled CTA */ .fd-btn-navy { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 2rem; background-color: var(--color-fd-navy); color: #FFFFFF; font-family: var(--font-joey-bold); font-size: var(--text-fd-btn); line-height: var(--text-fd-btn--line-height); border-radius: 9999px; border: 2px solid transparent; text-decoration: none; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .fd-btn-navy:hover { background-color: var(--color-fd-navy-700); box-shadow: 0 8px 24px -4px rgba(14, 35, 56, 0.4); transform: translateY(-2px); } .fd-btn-navy:active { transform: translateY(0); box-shadow: 0 4px 12px -2px rgba(14, 35, 56, 0.3); } /* Mint CTA (for success/eco contexts) */ .fd-btn-mint { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 2rem; background-color: var(--color-fd-mint); color: var(--color-fd-navy); font-family: var(--font-joey-bold); font-size: var(--text-fd-btn); line-height: var(--text-fd-btn--line-height); border-radius: 9999px; border: 2px solid transparent; text-decoration: none; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .fd-btn-mint:hover { background-color: var(--color-fd-mint-300); box-shadow: 0 8px 24px -4px rgba(103, 239, 139, 0.35); transform: translateY(-2px); } .fd-btn-mint:active { transform: translateY(0); box-shadow: 0 4px 12px -2px rgba(103, 239, 139, 0.25); } /* ---- Standard Section Wrapper ---- Usage:
(less vertical padding) */ .fd-section { position: relative; width: 100%; padding-top: 3rem; /* 48px mobile */ padding-bottom: 3rem; overflow: hidden; } @media (min-width: 48rem) { .fd-section { padding-top: 4rem; /* 64px tablet */ padding-bottom: 4rem; } } @media (min-width: 64rem) { .fd-section { padding-top: 6rem; /* 96px desktop */ padding-bottom: 6rem; } } .fd-section-tight { padding-top: 2rem; padding-bottom: 2rem; } @media (min-width: 48rem) { .fd-section-tight { padding-top: 3rem; padding-bottom: 3rem; } } @media (min-width: 64rem) { .fd-section-tight { padding-top: 4rem; padding-bottom: 4rem; } } /* ---- Standard Content Container ---- Usage:
*/ .fd-container { position: relative; max-width: 1200px; margin-inline: auto; padding-inline: 1.5rem; /* 24px mobile */ } @media (min-width: 48rem) { .fd-container { padding-inline: 2rem; /* 32px tablet+ */ } } } /* ============================================ FIBER DIREKT — MOBILE ENHANCEMENTS ============================================ */ @media (max-width: 47.9375rem) { /* Full-width buttons on mobile for clear tap targets */ .fd-btn-primary, .fd-btn-secondary, .fd-btn-secondary-dark, .fd-btn-navy, .fd-btn-mint { width: 100%; justify-content: center; padding-top: 0.875rem; padding-bottom: 0.875rem; } /* Ensure minimum touch target */ a, button { min-height: 44px; } } /* ============================================ FIBER DIREKT — FRONTEND DARK MODE ============================================ These are for the public site, not Payload admin. Activated by adding data-fd-theme="dark" to . The existing [data-theme='dark'] above is for Payload's admin UI. */ :root { /* Frontend surface tokens (light defaults) */ --fd-bg-primary: #FFFFFF; --fd-bg-secondary: #F0F0F0; --fd-bg-card: #FFFFFF; --fd-text-primary: #0E2338; --fd-text-secondary: #41474F; --fd-text-muted: #6B737E; --fd-border: #E2E4E7; --fd-border-strong: #C8CCD0; } [data-fd-theme='dark'] { --fd-bg-primary: #0A1825; --fd-bg-secondary: #0E2338; --fd-bg-card: #153350; --fd-text-primary: #FFFFFF; --fd-text-secondary: #9DB8CC; --fd-text-muted: #6A94B3; --fd-border: #1C4368; --fd-border-strong: #245580; } /* Also support system preference if no explicit attribute */ @media (prefers-color-scheme: dark) { :root:not([data-fd-theme='light']) { --fd-bg-primary: #0A1825; --fd-bg-secondary: #0E2338; --fd-bg-card: #153350; --fd-text-primary: #FFFFFF; --fd-text-secondary: #9DB8CC; --fd-text-muted: #6A94B3; --fd-border: #1C4368; --fd-border-strong: #245580; } } /* ── FD Prose styles (for Posts rich text) ──────────────────────────────── Add these to your existing globals.css ─────────────────────────────────────────────────────────────────────── */ .fd-prose { font-family: var(--font-joey, sans-serif); color: theme('colors.fd-navy'); } .fd-prose h1, .fd-prose h2, .fd-prose h3, .fd-prose h4 { font-family: var(--font-joey-heavy, sans-serif); color: theme('colors.fd-navy'); margin-top: 2rem; margin-bottom: 1rem; } .fd-prose h2 { font-size: 1.75rem; } .fd-prose h3 { font-size: 1.35rem; } .fd-prose p { font-size: 1.125rem; line-height: 1.75; margin-bottom: 1.25rem; } .fd-prose a { color: theme('colors.fd-navy'); text-decoration: underline; text-underline-offset: 3px; font-family: var(--font-joey-bold, sans-serif); } .fd-prose a:hover { color: theme('colors.fd-yellow'); } .fd-prose ul, .fd-prose ol { padding-left: 1.5rem; margin-bottom: 1.25rem; } .fd-prose li { font-size: 1.125rem; line-height: 1.75; margin-bottom: 0.5rem; } .fd-prose ul li::marker { color: theme('colors.fd-yellow'); } .fd-prose strong { font-family: var(--font-joey-bold, sans-serif); font-weight: normal; } .fd-prose blockquote { border-left: 4px solid theme('colors.fd-yellow'); padding-left: 1.25rem; margin: 2rem 0; font-size: 1.2rem; color: theme('colors.fd-navy'); font-style: italic; } .fd-prose img { border-radius: 24px; margin: 2rem 0; } .fd-prose hr { border-color: #e5e5e5; margin: 2.5rem 0; }