From d1684a14729c8bf1929518db137f68f86285de50 Mon Sep 17 00:00:00 2001 From: Timothy Pidashev Date: Tue, 12 Mar 2024 10:10:44 -0700 Subject: [PATCH] update --- src/web/.web/bun.lockb | Bin 119652 -> 120868 bytes src/web/.web/package.json | 1 + src/web/.web/pages/404.js | 49 +++++++++--------- src/web/.web/pages/index.js | 44 ++++++++-------- .../reflex.install_frontend_packages.cached | 2 +- src/web/.web/reflex.json | 2 +- src/web/.web/utils/context.js | 12 ++--- src/web/Dockerfile.dev | 48 ++--------------- src/web/web/components/navbar.py | 10 ++-- 9 files changed, 65 insertions(+), 103 deletions(-) diff --git a/src/web/.web/bun.lockb b/src/web/.web/bun.lockb index 55f4e028d88ff390bfafa7f0db05860a91f7f682..2a35965c16545996a86f22624f7cddc7faf9207d 100755 GIT binary patch delta 23366 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 delta 22679 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
- +
+ + - - - + + {`About`} - - - - + + {`Projects`} - - - - + + {`Resume`} - - - - + + {`Blog`} - - - - + + {`Shop`} - + + {`Whoops, this page doesn't exist...`} - + + @@ -149,6 +148,8 @@ export default function Component() { + + diff --git a/src/web/.web/pages/index.js b/src/web/.web/pages/index.js index e3fcb1a..11b104b 100644 --- a/src/web/.web/pages/index.js +++ b/src/web/.web/pages/index.js @@ -8,14 +8,15 @@ import { WifiOffIcon as LucideWifiOffIcon } from "lucide-react" import { keyframes } from "@emotion/react" import { Box as RadixThemesBox, Dialog as RadixThemesDialog, Flex as RadixThemesFlex, Heading as RadixThemesHeading, Link as RadixThemesLink, Text as RadixThemesText } from "@radix-ui/themes" import env from "/env.json" +import { motion } from "framer-motion" import NextLink from "next/link" import NextHead from "next/head" -export function Fragment_966c0378eb9d65bdfb5286644be9b831 () { - const [addEvents, connectErrors] = useContext(EventLoopContext); +export function Fragment_e9a05c105aa9215aeba52aeec8fe2e76 () { const state = useContext(StateContexts.state) + const [addEvents, connectErrors] = useContext(EventLoopContext); return ( @@ -33,6 +34,9 @@ export function Fragment_966c0378eb9d65bdfb5286644be9b831 () { ) } + import { useIsPresent } from "framer-motion"; + + export function Fragment_14636cc997c0546c0967a25d8e600f96 () { const [addEvents, connectErrors] = useContext(EventLoopContext); @@ -78,56 +82,48 @@ export default function Component() { <Fragment> <Fragment> <div css={{"position": "fixed", "width": "100vw", "height": "0"}}> - <Fragment_966c0378eb9d65bdfb5286644be9b831/> + <Fragment_e9a05c105aa9215aeba52aeec8fe2e76/> </div> <Fragment_14636cc997c0546c0967a25d8e600f96/> </Fragment> + <RadixThemesBox> + <motion.div animate={{"opacity": 1, "y": 0, "transition": {"duration": 0.5, "ease": "easeInOut"}}} initial={{"opacity": 0, "y": -50}}> <RadixThemesBox> <RadixThemesBox> <RadixThemesFlex css={{"display": "flex", "alignItems": "center", "justifyContent": "center"}} gap={`7`}> <RadixThemesFlex> - <RadixThemesLink asChild={true} css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> - <NextLink href={`http://about.timmypidashev.localhost`} passHref={true}> - <RadixThemesText as={`p`} css={{"color": "#ebdbb2", "fontFamily": "ComicCode", "fontSize": 24}}> + <RadixThemesLink css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> + <RadixThemesText as={`p`} css={{"href": "/about", "fontFamily": "ComicCode", "fontSize": 24, "color": "#ebdbb2"}}> {`About`} </RadixThemesText> -</NextLink> </RadixThemesLink> </RadixThemesFlex> <RadixThemesFlex> - <RadixThemesLink asChild={true} css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> - <NextLink href={`http://projects.timmypidashev.localhost`} passHref={true}> - <RadixThemesText as={`p`} css={{"color": "#ebdbb2", "fontFamily": "ComicCode", "fontSize": 24}}> + <RadixThemesLink css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> + <RadixThemesText as={`p`} css={{"href": "/projects", "fontFamily": "ComicCode", "fontSize": 24, "color": "#ebdbb2"}}> {`Projects`} </RadixThemesText> -</NextLink> </RadixThemesLink> </RadixThemesFlex> <RadixThemesFlex> - <RadixThemesLink asChild={true} css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> - <NextLink href={`http://resume.timmypidashev.localhost`} passHref={true}> - <RadixThemesText as={`p`} css={{"color": "#ebdbb2", "fontFamily": "ComicCode", "fontSize": 24}}> + <RadixThemesLink css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> + <RadixThemesText as={`p`} css={{"href": "/resume", "fontFamily": "ComicCode", "fontSize": 24, "color": "#ebdbb2"}}> {`Resume`} </RadixThemesText> -</NextLink> </RadixThemesLink> </RadixThemesFlex> <RadixThemesFlex> - <RadixThemesLink asChild={true} css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> - <NextLink href={`http://blog.timmypidashev.localhost`} passHref={true}> - <RadixThemesText as={`p`} css={{"color": "#ebdbb2", "fontFamily": "ComicCode", "fontSize": 24}}> + <RadixThemesLink css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> + <RadixThemesText as={`p`} css={{"href": "/blog", "fontFamily": "ComicCode", "fontSize": 24, "color": "#ebdbb2"}}> {`Blog`} </RadixThemesText> -</NextLink> </RadixThemesLink> </RadixThemesFlex> <RadixThemesFlex> - <RadixThemesLink asChild={true} css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> - <NextLink href={`http://shop.timmypidashev.localhost`} passHref={true}> - <RadixThemesText as={`p`} css={{"color": "#ebdbb2", "fontFamily": "ComicCode", "fontSize": 24}}> + <RadixThemesLink css={{"fontFamily": "ComicCode", "fontSize": 24, "color": "#000000", "textDecoration": "none", "&:hover": {"color": "#b8bb26"}}}> + <RadixThemesText as={`p`} css={{"href": "shop", "fontFamily": "ComicCode", "fontSize": 24, "color": "#ebdbb2"}}> {`Shop`} </RadixThemesText> -</NextLink> </RadixThemesLink> </RadixThemesFlex> </RadixThemesFlex> @@ -150,6 +146,8 @@ export default function Component() { </RadixThemesFlex> </RadixThemesFlex> </RadixThemesBox> +</RadixThemesBox> +</motion.div> </RadixThemesBox> <NextHead> <title> diff --git a/src/web/.web/reflex.install_frontend_packages.cached b/src/web/.web/reflex.install_frontend_packages.cached index 702224f..b263eb1 100644 --- a/src/web/.web/reflex.install_frontend_packages.cached +++ b/src/web/.web/reflex.install_frontend_packages.cached @@ -1 +1 @@ -['@radix-ui/themes@^2.0.0', 'lucide-react@0.314.0'],{"app_name": "landing", "loglevel": "info", "frontend_port": 3000, "frontend_path": "", "backend_port": 8000, "api_url": "http://localhost:8000", "deploy_url": "http://localhost:3000", "backend_host": "0.0.0.0", "db_url": "sqlite:///reflex.db", "redis_url": null, "telemetry_enabled": true, "bun_path": "/home/timmy/.local/share/reflex/bun/bin/bun", "cors_allowed_origins": ["*"], "tailwind": {"content": ["./pages/**/*.{js,ts,jsx,tsx}", "./utils/**/*.{js,ts,jsx,tsx}"]}, "timeout": 120, "next_compression": true, "event_namespace": null, "frontend_packages": [], "cp_backend_url": "https://rxcp-prod-control-plane.fly.dev", "cp_web_url": "https://control-plane.reflex.run", "gunicorn_worker_class": "uvicorn.workers.UvicornH11Worker"} \ No newline at end of file +['@radix-ui/themes@^2.0.0', 'framer-motion', 'lucide-react@0.314.0'],{"app_name": "web", "loglevel": "info", "frontend_port": 3000, "frontend_path": "", "backend_port": 8000, "api_url": "http://localhost:8000", "deploy_url": "http://localhost:3000", "backend_host": "0.0.0.0", "db_url": "sqlite:///reflex.db", "redis_url": null, "telemetry_enabled": true, "bun_path": "/home/timmy/.local/share/reflex/bun/bin/bun", "cors_allowed_origins": ["*"], "tailwind": {"content": ["./pages/**/*.{js,ts,jsx,tsx}", "./utils/**/*.{js,ts,jsx,tsx}"]}, "timeout": 120, "next_compression": true, "event_namespace": null, "frontend_packages": [], "cp_backend_url": "https://rxcp-prod-control-plane.fly.dev", "cp_web_url": "https://control-plane.reflex.run", "gunicorn_worker_class": "uvicorn.workers.UvicornH11Worker"} \ No newline at end of file diff --git a/src/web/.web/reflex.json b/src/web/.web/reflex.json index a5cbc9d..64b666f 100644 --- a/src/web/.web/reflex.json +++ b/src/web/.web/reflex.json @@ -1 +1 @@ -{"version": "0.4.3", "project_hash": 133404493286750418693195899744043836434} \ No newline at end of file +{"version": "0.4.3", "project_hash": 133404493286750418693195899744043836434, "last_version_check_datetime": "2024-03-12 00:10:35.074745"} \ No newline at end of file diff --git a/src/web/.web/utils/context.js b/src/web/.web/utils/context.js index f8832e1..333bc3e 100644 --- a/src/web/.web/utils/context.js +++ b/src/web/.web/utils/context.js @@ -1,7 +1,7 @@ import { createContext, useContext, useMemo, useReducer, useState } from "react" import { applyDelta, Event, hydrateClientStorage, useEventLoop, refs } from "/utils/state.js" -export const initialState = {"state": {"is_hydrated": false, "router": {"session": {"client_token": "", "client_ip": "", "session_id": ""}, "headers": {"host": "", "origin": "", "upgrade": "", "connection": "", "pragma": "", "cache_control": "", "user_agent": "", "sec_websocket_version": "", "sec_websocket_key": "", "sec_websocket_extensions": "", "accept_encoding": "", "accept_language": ""}, "page": {"host": "", "path": "", "raw_path": "", "full_path": "", "full_raw_path": "", "params": {}}}}, "state.on_load_internal_state": {}, "state.update_vars_internal_state": {}, "state.state": {}, "state.state.theme_state": {"current_theme": 0, "theme": {"background_color": "#282828"}, "themes": {"0": {"background_color": "#282828"}, "1": {"background_color": "#000000"}}}} +export const initialState = {"state": {"is_hydrated": false, "router": {"session": {"client_token": "", "client_ip": "", "session_id": ""}, "headers": {"host": "", "origin": "", "upgrade": "", "connection": "", "pragma": "", "cache_control": "", "user_agent": "", "sec_websocket_version": "", "sec_websocket_key": "", "sec_websocket_extensions": "", "accept_encoding": "", "accept_language": ""}, "page": {"host": "", "path": "", "raw_path": "", "full_path": "", "full_raw_path": "", "params": {}}}}, "state.on_load_internal_state": {}, "state.state": {}, "state.state.theme_state": {"current_theme": 0, "theme": {"background_color": "#282828"}, "themes": {"0": {"background_color": "#282828"}, "1": {"background_color": "#000000"}}}, "state.update_vars_internal_state": {}} export const defaultColorMode = "light" export const ColorModeContext = createContext(null); @@ -10,9 +10,9 @@ export const DispatchContext = createContext(null); export const StateContexts = { state: createContext(null), state__on_load_internal_state: createContext(null), - state__update_vars_internal_state: createContext(null), state__state: createContext(null), state__state__theme_state: createContext(null), + state__update_vars_internal_state: createContext(null), } export const EventLoopContext = createContext(null); export const clientStorage = {"cookies": {}, "local_storage": {}} @@ -81,31 +81,31 @@ export function EventLoopProvider({ children }) { export function StateProvider({ children }) { const [state, dispatch_state] = useReducer(applyDelta, initialState["state"]) const [state__on_load_internal_state, dispatch_state__on_load_internal_state] = useReducer(applyDelta, initialState["state.on_load_internal_state"]) - const [state__update_vars_internal_state, dispatch_state__update_vars_internal_state] = useReducer(applyDelta, initialState["state.update_vars_internal_state"]) const [state__state, dispatch_state__state] = useReducer(applyDelta, initialState["state.state"]) const [state__state__theme_state, dispatch_state__state__theme_state] = useReducer(applyDelta, initialState["state.state.theme_state"]) + const [state__update_vars_internal_state, dispatch_state__update_vars_internal_state] = useReducer(applyDelta, initialState["state.update_vars_internal_state"]) const dispatchers = useMemo(() => { return { "state": dispatch_state, "state.on_load_internal_state": dispatch_state__on_load_internal_state, - "state.update_vars_internal_state": dispatch_state__update_vars_internal_state, "state.state": dispatch_state__state, "state.state.theme_state": dispatch_state__state__theme_state, + "state.update_vars_internal_state": dispatch_state__update_vars_internal_state, } }, []) return ( <StateContexts.state.Provider value={ state }> <StateContexts.state__on_load_internal_state.Provider value={ state__on_load_internal_state }> - <StateContexts.state__update_vars_internal_state.Provider value={ state__update_vars_internal_state }> <StateContexts.state__state.Provider value={ state__state }> <StateContexts.state__state__theme_state.Provider value={ state__state__theme_state }> + <StateContexts.state__update_vars_internal_state.Provider value={ state__update_vars_internal_state }> <DispatchContext.Provider value={dispatchers}> {children} </DispatchContext.Provider> + </StateContexts.state__update_vars_internal_state.Provider> </StateContexts.state__state__theme_state.Provider> </StateContexts.state__state.Provider> - </StateContexts.state__update_vars_internal_state.Provider> </StateContexts.state__on_load_internal_state.Provider> </StateContexts.state.Provider> ) diff --git a/src/web/Dockerfile.dev b/src/web/Dockerfile.dev index d1cf3a2..3079d9e 100644 --- a/src/web/Dockerfile.dev +++ b/src/web/Dockerfile.dev @@ -1,53 +1,15 @@ -# Stage 1: init -FROM python:3.11 as init +# This Dockerfile is used to deploy a simple single-container Reflex app instance. +FROM python:3.11 # Copy local context to `/app` inside container (see .dockerignore) WORKDIR /app COPY . . -# Create virtualenv which will be copied into the final container -ENV VIRTUAL_ENV=/app/.venv -ENV PATH="$VIRTUAL_ENV/bin:$PATH" -RUN python3.11 -m venv $VIRTUAL_ENV - -# Install app requirements and reflex inside virtualenv +# Install app requirements and reflex in the container RUN pip install -r requirements.txt # Deploy templates and prepare app RUN reflex init -# Export static copy of frontend to /app/.web/_static -RUN echo "Exporting reflex app to shrink the docker image size, not actually a prod build." -RUN reflex export --frontend-only --no-zip - -# Copy static files out of /app to save space in backend image -RUN mv .web/_static /tmp/_static -RUN rm -rf .web && mkdir .web -RUN mv /tmp/_static .web/_static - -# Stage 2: copy artifacts into slim image -FROM python:3.11-slim -WORKDIR /app -RUN adduser --disabled-password --home /app reflex - -# Install Node.js and unzip -RUN apt-get update && apt-get install -y nodejs unzip curl && curl -fsSL https://bun.sh/install | bash - -# Copy only the necessary files from the "init" stage -COPY --chown=reflex --from=init /app/.venv /app/.venv -COPY --chown=reflex --from=init /app/requirements.txt /app/requirements.txt -COPY --chown=reflex --from=init /app /app - -# Change the ownership and permissions of /app/.local -USER root -RUN mkdir -p /app -RUN chown -R reflex /app -USER reflex - -# Activate the virtual environment and install application requirements -ENV PATH="/app/.venv/bin:$PATH" -RUN python3.11 -m venv /app/.venv -RUN /app/.venv/bin/pip install -r /app/requirements.txt - -# The following lines are for the specific command for the application. -CMD reflex init && reflex run --env dev +# Always apply migrations before starting the backend. +CMD reflex run --env dev diff --git a/src/web/web/components/navbar.py b/src/web/web/components/navbar.py index 66b74bf..87be852 100644 --- a/src/web/web/components/navbar.py +++ b/src/web/web/components/navbar.py @@ -6,27 +6,27 @@ def navbar(): rx.center( rx.flex( rx.link( - rx.text("About", color=color["white"]), href="/about" + rx.text("About", href="/about") ) ), rx.flex( rx.link( - rx.text("Projects", color=color["white"]), href="/projects" + rx.text("Projects", href="/projects") ) ), rx.flex( rx.link( - rx.text("Resume", color=color["white"]), href="/resume" + rx.text("Resume", href="/resume") ) ), rx.flex( rx.link( - rx.text("Blog", color=color["white"]), href="/blog" + rx.text("Blog", href="/blog") ) ), rx.flex( rx.link( - rx.text("Shop", color=color["white"]), href="shop" + rx.text("Shop", href="shop") ) ), spacing="7",