import { html, css, cssManager } from '@design.estate/dees-element';
import '@design.estate/dees-wcctools/demotools';
import { injectCssVariables } from '../../00variables.js';
import type { DeesMobileViewstack } from './dees-mobile-viewstack.js';
// Shared styles for demos
const sharedStyles = html`
`;
// Helper functions
const handleListClick = (viewstack: DeesMobileViewstack, listName: string) => {
const listView = viewstack.querySelector('[view-id="list"]');
if (listView) {
(listView as HTMLElement).dataset.listName = listName;
}
viewstack.pushView('list');
};
const handleItemClick = (viewstack: DeesMobileViewstack, itemName: string) => {
const itemView = viewstack.querySelector('[view-id="item"]');
if (itemView) {
(itemView as HTMLElement).dataset.itemName = itemName;
}
viewstack.pushView('item');
};
const handleBack = (viewstack: DeesMobileViewstack) => {
viewstack.popView();
};
/**
* Demo 1: Mobile Phone Layout
* Simulates a typical mobile app navigation pattern
*/
const mobileDemo = () => {
injectCssVariables();
return html`
${sharedStyles}
Mobile Phone Layout (375x667)
Simulates iPhone SE dimensions. Tap items to navigate forward, use back button to return.
{
const target = e.target as HTMLElement;
const status = target?.closest('.demo-container')?.querySelector('.status-bar');
if (status) {
status.textContent = `${e.detail.currentView} (depth: ${e.detail.stackDepth})`;
}
}}
>
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
if (viewstack) handleListClick(viewstack, 'Shopping');
}}>
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
if (viewstack) handleListClick(viewstack, 'Todo');
}}>
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
if (viewstack) handleItemClick(viewstack, 'Milk');
}}>
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
if (viewstack) handleItemClick(viewstack, 'Bread');
}}>
›
Item Details
Full item information would appear here.
lists (depth: 1)
`;
};
/**
* Demo 2: Desktop/Tablet Layout
* Wider layout suitable for tablets and desktop embedded views
*/
const desktopDemo = () => {
injectCssVariables();
return html`
${sharedStyles}
Desktop/Tablet Layout
Wider container suitable for tablet or embedded desktop use. Same navigation behavior.
{
const target = e.target as HTMLElement;
const status = target?.closest('.demo-container')?.querySelector('.status-bar');
if (status) {
status.textContent = `View: ${e.detail.currentView} | Stack: ${e.detail.stackDepth} | Direction: ${e.detail.direction}`;
}
}}
>
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
viewstack?.pushView('products');
}}>
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
viewstack?.pushView('products');
}}>
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
viewstack?.pushView('products');
}}>
Home & Garden
189 products
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
viewstack?.pushView('product-detail');
}}>
Wireless Headphones
$149.99
›
{
const target = e.target as HTMLElement;
const viewstack = target?.closest('dees-mobile-viewstack') as DeesMobileViewstack;
viewstack?.pushView('product-detail');
}}>
›
Wireless Headphones
Premium noise-cancelling headphones with 30-hour battery life.
$149.99
View: categories | Stack: 1 | Direction: none
`;
};
/**
* Demo 3: Programmatic Control
* Demonstrates API methods for controlling navigation
* Uses dees-demowrapper for proper scoped element access in wcctools
*/
const programmaticDemo = () => {
injectCssVariables();
return html`
${sharedStyles}
Programmatic Control
Use the control panel to navigate programmatically via the viewstack API.
{
const viewstack = wrapper.querySelector('dees-mobile-viewstack') as DeesMobileViewstack;
const backBtn = wrapper.querySelector('.btn-back') as HTMLButtonElement;
const rootBtn = wrapper.querySelector('.btn-root') as HTMLButtonElement;
const statusBar = wrapper.querySelector('.status-bar') as HTMLElement;
const pushABtn = wrapper.querySelector('.btn-push-a') as HTMLButtonElement;
const pushBBtn = wrapper.querySelector('.btn-push-b') as HTMLButtonElement;
const pushCBtn = wrapper.querySelector('.btn-push-c') as HTMLButtonElement;
if (!viewstack) return;
const updateButtons = () => {
if (backBtn) backBtn.disabled = !viewstack.canGoBack;
if (rootBtn) rootBtn.disabled = viewstack.stackDepth <= 1;
};
const updateStatus = () => {
if (statusBar) {
statusBar.textContent = `Current: ${viewstack.currentView} | Stack: [${viewstack.viewStack.join(' → ')}] | canGoBack: ${viewstack.canGoBack}`;
}
};
// Set up button click handlers
pushABtn?.addEventListener('click', () => viewstack.pushView('view-a'));
pushBBtn?.addEventListener('click', () => viewstack.pushView('view-b'));
pushCBtn?.addEventListener('click', () => viewstack.pushView('view-c'));
backBtn?.addEventListener('click', () => viewstack.popView());
rootBtn?.addEventListener('click', () => viewstack.goToRoot(false));
// Listen for view changes to update UI
viewstack.addEventListener('view-changed', () => {
updateButtons();
updateStatus();
});
// Initial state
updateButtons();
updateStatus();
}}>
Home View
This is the root view. Use the buttons above to push views onto the stack.
View A
You navigated to View A
View B
You navigated to View B
View C
You navigated to View C
Current: home | Stack: [home] | canGoBack: false
`;
};
/**
* Demo 4: Deep Navigation (4+ levels)
* Shows handling of deeply nested navigation
*/
const deepNavigationDemo = () => {
injectCssVariables();
return html`
${sharedStyles}
Deep Navigation (5 Levels)
Navigate through 5 levels deep: Region → Country → City → District → Location
{
const target = e.target as HTMLElement;
const status = target?.closest('.demo-container')?.querySelector('.status-bar');
if (status) {
const depth = e.detail.stackDepth;
const levels = ['Regions', 'Country', 'City', 'District', 'Location'];
status.textContent = `Level ${depth}/5: ${levels[depth - 1] || 'Unknown'}`;
}
}}
>
{
const target = e.target as HTMLElement;
(target?.closest('dees-mobile-viewstack') as DeesMobileViewstack)?.pushView('country');
}}>
›
{
((e.target as HTMLElement)?.closest('dees-mobile-viewstack') as DeesMobileViewstack)?.pushView('city');
}}>
›
{
((e.target as HTMLElement)?.closest('dees-mobile-viewstack') as DeesMobileViewstack)?.pushView('district');
}}>
›
{
((e.target as HTMLElement)?.closest('dees-mobile-viewstack') as DeesMobileViewstack)?.pushView('location');
}}>
Brandenburg Gate
Historic landmark
›
Brandenburg Gate
An 18th-century neoclassical monument in Berlin. One of the best-known landmarks of Germany.
You've reached the deepest level!
Use the back button to navigate up through the hierarchy.
Level 1/5: Regions
`;
};
// Export array of demo functions
export const demoFunc = [
mobileDemo,
desktopDemo,
programmaticDemo,
deepNavigationDemo,
];