[automated] Apply ESLint and oxfmt fixes

This commit is contained in:
GitHub Action
2026-01-20 00:36:55 +00:00
parent 261fb1b34d
commit 219fcc3142
33 changed files with 503 additions and 185 deletions

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="line-clamp-2 h-7 text-xs text-muted-foreground"> <div class="line-clamp-2 h-7 text-xs text-muted-foreground">
<slot></slot> <slot />
</div> </div>
</template> </template>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="text-neutral text-sm"> <div class="text-neutral text-sm">
<slot></slot> <slot />
</div> </div>
</template> </template>

View File

@@ -1,29 +1,47 @@
<template> <template>
<div :class="topStyle"> <div :class="topStyle">
<slot class="absolute top-0 left-0 h-full w-full"></slot> <slot class="absolute top-0 left-0 h-full w-full" />
<div v-if="slots['top-left']" :class="slotClasses['top-left']"> <div
<slot name="top-left"></slot> v-if="slots['top-left']"
:class="slotClasses['top-left']"
>
<slot name="top-left" />
</div> </div>
<div v-if="slots['top-right']" :class="slotClasses['top-right']"> <div
<slot name="top-right"></slot> v-if="slots['top-right']"
:class="slotClasses['top-right']"
>
<slot name="top-right" />
</div> </div>
<div v-if="slots['center-left']" :class="slotClasses['center-left']"> <div
<slot name="center-left"></slot> v-if="slots['center-left']"
:class="slotClasses['center-left']"
>
<slot name="center-left" />
</div> </div>
<div v-if="slots['center-right']" :class="slotClasses['center-right']"> <div
<slot name="center-right"></slot> v-if="slots['center-right']"
:class="slotClasses['center-right']"
>
<slot name="center-right" />
</div> </div>
<div v-if="slots['bottom-left']" :class="slotClasses['bottom-left']"> <div
<slot name="bottom-left"></slot> v-if="slots['bottom-left']"
:class="slotClasses['bottom-left']"
>
<slot name="bottom-left" />
</div> </div>
<div v-if="slots['bottom-right']" :class="slotClasses['bottom-right']"> <div
<slot name="bottom-right"></slot> v-if="slots['bottom-right']"
:class="slotClasses['bottom-right']"
>
<slot name="bottom-right" />
</div> </div>
</div> </div>
</template> </template>

View File

@@ -1,12 +1,25 @@
<template> <template>
<div v-if="balanceLoading" class="flex items-center gap-1"> <div
v-if="balanceLoading"
class="flex items-center gap-1"
>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<Skeleton shape="circle" width="1.5rem" height="1.5rem" /> <Skeleton
shape="circle"
width="1.5rem"
height="1.5rem"
/>
</div> </div>
<div class="flex-1"></div> <div class="flex-1" />
<Skeleton width="8rem" height="2rem" /> <Skeleton
width="8rem"
height="2rem"
/>
</div> </div>
<div v-else class="flex items-center gap-1"> <div
v-else
class="flex items-center gap-1"
>
<Tag <Tag
v-if="!showCreditsOnly" v-if="!showCreditsOnly"
severity="secondary" severity="secondary"

View File

@@ -4,7 +4,10 @@
class="workflow-template-selector-dialog" class="workflow-template-selector-dialog"
> >
<template #leftPanel> <template #leftPanel>
<LeftSidePanel v-model="selectedNavItem" :nav-items="navItems"> <LeftSidePanel
v-model="selectedNavItem"
:nav-items="navItems"
>
<template #header-icon> <template #header-icon>
<i class="icon-[comfy--template]" /> <i class="icon-[comfy--template]" />
</template> </template>
@@ -17,7 +20,11 @@
</template> </template>
<template #header> <template #header>
<SearchBox v-model="searchQuery" size="lg" class="max-w-[384px]" /> <SearchBox
v-model="searchQuery"
size="lg"
class="max-w-[384px]"
/>
</template> </template>
<template #header-right-area> <template #header-right-area>
@@ -132,7 +139,7 @@
<span <span
v-if="isLoading" v-if="isLoading"
class="inline-block h-8 w-48 animate-pulse rounded bg-dialog-surface" class="inline-block h-8 w-48 animate-pulse rounded bg-dialog-surface"
></span> />
<!-- Template Cards Grid --> <!-- Template Cards Grid -->
<div <div
@@ -152,9 +159,7 @@
<template #top> <template #top>
<CardTop ratio="landscape"> <CardTop ratio="landscape">
<template #default> <template #default>
<div <div class="h-full w-full animate-pulse bg-dialog-surface" />
class="h-full w-full animate-pulse bg-dialog-surface"
></div>
</template> </template>
</CardTop> </CardTop>
</template> </template>
@@ -163,10 +168,8 @@
<div class="px-4 py-3"> <div class="px-4 py-3">
<div <div
class="mb-2 h-6 animate-pulse rounded bg-dialog-surface" class="mb-2 h-6 animate-pulse rounded bg-dialog-surface"
></div> />
<div <div class="h-4 animate-pulse rounded bg-dialog-surface" />
class="h-4 animate-pulse rounded bg-dialog-surface"
></div>
</div> </div>
</CardBottom> </CardBottom>
</template> </template>
@@ -212,7 +215,7 @@
:is-hovered="hoveredTemplate === template.name" :is-hovered="hoveredTemplate === template.name"
:is-video=" :is-video="
template.mediaType === 'video' || template.mediaType === 'video' ||
template.mediaSubtype === 'webp' template.mediaSubtype === 'webp'
" "
/> />
</template> </template>
@@ -231,7 +234,7 @@
:is-hovered="hoveredTemplate === template.name" :is-hovered="hoveredTemplate === template.name"
:is-video=" :is-video="
template.mediaType === 'video' || template.mediaType === 'video' ||
template.mediaSubtype === 'webp' template.mediaSubtype === 'webp'
" "
/> />
</template> </template>
@@ -247,7 +250,7 @@
:is-hovered="hoveredTemplate === template.name" :is-hovered="hoveredTemplate === template.name"
:is-video=" :is-video="
template.mediaType === 'video' || template.mediaType === 'video' ||
template.mediaSubtype === 'webp' template.mediaSubtype === 'webp'
" "
:hover-zoom=" :hover-zoom="
template.thumbnailVariant === 'zoomHover' ? 16 : 5 template.thumbnailVariant === 'zoomHover' ? 16 : 5
@@ -332,9 +335,7 @@
<template #top> <template #top>
<CardTop ratio="square"> <CardTop ratio="square">
<template #default> <template #default>
<div <div class="h-full w-full animate-pulse bg-dialog-surface" />
class="h-full w-full animate-pulse bg-dialog-surface"
></div>
</template> </template>
</CardTop> </CardTop>
</template> </template>
@@ -343,10 +344,8 @@
<div class="px-4 py-3"> <div class="px-4 py-3">
<div <div
class="mb-2 h-6 animate-pulse rounded bg-dialog-surface" class="mb-2 h-6 animate-pulse rounded bg-dialog-surface"
></div> />
<div <div class="h-4 animate-pulse rounded bg-dialog-surface" />
class="h-4 animate-pulse rounded bg-dialog-surface"
></div>
</div> </div>
</CardBottom> </CardBottom>
</template> </template>
@@ -360,13 +359,19 @@
ref="loadTrigger" ref="loadTrigger"
class="mt-4 flex h-4 w-full items-center justify-center" class="mt-4 flex h-4 w-full items-center justify-center"
> >
<div v-if="isLoadingMore" class="text-sm text-muted"> <div
v-if="isLoadingMore"
class="text-sm text-muted"
>
{{ $t('templateWorkflows.loadingMore', 'Loading more...') }} {{ $t('templateWorkflows.loadingMore', 'Loading more...') }}
</div> </div>
</div> </div>
<!-- Results Summary --> <!-- Results Summary -->
<div v-if="!isLoading" class="mt-6 px-6 text-sm text-muted"> <div
v-if="!isLoading"
class="mt-6 px-6 text-sm text-muted"
>
{{ {{
$t('templateWorkflows.resultsCount', { $t('templateWorkflows.resultsCount', {
count: filteredCount, count: filteredCount,

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="flex w-full items-center justify-between p-4"> <div class="flex w-full items-center justify-between p-4">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<i class="icon-[lucide--triangle-alert] text-warning-background"></i> <i class="icon-[lucide--triangle-alert] text-warning-background" />
<p class="m-0 text-sm"> <p class="m-0 text-sm">
{{ {{
isCloud isCloud

View File

@@ -20,28 +20,45 @@
<span <span
class="ml-1 cursor-pointer text-blue-500" class="ml-1 cursor-pointer text-blue-500"
@click="toggleState" @click="toggleState"
>{{ >{{
isSignIn ? t('auth.login.signUp') : t('auth.signup.signIn') isSignIn ? t('auth.login.signUp') : t('auth.signup.signIn')
}}</span }}</span>
>
</p> </p>
</div> </div>
<Message v-if="!isSecureContext" severity="warn" class="mb-4"> <Message
v-if="!isSecureContext"
severity="warn"
class="mb-4"
>
{{ t('auth.login.insecureContextWarning') }} {{ t('auth.login.insecureContextWarning') }}
</Message> </Message>
<!-- Form --> <!-- Form -->
<SignInForm v-if="isSignIn" @submit="signInWithEmail" /> <SignInForm
v-if="isSignIn"
@submit="signInWithEmail"
/>
<template v-else> <template v-else>
<Message v-if="userIsInChina" severity="warn" class="mb-4"> <Message
v-if="userIsInChina"
severity="warn"
class="mb-4"
>
{{ t('auth.signup.regionRestrictionChina') }} {{ t('auth.signup.regionRestrictionChina') }}
</Message> </Message>
<SignUpForm v-else @submit="signUpWithEmail" /> <SignUpForm
v-else
@submit="signUpWithEmail"
/>
</template> </template>
<!-- Divider --> <!-- Divider -->
<Divider align="center" layout="horizontal" class="my-8"> <Divider
align="center"
layout="horizontal"
class="my-8"
>
<span class="text-muted">{{ t('auth.login.orContinueWith') }}</span> <span class="text-muted">{{ t('auth.login.orContinueWith') }}</span>
</Divider> </Divider>
@@ -54,7 +71,7 @@
variant="secondary" variant="secondary"
@click="signInWithGoogle" @click="signInWithGoogle"
> >
<i class="pi pi-google mr-2"></i> <i class="pi pi-google mr-2" />
{{ {{
isSignIn isSignIn
? t('auth.login.loginWithGoogle') ? t('auth.login.loginWithGoogle')
@@ -68,7 +85,7 @@
variant="secondary" variant="secondary"
@click="signInWithGithub" @click="signInWithGithub"
> >
<i class="pi pi-github mr-2"></i> <i class="pi pi-github mr-2" />
{{ {{
isSignIn isSignIn
? t('auth.login.loginWithGithub') ? t('auth.login.loginWithGithub')
@@ -87,7 +104,7 @@
src="/assets/images/comfy-logo-mono.svg" src="/assets/images/comfy-logo-mono.svg"
class="mr-2 h-5 w-5" class="mr-2 h-5 w-5"
:alt="$t('g.comfy')" :alt="$t('g.comfy')"
/> >
{{ t('auth.login.useApiKey') }} {{ t('auth.login.useApiKey') }}
</Button> </Button>
<small class="text-center text-muted"> <small class="text-center text-muted">
@@ -127,12 +144,13 @@
target="_blank" target="_blank"
class="cursor-pointer text-blue-500" class="cursor-pointer text-blue-500"
> >
{{ t('auth.login.privacyLink') }} </a {{ t('auth.login.privacyLink') }} </a>.
>.
{{ t('auth.login.questionsContactPrefix') }} {{ t('auth.login.questionsContactPrefix') }}
<a href="mailto:hello@comfy.org" class="cursor-pointer text-blue-500"> <a
hello@comfy.org</a href="mailto:hello@comfy.org"
>. class="cursor-pointer text-blue-500"
>
hello@comfy.org</a>.
</p> </p>
</template> </template>
</div> </div>

View File

@@ -1,5 +1,8 @@
<template> <template>
<TabPanel value="Credits" class="credits-container h-full"> <TabPanel
value="Credits"
class="credits-container h-full"
>
<!-- Legacy Design --> <!-- Legacy Design -->
<div class="flex h-full flex-col"> <div class="flex h-full flex-col">
<h2 class="mb-2 text-2xl font-bold"> <h2 class="mb-2 text-2xl font-bold">
@@ -14,7 +17,11 @@
</h3> </h3>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<UserCredit text-class="text-3xl font-bold" /> <UserCredit text-class="text-3xl font-bold" />
<Skeleton v-if="loading" width="2rem" height="2rem" /> <Skeleton
v-if="loading"
width="2rem"
height="2rem"
/>
<Button <Button
v-else-if="isActiveSubscription" v-else-if="isActiveSubscription"
:loading="loading" :loading="loading"
@@ -30,7 +37,10 @@
height="1rem" height="1rem"
class="text-xs" class="text-xs"
/> />
<div v-else-if="formattedLastUpdateTime" class="text-xs text-muted"> <div
v-else-if="formattedLastUpdateTime"
class="text-xs text-muted"
>
{{ $t('credits.lastUpdated') }}: {{ formattedLastUpdateTime }} {{ $t('credits.lastUpdated') }}: {{ formattedLastUpdateTime }}
</div> </div>
<Button <Button
@@ -58,14 +68,27 @@
<template v-if="creditHistory.length > 0"> <template v-if="creditHistory.length > 0">
<div class="grow"> <div class="grow">
<DataTable :value="creditHistory" :show-headers="false"> <DataTable
<Column field="title" :header="$t('g.name')"> :value="creditHistory"
:show-headers="false"
>
<Column
field="title"
:header="$t('g.name')"
>
<template #body="{ data }"> <template #body="{ data }">
<div class="text-sm font-medium">{{ data.title }}</div> <div class="text-sm font-medium">
<div class="text-xs text-muted">{{ data.timestamp }}</div> {{ data.title }}
</div>
<div class="text-xs text-muted">
{{ data.timestamp }}
</div>
</template> </template>
</Column> </Column>
<Column field="amount" :header="$t('g.amount')"> <Column
field="amount"
:header="$t('g.amount')"
>
<template #body="{ data }"> <template #body="{ data }">
<div <div
:class="[ :class="[
@@ -88,15 +111,24 @@
<UsageLogsTable ref="usageLogsTableRef" /> <UsageLogsTable ref="usageLogsTableRef" />
<div class="flex flex-row gap-2"> <div class="flex flex-row gap-2">
<Button variant="muted-textonly" @click="handleFaqClick"> <Button
variant="muted-textonly"
@click="handleFaqClick"
>
<i class="pi pi-question-circle" /> <i class="pi pi-question-circle" />
{{ $t('credits.faqs') }} {{ $t('credits.faqs') }}
</Button> </Button>
<Button variant="muted-textonly" @click="handleOpenPartnerNodesInfo"> <Button
variant="muted-textonly"
@click="handleOpenPartnerNodesInfo"
>
<i class="pi pi-question-circle" /> <i class="pi pi-question-circle" />
{{ $t('subscription.partnerNodesCredits') }} {{ $t('subscription.partnerNodesCredits') }}
</Button> </Button>
<Button variant="muted-textonly" @click="handleMessageSupport"> <Button
variant="muted-textonly"
@click="handleMessageSupport"
>
<i class="pi pi-comments" /> <i class="pi pi-comments" />
{{ $t('credits.messageSupport') }} {{ $t('credits.messageSupport') }}
</Button> </Button>

View File

@@ -1,10 +1,21 @@
<template> <template>
<div> <div>
<div v-if="loading" class="flex items-center justify-center p-8"> <div
v-if="loading"
class="flex items-center justify-center p-8"
>
<ProgressSpinner /> <ProgressSpinner />
</div> </div>
<div v-else-if="error" class="p-4"> <div
<Message severity="error" :closable="false">{{ error }}</Message> v-else-if="error"
class="p-4"
>
<Message
severity="error"
:closable="false"
>
{{ error }}
</Message>
</div> </div>
<DataTable <DataTable
v-else v-else
@@ -17,7 +28,10 @@
class="p-datatable-sm custom-datatable" class="p-datatable-sm custom-datatable"
@page="onPageChange" @page="onPageChange"
> >
<Column field="event_type" :header="$t('credits.eventType')"> <Column
field="event_type"
:header="$t('credits.eventType')"
>
<template #body="{ data }"> <template #body="{ data }">
<Badge <Badge
:value="customerEventService.formatEventType(data.event_type)" :value="customerEventService.formatEventType(data.event_type)"
@@ -25,7 +39,10 @@
/> />
</template> </template>
</Column> </Column>
<Column field="details" :header="$t('credits.details')"> <Column
field="details"
:header="$t('credits.details')"
>
<template #body="{ data }"> <template #body="{ data }">
<div class="event-details"> <div class="event-details">
<!-- Credits Added --> <!-- Credits Added -->
@@ -58,12 +75,18 @@
</div> </div>
</template> </template>
</Column> </Column>
<Column field="createdAt" :header="$t('credits.time')"> <Column
field="createdAt"
:header="$t('credits.time')"
>
<template #body="{ data }"> <template #body="{ data }">
{{ customerEventService.formatDate(data.createdAt) }} {{ customerEventService.formatDate(data.createdAt) }}
</template> </template>
</Column> </Column>
<Column field="params" :header="$t('credits.additionalInfo')"> <Column
field="params"
:header="$t('credits.additionalInfo')"
>
<template #body="{ data }"> <template #body="{ data }">
<Button <Button
v-if="customerEventService.hasAdditionalInfo(data)" v-if="customerEventService.hasAdditionalInfo(data)"

View File

@@ -1,11 +1,19 @@
<template> <template>
<TabPanel value="User" class="user-settings-container h-full"> <TabPanel
value="User"
class="user-settings-container h-full"
>
<div class="flex h-full flex-col"> <div class="flex h-full flex-col">
<h2 class="mb-2 text-2xl font-bold">{{ $t('userSettings.title') }}</h2> <h2 class="mb-2 text-2xl font-bold">
{{ $t('userSettings.title') }}
</h2>
<Divider class="mb-3" /> <Divider class="mb-3" />
<!-- Normal User Panel --> <!-- Normal User Panel -->
<div v-if="isLoggedIn" class="flex flex-col gap-2"> <div
v-if="isLoggedIn"
class="flex flex-col gap-2"
>
<UserAvatar <UserAvatar
v-if="userPhotoUrl" v-if="userPhotoUrl"
:photo-url="userPhotoUrl" :photo-url="userPhotoUrl"
@@ -58,8 +66,15 @@
class="mt-4 h-8 w-8" class="mt-4 h-8 w-8"
style="--pc-spinner-color: #000" style="--pc-spinner-color: #000"
/> />
<div v-else class="mt-4 flex flex-col gap-2"> <div
<Button class="w-32" variant="secondary" @click="handleSignOut"> v-else
class="mt-4 flex flex-col gap-2"
>
<Button
class="w-32"
variant="secondary"
@click="handleSignOut"
>
<i class="pi pi-sign-out" /> <i class="pi pi-sign-out" />
{{ $t('auth.signOut.signOut') }} {{ $t('auth.signOut.signOut') }}
</Button> </Button>
@@ -75,7 +90,10 @@
</div> </div>
<!-- Login Section --> <!-- Login Section -->
<div v-else class="flex flex-col gap-4"> <div
v-else
class="flex flex-col gap-4"
>
<p class="text-smoke-600"> <p class="text-smoke-600">
{{ $t('auth.login.title') }} {{ $t('auth.login.title') }}
</p> </p>

View File

@@ -1,13 +1,16 @@
<template> <template>
<div> <div>
<ZoomControlsModal :visible="isModalVisible" @close="hideModal" /> <ZoomControlsModal
:visible="isModalVisible"
@close="hideModal"
/>
<!-- Backdrop --> <!-- Backdrop -->
<div <div
v-if="hasActivePopup" v-if="hasActivePopup"
class="fixed inset-0 z-1200" class="fixed inset-0 z-1200"
@click="hideModal" @click="hideModal"
></div> />
<ButtonGroup <ButtonGroup
class="absolute right-0 bottom-0 z-1200 flex-row gap-1 border-[1px] border-interface-stroke bg-comfy-menu-bg p-2" class="absolute right-0 bottom-0 z-1200 flex-row gap-1 border-[1px] border-interface-stroke bg-comfy-menu-bg p-2"

View File

@@ -4,8 +4,11 @@
> >
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<div class="flex flex-1 items-center gap-2 break-all"> <div class="flex flex-1 items-center gap-2 break-all">
<span v-html="formattedText"></span> <span v-html="formattedText" />
<Skeleton v-if="isParentNodeExecuting" class="h-4! flex-1!" /> <Skeleton
v-if="isParentNodeExecuting"
class="h-4! flex-1!"
/>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -9,11 +9,13 @@
:options="cameras" :options="cameras"
option-label="title" option-label="title"
option-value="value" option-value="value"
> />
</Select>
</div> </div>
<div v-if="showFOVButton" class="space-y-4"> <div
v-if="showFOVButton"
class="space-y-4"
>
<label>{{ t('load3d.fov') }}</label> <label>{{ t('load3d.fov') }}</label>
<Slider <Slider
v-model="fov" v-model="fov"

View File

@@ -5,8 +5,7 @@
:options="exportFormats" :options="exportFormats"
option-label="label" option-label="label"
option-value="value" option-value="value"
> />
</Select>
<Button <Button
variant="muted-textonly" variant="muted-textonly"

View File

@@ -19,7 +19,7 @@
display: gradientVisible ? 'block' : 'none', display: gradientVisible ? 'block' : 'none',
background: gradientBackground background: gradientBackground
}" }"
></div> />
</div> </div>
</template> </template>

View File

@@ -7,7 +7,10 @@ https://github.com/Nuked88/ComfyUI-N-Sidebar/blob/7ae7da4a9761009fb6629bc04c6830
:node-def="nodeDef" :node-def="nodeDef"
:position="position" :position="position"
/> />
<div v-else class="_sb_node_preview bg-component-node-background"> <div
v-else
class="_sb_node_preview bg-component-node-background"
>
<div class="_sb_table"> <div class="_sb_table">
<div <div
class="node_header mr-4 text-ellipsis" class="node_header mr-4 text-ellipsis"
@@ -20,7 +23,9 @@ https://github.com/Nuked88/ComfyUI-N-Sidebar/blob/7ae7da4a9761009fb6629bc04c6830
<div class="_sb_dot headdot pr-3" /> <div class="_sb_dot headdot pr-3" />
{{ nodeDef.display_name }} {{ nodeDef.display_name }}
</div> </div>
<div class="_sb_preview_badge">{{ $t('g.preview') }}</div> <div class="_sb_preview_badge">
{{ $t('g.preview') }}
</div>
<!-- Node slot I/O --> <!-- Node slot I/O -->
<div <div
@@ -29,7 +34,10 @@ https://github.com/Nuked88/ComfyUI-N-Sidebar/blob/7ae7da4a9761009fb6629bc04c6830
class="_sb_row slot_row" class="_sb_row slot_row"
> >
<div class="_sb_col"> <div class="_sb_col">
<div v-if="slotInput" :class="['_sb_dot', slotInput.type]" /> <div
v-if="slotInput"
:class="['_sb_dot', slotInput.type]"
/>
</div> </div>
<div class="_sb_col"> <div class="_sb_col">
{{ slotInput ? slotInput.name : '' }} {{ slotInput ? slotInput.name : '' }}
@@ -44,7 +52,10 @@ https://github.com/Nuked88/ComfyUI-N-Sidebar/blob/7ae7da4a9761009fb6629bc04c6830
{{ slotOutput ? slotOutput.name : '' }} {{ slotOutput ? slotOutput.name : '' }}
</div> </div>
<div class="_sb_col"> <div class="_sb_col">
<div v-if="slotOutput" :class="['_sb_dot', slotOutput.type]" /> <div
v-if="slotOutput"
:class="['_sb_dot', slotOutput.type]"
/>
</div> </div>
</div> </div>
@@ -54,7 +65,9 @@ https://github.com/Nuked88/ComfyUI-N-Sidebar/blob/7ae7da4a9761009fb6629bc04c6830
:key="widgetInput.name" :key="widgetInput.name"
class="_sb_row _long_field" class="_sb_row _long_field"
> >
<div class="_sb_col _sb_arrow">&#x25C0;</div> <div class="_sb_col _sb_arrow">
&#x25C0;
</div>
<div <div
class="_sb_col" class="_sb_col"
:style="{ :style="{
@@ -70,7 +83,9 @@ https://github.com/Nuked88/ComfyUI-N-Sidebar/blob/7ae7da4a9761009fb6629bc04c6830
> >
{{ truncateDefaultValue(widgetInput.default) }} {{ truncateDefaultValue(widgetInput.default) }}
</div> </div>
<div class="_sb_col _sb_arrow">&#x25B6;</div> <div class="_sb_col _sb_arrow">
&#x25B6;
</div>
</div> </div>
</div> </div>
<div <div

View File

@@ -64,7 +64,10 @@
> >
{{ item.comfyCommand.keybinding.combo.toString() }} {{ item.comfyCommand.keybinding.combo.toString() }}
</span> </span>
<i v-if="item.items" class="pi pi-angle-right ml-auto" /> <i
v-if="item.items"
class="pi pi-angle-right ml-auto"
/>
</a> </a>
<div <div
v-else v-else
@@ -72,7 +75,12 @@
@click.stop="handleNodes2ToggleClick" @click.stop="handleNodes2ToggleClick"
> >
<span class="p-menubar-item-label text-nowrap">{{ item.label }}</span> <span class="p-menubar-item-label text-nowrap">{{ item.label }}</span>
<Tag severity="info" class="ml-2 text-xs">{{ $t('g.beta') }}</Tag> <Tag
severity="info"
class="ml-2 text-xs"
>
{{ $t('g.beta') }}
</Tag>
<ToggleSwitch <ToggleSwitch
v-model="nodes2Enabled" v-model="nodes2Enabled"
class="ml-4" class="ml-4"

View File

@@ -1,7 +1,10 @@
<template> <template>
<BaseModalLayout :content-title="$t('assetBrowser.checkpoints')"> <BaseModalLayout :content-title="$t('assetBrowser.checkpoints')">
<template #leftPanel> <template #leftPanel>
<LeftSidePanel v-model="selectedNavItem" :nav-items="tempNavigation"> <LeftSidePanel
v-model="selectedNavItem"
:nav-items="tempNavigation"
>
<template #header-icon> <template #header-icon>
<i class="text-neutral icon-[lucide--puzzle]" /> <i class="text-neutral icon-[lucide--puzzle]" />
</template> </template>
@@ -12,12 +15,19 @@
</template> </template>
<template #header> <template #header>
<SearchBox v-model="searchQuery" size="lg" class="max-w-[384px]" /> <SearchBox
v-model="searchQuery"
size="lg"
class="max-w-[384px]"
/>
</template> </template>
<template #header-right-area> <template #header-right-area>
<div class="flex gap-2"> <div class="flex gap-2">
<Button variant="primary" @click="() => {}"> <Button
variant="primary"
@click="() => {}"
>
<i class="icon-[lucide--upload]" /> <i class="icon-[lucide--upload]" />
<span>{{ $t('g.upload') }}</span> <span>{{ $t('g.upload') }}</span>
</Button> </Button>
@@ -83,11 +93,15 @@
<template #content> <template #content>
<!-- Card Examples --> <!-- Card Examples -->
<div :style="gridStyle"> <div :style="gridStyle">
<CardContainer v-for="i in 100" :key="i" size="regular"> <CardContainer
v-for="i in 100"
:key="i"
size="regular"
>
<template #top> <template #top>
<CardTop ratio="landscape"> <CardTop ratio="landscape">
<template #default> <template #default>
<div class="h-full w-full bg-blue-500"></div> <div class="h-full w-full bg-blue-500" />
</template> </template>
<template #top-right> <template #top-right>
<Button <Button
@@ -110,14 +124,14 @@
</CardTop> </CardTop>
</template> </template>
<template #bottom> <template #bottom>
<CardBottom></CardBottom> <CardBottom />
</template> </template>
</CardContainer> </CardContainer>
</div> </div>
</template> </template>
<template #rightPanel> <template #rightPanel>
<RightSidePanel></RightSidePanel> <RightSidePanel />
</template> </template>
</BaseModalLayout> </BaseModalLayout>
</template> </template>

View File

@@ -2,16 +2,22 @@
<div class="flex h-full w-full flex-col bg-modal-panel-background"> <div class="flex h-full w-full flex-col bg-modal-panel-background">
<PanelHeader> <PanelHeader>
<template #icon> <template #icon>
<slot name="header-icon"></slot> <slot name="header-icon" />
</template> </template>
<slot name="header-title"></slot> <slot name="header-title" />
</PanelHeader> </PanelHeader>
<nav <nav
class="flex scrollbar-hide flex-1 flex-col gap-1 overflow-y-auto px-3 py-4" class="flex scrollbar-hide flex-1 flex-col gap-1 overflow-y-auto px-3 py-4"
> >
<template v-for="(item, index) in navItems" :key="index"> <template
<div v-if="'items' in item" class="flex flex-col gap-2"> v-for="(item, index) in navItems"
:key="index"
>
<div
v-if="'items' in item"
class="flex flex-col gap-2"
>
<NavTitle <NavTitle
v-model="collapsedGroups[item.title]" v-model="collapsedGroups[item.title]"
:title="item.title" :title="item.title"
@@ -29,7 +35,10 @@
</NavItem> </NavItem>
</template> </template>
</div> </div>
<div v-else class="flex flex-col gap-2"> <div
v-else
class="flex flex-col gap-2"
>
<NavItem <NavItem
:icon="item.icon" :icon="item.icon"
:active="activeItem === item.id" :active="activeItem === item.id"

View File

@@ -5,7 +5,7 @@
<i class="text-neutral icon-[lucide--puzzle] text-base" /> <i class="text-neutral icon-[lucide--puzzle] text-base" />
</slot> </slot>
<h2 class="text-neutral text-base font-bold"> <h2 class="text-neutral text-base font-bold">
<slot></slot> <slot />
</h2> </h2>
</div> </div>
</header> </header>

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="size-full bg-modal-panel-background pr-6 pb-8 pl-4"> <div class="size-full bg-modal-panel-background pr-6 pb-8 pl-4">
<slot></slot> <slot />
</div> </div>
</template> </template>

View File

@@ -8,7 +8,10 @@
:aria-colcount="-1" :aria-colcount="-1"
:aria-setsize="assets.length" :aria-setsize="assets.length"
> >
<div v-if="loading" class="flex h-full items-center justify-center py-20"> <div
v-if="loading"
class="flex h-full items-center justify-center py-20"
>
<i <i
class="icon-[lucide--loader] size-12 animate-spin text-muted-foreground" class="icon-[lucide--loader] size-12 animate-spin text-muted-foreground"
/> />
@@ -21,7 +24,9 @@
<h3 class="mb-2 text-lg font-medium"> <h3 class="mb-2 text-lg font-medium">
{{ $t('assetBrowser.noAssetsFound') }} {{ $t('assetBrowser.noAssetsFound') }}
</h3> </h3>
<p class="text-sm">{{ $t('assetBrowser.tryAdjustingFilters') }}</p> <p class="text-sm">
{{ $t('assetBrowser.tryAdjustingFilters') }}
</p>
</div> </div>
<VirtualGrid <VirtualGrid
v-else v-else

View File

@@ -40,8 +40,11 @@
:src="previewUrl" :src="previewUrl"
:alt="previewAlt" :alt="previewAlt"
class="size-full object-cover" class="size-full object-cover"
/> >
<div v-else class="flex size-full items-center justify-center"> <div
v-else
class="flex size-full items-center justify-center"
>
<i <i
aria-hidden="true" aria-hidden="true"
:class=" :class="
@@ -61,17 +64,24 @@
v-if="$slots.primary || primaryText" v-if="$slots.primary || primaryText"
class="text-xs leading-none text-text-primary" class="text-xs leading-none text-text-primary"
> >
<slot name="primary">{{ primaryText }}</slot> <slot name="primary">
{{ primaryText }}
</slot>
</div> </div>
<div <div
v-if="$slots.secondary || secondaryText" v-if="$slots.secondary || secondaryText"
class="text-xs leading-none text-text-secondary" class="text-xs leading-none text-text-secondary"
> >
<slot name="secondary">{{ secondaryText }}</slot> <slot name="secondary">
{{ secondaryText }}
</slot>
</div> </div>
</div> </div>
<div v-if="$slots.actions" class="relative z-1 flex items-center gap-2"> <div
v-if="$slots.actions"
class="relative z-1 flex items-center gap-2"
>
<slot name="actions" /> <slot name="actions" />
</div> </div>
</div> </div>

View File

@@ -11,20 +11,30 @@
<span <span
class="ml-1 cursor-pointer text-blue-500" class="ml-1 cursor-pointer text-blue-500"
@click="navigateToSignup" @click="navigateToSignup"
>{{ t('auth.login.signUp') }}</span >{{ t('auth.login.signUp') }}</span>
>
</p> </p>
</div> </div>
<Message v-if="!isSecureContext" severity="warn" class="mb-4"> <Message
v-if="!isSecureContext"
severity="warn"
class="mb-4"
>
{{ t('auth.login.insecureContextWarning') }} {{ t('auth.login.insecureContextWarning') }}
</Message> </Message>
<!-- Form --> <!-- Form -->
<CloudSignInForm :auth-error="authError" @submit="signInWithEmail" /> <CloudSignInForm
:auth-error="authError"
@submit="signInWithEmail"
/>
<!-- Divider --> <!-- Divider -->
<Divider align="center" layout="horizontal" class="my-8"> <Divider
align="center"
layout="horizontal"
class="my-8"
>
<span class="text-muted">{{ t('auth.login.orContinueWith') }}</span> <span class="text-muted">{{ t('auth.login.orContinueWith') }}</span>
</Divider> </Divider>
@@ -36,7 +46,7 @@
variant="secondary" variant="secondary"
@click="signInWithGoogle" @click="signInWithGoogle"
> >
<i class="pi pi-google mr-2"></i> <i class="pi pi-google mr-2" />
{{ t('auth.login.loginWithGoogle') }} {{ t('auth.login.loginWithGoogle') }}
</Button> </Button>
@@ -46,7 +56,7 @@
variant="secondary" variant="secondary"
@click="signInWithGithub" @click="signInWithGithub"
> >
<i class="pi pi-github mr-2"></i> <i class="pi pi-github mr-2" />
{{ t('auth.login.loginWithGithub') }} {{ t('auth.login.loginWithGithub') }}
</Button> </Button>
</div> </div>
@@ -67,8 +77,7 @@
target="_blank" target="_blank"
class="cursor-pointer text-blue-400 no-underline" class="cursor-pointer text-blue-400 no-underline"
> >
{{ t('auth.login.privacyLink') }} </a {{ t('auth.login.privacyLink') }} </a>.
>.
</p> </p>
</div> </div>
</div> </div>

View File

@@ -13,23 +13,38 @@
<span <span
class="ml-1 cursor-pointer text-blue-500" class="ml-1 cursor-pointer text-blue-500"
@click="navigateToLogin" @click="navigateToLogin"
>{{ t('auth.signup.signIn') }}</span >{{ t('auth.signup.signIn') }}</span>
>
</p> </p>
</div> </div>
<Message v-if="!isSecureContext" severity="warn" class="mb-4"> <Message
v-if="!isSecureContext"
severity="warn"
class="mb-4"
>
{{ t('auth.login.insecureContextWarning') }} {{ t('auth.login.insecureContextWarning') }}
</Message> </Message>
<!-- Form --> <!-- Form -->
<Message v-if="userIsInChina" severity="warn" class="mb-4"> <Message
v-if="userIsInChina"
severity="warn"
class="mb-4"
>
{{ t('auth.signup.regionRestrictionChina') }} {{ t('auth.signup.regionRestrictionChina') }}
</Message> </Message>
<SignUpForm v-else :auth-error="authError" @submit="signUpWithEmail" /> <SignUpForm
v-else
:auth-error="authError"
@submit="signUpWithEmail"
/>
<!-- Divider --> <!-- Divider -->
<Divider align="center" layout="horizontal" class="my-8"> <Divider
align="center"
layout="horizontal"
class="my-8"
>
<span class="text-muted">{{ t('auth.login.orContinueWith') }}</span> <span class="text-muted">{{ t('auth.login.orContinueWith') }}</span>
</Divider> </Divider>
@@ -41,7 +56,7 @@
variant="secondary" variant="secondary"
@click="signInWithGoogle" @click="signInWithGoogle"
> >
<i class="pi pi-google mr-2"></i> <i class="pi pi-google mr-2" />
{{ t('auth.signup.signUpWithGoogle') }} {{ t('auth.signup.signUpWithGoogle') }}
</Button> </Button>
@@ -51,7 +66,7 @@
variant="secondary" variant="secondary"
@click="signInWithGithub" @click="signInWithGithub"
> >
<i class="pi pi-github mr-2"></i> <i class="pi pi-github mr-2" />
{{ t('auth.signup.signUpWithGithub') }} {{ t('auth.signup.signUpWithGithub') }}
</Button> </Button>
</div> </div>
@@ -72,8 +87,7 @@
target="_blank" target="_blank"
class="cursor-pointer text-blue-400 no-underline" class="cursor-pointer text-blue-400 no-underline"
> >
{{ t('auth.login.privacyLink') }} </a {{ t('auth.login.privacyLink') }} </a>.
>.
<p class="mt-2"> <p class="mt-2">
{{ t('cloudWaitlist_questionsText') }} {{ t('cloudWaitlist_questionsText') }}
<a <a
@@ -82,8 +96,7 @@
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
{{ t('cloudWaitlist_contactLink') }}</a {{ t('cloudWaitlist_contactLink') }}</a>.
>.
</p> </p>
</div> </div>
</div> </div>

View File

@@ -2,10 +2,19 @@
<CloudLoginViewSkeleton v-if="skeletonType === 'login'" /> <CloudLoginViewSkeleton v-if="skeletonType === 'login'" />
<CloudSurveyViewSkeleton v-else-if="skeletonType === 'survey'" /> <CloudSurveyViewSkeleton v-else-if="skeletonType === 'survey'" />
<CloudWaitlistViewSkeleton v-else-if="skeletonType === 'waitlist'" /> <CloudWaitlistViewSkeleton v-else-if="skeletonType === 'waitlist'" />
<div v-else-if="error" class="flex h-full items-center justify-center p-8"> <div
v-else-if="error"
class="flex h-full items-center justify-center p-8"
>
<div class="max-w-[100vw] p-2 text-center lg:w-96"> <div class="max-w-[100vw] p-2 text-center lg:w-96">
<p class="mb-4 text-red-500">{{ errorMessage }}</p> <p class="mb-4 text-red-500">
<Button :loading="isRetrying" class="w-full" @click="handleRetry"> {{ errorMessage }}
</p>
<Button
:loading="isRetrying"
class="w-full"
@click="handleRetry"
>
{{ {{
isRetrying isRetrying
? $t('cloudOnboarding.retrying') ? $t('cloudOnboarding.retrying')
@@ -14,7 +23,10 @@
</Button> </Button>
</div> </div>
</div> </div>
<div v-else class="flex items-center justify-center"> <div
v-else
class="flex items-center justify-center"
>
<ProgressSpinner class="h-8 w-8" /> <ProgressSpinner class="h-8 w-8" />
</div> </div>
</template> </template>

View File

@@ -1,6 +1,9 @@
<template> <template>
<div class="flex"> <div class="flex">
<BaseViewTemplate dark class="flex-1"> <BaseViewTemplate
dark
class="flex-1"
>
<template #header> <template #header>
<CloudLogo /> <CloudLogo />
</template> </template>
@@ -19,10 +22,13 @@
playsinline playsinline
:poster="videoPoster" :poster="videoPoster"
> >
<source :src="videoSrc" type="video/mp4" /> <source
:src="videoSrc"
type="video/mp4"
>
</video> </video>
<div class="absolute inset-0 h-full w-full bg-black/30"></div> <div class="absolute inset-0 h-full w-full bg-black/30" />
<!-- Optional Overlay for better visual --> <!-- Optional Overlay for better visual -->
<div <div

View File

@@ -2,41 +2,99 @@
<div class="flex h-full items-center justify-center p-8"> <div class="flex h-full items-center justify-center p-8">
<div class="max-w-[100vw] lg:w-96"> <div class="max-w-[100vw] lg:w-96">
<div class="rounded-lg bg-[#2d2e32] p-4"> <div class="rounded-lg bg-[#2d2e32] p-4">
<Skeleton width="60%" height="1.125rem" class="mb-2" /> <Skeleton
<Skeleton width="90%" height="1rem" class="mb-2" /> width="60%"
<Skeleton width="80%" height="1rem" /> height="1.125rem"
class="mb-2"
/>
<Skeleton
width="90%"
height="1rem"
class="mb-2"
/>
<Skeleton
width="80%"
height="1rem"
/>
</div> </div>
<div class="mt-6 mb-8 flex flex-col gap-4"> <div class="mt-6 mb-8 flex flex-col gap-4">
<Skeleton width="45%" height="1.5rem" class="my-0" /> <Skeleton
width="45%"
height="1.5rem"
class="my-0"
/>
<div class="flex items-center"> <div class="flex items-center">
<Skeleton width="25%" height="1rem" class="mr-1" /> <Skeleton
<Skeleton width="20%" height="1rem" /> width="25%"
height="1rem"
class="mr-1"
/>
<Skeleton
width="20%"
height="1rem"
/>
</div> </div>
</div> </div>
<div class="mb-8"> <div class="mb-8">
<Skeleton width="20%" height="1rem" class="mb-2" /> <Skeleton
<Skeleton width="100%" height="2.5rem" class="mb-4" /> width="20%"
<Skeleton width="25%" height="1rem" class="mb-4" /> height="1rem"
<Skeleton width="100%" height="2.5rem" class="mb-6" /> class="mb-2"
<Skeleton width="80%" height="1rem" class="mb-4" /> />
<Skeleton width="100%" height="2.5rem" /> <Skeleton
width="100%"
height="2.5rem"
class="mb-4"
/>
<Skeleton
width="25%"
height="1rem"
class="mb-4"
/>
<Skeleton
width="100%"
height="2.5rem"
class="mb-6"
/>
<Skeleton
width="80%"
height="1rem"
class="mb-4"
/>
<Skeleton
width="100%"
height="2.5rem"
/>
</div> </div>
<div class="my-8 flex items-center"> <div class="my-8 flex items-center">
<div class="flex-1 border-t border-gray-300"></div> <div class="flex-1 border-t border-gray-300" />
<Skeleton width="30%" height="1rem" class="mx-4" /> <Skeleton
<div class="flex-1 border-t border-gray-300"></div> width="30%"
height="1rem"
class="mx-4"
/>
<div class="flex-1 border-t border-gray-300" />
</div> </div>
<div class="flex flex-col gap-6"> <div class="flex flex-col gap-6">
<Skeleton width="100%" height="2.5rem" /> <Skeleton
<Skeleton width="100%" height="2.5rem" /> width="100%"
height="2.5rem"
/>
<Skeleton
width="100%"
height="2.5rem"
/>
</div> </div>
<div class="mt-5"> <div class="mt-5">
<Skeleton width="70%" height="0.875rem" /> <Skeleton
width="70%"
height="0.875rem"
/>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,5 +1,8 @@
<template> <template>
<div v-if="imageUrl" class="flex h-full min-h-16 w-full min-w-16 flex-col"> <div
v-if="imageUrl"
class="flex h-full min-h-16 w-full min-w-16 flex-col"
>
<!-- Image Container --> <!-- Image Container -->
<div <div
class="relative h-88 w-full grow overflow-hidden rounded-[5px] bg-node-component-surface" class="relative h-88 w-full grow overflow-hidden rounded-[5px] bg-node-component-surface"
@@ -10,7 +13,9 @@
class="text-pure-white flex h-full w-full flex-col items-center justify-center text-center" class="text-pure-white flex h-full w-full flex-col items-center justify-center text-center"
> >
<i-lucide:image-off class="mb-1 size-8 text-smoke-500" /> <i-lucide:image-off class="mb-1 size-8 text-smoke-500" />
<p class="text-xs text-smoke-400">{{ $t('g.imageFailedToLoad') }}</p> <p class="text-xs text-smoke-400">
{{ $t('g.imageFailedToLoad') }}
</p>
</div> </div>
<!-- Main Image --> <!-- Main Image -->
@@ -21,7 +26,7 @@
class="pointer-events-none h-full w-full object-contain object-center" class="pointer-events-none h-full w-full object-contain object-center"
@load="handleImageLoad" @load="handleImageLoad"
@error="handleImageError" @error="handleImageError"
/> >
</div> </div>
<!-- Image Dimensions --> <!-- Image Dimensions -->

View File

@@ -4,7 +4,9 @@
id="comfy-user-selection" id="comfy-user-selection"
class="relative min-w-84 rounded-lg bg-(--comfy-menu-bg) p-5 px-10 shadow-lg" class="relative min-w-84 rounded-lg bg-(--comfy-menu-bg) p-5 px-10 shadow-lg"
> >
<h1 class="my-2.5 mb-7 font-normal">ComfyUI</h1> <h1 class="my-2.5 mb-7 font-normal">
ComfyUI
</h1>
<div class="flex w-full flex-col items-center"> <div class="flex w-full flex-col items-center">
<div class="flex w-full flex-col gap-2"> <div class="flex w-full flex-col gap-2">
<label for="new-user-input">{{ $t('userSelect.newUser') }}:</label> <label for="new-user-input">{{ $t('userSelect.newUser') }}:</label>
@@ -17,9 +19,7 @@
</div> </div>
<Divider /> <Divider />
<div class="flex w-full flex-col gap-2"> <div class="flex w-full flex-col gap-2">
<label for="existing-user-select" <label for="existing-user-select">{{ $t('userSelect.existingUser') }}:</label>
>{{ $t('userSelect.existingUser') }}:</label
>
<Select <Select
v-model="selectedUser" v-model="selectedUser"
class="w-full" class="w-full"
@@ -29,12 +29,17 @@
:placeholder="$t('userSelect.selectUser')" :placeholder="$t('userSelect.selectUser')"
:disabled="createNewUser" :disabled="createNewUser"
/> />
<Message v-if="error" severity="error"> <Message
v-if="error"
severity="error"
>
{{ error }} {{ error }}
</Message> </Message>
</div> </div>
<footer class="mt-5"> <footer class="mt-5">
<Button @click="login">{{ $t('userSelect.next') }}</Button> <Button @click="login">
{{ $t('userSelect.next') }}
</Button>
</footer> </footer>
</div> </div>
</main> </main>

View File

@@ -12,7 +12,10 @@
<ProgressSpinner class="mb-2 h-8 w-8" /> <ProgressSpinner class="mb-2 h-8 w-8" />
{{ $t('manager.loadingVersions') }} {{ $t('manager.loadingVersions') }}
</div> </div>
<div v-else-if="versionOptions.length === 0" class="py-2"> <div
v-else-if="versionOptions.length === 0"
class="py-2"
>
<NoResultsPlaceholder <NoResultsPlaceholder
:title="$t('g.noResultsFound')" :title="$t('g.noResultsFound')"
:message="$t('manager.tryAgainLater')" :message="$t('manager.tryAgainLater')"
@@ -36,7 +39,7 @@
<div class="flex w-full items-center justify-between p-1"> <div class="flex w-full items-center justify-between p-1">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<template v-if="slotProps.option.value === 'nightly'"> <template v-if="slotProps.option.value === 'nightly'">
<div class="w-4"></div> <div class="w-4" />
</template> </template>
<template v-else> <template v-else>
<i <i
@@ -47,7 +50,11 @@
}" }"
class="icon-[lucide--triangle-alert] text-warning-background" class="icon-[lucide--triangle-alert] text-warning-background"
/> />
<VerifiedIcon v-else :size="20" class="relative right-0.5" /> <VerifiedIcon
v-else
:size="20"
class="relative right-0.5"
/>
</template> </template>
<span>{{ slotProps.option.label }}</span> <span>{{ slotProps.option.label }}</span>
</div> </div>

View File

@@ -1,6 +1,8 @@
<template> <template>
<div class="flex py-1.5 text-xs"> <div class="flex py-1.5 text-xs">
<div class="w-1/3 truncate pr-2 text-muted">{{ label }}</div> <div class="w-1/3 truncate pr-2 text-muted">
{{ label }}
</div>
<div class="w-2/3"> <div class="w-2/3">
<slot>{{ value }}</slot> <slot>{{ value }}</slot>
</div> </div>

View File

@@ -2,8 +2,11 @@
<div <div
class="flex min-h-12 items-center justify-between px-4 py-2 text-xs leading-3 font-medium text-muted" class="flex min-h-12 items-center justify-between px-4 py-2 text-xs leading-3 font-medium text-muted"
> >
<div v-if="nodePack.downloads" class="flex items-center gap-1.5"> <div
<i class="pi pi-download text-muted"></i> v-if="nodePack.downloads"
class="flex items-center gap-1.5"
>
<i class="pi pi-download text-muted" />
<span>{{ formattedDownloads }}</span> <span>{{ formattedDownloads }}</span>
</div> </div>
<PackInstallButton <PackInstallButton
@@ -13,7 +16,10 @@
:has-conflict="hasConflicts" :has-conflict="hasConflicts"
:conflict-info="conflictInfo" :conflict-info="conflictInfo"
/> />
<PackEnableToggle v-else :node-pack="nodePack" /> <PackEnableToggle
v-else
:node-pack="nodePack"
/>
</div> </div>
</template> </template>