diff --git a/packages/nc-gui/components/general/ProjectIcon.vue b/packages/nc-gui/components/general/ProjectIcon.vue index 7a52b9858f..db5c29f22c 100644 --- a/packages/nc-gui/components/general/ProjectIcon.vue +++ b/packages/nc-gui/components/general/ProjectIcon.vue @@ -17,24 +17,34 @@ const props = withDefaults( ) const { color, managedApp } = toRefs(props) -const iconColor = computed(() => { - return color.value && tinycolor(color.value).isValid() - ? { - tint: baseIconColors.includes(color.value) ? color.value : tinycolor(color.value).lighten(10).toHexString(), - shade: tinycolor(color.value).darken(40).toHexString(), - } - : { - tint: baseIconColors[0], - shade: tinycolor(baseIconColors[0]).darken(40).toHexString(), - } -}) - const managedAppInfo = computed(() => { return { isManagedApp: isEeUI && !!managedApp.value?.managed_app_id, isMaster: !!managedApp.value?.managed_app_master && !!managedApp.value?.managed_app_id, } }) + +const iconColor = computed(() => { + return color.value && tinycolor(color.value).isValid() + ? { + tint: baseIconColors.includes(color.value) ? color.value : tinycolor(color.value).lighten(10).toHexString(), + shade: tinycolor(color.value) + .darken(managedAppInfo.value.isManagedApp ? 30 : 40) + .toHexString(), + } + : { + tint: baseIconColors[0], + shade: tinycolor(baseIconColors[0]) + .darken(managedAppInfo.value.isManagedApp ? 30 : 40) + .toHexString(), + } +}) + +// Unique gradient ID based on app ID and color to avoid SVG gradient conflicts +const gradientId = computed(() => { + const colorHash = color.value?.replace('#', '') || 'default' + return `sphere-${managedApp.value?.managed_app_id || 'default'}-${colorHash}` +})