mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-13 09:00:16 +00:00
## Summary Remove Tailwind `@apply` from Vue styles across `src/` and `apps/desktop-ui/src/` to align with Tailwind v4 guidance, replacing usages with template utilities or native CSS while preserving behavior. ## Changes - **What**: - Batch 1: migrated low-risk template/style utility bundles out of `@apply`. - Batch 2: converted PrimeVue/`:deep()` override `@apply` blocks to native CSS declarations. - Batch 3: converted `src/components/node/NodeHelpContent.vue` markdown styling from `@apply` to native CSS/token-based declarations. - Batch 4: converted final desktop pseudo-element `@apply` styles and removed stale `@reference` directives no longer required. - Verified `rg -n "^\s*@apply\b" src apps -g "*.vue"` has no real CSS `@apply` directives remaining (only known template false-positive event binding in `NodeSearchContent.vue`). ## Review Focus - Visual parity in components that previously depended on `@apply` in `:deep()` selectors and markdown content: - topbar tabs/popovers, dialogs, breadcrumb, terminal overrides - desktop install/dialog/update/maintenance surfaces - node help markdown rendering - Confirm no regressions from removal of now-unneeded `@reference` directives. ## Screenshots (if applicable) - No new screenshots included in this PR. - Screenshot Playwright suite was run with `--grep="@screenshot"` and reports baseline diffs in this environment (164 passed, 39 failed, 3 skipped) plus a teardown `EPERM` restore error on local path `C:\Users\DrJKL\ComfyUI\LTXV\user`. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9146-fix-eradicate-tailwind-apply-usage-in-vue-styles-3116d73d3650813d8642e0bada13df32) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
126 lines
2.8 KiB
Vue
126 lines
2.8 KiB
Vue
<!-- The main global dialog to show various things -->
|
|
<template>
|
|
<Dialog
|
|
v-for="item in dialogStore.dialogStack"
|
|
:key="item.key"
|
|
v-model:visible="item.visible"
|
|
class="global-dialog"
|
|
v-bind="item.dialogComponentProps"
|
|
:pt="getDialogPt(item)"
|
|
:aria-labelledby="item.key"
|
|
>
|
|
<template #header>
|
|
<div v-if="!item.dialogComponentProps?.headless">
|
|
<component
|
|
:is="item.headerComponent"
|
|
v-if="item.headerComponent"
|
|
v-bind="item.headerProps"
|
|
:id="item.key"
|
|
/>
|
|
<h3 v-else :id="item.key">
|
|
{{ item.title || ' ' }}
|
|
</h3>
|
|
</div>
|
|
</template>
|
|
|
|
<component
|
|
:is="item.component"
|
|
v-bind="item.contentProps"
|
|
:maximized="item.dialogComponentProps.maximized"
|
|
/>
|
|
|
|
<template v-if="item.footerComponent" #footer>
|
|
<component :is="item.footerComponent" v-bind="item.footerProps" />
|
|
</template>
|
|
</Dialog>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { merge } from 'es-toolkit/compat'
|
|
import Dialog from 'primevue/dialog'
|
|
import type { DialogPassThroughOptions } from 'primevue/dialog'
|
|
import { computed } from 'vue'
|
|
|
|
import { useFeatureFlags } from '@/composables/useFeatureFlags'
|
|
import { isCloud } from '@/platform/distribution/types'
|
|
import type { DialogComponentProps } from '@/stores/dialogStore'
|
|
import { useDialogStore } from '@/stores/dialogStore'
|
|
|
|
const { flags } = useFeatureFlags()
|
|
const teamWorkspacesEnabled = computed(
|
|
() => isCloud && flags.teamWorkspacesEnabled
|
|
)
|
|
|
|
const dialogStore = useDialogStore()
|
|
|
|
function getDialogPt(item: {
|
|
key: string
|
|
dialogComponentProps: DialogComponentProps
|
|
}): DialogPassThroughOptions {
|
|
const isWorkspaceSettingsDialog =
|
|
item.key === 'global-settings' && teamWorkspacesEnabled.value
|
|
const basePt = item.dialogComponentProps.pt || {}
|
|
|
|
if (isWorkspaceSettingsDialog) {
|
|
return merge(basePt, {
|
|
mask: { class: 'p-8' }
|
|
})
|
|
}
|
|
return basePt
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.global-dialog {
|
|
max-width: calc(100vw - 1rem);
|
|
}
|
|
|
|
.global-dialog .p-dialog-header {
|
|
padding: calc(var(--spacing) * 2);
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
.global-dialog .p-dialog-content {
|
|
padding: calc(var(--spacing) * 2);
|
|
padding-top: 0;
|
|
}
|
|
|
|
@media (min-width: 1536px) {
|
|
.global-dialog .p-dialog-header {
|
|
padding: var(--p-dialog-header-padding);
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
.global-dialog .p-dialog-content {
|
|
padding: var(--p-dialog-content-padding);
|
|
padding-top: 0;
|
|
}
|
|
}
|
|
|
|
/* Workspace mode: wider settings dialog */
|
|
.settings-dialog-workspace {
|
|
width: 100%;
|
|
max-width: 1440px;
|
|
height: 100%;
|
|
}
|
|
|
|
.settings-dialog-workspace .p-dialog-content {
|
|
width: 100%;
|
|
height: 100%;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.manager-dialog {
|
|
height: 80vh;
|
|
max-width: 1724px;
|
|
max-height: 1026px;
|
|
}
|
|
|
|
@media (min-width: 3000px) {
|
|
.manager-dialog {
|
|
max-width: 2200px;
|
|
max-height: 1320px;
|
|
}
|
|
}
|
|
</style>
|