From bb3088208d02251413a8b90e5d943abc4f7ef506 Mon Sep 17 00:00:00 2001 From: Innei Date: Sun, 26 Oct 2025 18:37:56 +0800 Subject: [PATCH] feat(server): onboarding init --- apps/ssr/next-env.d.ts | 2 +- be/apps/core/.env | 1 + .../core/src/modules/photo/photo.service.ts | 31 +- be/apps/dashboard/agents.md | 192 +++++++++ .../animate-ui/primitives/radix/switch.tsx | 2 +- .../src/components/common/Footer.tsx | 15 + be/apps/dashboard/src/global.d.ts | 7 +- be/apps/dashboard/src/lib/api-client.ts | 8 + be/apps/dashboard/src/lib/utils.ts | 1 - .../dashboard/src/modules/onboarding/api.ts | 42 ++ .../onboarding/components/LinearBorderBox.tsx | 32 ++ .../components/OnboardingFooter.tsx | 44 +++ .../components/OnboardingHeader.tsx | 25 ++ .../components/OnboardingSidebar.tsx | 94 +++++ .../components/OnboardingWizard.tsx | 147 +++++++ .../components/states/ErrorState.tsx | 22 ++ .../components/states/InitializedState.tsx | 46 +++ .../components/states/LoadingState.tsx | 14 + .../onboarding/components/steps/AdminStep.tsx | 120 ++++++ .../components/steps/ReviewStep.tsx | 128 ++++++ .../components/steps/SettingsStep.tsx | 117 ++++++ .../components/steps/TenantStep.tsx | 101 +++++ .../components/steps/WelcomeStep.tsx | 68 ++++ .../src/modules/onboarding/constants.ts | 171 ++++++++ .../onboarding/hooks/useOnboardingWizard.ts | 364 ++++++++++++++++++ .../dashboard/src/modules/onboarding/types.ts | 24 ++ .../dashboard/src/modules/onboarding/utils.ts | 52 +++ .../dashboard/src/pages/(main)/index.sync.tsx | 4 +- be/apps/dashboard/src/pages/(main)/login.tsx | 101 +++++ .../src/providers/root-providers.tsx | 9 +- .../dashboard/src/providers/setting-sync.tsx | 11 - be/apps/dashboard/src/styles/tailwind.css | 3 +- be/apps/dashboard/src/vite-env.d.ts | 8 + be/apps/dashboard/vite.config.ts | 2 + package.json | 2 + packages/builder/src/builder/builder.ts | 55 ++- packages/builder/src/builder/index.ts | 2 +- packages/builder/src/cli.ts | 10 +- packages/builder/src/index.ts | 2 +- packages/builder/src/photo/README.md | 17 +- packages/builder/src/photo/image-pipeline.ts | 51 +-- .../builder/src/photo/live-photo-handler.ts | 8 +- packages/builder/src/photo/processor.ts | 4 +- packages/builder/src/runAsWorker.ts | 9 +- packages/builder/src/worker/cluster-pool.ts | 3 + packages/ui/package.json | 4 +- packages/ui/src/index.ts | 2 + packages/ui/src/modal/Dialog.tsx | 259 +++++++++++++ packages/ui/src/modal/ModalContainer.tsx | 81 ++++ packages/ui/src/modal/ModalManager.ts | 48 +++ packages/ui/src/modal/index.ts | 3 + packages/ui/src/modal/store.ts | 3 + packages/ui/src/modal/types.ts | 27 ++ plugins/vite/ast.ts | 37 ++ pnpm-lock.yaml | 60 +-- 55 files changed, 2552 insertions(+), 143 deletions(-) create mode 120000 be/apps/core/.env create mode 100644 be/apps/dashboard/src/components/common/Footer.tsx create mode 100644 be/apps/dashboard/src/lib/api-client.ts delete mode 100644 be/apps/dashboard/src/lib/utils.ts create mode 100644 be/apps/dashboard/src/modules/onboarding/api.ts create mode 100644 be/apps/dashboard/src/modules/onboarding/components/LinearBorderBox.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/OnboardingFooter.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/OnboardingHeader.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/OnboardingSidebar.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/OnboardingWizard.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/states/ErrorState.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/states/InitializedState.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/states/LoadingState.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/steps/AdminStep.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/steps/ReviewStep.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/steps/SettingsStep.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/steps/TenantStep.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/components/steps/WelcomeStep.tsx create mode 100644 be/apps/dashboard/src/modules/onboarding/constants.ts create mode 100644 be/apps/dashboard/src/modules/onboarding/hooks/useOnboardingWizard.ts create mode 100644 be/apps/dashboard/src/modules/onboarding/types.ts create mode 100644 be/apps/dashboard/src/modules/onboarding/utils.ts create mode 100644 be/apps/dashboard/src/pages/(main)/login.tsx delete mode 100644 be/apps/dashboard/src/providers/setting-sync.tsx create mode 100644 packages/ui/src/modal/Dialog.tsx create mode 100644 packages/ui/src/modal/ModalContainer.tsx create mode 100644 packages/ui/src/modal/ModalManager.ts create mode 100644 packages/ui/src/modal/index.ts create mode 100644 packages/ui/src/modal/store.ts create mode 100644 packages/ui/src/modal/types.ts create mode 100644 plugins/vite/ast.ts diff --git a/apps/ssr/next-env.d.ts b/apps/ssr/next-env.d.ts index c4e7c0eb..c4b7818f 100644 --- a/apps/ssr/next-env.d.ts +++ b/apps/ssr/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import './.next/types/routes.d.ts' +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/be/apps/core/.env b/be/apps/core/.env new file mode 120000 index 00000000..c7360fb8 --- /dev/null +++ b/be/apps/core/.env @@ -0,0 +1 @@ +../../.env \ No newline at end of file diff --git a/be/apps/core/src/modules/photo/photo.service.ts b/be/apps/core/src/modules/photo/photo.service.ts index fbf7c91b..c287838f 100644 --- a/be/apps/core/src/modules/photo/photo.service.ts +++ b/be/apps/core/src/modules/photo/photo.service.ts @@ -22,21 +22,12 @@ export type ProcessPhotoOptions = { livePhotoMap?: Map processorOptions?: Partial builder?: AfilmoryBuilder + builderConfig?: BuilderConfig } @injectable() export class PhotoBuilderService { - private readonly defaultBuilder: AfilmoryBuilder - - constructor() { - this.defaultBuilder = new AfilmoryBuilder() - } - - getDefaultBuilder(): AfilmoryBuilder { - return this.defaultBuilder - } - - createBuilder(config?: Partial): AfilmoryBuilder { + createBuilder(config: BuilderConfig): AfilmoryBuilder { return new AfilmoryBuilder(config) } @@ -56,8 +47,8 @@ export class PhotoBuilderService { object: StorageObject, options?: ProcessPhotoOptions, ): Promise>> { - const { existingItem, livePhotoMap, processorOptions, builder } = options ?? {} - const activeBuilder = builder ?? this.defaultBuilder + const { existingItem, livePhotoMap, processorOptions, builder, builderConfig } = options ?? {} + const activeBuilder = this.resolveBuilder(builder, builderConfig) const mergedOptions: PhotoProcessorOptions = { ...DEFAULT_PROCESSOR_OPTIONS, @@ -75,6 +66,20 @@ export class PhotoBuilderService { return await processPhotoWithPipeline(context, activeBuilder) } + private resolveBuilder(builder?: AfilmoryBuilder, builderConfig?: BuilderConfig): AfilmoryBuilder { + if (builder) { + return builder + } + + if (builderConfig) { + return this.createBuilder(builderConfig) + } + + throw new Error( + 'PhotoBuilderService requires a builder instance or configuration. Pass builder or builderConfig in ProcessPhotoOptions.', + ) + } + private toLegacyObject(object: StorageObject): _Object { return { Key: object.key, diff --git a/be/apps/dashboard/agents.md b/be/apps/dashboard/agents.md index c0c67236..621711c3 100644 --- a/be/apps/dashboard/agents.md +++ b/be/apps/dashboard/agents.md @@ -169,6 +169,193 @@ export const Component = () => { } ``` +UI Design Guidelines: + +This dashboard follows a **linear design language** with clean lines and subtle gradients. The design emphasizes simplicity and clarity without rounded corners or heavy visual effects. + +Core Design Principles: + +- **No rounded corners**: All elements use sharp, clean edges +- **Linear gradient borders**: Use subtle gradient borders for visual separation +- **Minimal backgrounds**: Use solid colors (`bg-background`, `bg-background-tertiary`) +- **Clean typography**: Clear hierarchy with appropriate font sizes +- **Subtle interactions**: Focus rings and hover states with minimal animation + +Form Elements (Inputs, Textareas, Selects): + +- **Shape**: **NO** `rounded-xl` - use straight edges +- **Background**: Use `bg-background` for standard inputs +- **Border**: Use `border border-fill-tertiary` for default state +- **Padding**: Standard padding is `px-3 py-2` for inputs +- **Text Size**: Use `text-sm` for consistency +- **Text Colors**: + - Input text: `text-text` + - Placeholder: `placeholder:text-text-tertiary/70` + - Labels: `text-text` with `font-medium` +- **Focus State**: + - Remove default outline: `focus:outline-none` + - Add focus ring: `focus:ring-2 focus:ring-accent/40` +- **Error State**: + - Border: `border-red/60` + - Focus ring: `focus:ring-red/30` + - Error message: `text-xs text-red` with `mt-1` spacing +- **Transitions**: Use `transition-all duration-200` for smooth interactions + +Example (text input): + +```tsx +
+ + + {error &&

{error}

} +
+``` + +Example (textarea): + +```tsx +