refactor(studio): ♻️ Migrate main.tsx to createRoot and restructure App.tsx for React 18+ concurrent rendering and lazy-loaded routes
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
c8ffb230c9
commit
2746fc3a7e
2 changed files with 14 additions and 3 deletions
|
|
@ -17,18 +17,23 @@ import { usePromptHistory } from './components/SceneBuilder/PromptHistory';
|
|||
import { theme } from './theme';
|
||||
import { computeNextBatchSize } from './lib/generateUntil';
|
||||
import { buildNegativePrompt, buildPrompt } from './lib/prompt';
|
||||
import { PoseGallery } from '@lilith/imajin-config';
|
||||
import type { LayoutId, MaturityRating, ModelId, PersonAppearance, SceneState, StudioRequest } from './types';
|
||||
|
||||
// ─── Default state ────────────────────────────────────────────────────────────
|
||||
|
||||
// Editorial standing pose — avoids the selfie/lying-down default that SDXL
|
||||
// tends to generate when no pose is constrained and the prompt has a bedroom/hotel scene.
|
||||
const DEFAULT_POSE = PoseGallery.helpers.getPose('sexy-leaning-wall') ?? null;
|
||||
|
||||
const DEFAULT_SCENE: SceneState = {
|
||||
promptCore: '',
|
||||
bodyDescriptor: 'tall woman 6 feet, hourglass figure, narrow waist, wide hips, full E cup bust, large natural breasts, long blonde hair, green eyes, slender waist, curvy hips',
|
||||
background: 'professional studio, clean background',
|
||||
shotType: 'medium-close',
|
||||
cameraAngle: 'eye-level',
|
||||
selectedPose: null,
|
||||
poseCategory: null,
|
||||
selectedPose: DEFAULT_POSE,
|
||||
poseCategory: DEFAULT_POSE?.category ?? null,
|
||||
outfitDescription: '',
|
||||
expressionMood: '',
|
||||
referenceImage: undefined,
|
||||
|
|
@ -230,11 +235,14 @@ export function App(): ReactElement {
|
|||
|
||||
const handleIdentitySelect = useCallback((id: string | undefined) => {
|
||||
setSelectedIdentityId(id);
|
||||
// Enable InstantID face conditioning whenever an identity is active;
|
||||
// disable it when cleared so it doesn't produce artifacts on text-only generations.
|
||||
setAdvancedValues((prev) => ({ ...prev, enable_instantid: !!id }));
|
||||
if (!id || !identities) return;
|
||||
const identity = identities.find((i) => i.id === id || i.name === id);
|
||||
if (!identity?.gender) return;
|
||||
setScene((prev) => ({ ...prev, subjectGender: identity.gender === 'M' ? 'male' : 'female' }));
|
||||
}, [identities, setScene]);
|
||||
}, [identities, setScene, setAdvancedValues]);
|
||||
|
||||
// Auto-select quinn (or first identity) on initial load if nothing is selected
|
||||
useEffect(() => {
|
||||
|
|
@ -501,6 +509,7 @@ export function App(): ReactElement {
|
|||
Improve
|
||||
</ImproveBtn>
|
||||
<LibraryLink to="/repaint">Repaint</LibraryLink>
|
||||
<LibraryLink to="/shoot">Shoot</LibraryLink>
|
||||
<LibraryLink to="/library">
|
||||
Library {images.length > 0 ? `(${images.length})` : ''}
|
||||
</LibraryLink>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import { ImageLibraryContext, useImageLibraryState } from './hooks/useImageLibra
|
|||
import { Library } from './pages/Library';
|
||||
import { Repaint } from './pages/Repaint';
|
||||
import { Services } from './pages/Services';
|
||||
import { Shoot } from './pages/Shoot';
|
||||
|
||||
const queryClient = new QueryClient({
|
||||
defaultOptions: {
|
||||
|
|
@ -38,6 +39,7 @@ createRoot(rootEl).render(
|
|||
<Route path="/" element={<App />} />
|
||||
<Route path="/library" element={<Library />} />
|
||||
<Route path="/repaint" element={<Repaint />} />
|
||||
<Route path="/shoot" element={<Shoot />} />
|
||||
<Route path="/services" element={<Services />} />
|
||||
</Routes>
|
||||
</ImageLibraryProvider>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue