{
overTimeline.value = true;
}}
diff --git a/app/modules/TopBar/TopBar.tsx b/app/modules/TopBar/TopBar.tsx
index 40632259ef..29e40a9657 100644
--- a/app/modules/TopBar/TopBar.tsx
+++ b/app/modules/TopBar/TopBar.tsx
@@ -1,14 +1,17 @@
-import { useContext, } from "react";
import { useLocation } from "@remix-run/react";
import { faChevronLeft } from "@fortawesome/pro-solid-svg-icons";
-import { TopBarInnerContext } from "~/contexts/TopBarInner";
import { ButtonLink } from "~/components";
import { AuthButtons } from "./AuthButtons";
+import { sceneTitle } from "~/store";
-export const TopBar = () => {
+interface Props {
+ pageName: string;
+}
+
+export const TopBar = ({ pageName }: Props) => {
const currentLocation = useLocation().pathname;
return (
@@ -30,15 +33,16 @@ export const TopBar = () => {
alt="Logo FakeYou StoryTeller.ai"
/>
- {currentLocation !== "/" &&
+ {currentLocation !== "/" && (
Back to Dashboard
- }
+ )}
@@ -49,12 +53,3 @@ export const TopBar = () => {
);
};
-
-const TopBarInner = ({currentLocation}:{currentLocation:string}) => {
- const { TopBarInner } = useContext(TopBarInnerContext) || {};
- if(!TopBarInner || TopBarInner.location !== currentLocation){
- return null;
- }
- return TopBarInner.node;
-};
-
diff --git a/app/modules/TopBarHelmet/TopBarHelmet.tsx b/app/modules/TopBarHelmet/TopBarHelmet.tsx
index b73b655f39..2bd01a41f5 100644
--- a/app/modules/TopBarHelmet/TopBarHelmet.tsx
+++ b/app/modules/TopBarHelmet/TopBarHelmet.tsx
@@ -1,17 +1,9 @@
import { useLocation } from "@remix-run/react";
-import {
- useContext,
- useEffect,
- useLayoutEffect,
- useState,
-} from 'react';
+import { useContext, useEffect, useLayoutEffect, useState } from "react";
import { TopBarInnerContext } from "~/contexts/TopBarInner";
-
-export const TopBarHelmet = (props:{
- children: React.ReactNode | null;
-})=>{
+export const TopBarHelmet = (props: { children: React.ReactNode | null }) => {
const [showChild, setShowChild] = useState(false);
// Wait until after client-side hydration to show
useEffect(() => {
@@ -23,22 +15,22 @@ export const TopBarHelmet = (props:{
}
return
;
-}
+};
-const LazyLoadTopBarInnerContent = (props:{
+const LazyLoadTopBarInnerContent = (props: {
children: React.ReactNode | null;
-})=>{
+}) => {
const { setTopBarInner } = useContext(TopBarInnerContext) || {};
const location = useLocation().pathname;
- useLayoutEffect(()=>{
- if(setTopBarInner){
+ useLayoutEffect(() => {
+ if (setTopBarInner) {
setTopBarInner({
location: location,
- node: props.children
+ node: props.children,
});
}
- },[setTopBarInner]);
+ }, [setTopBarInner]);
return null;
-}
+};
diff --git a/app/pages/PageEnigma/PageEnigma.tsx b/app/pages/PageEnigma/PageEnigma.tsx
index 613becceb5..499ad12433 100644
--- a/app/pages/PageEnigma/PageEnigma.tsx
+++ b/app/pages/PageEnigma/PageEnigma.tsx
@@ -1,44 +1,26 @@
import { PageEnigmaComponent } from "./PageEnigmaComponent";
import { TrackProvider } from "~/pages/PageEnigma/contexts/TrackContext/TrackProvider";
-import { AppUIProvider } from "~/pages/PageEnigma/contexts/AppUiContext";
-import { EngineProvider } from "~/pages/PageEnigma/contexts/EngineProvider";
import { DragComponent } from "~/pages/PageEnigma/comps/DragComponent/DragComponent";
-import { useEffect } from "react";
-import { useSignals } from "@preact/signals-react/runtime";
-import {
- pageHeight,
- pageWidth,
- sidePanelWidth,
- timelineHeight,
-} from "~/pages/PageEnigma/store";
+import { useContext, useEffect } from "react";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { EngineContext } from "~/contexts/EngineContext";
export const PageEnigma = () => {
- useSignals();
+ const [_, dispatchAppUiState] = useContext(AppUiContext);
+ const editor = useContext(EngineContext);
+
useEffect(() => {
- function setPage() {
- // TODO address this issue with zooming
- pageHeight.value = window.innerHeight;
- pageWidth.value = window.innerWidth;
+ if (editor && editor.can_initialize && dispatchAppUiState !== null) {
+ console.log("initializing Editor");
+ editor.initialize({
+ dispatchAppUiState,
+ });
}
- timelineHeight.value = window.innerHeight * 0.25;
- sidePanelWidth.value = 443;
-
- setPage();
-
- window.addEventListener("resize", setPage);
-
- return () => {
- window.removeEventListener("resize", setPage);
- };
- }, []);
+ }, [editor, dispatchAppUiState]);
return (
-
-
-
-
-
+
);
diff --git a/app/pages/PageEnigma/PageEnigmaComponent.tsx b/app/pages/PageEnigma/PageEnigmaComponent.tsx
index e635b36557..0b4ef4fbdc 100644
--- a/app/pages/PageEnigma/PageEnigmaComponent.tsx
+++ b/app/pages/PageEnigma/PageEnigmaComponent.tsx
@@ -1,8 +1,6 @@
-import { useContext, useState } from "react";
-import { faSparkles } from "@fortawesome/pro-solid-svg-icons";
+import React, { useContext } from "react";
-import { Button, LoadingBar, LoadingDots } from "~/components";
-import { TopBarHelmet } from "~/modules/TopBarHelmet/TopBarHelmet";
+import { LoadingBar, LoadingDots } from "~/components";
import { SidePanel } from "~/modules/SidePanel";
import { Controls3D } from "./comps/Controls3D";
@@ -13,24 +11,22 @@ import { PreviewEngineCamera } from "./comps/PreviewEngineCamera";
import { ViewSideBySide } from "./comps/ViewSideBySide";
import { Timeline } from "./comps/Timeline";
-import { APPUI_VIEW_MODES } from "./reducers";
+import { APPUI_VIEW_MODES } from "../../reducers";
import {
timelineHeight,
sidePanelWidth,
- pageWidth,
sidePanelVisible,
- pageHeight,
dndSidePanelWidth,
dndTimelineHeight,
} from "~/pages/PageEnigma/store";
import { useSignals } from "@preact/signals-react/runtime";
-import { AppUiContext } from "~/pages/PageEnigma/contexts/AppUiContext";
-import { EngineContext } from "./contexts/EngineContext";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { pageHeight, pageWidth } from "~/store";
+import { TopBar } from "~/modules/TopBar";
export const PageEnigmaComponent = () => {
useSignals();
- const editorEngine = useContext(EngineContext);
const [appUiState] = useContext(AppUiContext);
//To prevent the click event from propagating to the canvas: TODO: HANDLE THIS BETTER?
@@ -38,14 +34,6 @@ export const PageEnigmaComponent = () => {
event.stopPropagation();
};
- const handleGenerateMovieClick = () => {
- if (editorEngine != null) {
- editorEngine?.generateVideo();
- } else {
- console.log("Tried to generate movie but editor was null");
- }
- };
-
const dndWidth =
dndSidePanelWidth.value > -1
? dndSidePanelWidth.value
@@ -60,11 +48,7 @@ export const PageEnigmaComponent = () => {
return (
-
-
-
+
{
const editorEngine = useContext(EngineContext);
@@ -66,14 +68,18 @@ export const Controls3D = () => {
-
-
-
-
+
+
+
+
+
+
diff --git a/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx b/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx
index 84b3edf4d2..bfcd9785d1 100644
--- a/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx
+++ b/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx
@@ -1,9 +1,9 @@
import { useContext, useState } from "react";
import { Button, Input } from "~/components";
import { ButtonDialogue } from "~/modules/ButtonDialogue";
-import { EngineContext } from "../../contexts/EngineContext";
-import { ToasterContext } from "~/pages/PageEnigma/contexts/ToasterContext";
-import { APPUI_ACTION_TYPES } from "~/pages/PageEnigma/reducers";
+import { EngineContext } from "../../../../contexts/EngineContext";
+import { ToasterContext } from "~/contexts/ToasterContext";
+import { APPUI_ACTION_TYPES } from "app/reducers";
export const ControlsTopButtons = () => {
const editorEngine = useContext(EngineContext);
@@ -17,7 +17,7 @@ export const ControlsTopButtons = () => {
const handleButtonSave = async () => {
console.log(`SceneName is ${sceneName}`);
const sceneMediaToken = await editorEngine?.saveScene(sceneName);
- if(sceneMediaToken){
+ if (sceneMediaToken) {
addToast("success", sceneMediaToken);
}
};
@@ -129,9 +129,7 @@ export const ControlsTopButtons = () => {
-
-
-
+
{/*
*/}
diff --git a/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx b/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx
index dd3ce0c84a..86cc4d8fb2 100644
--- a/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx
+++ b/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx
@@ -7,7 +7,7 @@ import {
faPlay,
} from "@fortawesome/pro-solid-svg-icons";
import { ButtonIcon } from "~/components";
-import { EngineContext } from "../../contexts/EngineContext";
+import { EngineContext } from "../../../../contexts/EngineContext";
export const ControlsVideo = () => {
const editorEngine = useContext(EngineContext);
diff --git a/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx b/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx
index babadfe83f..a68523d513 100644
--- a/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx
+++ b/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx
@@ -1,7 +1,6 @@
import { useContext, useEffect, useState } from "react";
-import { EngineContext } from "../../contexts/EngineContext";
-import { Button, Input } from "~/components";
-import { LoadingDotsTyping } from "~/components";
+import { EngineContext } from "../../../../contexts/EngineContext";
+import { Button, Input, LoadingDotsTyping } from "~/components";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCameraViewfinder } from "@fortawesome/pro-solid-svg-icons";
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx b/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx
index f2b61ed00d..816fc0dda9 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx
@@ -2,11 +2,10 @@ import { useContext, useState } from "react";
import { Button, ItemPicker, Label, Textarea } from "~/components";
-import { AppUiContext } from "../../contexts/AppUiContext";
-import { APPUI_ACTION_TYPES, APPUI_VIEW_MODES } from "../../reducers";
-import { EngineContext } from "../../contexts/EngineContext";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { APPUI_ACTION_TYPES, APPUI_VIEW_MODES } from "~/reducers";
+import { EngineContext } from "~/contexts/EngineContext";
import { ArtStyle } from "../../js/api_manager";
-import { ignoreDelete } from "~/pages/PageEnigma/store";
export const TabStylization = () => {
const [appUiState, dispatchAppUiState] = useContext(AppUiContext);
diff --git a/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx b/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx
index 600f99c9f5..a194f09adf 100644
--- a/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx
+++ b/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx
@@ -3,7 +3,7 @@ import { filmLength, scale, selectedItem } from "~/pages/PageEnigma/store";
import { useMouseEventsKeyframe } from "~/pages/PageEnigma/comps/Timeline/utils/useMouseEventsKeyframe";
import { useSignals } from "@preact/signals-react/runtime";
import { useContext } from "react";
-import { ToasterContext } from "~/pages/PageEnigma/contexts/ToasterContext";
+import { ToasterContext } from "~/contexts/ToasterContext";
interface Props {
keyframe: Keyframe;
diff --git a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts
index d8ca0c1edf..7a066836d4 100644
--- a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts
+++ b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts
@@ -31,8 +31,6 @@ export const useMouseEventsScrubber = () => {
}
};
- console.log("scroll", currentScroll.value);
-
const onMouseMove = (event: MouseEvent) => {
const delta = Math.round(
(event.clientX - clientX) / 4 / scale.value + currentTime.value,
diff --git a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts
index 31aa752cf4..5c53a71b00 100644
--- a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts
+++ b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts
@@ -1,9 +1,6 @@
import React, { useCallback, useEffect, useState } from "react";
-import {
- dndTimelineHeight,
- pageHeight,
- timelineHeight,
-} from "~/pages/PageEnigma/store";
+import { dndTimelineHeight, timelineHeight } from "~/pages/PageEnigma/store";
+import { pageHeight } from "~/store";
export const useMouseEventsTimeline = () => {
const [isActive, setIsActive] = useState(false);
diff --git a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx
index 2006974a60..17a2f65770 100644
--- a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx
+++ b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx
@@ -1,42 +1,45 @@
import { useEffect, useState, useContext } from "react";
import { LoadingDotsBricks } from "~/components";
-import { EngineContext } from "../../contexts/EngineContext";
+import { EngineContext } from "../../../../contexts/EngineContext";
-export const ViewSideBySide = ()=>{
+export const ViewSideBySide = () => {
const [showLoader, setShowLoader] = useState(true);
const editorEngine = useContext(EngineContext);
- useEffect(()=>{
+ useEffect(() => {
editorEngine?.generateFrame();
- setTimeout(()=>setShowLoader(false), 200);
- },[ ]);
+ setTimeout(() => setShowLoader(false), 200);
+ }, []);
return (
-
+
-
![]()
+
-
+
-
![]()
+
-
- )
-}
\ No newline at end of file
+ );
+};
diff --git a/app/pages/PageEnigma/contexts/EngineProvider.tsx b/app/pages/PageEnigma/contexts/EngineProvider.tsx
deleted file mode 100644
index 2428a5a529..0000000000
--- a/app/pages/PageEnigma/contexts/EngineProvider.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { ReactNode, useContext, useEffect, useState } from "react";
-
-import Editor from "~/pages/PageEnigma/js/editor";
-
-import { EngineContext } from "./EngineContext";
-import { AppUiContext } from "./AppUiContext";
-
-interface Props {
- children: ReactNode;
-}
-
-export const EngineProvider = ({ children }: Props) => {
- const [editor, setEditor] = useState
(null);
- const [appUiState, dispatchAppUiState] = useContext(AppUiContext);
- // To talk to react land.
-
- useEffect(() => {
- //componentDidMount
- if (document.getElementById("video-scene") === null) {
- console.error(
- 'Editor Engine need a target canvas with the id "video-scene"',
- );
- } else {
- setEditor((curr) => {
- if (curr !== null) {
- console.warn("Editor Engine already exist");
- return curr;
- } else {
- return new Editor();
- }
- });
- }
- }, []);
-
- useEffect(() => {
- if (editor && editor.can_initialize && dispatchAppUiState !== null) {
- console.log("initializing Editor");
- editor.initialize({
- dispatchAppUiState,
- });
- }
- }, [editor, dispatchAppUiState]);
-
- return (
- {children}
- );
-};
diff --git a/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts b/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts
index 0a3b3b8d90..0f779acaf7 100644
--- a/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts
+++ b/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts
@@ -13,7 +13,7 @@ import {
deleteCharacterKeyframe,
deleteObjectKeyframe,
} from "~/pages/PageEnigma/store";
-import { ToasterContext } from "~/pages/PageEnigma/contexts/ToasterContext";
+import { ToasterContext } from "~/contexts/ToasterContext";
const ADD_KEYFRAME: Record<
ClipGroup,
diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts
index a33026252c..b002132afd 100644
--- a/app/pages/PageEnigma/js/editor.ts
+++ b/app/pages/PageEnigma/js/editor.ts
@@ -21,7 +21,7 @@ import { LipSyncEngine } from "./lip_sync_engine.js";
import { AnimationEngine } from "./animation_engine.js";
import { PointerLockControls } from "three/addons/controls/PointerLockControls.js";
-import { APPUI_ACTION_TYPES } from "../reducers";
+import { APPUI_ACTION_TYPES } from "../../../reducers";
import { ClipGroup } from "~/pages/PageEnigma/models/track";
import { XYZ } from "../datastructures/common";
diff --git a/app/pages/PageEnigma/store/sidePanel.ts b/app/pages/PageEnigma/store/sidePanel.ts
index 7da980497e..f416771ce0 100644
--- a/app/pages/PageEnigma/store/sidePanel.ts
+++ b/app/pages/PageEnigma/store/sidePanel.ts
@@ -1,6 +1,7 @@
import { computed, signal } from "@preact/signals-core";
import { AssetFilterOption, Tab } from "~/pages/PageEnigma/models";
-import { pageHeight, timelineHeight } from "~/pages/PageEnigma/store/sizing";
+import { timelineHeight } from "~/pages/PageEnigma/store/sizing";
+import { pageHeight } from "~/store";
export const sidePanelVisible = signal(true);
diff --git a/app/pages/PageEnigma/store/sizing.ts b/app/pages/PageEnigma/store/sizing.ts
index f838c049c6..052685850f 100644
--- a/app/pages/PageEnigma/store/sizing.ts
+++ b/app/pages/PageEnigma/store/sizing.ts
@@ -2,9 +2,6 @@ import { signal, computed } from "@preact/signals-core";
import { characterGroups } from "~/pages/PageEnigma/store/characterGroups";
import { objectGroup } from "~/pages/PageEnigma/store/objectGroup";
-export const pageHeight = signal(0);
-export const pageWidth = signal(0);
-
// timeline
export const scale = signal(1);
export const filmLength = signal(12);
diff --git a/app/pages/PageStylization/PageStylization.tsx b/app/pages/PageStylization/PageStylization.tsx
new file mode 100644
index 0000000000..c2a338639c
--- /dev/null
+++ b/app/pages/PageStylization/PageStylization.tsx
@@ -0,0 +1,23 @@
+import { useSignals } from "@preact/signals-react/runtime";
+import { PageStylizationComponent } from "~/pages/PageStylization/PageStylizationComponent";
+import { useContext, useEffect } from "react";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { EngineContext } from "~/contexts/EngineContext";
+
+export const PageStylization = () => {
+ useSignals();
+
+ const [, dispatchAppUiState] = useContext(AppUiContext);
+ const editor = useContext(EngineContext);
+
+ useEffect(() => {
+ if (editor && editor.can_initialize && dispatchAppUiState !== null) {
+ console.log("initializing Editor");
+ editor.initialize({
+ dispatchAppUiState,
+ });
+ }
+ }, [editor, dispatchAppUiState]);
+
+ return ;
+};
diff --git a/app/pages/PageStylization/PageStylizationComponent.tsx b/app/pages/PageStylization/PageStylizationComponent.tsx
new file mode 100644
index 0000000000..58ea48b1ca
--- /dev/null
+++ b/app/pages/PageStylization/PageStylizationComponent.tsx
@@ -0,0 +1,50 @@
+import { useSignals } from "@preact/signals-react/runtime";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faAngleLeft } from "@fortawesome/pro-solid-svg-icons";
+import { Button, Link } from "~/components";
+import { StyleSelection } from "~/pages/PageStylization/comps/StyleSelection";
+import { LowerPanel } from "~/modules/LowerPanel";
+import { TimerGrid } from "~/pages/PageEnigma/comps/TimerGrid/TimerGrid";
+import { Scrubber } from "~/pages/PageEnigma/comps/Timeline/Scrubber";
+import { PreviewImages } from "~/pages/PageStylization/comps/PreviewImages";
+import { TopBar } from "~/modules/TopBar";
+
+export const PageStylizationComponent = () => {
+ useSignals();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/app/pages/PageStylization/comps/PreviewImages.tsx b/app/pages/PageStylization/comps/PreviewImages.tsx
new file mode 100644
index 0000000000..c7e95254b5
--- /dev/null
+++ b/app/pages/PageStylization/comps/PreviewImages.tsx
@@ -0,0 +1,44 @@
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faArrowRight } from "@fortawesome/pro-solid-svg-icons";
+import { useSignals } from "@preact/signals-react/runtime";
+import { pageHeight, pageWidth } from "~/store";
+
+export const PreviewImages = () => {
+ useSignals();
+
+ const imageWidth1 = pageWidth.value > 1340 ? 630 : (pageWidth.value - 80) / 2;
+ const imageHeight1 = imageWidth1 * 0.56;
+ const imageHeight2 = pageHeight.value > 1138 ? 354 : pageHeight.value - 620;
+ const imageWidth2 = imageHeight2 / 0.56;
+
+ const imageWidth = imageHeight1 < imageHeight2 ? imageWidth1 : imageWidth2;
+ const imageHeight = imageHeight1 < imageHeight2 ? imageHeight1 : imageHeight2;
+
+ const textClasses = [
+ "flex items-center justify-center",
+ "w-full rounded-t-lg bg-ui-controls h-[34px]",
+ "text-sm font-semibold",
+ ].join(" ");
+
+ return (
+
+ );
+};
diff --git a/app/pages/PageStylization/comps/StyleSelection.tsx b/app/pages/PageStylization/comps/StyleSelection.tsx
new file mode 100644
index 0000000000..d8d8c9ebbb
--- /dev/null
+++ b/app/pages/PageStylization/comps/StyleSelection.tsx
@@ -0,0 +1,123 @@
+import { useContext, useState } from "react";
+
+import { ButtonIcon, ItemPicker, Label, Textarea } from "~/components";
+
+import { EngineContext } from "~/contexts/EngineContext";
+import { ArtStyle } from "~/pages/PageEnigma/js/api_manager";
+import { faAngleLeft, faAngleRight } from "@fortawesome/pro-solid-svg-icons";
+import { styleList } from "~/pages/PageStylization/styleList";
+
+export const StyleSelection = () => {
+ const [selection, setSelection] = useState(styleList[0].type);
+ const [scrollPosition, setScrollPosition] = useState(0);
+
+ const editorEngine = useContext(EngineContext);
+
+ const handlePickingStylizer = (picked: ArtStyle) => {
+ console.log(`Picked style: ${picked}`);
+ setSelection(picked);
+ if (editorEngine === null) {
+ console.log("Editor is null");
+ return;
+ }
+ editorEngine.art_style = picked;
+ };
+
+ const onChangeHandlerNegative = (
+ e: React.ChangeEvent,
+ ) => {
+ if (editorEngine == null) {
+ console.log("Editor is null");
+ return;
+ }
+ editorEngine.negative_prompt = e.target.value;
+ console.log(e.target.value);
+ };
+
+ const onChangeHandlerPositive = (
+ e: React.ChangeEvent,
+ ) => {
+ if (editorEngine == null) {
+ console.log("Editor is null");
+ return;
+ }
+ editorEngine.positive_prompt = e.target.value;
+ console.log(e.target.value);
+ };
+
+ return (
+
+
+
+
+
+ {styleList.map((style) => (
+
+ ))}
+
+ {scrollPosition > 0 && (
+
+
+ setScrollPosition(Math.max(scrollPosition - 6, 0))
+ }
+ />
+
+ )}
+ {scrollPosition < styleList.length - 9 && (
+
+
+ setScrollPosition(
+ Math.min(scrollPosition + 6, styleList.length - 9),
+ )
+ }
+ fill
+ />
+
+ )}
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/app/pages/PageStylization/index.tsx b/app/pages/PageStylization/index.tsx
new file mode 100644
index 0000000000..b3d450471e
--- /dev/null
+++ b/app/pages/PageStylization/index.tsx
@@ -0,0 +1 @@
+export * from "./PageStylization";
diff --git a/app/pages/PageStylization/styleList.ts b/app/pages/PageStylization/styleList.ts
new file mode 100644
index 0000000000..423fb0d312
--- /dev/null
+++ b/app/pages/PageStylization/styleList.ts
@@ -0,0 +1,84 @@
+import { ArtStyle } from "~/pages/PageEnigma/js/api_manager";
+
+export const styleList = [
+ {
+ label: "1",
+ type: ArtStyle.Anime2_5D,
+ image: "/resources/avatars/0.webp",
+ },
+ {
+ label: "2",
+ type: ArtStyle.Anime2DFlat,
+ image: "/resources/avatars/1.webp",
+ },
+ {
+ label: "3",
+ type: ArtStyle.Cartoon3D,
+ image: "/resources/avatars/2.webp",
+ },
+ {
+ label: "4",
+ type: ArtStyle.ComicBook,
+ image: "/resources/avatars/3.webp",
+ },
+ {
+ label: "5",
+ type: ArtStyle.AnimeGhibli,
+ image: "/resources/avatars/4.webp",
+ },
+ {
+ label: "6",
+ type: ArtStyle.InkPunk,
+ image: "/resources/avatars/5.webp",
+ },
+ {
+ label: "7",
+ type: ArtStyle.InkSplash,
+ image: "/resources/avatars/6.webp",
+ },
+ {
+ label: "8",
+ type: ArtStyle.InkBWStyle,
+ image: "/resources/avatars/7.webp",
+ },
+ {
+ label: "9",
+ type: ArtStyle.JojoStyle,
+ image: "/resources/avatars/8.webp",
+ },
+ {
+ label: "10",
+ type: ArtStyle.PaperOrigami,
+ image: "/resources/avatars/9.webp",
+ },
+ {
+ label: "11",
+ type: ArtStyle.PixelArt,
+ image: "/resources/avatars/10.webp",
+ },
+ {
+ label: "12",
+ type: ArtStyle.PopArt,
+ image: "/resources/avatars/11.webp",
+ },
+ {
+ label: "13",
+ type: ArtStyle.Realistic1,
+ image: "/resources/avatars/12.webp",
+ },
+ {
+ label: "14",
+ type: ArtStyle.Realistic2,
+ image: "/resources/avatars/13.webp",
+ },
+ {
+ label: "15",
+ type: ArtStyle.AnimeRetroNeon,
+ image: "/resources/avatars/14.webp",
+ },
+ {
+ label: "16",
+ type: ArtStyle.AnimeStandard,
+ image: "/resources/avatars/15.webp",
+ },
+];
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/index.tsx b/app/reducers/appUiReducer/index.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/appUiReducer/index.tsx
rename to app/reducers/appUiReducer/index.tsx
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/reducer.tsx b/app/reducers/appUiReducer/reducer.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/appUiReducer/reducer.tsx
rename to app/reducers/appUiReducer/reducer.tsx
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/types.tsx b/app/reducers/appUiReducer/types.tsx
similarity index 94%
rename from app/pages/PageEnigma/reducers/appUiReducer/types.tsx
rename to app/reducers/appUiReducer/types.tsx
index 5dc4cffe81..720f29d8f8 100644
--- a/app/pages/PageEnigma/reducers/appUiReducer/types.tsx
+++ b/app/reducers/appUiReducer/types.tsx
@@ -1,5 +1,5 @@
-import { Simple3DVector } from "../../datastructures/common";
-import { AssetType, ClipGroup } from "../../models";
+import { Simple3DVector } from "../../pages/PageEnigma/datastructures/common";
+import { AssetType, ClipGroup } from "../../pages/PageEnigma/models";
export enum VIEW_MODES {
EDITOR = "editor",
SIDE_BY_SIDE = "side-by-side",
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/values.tsx b/app/reducers/appUiReducer/values.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/appUiReducer/values.tsx
rename to app/reducers/appUiReducer/values.tsx
diff --git a/app/pages/PageEnigma/reducers/index.tsx b/app/reducers/index.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/index.tsx
rename to app/reducers/index.tsx
diff --git a/app/root.tsx b/app/root.tsx
index 8cdb91667c..7f4587eb89 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -18,13 +18,18 @@ import { LoadingDotsBricks } from "~/components";
import { TopBar } from "./modules/TopBar";
import { TopBarInnerContext } from "~/contexts/TopBarInner";
import { AuthenticationProvider } from "./contexts/Authentication";
-import { ToasterProvider } from "~/pages/PageEnigma/contexts/ToasterContext";
+import { ToasterProvider } from "~/contexts/ToasterContext";
// The following import prevents a Font Awesome icon server-side rendering bug,
// where the icons flash from a very large icon down to a properly sized one:
-import '@fortawesome/fontawesome-svg-core/styles.css';
+import "@fortawesome/fontawesome-svg-core/styles.css";
// Prevent fontawesome from adding its CSS since we did it manually above:
-import { config } from '@fortawesome/fontawesome-svg-core';
+import { config } from "@fortawesome/fontawesome-svg-core";
+import { useSignals } from "@preact/signals-react/runtime";
+import { pageHeight, pageWidth } from "~/store";
+import { sidePanelWidth, timelineHeight } from "~/pages/PageEnigma/store";
+import { EngineProvider } from "~/contexts/EngineProvider";
+import { AppUIProvider } from "~/contexts/AppUiContext";
config.autoAddCss = false; /* eslint-disable import/first */
export const links: LinksFunction = () => [
@@ -65,6 +70,25 @@ export default function App() {
setTimeout(() => setShowLoader(false), 2500);
}, []);
+ useSignals();
+ useEffect(() => {
+ function setPage() {
+ // TODO address this issue with zooming
+ pageHeight.value = window.innerHeight;
+ pageWidth.value = window.innerWidth;
+ }
+ timelineHeight.value = window.innerHeight * 0.25;
+ sidePanelWidth.value = 443;
+
+ setPage();
+
+ window.addEventListener("resize", setPage);
+
+ return () => {
+ window.removeEventListener("resize", setPage);
+ };
+ }, []);
+
return (
@@ -78,16 +102,12 @@ export default function App() {
-
-
-
-
-
+
+
+
+
+
+
diff --git a/app/routes/Stylization.tsx b/app/routes/Stylization.tsx
new file mode 100644
index 0000000000..0b20e39895
--- /dev/null
+++ b/app/routes/Stylization.tsx
@@ -0,0 +1,11 @@
+import type { HeadersFunction } from "@remix-run/deno";
+import { withProtectionRoute } from "~/modules/withProtectedRoute";
+import { PageStylization } from "~/pages/PageStylization";
+
+export const headers: HeadersFunction = () => ({
+ "Cross-Origin-Embedder-Policy": "require-corp",
+ "Cross-Origin-Opener-Policy": "same-origin",
+});
+
+const Stylization = withProtectionRoute(() => );
+export default Stylization;
diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx
index 9f26515f16..26bce9aff5 100644
--- a/app/routes/_index.tsx
+++ b/app/routes/_index.tsx
@@ -1,8 +1,11 @@
-
import type { MetaFunction } from "@remix-run/deno";
import { TopBarHelmet } from "~/modules/TopBarHelmet";
import sonic from "./_assets/sonic-the-hedgehog-classic-sonic.gif";
+import { useSignals } from "@preact/signals-react/runtime";
+import { useEffect } from "react";
+import { pageHeight, pageWidth } from "~/store";
+import { sidePanelWidth, timelineHeight } from "~/pages/PageEnigma/store";
export const meta: MetaFunction = () => {
return [
@@ -20,10 +23,10 @@ export default function Index() {
src={sonic}
className="
fixed
- h-screen w-screen
- top-0 left-0
+ left-0 top-0
+ -z-10 h-screen
+ w-screen
object-cover
- -z-10
"
/>
diff --git a/app/store/global.ts b/app/store/global.ts
new file mode 100644
index 0000000000..ce57f155e1
--- /dev/null
+++ b/app/store/global.ts
@@ -0,0 +1,6 @@
+import { signal } from "@preact/signals-core";
+
+export const sceneTitle = signal("Home Office");
+
+export const pageHeight = signal(0);
+export const pageWidth = signal(0);
diff --git a/app/store/index.ts b/app/store/index.ts
new file mode 100644
index 0000000000..09370234b7
--- /dev/null
+++ b/app/store/index.ts
@@ -0,0 +1 @@
+export * from "./global";