blob: 5cf304a21109f02bc02e11bf4f306409338dd3b0 [file] [log] [blame]
/**
* Demo module for theme-toggle component
*/
import { DemoModule } from "./demo-framework/types";
import { demoUtils } from "./demo-fixtures/index";
import { ThemeService } from "../theme-service.js";
const demo: DemoModule = {
title: "Theme Toggle Demo",
description:
"Three-way theme toggle: light mode, dark mode, and system preference",
imports: ["../sketch-theme-toggle"],
styles: ["/dist/tailwind.css"],
setup: async (container: HTMLElement) => {
// Initialize the theme service
const themeService = ThemeService.getInstance();
themeService.initializeTheme();
// Create demo sections
const basicSection = demoUtils.createDemoSection(
"Three-Way Theme Toggle",
"Click the toggle button to cycle through: light → dark → system → light",
);
const toggleContainer = document.createElement("div");
toggleContainer.className =
"flex items-center gap-4 p-4 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700";
toggleContainer.innerHTML = `
<sketch-theme-toggle></sketch-theme-toggle>
<div class="text-sm text-gray-600 dark:text-gray-400">
<div class="font-medium mb-1">Theme modes:</div>
<div class="space-y-1">
<div>☀️ Light mode - Always light theme</div>
<div>🌙 Dark mode - Always dark theme</div>
<div>💻 System theme - Follows OS preference</div>
</div>
</div>
`;
basicSection.appendChild(toggleContainer);
// Visual test elements section
const visualSection = demoUtils.createDemoSection(
"Visual Test Elements",
"Elements that demonstrate the theme switching behavior",
);
const visualContainer = document.createElement("div");
visualContainer.className = "space-y-4";
visualContainer.innerHTML = `
<div class="bg-white dark:bg-gray-800 p-4 rounded border border-gray-200 dark:border-gray-600">
<h4 class="font-medium text-gray-900 dark:text-gray-100 mb-2">Test Card</h4>
<p class="text-gray-600 dark:text-gray-300">
This card should switch between light and dark styling when you toggle the theme.
</p>
</div>
<div class="flex gap-3">
<button class="px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded transition-colors">
Primary Button
</button>
<button class="px-4 py-2 bg-gray-200 dark:bg-gray-700 hover:bg-gray-300 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-200 rounded transition-colors">
Secondary Button
</button>
</div>
<div class="grid grid-cols-3 gap-4">
<div class="bg-white dark:bg-gray-800 p-3 rounded border border-gray-200 dark:border-gray-600">
<div class="text-sm font-medium text-gray-900 dark:text-gray-100">Light Background</div>
<div class="text-xs text-gray-500 dark:text-gray-400">Should be dark in dark mode</div>
</div>
<div class="bg-gray-100 dark:bg-gray-800 p-3 rounded border border-gray-200 dark:border-gray-600">
<div class="text-sm font-medium text-gray-900 dark:text-gray-100">Gray Background</div>
<div class="text-xs text-gray-500 dark:text-gray-400">Should be darker in dark mode</div>
</div>
<div class="bg-gray-200 dark:bg-gray-700 p-3 rounded border border-gray-200 dark:border-gray-600">
<div class="text-sm font-medium text-gray-900 dark:text-gray-100">Darker Background</div>
<div class="text-xs text-gray-500 dark:text-gray-400">Should be lighter in dark mode</div>
</div>
</div>
`;
visualSection.appendChild(visualContainer);
// Features section
const featuresSection = demoUtils.createDemoSection(
"Features",
"Key capabilities of the theme toggle component",
);
const featuresContainer = document.createElement("div");
featuresContainer.className =
"bg-blue-50 dark:bg-blue-900/20 p-6 rounded-lg border border-blue-200 dark:border-blue-800";
featuresContainer.innerHTML = `
<ul class="space-y-2 text-sm text-blue-800 dark:text-blue-200">
<li>• Three-way toggle: light → dark → system → light</li>
<li>• Icons: ☀️ (light), 🌙 (dark), 💻 (system)</li>
<li>• System mode follows OS dark/light preference</li>
<li>• Theme preference persists across page reloads</li>
<li>• Emits theme-changed events for component coordination</li>
<li>• Smooth transitions between themes</li>
<li>• Uses localStorage for preference storage</li>
</ul>
`;
featuresSection.appendChild(featuresContainer);
// Add all sections to container
container.appendChild(basicSection);
container.appendChild(visualSection);
container.appendChild(featuresSection);
},
cleanup: async () => {
// Clean up any event listeners or resources if needed
// The theme toggle component handles its own cleanup
},
};
export default demo;