blob: 3688b300bb6da9ea8ada4996525778daed2c659f [file] [log] [blame]
/**
* Demo module for sketch-view-mode-select component
*/
import { DemoModule } from "./demo-framework/types";
import {
demoUtils,
sampleViewModeConfigs,
viewModeScenarios,
applyViewModeConfig,
createViewModeTestButtons,
} from "./demo-fixtures/index";
const demo: DemoModule = {
title: "View Mode Select Demo",
description:
"Interactive tab navigation for switching between chat, diff, and terminal views",
imports: ["../sketch-view-mode-select"],
styles: ["/dist/tailwind.css"],
setup: async (container: HTMLElement) => {
// Create demo sections
const basicSection = demoUtils.createDemoSection(
"Basic View Mode Selector",
"Click buttons to switch between different views",
);
const scenariosSection = demoUtils.createDemoSection(
"Different Scenarios",
"Pre-configured scenarios showing various diff stats and active modes",
);
const interactiveSection = demoUtils.createDemoSection(
"Interactive Testing",
"Test different configurations and watch the component update",
);
// Basic view mode selector
const basicContainer = document.createElement("div");
basicContainer.className = "@container";
const basicSelector = document.createElement(
"sketch-view-mode-select",
) as any;
basicSelector.id = "basic-selector";
applyViewModeConfig(basicSelector, sampleViewModeConfigs.basic);
basicContainer.appendChild(basicSelector);
// Status display for basic selector
const basicStatus = document.createElement("div");
basicStatus.id = "basic-status";
basicStatus.style.cssText = `
margin-top: 15px;
padding: 10px;
background: #f6f8fa;
border-radius: 6px;
font-family: monospace;
font-size: 14px;
`;
const updateBasicStatus = () => {
basicStatus.innerHTML = `
<strong>Current State:</strong><br>
Active Mode: <code>${basicSelector.activeMode}</code><br>
Diff Stats: <code>+${basicSelector.diffLinesAdded} -${basicSelector.diffLinesRemoved}</code>
`;
};
updateBasicStatus();
// Listen for view mode changes
basicSelector.addEventListener("view-mode-select", (event: CustomEvent) => {
console.log("View mode changed:", event.detail);
basicSelector.activeMode = event.detail.mode;
updateBasicStatus();
});
// Create scenario examples
const scenarioContainer = document.createElement("div");
scenarioContainer.style.cssText = `
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 15px;
margin-top: 15px;
`;
viewModeScenarios.forEach((scenario) => {
const scenarioCard = document.createElement("div");
scenarioCard.style.cssText = `
padding: 15px;
border: 1px solid #d0d7de;
border-radius: 8px;
background: white;
`;
const scenarioTitle = document.createElement("h4");
scenarioTitle.textContent = scenario.name;
scenarioTitle.style.cssText =
"margin: 0 0 5px 0; color: var(--demo-label-color);";
const scenarioDesc = document.createElement("p");
scenarioDesc.textContent = scenario.description;
scenarioDesc.style.cssText =
"margin: 0 0 10px 0; color: var(--demo-fixture-text-color); font-size: 14px;";
const scenarioWrapper = document.createElement("div");
scenarioWrapper.className = "@container";
const scenarioSelector = document.createElement(
"sketch-view-mode-select",
) as any;
applyViewModeConfig(scenarioSelector, scenario.config);
scenarioWrapper.appendChild(scenarioSelector);
scenarioCard.appendChild(scenarioTitle);
scenarioCard.appendChild(scenarioDesc);
scenarioCard.appendChild(scenarioWrapper);
scenarioContainer.appendChild(scenarioCard);
});
// Interactive testing component
const interactiveSelectorContainer = document.createElement("div");
interactiveSelectorContainer.className = "@container";
const interactiveSelector = document.createElement(
"sketch-view-mode-select",
) as any;
interactiveSelector.id = "interactive-selector";
applyViewModeConfig(interactiveSelector, sampleViewModeConfigs.basic);
interactiveSelectorContainer.appendChild(interactiveSelector);
// Status display for interactive selector
const interactiveStatus = document.createElement("div");
interactiveStatus.id = "interactive-status";
interactiveStatus.style.cssText = basicStatus.style.cssText;
const updateInteractiveStatus = () => {
interactiveStatus.innerHTML = `
<strong>Interactive Component State:</strong><br>
Active Mode: <code>${interactiveSelector.activeMode}</code><br>
Diff Lines Added: <code>${interactiveSelector.diffLinesAdded}</code><br>
Diff Lines Removed: <code>${interactiveSelector.diffLinesRemoved}</code><br>
<em>Click scenario buttons above to test different configurations</em>
`;
};
updateInteractiveStatus();
// Listen for view mode changes on interactive selector
interactiveSelector.addEventListener(
"view-mode-select",
(event: CustomEvent) => {
console.log("Interactive view mode changed:", event.detail);
interactiveSelector.activeMode = event.detail.mode;
updateInteractiveStatus();
},
);
// Custom controls for interactive testing
const customControls = document.createElement("div");
customControls.style.cssText = `
margin: 15px 0;
padding: 15px;
background: #f6f8fa;
border-radius: 6px;
`;
const addLinesButton = demoUtils.createButton("Add +5 Lines", () => {
interactiveSelector.diffLinesAdded += 5;
interactiveSelector.requestUpdate();
updateInteractiveStatus();
});
const removeLinesButton = demoUtils.createButton("Add -3 Lines", () => {
interactiveSelector.diffLinesRemoved += 3;
interactiveSelector.requestUpdate();
updateInteractiveStatus();
});
const clearDiffButton = demoUtils.createButton("Clear Diff", () => {
interactiveSelector.diffLinesAdded = 0;
interactiveSelector.diffLinesRemoved = 0;
interactiveSelector.requestUpdate();
updateInteractiveStatus();
});
const randomDiffButton = demoUtils.createButton("Random Diff", () => {
interactiveSelector.diffLinesAdded = Math.floor(Math.random() * 100) + 1;
interactiveSelector.diffLinesRemoved = Math.floor(Math.random() * 50) + 1;
interactiveSelector.requestUpdate();
updateInteractiveStatus();
});
customControls.appendChild(addLinesButton);
customControls.appendChild(removeLinesButton);
customControls.appendChild(clearDiffButton);
customControls.appendChild(randomDiffButton);
// Assemble the demo
basicSection.appendChild(basicContainer);
basicSection.appendChild(basicStatus);
scenariosSection.appendChild(scenarioContainer);
interactiveSection.appendChild(interactiveSelectorContainer);
// Add test buttons for interactive section
createViewModeTestButtons(interactiveSelector, interactiveSection);
interactiveSection.appendChild(customControls);
interactiveSection.appendChild(interactiveStatus);
container.appendChild(basicSection);
container.appendChild(scenariosSection);
container.appendChild(interactiveSection);
// Add container queries responsive testing section
const responsiveSection = demoUtils.createDemoSection(
"Container Query Responsive Testing",
"Demonstrates how the component behaves at different container sizes using Tailwind container queries",
);
// Create explanation text
const explanation = document.createElement("p");
explanation.style.cssText =
"margin: 10px 0; color: var(--demo-secondary-text); font-size: 14px;";
explanation.innerHTML = `
<strong>Container Queries:</strong> The component now uses Tailwind <code>@container</code> queries instead of viewport media queries.<br>
This allows different sized containers to show different responsive behaviors simultaneously.
`;
responsiveSection.appendChild(explanation);
// Create different sized container examples
const containerExamples = [
{
title: "Extra Wide Container (700px)",
description: "Shows full text labels and complete layout",
width: "700px",
config: sampleViewModeConfigs.largeDiff,
containerClass: "w-[700px]",
borderColor: "border-green-500",
},
{
title: "Very Narrow Container (250px)",
description: "Shows icons only (text hidden due to container query)",
width: "250px",
config: sampleViewModeConfigs.terminalActive,
containerClass: "w-[250px]",
borderColor: "border-orange-500",
},
];
const examplesContainer = document.createElement("div");
examplesContainer.style.cssText =
"display: flex; flex-direction: column; gap: 20px; margin: 20px 0;";
containerExamples.forEach((example) => {
// Create container wrapper
const wrapper = document.createElement("div");
wrapper.style.cssText = `
border: 2px solid;
border-radius: 8px;
padding: 15px;
background: #f9f9f9;
`;
wrapper.className = example.borderColor;
// Create title and description
const header = document.createElement("div");
header.style.cssText = "margin-bottom: 10px;";
header.innerHTML = `
<h4 style="margin: 0 0 5px 0; font-weight: 600; color: var(--demo-label-color);">${example.title}</h4>
<p style="margin: 0; font-size: 14px; color: var(--demo-secondary-text);">${example.description}</p>
`;
wrapper.appendChild(header);
// Create constrained container for the component
const componentContainer = document.createElement("div");
componentContainer.className = "@container";
componentContainer.style.cssText = `
width: ${example.width};
border: 1px dashed #ccc;
padding: 10px;
background: white;
border-radius: 4px;
`;
// Create the component
const component = document.createElement(
"sketch-view-mode-select",
) as any;
applyViewModeConfig(component, example.config);
componentContainer.appendChild(component);
wrapper.appendChild(componentContainer);
examplesContainer.appendChild(wrapper);
});
responsiveSection.appendChild(examplesContainer);
// Add interactive container size testing
const containerTestSection = document.createElement("div");
containerTestSection.style.cssText =
"margin-top: 30px; padding-top: 20px; border-top: 1px solid #ddd;";
const interactiveTitle = document.createElement("h4");
interactiveTitle.textContent = "Interactive Container Size Testing";
interactiveTitle.style.cssText = "margin: 0 0 10px 0; font-weight: 600;";
const interactiveDesc = document.createElement("p");
interactiveDesc.textContent =
"Use the buttons below to change the container size and see the responsive behavior in real-time.";
interactiveDesc.style.cssText =
"margin: 0 0 15px 0; color: var(--demo-secondary-text); font-size: 14px;";
// Create interactive container
const interactiveContainer = document.createElement("div");
interactiveContainer.className = "@container";
interactiveContainer.style.cssText = `
border: 2px solid #007acc;
border-radius: 8px;
padding: 15px;
background: #f0f8ff;
transition: width 0.3s ease;
width: 700px;
`;
// Create interactive component
const interactiveComponent = document.createElement(
"sketch-view-mode-select",
) as any;
applyViewModeConfig(interactiveComponent, sampleViewModeConfigs.largeDiff);
// Size info display
const sizeInfo = document.createElement("div");
sizeInfo.style.cssText =
"margin-bottom: 10px; font-family: monospace; font-size: 12px; color: var(--demo-label-color);";
sizeInfo.textContent = "Current container width: 700px";
interactiveContainer.appendChild(sizeInfo);
interactiveContainer.appendChild(interactiveComponent);
// Control buttons
const controlButtons = document.createElement("div");
controlButtons.style.cssText =
"margin-top: 15px; display: flex; gap: 8px; flex-wrap: wrap;";
const sizes = [
{ label: "Extra Wide (700px)", width: "700px" },
{ label: "Medium (400px)", width: "400px" },
{ label: "Very Narrow (250px)", width: "250px" },
];
sizes.forEach((size) => {
const button = demoUtils.createButton(size.label, () => {
interactiveContainer.style.width = size.width;
sizeInfo.textContent = `Current container width: ${size.width}`;
});
controlButtons.appendChild(button);
});
containerTestSection.appendChild(interactiveTitle);
containerTestSection.appendChild(interactiveDesc);
containerTestSection.appendChild(interactiveContainer);
containerTestSection.appendChild(controlButtons);
responsiveSection.appendChild(containerTestSection);
container.appendChild(responsiveSection);
},
cleanup: async () => {
// Clean up any event listeners or intervals if needed
console.log("Cleaning up sketch-view-mode-select demo");
},
};
export default demo;