mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-19 13:59:28 +00:00
Compare commits
1 Commits
media/view
...
fix/codera
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e935794fd4 |
@@ -3002,127 +3002,119 @@
|
|||||||
"share": "Share",
|
"share": "Share",
|
||||||
"shareTooltip": "Share workflow"
|
"shareTooltip": "Share workflow"
|
||||||
},
|
},
|
||||||
"shareWorkflow": {
|
"sharing": {
|
||||||
"shareLinkTab": "Share",
|
|
||||||
"publishToHubTab": "Publish",
|
|
||||||
"loadingTitle": "Share workflow",
|
|
||||||
"unsavedTitle": "Save workflow first",
|
|
||||||
"unsavedDescription": "You must save your workflow before sharing. Save it now to continue.",
|
|
||||||
"saveButton": "Save workflow",
|
|
||||||
"saving": "Saving...",
|
|
||||||
"workflowNameLabel": "Workflow name",
|
"workflowNameLabel": "Workflow name",
|
||||||
"createLinkTitle": "Share workflow",
|
"share": {
|
||||||
"createLinkDescription": "When you create a link for your workflow, you will share these media items along with your workflow",
|
"shareLinkTab": "Share",
|
||||||
"privateAssetsDescription": "Your workflow contains private models and/or media files",
|
"publishToHubTab": "Publish",
|
||||||
"createLinkButton": "Create a link",
|
"unsavedDescription": "You must save your workflow before sharing. Save it now to continue.",
|
||||||
"creatingLink": "Creating a link...",
|
"saveButton": "Save workflow",
|
||||||
"successTitle": "Workflow successfully published!",
|
"saving": "Saving...",
|
||||||
"successDescription": "Anyone with this link can view and use this workflow. If you make changes to this workflow, you can republish to update the shared version.",
|
"privateAssetsDescription": "Your workflow contains private models and/or media files",
|
||||||
"hasChangesTitle": "Share workflow",
|
"createLinkButton": "Create a link",
|
||||||
"hasChangesDescription": "You have made changes since this workflow was last published.",
|
"creatingLink": "Creating a link...",
|
||||||
"updateLinkButton": "Update link",
|
"successDescription": "Anyone with this link can view and use this workflow. If you make changes to this workflow, you can republish to update the shared version.",
|
||||||
"updatingLink": "Updating link...",
|
"hasChangesDescription": "You have made changes since this workflow was last published.",
|
||||||
"publishedOn": "Published on {date}",
|
"updateLinkButton": "Update link",
|
||||||
"copyLink": "Copy",
|
"updatingLink": "Updating link...",
|
||||||
"linkCopied": "Copied!",
|
"publishedOn": "Published on {date}",
|
||||||
"shareUrlLabel": "Share URL",
|
"copyLink": "Copy",
|
||||||
"loadFailed": "Failed to load shared workflow",
|
"linkCopied": "Copied!",
|
||||||
"saveFailedTitle": "Save failed",
|
"shareUrlLabel": "Share URL",
|
||||||
"saveFailedDescription": "Failed to save workflow. Please try again.",
|
"loadFailed": "Failed to load shared workflow",
|
||||||
"mediaLabel": "{count} Media File | {count} Media Files",
|
"saveFailedTitle": "Save failed",
|
||||||
"modelsLabel": "{count} Model | {count} Models",
|
"saveFailedDescription": "Failed to save workflow. Please try again.",
|
||||||
"checkingAssets": "Checking media visibility…",
|
"mediaLabel": "{count} Media File | {count} Media Files",
|
||||||
"acknowledgeCheckbox": "I understand these media items will be published and made public",
|
"modelsLabel": "{count} Model | {count} Models",
|
||||||
"inLibrary": "In library",
|
"checkingAssets": "Checking media visibility…",
|
||||||
"comfyHubTitle": "Upload to ComfyHub",
|
"acknowledgeCheckbox": "I understand these media items will be published and made public",
|
||||||
"comfyHubDescription": "ComfyHub is ComfyUI's official community hub.\nYour workflow will have a public page viewable by all.",
|
"inLibrary": "In library"
|
||||||
"comfyHubButton": "Upload to ComfyHub"
|
},
|
||||||
},
|
"open": {
|
||||||
"openSharedWorkflow": {
|
"dialogTitle": "Open shared workflow",
|
||||||
"dialogTitle": "Open shared workflow",
|
"author": "Author:",
|
||||||
"author": "Author:",
|
"copyDescription": "Opening the workflow will create a new copy in your workspace",
|
||||||
"copyDescription": "Opening the workflow will create a new copy in your workspace",
|
"nonPublicAssetsWarningLine1": "This workflow comes with non-public assets.",
|
||||||
"nonPublicAssetsWarningLine1": "This workflow comes with non-public assets.",
|
"nonPublicAssetsWarningLine2": "These will be imported to your library when you open the workflow",
|
||||||
"nonPublicAssetsWarningLine2": "These will be imported to your library when you open the workflow",
|
"copyAssetsAndOpen": "Import assets & open workflow",
|
||||||
"copyAssetsAndOpen": "Import assets & open workflow",
|
"openWorkflow": "Open workflow",
|
||||||
"openWorkflow": "Open workflow",
|
"openWithoutImporting": "Open without importing",
|
||||||
"openWithoutImporting": "Open without importing",
|
"importFailed": "Failed to import workflow assets",
|
||||||
"importFailed": "Failed to import workflow assets",
|
"loadError": "Could not load this shared workflow. Please try again later."
|
||||||
"loadError": "Could not load this shared workflow. Please try again later."
|
},
|
||||||
},
|
"publish": {
|
||||||
"comfyHubPublish": {
|
"title": "Publish to ComfyHub",
|
||||||
"title": "Publish to ComfyHub",
|
"stepDescribe": "Describe your workflow",
|
||||||
"stepDescribe": "Describe your workflow",
|
"stepExamples": "Add output examples",
|
||||||
"stepExamples": "Add output examples",
|
"stepFinish": "Finish publishing",
|
||||||
"stepFinish": "Finish publishing",
|
"workflowNamePlaceholder": "Tip: enter a descriptive name that's easy to search",
|
||||||
"workflowName": "Workflow name",
|
"workflowDescription": "Workflow description",
|
||||||
"workflowNamePlaceholder": "Tip: enter a descriptive name that's easy to search",
|
"workflowDescriptionPlaceholder": "What makes your workflow exciting and special? Be specific so people know what to expect.",
|
||||||
"workflowDescription": "Workflow description",
|
"workflowType": "Workflow type",
|
||||||
"workflowDescriptionPlaceholder": "What makes your workflow exciting and special? Be specific so people know what to expect.",
|
"workflowTypePlaceholder": "Select the type",
|
||||||
"workflowType": "Workflow type",
|
"workflowTypeImageGeneration": "Image generation",
|
||||||
"workflowTypePlaceholder": "Select the type",
|
"workflowTypeVideoGeneration": "Video generation",
|
||||||
"workflowTypeImageGeneration": "Image generation",
|
"workflowTypeUpscaling": "Upscaling",
|
||||||
"workflowTypeVideoGeneration": "Video generation",
|
"workflowTypeEditing": "Editing",
|
||||||
"workflowTypeUpscaling": "Upscaling",
|
"tags": "Tags",
|
||||||
"workflowTypeEditing": "Editing",
|
"tagsDescription": "Select tags so people can find your workflow faster",
|
||||||
"tags": "Tags",
|
"tagsPlaceholder": "Enter tags that match your workflow to help people find it e.g #nanobanana, #anime or #faceswap",
|
||||||
"tagsDescription": "Select tags so people can find your workflow faster",
|
"selectAThumbnail": "Select a thumbnail",
|
||||||
"tagsPlaceholder": "Enter tags that match your workflow to help people find it e.g #nanobanana, #anime or #faceswap",
|
"showMoreTags": "Show more...",
|
||||||
"selectAThumbnail": "Select a thumbnail",
|
"showLessTags": "Show less...",
|
||||||
"showMoreTags": "Show more...",
|
"suggestedTags": "Suggested tags",
|
||||||
"showLessTags": "Show less...",
|
"thumbnailImage": "Image",
|
||||||
"suggestedTags": "Suggested tags",
|
"thumbnailVideo": "Video",
|
||||||
"thumbnailImage": "Image",
|
"thumbnailImageComparison": "Image comparison",
|
||||||
"thumbnailVideo": "Video",
|
"uploadThumbnail": "Upload an image",
|
||||||
"thumbnailImageComparison": "Image comparison",
|
"uploadVideo": "Upload a video",
|
||||||
"uploadThumbnail": "Upload an image",
|
"uploadComparison": "Upload before and after",
|
||||||
"uploadVideo": "Upload a video",
|
"thumbnailPreview": "Thumbnail preview",
|
||||||
"uploadComparison": "Upload before and after",
|
"uploadPromptClickToBrowse": "Click to browse or",
|
||||||
"thumbnailPreview": "Thumbnail preview",
|
"uploadPromptDropImage": "drop an image here",
|
||||||
"uploadPromptClickToBrowse": "Click to browse or",
|
"uploadPromptDropVideo": "drop a video here",
|
||||||
"uploadPromptDropImage": "drop an image here",
|
"uploadComparisonBeforePrompt": "Before",
|
||||||
"uploadPromptDropVideo": "drop a video here",
|
"uploadComparisonAfterPrompt": "After",
|
||||||
"uploadComparisonBeforePrompt": "Before",
|
"uploadThumbnailHint": "1:1 preferred, 1080p max",
|
||||||
"uploadComparisonAfterPrompt": "After",
|
"back": "Back",
|
||||||
"uploadThumbnailHint": "1:1 preferred, 1080p max",
|
"next": "Next",
|
||||||
"back": "Back",
|
"publishButton": "Publish to ComfyHub",
|
||||||
"next": "Next",
|
"examplesDescription": "Add up to {total} additional sample images",
|
||||||
"publishButton": "Publish to ComfyHub",
|
"uploadAnImage": "Click to browse or drag an image",
|
||||||
"examplesDescription": "Add up to {total} additional sample images",
|
"uploadExampleImage": "Upload example image",
|
||||||
"uploadAnImage": "Click to browse or drag an image",
|
"exampleImage": "Example image {index}",
|
||||||
"uploadExampleImage": "Upload example image",
|
"videoPreview": "Video thumbnail preview",
|
||||||
"exampleImage": "Example image {index}",
|
"maxExamples": "You can select up to {max} examples",
|
||||||
"videoPreview": "Video thumbnail preview",
|
"createProfileToPublish": "Create a profile to publish to ComfyHub",
|
||||||
"maxExamples": "You can select up to {max} examples",
|
"createProfileCta": "Create a profile"
|
||||||
"createProfileToPublish": "Create a profile to publish to ComfyHub",
|
},
|
||||||
"createProfileCta": "Create a profile"
|
"profile": {
|
||||||
},
|
"checkingAccess": "Checking your publishing access...",
|
||||||
"comfyHubProfile": {
|
"profileCreationNav": "Profile creation",
|
||||||
"checkingAccess": "Checking your publishing access...",
|
"introTitle": "Publish to the ComfyHub",
|
||||||
"profileCreationNav": "Profile creation",
|
"introDescription": "Publish your workflows, build your portfolio and get discovered by millions of users",
|
||||||
"introTitle": "Publish to the ComfyHub",
|
"introSubtitle": "To share your workflow on ComfyHub, let's first create your profile.",
|
||||||
"introDescription": "Publish your workflows, build your portfolio and get discovered by millions of users",
|
"createProfileButton": "Create my profile",
|
||||||
"introSubtitle": "To share your workflow on ComfyHub, let's first create your profile.",
|
"startPublishingButton": "Start publishing",
|
||||||
"createProfileButton": "Create my profile",
|
"modalTitle": "Create your profile on ComfyHub",
|
||||||
"startPublishingButton": "Start publishing",
|
"createProfileTitle": "Create your Comfy Hub profile",
|
||||||
"modalTitle": "Create your profile on ComfyHub",
|
"uploadCover": "+ Upload a cover",
|
||||||
"createProfileTitle": "Create your Comfy Hub profile",
|
"uploadProfilePicture": "+ Upload a profile picture",
|
||||||
"uploadCover": "+ Upload a cover",
|
"chooseProfilePicture": "Choose a profile picture",
|
||||||
"uploadProfilePicture": "+ Upload a profile picture",
|
"nameLabel": "Your name",
|
||||||
"chooseProfilePicture": "Choose a profile picture",
|
"namePlaceholder": "Enter your name here",
|
||||||
"nameLabel": "Your name",
|
"usernameLabel": "Your username (required)",
|
||||||
"namePlaceholder": "Enter your name here",
|
"usernamePlaceholder": "@",
|
||||||
"usernameLabel": "Your username (required)",
|
"descriptionLabel": "Your description",
|
||||||
"usernamePlaceholder": "@",
|
"descriptionPlaceholder": "Tell the community about yourself...",
|
||||||
"descriptionLabel": "Your description",
|
"createProfile": "Create profile",
|
||||||
"descriptionPlaceholder": "Tell the community about yourself...",
|
"creatingProfile": "Creating profile...",
|
||||||
"createProfile": "Create profile",
|
"successTitle": "Looking good, {'@'}{username}!",
|
||||||
"creatingProfile": "Creating profile...",
|
"successProfileUrl": "Your profile page is live at",
|
||||||
"successTitle": "Looking good, {'@'}{username}!",
|
"successProfileLink": "comfy.com/p/{username}",
|
||||||
"successProfileUrl": "Your profile page is live at",
|
"successDescription": "You can now upload your workflow to your creator page",
|
||||||
"successProfileLink": "comfy.com/p/{username}",
|
"uploadWorkflowButton": "Upload my workflow"
|
||||||
"successDescription": "You can now upload your workflow to your creator page",
|
}
|
||||||
"uploadWorkflowButton": "Upload my workflow"
|
|
||||||
},
|
},
|
||||||
"desktopDialogs": {
|
"desktopDialogs": {
|
||||||
"": {
|
"": {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
v-if="item.in_library"
|
v-if="item.in_library"
|
||||||
class="ml-auto shrink-0 text-xs text-muted-foreground"
|
class="ml-auto shrink-0 text-xs text-muted-foreground"
|
||||||
>
|
>
|
||||||
{{ $t('shareWorkflow.inLibrary') }}
|
{{ $t('sharing.share.inLibrary') }}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -20,23 +20,25 @@ const i18n = createI18n({
|
|||||||
messages: {
|
messages: {
|
||||||
en: {
|
en: {
|
||||||
g: { close: 'Close', cancel: 'Cancel' },
|
g: { close: 'Close', cancel: 'Cancel' },
|
||||||
openSharedWorkflow: {
|
sharing: {
|
||||||
dialogTitle: 'Open shared workflow',
|
open: {
|
||||||
copyDescription:
|
dialogTitle: 'Open shared workflow',
|
||||||
'Opening the workflow will create a new copy in your workspace',
|
copyDescription:
|
||||||
nonPublicAssetsWarningLine1:
|
'Opening the workflow will create a new copy in your workspace',
|
||||||
'This workflow comes with non-public assets.',
|
nonPublicAssetsWarningLine1:
|
||||||
nonPublicAssetsWarningLine2:
|
'This workflow comes with non-public assets.',
|
||||||
'These will be added to your library when you open the workflow',
|
nonPublicAssetsWarningLine2:
|
||||||
copyAssetsAndOpen: 'Copy assets & open workflow',
|
'These will be added to your library when you open the workflow',
|
||||||
openWorkflow: 'Open workflow',
|
copyAssetsAndOpen: 'Copy assets & open workflow',
|
||||||
openWithoutImporting: 'Open without importing',
|
openWorkflow: 'Open workflow',
|
||||||
loadError:
|
openWithoutImporting: 'Open without importing',
|
||||||
'Could not load this shared workflow. Please try again later.'
|
loadError:
|
||||||
},
|
'Could not load this shared workflow. Please try again later.'
|
||||||
shareWorkflow: {
|
},
|
||||||
mediaLabel: '{count} Media File | {count} Media Files',
|
share: {
|
||||||
modelsLabel: '{count} Model | {count} Models'
|
mediaLabel: '{count} Media File | {count} Media Files',
|
||||||
|
modelsLabel: '{count} Model | {count} Models'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
class="flex h-12 items-center justify-between gap-2 border-b border-border-default px-4"
|
class="flex h-12 items-center justify-between gap-2 border-b border-border-default px-4"
|
||||||
>
|
>
|
||||||
<h2 class="text-sm text-base-foreground">
|
<h2 class="text-sm text-base-foreground">
|
||||||
{{ $t('openSharedWorkflow.dialogTitle') }}
|
{{ $t('sharing.open.dialogTitle') }}
|
||||||
</h2>
|
</h2>
|
||||||
<Button size="icon" :aria-label="$t('g.close')" @click="onCancel">
|
<Button size="icon" :aria-label="$t('g.close')" @click="onCancel">
|
||||||
<i class="icon-[lucide--x] size-4" />
|
<i class="icon-[lucide--x] size-4" />
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<p class="m-0 text-center text-sm text-muted-foreground">
|
<p class="m-0 text-center text-sm text-muted-foreground">
|
||||||
{{ $t('openSharedWorkflow.loadError') }}
|
{{ $t('sharing.open.loadError') }}
|
||||||
</p>
|
</p>
|
||||||
</main>
|
</main>
|
||||||
<footer
|
<footer
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
{{ workflowName }}
|
{{ workflowName }}
|
||||||
</h2>
|
</h2>
|
||||||
<p class="m-0 text-sm text-muted-foreground">
|
<p class="m-0 text-sm text-muted-foreground">
|
||||||
{{ $t('openSharedWorkflow.copyDescription') }}
|
{{ $t('sharing.open.copyDescription') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
<span
|
<span
|
||||||
class="m-0 flex-1 text-left text-sm text-muted-foreground"
|
class="m-0 flex-1 text-left text-sm text-muted-foreground"
|
||||||
>
|
>
|
||||||
{{ $t('openSharedWorkflow.nonPublicAssetsWarningLine1') }}
|
{{ $t('sharing.open.nonPublicAssetsWarningLine1') }}
|
||||||
</span>
|
</span>
|
||||||
<i
|
<i
|
||||||
:class="
|
:class="
|
||||||
@@ -111,13 +111,13 @@
|
|||||||
size="lg"
|
size="lg"
|
||||||
@click="onOpenWithoutImporting(sharedWorkflow)"
|
@click="onOpenWithoutImporting(sharedWorkflow)"
|
||||||
>
|
>
|
||||||
{{ $t('openSharedWorkflow.openWithoutImporting') }}
|
{{ $t('sharing.open.openWithoutImporting') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="primary" size="lg" @click="onConfirm(sharedWorkflow)">
|
<Button variant="primary" size="lg" @click="onConfirm(sharedWorkflow)">
|
||||||
{{
|
{{
|
||||||
hasAssets
|
hasAssets
|
||||||
? $t('openSharedWorkflow.copyAssetsAndOpen')
|
? $t('sharing.open.copyAssetsAndOpen')
|
||||||
: $t('openSharedWorkflow.openWorkflow')
|
: $t('sharing.open.openWorkflow')
|
||||||
}}
|
}}
|
||||||
</Button>
|
</Button>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -12,12 +12,15 @@ const i18n = createI18n({
|
|||||||
locale: 'en',
|
locale: 'en',
|
||||||
messages: {
|
messages: {
|
||||||
en: {
|
en: {
|
||||||
shareWorkflow: {
|
sharing: {
|
||||||
privateAssetsDescription:
|
share: {
|
||||||
'Your workflow contains private models and/or media files',
|
privateAssetsDescription:
|
||||||
mediaLabel: '{count} Media File | {count} Media Files',
|
'Your workflow contains private models and/or media files',
|
||||||
modelsLabel: '{count} Model | {count} Models',
|
mediaLabel: '{count} Media File | {count} Media Files',
|
||||||
acknowledgeCheckbox: 'I understand these assets...'
|
modelsLabel: '{count} Model | {count} Models',
|
||||||
|
acknowledgeCheckbox: 'I understand these assets...',
|
||||||
|
inLibrary: 'In library'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<span class="m-0 flex-1 text-left text-sm text-muted-foreground">
|
<span class="m-0 flex-1 text-left text-sm text-muted-foreground">
|
||||||
{{ $t('shareWorkflow.privateAssetsDescription') }}
|
{{ $t('sharing.share.privateAssetsDescription') }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<i
|
<i
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
class="size-3.5 shrink-0 cursor-pointer accent-primary-background"
|
class="size-3.5 shrink-0 cursor-pointer accent-primary-background"
|
||||||
/>
|
/>
|
||||||
<span class="text-sm text-muted-foreground">
|
<span class="text-sm text-muted-foreground">
|
||||||
{{ $t('shareWorkflow.acknowledgeCheckbox') }}
|
{{ $t('sharing.share.acknowledgeCheckbox') }}
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<Input
|
<Input
|
||||||
readonly
|
readonly
|
||||||
:model-value="url"
|
:model-value="url"
|
||||||
:aria-label="$t('shareWorkflow.shareUrlLabel')"
|
:aria-label="$t('sharing.share.shareUrlLabel')"
|
||||||
class="flex-1"
|
class="flex-1"
|
||||||
@focus="($event.target as HTMLInputElement).select()"
|
@focus="($event.target as HTMLInputElement).select()"
|
||||||
/>
|
/>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
@click="handleCopy"
|
@click="handleCopy"
|
||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
copied ? $t('shareWorkflow.linkCopied') : $t('shareWorkflow.copyLink')
|
copied ? $t('sharing.share.linkCopied') : $t('sharing.share.copyLink')
|
||||||
}}
|
}}
|
||||||
<i class="icon-[lucide--link] size-3.5" aria-hidden="true" />
|
<i class="icon-[lucide--link] size-3.5" aria-hidden="true" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -102,30 +102,32 @@ const i18n = createI18n({
|
|||||||
messages: {
|
messages: {
|
||||||
en: {
|
en: {
|
||||||
g: { close: 'Close', error: 'Error' },
|
g: { close: 'Close', error: 'Error' },
|
||||||
shareWorkflow: {
|
sharing: {
|
||||||
unsavedDescription: 'You must save your workflow before sharing.',
|
|
||||||
shareLinkTab: 'Share',
|
|
||||||
publishToHubTab: 'Publish',
|
|
||||||
workflowNameLabel: 'Workflow name',
|
workflowNameLabel: 'Workflow name',
|
||||||
saving: 'Saving...',
|
share: {
|
||||||
saveButton: 'Save workflow',
|
unsavedDescription: 'You must save your workflow before sharing.',
|
||||||
createLinkButton: 'Create link',
|
shareLinkTab: 'Share',
|
||||||
creatingLink: 'Creating link...',
|
publishToHubTab: 'Publish',
|
||||||
checkingAssets: 'Checking assets...',
|
saving: 'Saving...',
|
||||||
successDescription: 'Anyone with this link...',
|
saveButton: 'Save workflow',
|
||||||
hasChangesDescription: 'You have made changes...',
|
createLinkButton: 'Create link',
|
||||||
updateLinkButton: 'Update link',
|
creatingLink: 'Creating link...',
|
||||||
updatingLink: 'Updating link...',
|
checkingAssets: 'Checking assets...',
|
||||||
publishedOn: 'Published on {date}',
|
successDescription: 'Anyone with this link...',
|
||||||
mediaLabel: '{count} Media File | {count} Media Files',
|
hasChangesDescription: 'You have made changes...',
|
||||||
modelsLabel: '{count} Model | {count} Models',
|
updateLinkButton: 'Update link',
|
||||||
acknowledgeCheckbox: 'I understand these assets...',
|
updatingLink: 'Updating link...',
|
||||||
loadFailed: 'Failed to load publish status'
|
publishedOn: 'Published on {date}',
|
||||||
},
|
mediaLabel: '{count} Media File | {count} Media Files',
|
||||||
comfyHubProfile: {
|
modelsLabel: '{count} Model | {count} Models',
|
||||||
introTitle: 'Introducing ComfyHub',
|
acknowledgeCheckbox: 'I understand these assets...',
|
||||||
createProfileButton: 'Create my profile',
|
loadFailed: 'Failed to load publish status'
|
||||||
startPublishingButton: 'Start publishing'
|
},
|
||||||
|
profile: {
|
||||||
|
introTitle: 'Introducing ComfyHub',
|
||||||
|
createProfileButton: 'Create my profile',
|
||||||
|
startPublishingButton: 'Start publishing'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
:class="tabButtonClass('shareLink')"
|
:class="tabButtonClass('shareLink')"
|
||||||
@click="handleDialogModeChange('shareLink')"
|
@click="handleDialogModeChange('shareLink')"
|
||||||
>
|
>
|
||||||
{{ $t('shareWorkflow.shareLinkTab') }}
|
{{ $t('sharing.share.shareLinkTab') }}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
id="tab-publish"
|
id="tab-publish"
|
||||||
@@ -25,11 +25,11 @@
|
|||||||
@click="handleDialogModeChange('publishToHub')"
|
@click="handleDialogModeChange('publishToHub')"
|
||||||
>
|
>
|
||||||
<i class="icon-[lucide--globe] size-4" aria-hidden="true" />
|
<i class="icon-[lucide--globe] size-4" aria-hidden="true" />
|
||||||
{{ $t('shareWorkflow.publishToHubTab') }}
|
{{ $t('sharing.share.publishToHubTab') }}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="select-none">
|
<div v-else class="select-none">
|
||||||
{{ $t('shareWorkflow.shareLinkTab') }}
|
{{ $t('sharing.share.shareLinkTab') }}
|
||||||
</div>
|
</div>
|
||||||
<Button size="icon" :aria-label="$t('g.close')" @click="onClose">
|
<Button size="icon" :aria-label="$t('g.close')" @click="onClose">
|
||||||
<i class="icon-[lucide--x] size-4" />
|
<i class="icon-[lucide--x] size-4" />
|
||||||
@@ -52,11 +52,11 @@
|
|||||||
|
|
||||||
<template v-if="dialogState === 'unsaved'">
|
<template v-if="dialogState === 'unsaved'">
|
||||||
<p class="m-0 text-sm text-muted-foreground">
|
<p class="m-0 text-sm text-muted-foreground">
|
||||||
{{ $t('shareWorkflow.unsavedDescription') }}
|
{{ $t('sharing.share.unsavedDescription') }}
|
||||||
</p>
|
</p>
|
||||||
<label v-if="isTemporary" class="flex flex-col gap-1">
|
<label v-if="isTemporary" class="flex flex-col gap-1">
|
||||||
<span class="text-sm font-medium text-muted-foreground">
|
<span class="text-sm font-medium text-muted-foreground">
|
||||||
{{ $t('shareWorkflow.workflowNameLabel') }}
|
{{ $t('sharing.workflowNameLabel') }}
|
||||||
</span>
|
</span>
|
||||||
<Input
|
<Input
|
||||||
ref="nameInputRef"
|
ref="nameInputRef"
|
||||||
@@ -73,8 +73,8 @@
|
|||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
isSaving
|
isSaving
|
||||||
? $t('shareWorkflow.saving')
|
? $t('sharing.share.saving')
|
||||||
: $t('shareWorkflow.saveButton')
|
: $t('sharing.share.saveButton')
|
||||||
}}
|
}}
|
||||||
</Button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
@@ -84,13 +84,13 @@
|
|||||||
v-if="dialogState === 'stale'"
|
v-if="dialogState === 'stale'"
|
||||||
class="m-0 text-xs text-muted-foreground"
|
class="m-0 text-xs text-muted-foreground"
|
||||||
>
|
>
|
||||||
{{ $t('shareWorkflow.hasChangesDescription') }}
|
{{ $t('sharing.share.hasChangesDescription') }}
|
||||||
</p>
|
</p>
|
||||||
<p
|
<p
|
||||||
v-if="isLoadingAssets"
|
v-if="isLoadingAssets"
|
||||||
class="m-0 text-sm text-muted-foreground italic"
|
class="m-0 text-sm text-muted-foreground italic"
|
||||||
>
|
>
|
||||||
{{ $t('shareWorkflow.checkingAssets') }}
|
{{ $t('sharing.share.checkingAssets') }}
|
||||||
</p>
|
</p>
|
||||||
<ShareAssetWarningBox
|
<ShareAssetWarningBox
|
||||||
v-else-if="requiresAcknowledgment"
|
v-else-if="requiresAcknowledgment"
|
||||||
@@ -118,10 +118,10 @@
|
|||||||
v-if="publishResult.publishedAt"
|
v-if="publishResult.publishedAt"
|
||||||
class="m-0 text-xs text-muted-foreground"
|
class="m-0 text-xs text-muted-foreground"
|
||||||
>
|
>
|
||||||
{{ $t('shareWorkflow.publishedOn', { date: formattedDate }) }}
|
{{ $t('sharing.share.publishedOn', { date: formattedDate }) }}
|
||||||
</p>
|
</p>
|
||||||
<p class="m-0 text-xs text-muted-foreground">
|
<p class="m-0 text-xs text-muted-foreground">
|
||||||
{{ $t('shareWorkflow.successDescription') }}
|
{{ $t('sharing.share.successDescription') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -272,12 +272,12 @@ const formattedDate = computed(() => {
|
|||||||
const publishButtonLabel = computed(() => {
|
const publishButtonLabel = computed(() => {
|
||||||
if (dialogState.value === 'stale') {
|
if (dialogState.value === 'stale') {
|
||||||
return isPublishing.value
|
return isPublishing.value
|
||||||
? t('shareWorkflow.updatingLink')
|
? t('sharing.share.updatingLink')
|
||||||
: t('shareWorkflow.updateLinkButton')
|
: t('sharing.share.updateLinkButton')
|
||||||
}
|
}
|
||||||
return isPublishing.value
|
return isPublishing.value
|
||||||
? t('shareWorkflow.creatingLink')
|
? t('sharing.share.creatingLink')
|
||||||
: t('shareWorkflow.createLinkButton')
|
: t('sharing.share.createLinkButton')
|
||||||
})
|
})
|
||||||
|
|
||||||
function stripJsonExtension(filename: string): string {
|
function stripJsonExtension(filename: string): string {
|
||||||
@@ -315,7 +315,7 @@ async function refreshDialogState() {
|
|||||||
dialogState.value = 'ready'
|
dialogState.value = 'ready'
|
||||||
toast.add({
|
toast.add({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
summary: t('shareWorkflow.loadFailed')
|
summary: t('sharing.share.loadFailed')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -351,8 +351,8 @@ const { isLoading: isSaving, execute: handleSave } = useAsyncState(
|
|||||||
console.error('Failed to save workflow:', error)
|
console.error('Failed to save workflow:', error)
|
||||||
toast.add({
|
toast.add({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
summary: t('shareWorkflow.saveFailedTitle'),
|
summary: t('sharing.share.saveFailedTitle'),
|
||||||
detail: t('shareWorkflow.saveFailedDescription'),
|
detail: t('sharing.share.saveFailedDescription'),
|
||||||
life: 5000
|
life: 5000
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,20 +8,20 @@
|
|||||||
class="flex h-16 items-center justify-between px-6"
|
class="flex h-16 items-center justify-between px-6"
|
||||||
>
|
>
|
||||||
<h2 class="text-base font-normal text-base-foreground">
|
<h2 class="text-base font-normal text-base-foreground">
|
||||||
{{ $t('comfyHubProfile.createProfileTitle') }}
|
{{ $t('sharing.profile.createProfileTitle') }}
|
||||||
</h2>
|
</h2>
|
||||||
<Button size="icon" :aria-label="$t('g.close')" @click="onClose">
|
<Button size="icon" :aria-label="$t('g.close')" @click="onClose">
|
||||||
<i class="icon-[lucide--x] size-4" />
|
<i class="icon-[lucide--x] size-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</header>
|
</header>
|
||||||
<h2 v-else class="px-6 pt-6 text-base font-normal text-base-foreground">
|
<h2 v-else class="px-6 pt-6 text-base font-normal text-base-foreground">
|
||||||
{{ $t('comfyHubProfile.createProfileTitle') }}
|
{{ $t('sharing.profile.createProfileTitle') }}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div class="flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-6 py-4">
|
<div class="flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-6 py-4">
|
||||||
<div class="flex flex-col gap-4">
|
<div class="flex flex-col gap-4">
|
||||||
<label for="profile-picture" class="text-sm text-muted-foreground">
|
<label for="profile-picture" class="text-sm text-muted-foreground">
|
||||||
{{ $t('comfyHubProfile.chooseProfilePicture') }}
|
{{ $t('sharing.profile.chooseProfilePicture') }}
|
||||||
</label>
|
</label>
|
||||||
<label
|
<label
|
||||||
class="flex size-13 cursor-pointer items-center justify-center overflow-hidden rounded-full bg-linear-to-b from-green-600/50 to-green-900"
|
class="flex size-13 cursor-pointer items-center justify-center overflow-hidden rounded-full bg-linear-to-b from-green-600/50 to-green-900"
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<template v-if="profilePreviewUrl">
|
<template v-if="profilePreviewUrl">
|
||||||
<img
|
<img
|
||||||
:src="profilePreviewUrl"
|
:src="profilePreviewUrl"
|
||||||
:alt="$t('comfyHubProfile.chooseProfilePicture')"
|
:alt="$t('sharing.profile.chooseProfilePicture')"
|
||||||
class="size-full rounded-full object-cover"
|
class="size-full rounded-full object-cover"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
@@ -51,18 +51,18 @@
|
|||||||
<div class="flex flex-col gap-6">
|
<div class="flex flex-col gap-6">
|
||||||
<div class="flex flex-col gap-4">
|
<div class="flex flex-col gap-4">
|
||||||
<label for="profile-name" class="text-sm text-muted-foreground">
|
<label for="profile-name" class="text-sm text-muted-foreground">
|
||||||
{{ $t('comfyHubProfile.nameLabel') }}
|
{{ $t('sharing.profile.nameLabel') }}
|
||||||
</label>
|
</label>
|
||||||
<Input
|
<Input
|
||||||
id="profile-name"
|
id="profile-name"
|
||||||
v-model="name"
|
v-model="name"
|
||||||
:placeholder="$t('comfyHubProfile.namePlaceholder')"
|
:placeholder="$t('sharing.profile.namePlaceholder')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<label for="profile-username" class="text-sm text-muted-foreground">
|
<label for="profile-username" class="text-sm text-muted-foreground">
|
||||||
{{ $t('comfyHubProfile.usernameLabel') }}
|
{{ $t('sharing.profile.usernameLabel') }}
|
||||||
</label>
|
</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<span
|
<span
|
||||||
@@ -84,12 +84,12 @@
|
|||||||
for="profile-description"
|
for="profile-description"
|
||||||
class="text-sm text-muted-foreground"
|
class="text-sm text-muted-foreground"
|
||||||
>
|
>
|
||||||
{{ $t('comfyHubProfile.descriptionLabel') }}
|
{{ $t('sharing.profile.descriptionLabel') }}
|
||||||
</label>
|
</label>
|
||||||
<Textarea
|
<Textarea
|
||||||
id="profile-description"
|
id="profile-description"
|
||||||
v-model="description"
|
v-model="description"
|
||||||
:placeholder="$t('comfyHubProfile.descriptionPlaceholder')"
|
:placeholder="$t('sharing.profile.descriptionPlaceholder')"
|
||||||
class="h-24 resize-none rounded-lg border-none bg-secondary-background p-4 text-sm shadow-none"
|
class="h-24 resize-none rounded-lg border-none bg-secondary-background p-4 text-sm shadow-none"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -110,8 +110,8 @@
|
|||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
isCreating
|
isCreating
|
||||||
? $t('comfyHubProfile.creatingProfile')
|
? $t('sharing.profile.creatingProfile')
|
||||||
: $t('comfyHubProfile.createProfile')
|
: $t('sharing.profile.createProfile')
|
||||||
}}
|
}}
|
||||||
</Button>
|
</Button>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
<!-- Content -->
|
<!-- Content -->
|
||||||
<section class="flex flex-col items-center gap-4 px-4 pt-4 pb-6">
|
<section class="flex flex-col items-center gap-4 px-4 pt-4 pb-6">
|
||||||
<h2 class="m-0 text-base font-semibold text-base-foreground">
|
<h2 class="m-0 text-base font-semibold text-base-foreground">
|
||||||
{{ $t('comfyHubProfile.introTitle') }}
|
{{ $t('sharing.profile.introTitle') }}
|
||||||
</h2>
|
</h2>
|
||||||
<p class="m-0 text-center text-sm text-muted-foreground">
|
<p class="m-0 text-center text-sm text-muted-foreground">
|
||||||
{{ $t('comfyHubProfile.introDescription') }}
|
{{ $t('sharing.profile.introDescription') }}
|
||||||
</p>
|
</p>
|
||||||
<Button
|
<Button
|
||||||
variant="primary"
|
variant="primary"
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
class="mt-2 w-full"
|
class="mt-2 w-full"
|
||||||
@click="onCreateProfile"
|
@click="onCreateProfile"
|
||||||
>
|
>
|
||||||
{{ $t('comfyHubProfile.startPublishingButton') }}
|
{{ $t('sharing.profile.startPublishingButton') }}
|
||||||
</Button>
|
</Button>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,22 +2,22 @@
|
|||||||
<div class="flex min-h-0 flex-1 flex-col gap-6 px-6 py-4">
|
<div class="flex min-h-0 flex-1 flex-col gap-6 px-6 py-4">
|
||||||
<label class="flex flex-col gap-2">
|
<label class="flex flex-col gap-2">
|
||||||
<span class="text-sm text-base-foreground">
|
<span class="text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubPublish.workflowName') }}
|
{{ $t('sharing.workflowNameLabel') }}
|
||||||
</span>
|
</span>
|
||||||
<Input
|
<Input
|
||||||
:model-value="name"
|
:model-value="name"
|
||||||
:placeholder="$t('comfyHubPublish.workflowNamePlaceholder')"
|
:placeholder="$t('sharing.publish.workflowNamePlaceholder')"
|
||||||
@update:model-value="$emit('update:name', String($event))"
|
@update:model-value="$emit('update:name', String($event))"
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label class="flex flex-col gap-2">
|
<label class="flex flex-col gap-2">
|
||||||
<span class="text-sm text-base-foreground">
|
<span class="text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubPublish.workflowDescription') }}
|
{{ $t('sharing.publish.workflowDescription') }}
|
||||||
</span>
|
</span>
|
||||||
<Textarea
|
<Textarea
|
||||||
:model-value="description"
|
:model-value="description"
|
||||||
:placeholder="$t('comfyHubPublish.workflowDescriptionPlaceholder')"
|
:placeholder="$t('sharing.publish.workflowDescriptionPlaceholder')"
|
||||||
rows="5"
|
rows="5"
|
||||||
@update:model-value="$emit('update:description', String($event))"
|
@update:model-value="$emit('update:description', String($event))"
|
||||||
/>
|
/>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
<label class="flex flex-col gap-2">
|
<label class="flex flex-col gap-2">
|
||||||
<span class="text-sm text-base-foreground">
|
<span class="text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubPublish.workflowType') }}
|
{{ $t('sharing.publish.workflowType') }}
|
||||||
</span>
|
</span>
|
||||||
<Select
|
<Select
|
||||||
:model-value="workflowType"
|
:model-value="workflowType"
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
>
|
>
|
||||||
<SelectTrigger>
|
<SelectTrigger>
|
||||||
<SelectValue
|
<SelectValue
|
||||||
:placeholder="$t('comfyHubPublish.workflowTypePlaceholder')"
|
:placeholder="$t('sharing.publish.workflowTypePlaceholder')"
|
||||||
/>
|
/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
<fieldset class="flex flex-col gap-2">
|
<fieldset class="flex flex-col gap-2">
|
||||||
<legend class="text-sm text-base-foreground">
|
<legend class="text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubPublish.tagsDescription') }}
|
{{ $t('sharing.publish.tagsDescription') }}
|
||||||
</legend>
|
</legend>
|
||||||
<TagsInput
|
<TagsInput
|
||||||
v-slot="{ isEmpty }"
|
v-slot="{ isEmpty }"
|
||||||
@@ -97,8 +97,8 @@
|
|||||||
{{
|
{{
|
||||||
$t(
|
$t(
|
||||||
showAllSuggestions
|
showAllSuggestions
|
||||||
? 'comfyHubPublish.showLessTags'
|
? 'sharing.publish.showLessTags'
|
||||||
: 'comfyHubPublish.showMoreTags'
|
: 'sharing.publish.showMoreTags'
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -146,19 +146,19 @@ const { t } = useI18n()
|
|||||||
const workflowTypeOptions = computed(() => [
|
const workflowTypeOptions = computed(() => [
|
||||||
{
|
{
|
||||||
value: 'imageGeneration',
|
value: 'imageGeneration',
|
||||||
label: t('comfyHubPublish.workflowTypeImageGeneration')
|
label: t('sharing.publish.workflowTypeImageGeneration')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'videoGeneration',
|
value: 'videoGeneration',
|
||||||
label: t('comfyHubPublish.workflowTypeVideoGeneration')
|
label: t('sharing.publish.workflowTypeVideoGeneration')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'upscaling',
|
value: 'upscaling',
|
||||||
label: t('comfyHubPublish.workflowTypeUpscaling')
|
label: t('sharing.publish.workflowTypeUpscaling')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'editing',
|
value: 'editing',
|
||||||
label: t('comfyHubPublish.workflowTypeEditing')
|
label: t('sharing.publish.workflowTypeEditing')
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="flex min-h-0 flex-1 flex-col gap-6">
|
<div class="flex min-h-0 flex-1 flex-col gap-6">
|
||||||
<p class="text-sm">
|
<p class="text-sm">
|
||||||
{{
|
{{
|
||||||
$t('comfyHubPublish.examplesDescription', {
|
$t('sharing.publish.examplesDescription', {
|
||||||
selected: selectedExampleIds.length,
|
selected: selectedExampleIds.length,
|
||||||
total: MAX_EXAMPLES
|
total: MAX_EXAMPLES
|
||||||
})
|
})
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<label
|
<label
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
role="button"
|
role="button"
|
||||||
:aria-label="$t('comfyHubPublish.uploadExampleImage')"
|
:aria-label="$t('sharing.publish.uploadExampleImage')"
|
||||||
class="focus-visible:outline-ring flex aspect-square h-25 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border-default text-center transition-colors hover:border-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2"
|
class="focus-visible:outline-ring flex aspect-square h-25 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-border-default text-center transition-colors hover:border-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2"
|
||||||
@dragenter.stop
|
@dragenter.stop
|
||||||
@dragleave.stop
|
@dragleave.stop
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<span class="sr-only">{{
|
<span class="sr-only">{{
|
||||||
$t('comfyHubPublish.uploadExampleImage')
|
$t('sharing.publish.uploadExampleImage')
|
||||||
}}</span>
|
}}</span>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="image.url"
|
:src="image.url"
|
||||||
:alt="$t('comfyHubPublish.exampleImage', { index: index + 1 })"
|
:alt="$t('sharing.publish.exampleImage', { index: index + 1 })"
|
||||||
class="size-full object-cover"
|
class="size-full object-cover"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex min-h-0 flex-1 flex-col gap-4 px-6 py-4">
|
<div class="flex min-h-0 flex-1 flex-col gap-4 px-6 py-4">
|
||||||
<p class="text-sm text-base-foreground">
|
<p class="text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubPublish.createProfileToPublish') }}
|
{{ $t('sharing.publish.createProfileToPublish') }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="inline-flex items-center gap-1 text-sm text-base-foreground">
|
<span class="inline-flex items-center gap-1 text-sm text-base-foreground">
|
||||||
<i class="icon-[lucide--plus] size-4" />
|
<i class="icon-[lucide--plus] size-4" />
|
||||||
{{ $t('comfyHubPublish.createProfileCta') }}
|
{{ $t('sharing.publish.createProfileCta') }}
|
||||||
</span>
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<BaseModalLayout
|
<BaseModalLayout
|
||||||
:content-title="$t('comfyHubPublish.title')"
|
:content-title="$t('sharing.publish.title')"
|
||||||
content-padding="none"
|
content-padding="none"
|
||||||
left-panel-width="16.5rem"
|
left-panel-width="16.5rem"
|
||||||
size="md"
|
size="md"
|
||||||
>
|
>
|
||||||
<template #leftPanelHeaderTitle>
|
<template #leftPanelHeaderTitle>
|
||||||
<h2 class="flex-1 text-base font-semibold select-none">
|
<h2 class="flex-1 text-base font-semibold select-none">
|
||||||
{{ $t('comfyHubPublish.title') }}
|
{{ $t('sharing.publish.title') }}
|
||||||
</h2>
|
</h2>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
<footer class="flex shrink items-center justify-between py-2">
|
<footer class="flex shrink items-center justify-between py-2">
|
||||||
<div>
|
<div>
|
||||||
<Button v-if="!isFirstStep" size="lg" @click="$emit('back')">
|
<Button v-if="!isFirstStep" size="lg" @click="$emit('back')">
|
||||||
{{ $t('comfyHubPublish.back') }}
|
{{ $t('sharing.publish.back') }}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<Button v-if="!isLastStep" size="lg" @click="$emit('next')">
|
<Button v-if="!isLastStep" size="lg" @click="$emit('next')">
|
||||||
{{ $t('comfyHubPublish.next') }}
|
{{ $t('sharing.publish.next') }}
|
||||||
<i class="icon-[lucide--chevron-right] size-4" />
|
<i class="icon-[lucide--chevron-right] size-4" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
@click="$emit('publish')"
|
@click="$emit('publish')"
|
||||||
>
|
>
|
||||||
<i class="icon-[lucide--upload] size-4" />
|
<i class="icon-[lucide--upload] size-4" />
|
||||||
{{ $t('comfyHubPublish.publishButton') }}
|
{{ $t('sharing.publish.publishButton') }}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
class="flex h-10 w-full items-center rounded-lg bg-secondary-background-selected pl-11 select-none"
|
class="flex h-10 w-full items-center rounded-lg bg-secondary-background-selected pl-11 select-none"
|
||||||
>
|
>
|
||||||
<span class="truncate text-sm text-base-foreground">
|
<span class="truncate text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubProfile.profileCreationNav') }}
|
{{ $t('sharing.profile.profileCreationNav') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@@ -89,14 +89,14 @@ const steps = [
|
|||||||
{
|
{
|
||||||
name: 'describe' as const,
|
name: 'describe' as const,
|
||||||
number: 1,
|
number: 1,
|
||||||
label: t('comfyHubPublish.stepDescribe')
|
label: t('sharing.publish.stepDescribe')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'examples' as const,
|
name: 'examples' as const,
|
||||||
number: 2,
|
number: 2,
|
||||||
label: t('comfyHubPublish.stepExamples')
|
label: t('sharing.publish.stepExamples')
|
||||||
},
|
},
|
||||||
{ name: 'finish' as const, number: 3, label: t('comfyHubPublish.stepFinish') }
|
{ name: 'finish' as const, number: 3, label: t('sharing.publish.stepFinish') }
|
||||||
]
|
]
|
||||||
|
|
||||||
const isProfileCreationFlow = computed(() => currentStep === 'profileCreation')
|
const isProfileCreationFlow = computed(() => currentStep === 'profileCreation')
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="flex min-h-0 flex-1 flex-col gap-6">
|
<div class="flex min-h-0 flex-1 flex-col gap-6">
|
||||||
<fieldset class="flex flex-col gap-2">
|
<fieldset class="flex flex-col gap-2">
|
||||||
<legend class="text-sm text-base-foreground">
|
<legend class="text-sm text-base-foreground">
|
||||||
{{ $t('comfyHubPublish.selectAThumbnail') }}
|
{{ $t('sharing.publish.selectAThumbnail') }}
|
||||||
</legend>
|
</legend>
|
||||||
<ToggleGroup
|
<ToggleGroup
|
||||||
type="single"
|
type="single"
|
||||||
@@ -49,12 +49,12 @@
|
|||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="comparisonPreviewUrls.after!"
|
:src="comparisonPreviewUrls.after!"
|
||||||
:alt="$t('comfyHubPublish.uploadComparisonAfterPrompt')"
|
:alt="$t('sharing.publish.uploadComparisonAfterPrompt')"
|
||||||
class="size-full object-contain"
|
class="size-full object-contain"
|
||||||
/>
|
/>
|
||||||
<img
|
<img
|
||||||
:src="comparisonPreviewUrls.before!"
|
:src="comparisonPreviewUrls.before!"
|
||||||
:alt="$t('comfyHubPublish.uploadComparisonBeforePrompt')"
|
:alt="$t('sharing.publish.uploadComparisonBeforePrompt')"
|
||||||
class="absolute inset-0 size-full object-contain"
|
class="absolute inset-0 size-full object-contain"
|
||||||
:style="{
|
:style="{
|
||||||
clipPath: `inset(0 ${100 - previewSliderPosition}% 0 0)`
|
clipPath: `inset(0 ${100 - previewSliderPosition}% 0 0)`
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
{{ slot.label }}
|
{{ slot.label }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-xs text-muted-foreground">
|
<span class="text-xs text-muted-foreground">
|
||||||
{{ $t('comfyHubPublish.uploadThumbnailHint') }}
|
{{ $t('sharing.publish.uploadThumbnailHint') }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</label>
|
</label>
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
<video
|
<video
|
||||||
v-if="isVideoFile"
|
v-if="isVideoFile"
|
||||||
:src="thumbnailPreviewUrl"
|
:src="thumbnailPreviewUrl"
|
||||||
:aria-label="$t('comfyHubPublish.videoPreview')"
|
:aria-label="$t('sharing.publish.videoPreview')"
|
||||||
class="max-h-full max-w-full object-contain"
|
class="max-h-full max-w-full object-contain"
|
||||||
muted
|
muted
|
||||||
loop
|
loop
|
||||||
@@ -158,19 +158,19 @@
|
|||||||
<img
|
<img
|
||||||
v-else
|
v-else
|
||||||
:src="thumbnailPreviewUrl"
|
:src="thumbnailPreviewUrl"
|
||||||
:alt="$t('comfyHubPublish.thumbnailPreview')"
|
:alt="$t('sharing.publish.thumbnailPreview')"
|
||||||
class="max-h-full max-w-full object-contain"
|
class="max-h-full max-w-full object-contain"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span class="text-sm text-muted-foreground">
|
<span class="text-sm text-muted-foreground">
|
||||||
{{ $t('comfyHubPublish.uploadPromptClickToBrowse') }}
|
{{ $t('sharing.publish.uploadPromptClickToBrowse') }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-sm text-muted-foreground">
|
<span class="text-sm text-muted-foreground">
|
||||||
{{ uploadDropText }}
|
{{ uploadDropText }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-xs text-muted-foreground">
|
<span class="text-xs text-muted-foreground">
|
||||||
{{ $t('comfyHubPublish.uploadThumbnailHint') }}
|
{{ $t('sharing.publish.uploadThumbnailHint') }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</label>
|
</label>
|
||||||
@@ -223,31 +223,31 @@ function handleThumbnailTypeChange(value: unknown) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const uploadSectionLabel = computed(() => {
|
const uploadSectionLabel = computed(() => {
|
||||||
if (thumbnailType === 'video') return t('comfyHubPublish.uploadVideo')
|
if (thumbnailType === 'video') return t('sharing.publish.uploadVideo')
|
||||||
if (thumbnailType === 'imageComparison') {
|
if (thumbnailType === 'imageComparison') {
|
||||||
return t('comfyHubPublish.uploadComparison')
|
return t('sharing.publish.uploadComparison')
|
||||||
}
|
}
|
||||||
return t('comfyHubPublish.uploadThumbnail')
|
return t('sharing.publish.uploadThumbnail')
|
||||||
})
|
})
|
||||||
|
|
||||||
const uploadDropText = computed(() =>
|
const uploadDropText = computed(() =>
|
||||||
thumbnailType === 'video'
|
thumbnailType === 'video'
|
||||||
? t('comfyHubPublish.uploadPromptDropVideo')
|
? t('sharing.publish.uploadPromptDropVideo')
|
||||||
: t('comfyHubPublish.uploadPromptDropImage')
|
: t('sharing.publish.uploadPromptDropImage')
|
||||||
)
|
)
|
||||||
|
|
||||||
const thumbnailOptions = [
|
const thumbnailOptions = [
|
||||||
{
|
{
|
||||||
value: 'image' as const,
|
value: 'image' as const,
|
||||||
label: t('comfyHubPublish.thumbnailImage')
|
label: t('sharing.publish.thumbnailImage')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'video' as const,
|
value: 'video' as const,
|
||||||
label: t('comfyHubPublish.thumbnailVideo')
|
label: t('sharing.publish.thumbnailVideo')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'imageComparison' as const,
|
value: 'imageComparison' as const,
|
||||||
label: t('comfyHubPublish.thumbnailImageComparison')
|
label: t('sharing.publish.thumbnailImageComparison')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -335,11 +335,11 @@ type ComparisonSlot = 'before' | 'after'
|
|||||||
const comparisonSlots = [
|
const comparisonSlots = [
|
||||||
{
|
{
|
||||||
key: 'before' as const,
|
key: 'before' as const,
|
||||||
label: t('comfyHubPublish.uploadComparisonBeforePrompt')
|
label: t('sharing.publish.uploadComparisonBeforePrompt')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'after' as const,
|
key: 'after' as const,
|
||||||
label: t('comfyHubPublish.uploadComparisonAfterPrompt')
|
label: t('sharing.publish.uploadComparisonAfterPrompt')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -17,12 +17,12 @@ export function useAssetSections(items: () => AssetInfo[]) {
|
|||||||
const allSections: AssetSection[] = [
|
const allSections: AssetSection[] = [
|
||||||
{
|
{
|
||||||
id: 'media',
|
id: 'media',
|
||||||
labelKey: 'shareWorkflow.mediaLabel',
|
labelKey: 'sharing.share.mediaLabel',
|
||||||
items: media
|
items: media
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'models',
|
id: 'models',
|
||||||
labelKey: 'shareWorkflow.modelsLabel',
|
labelKey: 'sharing.share.modelsLabel',
|
||||||
items: models
|
items: models
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -62,13 +62,13 @@ vi.mock('vue-i18n', () => ({
|
|||||||
useI18n: () => ({
|
useI18n: () => ({
|
||||||
t: vi.fn((key: string) => {
|
t: vi.fn((key: string) => {
|
||||||
if (key === 'g.error') return 'Error'
|
if (key === 'g.error') return 'Error'
|
||||||
if (key === 'shareWorkflow.loadFailed') {
|
if (key === 'sharing.share.loadFailed') {
|
||||||
return 'Failed to load shared workflow'
|
return 'Failed to load shared workflow'
|
||||||
}
|
}
|
||||||
if (key === 'openSharedWorkflow.dialogTitle') {
|
if (key === 'sharing.open.dialogTitle') {
|
||||||
return 'Open shared workflow'
|
return 'Open shared workflow'
|
||||||
}
|
}
|
||||||
if (key === 'openSharedWorkflow.importFailed') {
|
if (key === 'sharing.open.importFailed') {
|
||||||
return 'Failed to import workflow assets'
|
return 'Failed to import workflow assets'
|
||||||
}
|
}
|
||||||
return key
|
return key
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ export function useSharedWorkflowUrlLoader() {
|
|||||||
toast.add({
|
toast.add({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
summary: t('g.error'),
|
summary: t('g.error'),
|
||||||
detail: t('shareWorkflow.loadFailed'),
|
detail: t('sharing.share.loadFailed'),
|
||||||
life: 3000
|
life: 3000
|
||||||
})
|
})
|
||||||
cleanupUrlParams()
|
cleanupUrlParams()
|
||||||
@@ -135,7 +135,7 @@ export function useSharedWorkflowUrlLoader() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { payload } = result
|
const { payload } = result
|
||||||
const workflowName = payload.name || t('openSharedWorkflow.dialogTitle')
|
const workflowName = payload.name || t('sharing.open.dialogTitle')
|
||||||
const nonOwnedAssets = payload.assets.filter((a) => !a.in_library)
|
const nonOwnedAssets = payload.assets.filter((a) => !a.in_library)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -148,7 +148,7 @@ export function useSharedWorkflowUrlLoader() {
|
|||||||
toast.add({
|
toast.add({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
summary: t('g.error'),
|
summary: t('g.error'),
|
||||||
detail: t('shareWorkflow.loadFailed'),
|
detail: t('sharing.share.loadFailed'),
|
||||||
life: 5000
|
life: 5000
|
||||||
})
|
})
|
||||||
return 'failed'
|
return 'failed'
|
||||||
@@ -167,7 +167,7 @@ export function useSharedWorkflowUrlLoader() {
|
|||||||
toast.add({
|
toast.add({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
summary: t('g.error'),
|
summary: t('g.error'),
|
||||||
detail: t('openSharedWorkflow.importFailed')
|
detail: t('sharing.open.importFailed')
|
||||||
})
|
})
|
||||||
cleanupUrlParams()
|
cleanupUrlParams()
|
||||||
clearPreservedQuery(SHARE_NAMESPACE)
|
clearPreservedQuery(SHARE_NAMESPACE)
|
||||||
|
|||||||
Reference in New Issue
Block a user