UNPKG

aura-glass

Version:

A comprehensive glassmorphism design system for React applications with 142+ production-ready components

900 lines (897 loc) 32.8 kB
'use client'; import { jsx, jsxs, Fragment } from 'react/jsx-runtime'; import { Undo, Redo, Mic, MicOff, Layers, Minimize, Maximize, Wifi, Copy, ClipboardPaste, Trash2, Save, Settings } from 'lucide-react'; import { useState, useEffect, useCallback, useMemo } from 'react'; import { cn } from '../../lib/utilsComprehensive.js'; import { createGlassStyle } from '../../core/mixins/glassMixins.js'; function CollaborativeGlassWorkspace(props) { // Wrap the workspace in providers - in real implementation this would use actual providers return jsx(GlassCollaborationProvider, { "data-glass-component": true, workspaceId: props.workspaceId, userId: props.userId, userName: props.userName, userEmail: props.userEmail, userRole: props.userRole, userAvatar: props.userAvatar, autoConnect: true, enableVoice: props.enableVoiceChat, enableCursorTracking: props.showCursors, enableComments: props.enableComments, showDebugInfo: false, children: jsx(WorkspaceContent, { ...props }) }); } function WorkspaceContent({ className = "", layout = "split", theme = "dark", showMiniMap = true, showOnlineUsers = true, showCursors = true, enableAdvancedEffects = true, canvasWidth = 1200, canvasHeight = 800, gridSize = 20, showGrid = true, showRulers = false, enableSnapping = true, enableVoiceChat = false, enableScreenSharing = false, enableComments = true, enableVersionControl = true, enableRealTimeSync = true, onWorkspaceReady, onUserJoined, onUserLeft, onElementSelected, onError }) { // Mock collaboration context - in real implementation this would use actual context const mockCollaborationContext = { isConnected: true, isConnecting: false, workspace: { id: "workspace-1", name: "Collaborative Design Session" }, users: [], currentUser: { id: "user-1", name: "Current User", role: "admin" }, onlineUsers: [{ id: "user-1", name: "Alice Johnson", role: "admin", avatar: "", color: "var(--glass-color-primary)" }, { id: "user-2", name: "Bob Smith", role: "editor", avatar: "", color: "var(--glass-color-success)" }, { id: "user-3", name: "Carol Davis", role: "viewer", avatar: "", color: "var(--glass-color-warning)" }], canEdit: true, isVoiceActive: false, voiceUsers: [], toggleVoice: () => {}, addComment: () => {}, createSnapshot: () => {}, undo: () => {}, redo: () => {}, canUndo: true, canRedo: false, connect: () => {}, disconnect: () => {} }; const { isConnected, isConnecting, workspace, currentUser, onlineUsers, canEdit, isVoiceActive, voiceUsers, toggleVoice, createSnapshot, undo, redo, canUndo, canRedo } = mockCollaborationContext; // Local state const [activeLayout, setActiveLayout] = useState(layout); const [selectedElementId, setSelectedElementId] = useState(null); const [showSidebar, setShowSidebar] = useState(true); const [showToolbar, setShowToolbar] = useState(true); const [isFullscreen, setIsFullscreen] = useState(false); const [showVoicePanel, setShowVoicePanel] = useState(false); const [showVersionPanel, setShowVersionPanel] = useState(false); // Handle workspace events useEffect(() => { if (workspace) { onWorkspaceReady?.(workspace); } }, [workspace, onWorkspaceReady]); // Handle element selection const handleElementSelect = useCallback(elementId => { setSelectedElementId(elementId); onElementSelected?.(elementId); }, [onElementSelected]); // Layout configurations const layoutConfig = useMemo(() => { switch (activeLayout) { case "canvas-focused": return { canvasSize: "flex-1", editorSize: "w-80", direction: "row", canvasFirst: true }; case "editor-focused": return { canvasSize: "w-80", editorSize: "flex-1", direction: "row", canvasFirst: false }; case "tabs": return { canvasSize: "w-full", editorSize: "w-full", direction: "col", canvasFirst: true }; default: // 'split' return { canvasSize: "flex-1", editorSize: "flex-1", direction: "row", canvasFirst: true }; } }, [activeLayout]); // Connection status if (!isConnected && !isConnecting) { return jsx(WorkspaceConnectionError, { onRetry: () => {}, error: "Failed to connect to collaboration server" }); } if (isConnecting) { return jsx(WorkspaceLoadingState, {}); } if (!workspace || !currentUser) { return jsx(WorkspaceLoadingState, { message: "Setting up workspace..." }); } return jsxs("div", { className: cn("glass-collaborative-workspace glass-h-screen glass-flex glass-flex-col glass-surface-dark", className), role: "main", "aria-live": "polite", children: [showToolbar && jsx(WorkspaceHeader, { workspace: workspace, currentUser: currentUser, onlineUsers: onlineUsers, canEdit: canEdit, isVoiceActive: isVoiceActive, voiceUsers: voiceUsers, onToggleVoice: toggleVoice, onCreateSnapshot: createSnapshot, onUndo: undo, onRedo: redo, canUndo: canUndo, canRedo: canRedo, onLayoutChange: setActiveLayout, activeLayout: activeLayout, onToggleSidebar: () => setShowSidebar(!showSidebar), onToggleFullscreen: () => setIsFullscreen(!isFullscreen), isFullscreen: isFullscreen, showOnlineUsers: showOnlineUsers, enableVoiceChat: enableVoiceChat, enableVersionControl: enableVersionControl }), jsxs("div", { className: cn("glass-flex-1 glass-flex glass-min-h-0", layoutConfig.direction === "col" ? "glass-flex-col" : "glass-flex-row"), children: [activeLayout === "tabs" ? jsx(WorkspaceTabs, { selectedElementId: selectedElementId, onElementSelect: handleElementSelect, canvasWidth: canvasWidth, canvasHeight: canvasHeight, gridSize: gridSize, showGrid: showGrid, showRulers: showRulers, enableSnapping: enableSnapping, enableComments: enableComments, enableRealTimeSync: enableRealTimeSync }) : jsxs(Fragment, { children: [layoutConfig.canvasFirst && jsx("div", { className: cn(layoutConfig.canvasSize, "glass-min-w-0 glass-p-4"), children: jsx(CollaborativeGlassCanvas, { width: canvasWidth, height: canvasHeight, gridSize: gridSize, showGrid: showGrid, showRulers: showRulers, enableSnapping: enableSnapping, onElementSelect: handleElementSelect, className: cn("glass-h-full") }) }), jsx("div", { className: cn(layoutConfig.editorSize, "glass-min-w-0 glass-p-4"), children: jsx(MultiUserGlassEditor, { target: selectedElementId || "global", showPreview: true, showHistory: enableVersionControl, showComments: enableComments, enableRealTimeSync: enableRealTimeSync, layout: "vertical", className: "glass-h-full" }) }), !layoutConfig.canvasFirst && jsx("div", { className: cn(layoutConfig.canvasSize, "glass-min-w-0 glass-p-4"), children: jsx(CollaborativeGlassCanvas, { width: canvasWidth, height: canvasHeight, gridSize: gridSize, showGrid: showGrid, showRulers: showRulers, enableSnapping: enableSnapping, onElementSelect: handleElementSelect, className: cn("glass-h-full") }) })] }), showSidebar && jsx(WorkspaceSidebar, { selectedElementId: selectedElementId, onElementSelect: handleElementSelect, showMiniMap: showMiniMap, showOnlineUsers: showOnlineUsers, onlineUsers: onlineUsers, currentUser: currentUser, isVoiceActive: isVoiceActive, voiceUsers: voiceUsers, enableComments: enableComments })] }), showCursors && (enableAdvancedEffects ? jsx(GlassTeamCursorsWithEffects, { showNames: true, showVoiceIndicators: enableVoiceChat, cursorSize: "md", glassLevel: "medium", enableRippleEffect: true, enableGlowEffect: true }) : jsx(GlassTeamCursors, { showNames: true, showVoiceIndicators: enableVoiceChat, cursorSize: "md", glassLevel: "medium" })), showVoicePanel && enableVoiceChat && jsx(VoiceChatPanel, { isActive: isVoiceActive, voiceUsers: voiceUsers, onClose: () => setShowVoicePanel(false), onToggleVoice: toggleVoice }), showVersionPanel && enableVersionControl && jsx(VersionControlPanel, { onClose: () => setShowVersionPanel(false), onCreateSnapshot: createSnapshot, canUndo: canUndo, canRedo: canRedo, onUndo: undo, onRedo: redo }), jsx(WorkspaceFloatingActions, { isVoiceActive: isVoiceActive, onToggleVoice: toggleVoice, onShowVoicePanel: () => setShowVoicePanel(true), onShowVersionPanel: () => setShowVersionPanel(true), onToggleFullscreen: () => setIsFullscreen(!isFullscreen), enableVoiceChat: enableVoiceChat, enableVersionControl: enableVersionControl })] }); } // Mock provider components - in real implementation these would be actual providers function GlassCollaborationProvider({ children, ...props }) { return jsx(Fragment, { children: children }); } // Workspace Header Component function WorkspaceHeader({ workspace, currentUser, onlineUsers, canEdit, isVoiceActive, voiceUsers, onToggleVoice, onCreateSnapshot, onUndo, onRedo, canUndo, canRedo, onLayoutChange, activeLayout, onToggleSidebar, onToggleFullscreen, isFullscreen, showOnlineUsers, enableVoiceChat, enableVersionControl }) { const [showLayoutMenu, setShowLayoutMenu] = useState(false); return jsxs("div", { className: 'workspace-header glass-flex glass-items-center glass-justify-between glass-px-4 glass-py-3 glass-border-b glass-border-white/10', style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: [jsxs("div", { className: "glass-flex glass-items-center glass-gap-4", children: [jsx("h1", { className: 'glass-text-xl font-bold text-primary', children: workspace.name }), jsx("div", { className: 'glass-text-sm text-primary/60', children: canEdit ? "✏️ Editing" : "👁️ Viewing" })] }), jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [enableVersionControl && jsxs(Fragment, { children: [jsx("button", { onClick: onUndo, disabled: !canUndo, className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 disabled:opacity-50 text-primary glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Undo", children: jsx(Undo, { className: 'w-4 h-4' }) }), jsx("button", { onClick: onRedo, disabled: !canRedo, className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 disabled:opacity-50 text-primary glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Redo", children: jsx(Redo, { className: 'w-4 h-4' }) }), jsx("button", { onClick: () => onCreateSnapshot(`Snapshot ${Date.now()}`), className: 'glass-px-3 glass-py-2 glass-text-sm glass-surface-blue text-primary glass-radius hover:glass-surface-blue', title: "Create Snapshot", children: "\uD83D\uDCF7 Snapshot" })] }), jsxs("div", { className: 'relative', children: [jsx("button", { onClick: () => setShowLayoutMenu(!showLayoutMenu), className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 text-primary', title: "Change Layout", children: "\uD83D\uDD00" }), showLayoutMenu && jsx("div", { className: 'absolute top-full left-0 mt-2 glass-p-2 bg-slate-800 glass-border glass-border-white/20 glass-radius glass-shadow-lg z-50', children: ["split", "tabs", "canvas-focused", "editor-focused"].map(layout => jsx("button", { onClick: () => { onLayoutChange(layout); setShowLayoutMenu(false); }, className: `block w-full text-left px-3 py-2 text-sm rounded hover:bg-white/10 text-white ${activeLayout === layout ? "bg-blue-600" : ""}`, children: layout.charAt(0).toUpperCase() + layout.slice(1).replace("-", " ") }, layout)) })] }), enableVoiceChat && jsxs("button", { onClick: onToggleVoice, className: `p-2 rounded ${isVoiceActive ? "bg-green-600 text-white" : "hover:bg-white/10 text-white"}`, title: isVoiceActive ? "Leave Voice Chat" : "Join Voice Chat", children: [isVoiceActive ? jsx(Mic, { className: 'w-4 h-4' }) : jsx(MicOff, { className: 'w-4 h-4' }), voiceUsers.length > 0 && ` (${voiceUsers.length})`] })] }), jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [showOnlineUsers && jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [jsxs("div", { className: 'glass-flex -space-x-2', children: [onlineUsers.slice(0, 5).map(user => jsx("div", { className: 'w-8 h-8 glass-radius-full glass-border-2 glass-border-white glass-flex glass-items-center glass-justify-center glass-text-xs font-bold text-primary', style: { backgroundColor: user.color }, title: user.name, children: user.name[0] }, user.id)), onlineUsers.length > 5 && jsxs("div", { className: 'w-8 h-8 glass-radius-full glass-surface-primary glass-border-2 glass-border-white glass-flex glass-items-center glass-justify-center glass-text-xs text-primary', children: ["+", onlineUsers.length - 5] })] }), jsxs("span", { className: 'glass-text-sm text-primary/60', children: [onlineUsers.length, " online"] })] }), jsx("button", { onClick: onToggleSidebar, className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 text-primary glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Toggle Sidebar", children: jsx(Layers, { className: 'w-4 h-4' }) }), jsx("button", { onClick: onToggleFullscreen, className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 text-primary glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Toggle Fullscreen", children: isFullscreen ? jsx(Minimize, { className: 'w-4 h-4' }) : jsx(Maximize, { className: 'w-4 h-4' }) })] })] }); } // Mock sub-components - in real implementation these would be actual components function WorkspaceTabs({ selectedElementId, onElementSelect, ...props }) { const [activeTab, setActiveTab] = useState("canvas"); return jsxs("div", { className: "glass-flex glass-flex-col glass-h-full", children: [jsxs("div", { className: 'glass-flex glass-border-b glass-border-white/20 bg-slate-800', children: [jsx("button", { onClick: () => setActiveTab("canvas"), className: `px-6 py-3 font-medium ${activeTab === "canvas" ? "text-white border-b-2 border-blue-400 bg-slate-700" : "text-white/70 hover:text-white"}`, children: "\uD83C\uDFA8 Canvas" }), jsx("button", { onClick: () => setActiveTab("editor"), className: `px-6 py-3 font-medium ${activeTab === "editor" ? "text-white border-b-2 border-blue-400 bg-slate-700" : "text-white/70 hover:text-white"}`, children: "\u2699\uFE0F Properties" })] }), jsx("div", { className: "glass-flex-1 glass-p-4", children: activeTab === "canvas" ? jsx(CollaborativeGlassCanvas, { ...props, onElementSelect: onElementSelect, className: "glass-h-full" }) : jsx(MultiUserGlassEditor, { ...props, className: "glass-h-full" }) })] }); } function CollaborativeGlassCanvas({ width, height, gridSize, showGrid, showRulers, enableSnapping, onElementSelect, className }) { return jsxs("div", { className: `collaborative-canvas relative ${className}`, style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: [showGrid && jsx("div", { className: 'absolute inset-0 opacity-20', style: { backgroundImage: `linear-gradient(var(--glass-bg-default) 1px, transparent 1px), linear-gradient(90deg, var(--glass-bg-default) 1px, transparent 1px)`, backgroundSize: `${gridSize}px ${gridSize}px` } }), jsx("div", { className: 'glass-flex glass-items-center glass-justify-center glass-h-full text-primary/60', children: jsxs("div", { className: 'text-center', children: [jsx("div", { className: 'glass-text-4xl mb-4', children: "\uD83C\uDFA8" }), jsx("p", { className: "glass-text-lg", children: "Collaborative Canvas" }), jsx("p", { className: "glass-text-sm", children: "Click to start designing together" })] }) })] }); } function MultiUserGlassEditor({ target, showPreview, showHistory, showComments, enableRealTimeSync, layout, className }) { return jsx("div", { className: `multi-user-editor ${className}`, style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: jsxs("div", { className: "glass-p-4", children: [jsxs("div", { className: 'glass-flex glass-items-center glass-justify-between mb-4', children: [jsx("h3", { className: 'text-primary font-semibold', children: "Properties Editor" }), jsxs("div", { className: "glass-flex glass-gap-2", children: [showHistory && jsx("button", { className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 text-primary', children: "\uD83D\uDCDC" }), showComments && jsx("button", { className: 'glass-p-2 glass-radius hover:glass-surface-subtle/10 text-primary', children: "\uD83D\uDCAC" }), enableRealTimeSync && jsxs("div", { className: 'glass-flex glass-items-center glass-gap-1 text-primary glass-text-sm', children: [jsx(Wifi, { className: 'w-3 h-3' }), " Live"] })] })] }), jsxs("div", { className: 'space-y-4', children: [jsxs("div", { children: [jsx("label", { className: 'block glass-text-sm font-medium text-primary/80 mb-2', children: "Target Element" }), jsx("div", { className: 'glass-p-2 glass-surface-subtle/5 glass-radius text-primary glass-text-sm', children: target })] }), jsxs("div", { children: [jsx("label", { className: 'block glass-text-sm font-medium text-primary/80 mb-2', children: "Properties" }), jsxs("div", { className: 'space-y-2', children: [jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [jsx("span", { className: 'text-primary/60 glass-text-sm w-20', children: "Width:" }), jsx("input", { type: "number", className: 'glass-flex-1 glass-p-2 glass-surface-subtle/10 glass-radius text-primary glass-text-sm glass-touch-target glass-contrast-guard', placeholder: "Auto" })] }), jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [jsx("span", { className: 'text-primary/60 glass-text-sm w-20', children: "Height:" }), jsx("input", { type: "number", className: 'glass-flex-1 glass-p-2 glass-surface-subtle/10 glass-radius text-primary glass-text-sm glass-touch-target glass-contrast-guard', placeholder: "Auto" })] }), jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [jsx("span", { className: 'text-primary/60 glass-text-sm w-20', children: "Opacity:" }), jsx("input", { type: "range", min: "0", max: "1", step: "0.1", className: "glass-flex-1 glass-touch-target glass-contrast-guard" })] })] })] })] })] }) }); } function WorkspaceSidebar({ selectedElementId, onElementSelect, showMiniMap, showOnlineUsers, onlineUsers, currentUser, isVoiceActive, voiceUsers, enableComments }) { return jsxs("div", { className: 'workspace-sidebar w-80 glass-border-l glass-border-white/20 glass-p-4 space-y-4', style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: [showMiniMap && jsxs("div", { className: 'space-y-2', children: [jsx("h3", { className: 'glass-text-sm font-semibold text-primary/80 uppercase', children: "Mini Map" }), jsx("div", { className: 'aspect-video bg-slate-800 glass-border glass-border-white/20 glass-radius glass-p-2', children: jsx("div", { className: 'glass-text-xs text-primary/50 text-center mt-8', children: "Canvas overview" }) })] }), showOnlineUsers && jsxs("div", { className: 'space-y-2', children: [jsx("h3", { className: 'glass-text-sm font-semibold text-primary/80 uppercase', children: "Online Users" }), jsx("div", { className: 'space-y-2', children: onlineUsers.map(user => jsxs("div", { className: 'glass-flex glass-items-center glass-gap-3 glass-p-2 glass-radius hover:glass-surface-subtle/5', children: [jsx("div", { className: 'w-6 h-6 glass-radius-full glass-flex glass-items-center glass-justify-center glass-text-xs font-bold text-primary', style: { backgroundColor: user.color }, children: user.name[0] }), jsxs("div", { className: "glass-flex-1", children: [jsx("div", { className: 'glass-text-sm text-primary', children: user.name }), jsx("div", { className: 'glass-text-xs text-primary/50', children: user.role })] }), voiceUsers.includes(user.id) && jsx("div", { className: 'text-primary glass-text-xs', children: "\uD83C\uDFA4" })] }, user.id)) })] }), jsxs("div", { className: 'space-y-2', children: [jsx("h3", { className: 'glass-text-sm font-semibold text-primary/80 uppercase', children: "Quick Actions" }), jsxs("div", { className: 'space-y-2', children: [jsxs("button", { className: 'glass-w-full text-left glass-px-3 glass-py-2 glass-text-sm glass-surface-subtle/5 hover:glass-surface-subtle/10 glass-radius text-primary', children: [jsx(Copy, { className: 'w-4 h-4 inline mr-2' }), "Copy Selected"] }), jsxs("button", { className: 'glass-w-full text-left glass-px-3 glass-py-2 glass-text-sm glass-surface-subtle/5 hover:glass-surface-subtle/10 glass-radius text-primary', children: [jsx(ClipboardPaste, { className: 'w-4 h-4 inline mr-2' }), "Paste"] }), jsxs("button", { className: 'glass-w-full text-left glass-px-3 glass-py-2 glass-text-sm glass-surface-subtle/5 hover:glass-surface-subtle/10 glass-radius text-primary', children: [jsx(Trash2, { className: 'w-4 h-4 inline mr-2' }), "Delete Selected"] })] })] })] }); } function GlassTeamCursors({ showNames, showVoiceIndicators, cursorSize, glassLevel }) { return null; // Mock component } function GlassTeamCursorsWithEffects({ showNames, showVoiceIndicators, cursorSize, glassLevel, enableRippleEffect, enableGlowEffect }) { return null; // Mock component } function VoiceChatPanel({ isActive, voiceUsers, onClose, onToggleVoice }) { return jsxs("div", { className: 'fixed bottom-4 right-4 w-80 glass-p-4 glass-radius-lg glass-border glass-border-white/20', style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: [jsxs("div", { className: 'glass-flex glass-items-center glass-justify-between mb-4', children: [jsx("h3", { className: 'text-primary font-semibold', children: "Voice Chat" }), jsx("button", { onClick: onClose, className: 'glass-contrast-guard glass-focus glass-touch-target hover:text-primary text-primary/70', children: "\u2715" })] }), jsx("div", { className: 'space-y-2 mb-4', children: voiceUsers.map(userId => jsxs("div", { className: 'glass-flex glass-items-center glass-gap-2 text-primary glass-text-sm', children: [jsx("div", { className: 'w-2 h-2 glass-surface-green glass-radius-full animate-pulse' }), "User ", userId] }, userId)) }), jsxs("button", { onClick: onToggleVoice, className: `w-full py-2 rounded ${isActive ? "bg-red-600 hover:bg-red-700" : "bg-green-600 hover:bg-green-700"} text-white transition-colors`, children: [isActive ? "🔇 Leave" : "🎤 Join", " Voice Chat"] })] }); } function VersionControlPanel({ onClose, onCreateSnapshot, canUndo, canRedo, onUndo, onRedo }) { return jsxs("div", { className: 'fixed bottom-4 left-4 w-80 glass-p-4 glass-radius-lg glass-border glass-border-white/20', style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: [jsxs("div", { className: 'glass-flex glass-items-center glass-justify-between mb-4', children: [jsx("h3", { className: 'text-primary font-semibold', children: "Version Control" }), jsx("button", { onClick: onClose, className: 'glass-contrast-guard glass-focus glass-touch-target hover:text-primary text-primary/70', children: "\u2715" })] }), jsxs("div", { className: 'space-y-2', children: [jsxs("div", { className: "glass-flex glass-gap-2", children: [jsxs("button", { onClick: onUndo, disabled: !canUndo, className: 'glass-flex-1 glass-py-2 glass-px-3 glass-radius glass-surface-subtle/10 text-primary disabled:opacity-50 glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', children: [jsx(Undo, { className: 'w-4 h-4 inline mr-1' }), "Undo"] }), jsxs("button", { onClick: onRedo, disabled: !canRedo, className: 'glass-flex-1 glass-py-2 glass-px-3 glass-radius glass-surface-subtle/10 text-primary disabled:opacity-50 glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', children: [jsx(Redo, { className: 'w-4 h-4 inline mr-1' }), "Redo"] })] }), jsxs("button", { onClick: () => onCreateSnapshot(`Manual snapshot ${Date.now()}`), className: 'glass-w-full glass-py-2 glass-px-3 glass-radius glass-surface-blue text-primary hover:glass-surface-blue', children: [jsx(Save, { className: 'w-4 h-4 inline mr-1' }), "Create Snapshot"] })] })] }); } function WorkspaceFloatingActions({ isVoiceActive, onToggleVoice, onShowVoicePanel, onShowVersionPanel, onToggleFullscreen, enableVoiceChat, enableVersionControl }) { const [isExpanded, setIsExpanded] = useState(false); return jsxs("div", { className: 'fixed bottom-6 right-6', children: [jsxs("div", { className: `flex flex-col gap-2 ${isExpanded ? "opacity-100" : "opacity-0 pointer-events-none"} transition-opacity`, children: [enableVoiceChat && jsx("button", { onClick: onShowVoicePanel, className: 'w-12 h-12 glass-radius-full glass-surface-green text-primary glass-flex glass-items-center glass-justify-center glass-shadow-lg hover:glass-surface-green glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Voice Chat", children: jsx(Mic, { className: 'w-4 h-4' }) }), enableVersionControl && jsx("button", { onClick: onShowVersionPanel, className: 'w-12 h-12 glass-radius-full glass-surface-blue text-primary glass-flex glass-items-center glass-justify-center glass-shadow-lg hover:glass-surface-blue glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Version Control", children: jsx(Settings, { className: 'w-4 h-4' }) }), jsx("button", { onClick: onToggleFullscreen, className: 'w-12 h-12 glass-radius-full glass-surface-primary text-primary glass-flex glass-items-center glass-justify-center glass-shadow-lg hover:glass-surface-subtle glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', title: "Fullscreen", children: jsx(Maximize, { className: 'w-4 h-4' }) })] }), jsx("button", { onClick: () => setIsExpanded(!isExpanded), className: 'w-14 h-14 glass-radius-full bg-slate-700 text-primary glass-flex glass-items-center glass-justify-center glass-shadow-lg hover:bg-slate-600 mt-2', style: createGlassStyle({ intent: "neutral", elevation: "level2" }), children: isExpanded ? "✕" : "⚡" })] }); } // Loading and Error Components function WorkspaceLoadingState({ message = "Connecting to workspace..." }) { return jsx("div", { className: 'h-screen glass-flex glass-items-center glass-justify-center bg-slate-900', children: jsxs("div", { className: 'text-center space-y-4', children: [jsx("div", { className: 'w-16 h-16 glass-border-4 glass-border-blue glass-border-t-transparent glass-radius-full animate-spin glass-mx-auto' }), jsx("div", { className: 'text-primary glass-text-lg', children: message }), jsx("div", { className: 'text-primary/60 glass-text-sm', children: "Please wait..." })] }) }); } function WorkspaceConnectionError({ onRetry, error }) { return jsx("div", { className: 'h-screen glass-flex glass-items-center glass-justify-center bg-slate-900', children: jsxs("div", { className: 'text-center space-y-4 max-w-md', children: [jsx("div", { className: 'text-primary text-6xl mb-4', children: "\u26A0\uFE0F" }), jsx("div", { className: 'text-primary glass-text-xl font-semibold', children: "Connection Error" }), jsx("div", { className: 'text-primary/70', children: error }), jsx("button", { onClick: onRetry, className: 'glass-px-6 glass-py-3 glass-surface-blue text-primary glass-radius hover:glass-surface-blue transition-colors glass-focus glass-touch-target glass-contrast-guard glass-focus glass-touch-target glass-contrast-guard', children: "Retry Connection" })] }) }); } export { CollaborativeGlassWorkspace, GlassCollaborationProvider, GlassTeamCursors, GlassTeamCursorsWithEffects, CollaborativeGlassWorkspace as default }; //# sourceMappingURL=CollaborativeGlassWorkspace.js.map