Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
3f5babf
feat(about): implement Phase 1 of dynamic component editor architecture
lijiapeng365 Aug 8, 2025
11d1d38
feat(about): implement Phase 2 of dynamic component editor architecture
lijiapeng365 Aug 8, 2025
8eedfbc
feat(about): implement Phase 3 of dynamic component editor integration
lijiapeng365 Aug 8, 2025
1d53713
feat(about): complete Phase 4 of dynamic component editor integration
lijiapeng365 Aug 8, 2025
fd1aada
fix(admin): resolve canvas scrolling issues in content management page
pixelsama Aug 9, 2025
0c3c295
refactor(admin): migrate from react-beautiful-dnd to @dnd-kit
pixelsama Aug 9, 2025
fd2f280
style(admin): unify /admin/content components with stone theme
pixelsama Aug 9, 2025
c12c10a
fix(admin): fix property editing interface with right-click context menu
pixelsama Aug 9, 2025
e92013b
refactor(admin): clean up duplicate Save/Reset buttons and unused code
pixelsama Aug 9, 2025
4b18ede
revert(admin): fix infinite loop by reverting problematic Reset changes
pixelsama Aug 9, 2025
970da55
fix(admin): improve drag and drop functionality with better target de…
pixelsama Aug 10, 2025
73680f9
feat(admin): enhance drag and drop with component cloning and animations
lijiapeng365 Aug 10, 2025
d738719
refactor(admin): simplify drag and drop highlighting with native events
pixelsama Aug 10, 2025
e2fcd5d
refactor(admin): improve drag and drop with section highlighting and …
pixelsama Aug 10, 2025
fd65880
Merge branch 'main' into feat/admin-drag-drop-improvements
lyzno1 Aug 10, 2025
adedd4f
Revert "feat(admin): enhance drag and drop with component cloning and…
lijiapeng365 Aug 11, 2025
42c4230
fix(admin): resolve section delete button and component reordering is…
lijiapeng365 Aug 11, 2025
70d2cc1
feat(admin): enhance drag preview and fix empty section drop function…
lijiapeng365 Aug 11, 2025
67136fc
fix(admin): resolve misleading drag animation on successful component…
lijiapeng365 Aug 11, 2025
ff68141
fix(admin): resolve React hooks error and right-click menu reliability
lijiapeng365 Aug 11, 2025
d76553f
fix(admin): resolve cross-container drag and drop functionality
lijiapeng365 Aug 11, 2025
d5ea971
feat(admin): enhance component editing with keyboard shortcuts and in…
lijiapeng365 Aug 11, 2025
34ab5b2
fix(admin): fix reset button functionality in content management
lijiapeng365 Aug 11, 2025
0e0ea7e
feat(admin): enhance button component with solid and outline variants
lijiapeng365 Aug 11, 2025
555f261
fix(data): update button variant from primary to solid in language files
lijiapeng365 Aug 11, 2025
2965082
feat(admin): unify about page preview with homepage visual style
lijiapeng365 Aug 11, 2025
fcfe1d9
Merge branch 'main' into feat/admin-drag-drop-improvements
lyzno1 Aug 11, 2025
54fab64
feat(admin): implement dual button support for button component
lijiapeng365 Aug 11, 2025
c56d5d7
merge: integrate feat/admin-drag-drop-improvements with local changes
lijiapeng365 Aug 11, 2025
8696aa2
fix(admin): increase button minimum width for visual consistency
lijiapeng365 Aug 11, 2025
2ccad61
feat(admin): unify homepage and about page with dynamic component system
lijiapeng365 Aug 12, 2025
58b421a
fix(admin): center trash icons in delete buttons
lijiapeng365 Aug 12, 2025
fa08dc9
fix(admin): remove empty space in content page layout
lijiapeng365 Aug 12, 2025
07dffdc
refactor(admin): optimize content editor padding for better layout
lijiapeng365 Aug 12, 2025
f987ecc
fix(admin): fix component palette height calculation relative to parent
lijiapeng365 Aug 12, 2025
38e0144
feat(admin): unify drag-and-drop hover effects with mouse hover effects
lijiapeng365 Aug 12, 2025
ab40c7e
fix(admin): increase H1/H2 heading component height to prevent text c…
pixelsama Aug 12, 2025
d2ebfb1
docs: remove development toolchain and integration plan documents
pixelsama Aug 12, 2025
4be5e3c
refactor(renderer): update comments in component renderer to English
pixelsama Aug 12, 2025
5555de3
chore(migration): remove unused migration files
pixelsama Aug 12, 2025
590bcb3
Merge remote-tracking branch 'upstream/main' into feat/dynamic-about-…
pixelsama Aug 12, 2025
6156c82
fix(hooks): fix useDebouncedCallback dependency array to prevent stal…
lijiapeng365 Aug 13, 2025
af7e133
perf: optimize deep copy performance in about-editor-store
lijiapeng365 Aug 13, 2025
490ad78
feat: improve TypeScript type safety in SectionCommonProps interface
lijiapeng365 Aug 13, 2025
4da99c8
chore(cleanup): remove unused backup files and improve TypeScript types
lijiapeng365 Aug 13, 2025
b86111c
Merge remote-tracking branch 'origin/main' into feat/admin-drag-drop-…
lyzno1 Aug 13, 2025
eaeda2c
chore: update pkg
lyzno1 Aug 13, 2025
d4e849a
chore: update i18n messages
lyzno1 Aug 13, 2025
e12b04d
chore: update pkg
lyzno1 Aug 13, 2025
d09b661
feat: add drag and drop improvements to about page
lyzno1 Aug 13, 2025
e6c61c2
need resolve
lyzno1 Aug 13, 2025
e1361d0
chore: resolve formatting conflict in about-preview.tsx
lijiapeng365 Aug 13, 2025
70413f3
fix(eslint): clean up unused imports and add necessary eslint disables
lijiapeng365 Aug 13, 2025
a93ac48
feat(admin): add ESC key support to close context menu
lijiapeng365 Aug 14, 2025
5c97501
feat(admin): merge upstream/main with dark mode styling updates
pixelsama Aug 14, 2025
ca4b087
refactor(admin): remove unused useTheme import and isDark variable
pixelsama Aug 14, 2025
c15a922
fix(admin): restore correct height calculation for content page
pixelsama Aug 14, 2025
8c5a46e
feat(admin): optimize content editor header layout
pixelsama Aug 14, 2025
3431426
feat(admin): improve drag preview experience with simplified componen…
pixelsama Aug 14, 2025
d36b504
feat(admin): add section drag and drop reordering capability
pixelsama Aug 14, 2025
c6f6534
fix(admin): restore content editor scrolling when preview panel is di…
pixelsama Aug 14, 2025
646757d
feat(admin): optimize mobile card layout in content preview
pixelsama Aug 14, 2025
6e00b31
fix(admin): enable dragging existing components to empty areas to cre…
pixelsama Aug 15, 2025
470d77b
fix(home): update dynamic data detection to use sections array directly
pixelsama Aug 15, 2025
dc28f2a
feat(about): align about page styling with admin preview
pixelsama Aug 15, 2025
76a2cad
Merge remote-tracking branch 'upstream/main' into feat/admin-drag-dro…
pixelsama Aug 15, 2025
c5e679c
Merge remote-tracking branch 'upstream/main' into feat/admin-drag-dro…
pixelsama Aug 18, 2025
956a252
Merge remote-tracking branch 'upstream/main' into feat/admin-drag-dro…
pixelsama Aug 19, 2025
343f3da
refactor(admin): replace isDark with Tailwind dark: prefix in content…
pixelsama Aug 19, 2025
4ca1d72
chore: align with upstream main branch - remove test files, backups a…
pixelsama Aug 19, 2025
ab000ec
refactor: complete isDark to Tailwind dark: conversion for remaining …
pixelsama Aug 19, 2025
e04e594
refactor(utils): improve type safety in debounced/throttled callback …
pixelsama Aug 20, 2025
c605da1
refactor(stores): replace magic number with MAX_UNDO_STEPS constant
pixelsama Aug 20, 2025
02e7a67
Merge branch 'main' into feat/admin-drag-drop-improvements
lyzno1 Aug 20, 2025
5877a10
Merge branch 'main' into feat/admin-drag-drop-improvements
pixelsama Aug 21, 2025
7fc65a8
fix(utils): fix useThrottledCallback dependency array inconsistency
pixelsama Aug 21, 2025
7e3e694
Merge branch 'feat/admin-drag-drop-improvements' of github.com:pixels…
pixelsama Aug 21, 2025
343e43d
feat(i18n): implement dynamic year placeholders in footer components
pixelsama Aug 22, 2025
5d4923d
refactor: replace isDark conditional logic with Tailwind dark: prefix…
Copilot Aug 22, 2025
1be7cfc
Merge remote-tracking branch 'upstream/main' into feat/admin-drag-dro…
pixelsama Aug 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
257 changes: 46 additions & 211 deletions app/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
'use client';

import { Button } from '@components/ui/button';
import { DynamicAboutRenderer } from '@components/about/dynamic-about-renderer';
import { AdminButton } from '@components/admin/admin-button';
import { LanguageSwitcher } from '@components/ui/language-switcher';
import { PageLoader } from '@components/ui/page-loader';
import { useDynamicTranslations } from '@lib/hooks/use-dynamic-translations';
import { useTheme } from '@lib/hooks/use-theme';
import { createClient } from '@lib/supabase/client';
import { cn } from '@lib/utils';
import { motion } from 'framer-motion';
import type { AboutTranslationData } from '@lib/types/about-page-components';

import { useEffect, useState } from 'react';

Expand All @@ -15,7 +15,6 @@ import { useRouter } from 'next/navigation';

export default function AboutPage() {
const router = useRouter();
const { isDark } = useTheme();
const staticT = useTranslations('pages.about');
const { t: dynamicT, isLoading } = useDynamicTranslations({
sections: ['pages.about'],
Expand All @@ -33,54 +32,11 @@ export default function AboutPage() {
setMounted(true);
}, []);

// get colors based on theme
const getColors = () => {
if (isDark) {
return {
titleGradient: 'from-stone-300 to-stone-500',
textColor: 'text-gray-300',
headingColor: 'text-gray-100',
paragraphColor: 'text-gray-400',
cardBg: 'bg-stone-700',
cardBorder: 'border-stone-600',
cardShadow: 'shadow-[0_4px_20px_rgba(0,0,0,0.3)]',
cardHeadingColor: 'text-stone-300',
cardTextColor: 'text-gray-400',
buttonClass:
'bg-stone-600 hover:bg-stone-500 text-gray-100 cursor-pointer hover:scale-105',
};
} else {
return {
titleGradient: 'from-stone-700 to-stone-900',
textColor: 'text-stone-700',
headingColor: 'text-stone-800',
paragraphColor: 'text-stone-600',
cardBg: 'bg-stone-100',
cardBorder: 'border-stone-200',
cardShadow: 'shadow-[0_4px_20px_rgba(0,0,0,0.1)]',
cardHeadingColor: 'text-stone-700',
cardTextColor: 'text-stone-600',
buttonClass:
'bg-stone-800 hover:bg-stone-700 text-gray-100 cursor-pointer hover:scale-105',
};
}
// Homepage-style colors using Tailwind classes
const colors = {
bgClass: 'bg-stone-100 dark:bg-stone-900',
};

const colors = mounted
? getColors()
: {
titleGradient: '',
textColor: '',
headingColor: '',
paragraphColor: '',
cardBg: '',
cardBorder: '',
cardShadow: '',
cardHeadingColor: '',
cardTextColor: '',
buttonClass: '',
};

// handle "start exploring" button click
const handleExploreClick = async () => {
try {
Expand Down Expand Up @@ -109,168 +65,47 @@ export default function AboutPage() {
return <PageLoader />;
}

// Extract value cards data from translations (using static raw method for array data)
const valueCards = staticT.raw('values.items') as Array<{
title: string;
description: string;
}>;
// Create translation data object for the dynamic renderer
const translationData: AboutTranslationData = {
// Try to get dynamic sections first
sections: dynamicT('sections', 'pages.about') || undefined,

// Fallback to legacy format for backward compatibility
title: t('title'),
subtitle: t('subtitle'),
mission: {
description: t('mission.description'),
},
values: {
items: staticT.raw('values.items') as Array<{
title: string;
description: string;
}>,
},
buttonText: t('buttonText'),
copyright: {
prefix: t('copyright.prefix'),
linkText: t('copyright.linkText'),
suffix: t('copyright.suffix'),
},
};

return (
<main className="min-h-screen w-full overflow-x-hidden px-4 py-4 sm:px-6 sm:py-6 lg:px-8">
<div className="mx-auto max-w-5xl">
{/* title */}
<motion.section
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6 }}
className="mb-6 text-center sm:mb-8 lg:mb-10"
>
<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className={cn(
'bg-gradient-to-r bg-clip-text py-2 leading-tight font-bold text-transparent',
'mb-4 text-3xl sm:mb-6 sm:text-4xl md:text-5xl',
`${colors.titleGradient}`
)}
>
{t('title')}
</motion.h1>
<motion.p
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
className={cn(
'mx-auto max-w-3xl font-light',
'text-base sm:text-lg lg:text-xl',
colors.textColor
)}
>
{t('subtitle')}
</motion.p>
</motion.section>

{/* mission */}
<motion.section
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.3 }}
className="mb-6 sm:mb-8 lg:mb-10"
>
<h2
className={cn(
'mb-4 font-bold sm:mb-6',
'text-xl sm:text-2xl',
colors.headingColor
)}
>
{t('mission.title')}
</h2>
<p
className={cn(
'text-sm leading-relaxed sm:text-base lg:text-lg',
colors.paragraphColor
)}
>
{t('mission.description')}
</p>
</motion.section>

{/* values */}
<motion.section
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.4 }}
className="mb-6 sm:mb-8 lg:mb-10"
>
<h2
className={cn(
'mb-4 font-bold sm:mb-6',
'text-xl sm:text-2xl',
colors.headingColor
)}
>
{t('values.title')}
</h2>
<div className="grid grid-cols-1 gap-4 sm:gap-6 md:grid-cols-2">
{valueCards.map((value, index) => (
<motion.div
key={index}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.5 + index * 0.1 }}
className={cn(
'rounded-xl border',
'p-4 sm:p-6',
colors.cardBg,
colors.cardShadow,
colors.cardBorder
)}
>
<h3
className={cn(
'mb-2 font-semibold',
'text-base sm:text-lg',
colors.cardHeadingColor
)}
>
{value.title}
</h3>
<p
className={cn(
'text-sm leading-relaxed sm:text-base',
colors.cardTextColor
)}
>
{value.description}
</p>
</motion.div>
))}
</div>
</motion.section>

{/* join us */}
<motion.section
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.6 }}
className="mb-6 text-center sm:mb-8 lg:mb-10"
>
<Button
size="lg"
className={cn(
'h-auto rounded-lg font-medium transition-all duration-200',
'px-6 py-2 text-sm sm:px-8 sm:py-3 sm:text-base',
colors.buttonClass
)}
onClick={handleExploreClick}
>
{t('buttonText')}
</Button>
</motion.section>

{/* bottom info */}
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6, delay: 0.8 }}
className={cn('text-center', 'text-xs sm:text-sm', colors.textColor)}
>
<p>
{t('copyright.prefix', { year: new Date().getFullYear() })}
<a
href="https://github.com/ifLabX/AgentifUI"
target="_blank"
rel="noopener noreferrer"
className="transition-all duration-200 hover:underline hover:opacity-80"
>
{t('copyright.linkText')}
</a>
{t('copyright.suffix')}
</p>
</motion.div>
<div
className={`relative min-h-screen w-full px-4 py-12 sm:px-6 lg:px-8 ${colors.bgClass}`}
>
{/* Top-right toolbar: Admin button (left) + Language switcher (right) */}
<div className="fixed top-4 right-4 z-50 hidden flex-col items-end gap-2 sm:flex sm:flex-row sm:items-center sm:gap-3 lg:top-6 lg:right-6">
<AdminButton />
<LanguageSwitcher variant="floating" />
</div>
</main>

<main className="mx-auto max-w-5xl">
<DynamicAboutRenderer
translationData={translationData}
onButtonClick={handleExploreClick}
/>
</main>
</div>
);
}
Loading