"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Label } from "@/components/ui/label" import { Switch } from "@/components/ui/switch" import { Slider } from "@/components/ui/slider" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { Textarea } from "@/components/ui/textarea" import { Input } from "@/components/ui/input" import { Copy } from "lucide-react" import { useToast } from "@/hooks/use-toast" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { DemoWebsiteContent } from "./demo-website-content" import { PreviewWidget } from "./preview-widget" import { iconSvgPaths } from "@/lib/icons" type WidgetPosition = "bottom-right" | "bottom-left" type WidgetIcon = "accessibility" | "eye" | "ear" | "type" | "messagesquare" | "volume2" | "mousepointer2" type ContrastMode = "normal" | "dark" | "light" type SaturationMode = "normal" | "low" | "high" export function WidgetConfigurator() { const { toast } = useToast() // State for accessibility settings const [invertColors, setInvertColors] = useState(false) const [grayscale, setGrayscale] = useState(false) const [contrastMode, setContrastMode] = useState("normal") const [saturationMode, setSaturationMode] = useState("normal") const [highlightLinks, setHighlightLinks] = useState(false) const [highlightHeadings, setHighlightHeadings] = useState(false) // readingMode wurde entfernt const [contentScaling, setContentScaling] = useState([100]) const [fontSize, setFontSize] = useState([100]) // lineHeight wurde entfernt const [letterSpacing, setLetterSpacing] = useState([0]) // Existing features (kept) const [removeImages, setRemoveImages] = useState(false) // colorblindMode wurde entfernt const [disableAnimations, setDisableAnimations] = useState(false) const [largeCursor, setLargeCursor] = useState(false) const [dyslexiaFont, setDyslexiaFont] = useState(false) // New states const [blueFilter, setBlueFilter] = useState(false) const [muteSounds, setMuteSounds] = useState(false) // State for widget appearance settings const [widgetPosition, setWidgetPosition] = useState("bottom-right") const [buttonColor, setButtonColor] = useState("#007bff") const [accentColor, setAccentColor] = useState("#007bff") const [widgetIcon, setWidgetIcon] = useState("accessibility") // State for generated embed code const [embedCode, setEmbedCode] = useState("") // Calculate active features for the badge const activeFeaturesCount = [ invertColors, grayscale, contrastMode !== "normal", saturationMode !== "normal", highlightLinks, highlightHeadings, removeImages, // colorblindMode wurde entfernt fontSize[0] !== 100, contentScaling[0] !== 100, // lineHeight[0] !== 100, // lineHeight wurde entfernt letterSpacing[0] !== 0, disableAnimations, largeCursor, dyslexiaFont, // New features blueFilter, muteSounds, ].filter(Boolean).length // Effect to regenerate embed code whenever settings change useEffect(() => { const generateEmbedCode = () => { const baseUrl = "https://v0-next-js-widget-configurator.vercel.app" // Replace with your actual deployed URL const selectedIconClass = iconSvgPaths[widgetIcon] || iconSvgPaths.accessibility const resetIconClass = iconSvgPaths.rotateRight const closeIconClass = iconSvgPaths.xmark const positionStyle = widgetPosition === "bottom-right" ? `bottom: 20px; right: 20px; left: auto;` : `bottom: 20px; left: 20px; right: auto;` const badgeHtml = activeFeaturesCount > 0 ? `${activeFeaturesCount}` : "" const htmlContent = `
` const externalCssLink = `` const externalJsScript = `` setEmbedCode(`${htmlContent}\n${externalCssLink}\n${externalJsScript}`) } generateEmbedCode() }, [ invertColors, grayscale, contrastMode, saturationMode, highlightLinks, highlightHeadings, contentScaling, fontSize, letterSpacing, removeImages, disableAnimations, largeCursor, dyslexiaFont, widgetPosition, buttonColor, accentColor, widgetIcon, activeFeaturesCount, // New dependencies blueFilter, muteSounds, ]) const copyToClipboard = () => { navigator.clipboard.writeText(embedCode) toast({ title: "Code kopiert!", description: "Der Einbettungscode wurde in die Zwischenablage kopiert.", }) } return (
Widget-Einstellungen

Text- und Skalierungsanpassungen

Visuelle Anpassungen

setContrastMode(value)} className="flex space-x-4" >
setSaturationMode(value)} className="flex space-x-4" >

Interaktions-Anpassungen

Widget-Darstellung

setWidgetPosition(value)} className="flex space-x-8" >
setButtonColor(e.target.value)} className="w-full h-10 p-1 border-gray-300 rounded-md" />
setAccentColor(e.target.value)} className="w-full h-10 p-1 border-gray-300 rounded-md" />
setWidgetIcon(value)} className="grid grid-cols-3 gap-4" >
Vorschau & Einbettung

Live-Vorschau

Barrierefreiheits-Menü Live-Vorschau
{/* Demo Website Content */} {/* Widget Preview - Use the new PreviewWidget component */}

Klicken Sie auf "Vorschau anzeigen", um das Widget in Aktion auf einer Demo-Website zu sehen.

Einbettungscode für Webflow