import { html, css, cssManager } from '@design.estate/dees-element'; import type { DeesDashboardgrid } from './dees-dashboardgrid.js'; import '@design.estate/dees-wcctools/demotools'; export const demoFunc = () => { return html` { const grid = elementArg.querySelector('#dashboardGrid') as DeesDashboardgrid; const seedWidgets = [ { id: 'metrics1', x: 0, y: 0, w: 3, h: 2, title: 'Revenue', icon: 'lucide:dollarSign', content: html`
$124,563
↑ 12.5% from last month
`, }, { id: 'metrics2', x: 3, y: 0, w: 3, h: 2, title: 'Users', icon: 'lucide:users', content: html`
8,234
↑ 5.2% from last week
`, }, { id: 'chart1', x: 6, y: 0, w: 6, h: 4, title: 'Analytics', icon: 'lucide:lineChart', content: html`
Chart visualization area
`, }, ]; grid.widgets = seedWidgets.map(widget => ({ ...widget })); grid.cellHeight = 80; grid.margin = { top: 10, right: 10, bottom: 10, left: 10 }; grid.enableAnimation = true; grid.showGridLines = false; const baseLayout = grid.getLayout().map(item => ({ ...item })); const mobileLayout = grid.widgets.map((widget, index) => ({ id: widget.id, x: 0, y: index === 0 ? 0 : grid.widgets.slice(0, index).reduce((acc, prev) => acc + prev.h, 0), w: grid.columns, h: widget.h, })); grid.layouts = { base: baseLayout, mobile: mobileLayout, }; const statusEl = elementArg.querySelector('#dashboardLayoutStatus') as HTMLElement; const updateStatus = () => { const layout = grid.getLayout(); statusEl.textContent = `Active breakpoint: ${grid.activeBreakpoint} • Tiles: ${layout.length}`; }; const mediaQuery = window.matchMedia('(max-width: 768px)'); const handleBreakpoint = () => { const target = mediaQuery.matches ? 'mobile' : 'base'; grid.applyBreakpointLayout(target); updateStatus(); }; if (typeof mediaQuery.addEventListener === 'function') { mediaQuery.addEventListener('change', handleBreakpoint); } else { (mediaQuery as MediaQueryList & { addListener?: (listener: (this: MediaQueryList, ev: MediaQueryListEvent) => void) => void; }).addListener?.(handleBreakpoint); } handleBreakpoint(); let widgetCounter = 4; const buttons = elementArg.querySelectorAll('dees-button'); buttons.forEach(button => { const text = button.textContent?.trim(); switch (text) { case 'Toggle Animation': button.addEventListener('click', () => { grid.enableAnimation = !grid.enableAnimation; }); break; case 'Toggle Grid Lines': button.addEventListener('click', () => { grid.showGridLines = !grid.showGridLines; }); break; case 'Add Widget': button.addEventListener('click', () => { const newWidget = { id: `widget${widgetCounter++}`, x: 0, y: 0, w: 3, h: 2, autoPosition: true, title: `Widget ${widgetCounter - 1}`, icon: 'lucide:package', content: html`
New widget content
${Math.floor( Math.random() * 1000, )}
`, }; grid.addWidget(newWidget, true); }); break; case 'Compact Grid': button.addEventListener('click', () => { grid.compact(); }); break; case 'Toggle Edit Mode': button.addEventListener('click', () => { grid.editable = !grid.editable; button.textContent = grid.editable ? 'Lock Grid' : 'Unlock Grid'; }); break; case 'Reset Layout': button.addEventListener('click', () => { grid.applyBreakpointLayout(grid.activeBreakpoint); }); break; default: break; } }); // Enhanced logging for reflow events let lastPlaceholderPosition = null; let moveEventCounter = 0; // Helper function to log grid state const logGridState = (eventName: string, details?: any) => { const layout = grid.getLayout(); console.group(`🔄 ${eventName} [Event #${++moveEventCounter}]`); console.log('Timestamp:', new Date().toISOString()); console.log('Grid Configuration:', { columns: grid.columns, cellHeight: grid.cellHeight, margin: grid.margin, editable: grid.editable, activeBreakpoint: grid.activeBreakpoint }); console.log('Current Layout:', layout); console.log('Widget Count:', layout.length); console.log('Grid Bounds:', { totalWidgets: grid.widgets.length, maxY: Math.max(...layout.map(w => w.y + w.h)), occupied: layout.map(w => `${w.id}: (${w.x},${w.y}) ${w.w}x${w.h}`).join(', ') }); if (details) { console.log('Event Details:', details); } console.groupEnd(); }; // Monitor placeholder position changes using MutationObserver const placeholderObserver = new MutationObserver(() => { const placeholder = grid.shadowRoot?.querySelector('.placeholder') as HTMLElement; if (placeholder) { const currentPosition = { left: placeholder.style.left, top: placeholder.style.top, width: placeholder.style.width, height: placeholder.style.height }; if (JSON.stringify(currentPosition) !== JSON.stringify(lastPlaceholderPosition)) { console.group('📍 Placeholder Position Changed'); console.log('Previous:', lastPlaceholderPosition); console.log('Current:', currentPosition); // Extract grid coordinates from style const gridInfo = grid.shadowRoot?.querySelector('.grid-container'); if (gridInfo) { console.log('Grid Container Dimensions:', { width: gridInfo.clientWidth, height: gridInfo.clientHeight }); } console.groupEnd(); lastPlaceholderPosition = currentPosition; } } }); // Start observing the shadow DOM for placeholder changes if (grid.shadowRoot) { placeholderObserver.observe(grid.shadowRoot, { childList: true, subtree: true, attributes: true, attributeFilter: ['style'] }); } // Log initial state logGridState('Initial Grid State'); grid.addEventListener('widget-move', (e: CustomEvent) => { logGridState('Widget Move', { widget: e.detail.widget, displaced: e.detail.displaced, swappedWith: e.detail.swappedWith }); }); grid.addEventListener('widget-resize', (e: CustomEvent) => { logGridState('Widget Resize', { widget: e.detail.widget, displaced: e.detail.displaced, swappedWith: e.detail.swappedWith }); }); grid.addEventListener('widget-remove', (e: CustomEvent) => { logGridState('Widget Remove', { removedWidget: e.detail.widget }); updateStatus(); }); grid.addEventListener('layout-change', () => { logGridState('Layout Change'); updateStatus(); }); // Monitor during drag/resize operations using pointer events grid.addEventListener('pointerdown', (e: PointerEvent) => { const isHeader = (e.target as HTMLElement).closest('.widget-header'); const isResizeHandle = (e.target as HTMLElement).closest('.resize-handle'); if (isHeader || isResizeHandle) { console.group(`🎯 Interaction Started: ${isHeader ? 'Drag' : 'Resize'}`); console.log('Target Widget:', (e.target as HTMLElement).closest('.widget')?.getAttribute('data-widget-id')); console.log('Pointer Position:', { x: e.clientX, y: e.clientY }); console.groupEnd(); // Track pointer move during interaction const handlePointerMove = (moveEvent: PointerEvent) => { const widget = (e.target as HTMLElement).closest('.widget'); if (widget) { console.log(`↔️ Pointer Move:`, { widgetId: widget.getAttribute('data-widget-id'), position: { x: moveEvent.clientX, y: moveEvent.clientY }, delta: { x: moveEvent.clientX - e.clientX, y: moveEvent.clientY - e.clientY } }); } }; const handlePointerUp = () => { console.group('🏁 Interaction Ended'); logGridState('Final State After Interaction'); console.groupEnd(); document.removeEventListener('pointermove', handlePointerMove); document.removeEventListener('pointerup', handlePointerUp); }; document.addEventListener('pointermove', handlePointerMove); document.addEventListener('pointerup', handlePointerUp); } }); // Log when widgets are added const originalAddWidget = grid.addWidget.bind(grid); grid.addWidget = (widget: any, autoPosition?: boolean) => { console.group('➕ Adding Widget'); console.log('New Widget:', widget); console.log('Auto Position:', autoPosition); const result = originalAddWidget(widget, autoPosition); logGridState('After Widget Added'); console.groupEnd(); return result; }; // Log compact operations const originalCompact = grid.compact.bind(grid); grid.compact = (direction?: string) => { console.group('🗜️ Compacting Grid'); console.log('Direction:', direction || 'vertical'); logGridState('Before Compact'); const result = originalCompact(direction); logGridState('After Compact'); console.groupEnd(); return result; }; updateStatus(); }}>
Toggle Animation Toggle Grid Lines Add Widget Compact Grid Reset Layout Toggle Edit Mode
Drag to reposition, resize from handles, or right-click a header to delete a tile.
`; };