fix: restore critical build/deploy fixes and standardize destructive UI state
Some checks failed
Build & Deploy KLZ Cables / 🔍 Prepare Environment (push) Successful in 9s
Build & Deploy KLZ Cables / 🧪 Quality Assurance (push) Successful in 1m35s
Build & Deploy KLZ Cables / 🏗️ Build Gatekeeper (push) Successful in 21s
Build & Deploy KLZ Cables / 🏗️ Build App (push) Successful in 4m38s
Build & Deploy KLZ Cables / 🚀 Deploy (push) Failing after 12s
Build & Deploy KLZ Cables / ⚡ PageSpeed (push) Has been skipped
Build & Deploy KLZ Cables / 🔔 Notifications (push) Successful in 2s

This commit is contained in:
2026-02-05 14:16:28 +01:00
parent 50347d049d
commit 0379d1f05d
4 changed files with 112 additions and 42 deletions

View File

@@ -86,7 +86,12 @@ export default function ContactForm() {
<p className="text-destructive/80 text-lg mb-8 leading-relaxed font-medium"> <p className="text-destructive/80 text-lg mb-8 leading-relaxed font-medium">
{t('form.error') || 'Something went wrong. Please check your input and try again.'} {t('form.error') || 'Something went wrong. Please check your input and try again.'}
</p> </p>
<Button onClick={() => setStatus('idle')} variant="danger" size="lg" className="w-full"> <Button
onClick={() => setStatus('idle')}
variant="destructive"
size="lg"
className="w-full"
>
{t('form.tryAgain') || 'Try Again'} {t('form.tryAgain') || 'Try Again'}
</Button> </Button>
</Card> </Card>

View File

@@ -98,7 +98,12 @@ export default function RequestQuoteForm({ productName }: RequestQuoteFormProps)
<p className="text-destructive/80 text-xs leading-tight mb-4 !mt-0"> <p className="text-destructive/80 text-xs leading-tight mb-4 !mt-0">
{t('errorDesc') || 'Something went wrong. Please try again.'} {t('errorDesc') || 'Something went wrong. Please try again.'}
</p> </p>
<Button onClick={() => setStatus('idle')} variant="danger" size="sm" className="w-full"> <Button
onClick={() => setStatus('idle')}
variant="destructive"
size="sm"
className="w-full"
>
{t('tryAgain') || 'Try Again'} {t('tryAgain') || 'Try Again'}
</Button> </Button>
</div> </div>

View File

@@ -11,7 +11,7 @@ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElemen
| 'outline' | 'outline'
| 'ghost' | 'ghost'
| 'white' | 'white'
| 'danger'; | 'destructive';
size?: 'sm' | 'md' | 'lg' | 'xl'; size?: 'sm' | 'md' | 'lg' | 'xl';
href?: string; href?: string;
className?: string; className?: string;
@@ -38,7 +38,8 @@ export function Button({
ghost: 'text-primary hover:shadow-lg', ghost: 'text-primary hover:shadow-lg',
white: white:
'bg-white text-primary shadow-md hover:shadow-primary/30 hover:shadow-2xl hover:text-white', 'bg-white text-primary shadow-md hover:shadow-primary/30 hover:shadow-2xl hover:text-white',
danger: 'bg-danger text-white shadow-md hover:shadow-danger/30 hover:shadow-2xl', destructive:
'bg-destructive text-destructive-foreground shadow-md hover:shadow-destructive/30 hover:shadow-2xl',
}; };
const sizes = { const sizes = {
@@ -58,7 +59,7 @@ export function Button({
outline: 'bg-primary', outline: 'bg-primary',
ghost: 'bg-primary-light/10', ghost: 'bg-primary-light/10',
white: 'bg-primary-light', white: 'bg-primary-light',
danger: 'bg-danger-dark', destructive: 'bg-destructive/90',
}; };
const content = ( const content = (

View File

@@ -1,7 +1,9 @@
@import "tailwindcss"; @import 'tailwindcss';
@theme { @theme {
--font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; --font-sans:
'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
Arial, sans-serif;
--font-heading: 'Inter', system-ui, sans-serif; --font-heading: 'Inter', system-ui, sans-serif;
--font-body: 'Inter', system-ui, sans-serif; --font-body: 'Inter', system-ui, sans-serif;
@@ -30,43 +32,82 @@
--color-success: #10b981; --color-success: #10b981;
--color-warning: #f59e0b; --color-warning: #f59e0b;
--color-danger: #ef4444; --color-danger: #ef4444;
--color-destructive: #ef4444;
--color-destructive-foreground: #ffffff;
--color-info: #3b82f6; --color-info: #3b82f6;
--animate-fade-in: fade-in 0.5s ease-out; --animate-fade-in: fade-in 0.5s ease-out;
--animate-slide-up: slide-up 0.6s ease-out; --animate-slide-up: slide-up 0.6s ease-out;
--animate-slow-zoom: slow-zoom 20s linear infinite; --animate-slow-zoom: slow-zoom 20s linear infinite;
--animate-reveal: reveal 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; --animate-reveal: reveal 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
--animate-slight-fade-in-from-bottom: slight-fade-in-from-bottom 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; --animate-slight-fade-in-from-bottom: slight-fade-in-from-bottom 0.8s
cubic-bezier(0.16, 1, 0.3, 1) forwards;
--animate-gradient-x: gradient-x 15s ease infinite; --animate-gradient-x: gradient-x 15s ease infinite;
@keyframes gradient-x { @keyframes gradient-x {
0%, 100% { background-position: 0% 50%; } 0%,
50% { background-position: 100% 50%; } 100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
} }
@keyframes fade-in { @keyframes fade-in {
from { opacity: 0; } from {
to { opacity: 1; } opacity: 0;
}
to {
opacity: 1;
}
} }
@keyframes slide-up { @keyframes slide-up {
from { opacity: 0; transform: translateY(20px); } from {
to { opacity: 1; transform: translateY(0); } opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
} }
@keyframes slow-zoom { @keyframes slow-zoom {
from { transform: scale(1); } from {
to { transform: scale(1.1); } transform: scale(1);
}
to {
transform: scale(1.1);
}
} }
@keyframes reveal { @keyframes reveal {
from { opacity: 0; transform: translateY(20px); filter: blur(8px); } from {
to { opacity: 1; transform: translateY(0); filter: blur(0); } opacity: 0;
transform: translateY(20px);
filter: blur(8px);
}
to {
opacity: 1;
transform: translateY(0);
filter: blur(0);
}
} }
@keyframes slight-fade-in-from-bottom { @keyframes slight-fade-in-from-bottom {
from { opacity: 0; transform: translateY(10px); filter: blur(4px); } from {
to { opacity: 1; transform: translateY(0); filter: blur(0); } opacity: 0;
transform: translateY(10px);
filter: blur(4px);
}
to {
opacity: 1;
transform: translateY(0);
filter: blur(0);
}
} }
} }
@layer base { @layer base {
.bg-primary a, .bg-primary-dark a { .bg-primary a,
.bg-primary-dark a {
@apply text-white/90 hover:text-white transition-colors; @apply text-white/90 hover:text-white transition-colors;
} }
body { body {
@@ -76,63 +117,81 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
line-height: 1.7; line-height: 1.7;
} }
h1, h2, h3, h4, h5, h6 { h1,
h2,
h3,
h4,
h5,
h6 {
@apply font-heading font-bold tracking-tight; @apply font-heading font-bold tracking-tight;
line-height: 1.2; line-height: 1.2;
} }
/* Enhanced Mobile-first typography hierarchy with fluid sizing */ /* Enhanced Mobile-first typography hierarchy with fluid sizing */
h1 { @apply text-3xl md:text-5xl lg:text-6xl leading-[1.1]; } h1 {
h2 { @apply text-2xl md:text-4xl lg:text-5xl leading-[1.2]; } @apply text-3xl md:text-5xl lg:text-6xl leading-[1.1];
h3 { @apply text-xl md:text-2xl lg:text-3xl leading-[1.3]; } }
h4 { @apply text-lg md:text-xl lg:text-2xl leading-[1.4]; } h2 {
h5 { @apply text-base md:text-lg leading-[1.5]; } @apply text-2xl md:text-4xl lg:text-5xl leading-[1.2];
h6 { @apply text-sm md:text-base leading-[1.6]; } }
h3 {
@apply text-xl md:text-2xl lg:text-3xl leading-[1.3];
}
h4 {
@apply text-lg md:text-xl lg:text-2xl leading-[1.4];
}
h5 {
@apply text-base md:text-lg leading-[1.5];
}
h6 {
@apply text-sm md:text-base leading-[1.6];
}
/* Paragraph and text styles */ /* Paragraph and text styles */
p { p {
@apply mb-4 leading-relaxed; @apply mb-4 leading-relaxed;
} }
/* Link styles */ /* Link styles */
a { a {
@apply no-underline transition-all duration-200; @apply no-underline transition-all duration-200;
} }
/* List styles */ /* List styles */
ul, ol { ul,
ol {
@apply my-4 ml-6; @apply my-4 ml-6;
} }
li { li {
@apply mb-2 leading-relaxed; @apply mb-2 leading-relaxed;
} }
/* Small text */ /* Small text */
small { small {
@apply text-sm md:text-base; @apply text-sm md:text-base;
} }
/* Strong and emphasis */ /* Strong and emphasis */
strong { strong {
@apply font-bold; @apply font-bold;
} }
em { em {
@apply italic; @apply italic;
} }
/* Blockquote */ /* Blockquote */
blockquote { blockquote {
@apply border-l-4 pl-6 my-6 italic; @apply border-l-4 pl-6 my-6 italic;
} }
/* Code */ /* Code */
code { code {
@apply px-2 py-1 rounded font-mono text-sm; @apply px-2 py-1 rounded font-mono text-sm;
} }
/* Horizontal rule */ /* Horizontal rule */
hr { hr {
@apply my-8; @apply my-8;
@@ -177,7 +236,7 @@
opacity 0.6s ease-out, opacity 0.6s ease-out,
transform 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1),
filter 0.8s cubic-bezier(0.16, 1, 0.3, 1); filter 0.8s cubic-bezier(0.16, 1, 0.3, 1);
&.is-visible { &.is-visible {
opacity: 1; opacity: 1;
transform: translateY(0); transform: translateY(0);