mirror of
https://github.com/hanzoai/o11y-components.git
synced 2026-11-03 02:06:37 +00:00
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import React, { useState, useCallback, useEffect } from 'react';
|
|
import { createPortal } from 'react-dom';
|
|
import { Sun, Moon } from 'lucide-react';
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
export const ModeDecorator = (Story: any) => {
|
|
const [isDarkMode, setIsDarkMode] = useState(true); // Start with dark mode
|
|
const [mounted, setMounted] = useState(false);
|
|
|
|
const toggleMode = useCallback(() => {
|
|
setIsDarkMode(!isDarkMode);
|
|
document.documentElement.classList.toggle('dark', !isDarkMode);
|
|
}, [isDarkMode]);
|
|
|
|
// Initialize dark mode on mount
|
|
useEffect(() => {
|
|
document.documentElement.classList.add('dark');
|
|
setMounted(true);
|
|
}, []);
|
|
|
|
// Render button using portal to body to avoid transform container issues
|
|
const button = (
|
|
<button
|
|
onClick={toggleMode}
|
|
className="fixed top-4 right-4 z-50 p-2 rounded-2xl
|
|
bg-gray-800 border border-gray-600 shadow-lg
|
|
hover:scale-105 transition-transform cursor-pointer"
|
|
aria-label="Toggle dark mode"
|
|
title="Toggle Dark Mode"
|
|
style={{
|
|
backgroundColor: isDarkMode ? '#1f2937' : '#ffffff',
|
|
borderColor: isDarkMode ? '#4b5563' : '#d1d5db',
|
|
color: isDarkMode ? '#ffffff' : '#000000',
|
|
padding: '0.375rem',
|
|
}}
|
|
>
|
|
{isDarkMode ? <Sun className="w-3 h-3" /> : <Moon className="w-3 h-3" />}
|
|
</button>
|
|
);
|
|
|
|
return (
|
|
<>
|
|
{/* Render button via portal to body to escape transform containers */}
|
|
{mounted && createPortal(button, document.body)}
|
|
<Story />
|
|
</>
|
|
);
|
|
};
|