diff --git a/apps/studymesh/src/App.tsx b/apps/studymesh/src/App.tsx index 983f3615..e9e75b67 100644 --- a/apps/studymesh/src/App.tsx +++ b/apps/studymesh/src/App.tsx @@ -120,6 +120,8 @@ const WorkspacePage = () => { overflow: 'hidden', display: 'flex', flexDirection: 'column', + background: + 'radial-gradient(circle at 8% -8%, rgba(34,197,94,0.22), transparent 32%), radial-gradient(circle at 92% 0%, rgba(14,165,233,0.16), transparent 30%), #020617', }} > alpha(theme.palette.primary.main, 0.18), bgcolor: 'background.paper', + backgroundImage: (theme) => + theme.palette.mode === 'dark' + ? 'linear-gradient(180deg, rgba(34,197,94,0.08), transparent 320px)' + : 'linear-gradient(180deg, rgba(34,197,94,0.055), transparent 320px)', display: 'flex', flexDirection: 'column', gap: { xs: 1.5, md: 2 }, @@ -142,25 +146,40 @@ const DashboardEmptyState = ({ : '0 20px 56px rgba(15,23,42,0.08)', }} > - + + `radial-gradient(circle at 0% 0%, ${alpha(theme.palette.primary.main, 0.22)}, transparent 38%), radial-gradient(circle at 100% 18%, ${alpha('#b66cff', 0.18)}, transparent 34%)`, + border: 1, + borderColor: (theme) => alpha(theme.palette.primary.main, 0.18), + }} + > - Start creating + Empty dashboard mission control + + + What do you want to build? - What do you want to build? + Turn a blank page into a learning cockpit. + + {['1 Add material', '2 Pick output', '3 Review dashboard'].map( + (label) => ( + + alpha(theme.palette.primary.main, 0.08), + border: 1, + borderColor: (theme) => + alpha(theme.palette.primary.main, 0.16), + }} + /> + ), + )} + alpha(theme.palette.primary.main, 0.42), bgcolor: (theme) => alpha(theme.palette.primary.main, 0.075), @@ -189,7 +232,10 @@ const DashboardEmptyState = ({ cursor: isAdmin ? 'pointer' : 'default', textAlign: 'left', display: 'grid', - gridTemplateColumns: 'auto minmax(0, 1fr) auto', + gridTemplateColumns: { + xs: 'auto minmax(0, 1fr)', + sm: 'auto minmax(0, 1fr) auto', + }, alignItems: 'center', gap: { xs: 1.25, sm: 1.5 }, boxShadow: (theme) => @@ -230,7 +276,7 @@ const DashboardEmptyState = ({ Recommended - + Create Study Path - Upload material + + Upload material + + PDF, slides, images, text + + @@ -298,14 +363,15 @@ const DashboardEmptyState = ({ - Fast creation from material + Material launch bay · fast creation from material - This dashboard is empty, so add sources in Creation first. + This dashboard is empty, so these actions open Create from + Material with the right setup ready. onQuickCreate(action.intent)} disabled={!isAdmin} sx={{ - minHeight: 92, - p: 1.25, - borderRadius: 2, + minHeight: 124, + p: 1.45, + borderRadius: 2.75, border: 1, borderColor: alpha(action.accent, 0.24), bgcolor: alpha(action.accent, 0.07), @@ -374,6 +440,17 @@ const DashboardEmptyState = ({ {action.label} + @@ -381,6 +458,44 @@ const DashboardEmptyState = ({ + + {['Source in', 'AI builds', 'Dashboard opens'].map( + (label, index) => ( + + + 0{index + 1} + + + {label} + + + ), + )} + - + + Source intelligence + + Ask Sources @@ -309,23 +323,45 @@ const DashboardChatPanel = ({ - - What do you want to understand? + + Grounded chat + + + Interrogate your dashboard. Ask questions based on the sources and study material in this dashboard. I’ll keep answers grounded in what’s here. - - {suggestions.map((suggestion) => ( + + {suggestions.map((suggestion, index) => ( ))} - + ) : ( diff --git a/apps/studymesh/src/components/topnavbar/TopNavBar.tsx b/apps/studymesh/src/components/topnavbar/TopNavBar.tsx index 26821dad..26b0b10a 100644 --- a/apps/studymesh/src/components/topnavbar/TopNavBar.tsx +++ b/apps/studymesh/src/components/topnavbar/TopNavBar.tsx @@ -708,14 +708,17 @@ const TopNavBar: React.FC = ({ creationHost = 'navbar' }) => { position="static" sx={{ backgroundColor: 'background.header', - boxShadow: 2, - height: isMobileWorkspaceHeader ? '56px' : '52px', + backgroundImage: + 'linear-gradient(90deg, rgba(34,197,94,0.22), rgba(14,165,233,0.12) 38%, rgba(182,108,255,0.14))', + borderBottom: '1px solid rgba(255,255,255,0.10)', + boxShadow: '0 18px 48px rgba(2, 6, 23, 0.24)', + height: isMobileWorkspaceHeader ? '64px' : '60px', }} > = ({ creationHost = 'navbar' }) => { color: 'foreground.contrastPrimary', textTransform: 'none', borderRadius: 999, - bgcolor: 'rgba(255,255,255,0.08)', + bgcolor: 'rgba(255,255,255,0.12)', + border: '1px solid rgba(255,255,255,0.16)', + boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.18)', '&:hover': { bgcolor: 'rgba(255,255,255,0.14)' }, '& .MuiButton-endIcon': { ml: 0.25, mr: 0 }, }} diff --git a/apps/studymesh/src/components/workspace/WorkspaceStudioLayouts.tsx b/apps/studymesh/src/components/workspace/WorkspaceStudioLayouts.tsx index 7ffac049..4665476e 100644 --- a/apps/studymesh/src/components/workspace/WorkspaceStudioLayouts.tsx +++ b/apps/studymesh/src/components/workspace/WorkspaceStudioLayouts.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Box, Slide, Tooltip, Typography } from '@mui/material' import AddIcon from '@mui/icons-material/Add' -import type { Theme } from '@mui/material/styles' +import { alpha, type Theme } from '@mui/material/styles' import { studioPanelRailWidth, workspaceCanvasSx } from './workspaceStudioModel' @@ -37,6 +37,10 @@ export const WorkspaceMobileLayout = ({ display: 'flex', flexDirection: 'column', bgcolor: 'background.default', + background: + theme.palette.mode === 'dark' + ? `radial-gradient(circle at 50% -10%, ${alpha(theme.palette.primary.main, 0.24)}, transparent 34%), #020617` + : `radial-gradient(circle at 50% -10%, ${alpha(theme.palette.primary.main, 0.14)}, transparent 34%), #f8fff9`, '--studymesh-mobile-generation-tray-height': visibleCreationMarkerCount ? '48px' : '0px', @@ -77,7 +81,7 @@ export const WorkspaceMobileLayout = ({ position: 'absolute', inset: 0, overflow: 'hidden', - p: '8px', + p: '12px', boxSizing: 'border-box', zIndex: 2, bgcolor: 'background.default', @@ -89,7 +93,7 @@ export const WorkspaceMobileLayout = ({ overflow: 'hidden', border: 1, borderColor: 'divider', - borderRadius: 2, + borderRadius: 4, bgcolor: 'background.paper', boxShadow: theme.palette.mode === 'dark' @@ -138,6 +142,10 @@ export const WorkspaceDesktopLayout = ({ display: 'flex', overflow: 'hidden', bgcolor: 'background.default', + background: + theme.palette.mode === 'dark' + ? `radial-gradient(circle at 0% 0%, ${alpha(theme.palette.primary.main, 0.22)}, transparent 30%), radial-gradient(circle at 88% 12%, ${alpha(theme.palette.warning.main, 0.14)}, transparent 28%), linear-gradient(135deg, ${alpha('#020617', 0.98)}, ${alpha('#07111f', 0.96)})` + : `radial-gradient(circle at 0% 0%, ${alpha(theme.palette.primary.main, 0.14)}, transparent 30%), radial-gradient(circle at 88% 12%, ${alpha(theme.palette.warning.main, 0.12)}, transparent 28%), linear-gradient(135deg, #f8fff9, #eef7ff)`, }} > @@ -183,8 +195,12 @@ export const WorkspaceDesktopLayout = ({ height: '100%', border: 1, borderColor: 'divider', - borderRadius: 2.5, + borderRadius: 999, bgcolor: 'background.paper', + background: + theme.palette.mode === 'dark' + ? `linear-gradient(180deg, ${alpha(theme.palette.primary.main, 0.2)}, ${alpha(theme.palette.background.paper, 0.95)})` + : `linear-gradient(180deg, ${alpha(theme.palette.primary.main, 0.14)}, ${alpha(theme.palette.background.paper, 0.98)})`, color: 'primary.main', cursor: 'pointer', display: 'flex', @@ -249,6 +265,7 @@ export const WorkspaceDesktopLayout = ({ sx={{ flex: 1, minWidth: 0, + p: '14px', ...workspaceCanvasSx, transition: theme.transitions.create('padding', { duration: theme.transitions.duration.shorter, @@ -260,10 +277,14 @@ export const WorkspaceDesktopLayout = ({ height: '100%', minHeight: 0, overflow: 'hidden', - borderRadius: 2, + borderRadius: 4, bgcolor: 'background.paper', border: 1, - borderColor: 'divider', + borderColor: alpha(theme.palette.primary.main, 0.16), + boxShadow: + theme.palette.mode === 'dark' + ? `0 28px 90px ${alpha('#000', 0.48)}` + : `0 24px 70px ${alpha('#0f172a', 0.12)}`, }} > {children} diff --git a/apps/studymesh/src/components/workspace/WorkspaceStudioShell.tsx b/apps/studymesh/src/components/workspace/WorkspaceStudioShell.tsx index cf145819..bfecd427 100644 --- a/apps/studymesh/src/components/workspace/WorkspaceStudioShell.tsx +++ b/apps/studymesh/src/components/workspace/WorkspaceStudioShell.tsx @@ -898,6 +898,30 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { ] const studyPathOption = createOptions[0] + const commandStats = [ + { label: 'Primary route', value: 'Study Path' }, + { + label: 'Fast lane', + value: hasCurrentDashboardContext ? '1-click ready' : 'Needs source', + }, + { label: 'Material lab', value: quickSourceLabel }, + ] + const sourceFlowSteps = [ + { + label: 'Output', + value: selectedQuickCreateIntent + ? quickCreateLabels[selectedQuickCreateIntent] + : 'Pick a target', + }, + { + label: 'Source', + value: quickSourceMode === 'dashboard' ? 'Dashboard' : quickSourceLabel, + }, + { + label: 'Finish', + value: quickCanCreateFromActiveSource ? 'Ready' : 'Waiting', + }, + ] const returnToCreateHub = () => { setActiveFlow('hub') @@ -929,34 +953,108 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { }} > - - - - Creation - - + + + + + StudyMesh command center + + + Build the next learning surface. + + + Big guided paths, instant review material, or a focused source + lab — all from one launch deck. + + + + + + + - Create a guided study path or quick material from your dashboard. - - - - - - + {commandStats.map((stat) => ( + + + {stat.label} + + + {stat.value} + + + ))} + + + {!quickOptionsOpen ? ( <> @@ -967,18 +1065,31 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { elevation={0} sx={{ width: '100%', - p: { xs: 2, sm: 2.25 }, + p: { xs: 2.4, sm: 3 }, textAlign: 'left', - borderRadius: 3, + borderRadius: 4, border: 1, borderColor: alpha(theme.palette.primary.main, 0.42), - bgcolor: alpha(theme.palette.primary.main, 0.075), + bgcolor: alpha( + theme.palette.primary.main, + theme.palette.mode === 'dark' ? 0.16 : 0.1, + ), color: 'text.primary', cursor: 'pointer', display: 'block', position: 'relative', overflow: 'hidden', - boxShadow: `0 14px 36px ${alpha(theme.palette.primary.main, 0.1)}`, + boxShadow: `0 28px 80px ${alpha(theme.palette.primary.main, theme.palette.mode === 'dark' ? 0.22 : 0.14)}`, + '&::before': { + content: '""', + position: 'absolute', + inset: -80, + background: `radial-gradient(circle at 85% 8%, ${alpha( + theme.palette.primary.main, + theme.palette.mode === 'dark' ? 0.22 : 0.16, + )}, transparent 34%)`, + pointerEvents: 'none', + }, '&:hover': { borderColor: 'primary.main', bgcolor: alpha(theme.palette.primary.main, 0.105), @@ -992,7 +1103,7 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { 'background-color 160ms ease, border-color 160ms ease, transform 160ms ease', }} > - + { > Recommended - + Study Path @@ -1034,6 +1145,25 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { Creates lessons, dashboards, exercises and flashcards. + + {['01 Lessons', '02 Exercises', '03 Review'].map((label) => ( + + ))} + - + + ) + }, + )} + + + + ) : ( @@ -1241,8 +1402,28 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { > ← Back to Creation - - + + + Material lab + + Create from Material { Add files, pasted notes, images, PDFs, or slides, then choose what StudyMesh should create. - + + {sourceFlowSteps.map((step, index) => ( + + + 0{index + 1} · {step.label} + + + {step.value} + + + ))} + + )} @@ -1262,22 +1476,37 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { ref={quickOptionsPanelRef} elevation={0} sx={{ - p: { xs: 1.5, sm: 1.75 }, + p: { xs: 1.6, sm: 2 }, border: 1, borderColor: quickHasCustomSources ? alpha(theme.palette.primary.main, 0.45) : hasCurrentDashboardContext ? 'divider' : alpha(theme.palette.warning.main, 0.65), - borderRadius: 2.5, - bgcolor: 'background.paper', + borderRadius: 3.5, + bgcolor: + theme.palette.mode === 'dark' + ? alpha(theme.palette.background.paper, 0.92) + : 'background.paper', + backgroundImage: + theme.palette.mode === 'dark' + ? `linear-gradient(180deg, ${alpha(theme.palette.primary.main, 0.06)}, transparent 220px)` + : `linear-gradient(180deg, ${alpha(theme.palette.primary.main, 0.045)}, transparent 220px)`, }} > - - Step 1: Choose output - + + + + Step 1: Choose output + + { )} - - Step 2: Choose source - + + + + Step 2: Choose source + + { {!hasCurrentDashboardContext && @@ -1406,9 +1683,9 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { onDrop={handleQuickSourceDrop} onDragOver={(event) => event.preventDefault()} sx={{ - minHeight: 210, - p: 2, - border: '1.5px dashed', + minHeight: 270, + p: 2.5, + border: '2px dashed', borderColor: quickSourceFiles.length ? 'primary.main' : 'divider', @@ -1433,9 +1710,9 @@ const WorkspaceStudioShell = ({ children }: { children: React.ReactNode }) => { > { sx={{ maxWidth: 300 }} > Drop notes here, or upload text, images, PDFs, and - slides. + slides. Your selected files stay in this Creation panel.