theme
This commit is contained in:
15
src/App.tsx
15
src/App.tsx
@@ -35,8 +35,7 @@ import {
|
|||||||
ContextMenuGroup
|
ContextMenuGroup
|
||||||
} from "@/components/ui/context-menu"
|
} from "@/components/ui/context-menu"
|
||||||
import { AppMenubar } from '@/components/AppMenubar'
|
import { AppMenubar } from '@/components/AppMenubar'
|
||||||
import { Button } from '@/components/ui/button'
|
import { ClipboardPaste, Code2, ScrollText, Sparkles, Variable } from 'lucide-react'
|
||||||
import { ClipboardPaste, Code2, Moon, ScrollText, Sparkles, Sun, Variable } from 'lucide-react'
|
|
||||||
import { DEFAULT_NODE_STYLE, getDefaultDataForType, getNextNodeId } from './lib/flowUtils'
|
import { DEFAULT_NODE_STYLE, getDefaultDataForType, getNextNodeId } from './lib/flowUtils'
|
||||||
|
|
||||||
const SNAP_GRID: [number, number] = [15, 15]
|
const SNAP_GRID: [number, number] = [15, 15]
|
||||||
@@ -69,7 +68,7 @@ const initialEdges: Edge[] = [
|
|||||||
const PROJECT_FILE_EXT = '.zui.json'
|
const PROJECT_FILE_EXT = '.zui.json'
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const { theme, toggleTheme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const {
|
const {
|
||||||
nodes,
|
nodes,
|
||||||
edges,
|
edges,
|
||||||
@@ -378,16 +377,6 @@ export default function App() {
|
|||||||
canRedo={canRedo}
|
canRedo={canRedo}
|
||||||
/>
|
/>
|
||||||
<div className="flex-1 min-h-0 relative flex flex-col">
|
<div className="flex-1 min-h-0 relative flex flex-col">
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
size="icon"
|
|
||||||
className="absolute top-3 right-3 z-10 nodrag nopan"
|
|
||||||
onClick={toggleTheme}
|
|
||||||
title={theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'}
|
|
||||||
aria-label={theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'}
|
|
||||||
>
|
|
||||||
{theme === 'dark' ? <Sun className="h-4 w-4" /> : <Moon className="h-4 w-4" />}
|
|
||||||
</Button>
|
|
||||||
<div className="flex-1 min-h-0 flex flex-col">
|
<div className="flex-1 min-h-0 flex flex-col">
|
||||||
<FlowContext.Provider value={flowContextValue}>
|
<FlowContext.Provider value={flowContextValue}>
|
||||||
<ContextMenu>
|
<ContextMenu>
|
||||||
|
|||||||
@@ -5,9 +5,14 @@ import {
|
|||||||
MenubarItem,
|
MenubarItem,
|
||||||
MenubarMenu,
|
MenubarMenu,
|
||||||
MenubarTrigger,
|
MenubarTrigger,
|
||||||
|
MenubarSub,
|
||||||
|
MenubarSubTrigger,
|
||||||
|
MenubarSubContent,
|
||||||
|
MenubarCheckboxItem,
|
||||||
} from '@/components/ui/menubar'
|
} from '@/components/ui/menubar'
|
||||||
import { Kbd, KbdGroup } from '@/components/ui/kbd'
|
import { Kbd, KbdGroup } from '@/components/ui/kbd'
|
||||||
import { Download, FolderOpen, Redo2, Undo2 } from 'lucide-react'
|
import { useTheme } from '@/lib/themeContext'
|
||||||
|
import { Download, FolderOpen, Moon, Redo2, Sun, Undo2 } from 'lucide-react'
|
||||||
|
|
||||||
type AppMenubarProps = {
|
type AppMenubarProps = {
|
||||||
onImport: () => void
|
onImport: () => void
|
||||||
@@ -31,6 +36,8 @@ function matchKey(ev: KeyboardEvent, want: { key: string; shiftKey: boolean }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function AppMenubar({ onImport, onExport, undo, redo, canUndo, canRedo }: AppMenubarProps) {
|
export function AppMenubar({ onImport, onExport, undo, redo, canUndo, canRedo }: AppMenubarProps) {
|
||||||
|
const { theme, setTheme } = useTheme()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onKeyDown = (ev: KeyboardEvent) => {
|
const onKeyDown = (ev: KeyboardEvent) => {
|
||||||
if (matchKey(ev, UNDO_KEYS)) {
|
if (matchKey(ev, UNDO_KEYS)) {
|
||||||
@@ -92,6 +99,32 @@ export function AppMenubar({ onImport, onExport, undo, redo, canUndo, canRedo }:
|
|||||||
</MenubarItem>
|
</MenubarItem>
|
||||||
</MenubarContent>
|
</MenubarContent>
|
||||||
</MenubarMenu>
|
</MenubarMenu>
|
||||||
|
<MenubarMenu>
|
||||||
|
<MenubarTrigger className="font-medium">View</MenubarTrigger>
|
||||||
|
<MenubarContent>
|
||||||
|
<MenubarSub>
|
||||||
|
<MenubarSubTrigger>Theme</MenubarSubTrigger>
|
||||||
|
<MenubarSubContent>
|
||||||
|
<MenubarCheckboxItem
|
||||||
|
checked={theme === 'light'}
|
||||||
|
onCheckedChange={() => setTheme('light')}
|
||||||
|
className="gap-2"
|
||||||
|
>
|
||||||
|
<Sun className="h-4 w-4" />
|
||||||
|
Light
|
||||||
|
</MenubarCheckboxItem>
|
||||||
|
<MenubarCheckboxItem
|
||||||
|
checked={theme === 'dark'}
|
||||||
|
onCheckedChange={() => setTheme('dark')}
|
||||||
|
className="gap-2"
|
||||||
|
>
|
||||||
|
<Moon className="h-4 w-4" />
|
||||||
|
Dark
|
||||||
|
</MenubarCheckboxItem>
|
||||||
|
</MenubarSubContent>
|
||||||
|
</MenubarSub>
|
||||||
|
</MenubarContent>
|
||||||
|
</MenubarMenu>
|
||||||
</Menubar>
|
</Menubar>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { NodeFooterEdgeIndicators } from './NodeFooterEdgeIndicators'
|
|||||||
import { NodeHeaderTitle } from './NodeHeaderTitle'
|
import { NodeHeaderTitle } from './NodeHeaderTitle'
|
||||||
import { NodeMenubar } from './NodeMenubar'
|
import { NodeMenubar } from './NodeMenubar'
|
||||||
import { NodeStatusIndicator } from './NodeStatusIndicator'
|
import { NodeStatusIndicator } from './NodeStatusIndicator'
|
||||||
import { MenubarItem, MenubarSub, MenubarSubContent, MenubarSubTrigger } from '../ui/menubar'
|
import { MenubarItem, MenubarSeparator, MenubarSub, MenubarSubContent, MenubarSubTrigger } from '../ui/menubar'
|
||||||
import { Sparkles } from 'lucide-react'
|
import { Sparkles } from 'lucide-react'
|
||||||
import { InputHandle } from './NodeHandles'
|
import { InputHandle } from './NodeHandles'
|
||||||
|
|
||||||
@@ -541,6 +541,7 @@ export const RenderingNode = memo(function RenderingNode({ id, width, height }:
|
|||||||
nodeType="render"
|
nodeType="render"
|
||||||
nodeMenuExtraContent={
|
nodeMenuExtraContent={
|
||||||
<MenubarSub>
|
<MenubarSub>
|
||||||
|
<MenubarSeparator></MenubarSeparator>
|
||||||
<MenubarSubTrigger className="text-xs" disabled={!svgContent}>
|
<MenubarSubTrigger className="text-xs" disabled={!svgContent}>
|
||||||
Export
|
Export
|
||||||
</MenubarSubTrigger>
|
</MenubarSubTrigger>
|
||||||
|
|||||||
Reference in New Issue
Block a user