fix(ui): apply user-requested fixes for Meme, TOC, ROI Calculator, and Gantt
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 19s
Build & Deploy / 🏗️ Build (push) Failing after 1m6s
Build & Deploy / 🧪 QA (push) Failing after 2m53s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 1s
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 19s
Build & Deploy / 🏗️ Build (push) Failing after 1m6s
Build & Deploy / 🧪 QA (push) Failing after 2m53s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 1s
This commit is contained in:
@@ -97,13 +97,13 @@ export const ArticleMeme: React.FC<ArticleMemeProps & { image?: string }> = ({ t
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Reveal direction="up" delay={0.1}>
|
<Reveal direction="up" delay={0.1}>
|
||||||
<div id={shareId} className={`not-prose max-w-xl mx-auto my-16 group relative transition-all duration-500 ease-out z-10 ${className}`}>
|
<div id={shareId} className={`not-prose max-w-xl mx-auto my-16 mb-24 group relative transition-all duration-500 ease-out z-10 ${className}`}>
|
||||||
{/* Ambient Glow */}
|
{/* Ambient Glow */}
|
||||||
<div className="absolute -inset-1 bg-gradient-to-r from-red-100/30 to-slate-100/30 rounded-[2rem] blur opacity-10 group-hover:opacity-30 transition duration-1000 -z-10" />
|
<div className="absolute -inset-1 bg-gradient-to-r from-red-100/30 to-slate-100/30 rounded-[2rem] blur opacity-10 group-hover:opacity-30 transition duration-1000 -z-10" />
|
||||||
|
|
||||||
<div className="glass bg-white/80 backdrop-blur-xl border border-slate-100 rounded-2xl overflow-hidden shadow-sm shadow-slate-200 group-hover:shadow-md transition-all duration-500 relative">
|
<div className="glass bg-white/80 backdrop-blur-xl border border-slate-100 rounded-2xl overflow-hidden shadow-sm shadow-slate-200 group-hover:shadow-md transition-all duration-500 relative">
|
||||||
{/* Share Button */}
|
{/* Share Button */}
|
||||||
<div className="absolute top-4 right-4 md:opacity-0 group-hover:opacity-100 transition-opacity duration-500 z-50">
|
<div className="absolute -bottom-14 right-0 md:opacity-0 group-hover:opacity-100 transition-opacity duration-500 z-50">
|
||||||
<ComponentShareButton targetId={shareId} title={`Meme: ${template}`} />
|
<ComponentShareButton targetId={shareId} title={`Meme: ${template}`} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ ${(tasks || [])
|
|||||||
const deps = task.dependencies?.length
|
const deps = task.dependencies?.length
|
||||||
? `, after ${task.dependencies.join(" ")}`
|
? `, after ${task.dependencies.join(" ")}`
|
||||||
: "";
|
: "";
|
||||||
const safeName = task.name.replace(/:/g, " -");
|
const safeName = task.name.replace(/[:&<>"]/g, " -");
|
||||||
return ` ${safeName} :${task.id}, ${task.start}, ${task.duration}${deps}`;
|
return ` ${safeName} :${task.id}, ${task.start}, ${task.duration}${deps}`;
|
||||||
})
|
})
|
||||||
.join("\n")}`;
|
.join("\n")}`;
|
||||||
|
|||||||
@@ -75,12 +75,12 @@ export const TableOfContents: React.FC<TableOfContentsProps> = ({ items, classNa
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`not-prose my-12 p-8 bg-slate-50 border border-slate-200 rounded-2xl ${className}`}>
|
<div className={`not-prose my-12 border-l-2 border-slate-200 pl-6 ${className}`}>
|
||||||
<script
|
<script
|
||||||
type="application/ld+json"
|
type="application/ld+json"
|
||||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
||||||
/>
|
/>
|
||||||
<p className="text-xs font-bold text-slate-400 uppercase tracking-widest mb-6 border-b border-slate-200 pb-2">
|
<p className="text-xs font-bold text-slate-400 uppercase tracking-widest mb-6">
|
||||||
Inhaltsverzeichnis
|
Inhaltsverzeichnis
|
||||||
</p>
|
</p>
|
||||||
<nav>
|
<nav>
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import { ComponentShareButton } from '../ComponentShareButton';
|
|||||||
import { Reveal } from '../Reveal';
|
import { Reveal } from '../Reveal';
|
||||||
|
|
||||||
export function PerformanceROICalculator({ className = '' }: { className?: string }) {
|
export function PerformanceROICalculator({ className = '' }: { className?: string }) {
|
||||||
const [traffic, setTraffic] = useState(800); // Typical niche B2B traffic
|
const [traffic, setTraffic] = useState(300); // Typical niche B2B SME traffic
|
||||||
const [aov, setAov] = useState(25000); // Typical B2B project value
|
const [aov, setAov] = useState(5000); // Typical SME project value
|
||||||
const [loadTime, setLoadTime] = useState(4.5);
|
const [loadTime, setLoadTime] = useState(4.5);
|
||||||
const [baseConv, setBaseConv] = useState(2.0); // 2% Lead-Rate as default
|
const [baseConv, setBaseConv] = useState(2.0); // 2% Lead-Rate as default
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ export function PerformanceROICalculator({ className = '' }: { className?: strin
|
|||||||
<span className="font-mono font-bold text-slate-700">{traffic.toLocaleString('de-DE')}</span>
|
<span className="font-mono font-bold text-slate-700">{traffic.toLocaleString('de-DE')}</span>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<input
|
||||||
type="range" min="100" max="5000" step="100"
|
type="range" min="100" max="2000" step="100"
|
||||||
value={traffic} onChange={(e) => setTraffic(Number(e.target.value))}
|
value={traffic} onChange={(e) => setTraffic(Number(e.target.value))}
|
||||||
className="w-full h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-slate-900"
|
className="w-full h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-slate-900"
|
||||||
/>
|
/>
|
||||||
@@ -90,7 +90,7 @@ export function PerformanceROICalculator({ className = '' }: { className?: strin
|
|||||||
<span className="font-mono font-bold text-slate-700">{formatCurrency(aov)}</span>
|
<span className="font-mono font-bold text-slate-700">{formatCurrency(aov)}</span>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<input
|
||||||
type="range" min="1000" max="250000" step="1000"
|
type="range" min="1000" max="50000" step="1000"
|
||||||
value={aov} onChange={(e) => setAov(Number(e.target.value))}
|
value={aov} onChange={(e) => setAov(Number(e.target.value))}
|
||||||
className="w-full h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-slate-900"
|
className="w-full h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-slate-900"
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user