rud-dashboard 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.preact.ts","../../src/components/Dashboard.tsx","../../src/components/DashboardToolbar.tsx","../../src/ui/button.tsx","../../src/lib/utils.ts","../../src/ui/tooltip.tsx","../../src/components/widgets/BasicWidget.tsx","../../src/components/widgets/ProgressBarWidget.tsx","../../src/components/widgets/PieChartWidget.tsx","../../src/components/widgets/BarChartWidget.tsx","../../src/components/widgets/LineChartWidget.tsx","../../src/components/widgets/index.ts","../../src/lib/useDashboardController.ts","../../src/constants.ts","#style-inject:#style-inject","../../src/styles.css"],"sourcesContent":["// Re-export components with Preact types\nimport DashboardComponent from './components/Dashboard'\nexport { default as Dashboard } from './components/Dashboard'\nexport { DashboardToolbar } from './components/DashboardToolbar'\nexport { Button } from './ui/button'\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './ui/tooltip'\nexport * from './types/preact'\nexport * from './constants'\nimport './styles.css'\n\n// Default export for convenience\nexport default DashboardComponent\n","\"use client\";\nimport * as React from 'react';\nimport { useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { Plus, X, MoreHorizontal } from 'lucide-react';\nimport { DashboardToolbar } from './DashboardToolbar';\nimport { getWidgetComponent } from './widgets';\nimport { useDashboardController } from '../lib/useDashboardController';\nimport { GridItem, DragState, ResizeState, DashboardProps, WidgetType, DashboardActions, DashboardState, CustomToolbarProps } from '../types/index';\nimport { GRID_SIZE, MARGIN, CELL_SIZE, ANIMATION_DURATION, MIN_SIZE, MAX_SIZE, CONTAINER_PADDING, MIN_CONTAINER_HEIGHT, DEBOUNCE_DELAY } from '../constants';\n\n\nconst createWidgetRenderer = (widgetRegistry?: Record<string, any>) => (item: GridItem) => {\n let WidgetComponent: any;\n\n if (widgetRegistry && widgetRegistry[item.type]) {\n WidgetComponent = widgetRegistry[item.type];\n } else {\n WidgetComponent = getWidgetComponent(item.type);\n }\n\n // Pass all necessary props for rendering, matching GridItem structure if needed by actual widget\n return <WidgetComponent id={item.id} title={item.title} type={item.type} />;\n};\n\nexport default function Dashboard({\n availableWidgetTypes = [],\n initialItems = [],\n widgetRegistry,\n onItemsChange,\n className = \"\",\n enableEditMode = true,\n defaultEditMode = true,\n\n // Grid appearance\n gridMode = 'elegant',\n\n // Toolbar customization options\n showDefaultToolbar = true,\n customToolbar,\n toolbarClassName = \"\",\n\n // Exposed action callbacks\n onEditModeChange,\n onAddWidgetModeChange,\n onFixedHeightChange,\n controller: externalController,\n}: DashboardProps) {\n const renderWidgetContent = useMemo(() => createWidgetRenderer(widgetRegistry), [widgetRegistry]);\n\n // Transform initial items to include the content function\n const transformInitialItems = useCallback((items: Omit<GridItem, 'content'>[]): GridItem[] => {\n return items.map(item => ({\n ...item,\n content: () => renderWidgetContent(item as GridItem)\n }));\n }, [renderWidgetContent]);\n\n // Initialize controller\n const internalController = useDashboardController({\n initialItems: transformInitialItems(initialItems),\n initialEditMode: enableEditMode ? defaultEditMode : false\n });\n\n const controller = externalController || internalController;\n\n // Ensure items have content renderers (in case they came from external controller without them)\n const items = useMemo(() => {\n return controller.items.map(item => {\n // If content is missing or if we want to ensure we use the latest registry\n if (!item.content) {\n return { ...item, content: () => renderWidgetContent(item) };\n }\n return item;\n });\n }, [controller.items, renderWidgetContent]);\n\n const setItems = controller.setItems;\n const isEditMode = controller.isEditMode;\n const setIsEditMode = controller.setEditMode;\n\n\n // Calculate nextId based on existing items\n const [nextId, setNextId] = useState(() => {\n if (initialItems.length === 0) return 1;\n const maxId = Math.max(...initialItems.map(item => parseInt(item.id) || 0));\n return maxId + 1;\n });\n\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [resizeState, setResizeState] = useState<ResizeState | null>(null);\n const [preview, setPreview] = useState<GridItem | null>(null);\n const [gridDimensions, setGridDimensions] = useState({ width: 800, height: 600, cols: 16, rows: 12 });\n const [maxHeight, setMaxHeight] = useState<number | null>(null);\n // isEditMode managed by controller\n const [isAddWidgetMode, setIsAddWidgetMode] = useState(false);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const debounceTimer = useRef<number | null>(null);\n const isInitialLoad = useRef(true);\n\n // Trigger callback when items change (but not on initial load)\n useEffect(() => {\n if (onItemsChange && !isInitialLoad.current) {\n // Convert items to the format expected by the callback (without content function)\n const itemsForCallback = items.map(({ content, ...item }) => item);\n onItemsChange(itemsForCallback);\n }\n isInitialLoad.current = false;\n }, [items, onItemsChange]);\n\n // Update items when initialItems prop changes\n useEffect(() => {\n // If external controller is provided, we should NOT sync with initialItems prop\n // as the controller is the source of truth.\n if (externalController) return;\n\n // Only update if the initialItems prop actually changed (not when internal items change)\n // We check if there are items in initialItems that aren't in current items\n const hasNewItems = initialItems.some(initItem => !items.find(item => item.id === initItem.id));\n const hasMissingItems = items.some(item => !initialItems.find(initItem => initItem.id === item.id) && initialItems.length > 0);\n\n if (hasNewItems || (hasMissingItems && items.length < initialItems.length)) {\n const transformedItems = transformInitialItems(initialItems);\n setItems(transformedItems);\n isInitialLoad.current = true; // Prevent triggering onItemsChange for this update\n }\n }, [initialItems, transformInitialItems, externalController]);\n\n const itemsOverlap = (a: GridItem, b: GridItem) =>\n !(a.x + a.w <= b.x || b.x + b.w <= a.x || a.y + a.h <= b.y || b.y + b.h <= a.y);\n\n const isValidPosition = (item: GridItem, allItems: GridItem[], excludeId?: string) => {\n if (item.w < MIN_SIZE || item.h < MIN_SIZE) return false; // Check min size\n if (item.x < 0 || item.y < 0 ||\n item.x + item.w > gridDimensions.cols ||\n item.y + item.h > gridDimensions.rows) {\n return false;\n }\n return !allItems.some(other => {\n if (other.id === item.id || other.id === excludeId) return false;\n return itemsOverlap(item, other);\n });\n };\n\n // Function overloads for pixelToGrid to ensure proper typing\n function pixelToGrid(px: number, py: number, forCoord: 'x'): number;\n function pixelToGrid(px: number, py: number, forCoord: 'y'): number;\n function pixelToGrid(px: number, py: number, forCoord?: 'generic'): { x: number; y: number };\n function pixelToGrid(px: number, py: number, forCoord: 'x' | 'y' | 'generic' = 'generic'): number | { x: number; y: number } {\n // This simplified pixelToGrid assumes coords are relative to the grid content area already\n if (forCoord === 'x') return Math.round(px / CELL_SIZE);\n if (forCoord === 'y') return Math.round(py / CELL_SIZE);\n return { // Fallback to old logic if used generically, but prefer specific coord.\n x: Math.round((px - CONTAINER_PADDING) / CELL_SIZE),\n y: Math.round((py - CONTAINER_PADDING) / CELL_SIZE)\n }\n }\n\n const gridToPixel = (x: number, y: number) => ({\n x: x * CELL_SIZE,\n y: y * CELL_SIZE\n });\n\n const findSafePosition = (item: GridItem, existingItems: GridItem[], preferCurrentOverStoredOriginal = false): { x: number; y: number; w: number; h: number; isAnimating: boolean } => {\n let currentW = Math.min(item.w, gridDimensions.cols);\n let currentH = item.h;\n\n let startX = item.x;\n let startY = item.y;\n\n if (item.originalX !== undefined && item.originalY !== undefined && !preferCurrentOverStoredOriginal) {\n startX = item.originalX;\n startY = item.originalY;\n if (item.originalW !== undefined) currentW = Math.min(item.originalW, gridDimensions.cols);\n if (item.originalH !== undefined) currentH = item.originalH;\n }\n\n startX = Math.min(startX, gridDimensions.cols - currentW);\n\n const testItemInitial = { ...item, x: startX, y: startY, w: currentW, h: currentH };\n if (isValidPosition(testItemInitial, existingItems)) {\n return { ...testItemInitial, isAnimating: true };\n }\n\n // For new widgets (starting at 0,0), use left-to-right, top-to-bottom scan first\n if (startX === 0 && startY === 0 && existingItems.length > 0) {\n // Find the maximum Y position to start searching from\n const maxY = Math.max(...existingItems.map(it => it.y + it.h), 0);\n\n // Search row by row, left to right\n for (let y = 0; y <= Math.max(maxY, gridDimensions.rows - currentH); y++) {\n for (let x = 0; x <= gridDimensions.cols - currentW; x++) {\n const candidateItem = { ...item, x, y, w: currentW, h: currentH };\n if (isValidPosition(candidateItem, existingItems)) {\n return { ...candidateItem, isAnimating: true };\n }\n }\n }\n }\n\n // Spiral search from the starting position (for repositioning existing items)\n const maxSearchDistance = Math.max(gridDimensions.cols, gridDimensions.rows);\n for (let distance = 1; distance <= maxSearchDistance; distance++) {\n for (let dy = -distance; dy <= distance; dy++) {\n for (let dx = -distance; dx <= distance; dx++) {\n if (Math.abs(dx) !== distance && Math.abs(dy) !== distance) continue;\n\n const testX = startX + dx;\n const testY = startY + dy;\n\n if (testX < 0 || testX + currentW > gridDimensions.cols ||\n testY < 0 || testY + currentH > gridDimensions.rows) continue;\n\n const candidateItem = { ...item, x: testX, y: testY, w: currentW, h: currentH };\n if (isValidPosition(candidateItem, existingItems)) {\n return { ...candidateItem, isAnimating: true };\n }\n }\n }\n }\n\n // Final fallback: scan entire grid\n for (let y = 0; y <= gridDimensions.rows - currentH; y++) {\n for (let x = 0; x <= gridDimensions.cols - currentW; x++) {\n const candidateItem = { ...item, x, y, w: currentW, h: currentH };\n if (isValidPosition(candidateItem, existingItems)) {\n return { ...candidateItem, isAnimating: true };\n }\n }\n }\n\n const finalW = Math.min(currentW, gridDimensions.cols);\n const finalH = Math.min(currentH, gridDimensions.rows);\n return { ...item, x: 0, y: 0, w: finalW, h: finalH, isAnimating: true };\n };\n\n const detectAndFixOverlaps = (currentItems: GridItem[], tryReAnchorToOriginals = false): GridItem[] => {\n const result = currentItems.map(i => ({ ...i }));\n let hasOverlaps = true;\n let attempts = 0;\n const maxAttempts = Math.max(20, result.length * 2);\n\n while (hasOverlaps && attempts < maxAttempts) {\n hasOverlaps = false;\n attempts++;\n\n result.sort((a, b) => (a.y - b.y) || (a.x - b.x));\n\n for (let i = 0; i < result.length; i++) {\n for (let j = i + 1; j < result.length; j++) {\n if (itemsOverlap(result[i], result[j])) {\n hasOverlaps = true;\n\n const itemToMoveIndex = (result[j].y > result[i].y || (result[j].y === result[i].y && result[j].x > result[i].x)) ? j : i;\n\n const itemToMove = result[itemToMoveIndex];\n const fixedItems = result.filter((_, idx) => idx !== itemToMoveIndex);\n\n const newPositionData = findSafePosition(itemToMove, fixedItems, !tryReAnchorToOriginals);\n\n result[itemToMoveIndex] = {\n ...itemToMove,\n x: newPositionData.x,\n y: newPositionData.y,\n w: newPositionData.w,\n h: newPositionData.h,\n isAnimating: newPositionData.isAnimating,\n };\n }\n }\n }\n }\n return result;\n };\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const availableWidth = rect.width - CONTAINER_PADDING * 2;\n const newCols = Math.max(MIN_SIZE, Math.floor((availableWidth + MARGIN) / CELL_SIZE)); // Ensure at least MIN_SIZE cols\n\n // Calculate maxY based on current items, ensuring items are within newCols\n const tempClampedItems = items.map(it => ({\n ...it,\n w: Math.min(it.originalW !== undefined ? it.originalW : it.w, newCols) // Use originalW if available\n }));\n const maxY = tempClampedItems.length > 0 ? Math.max(...tempClampedItems.map(item => item.y + item.h), 0) : MIN_SIZE; // Min rows if empty\n\n const minRowsForMinHeight = Math.ceil((MIN_CONTAINER_HEIGHT - (CONTAINER_PADDING * 2) + MARGIN) / CELL_SIZE);\n const requiredRows = Math.max(minRowsForMinHeight, maxY + 4); // +4 buffer\n\n const newHeight = maxHeight || Math.max(MIN_CONTAINER_HEIGHT,\n requiredRows * CELL_SIZE - MARGIN + CONTAINER_PADDING * 2);\n\n const oldCols = gridDimensions.cols;\n const oldRows = gridDimensions.rows;\n\n setGridDimensions({\n width: rect.width, // Updated to use full container width\n height: newHeight,\n cols: newCols,\n rows: requiredRows\n });\n\n // Trigger reflow if cols changed OR if rows significantly increased (might mean items need to spread)\n if ((newCols !== oldCols || requiredRows > oldRows + 2) && newCols > 0 && items.length > 0) {\n reflowItems(newCols, requiredRows);\n }\n }, [items, maxHeight, gridDimensions.cols, gridDimensions.rows]);\n\n\n const reflowItems = (newCols: number, newRows: number) => {\n const processedItems: GridItem[] = [];\n\n // Create a local isValidPosition function that uses the new dimensions\n const isValidPositionForNewGrid = (item: GridItem, allItems: GridItem[], excludeId?: string) => {\n if (item.w < MIN_SIZE || item.h < MIN_SIZE) return false;\n if (item.x < 0 || item.y < 0 ||\n item.x + item.w > newCols ||\n item.y + item.h > newRows) {\n return false;\n }\n return !allItems.some(other => {\n if (other.id === item.id || other.id === excludeId) return false;\n return itemsOverlap(item, other);\n });\n };\n\n const sortedItems = [...items].sort((a, b) => {\n const aHasOriginal = a.originalX !== undefined && a.originalY !== undefined;\n const bHasOriginal = b.originalX !== undefined && b.originalY !== undefined;\n if (aHasOriginal && !bHasOriginal) return -1;\n if (!aHasOriginal && bHasOriginal) return 1;\n if (aHasOriginal && bHasOriginal) {\n if (a.originalY! !== b.originalY!) return a.originalY! - b.originalY!;\n return a.originalX! - b.originalX!;\n }\n return parseInt(a.id) - parseInt(b.id);\n });\n\n const itemsToProcess = sortedItems.map(item => {\n const targetW = item.originalW !== undefined ? Math.min(item.originalW, newCols) : Math.min(item.w, newCols);\n const targetH = item.originalH !== undefined ? item.originalH : item.h; // Heights usually less dependent on cols\n return {\n ...item,\n w: Math.max(MIN_SIZE, targetW), // Ensure min width\n h: Math.max(MIN_SIZE, targetH), // Ensure min height\n isAnimating: true,\n };\n });\n\n if (newCols > gridDimensions.cols) { // Expanding\n const restored: GridItem[] = [];\n const needsRepositioning: GridItem[] = [];\n\n for (const item of itemsToProcess) {\n if (item.originalX !== undefined && item.originalY !== undefined) {\n const restoredItem = {\n ...item, // Contains already adjusted w/h\n x: item.originalX,\n y: item.originalY,\n };\n // Check if original position is valid and doesn't conflict with already restored items\n if (restoredItem.x + restoredItem.w <= newCols &&\n restoredItem.y + restoredItem.h <= newRows &&\n isValidPositionForNewGrid(restoredItem, restored)) {\n restored.push(restoredItem);\n } else {\n needsRepositioning.push(item); // item already has target w/h\n }\n } else {\n needsRepositioning.push(item);\n }\n }\n\n for (const item of needsRepositioning) {\n // preferCurrentOverStoredOriginal = false (use originalX/Y as base)\n const safePosData = findSafePositionForNewGrid(item, restored, false, newCols, newRows);\n restored.push({\n ...item, // Contains item's target w/h\n x: safePosData.x,\n y: safePosData.y,\n w: safePosData.w, // Use width from findSafePosition\n h: safePosData.h, // Use height from findSafePosition\n // originalX/Y/W/H are preserved from item\n });\n }\n setItems(detectAndFixOverlaps(restored, true));\n } else { // Shrinking or same size\n for (const item of itemsToProcess) {\n let targetX = item.x;\n // If shrinking, ensure x is valid for new width. Max(0, newCols - item.w) is key.\n if (newCols < gridDimensions.cols) {\n targetX = Math.min(item.x, Math.max(0, newCols - item.w));\n }\n const itemForSafePos = { ...item, x: targetX }; // item already has target w/h\n // preferCurrentOverStoredOriginal = true (use current/adjusted x/y as base)\n const safePosData = findSafePositionForNewGrid(itemForSafePos, processedItems, true, newCols, newRows);\n processedItems.push({\n ...item, // Contains item's target w/h\n x: safePosData.x,\n y: safePosData.y,\n w: safePosData.w,\n h: safePosData.h,\n });\n }\n setItems(detectAndFixOverlaps(processedItems, true));\n }\n setTimeout(() => setItems((prev: GridItem[]) => prev.map(it => ({ ...it, isAnimating: false }))), ANIMATION_DURATION);\n };\n\n // Helper function for findSafePosition that works with new grid dimensions\n const findSafePositionForNewGrid = (item: GridItem, existingItems: GridItem[], preferCurrentOverStoredOriginal = false, cols: number, rows: number): { x: number; y: number; w: number; h: number; isAnimating: boolean } => {\n let currentW = Math.min(item.w, cols);\n let currentH = item.h;\n\n let startX = item.x;\n let startY = item.y;\n\n if (item.originalX !== undefined && item.originalY !== undefined && !preferCurrentOverStoredOriginal) {\n startX = item.originalX;\n startY = item.originalY;\n if (item.originalW !== undefined) currentW = Math.min(item.originalW, cols);\n if (item.originalH !== undefined) currentH = item.originalH;\n }\n\n startX = Math.min(startX, cols - currentW);\n\n const testItemInitial = { ...item, x: startX, y: startY, w: currentW, h: currentH };\n\n // Check if initial position is valid using new grid dimensions\n const isValidForNewGrid = (testItem: GridItem) => {\n if (testItem.w < MIN_SIZE || testItem.h < MIN_SIZE) return false;\n if (testItem.x < 0 || testItem.y < 0 ||\n testItem.x + testItem.w > cols ||\n testItem.y + testItem.h > rows) {\n return false;\n }\n return !existingItems.some(other => {\n if (other.id === testItem.id) return false;\n return itemsOverlap(testItem, other);\n });\n };\n\n if (isValidForNewGrid(testItemInitial)) {\n return { ...testItemInitial, isAnimating: true };\n }\n\n const maxSearchDistance = Math.max(cols, rows);\n for (let distance = 1; distance <= maxSearchDistance; distance++) {\n for (let dy = -distance; dy <= distance; dy++) {\n for (let dx = -distance; dx <= distance; dx++) {\n if (Math.abs(dx) !== distance && Math.abs(dy) !== distance) continue;\n\n const testX = startX + dx;\n const testY = startY + dy;\n\n if (testX < 0 || testX + currentW > cols ||\n testY < 0 || testY + currentH > rows) continue;\n\n const candidateItem = { ...item, x: testX, y: testY, w: currentW, h: currentH };\n if (isValidForNewGrid(candidateItem)) {\n return { ...candidateItem, isAnimating: true };\n }\n }\n }\n }\n\n for (let y = 0; y <= rows - currentH; y++) {\n for (let x = 0; x <= cols - currentW; x++) {\n const candidateItem = { ...item, x, y, w: currentW, h: currentH };\n if (isValidForNewGrid(candidateItem)) {\n return { ...candidateItem, isAnimating: true };\n }\n }\n }\n\n const finalW = Math.min(currentW, cols);\n const finalH = Math.min(currentH, rows);\n return { ...item, x: 0, y: 0, w: finalW, h: finalH, isAnimating: true };\n };\n const handleMouseMove = useCallback((e: MouseEvent) => {\n const gridContentRect = containerRef.current?.getBoundingClientRect();\n if (!gridContentRect) return;\n\n const mouseXInGridContent = e.clientX - gridContentRect.left - CONTAINER_PADDING;\n const mouseYInGridContent = e.clientY - gridContentRect.top - CONTAINER_PADDING;\n\n if (dragState && preview) {\n const itemX = mouseXInGridContent - dragState.startX;\n const itemY = mouseYInGridContent - dragState.startY;\n\n // FIX: Convert pixel coordinates to grid coordinates properly\n const gridPos = {\n x: pixelToGrid(itemX, 0, 'x'), // Only X coordinate matters for X grid position\n y: pixelToGrid(0, itemY, 'y') // Only Y coordinate matters for Y grid position\n };\n\n let newX = Math.max(0, Math.min(gridDimensions.cols - preview.w, gridPos.x));\n let newY = Math.max(0, Math.min(gridDimensions.rows - preview.h, gridPos.y));\n\n setPreview({ ...preview, x: newX, y: newY });\n }\n\n if (resizeState && preview) {\n let { x, y, w, h } = resizeState.originalItem;\n const handle = resizeState.handle;\n\n // FIX: Calculate delta in grid units properly for resize\n const dxInGridUnits = pixelToGrid(mouseXInGridContent - resizeState.startX, 0, 'x');\n const dyInGridUnits = pixelToGrid(0, mouseYInGridContent - resizeState.startY, 'y');\n\n if (handle.includes('e')) w = Math.max(MIN_SIZE, Math.min(MAX_SIZE, resizeState.originalItem.w + dxInGridUnits));\n if (handle.includes('w')) {\n const newW = Math.max(MIN_SIZE, Math.min(MAX_SIZE, resizeState.originalItem.w - dxInGridUnits));\n x = resizeState.originalItem.x + (resizeState.originalItem.w - newW);\n w = newW;\n }\n if (handle.includes('s')) h = Math.max(MIN_SIZE, Math.min(MAX_SIZE, resizeState.originalItem.h + dyInGridUnits));\n if (handle.includes('n')) {\n const newH = Math.max(MIN_SIZE, Math.min(MAX_SIZE, resizeState.originalItem.h - dyInGridUnits));\n y = resizeState.originalItem.y + (resizeState.originalItem.h - newH);\n h = newH;\n }\n\n x = Math.max(0, x);\n y = Math.max(0, y);\n w = Math.min(w, gridDimensions.cols - x);\n h = Math.min(h, gridDimensions.rows - y);\n w = Math.max(MIN_SIZE, w);\n h = Math.max(MIN_SIZE, h);\n\n setPreview({ ...preview, x, y, w, h });\n }\n }, [dragState, resizeState, preview, gridDimensions.cols, gridDimensions.rows]);\n\n const handleMouseUp = useCallback(() => {\n if ((dragState || resizeState) && preview) {\n // const activeId = dragState?.id || resizeState?.id || '';\n // const actionType = dragState ? 'drag' : 'resize';\n\n // Clamp final preview values to be safe\n const finalX = Math.max(0, Math.min(preview.x, gridDimensions.cols - MIN_SIZE));\n const finalY = Math.max(0, Math.min(preview.y, gridDimensions.rows - MIN_SIZE));\n const finalW = Math.max(MIN_SIZE, Math.min(preview.w, gridDimensions.cols - finalX));\n const finalH = Math.max(MIN_SIZE, Math.min(preview.h, gridDimensions.rows - finalY));\n\n const finalPreview = {\n ...preview,\n x: finalX, y: finalY, w: finalW, h: finalH,\n };\n\n const updatedItems = items.map(item => {\n if (item.id === (dragState?.id || resizeState?.id)) {\n return {\n ...finalPreview,\n originalX: finalPreview.x,\n originalY: finalPreview.y,\n originalW: finalPreview.w,\n originalH: finalPreview.h,\n isAnimating: true,\n };\n }\n return item;\n });\n\n setItems(updatedItems);\n setItems((prev: GridItem[]) => detectAndFixOverlaps(prev.map((it: GridItem) => ({ ...it, isAnimating: false })), true));\n }\n\n setDragState(null);\n setResizeState(null);\n setPreview(null);\n }, [dragState, resizeState, preview, items, gridDimensions.cols, gridDimensions.rows]);\n\n useEffect(() => {\n if (dragState || resizeState) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }\n }, [dragState, resizeState, handleMouseMove, handleMouseUp]);\n\n useEffect(() => {\n const observer = new ResizeObserver(() => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n debounceTimer.current = setTimeout(calculateDimensions, DEBOUNCE_DELAY) as unknown as number;\n });\n if (containerRef.current) {\n observer.observe(containerRef.current);\n calculateDimensions();\n }\n return () => {\n observer.disconnect();\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n };\n }, [calculateDimensions]);\n\n const toggleEditMode = () => {\n if (!enableEditMode) return; // Don't allow toggling if edit mode is disabled\n const newEditMode = !isEditMode;\n setIsEditMode(newEditMode);\n setIsAddWidgetMode(false);\n setDragState(null); setResizeState(null); setPreview(null);\n\n // Call the callback if provided\n onEditModeChange?.(newEditMode);\n };\n\n const toggleAddWidgetMode = () => {\n if (!isEditMode) return;\n const newAddWidgetMode = !isAddWidgetMode;\n setIsAddWidgetMode(newAddWidgetMode);\n\n // Call the callback if provided\n onAddWidgetModeChange?.(newAddWidgetMode);\n };\n\n const toggleFixedHeight = () => {\n const newMaxHeight = maxHeight === null ? MIN_CONTAINER_HEIGHT * 1.5 : null;\n setMaxHeight(newMaxHeight);\n\n // Call the callback if provided\n onFixedHeightChange?.(newMaxHeight !== null);\n };\n\n const addWidgetAtPosition = (widgetConfig: WidgetType, x?: number, y?: number) => {\n if (!isEditMode) return;\n\n const tempItemForPositioning: GridItem = {\n id: 'temp',\n x: x ?? 0, y: y ?? 0,\n w: widgetConfig.defaultSize.w, h: widgetConfig.defaultSize.h,\n type: widgetConfig.type, title: widgetConfig.title, content: () => null,\n originalX: x ?? 0, originalY: y ?? 0,\n originalW: widgetConfig.defaultSize.w, originalH: widgetConfig.defaultSize.h,\n };\n\n const safePosData = findSafePosition(tempItemForPositioning, items, false);\n\n const newItem: GridItem = {\n id: nextId.toString(),\n x: safePosData.x, y: safePosData.y,\n w: safePosData.w, h: safePosData.h,\n type: widgetConfig.type, title: widgetConfig.title,\n content: () => renderWidgetContent({ id: nextId.toString(), type: widgetConfig.type, title: widgetConfig.title } as GridItem),\n originalX: safePosData.x, originalY: safePosData.y,\n originalW: safePosData.w, originalH: safePosData.h,\n onMenuClick: widgetConfig.onMenuClick,\n menuIcon: widgetConfig.menuIcon,\n isAnimating: true,\n };\n if (isValidPosition(newItem, items)) {\n const newItems = [...items, newItem];\n const itemsWithOverlapsFixed = detectAndFixOverlaps(newItems, true);\n setItems(itemsWithOverlapsFixed);\n setNextId(prevId => prevId + 1);\n\n // Remove animation after a delay\n setTimeout(() => {\n setItems((prev: GridItem[]) => prev.map((it: GridItem) => ({ ...it, isAnimating: false })));\n }, ANIMATION_DURATION);\n } else {\n const fallbackItem = { ...newItem, x: 0, y: 0, originalX: 0, originalY: 0 };\n const newItems = [...items, fallbackItem];\n const itemsWithOverlapsFixed = detectAndFixOverlaps(newItems, true);\n setItems(itemsWithOverlapsFixed);\n setNextId(prevId => prevId + 1);\n\n // Remove animation after a delay\n setTimeout(() => {\n setItems((prev: GridItem[]) => prev.map((it: GridItem) => ({ ...it, isAnimating: false })));\n }, ANIMATION_DURATION);\n }\n };\n\n const removeItem = (id: string) => {\n if (!isEditMode) return;\n setItems(items.filter(item => item.id !== id));\n };\n\n const autoOrganize = () => {\n if (!isEditMode) return;\n\n // Sort by area (largest first) then by ID for consistent ordering\n const sorted = [...items].sort((a, b) => {\n const aArea = (a.originalW ?? a.w) * (a.originalH ?? a.h);\n const bArea = (b.originalW ?? b.w) * (b.originalH ?? b.h);\n return bArea - aArea || parseInt(a.id) - parseInt(b.id);\n });\n\n const organized: GridItem[] = [];\n\n // Process each item to find the best position\n for (const item of sorted) {\n // Use original dimensions if available, but clamp to current grid\n const targetW = Math.min(\n item.originalW ?? item.w,\n gridDimensions.cols\n );\n const targetH = item.originalH ?? item.h;\n\n // Create a temporary item for position finding\n const itemToPlace: GridItem = {\n ...item,\n w: Math.max(MIN_SIZE, targetW),\n h: Math.max(MIN_SIZE, targetH),\n isAnimating: true,\n };\n\n // Find the best position using a more systematic approach\n let bestPosition = null;\n let bestY = Infinity;\n let bestX = Infinity;\n\n // Try to place the item starting from top-left, scanning row by row\n for (let y = 0; y <= gridDimensions.rows - itemToPlace.h; y++) {\n for (let x = 0; x <= gridDimensions.cols - itemToPlace.w; x++) {\n const candidateItem = { ...itemToPlace, x, y };\n\n // Check if this position is valid (no overlaps with already placed items)\n const isValid = !organized.some(placedItem =>\n itemsOverlap(candidateItem, placedItem)\n );\n\n if (isValid) {\n // This position works - check if it's better than our current best\n if (y < bestY || (y === bestY && x < bestX)) {\n bestPosition = { x, y };\n bestY = y;\n bestX = x;\n break; // Found the leftmost position in this row\n }\n }\n }\n if (bestPosition && bestY === y) break; // Found position in this row\n }\n\n if (bestPosition) {\n // Use the best position we found\n const organizedItem: GridItem = {\n ...item,\n x: bestPosition.x,\n y: bestPosition.y,\n w: itemToPlace.w,\n h: itemToPlace.h,\n originalX: bestPosition.x,\n originalY: bestPosition.y,\n originalW: itemToPlace.w,\n originalH: itemToPlace.h,\n isAnimating: true,\n };\n organized.push(organizedItem);\n } else {\n // Fallback: use findSafePosition if no position found\n const safePositionData = findSafePosition(itemToPlace, organized, false);\n const organizedItem: GridItem = {\n ...item,\n x: safePositionData.x,\n y: safePositionData.y,\n w: safePositionData.w,\n h: safePositionData.h,\n originalX: safePositionData.x,\n originalY: safePositionData.y,\n originalW: safePositionData.w,\n originalH: safePositionData.h,\n isAnimating: true,\n };\n organized.push(organizedItem);\n }\n }\n\n // Apply the organized layout\n setItems(organized);\n\n // Remove animation flag after animation completes\n setTimeout(() => {\n setItems(prev => prev.map(item => ({ ...item, isAnimating: false })));\n }, ANIMATION_DURATION);\n };\n\n\n const renderItem = (item: GridItem, isPreview = false) => {\n const pos = gridToPixel(item.x, item.y);\n // Ensure width/height are at least 0 to prevent style errors if item.w/h somehow become negative during processing\n const itemWidth = Math.max(0, item.w);\n const itemHeight = Math.max(0, item.h);\n\n const size = {\n width: itemWidth * GRID_SIZE + (itemWidth > 0 ? (itemWidth - 1) * MARGIN : 0),\n height: itemHeight * GRID_SIZE + (itemHeight > 0 ? (itemHeight - 1) * MARGIN : 0)\n };\n const isActive = dragState?.id === item.id || resizeState?.id === item.id;\n\n // Handle mouse down for both dragging and resizing\n const handleMouseDownOnWidget = (e: any) => {\n if (!isEditMode || isPreview) return;\n e.preventDefault();\n\n const rect = e.currentTarget.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Define corner areas (20px from each edge)\n const cornerSize = 20;\n const isInTopLeft = mouseX <= cornerSize && mouseY <= cornerSize;\n const isInTopRight = mouseX >= rect.width - cornerSize && mouseY <= cornerSize;\n const isInBottomLeft = mouseX <= cornerSize && mouseY >= rect.height - cornerSize;\n const isInBottomRight = mouseX >= rect.width - cornerSize && mouseY >= rect.height - cornerSize;\n\n if (isInTopLeft || isInTopRight || isInBottomLeft || isInBottomRight) {\n // Handle resize\n let handle = '';\n if (isInTopLeft) handle = 'nw';\n else if (isInTopRight) handle = 'ne';\n else if (isInBottomLeft) handle = 'sw';\n else if (isInBottomRight) handle = 'se';\n\n const gridContentRect = containerRef.current?.getBoundingClientRect();\n if (!gridContentRect) return;\n\n setResizeState({\n id: item.id,\n startX: e.clientX - gridContentRect.left - CONTAINER_PADDING,\n startY: e.clientY - gridContentRect.top - CONTAINER_PADDING,\n originalItem: { ...item },\n handle\n });\n setPreview({ ...item });\n } else {\n // Handle drag from header area\n const gridContentRect = containerRef.current?.getBoundingClientRect();\n if (!gridContentRect) return;\n\n // Calculate mouse position relative to grid content area\n const mouseXInGridContent = e.clientX - gridContentRect.left - CONTAINER_PADDING;\n const mouseYInGridContent = e.clientY - gridContentRect.top - CONTAINER_PADDING;\n\n // Calculate the item's current pixel position\n const itemPixelPos = gridToPixel(item.x, item.y);\n\n // Store the offset from mouse to item's top-left corner (both in grid content coordinates)\n setDragState({\n id: item.id,\n startX: mouseXInGridContent - itemPixelPos.x,\n startY: mouseYInGridContent - itemPixelPos.y,\n originalItem: { ...item }\n });\n setPreview({ ...item });\n }\n };\n\n return (\n <div\n key={`${isPreview ? 'preview-' : ''}${item.id}`}\n className={`group absolute rounded-lg border ${item.isAnimating || isPreview ? 'transition-all duration-300' : ''} ${isPreview ? 'bg-blue-100 dark:bg-blue-900/30 border-blue-300 dark:border-blue-600 border-2 opacity-80 z-50' : `bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700 shadow-lg hover:shadow-xl dark:shadow-gray-900/50 z-10 ${isActive && !isPreview ? 'opacity-50' : ''}`} ${isEditMode && !isPreview ? 'cursor-grab active:cursor-grabbing' : 'cursor-default'}`}\n style={{ left: pos.x, top: pos.y, width: size.width, height: size.height }}\n onMouseDown={handleMouseDownOnWidget}\n >\n {/* Corner resize areas - invisible but functional */}\n {!isPreview && isEditMode && (\n <>\n <div className=\"absolute top-0 left-0 w-5 h-5 cursor-nw-resize z-20\" />\n <div className=\"absolute top-0 right-0 w-5 h-5 cursor-ne-resize z-20\" />\n <div className=\"absolute bottom-0 left-0 w-5 h-5 cursor-sw-resize z-20\" />\n <div className=\"absolute bottom-0 right-0 w-5 h-5 cursor-se-resize z-20\" />\n </>\n )}\n\n <div\n className={`flex items-center justify-between p-2 text-xs border-b select-none ${isPreview ? 'bg-blue-50 dark:bg-blue-900/50 border-blue-200 dark:border-blue-700' : 'bg-gradient-to-r from-blue-50 to-purple-50 dark:from-gray-700 dark:to-gray-700 border-gray-200 dark:border-gray-700 hover:from-blue-100 hover:to-purple-100 dark:hover:from-gray-600 dark:hover:to-gray-600'}`}\n >\n <span className={`font-medium truncate ${isPreview ? 'text-blue-700 dark:text-blue-300' : 'text-gray-700 dark:text-gray-200'}`}>\n {item.title}\n </span>\n {!isPreview && (\n <div className=\"flex items-center gap-0.5 flex-shrink-0\">\n {isEditMode && item.onMenuClick && (\n <button\n className=\"text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 p-0.5\"\n onClick={(e) => {\n e.stopPropagation();\n item.onMenuClick?.(e);\n }}\n onMouseDown={(e) => e.stopPropagation()}\n title=\"Widget options\"\n >\n {item.menuIcon || <MoreHorizontal size={14} />}\n </button>\n )}\n {isEditMode && (\n <button\n onClick={(e) => { e.stopPropagation(); removeItem(item.id); }}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"text-gray-400 dark:text-gray-500 hover:text-red-500 dark:hover:text-red-400 p-0.5 hover:bg-red-50 dark:hover:bg-red-900/20 rounded\"\n title=\"Remove widget\"\n >\n <X size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n <div className=\"p-1 flex items-center justify-center h-[calc(100%-30px)] overflow-auto\">\n {item.content ? item.content() : null}\n </div>\n </div>\n );\n };\n\n\n\n // Create dashboard actions object for custom toolbars\n const dashboardActions: DashboardActions = {\n toggleEditMode,\n toggleAddWidgetMode,\n autoOrganize,\n toggleFixedHeight,\n addWidget: addWidgetAtPosition,\n removeItem,\n };\n\n // Create dashboard state object for custom toolbars\n const dashboardState: DashboardState = {\n isEditMode,\n isAddWidgetMode,\n isFixedHeight: maxHeight !== null,\n gridDimensions,\n itemCount: items.length,\n items,\n };\n\n // Custom toolbar props\n const customToolbarProps: CustomToolbarProps = {\n state: dashboardState,\n actions: dashboardActions,\n availableWidgetTypes,\n };\n\n // Grid rendering functions\n const renderElegantGrid = () => (\n <>\n {/* Light mode elegant grid */}\n <div\n className=\"absolute pointer-events-none opacity-20\"\n style={{\n top: CONTAINER_PADDING, left: CONTAINER_PADDING,\n right: CONTAINER_PADDING, bottom: CONTAINER_PADDING,\n backgroundImage: `\n linear-gradient(to right, rgba(156, 163, 175, 0.25) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(156, 163, 175, 0.25) 1px, transparent 1px)\n `,\n backgroundSize: `${CELL_SIZE}px ${CELL_SIZE}px`,\n }}\n />\n\n {/* Dark mode elegant grid */}\n <div\n className=\"absolute pointer-events-none dark:block hidden opacity-15\"\n style={{\n top: CONTAINER_PADDING, left: CONTAINER_PADDING,\n right: CONTAINER_PADDING, bottom: CONTAINER_PADDING,\n backgroundImage: `\n linear-gradient(to right, rgba(75, 85, 99, 0.3) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(75, 85, 99, 0.3) 1px, transparent 1px)\n `,\n backgroundSize: `${CELL_SIZE}px ${CELL_SIZE}px`,\n }}\n />\n </>\n );\n\n const renderDotsGrid = () => (\n <div\n className=\"absolute pointer-events-none opacity-30 dark:opacity-20\"\n style={{\n top: CONTAINER_PADDING, left: CONTAINER_PADDING,\n right: CONTAINER_PADDING, bottom: CONTAINER_PADDING,\n backgroundImage: `\n radial-gradient(circle at center, rgba(156, 163, 175, 0.4) 1px, transparent 1px),\n radial-gradient(circle at center, rgba(75, 85, 99, 0.5) 1px, transparent 1px)\n `,\n backgroundSize: `${CELL_SIZE}px ${CELL_SIZE}px`,\n backgroundPosition: `${CELL_SIZE / 2}px ${CELL_SIZE / 2}px`,\n }}\n />\n );\n\n const renderHarshGrid = () => (\n <div\n className=\"absolute opacity-20 dark:opacity-10 pointer-events-none\"\n style={{\n top: CONTAINER_PADDING, left: CONTAINER_PADDING,\n right: CONTAINER_PADDING, bottom: CONTAINER_PADDING,\n backgroundImage: `\n linear-gradient(to right, #ccc 1px, transparent 1px), \n linear-gradient(to bottom, #ccc 1px, transparent 1px)\n `,\n backgroundSize: `${CELL_SIZE}px ${CELL_SIZE}px`,\n }}\n />\n );\n\n const renderGrid = () => {\n switch (gridMode) {\n case 'dots':\n return renderDotsGrid();\n case 'harsh':\n return renderHarshGrid();\n case 'blank':\n return null;\n case 'elegant':\n default:\n return renderElegantGrid();\n }\n };\n\n return (\n <div className={`p-4 bg-gray-50 dark:bg-gray-900 min-h-screen ${className}`}>\n {/* Conditional toolbar rendering */}\n {showDefaultToolbar && !customToolbar && (\n <DashboardToolbar\n isEditMode={isEditMode}\n onToggleMode={toggleEditMode}\n onAutoOrganize={autoOrganize}\n onToggleFixedHeight={toggleFixedHeight}\n isFixedHeight={maxHeight !== null}\n gridDimensions={gridDimensions}\n itemCount={items.length}\n isAddWidgetMode={isAddWidgetMode}\n onToggleAddWidgetMode={toggleAddWidgetMode}\n onAddWidget={addWidgetAtPosition}\n availableWidgetTypes={availableWidgetTypes}\n />\n )}\n\n {/* Custom toolbar */}\n {customToolbar && (\n <div className={toolbarClassName}>\n {React.isValidElement(customToolbar)\n ? customToolbar\n : React.createElement(customToolbar as React.ComponentType<CustomToolbarProps>, customToolbarProps)\n }\n </div>\n )}\n\n <div className=\"w-full\">\n <div\n ref={containerRef}\n className={`relative bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg w-full ${maxHeight ? 'overflow-auto' : 'overflow-hidden'}`}\n style={{ height: gridDimensions.height, minHeight: MIN_CONTAINER_HEIGHT, padding: CONTAINER_PADDING }}\n >\n {renderGrid()}\n <div\n className=\"relative w-full\"\n style={{ height: Math.max(0, gridDimensions.rows * CELL_SIZE - MARGIN), minHeight: `calc(100% - ${CONTAINER_PADDING * 2}px)` }}\n >\n {items.map(item => renderItem(item))}\n {preview && renderItem(preview, true)}\n\n {items.length === 0 && !isAddWidgetMode && (\n <div className=\"absolute inset-0 flex items-center justify-center text-gray-400 dark:text-gray-500\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-gray-100 dark:bg-gray-700 rounded-full flex items-center justify-center mx-auto mb-3\">\n <Plus size={24} />\n </div>\n <p>{isEditMode ? 'Click \"Add Widget\" to start' : 'No widgets'}</p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Zap, Edit3, Eye, Plus, X, Grid, TrendingUp, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Button } from '../ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';\nimport { getPreviewComponent, widgetRegistry, previewRegistry } from './widgets';\nimport { WidgetType, DashboardToolbarProps } from '../types';\n\n// Default widget types if none provided\nconst defaultWidgetTypes: WidgetType[] = [\n {\n id: 'basic',\n type: 'basic',\n title: 'Basic Widget',\n icon: <Grid size={20} />,\n defaultSize: { w: 4, h: 4 },\n description: 'A simple widget for general content',\n component: widgetRegistry.basic,\n preview: previewRegistry.basic\n },\n {\n id: 'progress',\n type: 'progress',\n title: 'Progress Bar',\n icon: <TrendingUp size={20} />,\n defaultSize: { w: 4, h: 3 },\n description: 'Display progress with visual bar',\n component: widgetRegistry.progress,\n preview: previewRegistry.progress\n }\n];\n\nexport function DashboardToolbar({\n isEditMode,\n onToggleMode,\n onAutoOrganize,\n onToggleFixedHeight,\n isFixedHeight,\n gridDimensions,\n itemCount,\n isAddWidgetMode = false,\n onToggleAddWidgetMode,\n onAddWidget,\n availableWidgetTypes = defaultWidgetTypes,\n}: DashboardToolbarProps) {\n const [scrollPosition, setScrollPosition] = React.useState(0);\n const carouselRef = React.useRef<HTMLDivElement>(null);\n\n const scroll = (direction: 'left' | 'right') => {\n if (!carouselRef.current) return;\n const scrollAmount = 200;\n const newPosition = direction === 'left'\n ? Math.max(0, scrollPosition - scrollAmount)\n : scrollPosition + scrollAmount;\n\n carouselRef.current.scrollTo({ left: newPosition, behavior: 'smooth' });\n setScrollPosition(newPosition);\n };\n\n return (\n <TooltipProvider>\n <div className=\"bg-white dark:bg-gray-800 shadow-sm border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={onToggleMode}\n variant={isEditMode ? \"default\" : \"outline\"}\n size=\"sm\"\n className=\"gap-2 bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-600\"\n >\n {isEditMode ? (\n <>\n <Edit3 size={16} />\n Edit Mode\n </>\n ) : (\n <>\n <Eye size={16} />\n View Mode\n </>\n )}\n </Button>\n <div className=\"text-sm text-gray-500 dark:text-gray-200 px-2\">\n Grid: {gridDimensions.cols}×{gridDimensions.rows}\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n {isEditMode && (\n <>\n {isAddWidgetMode ? (\n <Button\n onClick={onToggleAddWidgetMode}\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-2 text-red-600 hover:text-red-700 border-red-200 hover:border-red-300 bg-white dark:bg-gray-800\"\n >\n <X size={16} />\n Cancel\n </Button>\n ) : (\n <Button\n onClick={onToggleAddWidgetMode}\n variant=\"default\"\n size=\"sm\"\n className=\"gap-2 bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-600\"\n >\n <Plus size={16} />\n Add Widget\n </Button>\n )}\n\n <Button\n onClick={onToggleFixedHeight}\n variant=\"secondary\"\n size=\"sm\"\n className=\"bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200\"\n >\n {isFixedHeight ? 'Auto Height' : 'Fix Height'}\n </Button>\n\n <Button\n onClick={onAutoOrganize}\n variant=\"outline\"\n size=\"sm\"\n disabled={itemCount === 0}\n className=\"gap-2 border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-800\"\n >\n <Zap size={16} />\n Auto Organize\n </Button>\n </>\n )}\n </div>\n </div>\n\n {/* Widget Selection Carousel */}\n {isEditMode && isAddWidgetMode && (\n <div className=\"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center gap-2 mb-3\">\n <h3 className=\"font-medium text-gray-800 dark:text-gray-200\">Select a widget to add:</h3>\n </div>\n\n <div className=\"relative\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => scroll('left')}\n className=\"flex-shrink-0 h-12 w-8 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-200\"\n disabled={scrollPosition === 0}\n >\n <ChevronLeft size={16} />\n </Button>\n\n <div\n ref={carouselRef}\n className=\"flex gap-3 overflow-x-auto scrollbar-hide flex-1\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {availableWidgetTypes.map((widget: WidgetType) => {\n const PreviewComponent = widget.preview || getPreviewComponent(widget.type);\n\n return (\n <Tooltip key={widget.id}>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n onClick={() => onAddWidget?.(widget)}\n className=\"flex-shrink-0 h-20 w-24 p-2 flex flex-col items-center gap-1 hover:border-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900/50 bg-white dark:bg-gray-800 transition-colors group border-gray-200 dark:border-gray-700\"\n >\n <div className=\"text-blue-600 dark:text-blue-400 group-hover:text-blue-700 dark:group-hover:text-blue-300\">\n {widget.icon}\n </div>\n <span className=\"text-xs font-medium text-center leading-tight text-gray-700 dark:text-gray-200\">\n {widget.title}\n </span>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <div className=\"p-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"text-blue-600 dark:text-blue-400\">\n {widget.icon}\n </div>\n <div>\n <h4 className=\"font-medium text-sm text-gray-800 dark:text-gray-200\">\n {widget.title}\n </h4>\n <p className=\"text-xs text-gray-500 dark:text-gray-200\">\n Size: {widget.defaultSize.w}×{widget.defaultSize.h}\n </p>\n </div>\n </div>\n <p className=\"text-xs text-gray-600 dark:text-gray-200 mb-3\">\n {widget.description}\n </p>\n <div className=\"h-16 border border-gray-200 dark:border-gray-700 rounded bg-gray-50 dark:bg-gray-750 overflow-hidden\">\n <PreviewComponent />\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => scroll('right')}\n className=\"flex-shrink-0 h-12 w-8 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-200\"\n >\n <ChevronRight size={16} />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n} ","import { cva, VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends VariantProps<typeof buttonVariants> {\n className?: string\n onClick?: (e: any) => void\n disabled?: boolean\n type?: \"button\" | \"submit\" | \"reset\"\n children?: any\n ref?: any\n [key: string]: any\n}\n\nexport function Button({ className, variant, size, ref, ...props }: ButtonProps) {\n return (\n <button\n className={cn(buttonVariants({ variant, size }), className)}\n ref={ref}\n {...props}\n />\n )\n}\n\nButton.displayName = \"Button\"\n\nexport { buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\"\n\nimport { createContext, useContext, useState, useRef, useEffect, useLayoutEffect } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { cn } from \"../lib/utils\"\n\ninterface TooltipContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n delay: number\n triggerRef: { current: HTMLDivElement | null }\n}\n\nconst TooltipContext = createContext<TooltipContextValue | undefined>(undefined)\n\ninterface TooltipProviderProps {\n children?: unknown\n}\n\nexport function TooltipProvider({ children }: TooltipProviderProps) {\n return <>{children}</>\n}\n\ninterface TooltipProps {\n children?: unknown\n delayDuration?: number\n}\n\nexport function Tooltip({ children, delayDuration = 200 }: TooltipProps) {\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const content: any = <div ref={triggerRef} className=\"relative inline-block\">\n {children as any}\n </div>\n\n return (\n <TooltipContext.Provider value={{ open, setOpen, delay: delayDuration, triggerRef }}>\n {content}\n </TooltipContext.Provider>\n )\n}\n\ninterface TooltipTriggerProps {\n children?: unknown\n className?: string\n asChild?: boolean\n [key: string]: any\n}\n\nexport function TooltipTrigger({ children, asChild, className, ...props }: TooltipTriggerProps) {\n const context = useContext(TooltipContext)\n if (!context) throw new Error(\"TooltipTrigger must be used within Tooltip\")\n\n const { setOpen, delay } = context\n const timeoutRef = useRef<any>()\n\n const handleMouseEnter = () => {\n timeoutRef.current = setTimeout(() => setOpen(true), delay)\n }\n\n const handleMouseLeave = () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setOpen(false)\n }\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [])\n\n return (\n <div\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn(\"inline-block\", className)}\n {...props}\n >\n {children as any}\n </div>\n )\n}\n\nTooltipTrigger.displayName = \"TooltipTrigger\"\n\ninterface TooltipContentProps {\n children?: unknown\n className?: string\n sideOffset?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n [key: string]: any\n}\n\nexport function TooltipContent({ className, sideOffset = 4, side = \"top\", children, ...props }: TooltipContentProps) {\n const context = useContext(TooltipContext)\n const contentRef = useRef<HTMLDivElement>(null)\n const [position, setPosition] = useState({ top: 0, left: 0 })\n const [isPositioned, setIsPositioned] = useState(false)\n\n if (!context) throw new Error(\"TooltipContent must be used within Tooltip\")\n\n const { open, triggerRef } = context\n\n useLayoutEffect(() => {\n if (open && triggerRef.current && contentRef.current) {\n const updatePosition = () => {\n const triggerRect = triggerRef.current!.getBoundingClientRect()\n const contentRect = contentRef.current!.getBoundingClientRect()\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n\n let top = 0\n let left = 0\n\n // Calculate center Left\n left = triggerRect.left + scrollX + (triggerRect.width / 2) - (contentRect.width / 2)\n\n // Calculate Top (defaulting to 'top' side logic for now as requested)\n // Default: Place above\n top = triggerRect.top + scrollY - contentRect.height - sideOffset\n\n // Flip logic: If top goes off screen (including scroll), move to bottom\n if (triggerRect.top - contentRect.height - sideOffset < 0) {\n // Place below\n top = triggerRect.bottom + scrollY + sideOffset\n }\n\n setPosition({ top, left })\n setIsPositioned(true)\n }\n\n updatePosition()\n // Optional: Listen to window resize/scroll to update position\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition, true)\n\n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition, true)\n setIsPositioned(false)\n }\n }\n }, [open, sideOffset])\n\n if (!open) return null\n\n return createPortal(\n <div\n ref={contentRef}\n style={{\n top: position.top,\n left: position.left,\n position: 'absolute',\n opacity: isPositioned ? 1 : 0,\n pointerEvents: 'none',\n }}\n className={cn(\n \"z-50 overflow-hidden rounded-md border border-gray-200 dark:border-gray-700\",\n \"bg-white dark:bg-gray-800 px-3 py-1.5 text-sm\",\n \"text-gray-900 dark:text-gray-100 shadow-lg dark:shadow-gray-900/50\",\n \"animate-in fade-in-0 zoom-in-95 duration-200\",\n \"whitespace-nowrap\",\n className\n )}\n {...props}\n >\n {children as any}\n </div> as any,\n document.body\n )\n}\n\nTooltipContent.displayName = \"TooltipContent\"\n","import { Grid } from 'lucide-react';\n\ninterface BasicWidgetProps {\n id?: string;\n title?: string;\n}\n\nexport function BasicWidget({ id, title }: BasicWidgetProps) {\n return (\n <div className=\"p-4 h-full flex flex-col justify-center overflow-hidden\">\n <div className=\"text-center\">\n <div className=\"w-12 h-12 rounded-full flex items-center justify-center mx-auto mb-3 bg-gradient-to-br from-blue-100 to-purple-100 dark:from-gray-700 dark:to-gray-600\">\n <Grid size={20} className=\"text-blue-600 dark:text-gray-200\" />\n </div>\n <h3 className=\"text-lg font-semibold text-gray-800 dark:text-gray-100 mb-2\">\n {title || 'Basic Widget'}\n </h3>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Customizable content area\n </p>\n {id && (\n <div className=\"mt-2 text-xs text-gray-400 dark:text-gray-500\">\n ID: {id}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function BasicWidgetPreview() {\n return (\n <div className=\"p-2 h-16 flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-blue-100 to-purple-100 dark:from-gray-700 dark:to-gray-600 flex items-center justify-center\">\n <Grid size={14} className=\"text-blue-600 dark:text-gray-300\" />\n </div>\n <div className=\"text-xs text-gray-600 dark:text-gray-400\">\n Basic Widget\n </div>\n </div>\n </div>\n );\n} ","interface ProgressBarData {\n label: string;\n value: number;\n max: number;\n color?: string;\n}\n\ninterface ProgressBarWidgetProps {\n data?: ProgressBarData;\n}\n\nexport function ProgressBarWidget({ data }: ProgressBarWidgetProps) {\n const defaultData: ProgressBarData = {\n label: 'Progress',\n value: 75,\n max: 100,\n color: 'bg-blue-500'\n };\n\n const widgetData = data || defaultData;\n const percentage = (widgetData.value / widgetData.max) * 100;\n\n return (\n <div className=\"p-4 h-full flex flex-col justify-center overflow-hidden\">\n <div className=\"text-center\">\n <h3 className=\"text-lg font-semibold text-gray-800 dark:text-gray-100 mb-2\">\n {widgetData.label}\n </h3>\n <div className=\"text-3xl font-bold text-gray-900 dark:text-gray-100 mb-4\">\n {widgetData.value}%\n </div>\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full h-3 mb-2\">\n <div\n className={`h-3 rounded-full ${widgetData.color || 'bg-blue-500'} transition-all duration-300`}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {widgetData.value} of {widgetData.max}\n </p>\n </div>\n </div>\n );\n}\n\nexport function ProgressBarPreview() {\n return (\n <div className=\"p-2 h-16 flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\">\n <div className=\"w-full max-w-20\">\n <div className=\"text-xs font-medium text-gray-600 dark:text-gray-400 mb-1 text-center\">\n Progress\n </div>\n <div className=\"w-full bg-gray-200 dark:bg-gray-600 rounded-full h-1.5\">\n <div className=\"bg-blue-400 h-1.5 rounded-full w-3/4 animate-pulse\" />\n </div>\n </div>\n </div>\n );\n} ","interface PieChartData {\n label: string;\n segments: Array<{\n name: string;\n value: number;\n color: string;\n }>;\n}\n\ninterface PieChartWidgetProps {\n data?: PieChartData;\n}\n\nexport function PieChartWidget({ data }: PieChartWidgetProps) {\n const defaultData: PieChartData = {\n label: 'Sales Distribution',\n segments: [\n { name: 'Product A', value: 40, color: '#3B82F6' },\n { name: 'Product B', value: 30, color: '#EF4444' },\n { name: 'Product C', value: 20, color: '#10B981' },\n { name: 'Product D', value: 10, color: '#F59E0B' }\n ]\n };\n\n const widgetData = data || defaultData;\n const total = widgetData.segments.reduce((sum, segment) => sum + segment.value, 0);\n\n // Create pie chart using conic-gradient\n let cumulativePercentage = 0;\n const gradientStops = widgetData.segments.map(segment => {\n const percentage = (segment.value / total) * 100;\n const start = cumulativePercentage;\n const end = cumulativePercentage + percentage;\n cumulativePercentage = end;\n return `${segment.color} ${start}% ${end}%`;\n }).join(', ');\n\n return (\n <div className=\"p-4 h-full flex flex-col overflow-hidden\">\n <h3 className=\"text-lg font-semibold text-gray-800 dark:text-gray-100 mb-2 text-center flex-shrink-0\">\n {widgetData.label}\n </h3>\n \n <div className=\"flex-1 flex items-center justify-center min-h-0\">\n <div className=\"relative\">\n {/* Pie Chart */}\n <div\n className=\"w-24 h-24 rounded-full\"\n style={{\n background: `conic-gradient(${gradientStops})`\n }}\n />\n \n {/* Center circle for donut effect */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"w-8 h-8 bg-white dark:bg-gray-800 rounded-full flex items-center justify-center\">\n <span className=\"text-xs font-bold text-gray-600 dark:text-gray-300\">\n {total}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Legend */}\n <div className=\"grid grid-cols-2 gap-1 mt-2 flex-shrink-0\">\n {widgetData.segments.map((segment, index) => (\n <div key={index} className=\"flex items-center gap-1 min-w-0\">\n <div\n className=\"w-2 h-2 rounded-full flex-shrink-0\"\n style={{ backgroundColor: segment.color }}\n />\n <span className=\"text-xs text-gray-600 dark:text-gray-400 truncate\">\n {segment.name}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function PieChartPreview() {\n return (\n <div className=\"p-2 h-16 flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\">\n <div className=\"flex items-center gap-2\">\n {/* Simplified pie chart */}\n <div className=\"relative\">\n <div className=\"w-8 h-8 rounded-full bg-gradient-to-r from-blue-400 via-red-400 to-green-400 animate-pulse\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"w-3 h-3 bg-gray-50 dark:bg-gray-800 rounded-full\" />\n </div>\n </div>\n <div className=\"text-xs text-gray-600 dark:text-gray-400\">\n Pie Chart\n </div>\n </div>\n </div>\n );\n} ","interface BarChartData {\n label: string;\n data: Array<{\n name: string;\n value: number;\n color?: string;\n }>;\n}\n\ninterface BarChartWidgetProps {\n data?: BarChartData;\n}\n\nexport function BarChartWidget({ data }: BarChartWidgetProps) {\n const defaultData: BarChartData = {\n label: 'Monthly Revenue',\n data: [\n { name: 'Jan', value: 65, color: '#3B82F6' },\n { name: 'Feb', value: 85, color: '#3B82F6' },\n { name: 'Mar', value: 75, color: '#3B82F6' },\n { name: 'Apr', value: 95, color: '#3B82F6' },\n { name: 'May', value: 80, color: '#3B82F6' },\n { name: 'Jun', value: 90, color: '#3B82F6' }\n ]\n };\n\n const widgetData = data || defaultData;\n const maxValue = Math.max(...widgetData.data.map(item => item.value));\n\n return (\n <div className=\"p-4 h-full flex flex-col overflow-hidden\">\n <h3 className=\"text-lg font-semibold text-gray-800 dark:text-gray-100 mb-2 text-center flex-shrink-0\">\n {widgetData.label}\n </h3>\n \n <div className=\"flex-1 flex items-end justify-between gap-1 px-2 min-h-0\">\n {widgetData.data.map((item, index) => {\n const height = (item.value / maxValue) * 100;\n return (\n <div key={index} className=\"flex-1 flex flex-col items-center\">\n <div className=\"flex-1 flex items-end w-full\">\n <div\n className=\"w-full rounded-t transition-all duration-500 hover:opacity-80\"\n style={{\n height: `${height}%`,\n backgroundColor: item.color || '#3B82F6',\n minHeight: '4px'\n }}\n />\n </div>\n <div className=\"text-xs text-gray-600 dark:text-gray-400 mt-1 text-center\">\n {item.name}\n </div>\n <div className=\"text-xs text-gray-500 dark:text-gray-500\">\n {item.value}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function BarChartPreview() {\n const heights = [60, 80, 40, 90, 70];\n \n return (\n <div className=\"p-2 h-16 flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\">\n <div className=\"flex items-end gap-1 h-8\">\n {heights.map((height, index) => (\n <div\n key={index}\n className=\"w-2 bg-blue-400 rounded-t animate-pulse\"\n style={{ \n height: `${height}%`,\n animationDelay: `${index * 0.1}s`\n }}\n />\n ))}\n </div>\n <div className=\"ml-2 text-xs text-gray-600 dark:text-gray-400\">\n Bar Chart\n </div>\n </div>\n );\n} ","interface LineChartData {\n label: string;\n data: Array<{\n name: string;\n value: number;\n }>;\n color?: string;\n}\n\ninterface LineChartWidgetProps {\n data?: LineChartData;\n}\n\nexport function LineChartWidget({ data }: LineChartWidgetProps) {\n const defaultData: LineChartData = {\n label: 'Performance Trend',\n data: [\n { name: 'Jan', value: 30 },\n { name: 'Feb', value: 45 },\n { name: 'Mar', value: 35 },\n { name: 'Apr', value: 60 },\n { name: 'May', value: 55 },\n { name: 'Jun', value: 75 },\n { name: 'Jul', value: 70 }\n ],\n color: '#3B82F6'\n };\n\n const widgetData = data || defaultData;\n const maxValue = Math.max(...widgetData.data.map(item => item.value));\n const minValue = Math.min(...widgetData.data.map(item => item.value));\n const range = maxValue - minValue;\n\n // SVG dimensions\n const width = 200;\n const height = 80;\n const padding = 10;\n\n // Calculate points for the line\n const points = widgetData.data.map((item, index) => {\n const x = padding + (index / (widgetData.data.length - 1)) * (width - 2 * padding);\n const y = height - padding - ((item.value - minValue) / range) * (height - 2 * padding);\n return { x, y, value: item.value, name: item.name };\n });\n\n // Create path string\n const pathData = points.reduce((path, point, index) => {\n const command = index === 0 ? 'M' : 'L';\n return `${path} ${command} ${point.x} ${point.y}`;\n }, '');\n\n return (\n <div className=\"p-4 h-full flex flex-col overflow-hidden\">\n <h3 className=\"text-lg font-semibold text-gray-800 dark:text-gray-100 mb-2 text-center flex-shrink-0\">\n {widgetData.label}\n </h3>\n \n <div className=\"flex-1 flex items-center justify-center min-h-0\">\n <div className=\"relative max-w-full\">\n <svg width={width} height={height} className=\"max-w-full h-auto\">\n {/* Grid lines */}\n {[0, 25, 50, 75, 100].map((percent, index) => {\n const y = height - padding - (percent / 100) * (height - 2 * padding);\n return (\n <line\n key={index}\n x1={padding}\n y1={y}\n x2={width - padding}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n opacity=\"0.2\"\n className=\"text-gray-400\"\n />\n );\n })}\n \n {/* Line path */}\n <path\n d={pathData}\n fill=\"none\"\n stroke={widgetData.color || '#3B82F6'}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n \n {/* Data points */}\n {points.map((point, index) => (\n <circle\n key={index}\n cx={point.x}\n cy={point.y}\n r=\"3\"\n fill={widgetData.color || '#3B82F6'}\n className=\"hover:r-4 transition-all\"\n />\n ))}\n </svg>\n </div>\n </div>\n\n {/* X-axis labels */}\n <div className=\"flex justify-between text-xs text-gray-600 dark:text-gray-400 mt-2 flex-shrink-0 gap-1\">\n {widgetData.data.map((item, index) => (\n <span key={index} className=\"text-center truncate min-w-0 flex-1\">\n {item.name}\n </span>\n ))}\n </div>\n </div>\n );\n}\n\nexport function LineChartPreview() {\n return (\n <div className=\"p-2 h-16 flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\">\n <div className=\"flex items-center gap-2\">\n {/* Simplified line chart */}\n <svg width=\"32\" height=\"20\" className=\"overflow-visible\">\n <path\n d=\"M 2 18 L 8 12 L 14 15 L 20 8 L 26 10 L 30 6\"\n fill=\"none\"\n stroke=\"#3B82F6\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"animate-pulse\"\n />\n {[2, 8, 14, 20, 26, 30].map((x, index) => (\n <circle\n key={index}\n cx={x}\n cy={[18, 12, 15, 8, 10, 6][index]}\n r=\"1\"\n fill=\"#3B82F6\"\n className=\"animate-pulse\"\n style={{ animationDelay: `${index * 0.1}s` }}\n />\n ))}\n </svg>\n <div className=\"text-xs text-gray-600 dark:text-gray-400\">\n Line Chart\n </div>\n </div>\n </div>\n );\n} ","import { BasicWidget, BasicWidgetPreview } from './BasicWidget';\nimport { ProgressBarWidget, ProgressBarPreview } from './ProgressBarWidget';\nimport { PieChartWidget, PieChartPreview } from './PieChartWidget';\nimport { BarChartWidget, BarChartPreview } from './BarChartWidget';\nimport { LineChartWidget, LineChartPreview } from './LineChartWidget';\n\nexport {\n BasicWidget,\n ProgressBarWidget,\n PieChartWidget,\n BarChartWidget,\n LineChartWidget\n};\n\n// Export all preview components\nexport {\n BasicWidgetPreview,\n ProgressBarPreview,\n PieChartPreview,\n BarChartPreview,\n LineChartPreview\n};\n\n// Widget registry - maps widget types to their components\nexport const widgetRegistry = {\n basic: BasicWidget,\n progress: ProgressBarWidget,\n pie: PieChartWidget,\n bar: BarChartWidget,\n line: LineChartWidget\n};\n\n// Preview registry - maps widget types to their preview components\nexport const previewRegistry = {\n basic: BasicWidgetPreview,\n progress: ProgressBarPreview,\n pie: PieChartPreview,\n bar: BarChartPreview,\n line: LineChartPreview\n};\n\n// Function to get widget component by type\nexport function getWidgetComponent(type: string) {\n return widgetRegistry[type as keyof typeof widgetRegistry] || BasicWidget;\n}\n\n// Function to get preview component by type\nexport function getPreviewComponent(type: string) {\n return previewRegistry[type as keyof typeof previewRegistry] || BasicWidgetPreview;\n} ","import { useState, useCallback } from 'react';\nimport { GridItem, SerializedDashboard, DashboardController, UseDashboardControllerOptions } from '../types/shared';\n\nexport function useDashboardController({\n initialItems = [],\n initialEditMode = false\n}: UseDashboardControllerOptions = {}): DashboardController {\n const [items, setItems] = useState<GridItem[]>(initialItems);\n const [isEditMode, setIsEditMode] = useState(initialEditMode);\n\n const addItem = useCallback((item: GridItem) => {\n setItems((prev: GridItem[]) => [...prev, item]);\n }, []);\n\n const removeItem = useCallback((id: string) => {\n setItems((prev: GridItem[]) => prev.filter((item: GridItem) => item.id !== id));\n }, []);\n\n const updateItem = useCallback((id: string, updates: Partial<GridItem>) => {\n setItems((prev: GridItem[]) =>\n prev.map((item: GridItem) => (item.id === id ? { ...item, ...updates } : item))\n );\n }, []);\n\n const clear = useCallback(() => {\n setItems([]);\n }, []);\n\n const save = useCallback((): SerializedDashboard => {\n // Strip out non-serializable data (functions)\n const serializedItems = items.map(({ content: _content, ...rest }) => rest);\n return {\n items: serializedItems,\n };\n }, [items]);\n\n const load = useCallback((state: SerializedDashboard) => {\n if (state && Array.isArray(state.items)) {\n setItems(state.items as GridItem[]);\n }\n }, []);\n\n const toggleEditMode = useCallback(() => {\n setIsEditMode((prev: boolean) => !prev);\n }, []);\n\n return {\n items,\n addItem,\n removeItem,\n updateItem,\n setItems,\n save,\n load,\n clear,\n isEditMode,\n toggleEditMode,\n setEditMode: setIsEditMode\n };\n}\n","export const GRID_SIZE = 40;\nexport const MARGIN = 8;\nexport const CELL_SIZE = GRID_SIZE + MARGIN;\nexport const ANIMATION_DURATION = 300;\nexport const MIN_SIZE = 2;\nexport const MAX_SIZE = 24;\nexport const CONTAINER_PADDING = 16;\nexport const MIN_CONTAINER_HEIGHT = 200;\nexport const DEBOUNCE_DELAY = 150; ","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"*,\\n::before,\\n::after {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n::backdrop {\\n --tw-border-spacing-x: 0;\\n --tw-border-spacing-y: 0;\\n --tw-translate-x: 0;\\n --tw-translate-y: 0;\\n --tw-rotate: 0;\\n --tw-skew-x: 0;\\n --tw-skew-y: 0;\\n --tw-scale-x: 1;\\n --tw-scale-y: 1;\\n --tw-pan-x: ;\\n --tw-pan-y: ;\\n --tw-pinch-zoom: ;\\n --tw-scroll-snap-strictness: proximity;\\n --tw-gradient-from-position: ;\\n --tw-gradient-via-position: ;\\n --tw-gradient-to-position: ;\\n --tw-ordinal: ;\\n --tw-slashed-zero: ;\\n --tw-numeric-figure: ;\\n --tw-numeric-spacing: ;\\n --tw-numeric-fraction: ;\\n --tw-ring-inset: ;\\n --tw-ring-offset-width: 0px;\\n --tw-ring-offset-color: #fff;\\n --tw-ring-color: rgb(59 130 246 / 0.5);\\n --tw-ring-offset-shadow: 0 0 #0000;\\n --tw-ring-shadow: 0 0 #0000;\\n --tw-shadow: 0 0 #0000;\\n --tw-shadow-colored: 0 0 #0000;\\n --tw-blur: ;\\n --tw-brightness: ;\\n --tw-contrast: ;\\n --tw-grayscale: ;\\n --tw-hue-rotate: ;\\n --tw-invert: ;\\n --tw-saturate: ;\\n --tw-sepia: ;\\n --tw-drop-shadow: ;\\n --tw-backdrop-blur: ;\\n --tw-backdrop-brightness: ;\\n --tw-backdrop-contrast: ;\\n --tw-backdrop-grayscale: ;\\n --tw-backdrop-hue-rotate: ;\\n --tw-backdrop-invert: ;\\n --tw-backdrop-opacity: ;\\n --tw-backdrop-saturate: ;\\n --tw-backdrop-sepia: ;\\n --tw-contain-size: ;\\n --tw-contain-layout: ;\\n --tw-contain-paint: ;\\n --tw-contain-style: ;\\n}\\n*,\\n::before,\\n::after {\\n box-sizing: border-box;\\n border-width: 0;\\n border-style: solid;\\n border-color: #e5e7eb;\\n}\\n::before,\\n::after {\\n --tw-content: \\\"\\\";\\n}\\nhtml,\\n:host {\\n line-height: 1.5;\\n -webkit-text-size-adjust: 100%;\\n -moz-tab-size: 4;\\n -o-tab-size: 4;\\n tab-size: 4;\\n font-family:\\n ui-sans-serif,\\n system-ui,\\n sans-serif,\\n \\\"Apple Color Emoji\\\",\\n \\\"Segoe UI Emoji\\\",\\n \\\"Segoe UI Symbol\\\",\\n \\\"Noto Color Emoji\\\";\\n font-feature-settings: normal;\\n font-variation-settings: normal;\\n -webkit-tap-highlight-color: transparent;\\n}\\nbody {\\n margin: 0;\\n line-height: inherit;\\n}\\nhr {\\n height: 0;\\n color: inherit;\\n border-top-width: 1px;\\n}\\nabbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\na {\\n color: inherit;\\n text-decoration: inherit;\\n}\\nb,\\nstrong {\\n font-weight: bolder;\\n}\\ncode,\\nkbd,\\nsamp,\\npre {\\n font-family:\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n \\\"Liberation Mono\\\",\\n \\\"Courier New\\\",\\n monospace;\\n font-feature-settings: normal;\\n font-variation-settings: normal;\\n font-size: 1em;\\n}\\nsmall {\\n font-size: 80%;\\n}\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\nsub {\\n bottom: -0.25em;\\n}\\nsup {\\n top: -0.5em;\\n}\\ntable {\\n text-indent: 0;\\n border-color: inherit;\\n border-collapse: collapse;\\n}\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n font-family: inherit;\\n font-feature-settings: inherit;\\n font-variation-settings: inherit;\\n font-size: 100%;\\n font-weight: inherit;\\n line-height: inherit;\\n letter-spacing: inherit;\\n color: inherit;\\n margin: 0;\\n padding: 0;\\n}\\nbutton,\\nselect {\\n text-transform: none;\\n}\\nbutton,\\ninput:where([type=button]),\\ninput:where([type=reset]),\\ninput:where([type=submit]) {\\n -webkit-appearance: button;\\n background-color: transparent;\\n background-image: none;\\n}\\n:-moz-focusring {\\n outline: auto;\\n}\\n:-moz-ui-invalid {\\n box-shadow: none;\\n}\\nprogress {\\n vertical-align: baseline;\\n}\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n height: auto;\\n}\\n[type=search] {\\n -webkit-appearance: textfield;\\n outline-offset: -2px;\\n}\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n::-webkit-file-upload-button {\\n -webkit-appearance: button;\\n font: inherit;\\n}\\nsummary {\\n display: list-item;\\n}\\nblockquote,\\ndl,\\ndd,\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6,\\nhr,\\nfigure,\\np,\\npre {\\n margin: 0;\\n}\\nfieldset {\\n margin: 0;\\n padding: 0;\\n}\\nlegend {\\n padding: 0;\\n}\\nol,\\nul,\\nmenu {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\ndialog {\\n padding: 0;\\n}\\ntextarea {\\n resize: vertical;\\n}\\ninput::-moz-placeholder,\\ntextarea::-moz-placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\ninput::placeholder,\\ntextarea::placeholder {\\n opacity: 1;\\n color: #9ca3af;\\n}\\nbutton,\\n[role=button] {\\n cursor: pointer;\\n}\\n:disabled {\\n cursor: default;\\n}\\nimg,\\nsvg,\\nvideo,\\ncanvas,\\naudio,\\niframe,\\nembed,\\nobject {\\n display: block;\\n vertical-align: middle;\\n}\\nimg,\\nvideo {\\n max-width: 100%;\\n height: auto;\\n}\\n[hidden]:where(:not([hidden=until-found])) {\\n display: none;\\n}\\n:root {\\n --background: 0 0% 100%;\\n --foreground: 222.2 84% 4.9%;\\n --card: 0 0% 100%;\\n --card-foreground: 222.2 84% 4.9%;\\n --popover: 0 0% 100%;\\n --popover-foreground: 222.2 84% 4.9%;\\n --primary: 222.2 47.4% 11.2%;\\n --primary-foreground: 210 40% 98%;\\n --secondary: 210 40% 96.1%;\\n --secondary-foreground: 222.2 47.4% 11.2%;\\n --muted: 210 40% 96.1%;\\n --muted-foreground: 215.4 16.3% 46.9%;\\n --accent: 210 40% 96.1%;\\n --accent-foreground: 222.2 47.4% 11.2%;\\n --destructive: 0 84.2% 60.2%;\\n --destructive-foreground: 210 40% 98%;\\n --border: 214.3 31.8% 91.4%;\\n --input: 214.3 31.8% 91.4%;\\n --ring: 222.2 84% 4.9%;\\n --radius: 0.5rem;\\n}\\n* {\\n border-color: hsl(var(--border));\\n}\\nbody {\\n background-color: hsl(var(--background));\\n color: hsl(var(--foreground));\\n width: 100vw;\\n max-width: 100vw;\\n}\\n#root {\\n width: 100%;\\n height: 100%;\\n}\\n.container {\\n width: 100%;\\n}\\n@media (min-width: 640px) {\\n .container {\\n max-width: 640px;\\n }\\n}\\n@media (min-width: 768px) {\\n .container {\\n max-width: 768px;\\n }\\n}\\n@media (min-width: 1024px) {\\n .container {\\n max-width: 1024px;\\n }\\n}\\n@media (min-width: 1280px) {\\n .container {\\n max-width: 1280px;\\n }\\n}\\n@media (min-width: 1536px) {\\n .container {\\n max-width: 1536px;\\n }\\n}\\n.pointer-events-none {\\n pointer-events: none;\\n}\\n.invisible {\\n visibility: hidden;\\n}\\n.fixed {\\n position: fixed;\\n}\\n.absolute {\\n position: absolute;\\n}\\n.relative {\\n position: relative;\\n}\\n.inset-0 {\\n inset: 0px;\\n}\\n.bottom-0 {\\n bottom: 0px;\\n}\\n.left-0 {\\n left: 0px;\\n}\\n.right-0 {\\n right: 0px;\\n}\\n.right-4 {\\n right: 1rem;\\n}\\n.top-0 {\\n top: 0px;\\n}\\n.top-4 {\\n top: 1rem;\\n}\\n.z-10 {\\n z-index: 10;\\n}\\n.z-20 {\\n z-index: 20;\\n}\\n.z-40 {\\n z-index: 40;\\n}\\n.z-50 {\\n z-index: 50;\\n}\\n.mx-auto {\\n margin-left: auto;\\n margin-right: auto;\\n}\\n.my-1 {\\n margin-top: 0.25rem;\\n margin-bottom: 0.25rem;\\n}\\n.mb-1 {\\n margin-bottom: 0.25rem;\\n}\\n.mb-2 {\\n margin-bottom: 0.5rem;\\n}\\n.mb-3 {\\n margin-bottom: 0.75rem;\\n}\\n.mb-4 {\\n margin-bottom: 1rem;\\n}\\n.mb-6 {\\n margin-bottom: 1.5rem;\\n}\\n.mb-8 {\\n margin-bottom: 2rem;\\n}\\n.ml-2 {\\n margin-left: 0.5rem;\\n}\\n.mt-1 {\\n margin-top: 0.25rem;\\n}\\n.mt-2 {\\n margin-top: 0.5rem;\\n}\\n.mt-4 {\\n margin-top: 1rem;\\n}\\n.mt-8 {\\n margin-top: 2rem;\\n}\\n.inline-block {\\n display: inline-block;\\n}\\n.flex {\\n display: flex;\\n}\\n.inline-flex {\\n display: inline-flex;\\n}\\n.grid {\\n display: grid;\\n}\\n.hidden {\\n display: none;\\n}\\n.h-1\\\\.5 {\\n height: 0.375rem;\\n}\\n.h-10 {\\n height: 2.5rem;\\n}\\n.h-11 {\\n height: 2.75rem;\\n}\\n.h-12 {\\n height: 3rem;\\n}\\n.h-16 {\\n height: 4rem;\\n}\\n.h-2 {\\n height: 0.5rem;\\n}\\n.h-20 {\\n height: 5rem;\\n}\\n.h-24 {\\n height: 6rem;\\n}\\n.h-3 {\\n height: 0.75rem;\\n}\\n.h-5 {\\n height: 1.25rem;\\n}\\n.h-8 {\\n height: 2rem;\\n}\\n.h-9 {\\n height: 2.25rem;\\n}\\n.h-\\\\[calc\\\\(100\\\\%-30px\\\\)\\\\] {\\n height: calc(100% - 30px);\\n}\\n.h-auto {\\n height: auto;\\n}\\n.h-full {\\n height: 100%;\\n}\\n.min-h-0 {\\n min-height: 0px;\\n}\\n.min-h-screen {\\n min-height: 100vh;\\n}\\n.w-10 {\\n width: 2.5rem;\\n}\\n.w-12 {\\n width: 3rem;\\n}\\n.w-16 {\\n width: 4rem;\\n}\\n.w-2 {\\n width: 0.5rem;\\n}\\n.w-24 {\\n width: 6rem;\\n}\\n.w-3 {\\n width: 0.75rem;\\n}\\n.w-3\\\\/4 {\\n width: 75%;\\n}\\n.w-48 {\\n width: 12rem;\\n}\\n.w-5 {\\n width: 1.25rem;\\n}\\n.w-8 {\\n width: 2rem;\\n}\\n.w-full {\\n width: 100%;\\n}\\n.min-w-0 {\\n min-width: 0px;\\n}\\n.max-w-20 {\\n max-width: 5rem;\\n}\\n.max-w-7xl {\\n max-width: 80rem;\\n}\\n.max-w-full {\\n max-width: 100%;\\n}\\n.flex-1 {\\n flex: 1 1 0%;\\n}\\n.flex-shrink-0 {\\n flex-shrink: 0;\\n}\\n@keyframes pulse {\\n 50% {\\n opacity: .5;\\n }\\n}\\n.animate-pulse {\\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\\n}\\n.cursor-default {\\n cursor: default;\\n}\\n.cursor-grab {\\n cursor: grab;\\n}\\n.cursor-ne-resize {\\n cursor: ne-resize;\\n}\\n.cursor-nw-resize {\\n cursor: nw-resize;\\n}\\n.cursor-se-resize {\\n cursor: se-resize;\\n}\\n.cursor-sw-resize {\\n cursor: sw-resize;\\n}\\n.select-none {\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n user-select: none;\\n}\\n.resize {\\n resize: both;\\n}\\n.grid-cols-2 {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n}\\n.flex-col {\\n flex-direction: column;\\n}\\n.items-start {\\n align-items: flex-start;\\n}\\n.items-end {\\n align-items: flex-end;\\n}\\n.items-center {\\n align-items: center;\\n}\\n.justify-center {\\n justify-content: center;\\n}\\n.justify-between {\\n justify-content: space-between;\\n}\\n.gap-0\\\\.5 {\\n gap: 0.125rem;\\n}\\n.gap-1 {\\n gap: 0.25rem;\\n}\\n.gap-2 {\\n gap: 0.5rem;\\n}\\n.gap-3 {\\n gap: 0.75rem;\\n}\\n.gap-4 {\\n gap: 1rem;\\n}\\n.overflow-auto {\\n overflow: auto;\\n}\\n.overflow-hidden {\\n overflow: hidden;\\n}\\n.overflow-visible {\\n overflow: visible;\\n}\\n.overflow-x-auto {\\n overflow-x: auto;\\n}\\n.truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.whitespace-nowrap {\\n white-space: nowrap;\\n}\\n.rounded {\\n border-radius: 0.25rem;\\n}\\n.rounded-full {\\n border-radius: 9999px;\\n}\\n.rounded-lg {\\n border-radius: var(--radius);\\n}\\n.rounded-md {\\n border-radius: calc(var(--radius) - 2px);\\n}\\n.rounded-t {\\n border-top-left-radius: 0.25rem;\\n border-top-right-radius: 0.25rem;\\n}\\n.border {\\n border-width: 1px;\\n}\\n.border-2 {\\n border-width: 2px;\\n}\\n.border-b {\\n border-bottom-width: 1px;\\n}\\n.border-t {\\n border-top-width: 1px;\\n}\\n.border-blue-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(191 219 254 / var(--tw-border-opacity, 1));\\n}\\n.border-blue-300 {\\n --tw-border-opacity: 1;\\n border-color: rgb(147 197 253 / var(--tw-border-opacity, 1));\\n}\\n.border-gray-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));\\n}\\n.border-gray-300 {\\n --tw-border-opacity: 1;\\n border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));\\n}\\n.border-green-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(187 247 208 / var(--tw-border-opacity, 1));\\n}\\n.border-input {\\n border-color: hsl(var(--input));\\n}\\n.border-red-200 {\\n --tw-border-opacity: 1;\\n border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));\\n}\\n.bg-background {\\n background-color: hsl(var(--background));\\n}\\n.bg-blue-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1));\\n}\\n.bg-blue-400 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1));\\n}\\n.bg-blue-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\\n}\\n.bg-blue-500 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));\\n}\\n.bg-destructive {\\n background-color: hsl(var(--destructive));\\n}\\n.bg-gray-100 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gray-200 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gray-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));\\n}\\n.bg-green-50 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1));\\n}\\n.bg-primary {\\n background-color: hsl(var(--primary));\\n}\\n.bg-secondary {\\n background-color: hsl(var(--secondary));\\n}\\n.bg-white {\\n --tw-bg-opacity: 1;\\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\\n}\\n.bg-gradient-to-br {\\n background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));\\n}\\n.bg-gradient-to-r {\\n background-image: linear-gradient(to right, var(--tw-gradient-stops));\\n}\\n.from-blue-100 {\\n --tw-gradient-from: #dbeafe var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(219 234 254 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.from-blue-400 {\\n --tw-gradient-from: #60a5fa var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(96 165 250 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.from-blue-50 {\\n --tw-gradient-from: #eff6ff var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.via-red-400 {\\n --tw-gradient-to: rgb(248 113 113 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops:\\n var(--tw-gradient-from),\\n #f87171 var(--tw-gradient-via-position),\\n var(--tw-gradient-to);\\n}\\n.to-green-400 {\\n --tw-gradient-to: #4ade80 var(--tw-gradient-to-position);\\n}\\n.to-purple-100 {\\n --tw-gradient-to: #f3e8ff var(--tw-gradient-to-position);\\n}\\n.to-purple-50 {\\n --tw-gradient-to: #faf5ff var(--tw-gradient-to-position);\\n}\\n.p-0\\\\.5 {\\n padding: 0.125rem;\\n}\\n.p-1 {\\n padding: 0.25rem;\\n}\\n.p-2 {\\n padding: 0.5rem;\\n}\\n.p-3 {\\n padding: 0.75rem;\\n}\\n.p-4 {\\n padding: 1rem;\\n}\\n.p-6 {\\n padding: 1.5rem;\\n}\\n.p-8 {\\n padding: 2rem;\\n}\\n.px-2 {\\n padding-left: 0.5rem;\\n padding-right: 0.5rem;\\n}\\n.px-3 {\\n padding-left: 0.75rem;\\n padding-right: 0.75rem;\\n}\\n.px-4 {\\n padding-left: 1rem;\\n padding-right: 1rem;\\n}\\n.px-6 {\\n padding-left: 1.5rem;\\n padding-right: 1.5rem;\\n}\\n.px-8 {\\n padding-left: 2rem;\\n padding-right: 2rem;\\n}\\n.py-1 {\\n padding-top: 0.25rem;\\n padding-bottom: 0.25rem;\\n}\\n.py-1\\\\.5 {\\n padding-top: 0.375rem;\\n padding-bottom: 0.375rem;\\n}\\n.py-2 {\\n padding-top: 0.5rem;\\n padding-bottom: 0.5rem;\\n}\\n.py-3 {\\n padding-top: 0.75rem;\\n padding-bottom: 0.75rem;\\n}\\n.pt-4 {\\n padding-top: 1rem;\\n}\\n.text-left {\\n text-align: left;\\n}\\n.text-center {\\n text-align: center;\\n}\\n.text-2xl {\\n font-size: 1.5rem;\\n line-height: 2rem;\\n}\\n.text-3xl {\\n font-size: 1.875rem;\\n line-height: 2.25rem;\\n}\\n.text-lg {\\n font-size: 1.125rem;\\n line-height: 1.75rem;\\n}\\n.text-sm {\\n font-size: 0.875rem;\\n line-height: 1.25rem;\\n}\\n.text-xs {\\n font-size: 0.75rem;\\n line-height: 1rem;\\n}\\n.font-bold {\\n font-weight: 700;\\n}\\n.font-medium {\\n font-weight: 500;\\n}\\n.font-semibold {\\n font-weight: 600;\\n}\\n.leading-tight {\\n line-height: 1.25;\\n}\\n.text-blue-600 {\\n --tw-text-opacity: 1;\\n color: rgb(37 99 235 / var(--tw-text-opacity, 1));\\n}\\n.text-blue-700 {\\n --tw-text-opacity: 1;\\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\\n}\\n.text-destructive-foreground {\\n color: hsl(var(--destructive-foreground));\\n}\\n.text-gray-400 {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n}\\n.text-gray-500 {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n}\\n.text-gray-600 {\\n --tw-text-opacity: 1;\\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\\n}\\n.text-gray-700 {\\n --tw-text-opacity: 1;\\n color: rgb(55 65 81 / var(--tw-text-opacity, 1));\\n}\\n.text-gray-800 {\\n --tw-text-opacity: 1;\\n color: rgb(31 41 55 / var(--tw-text-opacity, 1));\\n}\\n.text-gray-900 {\\n --tw-text-opacity: 1;\\n color: rgb(17 24 39 / var(--tw-text-opacity, 1));\\n}\\n.text-green-700 {\\n --tw-text-opacity: 1;\\n color: rgb(21 128 61 / var(--tw-text-opacity, 1));\\n}\\n.text-green-900 {\\n --tw-text-opacity: 1;\\n color: rgb(20 83 45 / var(--tw-text-opacity, 1));\\n}\\n.text-primary {\\n color: hsl(var(--primary));\\n}\\n.text-primary-foreground {\\n color: hsl(var(--primary-foreground));\\n}\\n.text-red-600 {\\n --tw-text-opacity: 1;\\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\\n}\\n.text-secondary-foreground {\\n color: hsl(var(--secondary-foreground));\\n}\\n.text-white {\\n --tw-text-opacity: 1;\\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\\n}\\n.underline-offset-4 {\\n text-underline-offset: 4px;\\n}\\n.opacity-15 {\\n opacity: 0.15;\\n}\\n.opacity-20 {\\n opacity: 0.2;\\n}\\n.opacity-30 {\\n opacity: 0.3;\\n}\\n.opacity-50 {\\n opacity: 0.5;\\n}\\n.opacity-80 {\\n opacity: 0.8;\\n}\\n.shadow-lg {\\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.shadow-sm {\\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.outline {\\n outline-style: solid;\\n}\\n.ring-1 {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.ring-black {\\n --tw-ring-opacity: 1;\\n --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1));\\n}\\n.ring-opacity-5 {\\n --tw-ring-opacity: 0.05;\\n}\\n.ring-offset-background {\\n --tw-ring-offset-color: hsl(var(--background));\\n}\\n.filter {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.transition-all {\\n transition-property: all;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke;\\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n transition-duration: 150ms;\\n}\\n.duration-200 {\\n transition-duration: 200ms;\\n}\\n.duration-300 {\\n transition-duration: 300ms;\\n}\\n.duration-500 {\\n transition-duration: 500ms;\\n}\\n@theme { --color-background: hsl(var(--background)); --color-foreground: hsl(var(--foreground)); --color-card: hsl(var(--card)); --color-card-foreground: hsl(var(--card-foreground)); --color-popover: hsl(var(--popover)); --color-popover-foreground: hsl(var(--popover-foreground)); --color-primary: hsl(var(--primary)); --color-primary-foreground: hsl(var(--primary-foreground)); --color-secondary: hsl(var(--secondary)); --color-secondary-foreground: hsl(var(--secondary-foreground)); --color-muted: hsl(var(--muted)); --color-muted-foreground: hsl(var(--muted-foreground)); --color-accent: hsl(var(--accent)); --color-accent-foreground: hsl(var(--accent-foreground)); --color-destructive: hsl(var(--destructive)); --color-destructive-foreground: hsl(var(--destructive-foreground)); --color-border: hsl(var(--border)); --color-input: hsl(var(--input)); --color-ring: hsl(var(--ring)); --radius-lg: var(--radius); --radius-md: calc(var(--radius) - 2px); --radius-sm: calc(var(--radius) - 4px); }\\n.hover\\\\:border-blue-300:hover {\\n --tw-border-opacity: 1;\\n border-color: rgb(147 197 253 / var(--tw-border-opacity, 1));\\n}\\n.hover\\\\:border-red-300:hover {\\n --tw-border-opacity: 1;\\n border-color: rgb(252 165 165 / var(--tw-border-opacity, 1));\\n}\\n.hover\\\\:bg-accent:hover {\\n background-color: hsl(var(--accent));\\n}\\n.hover\\\\:bg-blue-50:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-destructive\\\\/90:hover {\\n background-color: hsl(var(--destructive) / 0.9);\\n}\\n.hover\\\\:bg-gray-100:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-gray-200:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-primary\\\\/90:hover {\\n background-color: hsl(var(--primary) / 0.9);\\n}\\n.hover\\\\:bg-red-50:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));\\n}\\n.hover\\\\:bg-secondary\\\\/80:hover {\\n background-color: hsl(var(--secondary) / 0.8);\\n}\\n.hover\\\\:from-blue-100:hover {\\n --tw-gradient-from: #dbeafe var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(219 234 254 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n}\\n.hover\\\\:to-purple-100:hover {\\n --tw-gradient-to: #f3e8ff var(--tw-gradient-to-position);\\n}\\n.hover\\\\:text-accent-foreground:hover {\\n color: hsl(var(--accent-foreground));\\n}\\n.hover\\\\:text-gray-600:hover {\\n --tw-text-opacity: 1;\\n color: rgb(75 85 99 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:text-red-500:hover {\\n --tw-text-opacity: 1;\\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:text-red-700:hover {\\n --tw-text-opacity: 1;\\n color: rgb(185 28 28 / var(--tw-text-opacity, 1));\\n}\\n.hover\\\\:underline:hover {\\n text-decoration-line: underline;\\n}\\n.hover\\\\:opacity-80:hover {\\n opacity: 0.8;\\n}\\n.hover\\\\:shadow-xl:hover {\\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow, 0 0 #0000),\\n var(--tw-ring-shadow, 0 0 #0000),\\n var(--tw-shadow);\\n}\\n.focus-visible\\\\:outline-none:focus-visible {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.focus-visible\\\\:ring-2:focus-visible {\\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\\n box-shadow:\\n var(--tw-ring-offset-shadow),\\n var(--tw-ring-shadow),\\n var(--tw-shadow, 0 0 #0000);\\n}\\n.focus-visible\\\\:ring-ring:focus-visible {\\n --tw-ring-color: hsl(var(--ring));\\n}\\n.focus-visible\\\\:ring-offset-2:focus-visible {\\n --tw-ring-offset-width: 2px;\\n}\\n.active\\\\:cursor-grabbing:active {\\n cursor: grabbing;\\n}\\n.disabled\\\\:pointer-events-none:disabled {\\n pointer-events: none;\\n}\\n.disabled\\\\:opacity-50:disabled {\\n opacity: 0.5;\\n}\\n.group:hover .group-hover\\\\:text-blue-700 {\\n --tw-text-opacity: 1;\\n color: rgb(29 78 216 / var(--tw-text-opacity, 1));\\n}\\n@media (prefers-color-scheme: dark) {\\n .dark\\\\:block {\\n display: block;\\n }\\n .dark\\\\:border-blue-600 {\\n --tw-border-opacity: 1;\\n border-color: rgb(37 99 235 / var(--tw-border-opacity, 1));\\n }\\n .dark\\\\:border-blue-700 {\\n --tw-border-opacity: 1;\\n border-color: rgb(29 78 216 / var(--tw-border-opacity, 1));\\n }\\n .dark\\\\:border-gray-600 {\\n --tw-border-opacity: 1;\\n border-color: rgb(75 85 99 / var(--tw-border-opacity, 1));\\n }\\n .dark\\\\:border-gray-700 {\\n --tw-border-opacity: 1;\\n border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));\\n }\\n .dark\\\\:bg-blue-900\\\\/30 {\\n background-color: rgb(30 58 138 / 0.3);\\n }\\n .dark\\\\:bg-blue-900\\\\/50 {\\n background-color: rgb(30 58 138 / 0.5);\\n }\\n .dark\\\\:bg-gray-600 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\\n }\\n .dark\\\\:bg-gray-700 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\\n }\\n .dark\\\\:bg-gray-800 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));\\n }\\n .dark\\\\:bg-gray-900 {\\n --tw-bg-opacity: 1;\\n background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));\\n }\\n .dark\\\\:from-gray-700 {\\n --tw-gradient-from: #374151 var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(55 65 81 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n }\\n .dark\\\\:to-gray-600 {\\n --tw-gradient-to: #4b5563 var(--tw-gradient-to-position);\\n }\\n .dark\\\\:to-gray-700 {\\n --tw-gradient-to: #374151 var(--tw-gradient-to-position);\\n }\\n .dark\\\\:text-blue-300 {\\n --tw-text-opacity: 1;\\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-blue-400 {\\n --tw-text-opacity: 1;\\n color: rgb(96 165 250 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-gray-100 {\\n --tw-text-opacity: 1;\\n color: rgb(243 244 246 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-gray-200 {\\n --tw-text-opacity: 1;\\n color: rgb(229 231 235 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-gray-300 {\\n --tw-text-opacity: 1;\\n color: rgb(209 213 219 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-gray-400 {\\n --tw-text-opacity: 1;\\n color: rgb(156 163 175 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-gray-500 {\\n --tw-text-opacity: 1;\\n color: rgb(107 114 128 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:text-red-400 {\\n --tw-text-opacity: 1;\\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:opacity-10 {\\n opacity: 0.1;\\n }\\n .dark\\\\:opacity-20 {\\n opacity: 0.2;\\n }\\n .dark\\\\:shadow-gray-900\\\\/50 {\\n --tw-shadow-color: rgb(17 24 39 / 0.5);\\n --tw-shadow: var(--tw-shadow-colored);\\n }\\n .dark\\\\:hover\\\\:bg-blue-900\\\\/50:hover {\\n background-color: rgb(30 58 138 / 0.5);\\n }\\n .dark\\\\:hover\\\\:bg-gray-600:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));\\n }\\n .dark\\\\:hover\\\\:bg-gray-700:hover {\\n --tw-bg-opacity: 1;\\n background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));\\n }\\n .dark\\\\:hover\\\\:bg-red-900\\\\/20:hover {\\n background-color: rgb(127 29 29 / 0.2);\\n }\\n .dark\\\\:hover\\\\:from-gray-600:hover {\\n --tw-gradient-from: #4b5563 var(--tw-gradient-from-position);\\n --tw-gradient-to: rgb(75 85 99 / 0) var(--tw-gradient-to-position);\\n --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);\\n }\\n .dark\\\\:hover\\\\:to-gray-600:hover {\\n --tw-gradient-to: #4b5563 var(--tw-gradient-to-position);\\n }\\n .dark\\\\:hover\\\\:text-gray-300:hover {\\n --tw-text-opacity: 1;\\n color: rgb(209 213 219 / var(--tw-text-opacity, 1));\\n }\\n .dark\\\\:hover\\\\:text-red-400:hover {\\n --tw-text-opacity: 1;\\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\\n }\\n .group:hover .dark\\\\:group-hover\\\\:text-blue-300 {\\n --tw-text-opacity: 1;\\n color: rgb(147 197 253 / var(--tw-text-opacity, 1));\\n }\\n}\\n.\\\\[\\\\&_svg\\\\]\\\\:pointer-events-none svg {\\n pointer-events: none;\\n}\\n.\\\\[\\\\&_svg\\\\]\\\\:size-4 svg {\\n width: 1rem;\\n height: 1rem;\\n}\\n.\\\\[\\\\&_svg\\\\]\\\\:shrink-0 svg {\\n flex-shrink: 0;\\n}\\n\")"],"mappings":"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","names":["React","import_react","import_lucide_react","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_react","import_jsx_runtime","widgetRegistry","items"]}
@@ -0,0 +1,261 @@
1
+ import * as preact from 'preact';
2
+ import { ComponentChildren, ComponentType } from 'preact';
3
+ import * as class_variance_authority_types from 'class-variance-authority/types';
4
+ import { VariantProps } from 'class-variance-authority';
5
+ import * as react from 'react';
6
+
7
+ interface GridItem$1<T = any> {
8
+ id: string;
9
+ x: number;
10
+ y: number;
11
+ w: number;
12
+ h: number;
13
+ type: string;
14
+ title: string;
15
+ content?: () => T;
16
+ onMenuClick?: (event: any) => void;
17
+ menuIcon?: T;
18
+ isAnimating?: boolean;
19
+ originalX?: number;
20
+ originalY?: number;
21
+ originalW?: number;
22
+ originalH?: number;
23
+ }
24
+ interface DragState$1<T = any> {
25
+ id: string;
26
+ startX: number;
27
+ startY: number;
28
+ originalItem: GridItem$1<T>;
29
+ }
30
+ interface ResizeState$1<T = any> extends DragState$1<T> {
31
+ handle: string;
32
+ }
33
+ interface WidgetType$1<T = any> {
34
+ id: string;
35
+ type: string;
36
+ title: string;
37
+ icon: T;
38
+ defaultSize: {
39
+ w: number;
40
+ h: number;
41
+ };
42
+ description: string;
43
+ component: any;
44
+ preview: any;
45
+ onMenuClick?: (event: any) => void;
46
+ menuIcon?: T;
47
+ }
48
+ type GridMode = 'elegant' | 'dots' | 'harsh' | 'blank';
49
+ interface DashboardActions$1<T = any> {
50
+ toggleEditMode: () => void;
51
+ toggleAddWidgetMode: () => void;
52
+ autoOrganize: () => void;
53
+ toggleFixedHeight: () => void;
54
+ addWidget: (widget: WidgetType$1<T>, x?: number, y?: number) => void;
55
+ removeItem: (id: string) => void;
56
+ }
57
+ interface DashboardState$1<T = any> {
58
+ isEditMode: boolean;
59
+ isAddWidgetMode: boolean;
60
+ isFixedHeight: boolean;
61
+ gridDimensions: {
62
+ width: number;
63
+ height: number;
64
+ cols: number;
65
+ rows: number;
66
+ };
67
+ itemCount: number;
68
+ items: GridItem$1<T>[];
69
+ }
70
+ interface SerializedDashboard {
71
+ items: Omit<GridItem$1<any>, 'content'>[];
72
+ }
73
+ interface DashboardController$1<T = any> {
74
+ items: GridItem$1<T>[];
75
+ addItem: (item: GridItem$1<T>) => void;
76
+ removeItem: (id: string) => void;
77
+ updateItem: (id: string, updates: Partial<GridItem$1<T>>) => void;
78
+ setItems: (items: GridItem$1<T>[] | ((prev: GridItem$1<T>[]) => GridItem$1<T>[])) => void;
79
+ save: () => SerializedDashboard;
80
+ load: (state: SerializedDashboard) => void;
81
+ clear: () => void;
82
+ isEditMode: boolean;
83
+ toggleEditMode: () => void;
84
+ setEditMode: (enabled: boolean) => void;
85
+ }
86
+ interface UseDashboardControllerOptions$1<T = any> {
87
+ initialItems?: GridItem$1<T>[];
88
+ initialEditMode?: boolean;
89
+ }
90
+ interface CustomToolbarProps$1<T = any> {
91
+ state: DashboardState$1<T>;
92
+ actions: DashboardActions$1<T>;
93
+ availableWidgetTypes: WidgetType$1<T>[];
94
+ }
95
+ interface DashboardProps$2<T = any> {
96
+ availableWidgetTypes?: WidgetType$1<T>[];
97
+ initialItems?: Omit<GridItem$1<T>, 'content'>[];
98
+ widgetRegistry?: Record<string, any>;
99
+ onItemsChange?: (items: Omit<GridItem$1<T>, 'content'>[]) => void;
100
+ className?: string;
101
+ enableEditMode?: boolean;
102
+ defaultEditMode?: boolean;
103
+ gridMode?: GridMode;
104
+ showDefaultToolbar?: boolean;
105
+ customToolbar?: any;
106
+ toolbarClassName?: string;
107
+ onEditModeChange?: (isEditMode: boolean) => void;
108
+ onAddWidgetModeChange?: (isAddWidgetMode: boolean) => void;
109
+ onFixedHeightChange?: (isFixedHeight: boolean) => void;
110
+ controller?: DashboardController$1<T>;
111
+ }
112
+ interface DashboardToolbarProps$2<T = any> {
113
+ isEditMode: boolean;
114
+ onToggleMode: () => void;
115
+ onAutoOrganize: () => void;
116
+ onToggleFixedHeight: () => void;
117
+ isFixedHeight: boolean;
118
+ gridDimensions: {
119
+ width: number;
120
+ height: number;
121
+ cols: number;
122
+ rows: number;
123
+ };
124
+ itemCount: number;
125
+ isAddWidgetMode?: boolean;
126
+ onToggleAddWidgetMode?: () => void;
127
+ onAddWidget?: (widget: WidgetType$1<T>) => void;
128
+ availableWidgetTypes?: WidgetType$1<T>[];
129
+ }
130
+ interface BasicWidgetProps {
131
+ id?: string;
132
+ title?: string;
133
+ }
134
+ interface ProgressBarData {
135
+ label: string;
136
+ value: number;
137
+ max: number;
138
+ color?: string;
139
+ }
140
+ interface ProgressBarWidgetProps {
141
+ data?: ProgressBarData;
142
+ }
143
+ interface PieChartData {
144
+ label: string;
145
+ segments: Array<{
146
+ name: string;
147
+ value: number;
148
+ color: string;
149
+ }>;
150
+ }
151
+ interface PieChartWidgetProps {
152
+ data?: PieChartData;
153
+ }
154
+ interface BarChartData {
155
+ label: string;
156
+ data: Array<{
157
+ name: string;
158
+ value: number;
159
+ color?: string;
160
+ }>;
161
+ }
162
+ interface BarChartWidgetProps {
163
+ data?: BarChartData;
164
+ }
165
+ interface LineChartData {
166
+ label: string;
167
+ data: Array<{
168
+ name: string;
169
+ value: number;
170
+ }>;
171
+ color?: string;
172
+ }
173
+ interface LineChartWidgetProps {
174
+ data?: LineChartData;
175
+ }
176
+
177
+ type DashboardProps$1 = DashboardProps$2<any>;
178
+ type DashboardToolbarProps$1 = DashboardToolbarProps$2<any>;
179
+
180
+ declare function Dashboard({ availableWidgetTypes, initialItems, widgetRegistry, onItemsChange, className, enableEditMode, defaultEditMode, gridMode, showDefaultToolbar, customToolbar, toolbarClassName, onEditModeChange, onAddWidgetModeChange, onFixedHeightChange, controller: externalController, }: DashboardProps$1): preact.JSX.Element;
181
+
182
+ declare function DashboardToolbar({ isEditMode, onToggleMode, onAutoOrganize, onToggleFixedHeight, isFixedHeight, gridDimensions, itemCount, isAddWidgetMode, onToggleAddWidgetMode, onAddWidget, availableWidgetTypes, }: DashboardToolbarProps$1): preact.JSX.Element;
183
+
184
+ declare const buttonVariants: (props?: ({
185
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
186
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
187
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
188
+ interface ButtonProps extends VariantProps<typeof buttonVariants> {
189
+ className?: string;
190
+ onClick?: (e: any) => void;
191
+ disabled?: boolean;
192
+ type?: "button" | "submit" | "reset";
193
+ children?: any;
194
+ ref?: any;
195
+ [key: string]: any;
196
+ }
197
+ declare function Button({ className, variant, size, ref, ...props }: ButtonProps): preact.JSX.Element;
198
+ declare namespace Button {
199
+ var displayName: string;
200
+ }
201
+
202
+ interface TooltipProviderProps {
203
+ children?: unknown;
204
+ }
205
+ declare function TooltipProvider({ children }: TooltipProviderProps): preact.JSX.Element;
206
+ interface TooltipProps {
207
+ children?: unknown;
208
+ delayDuration?: number;
209
+ }
210
+ declare function Tooltip({ children, delayDuration }: TooltipProps): preact.JSX.Element;
211
+ interface TooltipTriggerProps {
212
+ children?: unknown;
213
+ className?: string;
214
+ asChild?: boolean;
215
+ [key: string]: any;
216
+ }
217
+ declare function TooltipTrigger({ children, asChild, className, ...props }: TooltipTriggerProps): preact.JSX.Element;
218
+ declare namespace TooltipTrigger {
219
+ var displayName: string;
220
+ }
221
+ interface TooltipContentProps {
222
+ children?: unknown;
223
+ className?: string;
224
+ sideOffset?: number;
225
+ side?: "top" | "right" | "bottom" | "left";
226
+ [key: string]: any;
227
+ }
228
+ declare function TooltipContent({ className, sideOffset, side, children, ...props }: TooltipContentProps): react.ReactPortal | null;
229
+ declare namespace TooltipContent {
230
+ var displayName: string;
231
+ }
232
+
233
+ type GridItem = GridItem$1<ComponentChildren>;
234
+ type DragState = DragState$1<ComponentChildren>;
235
+ type ResizeState = ResizeState$1<ComponentChildren>;
236
+ type WidgetType = Omit<WidgetType$1<ComponentChildren>, 'component' | 'preview'> & {
237
+ component: ComponentType<any>;
238
+ preview: ComponentType<any>;
239
+ };
240
+ type DashboardActions = DashboardActions$1<ComponentChildren>;
241
+ type DashboardState = DashboardState$1<ComponentChildren>;
242
+ type DashboardController = DashboardController$1<ComponentChildren>;
243
+ type UseDashboardControllerOptions = UseDashboardControllerOptions$1<ComponentChildren>;
244
+ type CustomToolbarProps = CustomToolbarProps$1<ComponentChildren>;
245
+ type DashboardProps = DashboardProps$2<ComponentChildren> & {
246
+ widgetRegistry?: Record<string, ComponentType<any>>;
247
+ customToolbar?: ComponentType<CustomToolbarProps> | ((props: CustomToolbarProps) => ComponentChildren);
248
+ };
249
+ type DashboardToolbarProps = DashboardToolbarProps$2<ComponentChildren>;
250
+
251
+ declare const GRID_SIZE = 40;
252
+ declare const MARGIN = 8;
253
+ declare const CELL_SIZE: number;
254
+ declare const ANIMATION_DURATION = 300;
255
+ declare const MIN_SIZE = 2;
256
+ declare const MAX_SIZE = 24;
257
+ declare const CONTAINER_PADDING = 16;
258
+ declare const MIN_CONTAINER_HEIGHT = 200;
259
+ declare const DEBOUNCE_DELAY = 150;
260
+
261
+ export { ANIMATION_DURATION, type BarChartData, type BarChartWidgetProps, type BasicWidgetProps, Button, CELL_SIZE, CONTAINER_PADDING, type CustomToolbarProps, DEBOUNCE_DELAY, Dashboard, type DashboardActions, type DashboardController, type DashboardProps, type DashboardState, DashboardToolbar, type DashboardToolbarProps, type DragState, GRID_SIZE, type GridItem, type GridMode, type LineChartData, type LineChartWidgetProps, MARGIN, MAX_SIZE, MIN_CONTAINER_HEIGHT, MIN_SIZE, type PieChartData, type PieChartWidgetProps, type ProgressBarData, type ProgressBarWidgetProps, type ResizeState, type SerializedDashboard, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type UseDashboardControllerOptions, type WidgetType, Dashboard as default };