feat(parent,auth,onboarding,files,notifications,adaptive-practice,ai): add module updates

parent:

- Add parent-student-attendance-detail component

auth:

- Add actions, data-access, schema, services, types

onboarding:

- Add parent-children-form and hooks directory

files:

- Add actions, schema, hooks directory

notifications:

- Add schema and schema test

adaptive-practice:

- Add answer-input, answer-result, practice-result-view, practice-starter-with-nav

- Add question-card, question-content, lib and services directories

ai:

- Add context/create-ai-client-service, hooks/use-drag-position, hooks/use-position-persistence
This commit is contained in:
SpecialX
2026-07-03 10:26:12 +08:00
parent f3c223d914
commit e9a5264fe7
84 changed files with 6060 additions and 2530 deletions

View File

@@ -1,24 +1,42 @@
import { GraduationCap } from "lucide-react"
import { DEFAULT_BRAND_CONFIG, type BrandConfig } from "@/modules/settings/brand-config"
interface AuthLayoutProps {
children: React.ReactNode
/** audit-P2-6: 品牌配置(由 Server Component layout 注入,未配置时使用默认值) */
brand?: BrandConfig
}
export function AuthLayout({ children }: AuthLayoutProps) {
/**
* 认证页面布局audit-P2-6: 支持品牌配置注入)
*
* 品牌配置通过 props 注入,来源:
* - `app/(auth)/layout.tsx`Server Component调用 `getBrandConfig()` 获取
* - 未配置时使用 `DEFAULT_BRAND_CONFIG` 默认值
*/
export function AuthLayout({ children, brand = DEFAULT_BRAND_CONFIG }: AuthLayoutProps) {
const { schoolName, logoUrl, testimonialQuote, testimonialAuthor } = brand
return (
<div className="container relative h-screen flex-col items-center justify-center grid lg:max-w-none lg:grid-cols-2 lg:px-0">
<div className="relative hidden h-full flex-col bg-muted p-10 text-white dark:border-r lg:flex">
<div className="absolute inset-0 bg-zinc-900" />
<div className="relative z-20 flex items-center text-lg font-medium">
<GraduationCap className="mr-2 h-6 w-6" />
Next_Edu
{logoUrl ? (
// eslint-disable-next-line @next/next/no-img-element -- brand logo from admin config
<img src={logoUrl} alt={schoolName} className="mr-2 h-6 w-6 object-contain" />
) : (
<GraduationCap className="mr-2 h-6 w-6" />
)}
{schoolName}
</div>
<div className="relative z-20 mt-auto">
<blockquote className="space-y-2">
<p className="text-lg">
&ldquo;This platform has completely transformed how we deliver education to our students. The attention to detail and performance is unmatched.&rdquo;
&ldquo;{testimonialQuote}&rdquo;
</p>
<footer className="text-sm">Sofia Davis</footer>
<footer className="text-sm">{testimonialAuthor}</footer>
</blockquote>
</div>
</div>