+
+
+
+
+
+ {titleContent ?? defaultTitle}
+
+
-
)
}
diff --git a/frontend/src/app/recollections/RecollectionMenubarContext.tsx b/frontend/src/app/recollections/layout/RecollectionMenubarContext.tsx
similarity index 100%
rename from frontend/src/app/recollections/RecollectionMenubarContext.tsx
rename to frontend/src/app/recollections/layout/RecollectionMenubarContext.tsx
diff --git a/frontend/src/app/recollections/RecollectionTitleContent.tsx b/frontend/src/app/recollections/layout/RecollectionTitleContent.tsx
similarity index 60%
rename from frontend/src/app/recollections/RecollectionTitleContent.tsx
rename to frontend/src/app/recollections/layout/RecollectionTitleContent.tsx
index ba2ab64..1c69be4 100644
--- a/frontend/src/app/recollections/RecollectionTitleContent.tsx
+++ b/frontend/src/app/recollections/layout/RecollectionTitleContent.tsx
@@ -3,22 +3,12 @@
* the active slot (RecollectionActionsContext); Import/Export from layout-level handlers.
*/
-import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'
+import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'
import { useParams } from 'react-router-dom'
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuPortal,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
-} from '@/components/ui/dropdown-menu'
-import { Kbd, KbdGroup } from '@/components/ui/kbd'
-import { RenameRecollectionDialog } from './RenameRecollectionDialog'
import { usePlatform } from '@/app/kosmos/KosmosContext'
import { useRecollectionMenubar } from './RecollectionMenubarContext'
import { useRecollectionActions } from './RecollectionActionsContext'
-import { CheckCircle2, ChevronDown, CircleDot, Download, FolderOpen, Loader2, Pencil, Save } from 'lucide-react'
+import { CheckCircle2, CircleDot, Loader2 } from 'lucide-react'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
const SAVE_KEYS = { key: 's', shiftKey: false }
@@ -31,15 +21,14 @@ function matchKey(ev: KeyboardEvent, want: { key: string; shiftKey: boolean }) {
/** Registers the shared title + save dropdown as titleContent. Renders nothing. */
export function RecollectionTitleContent() {
const { setTitleContent } = useRecollectionMenubar()
- const { activeSlot, onImport, onExport } = useRecollectionActions()
+ const { activeSlot } = useRecollectionActions()
const { recollectionId } = useParams<{ recollectionId: string }>()
- const { recollections, renameRecollection } = usePlatform()
+ const { recollections } = usePlatform()
const recollectionName = useMemo(
() => (recollectionId ? recollections.find((p) => p.id === recollectionId)?.name ?? null : null),
[recollectionId, recollections]
)
- const [renameModalOpen, setRenameModalOpen] = useState(false)
const [showSavedBriefly, setShowSavedBriefly] = useState(false)
const savedBrieflyTimerRef = useRef
| null>(null)
const prevSaveStatusRef = useRef('saved')
@@ -116,72 +105,19 @@ export function RecollectionTitleContent() {
[recollectionName, saveStatus, showSavedBriefly]
)
- const dropdownContent = useMemo(() => (
- <>
- {recollectionId && (
- <>
- {onSave != null && (
- <>
-
-
- Save
- ⌘S
-
-
- >
- )}
- setRenameModalOpen(true)} className="gap-2">
-
- Rename
-
-
- >
- )}
-
-
- Import…
-
-
-
- Export…
-
- >
- ), [recollectionId, onSave, canSave, onImport, onExport])
-
- const titleNode = useMemo(() => (
-
-
+ const titleNode = useMemo(
+ () => (
+
{trigger}
-
-
-
-
- {dropdownContent}
-
-
-
- ), [trigger, dropdownContent])
+
+ ),
+ [trigger]
+ )
useLayoutEffect(() => {
setTitleContent(titleNode)
return () => setTitleContent(null)
}, [titleNode, setTitleContent])
- return (
- {
- renameRecollection(id, newName)
- setRenameModalOpen(false)
- }}
- />
- )
+ return null
}
diff --git a/frontend/src/app/recollections/RecollectionViewSwitcher.tsx b/frontend/src/app/recollections/layout/RecollectionViewSwitcher.tsx
similarity index 100%
rename from frontend/src/app/recollections/RecollectionViewSwitcher.tsx
rename to frontend/src/app/recollections/layout/RecollectionViewSwitcher.tsx
diff --git a/frontend/src/app/recollections/RecollectionsPageBackground.tsx b/frontend/src/app/recollections/layout/RecollectionsPageBackground.tsx
similarity index 100%
rename from frontend/src/app/recollections/RecollectionsPageBackground.tsx
rename to frontend/src/app/recollections/layout/RecollectionsPageBackground.tsx
diff --git a/frontend/src/app/recollections/RenameRecollectionDialog.tsx b/frontend/src/app/recollections/layout/RenameRecollectionDialog.tsx
similarity index 100%
rename from frontend/src/app/recollections/RenameRecollectionDialog.tsx
rename to frontend/src/app/recollections/layout/RenameRecollectionDialog.tsx
diff --git a/frontend/src/app/recollections/logos/LogosPage.tsx b/frontend/src/app/recollections/logos/LogosPage.tsx
index 8ff37ea..caec149 100644
--- a/frontend/src/app/recollections/logos/LogosPage.tsx
+++ b/frontend/src/app/recollections/logos/LogosPage.tsx
@@ -10,8 +10,8 @@ import { FluxIcon } from '@/lib/icons'
import { useCreateBlockNote, getDefaultReactSlashMenuItems, SuggestionMenuController } from '@blocknote/react'
import { BlockNoteView } from '@blocknote/shadcn'
import { useTheme } from '@/lib/themeContext'
-import { useRecollectionActions } from '../RecollectionActionsContext'
-import { getLogosContent, setLogosContent, type StoredLogosContent } from '../recollectionStore'
+import { useRecollectionActions } from '../layout/RecollectionActionsContext'
+import { getLogosContent, setLogosContent, type StoredLogosContent } from '../state/recollectionStore'
import { logosSchema } from './logosSchema'
import { toast } from 'sonner'
diff --git a/frontend/src/app/recollections/logos/blocks/fluxOutputBlock.tsx b/frontend/src/app/recollections/logos/blocks/fluxOutputBlock.tsx
index 946a722..b979968 100644
--- a/frontend/src/app/recollections/logos/blocks/fluxOutputBlock.tsx
+++ b/frontend/src/app/recollections/logos/blocks/fluxOutputBlock.tsx
@@ -9,7 +9,7 @@ import React, { useCallback, useState } from 'react'
import { useParams } from 'react-router-dom'
import { createReactBlockSpec } from '@blocknote/react'
import type { ReactCustomBlockRenderProps } from '@blocknote/react'
-import { getRenderOutputCache, type RenderOutputCacheEntry } from '../../recollectionStore'
+import { getRenderOutputCache, type RenderOutputCacheEntry } from '../../state/recollectionStore'
import { Button } from '@/components/ui/button'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
diff --git a/frontend/src/app/recollections/recollectionGraphStorage.ts b/frontend/src/app/recollections/state/recollectionGraphStorage.ts
similarity index 100%
rename from frontend/src/app/recollections/recollectionGraphStorage.ts
rename to frontend/src/app/recollections/state/recollectionGraphStorage.ts
diff --git a/frontend/src/app/recollections/recollectionStore.ts b/frontend/src/app/recollections/state/recollectionStore.ts
similarity index 100%
rename from frontend/src/app/recollections/recollectionStore.ts
rename to frontend/src/app/recollections/state/recollectionStore.ts
diff --git a/frontend/src/components/nodes/render/useRenderingNodeState.ts b/frontend/src/components/nodes/render/useRenderingNodeState.ts
index 0057a5d..b298d69 100644
--- a/frontend/src/components/nodes/render/useRenderingNodeState.ts
+++ b/frontend/src/components/nodes/render/useRenderingNodeState.ts
@@ -9,7 +9,7 @@ import { useAbstractNode } from '@/lib/graph/abstractNode'
import { useSyncConnectionStatus } from '@/lib/graph/nodeLifecycle'
import { useCanvasStore, dispatchCanvasCommand } from '@/app/canvas/canvasStore'
import { usePlatform } from '@/app/kosmos/KosmosContext'
-import { useOptionalRecollectionActions } from '@/app/recollections/RecollectionActionsContext'
+import { useOptionalRecollectionActions } from '@/app/recollections/layout/RecollectionActionsContext'
import { getDefaultDataForType, getNextNodeId } from '@/lib/graph/flowUtils'
import { getDefaultStyle } from '@/lib/graph/nodeRegistry'
import {