* feat(community): filter empty projects from public gallery Add is_empty column to projects table so the public gallery only shows projects with actual content. Scene graph emptiness is computed on save and on creation, and a backfill migration marks existing non-empty projects. Also cleans up import ordering, fixes README migration path, and removes stale feedback table migration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Use ESNext modules and bundler resolution Update packages/db tsconfig to emit ESNext modules and use 'bundler' moduleResolution. This enables modern ESM output and bundler-style resolution for the db package (keeps outDir and rootDir unchanged). * feat(editor): add dark mode theme and grid visibility toggle Add theme state to viewer store with light/dark modes, dark-aware lighting and background colors, grid show/hide toggle in settings, and theme toggle buttons in the sidebar. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add ground occluder, animated lighting & UI tweaks Introduce a ground occluder and smoother animated lighting while adjusting editor UI and icons. Viewer: add GroundOccluder (uses polygon-clipping to union slab/zone polygons) and AnimatedBackground, integrate both into the Canvas; improve Lights to interpolate intensities/colors/ambient for smooth theme transitions. Editor: refactor sidebar header to support inline project title editing and move the theme toggle; replace some lucide icons with image assets and add a settings icon (apps/editor/public/icons/settings.png). Also add polygon-clipping to the viewer package dependencies. * Update dark mode background color and clean up imports Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
26 lines
631 B
TypeScript
26 lines
631 B
TypeScript
import type { SceneGraph } from './actions'
|
|
|
|
const DEFAULT_NODE_TYPES = ['site', 'building', 'level']
|
|
|
|
export function isSceneGraphEmpty(sceneGraph: SceneGraph | any): boolean {
|
|
if (!sceneGraph?.nodes) return true
|
|
|
|
const nodes = Object.values(sceneGraph.nodes) as any[]
|
|
|
|
if (nodes.length > 3) {
|
|
return false
|
|
}
|
|
|
|
const hasNonDefaultNodes = nodes.some((n) => !DEFAULT_NODE_TYPES.includes(n.type))
|
|
if (hasNonDefaultNodes) {
|
|
return false
|
|
}
|
|
|
|
const levelNode = nodes.find((n) => n.type === 'level')
|
|
if (Array.isArray(levelNode?.children) && levelNode.children.length > 0) {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|