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
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:
@@ -86,7 +86,12 @@ export default function ContactForm() {
|
||||
<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.'}
|
||||
</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'}
|
||||
</Button>
|
||||
</Card>
|
||||
|
||||
@@ -98,7 +98,12 @@ export default function RequestQuoteForm({ productName }: RequestQuoteFormProps)
|
||||
<p className="text-destructive/80 text-xs leading-tight mb-4 !mt-0">
|
||||
{t('errorDesc') || 'Something went wrong. Please try again.'}
|
||||
</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'}
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -11,7 +11,7 @@ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElemen
|
||||
| 'outline'
|
||||
| 'ghost'
|
||||
| 'white'
|
||||
| 'danger';
|
||||
| 'destructive';
|
||||
size?: 'sm' | 'md' | 'lg' | 'xl';
|
||||
href?: string;
|
||||
className?: string;
|
||||
@@ -38,7 +38,8 @@ export function Button({
|
||||
ghost: 'text-primary hover:shadow-lg',
|
||||
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 = {
|
||||
@@ -58,7 +59,7 @@ export function Button({
|
||||
outline: 'bg-primary',
|
||||
ghost: 'bg-primary-light/10',
|
||||
white: 'bg-primary-light',
|
||||
danger: 'bg-danger-dark',
|
||||
destructive: 'bg-destructive/90',
|
||||
};
|
||||
|
||||
const content = (
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
@import "tailwindcss";
|
||||
@import 'tailwindcss';
|
||||
|
||||
@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-body: 'Inter', system-ui, sans-serif;
|
||||
|
||||
@@ -30,43 +32,82 @@
|
||||
--color-success: #10b981;
|
||||
--color-warning: #f59e0b;
|
||||
--color-danger: #ef4444;
|
||||
--color-destructive: #ef4444;
|
||||
--color-destructive-foreground: #ffffff;
|
||||
--color-info: #3b82f6;
|
||||
|
||||
--animate-fade-in: fade-in 0.5s ease-out;
|
||||
--animate-slide-up: slide-up 0.6s ease-out;
|
||||
--animate-slow-zoom: slow-zoom 20s linear infinite;
|
||||
--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;
|
||||
|
||||
@keyframes gradient-x {
|
||||
0%, 100% { background-position: 0% 50%; }
|
||||
50% { background-position: 100% 50%; }
|
||||
0%,
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
}
|
||||
@keyframes fade-in {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes slide-up {
|
||||
from { opacity: 0; transform: translateY(20px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
@keyframes slow-zoom {
|
||||
from { transform: scale(1); }
|
||||
to { transform: scale(1.1); }
|
||||
from {
|
||||
transform: scale(1);
|
||||
}
|
||||
to {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
}
|
||||
@keyframes reveal {
|
||||
from { opacity: 0; transform: translateY(20px); filter: blur(8px); }
|
||||
to { opacity: 1; transform: translateY(0); filter: blur(0); }
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
filter: blur(8px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
filter: blur(0);
|
||||
}
|
||||
}
|
||||
@keyframes slight-fade-in-from-bottom {
|
||||
from { opacity: 0; transform: translateY(10px); filter: blur(4px); }
|
||||
to { opacity: 1; transform: translateY(0); filter: blur(0); }
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(10px);
|
||||
filter: blur(4px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
filter: blur(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
body {
|
||||
@@ -76,63 +117,81 @@
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
@apply font-heading font-bold tracking-tight;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
|
||||
/* Enhanced Mobile-first typography hierarchy with fluid sizing */
|
||||
h1 { @apply text-3xl md:text-5xl lg:text-6xl leading-[1.1]; }
|
||||
h2 { @apply text-2xl md:text-4xl lg:text-5xl leading-[1.2]; }
|
||||
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]; }
|
||||
|
||||
h1 {
|
||||
@apply text-3xl md:text-5xl lg:text-6xl leading-[1.1];
|
||||
}
|
||||
h2 {
|
||||
@apply text-2xl md:text-4xl lg:text-5xl leading-[1.2];
|
||||
}
|
||||
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 */
|
||||
p {
|
||||
@apply mb-4 leading-relaxed;
|
||||
}
|
||||
|
||||
|
||||
/* Link styles */
|
||||
a {
|
||||
@apply no-underline transition-all duration-200;
|
||||
}
|
||||
|
||||
|
||||
/* List styles */
|
||||
ul, ol {
|
||||
ul,
|
||||
ol {
|
||||
@apply my-4 ml-6;
|
||||
}
|
||||
|
||||
|
||||
li {
|
||||
@apply mb-2 leading-relaxed;
|
||||
}
|
||||
|
||||
|
||||
/* Small text */
|
||||
small {
|
||||
@apply text-sm md:text-base;
|
||||
}
|
||||
|
||||
|
||||
/* Strong and emphasis */
|
||||
strong {
|
||||
@apply font-bold;
|
||||
}
|
||||
|
||||
|
||||
em {
|
||||
@apply italic;
|
||||
}
|
||||
|
||||
|
||||
/* Blockquote */
|
||||
blockquote {
|
||||
@apply border-l-4 pl-6 my-6 italic;
|
||||
}
|
||||
|
||||
|
||||
/* Code */
|
||||
code {
|
||||
@apply px-2 py-1 rounded font-mono text-sm;
|
||||
}
|
||||
|
||||
|
||||
/* Horizontal rule */
|
||||
hr {
|
||||
@apply my-8;
|
||||
@@ -177,7 +236,7 @@
|
||||
opacity 0.6s ease-out,
|
||||
transform 0.8s cubic-bezier(0.16, 1, 0.3, 1),
|
||||
filter 0.8s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
|
||||
|
||||
&.is-visible {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
|
||||
Reference in New Issue
Block a user