aidol 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -0
- package/dist/aidol-D1U55wfr.mjs +37 -0
- package/dist/aidol-D1U55wfr.mjs.map +1 -0
- package/dist/aidol-gZjlTwTe.js +2 -0
- package/dist/aidol-gZjlTwTe.js.map +1 -0
- package/dist/client.cjs +2 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.ts +26 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +817 -0
- package/dist/client.js.map +1 -0
- package/dist/components/ShareButton.d.ts +11 -0
- package/dist/components/ShareButton.d.ts.map +1 -0
- package/dist/components/aidol/CompanionGrid.d.ts +11 -0
- package/dist/components/aidol/CompanionGrid.d.ts.map +1 -0
- package/dist/components/aidol/GroupHeader.d.ts +11 -0
- package/dist/components/aidol/GroupHeader.d.ts.map +1 -0
- package/dist/components/aidol/index.d.ts +3 -0
- package/dist/components/aidol/index.d.ts.map +1 -0
- package/dist/components/companion/AddMemberButton.d.ts +10 -0
- package/dist/components/companion/AddMemberButton.d.ts.map +1 -0
- package/dist/components/companion/Card.d.ts +11 -0
- package/dist/components/companion/Card.d.ts.map +1 -0
- package/dist/components/companion/ImagePreview.d.ts +12 -0
- package/dist/components/companion/ImagePreview.d.ts.map +1 -0
- package/dist/components/companion/PromptInput.d.ts +12 -0
- package/dist/components/companion/PromptInput.d.ts.map +1 -0
- package/dist/components/companion/index.d.ts +5 -0
- package/dist/components/companion/index.d.ts.map +1 -0
- package/dist/components/creation/ConceptSelector.d.ts +16 -0
- package/dist/components/creation/ConceptSelector.d.ts.map +1 -0
- package/dist/components/creation/EmblemGenerator.d.ts +13 -0
- package/dist/components/creation/EmblemGenerator.d.ts.map +1 -0
- package/dist/components/creation/GroupCreation.d.ts +16 -0
- package/dist/components/creation/GroupCreation.d.ts.map +1 -0
- package/dist/components/creation/GroupNameInput.d.ts +12 -0
- package/dist/components/creation/GroupNameInput.d.ts.map +1 -0
- package/dist/components/creation/MemberNameInput.d.ts +12 -0
- package/dist/components/creation/MemberNameInput.d.ts.map +1 -0
- package/dist/components/creation/PersonalitySelector.d.ts +16 -0
- package/dist/components/creation/PersonalitySelector.d.ts.map +1 -0
- package/dist/components/creation/StepIndicator.d.ts +12 -0
- package/dist/components/creation/StepIndicator.d.ts.map +1 -0
- package/dist/components/creation/index.d.ts +8 -0
- package/dist/components/creation/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/landing/DemoSection.d.ts +5 -0
- package/dist/components/landing/DemoSection.d.ts.map +1 -0
- package/dist/components/landing/HeroSection.d.ts +9 -0
- package/dist/components/landing/HeroSection.d.ts.map +1 -0
- package/dist/components/landing/index.d.ts +3 -0
- package/dist/components/landing/index.d.ts.map +1 -0
- package/dist/i18n/translations.d.ts +689 -0
- package/dist/i18n/translations.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/repositories/AIdolRepository.d.ts +35 -0
- package/dist/repositories/AIdolRepository.d.ts.map +1 -0
- package/dist/repositories/CompanionRepository.d.ts +34 -0
- package/dist/repositories/CompanionRepository.d.ts.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/package.json +123 -0
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# AIdol Frontend
|
|
2
|
+
|
|
3
|
+
AI 아이돌 그룹 생성 및 채팅 React 컴포넌트
|
|
4
|
+
|
|
5
|
+
## 주요 컴포넌트
|
|
6
|
+
|
|
7
|
+
### 생성
|
|
8
|
+
|
|
9
|
+
- **GroupCreation**: 멀티스텝 그룹 생성 폼
|
|
10
|
+
- **EmblemGenerator**: DALL-E 3 이미지 생성
|
|
11
|
+
|
|
12
|
+
### 랜딩
|
|
13
|
+
|
|
14
|
+
- **HeroSection**: 메인 히어로 섹션
|
|
15
|
+
- **DemoSection**: 데모 섹션
|
|
16
|
+
|
|
17
|
+
### 프로필
|
|
18
|
+
|
|
19
|
+
- **GroupHeader**: 그룹 프로필 헤더
|
|
20
|
+
- **CompanionGrid**: 멤버 카드 그리드
|
|
21
|
+
|
|
22
|
+
### Repository
|
|
23
|
+
|
|
24
|
+
- **AIdolRepository**: AIdol API 클라이언트
|
|
25
|
+
- **CompanionRepository**: Companion API 클라이언트
|
|
26
|
+
|
|
27
|
+
## 설치
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install aidol @aioia/core
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 사용법
|
|
34
|
+
|
|
35
|
+
### 컴포넌트
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { GroupCreation, HeroSection } from "aidol/client";
|
|
39
|
+
|
|
40
|
+
<HeroSection onStartClick={() => router.push("/create")} />
|
|
41
|
+
<GroupCreation onSubmit={handleCreate} />
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Repository
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
import { AIdolRepository, CompanionRepository } from "aidol";
|
|
48
|
+
|
|
49
|
+
const aidolRepo = new AIdolRepository(apiService);
|
|
50
|
+
const companionRepo = new CompanionRepository(apiService);
|
|
51
|
+
|
|
52
|
+
// 그룹 생성
|
|
53
|
+
const aidol = await aidolRepo.create({ name: "My Group", concept: "cute" });
|
|
54
|
+
|
|
55
|
+
// 이미지 생성
|
|
56
|
+
const image = await aidolRepo.generateImage({ prompt: "K-pop idol emblem" });
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### i18n 통합
|
|
60
|
+
|
|
61
|
+
[통합 가이드](../docs/integration-guide.md#i18n-통합) 참조
|
|
62
|
+
|
|
63
|
+
## Peer Dependencies
|
|
64
|
+
|
|
65
|
+
- React 18+
|
|
66
|
+
- Next.js 13 또는 14
|
|
67
|
+
- Tailwind CSS with DaisyUI
|
|
68
|
+
- @aioia/core
|
|
69
|
+
|
|
70
|
+
## 라이선스
|
|
71
|
+
|
|
72
|
+
Apache 2.0
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z as e } from "zod";
|
|
2
|
+
const m = e.object({
|
|
3
|
+
id: e.string(),
|
|
4
|
+
name: e.string(),
|
|
5
|
+
concept: e.string().nullable().optional(),
|
|
6
|
+
profileImageUrl: e.string(),
|
|
7
|
+
createdAt: e.string(),
|
|
8
|
+
updatedAt: e.string()
|
|
9
|
+
}), i = e.object({
|
|
10
|
+
name: e.string().min(1, "creation.memberNameRequired"),
|
|
11
|
+
personality: e.string().optional(),
|
|
12
|
+
systemPrompt: e.string().optional()
|
|
13
|
+
}), o = e.object({
|
|
14
|
+
groupName: e.string().min(1, "creation.groupNameRequired"),
|
|
15
|
+
concept: e.string().optional(),
|
|
16
|
+
profileImageUrl: e.string().min(1, "creation.emblemRequired"),
|
|
17
|
+
members: e.array(i).min(1, "creation.memberRequired").refine((t) => t.some((r) => r.name.trim() !== ""), {
|
|
18
|
+
message: "creation.memberRequired"
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
e.object({
|
|
22
|
+
prompt: e.string().max(200)
|
|
23
|
+
});
|
|
24
|
+
const n = e.object({
|
|
25
|
+
imageUrl: e.string(),
|
|
26
|
+
width: e.number(),
|
|
27
|
+
height: e.number(),
|
|
28
|
+
format: e.string()
|
|
29
|
+
}), s = e.object({
|
|
30
|
+
data: n
|
|
31
|
+
});
|
|
32
|
+
export {
|
|
33
|
+
m as a,
|
|
34
|
+
o as g,
|
|
35
|
+
s as i
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=aidol-D1U55wfr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aidol-D1U55wfr.mjs","sources":["../src/schemas/aidol.ts"],"sourcesContent":["/**\n * AIdol (group) schemas\n * Matches backend aidol/schemas/aidol.py definitions (Public only for MVP)\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\nimport type { Companion } from \"./companion\";\n\n/**\n * AIdol schema (public fields only, excludes claim_token)\n */\nexport const aidolSchema = z.object({\n id: z.string(),\n name: z.string(),\n concept: z.string().nullable().optional(),\n profileImageUrl: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport interface AIdol extends BaseRecord {\n id: string;\n name: string;\n concept?: string | null;\n profileImageUrl: string;\n createdAt: string;\n updatedAt: string;\n companions?: Companion[];\n}\n\n/**\n * Schema for creating an AIdol group\n * claimToken is optional for anonymous ownership verification\n */\nexport interface AIdolCreate {\n name: string;\n concept?: string | null;\n profileImageUrl: string;\n claimToken?: string | null;\n}\n\n/**\n * Schema for updating an AIdol group\n */\nexport interface AIdolUpdate {\n name?: string;\n concept?: string | null;\n profileImageUrl?: string | null;\n}\n\n/**\n * Member draft schema for group creation form\n */\nexport const memberDraftSchema = z.object({\n name: z.string().min(1, \"creation.memberNameRequired\"),\n personality: z.string().optional(),\n systemPrompt: z.string().optional(),\n});\n\nexport type MemberDraft = z.infer<typeof memberDraftSchema>;\n\n/**\n * Group creation form schema (react-hook-form + zod)\n */\nexport const groupCreationSchema = z.object({\n groupName: z.string().min(1, \"creation.groupNameRequired\"),\n concept: z.string().optional(),\n profileImageUrl: z.string().min(1, \"creation.emblemRequired\"),\n members: z\n .array(memberDraftSchema)\n .min(1, \"creation.memberRequired\")\n .refine((members) => members.some((m) => m.name.trim() !== \"\"), {\n message: \"creation.memberRequired\",\n }),\n});\n\nexport type GroupCreationFormData = z.infer<typeof groupCreationSchema>;\n\n// ---------------------------------------------------------------------------\n// Image Generation\n// ---------------------------------------------------------------------------\n\n/**\n * Request schema for image generation\n */\nexport const imageGenerationRequestSchema = z.object({\n prompt: z.string().max(200),\n});\n\nexport type ImageGenerationRequest = z.infer<\n typeof imageGenerationRequestSchema\n>;\n\n/**\n * Image generation result data\n */\nexport const imageGenerationDataSchema = z.object({\n imageUrl: z.string(),\n width: z.number(),\n height: z.number(),\n format: z.string(),\n});\n\nexport type ImageGenerationData = z.infer<typeof imageGenerationDataSchema>;\n\n/**\n * Response schema for image generation\n */\nexport const imageGenerationResponseSchema = z.object({\n data: imageGenerationDataSchema,\n});\n\nexport type ImageGenerationResponse = z.infer<\n typeof imageGenerationResponseSchema\n>;\n"],"names":["aidolSchema","z","memberDraftSchema","groupCreationSchema","members","m","imageGenerationDataSchema","imageGenerationResponseSchema"],"mappings":";AAaO,MAAMA,IAAcC,EAAE,OAAO;AAAA,EAClC,IAAIA,EAAE,OAAA;AAAA,EACN,MAAMA,EAAE,OAAA;AAAA,EACR,SAASA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA;AAAA,EAC/B,iBAAiBA,EAAE,OAAA;AAAA,EACnB,WAAWA,EAAE,OAAA;AAAA,EACb,WAAWA,EAAE,OAAA;AACf,CAAC,GAmCYC,IAAoBD,EAAE,OAAO;AAAA,EACxC,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,6BAA6B;AAAA,EACrD,aAAaA,EAAE,OAAA,EAAS,SAAA;AAAA,EACxB,cAAcA,EAAE,OAAA,EAAS,SAAA;AAC3B,CAAC,GAOYE,IAAsBF,EAAE,OAAO;AAAA,EAC1C,WAAWA,EAAE,OAAA,EAAS,IAAI,GAAG,4BAA4B;AAAA,EACzD,SAASA,EAAE,OAAA,EAAS,SAAA;AAAA,EACpB,iBAAiBA,EAAE,OAAA,EAAS,IAAI,GAAG,yBAAyB;AAAA,EAC5D,SAASA,EACN,MAAMC,CAAiB,EACvB,IAAI,GAAG,yBAAyB,EAChC,OAAO,CAACE,MAAYA,EAAQ,KAAK,CAACC,MAAMA,EAAE,KAAK,WAAW,EAAE,GAAG;AAAA,IAC9D,SAAS;AAAA,EAAA,CACV;AACL,CAAC;AAW2CJ,EAAE,OAAO;AAAA,EACnD,QAAQA,EAAE,OAAA,EAAS,IAAI,GAAG;AAC5B,CAAC;AASM,MAAMK,IAA4BL,EAAE,OAAO;AAAA,EAChD,UAAUA,EAAE,OAAA;AAAA,EACZ,OAAOA,EAAE,OAAA;AAAA,EACT,QAAQA,EAAE,OAAA;AAAA,EACV,QAAQA,EAAE,OAAA;AACZ,CAAC,GAOYM,IAAgCN,EAAE,OAAO;AAAA,EACpD,MAAMK;AACR,CAAC;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("zod"),i=e.z.object({id:e.z.string(),name:e.z.string(),concept:e.z.string().nullable().optional(),profileImageUrl:e.z.string(),createdAt:e.z.string(),updatedAt:e.z.string()}),n=e.z.object({name:e.z.string().min(1,"creation.memberNameRequired"),personality:e.z.string().optional(),systemPrompt:e.z.string().optional()}),a=e.z.object({groupName:e.z.string().min(1,"creation.groupNameRequired"),concept:e.z.string().optional(),profileImageUrl:e.z.string().min(1,"creation.emblemRequired"),members:e.z.array(n).min(1,"creation.memberRequired").refine(t=>t.some(r=>r.name.trim()!==""),{message:"creation.memberRequired"})});e.z.object({prompt:e.z.string().max(200)});const o=e.z.object({imageUrl:e.z.string(),width:e.z.number(),height:e.z.number(),format:e.z.string()}),m=e.z.object({data:o});exports.aidolSchema=i;exports.groupCreationSchema=a;exports.imageGenerationResponseSchema=m;
|
|
2
|
+
//# sourceMappingURL=aidol-gZjlTwTe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aidol-gZjlTwTe.js","sources":["../src/schemas/aidol.ts"],"sourcesContent":["/**\n * AIdol (group) schemas\n * Matches backend aidol/schemas/aidol.py definitions (Public only for MVP)\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\nimport type { Companion } from \"./companion\";\n\n/**\n * AIdol schema (public fields only, excludes claim_token)\n */\nexport const aidolSchema = z.object({\n id: z.string(),\n name: z.string(),\n concept: z.string().nullable().optional(),\n profileImageUrl: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport interface AIdol extends BaseRecord {\n id: string;\n name: string;\n concept?: string | null;\n profileImageUrl: string;\n createdAt: string;\n updatedAt: string;\n companions?: Companion[];\n}\n\n/**\n * Schema for creating an AIdol group\n * claimToken is optional for anonymous ownership verification\n */\nexport interface AIdolCreate {\n name: string;\n concept?: string | null;\n profileImageUrl: string;\n claimToken?: string | null;\n}\n\n/**\n * Schema for updating an AIdol group\n */\nexport interface AIdolUpdate {\n name?: string;\n concept?: string | null;\n profileImageUrl?: string | null;\n}\n\n/**\n * Member draft schema for group creation form\n */\nexport const memberDraftSchema = z.object({\n name: z.string().min(1, \"creation.memberNameRequired\"),\n personality: z.string().optional(),\n systemPrompt: z.string().optional(),\n});\n\nexport type MemberDraft = z.infer<typeof memberDraftSchema>;\n\n/**\n * Group creation form schema (react-hook-form + zod)\n */\nexport const groupCreationSchema = z.object({\n groupName: z.string().min(1, \"creation.groupNameRequired\"),\n concept: z.string().optional(),\n profileImageUrl: z.string().min(1, \"creation.emblemRequired\"),\n members: z\n .array(memberDraftSchema)\n .min(1, \"creation.memberRequired\")\n .refine((members) => members.some((m) => m.name.trim() !== \"\"), {\n message: \"creation.memberRequired\",\n }),\n});\n\nexport type GroupCreationFormData = z.infer<typeof groupCreationSchema>;\n\n// ---------------------------------------------------------------------------\n// Image Generation\n// ---------------------------------------------------------------------------\n\n/**\n * Request schema for image generation\n */\nexport const imageGenerationRequestSchema = z.object({\n prompt: z.string().max(200),\n});\n\nexport type ImageGenerationRequest = z.infer<\n typeof imageGenerationRequestSchema\n>;\n\n/**\n * Image generation result data\n */\nexport const imageGenerationDataSchema = z.object({\n imageUrl: z.string(),\n width: z.number(),\n height: z.number(),\n format: z.string(),\n});\n\nexport type ImageGenerationData = z.infer<typeof imageGenerationDataSchema>;\n\n/**\n * Response schema for image generation\n */\nexport const imageGenerationResponseSchema = z.object({\n data: imageGenerationDataSchema,\n});\n\nexport type ImageGenerationResponse = z.infer<\n typeof imageGenerationResponseSchema\n>;\n"],"names":["aidolSchema","z","memberDraftSchema","groupCreationSchema","members","m","imageGenerationDataSchema","imageGenerationResponseSchema"],"mappings":"oCAaaA,EAAcC,EAAAA,EAAE,OAAO,CAClC,GAAIA,EAAAA,EAAE,OAAA,EACN,KAAMA,EAAAA,EAAE,OAAA,EACR,QAASA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAC/B,gBAAiBA,EAAAA,EAAE,OAAA,EACnB,UAAWA,EAAAA,EAAE,OAAA,EACb,UAAWA,EAAAA,EAAE,OAAA,CACf,CAAC,EAmCYC,EAAoBD,EAAAA,EAAE,OAAO,CACxC,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,6BAA6B,EACrD,YAAaA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACxB,aAAcA,EAAAA,EAAE,OAAA,EAAS,SAAA,CAC3B,CAAC,EAOYE,EAAsBF,EAAAA,EAAE,OAAO,CAC1C,UAAWA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,4BAA4B,EACzD,QAASA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACpB,gBAAiBA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,yBAAyB,EAC5D,QAASA,EAAAA,EACN,MAAMC,CAAiB,EACvB,IAAI,EAAG,yBAAyB,EAChC,OAAQE,GAAYA,EAAQ,KAAMC,GAAMA,EAAE,KAAK,SAAW,EAAE,EAAG,CAC9D,QAAS,yBAAA,CACV,CACL,CAAC,EAW2CJ,EAAAA,EAAE,OAAO,CACnD,OAAQA,EAAAA,EAAE,OAAA,EAAS,IAAI,GAAG,CAC5B,CAAC,EASM,MAAMK,EAA4BL,EAAAA,EAAE,OAAO,CAChD,SAAUA,EAAAA,EAAE,OAAA,EACZ,MAAOA,EAAAA,EAAE,OAAA,EACT,OAAQA,EAAAA,EAAE,OAAA,EACV,OAAQA,EAAAA,EAAE,OAAA,CACZ,CAAC,EAOYM,EAAgCN,EAAAA,EAAE,OAAO,CACpD,KAAMK,CACR,CAAC"}
|
package/dist/client.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),p=require("react-i18next"),O=require("next/image"),x=require("react"),z=require("@hookform/resolvers"),v=require("react-hook-form"),J=require("./aidol-gZjlTwTe.js"),f=require("framer-motion");function Q(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(a,r,s.get?s:{enumerable:!0,get:()=>t[r]})}}return a.default=t,Object.freeze(a)}const o=Q(x);function X({title:t,titleId:a,...r},s){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":a},r),t?o.createElement("title",{id:a},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 12.75 6 6 9-13.5"}))}const ee=o.forwardRef(X);function te({title:t,titleId:a,...r},s){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":a},r),t?o.createElement("title",{id:a},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const ae=o.forwardRef(te);function se({title:t,titleId:a,...r},s){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":a},r),t?o.createElement("title",{id:a},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z"}))}const re=o.forwardRef(se);function ne({title:t,titleId:a,...r},s){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":a},r),t?o.createElement("title",{id:a},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z"}))}const le=o.forwardRef(ne);function oe({title:t,titleId:a,...r},s){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":a},r),t?o.createElement("title",{id:a},t):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z"}))}const ie=o.forwardRef(oe),ce={sm:"size-16",md:"size-24",lg:"size-32"};function N({url:t,alt:a,size:r="md"}){const s=ce[r];return e.jsx("div",{className:`relative overflow-hidden rounded-2xl bg-base-200 ${s}`,children:t?e.jsx(O,{src:t,alt:a,fill:!0,className:"object-cover"}):e.jsx("div",{className:"flex size-full items-center justify-center bg-gradient-to-br from-primary/20 to-secondary/20",children:e.jsx(ie,{className:"size-1/2 text-base-content/50"})})})}function U({companion:t,onClick:a}){return e.jsx("div",{onClick:a,className:"card cursor-pointer bg-base-200 p-4 transition-shadow hover:shadow-lg",role:a?"button":void 0,tabIndex:a?0:void 0,onKeyDown:a?r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),a())}:void 0,children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(N,{url:t.profilePictureUrl,alt:t.name,size:"md"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h3",{className:"truncate text-title-m font-semibold text-base-content",children:t.name}),t.biography&&e.jsx("p",{className:"mt-1 line-clamp-2 text-body-s text-base-content/70",children:t.biography})]})]})})}function de({companions:t,onCompanionClick:a}){const{t:r}=p.useTranslation();return e.jsxs("div",{className:"mt-8",children:[e.jsx("h2",{className:"mb-4 text-title-l font-semibold",children:r("aidol:aidol.members")}),t&&t.length>0?e.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:t.map(s=>e.jsx(U,{companion:s,onClick:()=>a(s.id)},s.id))}):e.jsx("p",{className:"text-center text-base-content/50",children:r("aidol:aidol.noMembers")})]})}function me({aidol:t}){return e.jsxs("div",{className:"flex flex-col items-center gap-4 py-8 text-center",children:[e.jsx("div",{className:"relative size-32 overflow-hidden rounded-full bg-base-200",children:t.profileImageUrl?e.jsx(O,{src:t.profileImageUrl,alt:t.name,fill:!0,className:"object-cover"}):e.jsx("div",{className:"flex size-full items-center justify-center bg-gradient-to-br from-primary/20 to-secondary/20",children:e.jsx(le,{className:"size-16 text-base-content/50"})})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-display-s font-bold text-base-content",children:t.name}),t.concept&&e.jsx("p",{className:"mt-2 text-body-l text-base-content/70",children:t.concept})]})]})}function $({onClick:t,isLoading:a}){const{t:r}=p.useTranslation();return e.jsx("button",{onClick:t,disabled:a,className:"btn btn-neutral h-16 min-w-48 text-base font-medium text-neutral-content",children:a?e.jsx("span",{className:"loading loading-spinner loading-sm"}):e.jsxs(e.Fragment,{children:[e.jsx(ae,{className:"size-5"}),r("aidol:companion.addMember")]})})}const I=x.forwardRef(({placeholder:t,maxLength:a=500,charCount:r,...s},l)=>{const{t:i}=p.useTranslation();return e.jsxs("div",{className:"w-full",children:[e.jsx("textarea",{ref:l,placeholder:t??i("aidol:companion.promptPlaceholder"),maxLength:a,className:"textarea textarea-bordered h-32 w-full resize-none bg-base-100 text-base-content placeholder:text-base-content/50 focus:border-primary focus:outline-none",...s}),e.jsxs("div",{className:"mt-1 text-right text-label-s text-base-content/50",children:[r??0,"/",a]})]})});I.displayName="PromptInput";const k=x.forwardRef(({options:t,...a},r)=>{const{t:s}=p.useTranslation();return e.jsxs("div",{className:"form-control w-full",children:[e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text text-base-content",children:s("aidol:creation.concept")})}),e.jsxs("select",{ref:r,className:"select select-bordered w-full bg-base-100 text-base-content",...a,children:[e.jsx("option",{value:"",children:s("aidol:creation.selectConcept")}),t.map(l=>e.jsx("option",{value:l.value,children:l.label},l.value))]})]})});k.displayName="ConceptSelector";function G({onGenerate:t,isGenerating:a,disabled:r}){const{t:s}=p.useTranslation(),[l,i]=x.useState(""),n=()=>{l.trim()&&t(l)},c=d=>{d.key==="Enter"&&l.trim()&&!a&&!r&&(d.preventDefault(),n())};return e.jsxs("div",{className:"form-control w-full",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:l,onChange:d=>i(d.target.value),onKeyDown:c,placeholder:s("aidol:creation.emblemPromptPlaceholder"),maxLength:200,className:"input input-bordered flex-1",disabled:r||a,"data-testid":"emblem-prompt-input"}),e.jsx("button",{type:"button",onClick:n,disabled:r||a||!l.trim(),className:"btn btn-secondary","data-testid":"emblem-generate-button",children:a?e.jsx("span",{className:"loading loading-spinner loading-sm"}):s("aidol:creation.generate")})]}),a&&e.jsx("div",{className:"mt-2",children:e.jsx("progress",{className:"progress w-full"})})]})}var ue=function(t,a){for(var r={};t.length;){var s=t[0],l=s.code,i=s.message,n=s.path.join(".");if(!r[n])if("unionErrors"in s){var c=s.unionErrors[0].errors[0];r[n]={message:c.message,type:c.code}}else r[n]={message:i,type:l};if("unionErrors"in s&&s.unionErrors.forEach(function(w){return w.errors.forEach(function(g){return t.push(g)})}),a){var d=r[n].types,b=d&&d[s.code];r[n]=v.appendErrors(n,a,r,l,b?[].concat(b,s.message):s.message)}t.shift()}return r},pe=function(t,a,r){return r===void 0&&(r={}),function(s,l,i){try{return Promise.resolve((function(n,c){try{var d=Promise.resolve(t[r.mode==="sync"?"parse":"parseAsync"](s,a)).then(function(b){return i.shouldUseNativeValidation&&z.validateFieldsNatively({},i),{errors:{},values:r.raw?s:b}})}catch(b){return c(b)}return d&&d.then?d.then(void 0,c):d})(0,function(n){if((function(c){return Array.isArray(c?.errors)})(n))return{values:{},errors:z.toNestErrors(ue(n.errors,!i.shouldUseNativeValidation&&i.criteriaMode==="all"),i)};throw n}))}catch(n){return Promise.reject(n)}}};function Z(t){var a,r,s="";if(typeof t=="string"||typeof t=="number")s+=t;else if(typeof t=="object")if(Array.isArray(t)){var l=t.length;for(a=0;a<l;a++)t[a]&&(r=Z(t[a]))&&(s&&(s+=" "),s+=r)}else for(r in t)t[r]&&(s&&(s+=" "),s+=r);return s}function y(){for(var t,a,r=0,s="",l=arguments.length;r<l;r++)(t=arguments[r])&&(a=Z(t))&&(s&&(s+=" "),s+=a);return s}const P=x.forwardRef(({error:t,...a},r)=>{const{t:s}=p.useTranslation();return e.jsxs("div",{className:"form-control w-full",children:[e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text text-base-content",children:s("aidol:creation.groupName")})}),e.jsx("input",{ref:r,type:"text",placeholder:s("aidol:creation.groupNamePlaceholder"),className:y("input input-bordered w-full bg-base-100 text-base-content placeholder:text-base-content/50",t&&"input-error"),...a}),t&&e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text-alt text-error",children:t})})]})});P.displayName="GroupNameInput";const M=x.forwardRef(({error:t,...a},r)=>{const{t:s}=p.useTranslation();return e.jsxs("div",{className:"form-control w-full",children:[e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text text-base-content",children:s("aidol:creation.memberName")})}),e.jsx("input",{ref:r,type:"text",placeholder:s("aidol:creation.memberNamePlaceholder"),className:y("input input-bordered w-full bg-base-100 text-base-content placeholder:text-base-content/50",t&&"input-error"),...a}),t&&e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text-alt text-error",children:t})})]})});M.displayName="MemberNameInput";function B({value:t,onChange:a,options:r}){const{t:s}=p.useTranslation();return e.jsxs("div",{className:"form-control w-full",children:[e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text text-base-content",children:s("aidol:creation.personality")})}),e.jsx("div",{className:"space-y-2",children:r.map(l=>e.jsxs("label",{className:y("flex cursor-pointer items-start gap-3 rounded-lg border p-4 transition-colors",t===l.value?"border-primary bg-primary/10":"border-base-300 hover:border-base-content/30"),children:[e.jsx("input",{type:"radio",name:"personality",value:l.value,checked:t===l.value,onChange:i=>a(i.target.value),className:"radio-primary radio mt-0.5"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-base-content",children:l.label}),l.description&&e.jsx("div",{className:"mt-1 text-body-s text-base-content/70",children:l.description})]})]},l.value))})]})}function D({currentStep:t,totalSteps:a,labels:r}){return e.jsx("ul",{className:"steps w-full",children:Array.from({length:a},(s,l)=>{const i=l+1,n=i<t,c=i===t;return e.jsx("li",{className:y("step",(n||c)&&"step-primary"),children:r?.[l]??""},i)})})}const xe=["cute","cool","elegant","powerful"],be=["cheerful","cool","tsundere","gentle"];function he({onSubmit:t,onComplete:a,onGenerateImage:r,isLoading:s,isGeneratingImage:l,isCompleted:i}){const{t:n}=p.useTranslation(),[c,d]=x.useState(i?3:1),b=x.useMemo(()=>xe.map(m=>({value:m,label:n(`aidol:creation.concepts.${m}`)})),[n]),w=x.useMemo(()=>be.map(m=>({value:m,label:n(`aidol:creation.personalities.${m}.label`),description:n(`aidol:creation.personalities.${m}.description`)})),[n]),{register:g,control:R,handleSubmit:F,trigger:_,watch:T,setValue:L,formState:{errors:h}}=v.useForm({resolver:pe(J.groupCreationSchema),defaultValues:{groupName:"",concept:"",profileImageUrl:"",members:[{name:"",personality:"",systemPrompt:""}]}}),C=T("profileImageUrl"),{fields:q,append:V}=v.useFieldArray({control:R,name:"members"}),A=T("members"),H=async m=>{const u=await r(m);u&&L("profileImageUrl",u)},K=async()=>{await _(["groupName","profileImageUrl"])&&d(2)},W=F(async m=>{const u=m.members.filter(j=>j.name.trim());await t({...m,members:u}),d(3)}),Y=()=>{V({name:"",personality:"",systemPrompt:""})};return e.jsx("main",{className:"flex min-h-dvh w-full flex-col items-center bg-base-100 px-6 py-20",children:e.jsxs("div",{className:"w-full max-w-lg",children:[e.jsx(D,{currentStep:c,totalSteps:3,labels:[n("aidol:creation.step1"),n("aidol:creation.step2"),n("aidol:creation.step3")]}),e.jsxs("div",{className:"mt-8",children:[c===1&&e.jsxs("div",{className:"space-y-6",children:[e.jsx("h2",{className:"text-display-s font-bold",children:n("aidol:creation.step1Title")}),e.jsx(P,{...g("groupName"),error:h.groupName?.message?n(h.groupName.message,{ns:"aidol"}):void 0}),e.jsx(k,{...g("concept"),options:b}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label",children:e.jsx("span",{className:"label-text font-medium",children:n("aidol:creation.emblem")})}),e.jsx(G,{onGenerate:H,isGenerating:l,disabled:s}),C&&e.jsx("div",{className:"mt-2 flex justify-center",children:e.jsx(N,{url:C,alt:n("aidol:creation.emblem"),size:"lg"})}),h.profileImageUrl?.message&&e.jsx("p",{className:"mt-1 text-sm text-error",children:n(h.profileImageUrl.message,{ns:"aidol"})})]}),e.jsx("button",{type:"button",onClick:K,disabled:!C,className:"btn btn-primary w-full",children:n("aidol:creation.next")})]}),c===2&&e.jsxs("form",{onSubmit:W,className:"space-y-6",children:[e.jsx("h2",{className:"text-display-s font-bold",children:n("aidol:creation.step2Title")}),q.map((m,u)=>e.jsxs("div",{className:"space-y-4 rounded-lg border border-base-300 p-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(N,{url:null,alt:A[u]?.name??"",size:"sm"}),e.jsx("div",{className:"flex-1",children:e.jsx(M,{...g(`members.${u}.name`),error:h.members?.[u]?.name?.message?n(h.members?.[u]?.name?.message??"",{ns:"aidol"}):void 0})})]}),e.jsx(v.Controller,{name:`members.${u}.personality`,control:R,render:({field:j})=>e.jsx(B,{value:j.value??"",onChange:j.onChange,options:w})}),e.jsx(I,{...g(`members.${u}.systemPrompt`),charCount:A[u]?.systemPrompt?.length??0})]},m.id)),e.jsx($,{onClick:Y,isLoading:!1}),h.members?.root?.message&&e.jsx("p",{className:"text-center text-error",children:n(h.members.root.message,{ns:"aidol"})}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx("button",{type:"button",onClick:()=>d(1),className:"btn btn-ghost flex-1",disabled:s,children:n("aidol:creation.back")}),e.jsx("button",{type:"submit",className:"btn btn-primary flex-1",disabled:s,children:s?e.jsx("span",{className:"loading loading-spinner loading-sm"}):n("aidol:creation.create")})]})]}),c===3&&e.jsxs("div",{className:"space-y-6 text-center",children:[e.jsx("div",{className:"text-6xl",children:"🎉"}),e.jsx("h2",{className:"text-display-s font-bold",children:n("aidol:creation.completeTitle")}),e.jsx("p",{className:"text-body-l text-base-content/70",children:n("aidol:creation.completeDescription")}),e.jsx("button",{onClick:a,className:"btn btn-primary w-full",children:n("aidol:creation.viewProfile")})]})]})]})})}function fe({title:t,titleId:a,...r},s){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon",ref:s,"aria-labelledby":a},r),t?o.createElement("title",{id:a},t):null,o.createElement("path",{fillRule:"evenodd",d:"M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z",clipRule:"evenodd"}))}const ge=o.forwardRef(fe),S={initial:{y:40,opacity:0},animate:{y:0,opacity:1,transition:{duration:.8,ease:"easeInOut"}}},je={animate:{transition:{staggerChildren:.2}}};function ve(){const{t}=p.useTranslation();return e.jsxs(f.motion.section,{variants:je,initial:"initial",whileInView:"animate",viewport:{once:!0,amount:.1},className:"container mx-auto px-6 py-20 text-center md:py-28",children:[e.jsx(f.motion.div,{variants:S,children:e.jsx(ge,{className:"mx-auto size-24 text-secondary drop-shadow-[0_0_16px_theme(colors.secondary)]"})}),e.jsx(f.motion.h2,{variants:S,className:"mt-4 text-display-s md:text-display-m",children:t("aidol:landing.demo.title")}),e.jsx(f.motion.p,{variants:S,className:"mx-auto mt-4 max-w-lg text-body-l text-neutral-content",children:t("aidol:landing.demo.description")})]})}const E={initial:{y:40,opacity:0},animate:{y:0,opacity:1,transition:{duration:.8,ease:"easeInOut"}}},Ne={animate:{transition:{staggerChildren:.2}}};function ye({onGetStarted:t}){const{t:a}=p.useTranslation();return e.jsx("div",{className:"hero min-h-screen bg-gradient-to-b from-base-200 to-primary pt-20",children:e.jsxs(f.motion.div,{variants:Ne,initial:"initial",animate:"animate",className:"hero-content flex-col gap-12 text-center text-base-content",children:[e.jsxs("div",{className:"max-w-3xl",children:[e.jsx(f.motion.h1,{variants:E,className:"mb-4 text-display-m md:text-display-l",children:a("aidol:landing.hero.title")}),e.jsx(f.motion.p,{variants:E,className:"mx-auto mt-6 max-w-xl text-body-l text-neutral-content",children:a("aidol:landing.hero.description")})]}),e.jsx(f.motion.div,{variants:E,children:e.jsx("button",{onClick:t,className:"btn btn-primary font-semibold",children:a("aidol:landing.hero.cta")})})]})})}function we({url:t,onShare:a}){const{t:r}=p.useTranslation(),[s,l]=x.useState(!1),i=x.useCallback(async()=>{await navigator.clipboard.writeText(t),l(!0),a?.(),setTimeout(()=>l(!1),2e3)},[t,a]);return e.jsx("button",{onClick:i,className:"btn btn-circle btn-ghost","aria-label":r("aidol:share"),children:s?e.jsx(ee,{className:"size-6 text-success"}):e.jsx(re,{className:"size-6"})})}exports.AddMemberButton=$;exports.Card=U;exports.CompanionGrid=de;exports.ConceptSelector=k;exports.DemoSection=ve;exports.EmblemGenerator=G;exports.GroupCreation=he;exports.GroupHeader=me;exports.GroupNameInput=P;exports.HeroSection=ye;exports.ImagePreview=N;exports.MemberNameInput=M;exports.PersonalitySelector=B;exports.PromptInput=I;exports.ShareButton=we;exports.StepIndicator=D;
|
|
2
|
+
//# sourceMappingURL=client.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cjs","sources":["../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../node_modules/@heroicons/react/24/outline/esm/PlusIcon.js","../node_modules/@heroicons/react/24/outline/esm/ShareIcon.js","../node_modules/@heroicons/react/24/outline/esm/UserGroupIcon.js","../node_modules/@heroicons/react/24/outline/esm/UserIcon.js","../src/components/companion/ImagePreview.tsx","../src/components/companion/Card.tsx","../src/components/aidol/CompanionGrid.tsx","../src/components/aidol/GroupHeader.tsx","../src/components/companion/AddMemberButton.tsx","../src/components/companion/PromptInput.tsx","../src/components/creation/ConceptSelector.tsx","../src/components/creation/EmblemGenerator.tsx","../node_modules/@hookform/resolvers/zod/dist/zod.mjs","../node_modules/clsx/dist/clsx.mjs","../src/components/creation/GroupNameInput.tsx","../src/components/creation/MemberNameInput.tsx","../src/components/creation/PersonalitySelector.tsx","../src/components/creation/StepIndicator.tsx","../src/components/creation/GroupCreation.tsx","../node_modules/@heroicons/react/24/solid/esm/SparklesIcon.js","../src/components/landing/DemoSection.tsx","../src/components/landing/HeroSection.tsx","../src/components/ShareButton.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction PlusIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = React.forwardRef(PlusIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ShareIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z\"\n }));\n}\nconst ForwardRef = React.forwardRef(ShareIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction UserGroupIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z\"\n }));\n}\nconst ForwardRef = React.forwardRef(UserGroupIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction UserIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\"\n }));\n}\nconst ForwardRef = React.forwardRef(UserIcon);\nexport default ForwardRef;","\"use client\";\n\nimport { UserIcon } from \"@heroicons/react/24/outline\";\nimport Image from \"next/image\";\n\ninterface ImagePreviewProps {\n url?: string | null;\n alt: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst SIZE_CLASSES = {\n sm: \"size-16\",\n md: \"size-24\",\n lg: \"size-32\",\n};\n\n/**\n * Image preview component for companion profile pictures.\n * Shows a placeholder when no image URL is provided.\n */\nexport function ImagePreview({ url, alt, size = \"md\" }: ImagePreviewProps) {\n const sizeClass = SIZE_CLASSES[size];\n\n return (\n <div\n className={`relative overflow-hidden rounded-2xl bg-base-200 ${sizeClass}`}\n >\n {url ? (\n <Image src={url} alt={alt} fill className=\"object-cover\" />\n ) : (\n <div className=\"flex size-full items-center justify-center bg-gradient-to-br from-primary/20 to-secondary/20\">\n <UserIcon className=\"size-1/2 text-base-content/50\" />\n </div>\n )}\n </div>\n );\n}\n","import type { Companion } from \"../../schemas\";\n\nimport { ImagePreview } from \"./ImagePreview\";\n\ninterface CardProps {\n companion: Companion;\n onClick?: () => void;\n}\n\n/**\n * Companion card component displaying profile picture and name.\n */\nexport function Card({ companion, onClick }: CardProps) {\n return (\n <div\n onClick={onClick}\n className=\"card cursor-pointer bg-base-200 p-4 transition-shadow hover:shadow-lg\"\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={\n onClick\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n <div className=\"flex items-center gap-4\">\n <ImagePreview\n url={companion.profilePictureUrl}\n alt={companion.name}\n size=\"md\"\n />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-title-m font-semibold text-base-content\">\n {companion.name}\n </h3>\n {companion.biography && (\n <p className=\"mt-1 line-clamp-2 text-body-s text-base-content/70\">\n {companion.biography}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport { Card } from \"@/components/companion/Card\";\nimport type { Companion } from \"@/schemas/companion\";\n\nexport interface CompanionGridProps {\n companions: Companion[] | undefined;\n onCompanionClick: (companionId: string) => void;\n}\n\n/**\n * Companion 카드 그리드 (Presentational)\n * 멤버 목록 제목, 그리드 레이아웃, 빈 상태 표시\n */\nexport function CompanionGrid({\n companions,\n onCompanionClick,\n}: CompanionGridProps): JSX.Element {\n const { t } = useTranslation();\n\n return (\n <div className=\"mt-8\">\n <h2 className=\"mb-4 text-title-l font-semibold\">\n {t(\"aidol:aidol.members\")}\n </h2>\n {companions && companions.length > 0 ? (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {companions.map((companion) => (\n <Card\n key={companion.id}\n companion={companion}\n onClick={() => onCompanionClick(companion.id)}\n />\n ))}\n </div>\n ) : (\n <p className=\"text-center text-base-content/50\">\n {t(\"aidol:aidol.noMembers\")}\n </p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { UserGroupIcon } from \"@heroicons/react/24/outline\";\nimport Image from \"next/image\";\n\nimport type { AIdol } from \"../../schemas\";\n\ninterface GroupHeaderProps {\n aidol: AIdol;\n}\n\n/**\n * Header component for AIdol group profile page.\n * Displays group image, name, and concept.\n */\nexport function GroupHeader({ aidol }: GroupHeaderProps) {\n return (\n <div className=\"flex flex-col items-center gap-4 py-8 text-center\">\n <div className=\"relative size-32 overflow-hidden rounded-full bg-base-200\">\n {aidol.profileImageUrl ? (\n <Image\n src={aidol.profileImageUrl}\n alt={aidol.name}\n fill\n className=\"object-cover\"\n />\n ) : (\n <div className=\"flex size-full items-center justify-center bg-gradient-to-br from-primary/20 to-secondary/20\">\n <UserGroupIcon className=\"size-16 text-base-content/50\" />\n </div>\n )}\n </div>\n <div>\n <h1 className=\"text-display-s font-bold text-base-content\">\n {aidol.name}\n </h1>\n {aidol.concept && (\n <p className=\"mt-2 text-body-l text-base-content/70\">\n {aidol.concept}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { PlusIcon } from \"@heroicons/react/24/outline\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface AddMemberButtonProps {\n onClick: () => void;\n isLoading?: boolean;\n}\n\n/**\n * Button for adding a new companion member.\n */\nexport function AddMemberButton({ onClick, isLoading }: AddMemberButtonProps) {\n const { t } = useTranslation();\n\n return (\n <button\n onClick={onClick}\n disabled={isLoading}\n className=\"btn btn-neutral h-16 min-w-48 text-base font-medium text-neutral-content\"\n >\n {isLoading ? (\n <span className=\"loading loading-spinner loading-sm\" />\n ) : (\n <>\n <PlusIcon className=\"size-5\" />\n {t(\"aidol:companion.addMember\")}\n </>\n )}\n </button>\n );\n}\n","import { forwardRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface PromptInputProps {\n placeholder?: string;\n maxLength?: number;\n charCount?: number;\n}\n\n/**\n * Textarea for entering companion system prompt or personality description.\n * Supports react-hook-form register() via forwardRef.\n */\nexport const PromptInput = forwardRef<HTMLTextAreaElement, PromptInputProps>(\n ({ placeholder, maxLength = 500, charCount, ...props }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"w-full\">\n <textarea\n ref={ref}\n placeholder={placeholder ?? t(\"aidol:companion.promptPlaceholder\")}\n maxLength={maxLength}\n className=\"textarea textarea-bordered h-32 w-full resize-none bg-base-100 text-base-content placeholder:text-base-content/50 focus:border-primary focus:outline-none\"\n {...props}\n />\n <div className=\"mt-1 text-right text-label-s text-base-content/50\">\n {charCount ?? 0}/{maxLength}\n </div>\n </div>\n );\n },\n);\n\nPromptInput.displayName = \"PromptInput\";\n","import { forwardRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface ConceptOption {\n value: string;\n label: string;\n}\n\ninterface ConceptSelectorProps {\n options: ConceptOption[];\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\n}\n\n/**\n * Dropdown selector for AIdol group concept.\n * Supports react-hook-form via forwardRef.\n */\nexport const ConceptSelector = forwardRef<\n HTMLSelectElement,\n ConceptSelectorProps\n>(({ options, ...props }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"form-control w-full\">\n <label className=\"label\">\n <span className=\"label-text text-base-content\">\n {t(\"aidol:creation.concept\")}\n </span>\n </label>\n <select\n ref={ref}\n className=\"select select-bordered w-full bg-base-100 text-base-content\"\n {...props}\n >\n <option value=\"\">{t(\"aidol:creation.selectConcept\")}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n );\n});\n\nConceptSelector.displayName = \"ConceptSelector\";\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface EmblemGeneratorProps {\n onGenerate: (prompt: string) => void;\n isGenerating: boolean;\n disabled?: boolean;\n}\n\n/**\n * Emblem image generation input (Presentational)\n * Follows ImageUpload pattern: input + loading state only\n * Preview is handled by parent component\n */\nexport function EmblemGenerator({\n onGenerate,\n isGenerating,\n disabled,\n}: EmblemGeneratorProps) {\n const { t } = useTranslation();\n const [prompt, setPrompt] = useState(\"\");\n\n const handleGenerate = () => {\n if (prompt.trim()) {\n onGenerate(prompt);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && prompt.trim() && !isGenerating && !disabled) {\n e.preventDefault();\n handleGenerate();\n }\n };\n\n return (\n <div className=\"form-control w-full\">\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={t(\"aidol:creation.emblemPromptPlaceholder\")}\n maxLength={200}\n className=\"input input-bordered flex-1\"\n disabled={disabled || isGenerating}\n data-testid=\"emblem-prompt-input\"\n />\n <button\n type=\"button\"\n onClick={handleGenerate}\n disabled={disabled || isGenerating || !prompt.trim()}\n className=\"btn btn-secondary\"\n data-testid=\"emblem-generate-button\"\n >\n {isGenerating ? (\n <span className=\"loading loading-spinner loading-sm\" />\n ) : (\n t(\"aidol:creation.generate\")\n )}\n </button>\n </div>\n {isGenerating && (\n <div className=\"mt-2\">\n <progress className=\"progress w-full\"></progress>\n </div>\n )}\n </div>\n );\n}\n","import{validateFieldsNatively as r,toNestErrors as e}from\"@hookform/resolvers\";import{appendErrors as o}from\"react-hook-form\";var n=function(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"unionErrors\"in t){var u=t.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"unionErrors\"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n},t=function(o,t,s){return void 0===s&&(s={}),function(i,a,u){try{return Promise.resolve(function(e,n){try{var a=Promise.resolve(o[\"sync\"===s.mode?\"parse\":\"parseAsync\"](i,t)).then(function(e){return u.shouldUseNativeValidation&&r({},u),{errors:{},values:s.raw?i:e}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(function(r){return Array.isArray(null==r?void 0:r.errors)}(r))return{values:{},errors:e(n(r.errors,!u.shouldUseNativeValidation&&\"all\"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}};export{t as zodResolver};\n//# sourceMappingURL=zod.module.js.map\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface GroupNameInputProps {\n error?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\n/**\n * Input field for AIdol group name.\n * Supports react-hook-form via forwardRef.\n */\nexport const GroupNameInput = forwardRef<HTMLInputElement, GroupNameInputProps>(\n ({ error, ...props }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"form-control w-full\">\n <label className=\"label\">\n <span className=\"label-text text-base-content\">\n {t(\"aidol:creation.groupName\")}\n </span>\n </label>\n <input\n ref={ref}\n type=\"text\"\n placeholder={t(\"aidol:creation.groupNamePlaceholder\")}\n className={clsx(\n \"input input-bordered w-full bg-base-100 text-base-content placeholder:text-base-content/50\",\n error && \"input-error\",\n )}\n {...props}\n />\n {error && (\n <label className=\"label\">\n <span className=\"label-text-alt text-error\">{error}</span>\n </label>\n )}\n </div>\n );\n },\n);\n\nGroupNameInput.displayName = \"GroupNameInput\";\n","import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface MemberNameInputProps {\n error?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\n/**\n * Input field for companion member name.\n * Supports react-hook-form via forwardRef.\n */\nexport const MemberNameInput = forwardRef<\n HTMLInputElement,\n MemberNameInputProps\n>(({ error, ...props }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"form-control w-full\">\n <label className=\"label\">\n <span className=\"label-text text-base-content\">\n {t(\"aidol:creation.memberName\")}\n </span>\n </label>\n <input\n ref={ref}\n type=\"text\"\n placeholder={t(\"aidol:creation.memberNamePlaceholder\")}\n className={clsx(\n \"input input-bordered w-full bg-base-100 text-base-content placeholder:text-base-content/50\",\n error && \"input-error\",\n )}\n {...props}\n />\n {error && (\n <label className=\"label\">\n <span className=\"label-text-alt text-error\">{error}</span>\n </label>\n )}\n </div>\n );\n});\n\nMemberNameInput.displayName = \"MemberNameInput\";\n","\"use client\";\n\nimport clsx from \"clsx\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface PersonalityOption {\n value: string;\n label: string;\n description?: string;\n}\n\ninterface PersonalitySelectorProps {\n value: string;\n onChange: (value: string) => void;\n options: PersonalityOption[];\n}\n\n/**\n * Radio group selector for companion personality.\n */\nexport function PersonalitySelector({\n value,\n onChange,\n options,\n}: PersonalitySelectorProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"form-control w-full\">\n <label className=\"label\">\n <span className=\"label-text text-base-content\">\n {t(\"aidol:creation.personality\")}\n </span>\n </label>\n <div className=\"space-y-2\">\n {options.map((option) => (\n <label\n key={option.value}\n className={clsx(\n \"flex cursor-pointer items-start gap-3 rounded-lg border p-4 transition-colors\",\n value === option.value\n ? \"border-primary bg-primary/10\"\n : \"border-base-300 hover:border-base-content/30\",\n )}\n >\n <input\n type=\"radio\"\n name=\"personality\"\n value={option.value}\n checked={value === option.value}\n onChange={(e) => onChange(e.target.value)}\n className=\"radio-primary radio mt-0.5\"\n />\n <div>\n <div className=\"font-medium text-base-content\">\n {option.label}\n </div>\n {option.description && (\n <div className=\"mt-1 text-body-s text-base-content/70\">\n {option.description}\n </div>\n )}\n </div>\n </label>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport clsx from \"clsx\";\n\ninterface StepIndicatorProps {\n currentStep: number;\n totalSteps: number;\n labels?: string[];\n}\n\n/**\n * Step indicator for multi-step creation flow.\n * Uses DaisyUI steps component.\n */\nexport function StepIndicator({\n currentStep,\n totalSteps,\n labels,\n}: StepIndicatorProps) {\n return (\n <ul className=\"steps w-full\">\n {Array.from({ length: totalSteps }, (_, index) => {\n const stepNumber = index + 1;\n const isCompleted = stepNumber < currentStep;\n const isCurrent = stepNumber === currentStep;\n\n return (\n <li\n key={stepNumber}\n className={clsx(\n \"step\",\n (isCompleted || isCurrent) && \"step-primary\",\n )}\n >\n {labels?.[index] ?? \"\"}\n </li>\n );\n })}\n </ul>\n );\n}\n","\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useMemo, useState } from \"react\";\nimport { Controller, useFieldArray, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { AddMemberButton } from \"@/components/companion/AddMemberButton\";\nimport { ImagePreview } from \"@/components/companion/ImagePreview\";\nimport { PromptInput } from \"@/components/companion/PromptInput\";\nimport { ConceptSelector } from \"@/components/creation/ConceptSelector\";\nimport { EmblemGenerator } from \"@/components/creation/EmblemGenerator\";\nimport { GroupNameInput } from \"@/components/creation/GroupNameInput\";\nimport { MemberNameInput } from \"@/components/creation/MemberNameInput\";\nimport { PersonalitySelector } from \"@/components/creation/PersonalitySelector\";\nimport { StepIndicator } from \"@/components/creation/StepIndicator\";\nimport {\n groupCreationSchema,\n type GroupCreationFormData,\n} from \"@/schemas/aidol\";\n\nexport type { GroupCreationFormData };\n\nexport interface GroupCreationProps {\n onSubmit: (data: GroupCreationFormData) => Promise<void>;\n onComplete: () => void;\n onGenerateImage: (prompt: string) => Promise<string | null>;\n isLoading: boolean;\n isGeneratingImage: boolean;\n isCompleted: boolean;\n}\n\nconst CONCEPT_KEYS = [\"cute\", \"cool\", \"elegant\", \"powerful\"] as const;\nconst PERSONALITY_KEYS = [\"cheerful\", \"cool\", \"tsundere\", \"gentle\"] as const;\n\n/**\n * AIdol 그룹 생성 멀티스텝 폼 (Presentational)\n * react-hook-form + zod validation\n */\nexport function GroupCreation({\n onSubmit,\n onComplete,\n onGenerateImage,\n isLoading,\n isGeneratingImage,\n isCompleted,\n}: GroupCreationProps): JSX.Element {\n const { t } = useTranslation();\n const [step, setStep] = useState(isCompleted ? 3 : 1);\n\n const conceptOptions = useMemo(\n () =>\n CONCEPT_KEYS.map((key) => ({\n value: key,\n label: t(`aidol:creation.concepts.${key}`),\n })),\n [t],\n );\n\n const personalityOptions = useMemo(\n () =>\n PERSONALITY_KEYS.map((key) => ({\n value: key,\n label: t(`aidol:creation.personalities.${key}.label`),\n description: t(`aidol:creation.personalities.${key}.description`),\n })),\n [t],\n );\n\n const {\n register,\n control,\n handleSubmit,\n trigger,\n watch,\n setValue,\n formState: { errors },\n } = useForm<GroupCreationFormData>({\n resolver: zodResolver(groupCreationSchema),\n defaultValues: {\n groupName: \"\",\n concept: \"\",\n profileImageUrl: \"\",\n members: [{ name: \"\", personality: \"\", systemPrompt: \"\" }],\n },\n });\n\n const profileImageUrl = watch(\"profileImageUrl\");\n\n const { fields, append } = useFieldArray({\n control,\n name: \"members\",\n });\n\n const members = watch(\"members\");\n\n const handleGenerateEmblem = async (prompt: string) => {\n const imageUrl = await onGenerateImage(prompt);\n if (imageUrl) {\n setValue(\"profileImageUrl\", imageUrl);\n }\n };\n\n const handleStep1Next = async () => {\n const isValid = await trigger([\"groupName\", \"profileImageUrl\"]);\n if (isValid) {\n setStep(2);\n }\n };\n\n const handleStep2Submit = handleSubmit(async (data) => {\n // Filter out empty members before submit\n const validMembers = data.members.filter((m) => m.name.trim());\n await onSubmit({ ...data, members: validMembers });\n setStep(3);\n });\n\n const handleAddMember = () => {\n append({ name: \"\", personality: \"\", systemPrompt: \"\" });\n };\n\n return (\n <main className=\"flex min-h-dvh w-full flex-col items-center bg-base-100 px-6 py-20\">\n <div className=\"w-full max-w-lg\">\n <StepIndicator\n currentStep={step}\n totalSteps={3}\n labels={[\n t(\"aidol:creation.step1\"),\n t(\"aidol:creation.step2\"),\n t(\"aidol:creation.step3\"),\n ]}\n />\n\n <div className=\"mt-8\">\n {/* Step 1: Group Info */}\n {step === 1 && (\n <div className=\"space-y-6\">\n <h2 className=\"text-display-s font-bold\">\n {t(\"aidol:creation.step1Title\")}\n </h2>\n <GroupNameInput\n {...register(\"groupName\")}\n error={\n errors.groupName?.message\n ? t(errors.groupName.message, { ns: \"aidol\" })\n : undefined\n }\n />\n <ConceptSelector\n {...register(\"concept\")}\n options={conceptOptions}\n />\n\n {/* Emblem Image Generation (follows ImageUpload pattern) */}\n <div className=\"form-control\">\n <label className=\"label\">\n <span className=\"label-text font-medium\">\n {t(\"aidol:creation.emblem\")}\n </span>\n </label>\n <EmblemGenerator\n onGenerate={handleGenerateEmblem}\n isGenerating={isGeneratingImage}\n disabled={isLoading}\n />\n {profileImageUrl && (\n <div className=\"mt-2 flex justify-center\">\n <ImagePreview\n url={profileImageUrl}\n alt={t(\"aidol:creation.emblem\")}\n size=\"lg\"\n />\n </div>\n )}\n {errors.profileImageUrl?.message && (\n <p className=\"mt-1 text-sm text-error\">\n {t(errors.profileImageUrl.message, { ns: \"aidol\" })}\n </p>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={handleStep1Next}\n disabled={!profileImageUrl}\n className=\"btn btn-primary w-full\"\n >\n {t(\"aidol:creation.next\")}\n </button>\n </div>\n )}\n\n {/* Step 2: Members */}\n {step === 2 && (\n <form onSubmit={handleStep2Submit} className=\"space-y-6\">\n <h2 className=\"text-display-s font-bold\">\n {t(\"aidol:creation.step2Title\")}\n </h2>\n\n {fields.map((field, index) => (\n <div\n key={field.id}\n className=\"space-y-4 rounded-lg border border-base-300 p-4\"\n >\n <div className=\"flex items-center gap-4\">\n <ImagePreview\n url={null}\n alt={members[index]?.name ?? \"\"}\n size=\"sm\"\n />\n <div className=\"flex-1\">\n <MemberNameInput\n {...register(`members.${index}.name`)}\n error={\n errors.members?.[index]?.name?.message\n ? t(errors.members?.[index]?.name?.message ?? \"\", {\n ns: \"aidol\",\n })\n : undefined\n }\n />\n </div>\n </div>\n <Controller\n name={`members.${index}.personality`}\n control={control}\n render={({ field: controllerField }) => (\n <PersonalitySelector\n value={controllerField.value ?? \"\"}\n onChange={controllerField.onChange}\n options={personalityOptions}\n />\n )}\n />\n <PromptInput\n {...register(`members.${index}.systemPrompt`)}\n charCount={members[index]?.systemPrompt?.length ?? 0}\n />\n </div>\n ))}\n\n <AddMemberButton onClick={handleAddMember} isLoading={false} />\n\n {errors.members?.root?.message && (\n <p className=\"text-center text-error\">\n {t(errors.members.root.message, { ns: \"aidol\" })}\n </p>\n )}\n\n <div className=\"flex gap-4\">\n <button\n type=\"button\"\n onClick={() => setStep(1)}\n className=\"btn btn-ghost flex-1\"\n disabled={isLoading}\n >\n {t(\"aidol:creation.back\")}\n </button>\n <button\n type=\"submit\"\n className=\"btn btn-primary flex-1\"\n disabled={isLoading}\n >\n {isLoading ? (\n <span className=\"loading loading-spinner loading-sm\" />\n ) : (\n t(\"aidol:creation.create\")\n )}\n </button>\n </div>\n </form>\n )}\n\n {/* Step 3: Complete */}\n {step === 3 && (\n <div className=\"space-y-6 text-center\">\n <div className=\"text-6xl\">🎉</div>\n <h2 className=\"text-display-s font-bold\">\n {t(\"aidol:creation.completeTitle\")}\n </h2>\n <p className=\"text-body-l text-base-content/70\">\n {t(\"aidol:creation.completeDescription\")}\n </p>\n <button onClick={onComplete} className=\"btn btn-primary w-full\">\n {t(\"aidol:creation.viewProfile\")}\n </button>\n </div>\n )}\n </div>\n </div>\n </main>\n );\n}\n","import * as React from \"react\";\nfunction SparklesIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = React.forwardRef(SparklesIcon);\nexport default ForwardRef;","\"use client\";\n\nimport { SparklesIcon } from \"@heroicons/react/24/solid\";\nimport { motion, Variants } from \"framer-motion\";\nimport { useTranslation } from \"react-i18next\";\n\nconst fadeInUp: Variants = {\n initial: { y: 40, opacity: 0 },\n animate: {\n y: 0,\n opacity: 1,\n transition: {\n duration: 0.8,\n ease: \"easeInOut\",\n },\n },\n};\n\nconst staggerContainer: Variants = {\n animate: {\n transition: {\n staggerChildren: 0.2,\n },\n },\n};\n\n/**\n * Demo/feature section for AIdol landing page.\n */\nexport function DemoSection() {\n const { t } = useTranslation();\n\n return (\n <motion.section\n variants={staggerContainer}\n initial=\"initial\"\n whileInView=\"animate\"\n viewport={{ once: true, amount: 0.1 }}\n className=\"container mx-auto px-6 py-20 text-center md:py-28\"\n >\n <motion.div variants={fadeInUp}>\n <SparklesIcon className=\"mx-auto size-24 text-secondary drop-shadow-[0_0_16px_theme(colors.secondary)]\" />\n </motion.div>\n <motion.h2\n variants={fadeInUp}\n className=\"mt-4 text-display-s md:text-display-m\"\n >\n {t(\"aidol:landing.demo.title\")}\n </motion.h2>\n <motion.p\n variants={fadeInUp}\n className=\"mx-auto mt-4 max-w-lg text-body-l text-neutral-content\"\n >\n {t(\"aidol:landing.demo.description\")}\n </motion.p>\n </motion.section>\n );\n}\n","\"use client\";\n\nimport { motion, Variants } from \"framer-motion\";\nimport { useTranslation } from \"react-i18next\";\n\nconst fadeInUp: Variants = {\n initial: { y: 40, opacity: 0 },\n animate: {\n y: 0,\n opacity: 1,\n transition: {\n duration: 0.8,\n ease: \"easeInOut\",\n },\n },\n};\n\nconst staggerContainer: Variants = {\n animate: {\n transition: {\n staggerChildren: 0.2,\n },\n },\n};\n\ninterface HeroSectionProps {\n onGetStarted: () => void;\n}\n\n/**\n * Hero section for AIdol landing page.\n */\nexport function HeroSection({ onGetStarted }: HeroSectionProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"hero min-h-screen bg-gradient-to-b from-base-200 to-primary pt-20\">\n <motion.div\n variants={staggerContainer}\n initial=\"initial\"\n animate=\"animate\"\n className=\"hero-content flex-col gap-12 text-center text-base-content\"\n >\n <div className=\"max-w-3xl\">\n <motion.h1\n variants={fadeInUp}\n className=\"mb-4 text-display-m md:text-display-l\"\n >\n {t(\"aidol:landing.hero.title\")}\n </motion.h1>\n <motion.p\n variants={fadeInUp}\n className=\"mx-auto mt-6 max-w-xl text-body-l text-neutral-content\"\n >\n {t(\"aidol:landing.hero.description\")}\n </motion.p>\n </div>\n <motion.div variants={fadeInUp}>\n <button\n onClick={onGetStarted}\n className=\"btn btn-primary font-semibold\"\n >\n {t(\"aidol:landing.hero.cta\")}\n </button>\n </motion.div>\n </motion.div>\n </div>\n );\n}\n","\"use client\";\n\nimport { CheckIcon, ShareIcon } from \"@heroicons/react/24/outline\";\nimport { useCallback, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface ShareButtonProps {\n url: string;\n onShare?: () => void;\n}\n\n/**\n * Share button that copies URL to clipboard.\n * Shows a check icon briefly after successful copy.\n */\nexport function ShareButton({ url, onShare }: ShareButtonProps) {\n const { t } = useTranslation();\n const [copied, setCopied] = useState(false);\n\n const handleShare = useCallback(async () => {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n onShare?.();\n setTimeout(() => setCopied(false), 2000);\n }, [url, onShare]);\n\n return (\n <button\n onClick={handleShare}\n className=\"btn btn-circle btn-ghost\"\n aria-label={t(\"aidol:share\")}\n >\n {copied ? (\n <CheckIcon className=\"size-6 text-success\" />\n ) : (\n <ShareIcon className=\"size-6\" />\n )}\n </button>\n );\n}\n"],"names":["CheckIcon","title","titleId","props","svgRef","React","ForwardRef","PlusIcon","ShareIcon","UserGroupIcon","UserIcon","SIZE_CLASSES","ImagePreview","url","alt","size","sizeClass","jsx","Image","Card","companion","onClick","e","jsxs","CompanionGrid","companions","onCompanionClick","t","useTranslation","GroupHeader","aidol","AddMemberButton","isLoading","Fragment","PromptInput","forwardRef","placeholder","maxLength","charCount","ref","ConceptSelector","options","option","EmblemGenerator","onGenerate","isGenerating","disabled","prompt","setPrompt","useState","handleGenerate","handleKeyDown","n","r","s","a","u","c","f","o","i","clsx","GroupNameInput","error","MemberNameInput","PersonalitySelector","value","onChange","StepIndicator","currentStep","totalSteps","labels","_","index","stepNumber","isCompleted","isCurrent","CONCEPT_KEYS","PERSONALITY_KEYS","GroupCreation","onSubmit","onComplete","onGenerateImage","isGeneratingImage","step","setStep","conceptOptions","useMemo","key","personalityOptions","register","control","handleSubmit","trigger","watch","setValue","errors","useForm","zodResolver","groupCreationSchema","profileImageUrl","fields","append","useFieldArray","members","handleGenerateEmblem","imageUrl","handleStep1Next","handleStep2Submit","data","validMembers","m","handleAddMember","field","Controller","controllerField","SparklesIcon","fadeInUp","staggerContainer","DemoSection","motion","HeroSection","onGetStarted","ShareButton","onShare","copied","setCopied","handleShare","useCallback"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,13,14,20]}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIdol Client-Only Exports
|
|
3
|
+
*
|
|
4
|
+
* This module contains all code that must run on the client side.
|
|
5
|
+
* Import from 'aidol/client' to use these in your application.
|
|
6
|
+
*
|
|
7
|
+
* The 'use client' directive ensures this code is properly bundled
|
|
8
|
+
* for client-side execution in React Server Components (RSC) environments.
|
|
9
|
+
*/
|
|
10
|
+
export { CompanionGrid } from './components/aidol';
|
|
11
|
+
export { GroupHeader } from './components/aidol';
|
|
12
|
+
export { AddMemberButton } from './components/companion';
|
|
13
|
+
export { Card } from './components/companion';
|
|
14
|
+
export { ImagePreview } from './components/companion';
|
|
15
|
+
export { PromptInput } from './components/companion';
|
|
16
|
+
export { ConceptSelector } from './components/creation';
|
|
17
|
+
export { EmblemGenerator } from './components/creation';
|
|
18
|
+
export { GroupCreation } from './components/creation';
|
|
19
|
+
export { GroupNameInput } from './components/creation';
|
|
20
|
+
export { MemberNameInput } from './components/creation';
|
|
21
|
+
export { PersonalitySelector } from './components/creation';
|
|
22
|
+
export { StepIndicator } from './components/creation';
|
|
23
|
+
export { DemoSection } from './components/landing';
|
|
24
|
+
export { HeroSection } from './components/landing';
|
|
25
|
+
export { ShareButton } from './components/ShareButton';
|
|
26
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC"}
|