aidol 0.1.2 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","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-label-l 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-label-m 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-display-l\">🎉</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","n","r","i","a","u","c","f","o","s","clsx","GroupNameInput","error","MemberNameInput","PersonalitySelector","value","onChange","StepIndicator","currentStep","totalSteps","labels","_","index","stepNumber","isCompleted","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]}
1
+ {"version":3,"file":"client.js","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-label-l 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-label-m 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-display-l\">🎉</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 onCopySuccess?: () => 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, onCopySuccess }: 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 onCopySuccess?.();\n setTimeout(() => setCopied(false), 2000);\n }, [url, onCopySuccess]);\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","n","r","i","a","u","c","f","o","s","clsx","GroupNameInput","error","MemberNameInput","PersonalitySelector","value","onChange","StepIndicator","currentStep","totalSteps","labels","_","index","stepNumber","isCompleted","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","onCopySuccess","copied","setCopied","handleShare","useCallback"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,13,14,20]}
@@ -1,11 +1,11 @@
1
1
  interface ShareButtonProps {
2
2
  url: string;
3
- onShare?: () => void;
3
+ onCopySuccess?: () => void;
4
4
  }
5
5
  /**
6
6
  * Share button that copies URL to clipboard.
7
7
  * Shows a check icon briefly after successful copy.
8
8
  */
9
- export declare function ShareButton({ url, onShare }: ShareButtonProps): import("react").JSX.Element;
9
+ export declare function ShareButton({ url, onCopySuccess }: ShareButtonProps): import("react").JSX.Element;
10
10
  export {};
11
11
  //# sourceMappingURL=ShareButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShareButton.d.ts","sourceRoot":"","sources":["../../src/components/ShareButton.tsx"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,gBAAgB,+BAwB7D"}
1
+ {"version":3,"file":"ShareButton.d.ts","sourceRoot":"","sources":["../../src/components/ShareButton.tsx"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,gBAAgB,+BAwBnE"}
@@ -21,6 +21,7 @@ export declare const AIDOL_NS = "aidol";
21
21
  export declare const aidolTranslations: {
22
22
  en: {
23
23
  share: string;
24
+ urlCopied: string;
24
25
  companion: {
25
26
  promptPlaceholder: string;
26
27
  addMember: string;
@@ -95,6 +96,7 @@ export declare const aidolTranslations: {
95
96
  };
96
97
  es: {
97
98
  share: string;
99
+ urlCopied: string;
98
100
  companion: {
99
101
  promptPlaceholder: string;
100
102
  addMember: string;
@@ -169,6 +171,7 @@ export declare const aidolTranslations: {
169
171
  };
170
172
  id: {
171
173
  share: string;
174
+ urlCopied: string;
172
175
  companion: {
173
176
  promptPlaceholder: string;
174
177
  addMember: string;
@@ -243,6 +246,7 @@ export declare const aidolTranslations: {
243
246
  };
244
247
  ja: {
245
248
  share: string;
249
+ urlCopied: string;
246
250
  companion: {
247
251
  promptPlaceholder: string;
248
252
  addMember: string;
@@ -317,6 +321,7 @@ export declare const aidolTranslations: {
317
321
  };
318
322
  ko: {
319
323
  share: string;
324
+ urlCopied: string;
320
325
  companion: {
321
326
  promptPlaceholder: string;
322
327
  addMember: string;
@@ -391,6 +396,7 @@ export declare const aidolTranslations: {
391
396
  };
392
397
  th: {
393
398
  share: string;
399
+ urlCopied: string;
394
400
  companion: {
395
401
  promptPlaceholder: string;
396
402
  addMember: string;
@@ -465,6 +471,7 @@ export declare const aidolTranslations: {
465
471
  };
466
472
  tl: {
467
473
  share: string;
474
+ urlCopied: string;
468
475
  companion: {
469
476
  promptPlaceholder: string;
470
477
  addMember: string;
@@ -539,6 +546,7 @@ export declare const aidolTranslations: {
539
546
  };
540
547
  vi: {
541
548
  share: string;
549
+ urlCopied: string;
542
550
  companion: {
543
551
  promptPlaceholder: string;
544
552
  addMember: string;
@@ -613,6 +621,7 @@ export declare const aidolTranslations: {
613
621
  };
614
622
  zh: {
615
623
  share: string;
624
+ urlCopied: string;
616
625
  companion: {
617
626
  promptPlaceholder: string;
618
627
  addMember: string;
@@ -1 +1 @@
1
- {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../src/i18n/translations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,sBAAsB;AACtB,eAAO,MAAM,QAAQ,UAAU,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU7B,CAAC"}
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../src/i18n/translations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,sBAAsB;AACtB,eAAO,MAAM,QAAQ,UAAU,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU7B,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@aioia/core"),a=require("./aidol-gZjlTwTe.js"),e=require("zod"),n=e.z.object({id:e.z.string(),aidolId:e.z.string().nullable().optional(),name:e.z.string(),biography:e.z.string().nullable().optional(),profilePictureUrl:e.z.string().nullable().optional(),createdAt:e.z.string(),updatedAt:e.z.string()});class c extends o.BaseCrudRepository{constructor(){super(...arguments),this.resource="aidol/aidols"}getDataSchema(){return a.aidolSchema}async generateImage(r,i){const l=this.apiService.buildUrl(`${this.resource}/images`),m=await this.apiService.request(l,{...i,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return this.validateResponse(m,a.imageGenerationResponseSchema)}}class s extends o.BaseCrudRepository{constructor(){super(...arguments),this.resource="aidol/companions"}getDataSchema(){return n}}const d="Share",p={promptPlaceholder:"How does your idol talk? Describe their vibe...",addMember:"Add Member"},u={notFound:"Group not found",members:"Members",noMembers:"No members yet"},g={groupName:"Group Name",groupNamePlaceholder:"e.g. DREAMERS, STARLIGHT",memberName:"Member Name",memberNamePlaceholder:"e.g. Luna, Kai",concept:"Concept",selectConcept:"Select a concept",personality:"Personality",concepts:{cute:"Cute",cool:"Cool",elegant:"Elegant",powerful:"Powerful"},personalities:{cheerful:{label:"Cheerful",description:"Always bright and positive"},cool:{label:"Cool",description:"Calm and collected"},tsundere:{label:"Tsundere",description:"Cold outside, warm inside"},gentle:{label:"Gentle",description:"Kind and caring"}},step1:"Group",step2:"Members",step3:"Done",step1Title:"Create Your Group",step2Title:"Add Members",groupNameRequired:"Please enter a group name",memberNameRequired:"Please enter a member name",memberRequired:"Please add at least one member",emblem:"Emblem",emblemPromptPlaceholder:"Describe your group's emblem...",emblemRequired:"Please generate an emblem image",generate:"Generate",next:"Next",back:"Back",create:"Create",completeTitle:"Your Idol is Ready!",completeDescription:"Start chatting with your dream idol now",viewProfile:"View Profile"},b={hero:{title:"Create Your Dream Idol",description:"Design your perfect idol and chat like a real fan",cta:"Start Creating"},demo:{title:"Your Imagination, Your Idol",description:"Create idols with unique personalities and build your connection"}},h={share:d,companion:p,aidol:u,creation:g,landing:b},T="Compartir",P={promptPlaceholder:"¿Cómo habla tu idol? Describe su personalidad...",addMember:"Añadir Miembro"},R={notFound:"Grupo no encontrado",members:"Miembros",noMembers:"Aún no hay miembros"},N={groupName:"Nombre del Grupo",groupNamePlaceholder:"ej: DREAMERS, STARLIGHT",memberName:"Nombre del Miembro",memberNamePlaceholder:"ej: Luna, Kai",concept:"Concepto",selectConcept:"Selecciona un concepto",personality:"Personalidad",concepts:{cute:"Lindo",cool:"Genial",elegant:"Elegante",powerful:"Poderoso"},personalities:{cheerful:{label:"Alegre",description:"Siempre brillante y positivo"},cool:{label:"Genial",description:"Tranquilo y sereno"},tsundere:{label:"Tsundere",description:"Frío por fuera, cálido por dentro"},gentle:{label:"Amable",description:"Bondadoso y cariñoso"}},step1:"Grupo",step2:"Miembros",step3:"Listo",step1Title:"Crea Tu Grupo",step2Title:"Añade Miembros",groupNameRequired:"Por favor ingresa un nombre de grupo",memberNameRequired:"Por favor ingresa un nombre de miembro",memberRequired:"Por favor añade al menos un miembro",emblem:"Emblema",emblemPromptPlaceholder:"Describe el emblema de tu grupo...",emblemRequired:"Por favor genera una imagen de emblema",generate:"Generar",next:"Siguiente",back:"Atrás",create:"Crear",completeTitle:"¡Tu Idol Está Listo!",completeDescription:"Empieza a chatear con tu idol soñado ahora",viewProfile:"Ver Perfil"},y={hero:{title:"Crea Tu Idol Soñado",description:"Diseña tu idol perfecto y chatea como un verdadero fan",cta:"Empezar a Crear"},demo:{title:"Tu Imaginación, Tu Idol",description:"Crea idols únicos y construye una conexión especial"}},M={share:T,companion:P,aidol:R,creation:N,landing:y},f="Bagikan",S={promptPlaceholder:"Gimana idol kamu ngobrol? Ceritain kepribadiannya...",addMember:"Tambah Anggota"},k={notFound:"Grup tidak ditemukan",members:"Anggota",noMembers:"Belum ada anggota"},C={groupName:"Nama Grup",groupNamePlaceholder:"cth: DREAMERS, STARLIGHT",memberName:"Nama Anggota",memberNamePlaceholder:"cth: Luna, Kai",concept:"Konsep",selectConcept:"Pilih konsep",personality:"Kepribadian",concepts:{cute:"Imut",cool:"Keren",elegant:"Elegan",powerful:"Kuat"},personalities:{cheerful:{label:"Ceria",description:"Selalu cerah dan positif"},cool:{label:"Keren",description:"Tenang dan kalem"},tsundere:{label:"Tsundere",description:"Dingin di luar, hangat di dalam"},gentle:{label:"Lembut",description:"Baik hati dan perhatian"}},step1:"Grup",step2:"Anggota",step3:"Selesai",step1Title:"Buat Grup Kamu",step2Title:"Tambah Anggota",groupNameRequired:"Masukkan nama grup",memberNameRequired:"Masukkan nama anggota",memberRequired:"Tambahkan minimal satu anggota",emblem:"Emblem",emblemPromptPlaceholder:"Deskripsikan emblem grup kamu...",emblemRequired:"Buat gambar emblem dulu",generate:"Buat",next:"Lanjut",back:"Kembali",create:"Buat",completeTitle:"Idol Kamu Siap!",completeDescription:"Langsung ngobrol sama idol impianmu sekarang",viewProfile:"Lihat Profil"},q={hero:{title:"Buat Idol Impianmu",description:"Desain idol sempurnamu dan ngobrol kayak fans beneran",cta:"Mulai Buat"},demo:{title:"Imajinasimu Jadi Idol",description:"Buat idol unik dan bangun koneksi spesial"}},$={share:f,companion:S,aidol:k,creation:C,landing:q},I="共有",A={promptPlaceholder:"どんな話し方をする?性格を教えてね...",addMember:"メンバー追加"},G={notFound:"グループが見つかりません",members:"メンバー",noMembers:"まだメンバーがいません"},v={groupName:"グループ名",groupNamePlaceholder:"例: DREAMERS, STARLIGHT",memberName:"メンバー名",memberNamePlaceholder:"例: ルナ, カイ",concept:"コンセプト",selectConcept:"コンセプトを選択",personality:"性格",concepts:{cute:"キュート",cool:"クール",elegant:"エレガント",powerful:"パワフル"},personalities:{cheerful:{label:"明るい",description:"いつも元気でポジティブ"},cool:{label:"クール",description:"冷静で落ち着いている"},tsundere:{label:"ツンデレ",description:"外は冷たく中は温かい"},gentle:{label:"優しい",description:"親切で思いやりがある"}},step1:"グループ",step2:"メンバー",step3:"完了",step1Title:"グループを作ろう",step2Title:"メンバーを追加",groupNameRequired:"グループ名を入力してください",memberNameRequired:"メンバー名を入力してください",memberRequired:"メンバーを1人以上追加してください",emblem:"エンブレム",emblemPromptPlaceholder:"グループのエンブレムを説明してください...",emblemRequired:"エンブレム画像を生成してください",generate:"生成",next:"次へ",back:"戻る",create:"作成",completeTitle:"アイドル完成!",completeDescription:"さっそく推しと会話しよう",viewProfile:"プロフィールを見る"},D={hero:{title:"夢のアイドルを作ろう",description:"理想のアイドルを作って、本物のファンみたいに会話しよう",cta:"作り始める"},demo:{title:"想像がアイドルになる",description:"あなただけのアイドルを作り、特別な絆を築こう"}},w={share:I,companion:A,aidol:G,creation:v,landing:D},L="공유",E={promptPlaceholder:"어떤 말투로 대화할까요? 성격을 설명해 주세요...",addMember:"멤버 추가"},B={notFound:"그룹을 찾을 수 없습니다",members:"멤버",noMembers:"아직 멤버가 없습니다"},K={groupName:"그룹 이름",groupNamePlaceholder:"예: 드리머즈, 스타라이트",memberName:"멤버 이름",memberNamePlaceholder:"예: 루나, 카이",concept:"컨셉",selectConcept:"컨셉을 선택하세요",personality:"성격",concepts:{cute:"큐트",cool:"쿨",elegant:"우아한",powerful:"파워풀"},personalities:{cheerful:{label:"활발한",description:"항상 밝고 긍정적인"},cool:{label:"쿨한",description:"차분하고 침착한"},tsundere:{label:"츤데레",description:"겉은 차갑지만 속은 따뜻한"},gentle:{label:"다정한",description:"친절하고 배려심 깊은"}},step1:"그룹",step2:"멤버",step3:"완료",step1Title:"그룹 만들기",step2Title:"멤버 추가하기",groupNameRequired:"그룹 이름을 입력해 주세요",memberNameRequired:"멤버 이름을 입력해 주세요",memberRequired:"멤버를 한 명 이상 추가해 주세요",emblem:"엠블럼",emblemPromptPlaceholder:"그룹의 엠블럼을 설명해 주세요...",emblemRequired:"엠블럼 이미지를 생성해 주세요",generate:"생성",next:"다음",back:"이전",create:"만들기",completeTitle:"아이돌 완성!",completeDescription:"지금 바로 나만의 아이돌과 대화해 보세요",viewProfile:"프로필 보기"},x={hero:{title:"꿈꾸던 아이돌, 직접 만들기",description:"나만의 아이돌을 만들고 진짜 팬처럼 대화하세요",cta:"만들기 시작"},demo:{title:"상상 속 아이돌이 현실로",description:"나만의 아이돌을 만들고 특별한 관계를 쌓아보세요"}},z={share:L,companion:E,aidol:B,creation:K,landing:x},H="แชร์",V={promptPlaceholder:"ไอดอลของคุณพูดยังไง? บรรยายบุคลิกสักนิด...",addMember:"เพิ่มสมาชิก"},F={notFound:"ไม่พบกลุ่ม",members:"สมาชิก",noMembers:"ยังไม่มีสมาชิก"},j={groupName:"ชื่อกลุ่ม",groupNamePlaceholder:"เช่น: DREAMERS, STARLIGHT",memberName:"ชื่อสมาชิก",memberNamePlaceholder:"เช่น: Luna, Kai",concept:"คอนเซ็ปต์",selectConcept:"เลือกคอนเซ็ปต์",personality:"บุคลิกภาพ",concepts:{cute:"น่ารัก",cool:"เท่",elegant:"สง่างาม",powerful:"ทรงพลัง"},personalities:{cheerful:{label:"ร่าเริง",description:"สดใสและเป็นบวกเสมอ"},cool:{label:"เท่",description:"สงบและเยือกเย็น"},tsundere:{label:"ซึนเดเระ",description:"ภายนอกเย็นชา ภายในอบอุ่น"},gentle:{label:"อ่อนโยน",description:"ใจดีและเอาใจใส่"}},step1:"กลุ่ม",step2:"สมาชิก",step3:"เสร็จ",step1Title:"สร้างกลุ่มของคุณ",step2Title:"เพิ่มสมาชิก",groupNameRequired:"กรุณาใส่ชื่อกลุ่ม",memberNameRequired:"กรุณาใส่ชื่อสมาชิก",memberRequired:"กรุณาเพิ่มสมาชิกอย่างน้อย 1 คน",emblem:"ตราสัญลักษณ์",emblemPromptPlaceholder:"อธิบายตราสัญลักษณ์กลุ่ม...",emblemRequired:"กรุณาสร้างภาพตราสัญลักษณ์",generate:"สร้าง",next:"ถัดไป",back:"กลับ",create:"สร้าง",completeTitle:"ไอดอลพร้อมแล้ว!",completeDescription:"เริ่มแชทกับไอดอลในฝันของคุณได้เลย",viewProfile:"ดูโปรไฟล์"},O={hero:{title:"สร้างไอดอลในฝัน",description:"ออกแบบไอดอลในอุดมคติและแชทเหมือนแฟนคลับตัวจริง",cta:"เริ่มสร้าง"},demo:{title:"จินตนาการกลายเป็นไอดอล",description:"สร้างไอดอลที่มีเอกลักษณ์และสร้างสายสัมพันธ์พิเศษ"}},Y={share:H,companion:V,aidol:F,creation:j,landing:O},J="I-share",U={promptPlaceholder:"Paano nagsasalita ang idol mo? Ilarawan ang personality...",addMember:"Magdagdag ng Miyembro"},X={notFound:"Hindi nahanap ang grupo",members:"Miyembro",noMembers:"Wala pang miyembro"},_={groupName:"Pangalan ng Grupo",groupNamePlaceholder:"hal: DREAMERS, STARLIGHT",memberName:"Pangalan ng Miyembro",memberNamePlaceholder:"hal: Luna, Kai",concept:"Konsepto",selectConcept:"Pumili ng konsepto",personality:"Personalidad",concepts:{cute:"Cute",cool:"Cool",elegant:"Elegante",powerful:"Malakas"},personalities:{cheerful:{label:"Masayahin",description:"Palaging masaya at positibo"},cool:{label:"Cool",description:"Kalmado at mahinahon"},tsundere:{label:"Tsundere",description:"Malamig sa labas, mainit sa loob"},gentle:{label:"Mabait",description:"Maalalahanin at mapagmahal"}},step1:"Grupo",step2:"Miyembro",step3:"Tapos",step1Title:"Gumawa ng Grupo",step2Title:"Magdagdag ng Miyembro",groupNameRequired:"Maglagay ng pangalan ng grupo",memberNameRequired:"Maglagay ng pangalan ng miyembro",memberRequired:"Magdagdag ng kahit isang miyembro",emblem:"Emblema",emblemPromptPlaceholder:"Ilarawan ang emblema ng grupo...",emblemRequired:"Gumawa ng imahe ng emblema",generate:"Lumikha",next:"Susunod",back:"Bumalik",create:"Gumawa",completeTitle:"Handa na ang Idol Mo!",completeDescription:"Mag-chat na sa iyong dream idol ngayon",viewProfile:"Tingnan ang Profile"},Q={hero:{title:"Likhain ang Idol ng Iyong Pangarap",description:"I-design ang perpektong idol at mag-chat na parang tunay na fan",cta:"Magsimulang Lumikha"},demo:{title:"Ang Imahinasyon Mo, Ang Idol Mo",description:"Lumikha ng mga natatanging idol at magtayo ng koneksyon"}},W={share:J,companion:U,aidol:X,creation:_,landing:Q},Z="Chia sẻ",ee={promptPlaceholder:"Idol của bạn nói chuyện như thế nào? Mô tả tính cách...",addMember:"Thêm Thành Viên"},ae={notFound:"Không tìm thấy nhóm",members:"Thành Viên",noMembers:"Chưa có thành viên"},oe={groupName:"Tên Nhóm",groupNamePlaceholder:"vd: DREAMERS, STARLIGHT",memberName:"Tên Thành Viên",memberNamePlaceholder:"vd: Luna, Kai",concept:"Concept",selectConcept:"Chọn concept",personality:"Tính Cách",concepts:{cute:"Dễ thương",cool:"Ngầu",elegant:"Thanh lịch",powerful:"Mạnh mẽ"},personalities:{cheerful:{label:"Vui vẻ",description:"Luôn tươi sáng và tích cực"},cool:{label:"Ngầu",description:"Bình tĩnh và điềm đạm"},tsundere:{label:"Tsundere",description:"Lạnh lùng bên ngoài, ấm áp bên trong"},gentle:{label:"Dịu dàng",description:"Tốt bụng và quan tâm"}},step1:"Nhóm",step2:"Thành Viên",step3:"Xong",step1Title:"Tạo Nhóm",step2Title:"Thêm Thành Viên",groupNameRequired:"Vui lòng nhập tên nhóm",memberNameRequired:"Vui lòng nhập tên thành viên",memberRequired:"Vui lòng thêm ít nhất một thành viên",emblem:"Biểu tượng",emblemPromptPlaceholder:"Mô tả biểu tượng nhóm...",emblemRequired:"Vui lòng tạo hình biểu tượng",generate:"Tạo",next:"Tiếp",back:"Quay lại",create:"Tạo",completeTitle:"Idol Đã Sẵn Sàng!",completeDescription:"Bắt đầu trò chuyện với idol mơ ước ngay",viewProfile:"Xem Hồ Sơ"},ne={hero:{title:"Tạo Idol Mơ Ước",description:"Thiết kế idol hoàn hảo và trò chuyện như fan thật sự",cta:"Bắt Đầu Tạo"},demo:{title:"Trí Tưởng Tượng Thành Idol",description:"Tạo idol độc đáo và xây dựng mối liên kết đặc biệt"}},te={share:Z,companion:ee,aidol:ae,creation:oe,landing:ne},re="分享",ie={promptPlaceholder:"你的偶像怎么说话?描述一下性格...",addMember:"添加成员"},le={notFound:"找不到该组合",members:"成员",noMembers:"暂无成员"},me={groupName:"组合名",groupNamePlaceholder:"例如: DREAMERS, STARLIGHT",memberName:"成员名",memberNamePlaceholder:"例如: Luna, Kai",concept:"概念",selectConcept:"选择概念",personality:"性格",concepts:{cute:"可爱",cool:"酷",elegant:"优雅",powerful:"有力"},personalities:{cheerful:{label:"开朗",description:"总是阳光积极"},cool:{label:"冷酷",description:"冷静沉着"},tsundere:{label:"傲娇",description:"外冷内热"},gentle:{label:"温柔",description:"善良体贴"}},step1:"组合",step2:"成员",step3:"完成",step1Title:"创建组合",step2Title:"添加成员",groupNameRequired:"请输入组合名",memberNameRequired:"请输入成员名",memberRequired:"请至少添加一名成员",emblem:"徽章",emblemPromptPlaceholder:"描述你的组合徽章...",emblemRequired:"请生成徽章图片",generate:"生成",next:"下一步",back:"上一步",create:"创建",completeTitle:"偶像创建完成!",completeDescription:"现在就和你的梦想偶像聊天吧",viewProfile:"查看资料"},ce={hero:{title:"创造你的梦想偶像",description:"设计你的理想偶像,像真正的粉丝一样聊天",cta:"开始创作"},demo:{title:"让想象变成偶像",description:"创建独特的偶像,建立特别的羁绊"}},se={share:re,companion:ie,aidol:le,creation:me,landing:ce},de="aidol",pe={en:h,es:M,id:$,ja:w,ko:z,th:Y,tl:W,vi:te,zh:se};exports.aidolSchema=a.aidolSchema;exports.imageGenerationResponseSchema=a.imageGenerationResponseSchema;exports.AIDOL_NS=de;exports.AIdolRepository=c;exports.CompanionRepository=s;exports.aidolTranslations=pe;exports.companionSchema=n;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("@aioia/core"),o=require("./aidol-gZjlTwTe.js"),e=require("zod"),n=e.z.object({id:e.z.string(),aidolId:e.z.string().nullable().optional(),name:e.z.string(),biography:e.z.string().nullable().optional(),profilePictureUrl:e.z.string().nullable().optional(),createdAt:e.z.string(),updatedAt:e.z.string()});class c extends a.BaseCrudRepository{constructor(){super(...arguments),this.resource="aidol/aidols"}getDataSchema(){return o.aidolSchema}async generateImage(i,r){const l=this.apiService.buildUrl(`${this.resource}/images`),m=await this.apiService.request(l,{...r,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return this.validateResponse(m,o.imageGenerationResponseSchema)}}class s extends a.BaseCrudRepository{constructor(){super(...arguments),this.resource="aidol/companions"}getDataSchema(){return n}}const p="Share",d="URL copied!",u={promptPlaceholder:"How does your idol talk? Describe their vibe...",addMember:"Add Member"},g={notFound:"Group not found",members:"Members",noMembers:"No members yet"},b={groupName:"Group Name",groupNamePlaceholder:"e.g. DREAMERS, STARLIGHT",memberName:"Member Name",memberNamePlaceholder:"e.g. Luna, Kai",concept:"Concept",selectConcept:"Select a concept",personality:"Personality",concepts:{cute:"Cute",cool:"Cool",elegant:"Elegant",powerful:"Powerful"},personalities:{cheerful:{label:"Cheerful",description:"Always bright and positive"},cool:{label:"Cool",description:"Calm and collected"},tsundere:{label:"Tsundere",description:"Cold outside, warm inside"},gentle:{label:"Gentle",description:"Kind and caring"}},step1:"Group",step2:"Members",step3:"Done",step1Title:"Create Your Group",step2Title:"Add Members",groupNameRequired:"Please enter a group name",memberNameRequired:"Please enter a member name",memberRequired:"Please add at least one member",emblem:"Emblem",emblemPromptPlaceholder:"Describe your group's emblem...",emblemRequired:"Please generate an emblem image",generate:"Generate",next:"Next",back:"Back",create:"Create",completeTitle:"Your Idol is Ready!",completeDescription:"Start chatting with your dream idol now",viewProfile:"View Profile"},h={hero:{title:"Create Your Dream Idol",description:"Design your perfect idol and chat like a real fan",cta:"Start Creating"},demo:{title:"Your Imagination, Your Idol",description:"Create idols with unique personalities and build your connection"}},T={share:p,urlCopied:d,companion:u,aidol:g,creation:b,landing:h},P="Compartir",R="¡URL copiada!",N={promptPlaceholder:"¿Cómo habla tu idol? Describe su personalidad...",addMember:"Añadir Miembro"},y={notFound:"Grupo no encontrado",members:"Miembros",noMembers:"Aún no hay miembros"},M={groupName:"Nombre del Grupo",groupNamePlaceholder:"ej: DREAMERS, STARLIGHT",memberName:"Nombre del Miembro",memberNamePlaceholder:"ej: Luna, Kai",concept:"Concepto",selectConcept:"Selecciona un concepto",personality:"Personalidad",concepts:{cute:"Lindo",cool:"Genial",elegant:"Elegante",powerful:"Poderoso"},personalities:{cheerful:{label:"Alegre",description:"Siempre brillante y positivo"},cool:{label:"Genial",description:"Tranquilo y sereno"},tsundere:{label:"Tsundere",description:"Frío por fuera, cálido por dentro"},gentle:{label:"Amable",description:"Bondadoso y cariñoso"}},step1:"Grupo",step2:"Miembros",step3:"Listo",step1Title:"Crea Tu Grupo",step2Title:"Añade Miembros",groupNameRequired:"Por favor ingresa un nombre de grupo",memberNameRequired:"Por favor ingresa un nombre de miembro",memberRequired:"Por favor añade al menos un miembro",emblem:"Emblema",emblemPromptPlaceholder:"Describe el emblema de tu grupo...",emblemRequired:"Por favor genera una imagen de emblema",generate:"Generar",next:"Siguiente",back:"Atrás",create:"Crear",completeTitle:"¡Tu Idol Está Listo!",completeDescription:"Empieza a chatear con tu idol soñado ahora",viewProfile:"Ver Perfil"},C={hero:{title:"Crea Tu Idol Soñado",description:"Diseña tu idol perfecto y chatea como un verdadero fan",cta:"Empezar a Crear"},demo:{title:"Tu Imaginación, Tu Idol",description:"Crea idols únicos y construye una conexión especial"}},f={share:P,urlCopied:R,companion:N,aidol:y,creation:M,landing:C},$="Bagikan",k="URL disalin!",S={promptPlaceholder:"Gimana idol kamu ngobrol? Ceritain kepribadiannya...",addMember:"Tambah Anggota"},q={notFound:"Grup tidak ditemukan",members:"Anggota",noMembers:"Belum ada anggota"},I={groupName:"Nama Grup",groupNamePlaceholder:"cth: DREAMERS, STARLIGHT",memberName:"Nama Anggota",memberNamePlaceholder:"cth: Luna, Kai",concept:"Konsep",selectConcept:"Pilih konsep",personality:"Kepribadian",concepts:{cute:"Imut",cool:"Keren",elegant:"Elegan",powerful:"Kuat"},personalities:{cheerful:{label:"Ceria",description:"Selalu cerah dan positif"},cool:{label:"Keren",description:"Tenang dan kalem"},tsundere:{label:"Tsundere",description:"Dingin di luar, hangat di dalam"},gentle:{label:"Lembut",description:"Baik hati dan perhatian"}},step1:"Grup",step2:"Anggota",step3:"Selesai",step1Title:"Buat Grup Kamu",step2Title:"Tambah Anggota",groupNameRequired:"Masukkan nama grup",memberNameRequired:"Masukkan nama anggota",memberRequired:"Tambahkan minimal satu anggota",emblem:"Emblem",emblemPromptPlaceholder:"Deskripsikan emblem grup kamu...",emblemRequired:"Buat gambar emblem dulu",generate:"Buat",next:"Lanjut",back:"Kembali",create:"Buat",completeTitle:"Idol Kamu Siap!",completeDescription:"Langsung ngobrol sama idol impianmu sekarang",viewProfile:"Lihat Profil"},L={hero:{title:"Buat Idol Impianmu",description:"Desain idol sempurnamu dan ngobrol kayak fans beneran",cta:"Mulai Buat"},demo:{title:"Imajinasimu Jadi Idol",description:"Buat idol unik dan bangun koneksi spesial"}},A={share:$,urlCopied:k,companion:S,aidol:q,creation:I,landing:L},G="共有",v="URLがコピーされました!",D={promptPlaceholder:"どんな話し方をする?性格を教えてね...",addMember:"メンバー追加"},w={notFound:"グループが見つかりません",members:"メンバー",noMembers:"まだメンバーがいません"},E={groupName:"グループ名",groupNamePlaceholder:"例: DREAMERS, STARLIGHT",memberName:"メンバー名",memberNamePlaceholder:"例: ルナ, カイ",concept:"コンセプト",selectConcept:"コンセプトを選択",personality:"性格",concepts:{cute:"キュート",cool:"クール",elegant:"エレガント",powerful:"パワフル"},personalities:{cheerful:{label:"明るい",description:"いつも元気でポジティブ"},cool:{label:"クール",description:"冷静で落ち着いている"},tsundere:{label:"ツンデレ",description:"外は冷たく中は温かい"},gentle:{label:"優しい",description:"親切で思いやりがある"}},step1:"グループ",step2:"メンバー",step3:"完了",step1Title:"グループを作ろう",step2Title:"メンバーを追加",groupNameRequired:"グループ名を入力してください",memberNameRequired:"メンバー名を入力してください",memberRequired:"メンバーを1人以上追加してください",emblem:"エンブレム",emblemPromptPlaceholder:"グループのエンブレムを説明してください...",emblemRequired:"エンブレム画像を生成してください",generate:"生成",next:"次へ",back:"戻る",create:"作成",completeTitle:"アイドル完成!",completeDescription:"さっそく推しと会話しよう",viewProfile:"プロフィールを見る"},B={hero:{title:"夢のアイドルを作ろう",description:"理想のアイドルを作って、本物のファンみたいに会話しよう",cta:"作り始める"},demo:{title:"想像がアイドルになる",description:"あなただけのアイドルを作り、特別な絆を築こう"}},K={share:G,urlCopied:v,companion:D,aidol:w,creation:E,landing:B},x="공유",z="URL이 복사되었습니다!",H={promptPlaceholder:"어떤 말투로 대화할까요? 성격을 설명해 주세요...",addMember:"멤버 추가"},V={notFound:"그룹을 찾을 수 없습니다",members:"멤버",noMembers:"아직 멤버가 없습니다"},U={groupName:"그룹 이름",groupNamePlaceholder:"예: 드리머즈, 스타라이트",memberName:"멤버 이름",memberNamePlaceholder:"예: 루나, 카이",concept:"컨셉",selectConcept:"컨셉을 선택하세요",personality:"성격",concepts:{cute:"큐트",cool:"쿨",elegant:"우아한",powerful:"파워풀"},personalities:{cheerful:{label:"활발한",description:"항상 밝고 긍정적인"},cool:{label:"쿨한",description:"차분하고 침착한"},tsundere:{label:"츤데레",description:"겉은 차갑지만 속은 따뜻한"},gentle:{label:"다정한",description:"친절하고 배려심 깊은"}},step1:"그룹",step2:"멤버",step3:"완료",step1Title:"그룹 만들기",step2Title:"멤버 추가하기",groupNameRequired:"그룹 이름을 입력해 주세요",memberNameRequired:"멤버 이름을 입력해 주세요",memberRequired:"멤버를 한 명 이상 추가해 주세요",emblem:"엠블럼",emblemPromptPlaceholder:"그룹의 엠블럼을 설명해 주세요...",emblemRequired:"엠블럼 이미지를 생성해 주세요",generate:"생성",next:"다음",back:"이전",create:"만들기",completeTitle:"아이돌 완성!",completeDescription:"지금 바로 나만의 아이돌과 대화해 보세요",viewProfile:"프로필 보기"},F={hero:{title:"꿈꾸던 아이돌, 직접 만들기",description:"나만의 아이돌을 만들고 진짜 팬처럼 대화하세요",cta:"만들기 시작"},demo:{title:"상상 속 아이돌이 현실로",description:"나만의 아이돌을 만들고 특별한 관계를 쌓아보세요"}},j={share:x,urlCopied:z,companion:H,aidol:V,creation:U,landing:F},O="แชร์",Y="คัดลอก URL แล้ว!",J={promptPlaceholder:"ไอดอลของคุณพูดยังไง? บรรยายบุคลิกสักนิด...",addMember:"เพิ่มสมาชิก"},X={notFound:"ไม่พบกลุ่ม",members:"สมาชิก",noMembers:"ยังไม่มีสมาชิก"},_={groupName:"ชื่อกลุ่ม",groupNamePlaceholder:"เช่น: DREAMERS, STARLIGHT",memberName:"ชื่อสมาชิก",memberNamePlaceholder:"เช่น: Luna, Kai",concept:"คอนเซ็ปต์",selectConcept:"เลือกคอนเซ็ปต์",personality:"บุคลิกภาพ",concepts:{cute:"น่ารัก",cool:"เท่",elegant:"สง่างาม",powerful:"ทรงพลัง"},personalities:{cheerful:{label:"ร่าเริง",description:"สดใสและเป็นบวกเสมอ"},cool:{label:"เท่",description:"สงบและเยือกเย็น"},tsundere:{label:"ซึนเดเระ",description:"ภายนอกเย็นชา ภายในอบอุ่น"},gentle:{label:"อ่อนโยน",description:"ใจดีและเอาใจใส่"}},step1:"กลุ่ม",step2:"สมาชิก",step3:"เสร็จ",step1Title:"สร้างกลุ่มของคุณ",step2Title:"เพิ่มสมาชิก",groupNameRequired:"กรุณาใส่ชื่อกลุ่ม",memberNameRequired:"กรุณาใส่ชื่อสมาชิก",memberRequired:"กรุณาเพิ่มสมาชิกอย่างน้อย 1 คน",emblem:"ตราสัญลักษณ์",emblemPromptPlaceholder:"อธิบายตราสัญลักษณ์กลุ่ม...",emblemRequired:"กรุณาสร้างภาพตราสัญลักษณ์",generate:"สร้าง",next:"ถัดไป",back:"กลับ",create:"สร้าง",completeTitle:"ไอดอลพร้อมแล้ว!",completeDescription:"เริ่มแชทกับไอดอลในฝันของคุณได้เลย",viewProfile:"ดูโปรไฟล์"},Q={hero:{title:"สร้างไอดอลในฝัน",description:"ออกแบบไอดอลในอุดมคติและแชทเหมือนแฟนคลับตัวจริง",cta:"เริ่มสร้าง"},demo:{title:"จินตนาการกลายเป็นไอดอล",description:"สร้างไอดอลที่มีเอกลักษณ์และสร้างสายสัมพันธ์พิเศษ"}},W={share:O,urlCopied:Y,companion:J,aidol:X,creation:_,landing:Q},Z="I-share",ee="Nakopya ang URL!",oe={promptPlaceholder:"Paano nagsasalita ang idol mo? Ilarawan ang personality...",addMember:"Magdagdag ng Miyembro"},ae={notFound:"Hindi nahanap ang grupo",members:"Miyembro",noMembers:"Wala pang miyembro"},ne={groupName:"Pangalan ng Grupo",groupNamePlaceholder:"hal: DREAMERS, STARLIGHT",memberName:"Pangalan ng Miyembro",memberNamePlaceholder:"hal: Luna, Kai",concept:"Konsepto",selectConcept:"Pumili ng konsepto",personality:"Personalidad",concepts:{cute:"Cute",cool:"Cool",elegant:"Elegante",powerful:"Malakas"},personalities:{cheerful:{label:"Masayahin",description:"Palaging masaya at positibo"},cool:{label:"Cool",description:"Kalmado at mahinahon"},tsundere:{label:"Tsundere",description:"Malamig sa labas, mainit sa loob"},gentle:{label:"Mabait",description:"Maalalahanin at mapagmahal"}},step1:"Grupo",step2:"Miyembro",step3:"Tapos",step1Title:"Gumawa ng Grupo",step2Title:"Magdagdag ng Miyembro",groupNameRequired:"Maglagay ng pangalan ng grupo",memberNameRequired:"Maglagay ng pangalan ng miyembro",memberRequired:"Magdagdag ng kahit isang miyembro",emblem:"Emblema",emblemPromptPlaceholder:"Ilarawan ang emblema ng grupo...",emblemRequired:"Gumawa ng imahe ng emblema",generate:"Lumikha",next:"Susunod",back:"Bumalik",create:"Gumawa",completeTitle:"Handa na ang Idol Mo!",completeDescription:"Mag-chat na sa iyong dream idol ngayon",viewProfile:"Tingnan ang Profile"},te={hero:{title:"Likhain ang Idol ng Iyong Pangarap",description:"I-design ang perpektong idol at mag-chat na parang tunay na fan",cta:"Magsimulang Lumikha"},demo:{title:"Ang Imahinasyon Mo, Ang Idol Mo",description:"Lumikha ng mga natatanging idol at magtayo ng koneksyon"}},ie={share:Z,urlCopied:ee,companion:oe,aidol:ae,creation:ne,landing:te},re="Chia sẻ",le="Đã sao chép URL!",me={promptPlaceholder:"Idol của bạn nói chuyện như thế nào? Mô tả tính cách...",addMember:"Thêm Thành Viên"},ce={notFound:"Không tìm thấy nhóm",members:"Thành Viên",noMembers:"Chưa có thành viên"},se={groupName:"Tên Nhóm",groupNamePlaceholder:"vd: DREAMERS, STARLIGHT",memberName:"Tên Thành Viên",memberNamePlaceholder:"vd: Luna, Kai",concept:"Concept",selectConcept:"Chọn concept",personality:"Tính Cách",concepts:{cute:"Dễ thương",cool:"Ngầu",elegant:"Thanh lịch",powerful:"Mạnh mẽ"},personalities:{cheerful:{label:"Vui vẻ",description:"Luôn tươi sáng và tích cực"},cool:{label:"Ngầu",description:"Bình tĩnh và điềm đạm"},tsundere:{label:"Tsundere",description:"Lạnh lùng bên ngoài, ấm áp bên trong"},gentle:{label:"Dịu dàng",description:"Tốt bụng và quan tâm"}},step1:"Nhóm",step2:"Thành Viên",step3:"Xong",step1Title:"Tạo Nhóm",step2Title:"Thêm Thành Viên",groupNameRequired:"Vui lòng nhập tên nhóm",memberNameRequired:"Vui lòng nhập tên thành viên",memberRequired:"Vui lòng thêm ít nhất một thành viên",emblem:"Biểu tượng",emblemPromptPlaceholder:"Mô tả biểu tượng nhóm...",emblemRequired:"Vui lòng tạo hình biểu tượng",generate:"Tạo",next:"Tiếp",back:"Quay lại",create:"Tạo",completeTitle:"Idol Đã Sẵn Sàng!",completeDescription:"Bắt đầu trò chuyện với idol mơ ước ngay",viewProfile:"Xem Hồ Sơ"},pe={hero:{title:"Tạo Idol Mơ Ước",description:"Thiết kế idol hoàn hảo và trò chuyện như fan thật sự",cta:"Bắt Đầu Tạo"},demo:{title:"Trí Tưởng Tượng Thành Idol",description:"Tạo idol độc đáo và xây dựng mối liên kết đặc biệt"}},de={share:re,urlCopied:le,companion:me,aidol:ce,creation:se,landing:pe},ue="分享",ge="URL已复制!",be={promptPlaceholder:"你的偶像怎么说话?描述一下性格...",addMember:"添加成员"},he={notFound:"找不到该组合",members:"成员",noMembers:"暂无成员"},Te={groupName:"组合名",groupNamePlaceholder:"例如: DREAMERS, STARLIGHT",memberName:"成员名",memberNamePlaceholder:"例如: Luna, Kai",concept:"概念",selectConcept:"选择概念",personality:"性格",concepts:{cute:"可爱",cool:"酷",elegant:"优雅",powerful:"有力"},personalities:{cheerful:{label:"开朗",description:"总是阳光积极"},cool:{label:"冷酷",description:"冷静沉着"},tsundere:{label:"傲娇",description:"外冷内热"},gentle:{label:"温柔",description:"善良体贴"}},step1:"组合",step2:"成员",step3:"完成",step1Title:"创建组合",step2Title:"添加成员",groupNameRequired:"请输入组合名",memberNameRequired:"请输入成员名",memberRequired:"请至少添加一名成员",emblem:"徽章",emblemPromptPlaceholder:"描述你的组合徽章...",emblemRequired:"请生成徽章图片",generate:"生成",next:"下一步",back:"上一步",create:"创建",completeTitle:"偶像创建完成!",completeDescription:"现在就和你的梦想偶像聊天吧",viewProfile:"查看资料"},Pe={hero:{title:"创造你的梦想偶像",description:"设计你的理想偶像,像真正的粉丝一样聊天",cta:"开始创作"},demo:{title:"让想象变成偶像",description:"创建独特的偶像,建立特别的羁绊"}},Re={share:ue,urlCopied:ge,companion:be,aidol:he,creation:Te,landing:Pe},Ne="aidol",ye={en:T,es:f,id:A,ja:K,ko:j,th:W,tl:ie,vi:de,zh:Re};exports.aidolSchema=o.aidolSchema;exports.imageGenerationResponseSchema=o.imageGenerationResponseSchema;exports.AIDOL_NS=Ne;exports.AIdolRepository=c;exports.CompanionRepository=s;exports.aidolTranslations=ye;exports.companionSchema=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/schemas/companion.ts","../src/repositories/AIdolRepository.ts","../src/repositories/CompanionRepository.ts","../src/i18n/translations.ts"],"sourcesContent":["/**\n * Companion (member) schemas\n * Matches backend aidol/schemas/companion.py definitions (Public only for MVP)\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\n/**\n * Companion schema (public fields only, excludes system_prompt)\n */\nexport const companionSchema = z.object({\n id: z.string(),\n aidolId: z.string().nullable().optional(),\n name: z.string(),\n biography: z.string().nullable().optional(),\n profilePictureUrl: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport interface Companion extends BaseRecord {\n id: string;\n aidolId?: string | null;\n name: string;\n biography?: string | null;\n profilePictureUrl?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Schema for creating a Companion\n * Includes systemPrompt for creation (excluded from response)\n */\nexport interface CompanionCreate {\n aidolId?: string | null;\n name: string;\n biography?: string | null;\n profilePictureUrl?: string | null;\n systemPrompt?: string | null;\n}\n\n/**\n * Schema for updating a Companion\n */\nexport interface CompanionUpdate {\n aidolId?: string | null;\n name?: string;\n biography?: string | null;\n profilePictureUrl?: string | null;\n systemPrompt?: string | null;\n}\n","import { BaseCrudRepository } from \"@aioia/core\";\n\nimport type {\n AIdol,\n ImageGenerationRequest,\n ImageGenerationResponse,\n} from \"../schemas\";\nimport { aidolSchema, imageGenerationResponseSchema } from \"../schemas\";\n\n/**\n * Repository for AIdol (group) entities\n */\nexport class AIdolRepository extends BaseCrudRepository<AIdol> {\n readonly resource = \"aidol/aidols\";\n\n protected getDataSchema() {\n return aidolSchema;\n }\n\n /**\n * Generate image for AIdol emblem or Companion profile\n */\n async generateImage(\n request: ImageGenerationRequest,\n fetchOptions?: RequestInit,\n ): Promise<ImageGenerationResponse> {\n const url = this.apiService.buildUrl(`${this.resource}/images`);\n const rawResponse = await this.apiService.request(url, {\n ...fetchOptions,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n return this.validateResponse(rawResponse, imageGenerationResponseSchema);\n }\n}\n","import { BaseCrudRepository } from \"@aioia/core\";\n\nimport type { Companion } from \"../schemas\";\nimport { companionSchema } from \"../schemas\";\n\n/**\n * Repository for Companion (member) entities\n */\nexport class CompanionRepository extends BaseCrudRepository<Companion> {\n readonly resource = \"aidol/companions\";\n\n protected getDataSchema() {\n return companionSchema;\n }\n}\n","/**\n * Server-safe exports for aidol translations.\n *\n * This module exports only JSON resources and constants,\n * avoiding React-specific code that would break SSR.\n */\n\nimport en from \"./locales/en/aidol.json\";\nimport es from \"./locales/es/aidol.json\";\nimport id from \"./locales/id/aidol.json\";\nimport ja from \"./locales/ja/aidol.json\";\nimport ko from \"./locales/ko/aidol.json\";\nimport th from \"./locales/th/aidol.json\";\nimport tl from \"./locales/tl/aidol.json\";\nimport vi from \"./locales/vi/aidol.json\";\nimport zh from \"./locales/zh/aidol.json\";\n\n/** AIdol namespace */\nexport const AIDOL_NS = \"aidol\";\n\n/**\n * Translation resources for the aidol namespace.\n * Use with i18next.addResourceBundle(lang, 'aidol', translations)\n *\n * @example\n * import { aidolTranslations, AIDOL_NS } from 'aidol/locale';\n *\n * // Add to existing i18n instance\n * Object.entries(aidolTranslations).forEach(([lang, resources]) => {\n * i18n.addResourceBundle(lang, AIDOL_NS, resources);\n * });\n */\nexport const aidolTranslations = {\n en,\n es,\n id,\n ja,\n ko,\n th,\n tl,\n vi,\n zh,\n};\n"],"names":["companionSchema","z","AIdolRepository","BaseCrudRepository","aidolSchema","request","fetchOptions","url","rawResponse","imageGenerationResponseSchema","CompanionRepository","AIDOL_NS","aidolTranslations","en","es","id","ja","ko","th","tl","vi","zh"],"mappings":"iKAWaA,EAAkBC,EAAAA,EAAE,OAAO,CACtC,GAAIA,EAAAA,EAAE,OAAA,EACN,QAASA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAC/B,KAAMA,EAAAA,EAAE,OAAA,EACR,UAAWA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EACjC,kBAAmBA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EACzC,UAAWA,EAAAA,EAAE,OAAA,EACb,UAAWA,EAAAA,EAAE,OAAA,CACf,CAAC,ECPM,MAAMC,UAAwBC,EAAAA,kBAA0B,CAAxD,aAAA,CAAA,MAAA,GAAA,SAAA,EACL,KAAS,SAAW,cAAA,CAEV,eAAgB,CACxB,OAAOC,EAAAA,WACT,CAKA,MAAM,cACJC,EACAC,EACkC,CAClC,MAAMC,EAAM,KAAK,WAAW,SAAS,GAAG,KAAK,QAAQ,SAAS,EACxDC,EAAc,MAAM,KAAK,WAAW,QAAQD,EAAK,CACrD,GAAGD,EACH,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAUD,CAAO,CAAA,CAC7B,EAED,OAAO,KAAK,iBAAiBG,EAAaC,+BAA6B,CACzE,CACF,CC9BO,MAAMC,UAA4BP,EAAAA,kBAA8B,CAAhE,aAAA,CAAA,MAAA,GAAA,SAAA,EACL,KAAS,SAAW,kBAAA,CAEV,eAAgB,CACxB,OAAOH,CACT,CACF,kxZCIaW,GAAW,QAcXC,GAAoB,CAC/B,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,GACA,GAAAC,EACF"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/schemas/companion.ts","../src/repositories/AIdolRepository.ts","../src/repositories/CompanionRepository.ts","../src/i18n/translations.ts"],"sourcesContent":["/**\n * Companion (member) schemas\n * Matches backend aidol/schemas/companion.py definitions (Public only for MVP)\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\n/**\n * Companion schema (public fields only, excludes system_prompt)\n */\nexport const companionSchema = z.object({\n id: z.string(),\n aidolId: z.string().nullable().optional(),\n name: z.string(),\n biography: z.string().nullable().optional(),\n profilePictureUrl: z.string().nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport interface Companion extends BaseRecord {\n id: string;\n aidolId?: string | null;\n name: string;\n biography?: string | null;\n profilePictureUrl?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Schema for creating a Companion\n * Includes systemPrompt for creation (excluded from response)\n */\nexport interface CompanionCreate {\n aidolId?: string | null;\n name: string;\n biography?: string | null;\n profilePictureUrl?: string | null;\n systemPrompt?: string | null;\n}\n\n/**\n * Schema for updating a Companion\n */\nexport interface CompanionUpdate {\n aidolId?: string | null;\n name?: string;\n biography?: string | null;\n profilePictureUrl?: string | null;\n systemPrompt?: string | null;\n}\n","import { BaseCrudRepository } from \"@aioia/core\";\n\nimport type {\n AIdol,\n ImageGenerationRequest,\n ImageGenerationResponse,\n} from \"../schemas\";\nimport { aidolSchema, imageGenerationResponseSchema } from \"../schemas\";\n\n/**\n * Repository for AIdol (group) entities\n */\nexport class AIdolRepository extends BaseCrudRepository<AIdol> {\n readonly resource = \"aidol/aidols\";\n\n protected getDataSchema() {\n return aidolSchema;\n }\n\n /**\n * Generate image for AIdol emblem or Companion profile\n */\n async generateImage(\n request: ImageGenerationRequest,\n fetchOptions?: RequestInit,\n ): Promise<ImageGenerationResponse> {\n const url = this.apiService.buildUrl(`${this.resource}/images`);\n const rawResponse = await this.apiService.request(url, {\n ...fetchOptions,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n return this.validateResponse(rawResponse, imageGenerationResponseSchema);\n }\n}\n","import { BaseCrudRepository } from \"@aioia/core\";\n\nimport type { Companion } from \"../schemas\";\nimport { companionSchema } from \"../schemas\";\n\n/**\n * Repository for Companion (member) entities\n */\nexport class CompanionRepository extends BaseCrudRepository<Companion> {\n readonly resource = \"aidol/companions\";\n\n protected getDataSchema() {\n return companionSchema;\n }\n}\n","/**\n * Server-safe exports for aidol translations.\n *\n * This module exports only JSON resources and constants,\n * avoiding React-specific code that would break SSR.\n */\n\nimport en from \"./locales/en/aidol.json\";\nimport es from \"./locales/es/aidol.json\";\nimport id from \"./locales/id/aidol.json\";\nimport ja from \"./locales/ja/aidol.json\";\nimport ko from \"./locales/ko/aidol.json\";\nimport th from \"./locales/th/aidol.json\";\nimport tl from \"./locales/tl/aidol.json\";\nimport vi from \"./locales/vi/aidol.json\";\nimport zh from \"./locales/zh/aidol.json\";\n\n/** AIdol namespace */\nexport const AIDOL_NS = \"aidol\";\n\n/**\n * Translation resources for the aidol namespace.\n * Use with i18next.addResourceBundle(lang, 'aidol', translations)\n *\n * @example\n * import { aidolTranslations, AIDOL_NS } from 'aidol/locale';\n *\n * // Add to existing i18n instance\n * Object.entries(aidolTranslations).forEach(([lang, resources]) => {\n * i18n.addResourceBundle(lang, AIDOL_NS, resources);\n * });\n */\nexport const aidolTranslations = {\n en,\n es,\n id,\n ja,\n ko,\n th,\n tl,\n vi,\n zh,\n};\n"],"names":["companionSchema","z","AIdolRepository","BaseCrudRepository","aidolSchema","request","fetchOptions","url","rawResponse","imageGenerationResponseSchema","CompanionRepository","AIDOL_NS","aidolTranslations","en","es","id","ja","ko","th","tl","vi","zh"],"mappings":"iKAWaA,EAAkBC,EAAAA,EAAE,OAAO,CACtC,GAAIA,EAAAA,EAAE,OAAA,EACN,QAASA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAC/B,KAAMA,EAAAA,EAAE,OAAA,EACR,UAAWA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EACjC,kBAAmBA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EACzC,UAAWA,EAAAA,EAAE,OAAA,EACb,UAAWA,EAAAA,EAAE,OAAA,CACf,CAAC,ECPM,MAAMC,UAAwBC,EAAAA,kBAA0B,CAAxD,aAAA,CAAA,MAAA,GAAA,SAAA,EACL,KAAS,SAAW,cAAA,CAEV,eAAgB,CACxB,OAAOC,EAAAA,WACT,CAKA,MAAM,cACJC,EACAC,EACkC,CAClC,MAAMC,EAAM,KAAK,WAAW,SAAS,GAAG,KAAK,QAAQ,SAAS,EACxDC,EAAc,MAAM,KAAK,WAAW,QAAQD,EAAK,CACrD,GAAGD,EACH,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAUD,CAAO,CAAA,CAC7B,EAED,OAAO,KAAK,iBAAiBG,EAAaC,+BAA6B,CACzE,CACF,CC9BO,MAAMC,UAA4BP,EAAAA,kBAA8B,CAAhE,aAAA,CAAA,MAAA,GAAA,SAAA,EACL,KAAS,SAAW,kBAAA,CAEV,eAAgB,CACxB,OAAOH,CACT,CACF,ijaCIaW,GAAW,QAcXC,GAAoB,CAC/B,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,GACA,GAAAC,GACA,GAAAC,EACF"}