From 3a9e94d1428f04dd08205ae9f760b7732a83498e Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Sat, 28 Feb 2026 00:43:10 -0600 Subject: [PATCH 1/6] Update .env.example and build.yml to include NEXT_PUBLIC_APP_NAME; remove logo_black.png image file --- .env.example | 1 + .github/workflows/build.yml | 1 + public/images/logo_black.png | Bin 35703 -> 0 bytes 3 files changed, 2 insertions(+) delete mode 100644 public/images/logo_black.png diff --git a/.env.example b/.env.example index 8951384..21b08da 100644 --- a/.env.example +++ b/.env.example @@ -9,6 +9,7 @@ # ============================================================================= NODE_ENV=development ENVIRONMENT=dev +NEXT_PUBLIC_APP_NAME=roboledger # ============================================================================= # FRONTEND APPLICATION URLS diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69fa855..eb5a01d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -176,6 +176,7 @@ jobs: - name: Install dependencies and build Next.js if: steps.resolve.outputs.needs_build == 'true' env: + NEXT_PUBLIC_APP_NAME: roboledger NEXT_PUBLIC_ROBOSYSTEMS_API_URL: ${{ inputs.robosystems_api_url }} NEXT_PUBLIC_ROBOLEDGER_APP_URL: ${{ inputs.roboledger_app_url }} NEXT_PUBLIC_ROBOINVESTOR_APP_URL: ${{ inputs.roboinvestor_app_url }} diff --git a/public/images/logo_black.png b/public/images/logo_black.png deleted file mode 100644 index f62c478bf28d7c90dbe2b01cb61bff367e76669f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35703 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 kx%>z|#{bJdEaMR-fr)In Date: Sat, 28 Feb 2026 00:48:03 -0600 Subject: [PATCH 2/6] Squashed 'src/lib/core/' changes from 5228562..990b8fa 990b8fa Update environment configuration, replace logo references, and enhance UI components. Added NEXT_PUBLIC_APP_NAME to .env.example and build workflow. Changed JSX setting in tsconfig.json. Removed old logo images and integrated AnimatedLogo component across various UI components, including Navbar and authentication forms. Updated layout metadata and adjusted app name handling for consistency. git-subtree-dir: src/lib/core git-subtree-split: 990b8fa7d4270d7fd261818255dc3735411dfb13 --- auth-components/AppSwitcher.tsx | 16 +- auth-components/SignInForm.tsx | 26 +- auth-components/SignUpForm.tsx | 12 +- auth-components/__tests__/SignInForm.test.tsx | 14 +- auth-components/__tests__/SignUpForm.test.tsx | 7 + auth-core/config.ts | 5 +- auth-core/types.ts | 2 + index.ts | 5 +- ui-components/Logo.tsx | 274 ++++++++++++++++++ ui-components/Spinner.tsx | 16 +- ui-components/index.ts | 1 + ui-components/layout/CoreNavbar.tsx | 19 +- 12 files changed, 338 insertions(+), 59 deletions(-) create mode 100644 ui-components/Logo.tsx diff --git a/auth-components/AppSwitcher.tsx b/auth-components/AppSwitcher.tsx index 8d46739..e398694 100644 --- a/auth-components/AppSwitcher.tsx +++ b/auth-components/AppSwitcher.tsx @@ -2,11 +2,11 @@ import { Dropdown, DropdownItem } from 'flowbite-react' import { HiViewGrid } from 'react-icons/hi' -import { getAppConfig } from '../auth-core/config' import { useSSO } from '../auth-core/sso' -import type { AppConfig } from '../auth-core/types' +import type { AppConfig, AppName } from '../auth-core/types' import { useToast } from '../hooks/use-toast' import { customTheme } from '../theme' +import { AnimatedLogo } from '../ui-components/Logo' export interface AppSwitcherProps { apiUrl: string @@ -68,13 +68,11 @@ export function AppSwitcher({ onClick={() => handleAppClick(app)} className="flex w-full items-center space-x-3 p-3" > -
- - {getAppConfig(app.name).initials} - -
+

{app.displayName} diff --git a/auth-components/SignInForm.tsx b/auth-components/SignInForm.tsx index a653105..a30f6aa 100644 --- a/auth-components/SignInForm.tsx +++ b/auth-components/SignInForm.tsx @@ -1,12 +1,11 @@ 'use client' -import Image from 'next/image' import React, { useEffect, useMemo, useState } from 'react' import { RoboSystemsAuthClient } from '../auth-core/client' import { getAppConfig } from '../auth-core/config' import { useSSO } from '../auth-core/sso' import type { AuthUser } from '../auth-core/types' -import { Spinner } from '../ui-components' +import { AnimatedLogo, Spinner } from '../ui-components' export interface SignInFormProps { onSuccess?: (user: AuthUser) => void @@ -139,19 +138,13 @@ export function SignInForm({

- Logo

{appName}

-
- -
@@ -162,17 +155,14 @@ export function SignInForm({
- Logo

{appName}

-

+

Sign in to your account

diff --git a/auth-components/SignUpForm.tsx b/auth-components/SignUpForm.tsx index 8b894b4..8df07d4 100644 --- a/auth-components/SignUpForm.tsx +++ b/auth-components/SignUpForm.tsx @@ -1,11 +1,10 @@ 'use client' -import Image from 'next/image' import React, { useState } from 'react' import { RoboSystemsAuthClient } from '../auth-core/client' import { getAppConfig } from '../auth-core/config' import type { AuthUser } from '../auth-core/types' -import { Spinner } from '../ui-components' +import { AnimatedLogo, Spinner } from '../ui-components' import { TurnstileWidget } from './TurnstileWidget' export interface SignUpFormProps { @@ -146,12 +145,9 @@ export function SignUpForm({
- Logo

{appName} diff --git a/auth-components/__tests__/SignInForm.test.tsx b/auth-components/__tests__/SignInForm.test.tsx index 7914576..f251ebf 100644 --- a/auth-components/__tests__/SignInForm.test.tsx +++ b/auth-components/__tests__/SignInForm.test.tsx @@ -41,6 +41,13 @@ vi.mock('../../ui-components', () => ({ Loading {size} {fullScreen && '(fullscreen)'}

), + AnimatedLogo: ({ animate, className }: any) => ( +
+ ), })) const mockUseRouter = vi.mocked(useRouter) @@ -106,10 +113,9 @@ describe('SignInForm', () => { it('should show SSO checking state initially when SSO is enabled', () => { render() - const spinner = screen.getByTestId('spinner') - expect(spinner).toBeInTheDocument() - expect(spinner).toHaveTextContent(/loading/i) - expect(spinner).toHaveTextContent(/xl/i) + const logo = screen.getByTestId('animated-logo') + expect(logo).toBeInTheDocument() + expect(logo).toHaveAttribute('data-animate', 'loop') }) it('should not check SSO when disabled', async () => { diff --git a/auth-components/__tests__/SignUpForm.test.tsx b/auth-components/__tests__/SignUpForm.test.tsx index 8b06f2d..140f5cd 100644 --- a/auth-components/__tests__/SignUpForm.test.tsx +++ b/auth-components/__tests__/SignUpForm.test.tsx @@ -33,6 +33,13 @@ vi.mock('../../ui-components', () => ({ Loading {size} {fullScreen && '(fullscreen)'}
), + AnimatedLogo: ({ animate, className }: any) => ( +
+ ), })) const mockUseRouter = vi.mocked(useRouter) diff --git a/auth-core/config.ts b/auth-core/config.ts index c854fd2..c5a8360 100644 --- a/auth-core/config.ts +++ b/auth-core/config.ts @@ -1,4 +1,7 @@ -import type { AppConfig } from './types' +import type { AppConfig, AppName } from './types' + +export const CURRENT_APP: AppName = + (process.env.NEXT_PUBLIC_APP_NAME as AppName) || 'robosystems' export const APP_CONFIGS: Record = { roboinvestor: { diff --git a/auth-core/types.ts b/auth-core/types.ts index 4e721e0..95ad919 100644 --- a/auth-core/types.ts +++ b/auth-core/types.ts @@ -51,6 +51,8 @@ export interface SSOTokenResponse { apps: string[] } +export type AppName = 'robosystems' | 'roboledger' | 'roboinvestor' + export interface AppConfig { name: string displayName: string diff --git a/index.ts b/index.ts index 54cb582..a56121d 100644 --- a/index.ts +++ b/index.ts @@ -299,4 +299,7 @@ if (process.env.NODE_ENV !== 'test') { export { client } // For backward compatibility, also export the main auth types directly -export type { APIKey, AuthContextType, AuthUser } from './auth-core' +export type { APIKey, AppName, AuthContextType, AuthUser } from './auth-core' + +// App identity +export { CURRENT_APP } from './auth-core/config' diff --git a/ui-components/Logo.tsx b/ui-components/Logo.tsx new file mode 100644 index 0000000..f0b64c6 --- /dev/null +++ b/ui-components/Logo.tsx @@ -0,0 +1,274 @@ +import { CURRENT_APP } from '../auth-core/config' +import type { AppName } from '../auth-core/types' + +export interface AnimatedLogoProps { + className?: string + animate?: 'once' | 'loop' + app?: AppName +} + +/* Graph nodes (shared across all three logos) */ +function GraphNodes() { + return ( + + + + + + + + + + + + + + + + + + + + + ) +} + +/* Shared book structure elements */ +function BookBase() { + return ( + <> + {/* Book left page top */} + + + + {/* Book left side */} + + + + {/* Book right side */} + + + + {/* Book left page */} + + + + {/* Book right page */} + + + + {/* Book top connector */} + + + + + ) +} + +/* RoboInvestor: bar chart animation */ +function InvestorBook({ animate }: { animate: 'once' | 'loop' }) { + const isOnce = animate === 'once' + const animName = isOnce ? 'barIntro' : 'barWave' + const iteration = isOnce ? '1' : 'infinite' + const fillMode = isOnce ? 'forwards' : 'none' + + return ( + <> + + + + {/* Bar 1 (short) */} + + + + + + {/* Bar 2 (medium) */} + + + + + + {/* Bar 3 (tall) */} + + + + + + {/* Spine center */} + + + + + + ) +} + +/* RoboLedger: T-account eyes wink */ +function LedgerBook({ animate }: { animate: 'once' | 'loop' }) { + const isOnce = animate === 'once' + const iteration = isOnce ? '1' : 'infinite' + const fillMode = isOnce ? 'forwards' : 'none' + + return ( + <> + + + + {/* Vertical divider */} + + + + {/* Left eye (T-account line) */} + + + + + + {/* Right eye (T-account line) */} + + + + + + + + ) +} + +/* RoboSystems: infinity S with segment tracing the figure-8 */ +function SystemsBook({ animate }: { animate: 'once' | 'loop' }) { + const isOnce = animate === 'once' + const motionPath = + 'M 16,16 C 22,8 32,10 30,16 C 28,22 22,24 16,16 C 10,8 0,10 2,16 C 4,22 10,24 16,16' + const infinityPath = + 'M0,16C0,17.664 0.405,19.2 1.216,20.608C2.027,22.016 3.136,23.125 4.544,23.936C5.952,24.747 7.488,25.152 9.152,25.152C10.155,25.152 11.179,24.96 12.224,24.576C11.243,23.36 10.485,22.005 9.952,20.512C9.589,20.555 9.323,20.576 9.152,20.576C7.893,20.576 6.816,20.128 5.92,19.232C5.024,18.336 4.576,17.259 4.576,16C4.576,14.741 5.024,13.664 5.92,12.768C6.816,11.872 7.893,11.424 9.152,11.424C10.411,11.424 11.488,11.872 12.384,12.768C13.28,13.664 13.728,14.741 13.728,16C13.728,17.664 14.133,19.2 14.944,20.608C15.755,22.016 16.864,23.125 18.272,23.936C19.68,24.747 21.205,25.152 22.848,25.152C24.491,25.152 26.027,24.747 27.456,23.936C28.885,23.125 29.995,22.016 30.784,20.608C31.573,19.2 31.979,17.664 32,16C32.021,14.336 31.616,12.811 30.784,11.424C29.952,10.037 28.843,8.928 27.456,8.096C26.069,7.264 24.533,6.859 22.848,6.88C21.845,6.88 20.821,7.061 19.776,7.424C20.757,8.64 21.515,10.005 22.048,11.52C22.411,11.456 22.677,11.424 22.848,11.424C24.107,11.424 25.184,11.872 26.08,12.768C26.976,13.664 27.424,14.741 27.424,16C27.424,17.28 26.976,18.368 26.08,19.264C25.184,20.16 24.107,20.597 22.848,20.576C21.589,20.576 20.512,20.139 19.616,19.264C18.72,18.389 18.272,17.301 18.272,16C18.272,14.357 17.867,12.832 17.056,11.424C16.245,10.016 15.136,8.907 13.728,8.096C12.32,7.285 10.795,6.88 9.152,6.88C7.509,6.88 5.973,7.285 4.544,8.096C3.115,8.907 2.005,10.016 1.216,11.424C0.427,12.832 0.021,14.357 -0,16Z' + + return ( + <> + + + {/* Spine center */} + + + + + {/* Infinity S — visible segment traces the figure-8 */} + + {/* Base — starts solid, fades to faint once trace begins */} + + {isOnce ? ( + + ) : ( + + )} + + {/* Bright segment revealed by mask */} + + + + + + + + + + + + ) +} + +export function AnimatedLogo({ + className, + animate = 'loop', + app = CURRENT_APP, +}: AnimatedLogoProps) { + return ( + + {app === 'roboinvestor' && } + {app === 'roboledger' && } + {app === 'robosystems' && } + + + ) +} diff --git a/ui-components/Spinner.tsx b/ui-components/Spinner.tsx index bed9f8c..accd7d3 100644 --- a/ui-components/Spinner.tsx +++ b/ui-components/Spinner.tsx @@ -1,12 +1,17 @@ +import { CURRENT_APP } from '../auth-core/config' +import type { AppName } from '../auth-core/types' +import { AnimatedLogo } from './Logo' + interface SpinnerProps { size?: 'sm' | 'md' | 'lg' | 'xl' className?: string fullScreen?: boolean + app?: AppName } const sizeClasses = { - sm: 'h-4 w-4', - md: 'h-8 w-8', + sm: 'h-6 w-6', + md: 'h-10 w-10', lg: 'h-16 w-16', xl: 'h-32 w-32', } @@ -15,10 +20,13 @@ export function Spinner({ size = 'md', className = '', fullScreen = false, + app = CURRENT_APP, }: SpinnerProps) { const spinner = ( -
) diff --git a/ui-components/index.ts b/ui-components/index.ts index 8d2938d..ba7629a 100644 --- a/ui-components/index.ts +++ b/ui-components/index.ts @@ -5,6 +5,7 @@ export * from './layout' export * from './settings' // UI Components +export { AnimatedLogo } from './Logo' export { Spinner } from './Spinner' // Chat Components diff --git a/ui-components/layout/CoreNavbar.tsx b/ui-components/layout/CoreNavbar.tsx index 54865f5..91cf67b 100644 --- a/ui-components/layout/CoreNavbar.tsx +++ b/ui-components/layout/CoreNavbar.tsx @@ -10,7 +10,6 @@ import { NavbarBrand, Tooltip, } from 'flowbite-react' -import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/navigation' import React from 'react' @@ -21,6 +20,7 @@ import { useSidebarContext } from '../../contexts' import { useMediaQuery, useUser } from '../../hooks' import { customTheme } from '../../theme' import type { User } from '../../types' +import { AnimatedLogo } from '../Logo' import { ThemeToggle } from './ThemeToggle' export interface CoreNavbarProps { @@ -136,19 +136,10 @@ export function CoreNavbar({
- {altText} - {altText} {appName} From 29c830d22da50da39d981d0d68c541410ab9f724 Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Sat, 28 Feb 2026 00:51:19 -0600 Subject: [PATCH 3/6] Update logo references and integrate CURRENT_APP constant across layout and authentication components --- src/app/(app)/layout-wrapper.tsx | 3 ++- src/app/(landing)/login/content.tsx | 4 ++-- src/app/(landing)/maintenance.tsx | 10 ++++------ src/app/(landing)/register/content.tsx | 4 ++-- src/app/layout.tsx | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/app/(app)/layout-wrapper.tsx b/src/app/(app)/layout-wrapper.tsx index b59e9f0..c67d008 100644 --- a/src/app/(app)/layout-wrapper.tsx +++ b/src/app/(app)/layout-wrapper.tsx @@ -5,6 +5,7 @@ import { ErrorBoundary } from '@/components/error/ErrorBoundary' import { CoreNavbar, CoreSidebar, + CURRENT_APP, GraphFilters, useGraphContext, useToast, @@ -32,7 +33,7 @@ export function LayoutWrapper({ children }: LayoutWrapperProps) { <> diff --git a/src/app/(landing)/login/content.tsx b/src/app/(landing)/login/content.tsx index ac03676..aca3832 100644 --- a/src/app/(landing)/login/content.tsx +++ b/src/app/(landing)/login/content.tsx @@ -1,6 +1,6 @@ 'use client' -import { SignInForm } from '@/lib/core' +import { CURRENT_APP, SignInForm } from '@/lib/core' export default function LoginContent() { return ( @@ -9,7 +9,7 @@ export default function LoginContent() { process.env.NEXT_PUBLIC_ROBOSYSTEMS_API_URL || 'http://localhost:8000' } enableSSO={true} - currentApp="roboledger" + currentApp={CURRENT_APP} redirectTo="/home" onSuccess={() => {}} onRedirect={(url) => { diff --git a/src/app/(landing)/maintenance.tsx b/src/app/(landing)/maintenance.tsx index b406523..166ed8b 100644 --- a/src/app/(landing)/maintenance.tsx +++ b/src/app/(landing)/maintenance.tsx @@ -1,16 +1,14 @@ 'use client' -import Image from 'next/image' +import { AnimatedLogo } from '@/lib/core/ui-components/Logo' export default function MaintenancePage() { return (
- RoboLedger Logo

RoboLedger diff --git a/src/app/(landing)/register/content.tsx b/src/app/(landing)/register/content.tsx index e5fd130..3465c7a 100644 --- a/src/app/(landing)/register/content.tsx +++ b/src/app/(landing)/register/content.tsx @@ -1,6 +1,6 @@ 'use client' -import { SignUpForm } from '@/lib/core' +import { CURRENT_APP, SignUpForm } from '@/lib/core' export default function RegisterContent() { return ( @@ -8,7 +8,7 @@ export default function RegisterContent() { apiUrl={ process.env.NEXT_PUBLIC_ROBOSYSTEMS_API_URL || 'http://localhost:8000' } - currentApp="roboledger" + currentApp={CURRENT_APP} showConfirmPassword={true} showTermsAcceptance={true} redirectTo="/login" diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e5909ff..a24f017 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -15,7 +15,7 @@ export const metadata: Metadata = { description: 'A comprehensive financial reporting app for private companies to securely share financial reports with shareholders and stakeholders. Built with React, Tailwind CSS, and Flowbite, it provides features such as customizable reports, user permissions, and real-time collaboration.', icons: { - icon: '/images/logo.png', + icon: '/images/logos/roboledger.png', }, } From c04a2ccc104dadec098452254619592adc04a7db Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Sat, 28 Feb 2026 00:51:35 -0600 Subject: [PATCH 4/6] Remove logo.png from the public images directory as part of the ongoing logo updates and UI enhancements. --- public/images/logo.png | Bin 39705 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/logo.png diff --git a/public/images/logo.png b/public/images/logo.png deleted file mode 100644 index 04dd24ce494a5ad889ab5bf3ffa360912b31da56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39705 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 From ea41f66a4f6fa3e27cdebb1506b5ba565c24781c Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Sat, 28 Feb 2026 00:59:05 -0600 Subject: [PATCH 5/6] Replace static logo image with AnimatedLogo component in Header for improved UI consistency and animation integration. --- src/components/landing/Header.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/landing/Header.tsx b/src/components/landing/Header.tsx index 2a5d2a5..2c3b556 100644 --- a/src/components/landing/Header.tsx +++ b/src/components/landing/Header.tsx @@ -1,6 +1,6 @@ 'use client' -import Image from 'next/image' +import { AnimatedLogo } from '@/lib/core/ui-components/Logo' import Link from 'next/link' import { useEffect, useState } from 'react' @@ -48,13 +48,7 @@ export default function Header() { href="/" className="flex items-center transition-opacity hover:opacity-80" > - RoboLedger Logo + RoboLedger From a1969c234b8caaf1e848b21d7299b5cadb65a05e Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Sat, 28 Feb 2026 01:25:24 -0600 Subject: [PATCH 6/6] Update Footer component to use environment variables for external links, enhancing flexibility and configuration management. --- src/components/landing/Footer.tsx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/components/landing/Footer.tsx b/src/components/landing/Footer.tsx index 646511e..02b3706 100644 --- a/src/components/landing/Footer.tsx +++ b/src/components/landing/Footer.tsx @@ -115,7 +115,10 @@ export default function Footer() {
  • RoboLedger @@ -133,7 +139,10 @@ export default function Footer() {