- {/* Profile Picture */}
-
- {template.creator.profileImageUrl ? (
-
-

-
- ) : (
-
-
-
- )}
-
+
+
+ About the Creator
+
+
+ {/* Profile Picture */}
+
+ {template.creator.profileImageUrl ? (
+
+

+
+ ) : (
+
+
+
+ )}
+
- {/* Creator Info */}
-
-
{template.creator.name}
- {template.creator.details?.about && (
-
- {template.creator.details.about}
-
- )}
-
- {/* Social Links */}
- {(template.creator.details?.xUrl ||
- template.creator.details?.linkedinUrl ||
- template.creator.details?.websiteUrl ||
- template.creator.details?.contactEmail) && (
-
- {template.creator.details.xUrl && (
-
-
- X
-
- )}
- {template.creator.details.linkedinUrl && (
-
-
- LinkedIn
-
- )}
- {template.creator.details.websiteUrl && (
-
-
- Website
-
- )}
- {template.creator.details.contactEmail && (
-
-
- Contact
-
- )}
-
- )}
-
+ {/* Creator Info */}
+
+
+ {template.creator.name}
+
+ {template.creator.details?.about && (
+
+ {template.creator.details.about}
+
+ )}
+
+ {/* Social Links */}
+ {(template.creator.details?.xUrl ||
+ template.creator.details?.linkedinUrl ||
+ template.creator.details?.websiteUrl ||
+ template.creator.details?.contactEmail) && (
+
+ {template.creator.details.xUrl && (
+
+
+ X
+
+ )}
+ {template.creator.details.linkedinUrl && (
+
+
+ LinkedIn
+
+ )}
+ {template.creator.details.websiteUrl && (
+
+
+ Website
+
+ )}
+ {template.creator.details.contactEmail && (
+
+
+ Contact
+
+ )}
+
+ )}
diff --git a/apps/sim/app/templates/components/template-card.tsx b/apps/sim/app/templates/components/template-card.tsx
index 75e4b029d1..89ca38754d 100644
--- a/apps/sim/app/templates/components/template-card.tsx
+++ b/apps/sim/app/templates/components/template-card.tsx
@@ -337,8 +337,8 @@ export function TemplateCard({
className={cn(
'h-4 w-4 cursor-pointer transition-colors duration-50',
localIsStarred
- ? 'fill-yellow-400 text-yellow-400'
- : 'text-muted-foreground hover:fill-yellow-400 hover:text-yellow-400',
+ ? 'fill-yellow-500 text-yellow-500'
+ : 'text-muted-foreground hover:fill-yellow-500 hover:text-yellow-500',
isStarLoading && 'opacity-50'
)}
/>
diff --git a/apps/sim/app/templates/template-card.tsx b/apps/sim/app/templates/template-card.tsx
index c385b0d249..03f5d65234 100644
--- a/apps/sim/app/templates/template-card.tsx
+++ b/apps/sim/app/templates/template-card.tsx
@@ -460,8 +460,8 @@ export function TemplateCard({
className={cn(
'h-4 w-4 cursor-pointer transition-colors duration-50',
localIsStarred
- ? 'fill-yellow-400 text-yellow-400'
- : 'text-muted-foreground hover:fill-yellow-400 hover:text-yellow-400',
+ ? 'fill-yellow-500 text-yellow-500'
+ : 'text-muted-foreground hover:fill-yellow-500 hover:text-yellow-500',
isStarLoading && 'opacity-50'
)}
/>
diff --git a/apps/sim/app/theme-provider.tsx b/apps/sim/app/theme-provider.tsx
index 118bee9a42..c1f847bb07 100644
--- a/apps/sim/app/theme-provider.tsx
+++ b/apps/sim/app/theme-provider.tsx
@@ -7,24 +7,25 @@ import { ThemeProvider as NextThemesProvider } from 'next-themes'
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
const pathname = usePathname()
- // Force dark mode for workspace pages
+ // Force dark mode for workspace pages and templates
// Force light mode for certain public pages
- const forcedTheme = pathname.startsWith('/workspace')
- ? 'dark'
- : pathname === '/' ||
- pathname.startsWith('/login') ||
- pathname.startsWith('/signup') ||
- pathname.startsWith('/sso') ||
- pathname.startsWith('/terms') ||
- pathname.startsWith('/privacy') ||
- pathname.startsWith('/invite') ||
- pathname.startsWith('/verify') ||
- pathname.startsWith('/careers') ||
- pathname.startsWith('/changelog') ||
- pathname.startsWith('/chat') ||
- pathname.startsWith('/studio')
- ? 'light'
- : undefined
+ const forcedTheme =
+ pathname.startsWith('/workspace') || pathname.startsWith('/templates')
+ ? 'dark'
+ : pathname === '/' ||
+ pathname.startsWith('/login') ||
+ pathname.startsWith('/signup') ||
+ pathname.startsWith('/sso') ||
+ pathname.startsWith('/terms') ||
+ pathname.startsWith('/privacy') ||
+ pathname.startsWith('/invite') ||
+ pathname.startsWith('/verify') ||
+ pathname.startsWith('/careers') ||
+ pathname.startsWith('/changelog') ||
+ pathname.startsWith('/chat') ||
+ pathname.startsWith('/studio')
+ ? 'light'
+ : undefined
return (
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/template-deploy/template-deploy.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/template-deploy/template-deploy.tsx
index 85bfa7be75..c78c4bf06f 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/template-deploy/template-deploy.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/template-deploy/template-deploy.tsx
@@ -78,33 +78,66 @@ export function TemplateDeploy({ workflowId, onDeploymentComplete }: TemplateDep
})
// Fetch creator profiles
- useEffect(() => {
- const fetchCreatorOptions = async () => {
- if (!session?.user?.id) return
+ const fetchCreatorOptions = async () => {
+ if (!session?.user?.id) return
- setLoadingCreators(true)
- try {
- const response = await fetch('/api/creator-profiles')
- if (response.ok) {
- const data = await response.json()
- const profiles = (data.profiles || []).map((profile: any) => ({
- id: profile.id,
- name: profile.name,
- referenceType: profile.referenceType,
- referenceId: profile.referenceId,
- }))
- setCreatorOptions(profiles)
- }
- } catch (error) {
- logger.error('Error fetching creator profiles:', error)
- } finally {
- setLoadingCreators(false)
+ setLoadingCreators(true)
+ try {
+ const response = await fetch('/api/creator-profiles')
+ if (response.ok) {
+ const data = await response.json()
+ const profiles = (data.profiles || []).map((profile: any) => ({
+ id: profile.id,
+ name: profile.name,
+ referenceType: profile.referenceType,
+ referenceId: profile.referenceId,
+ }))
+ setCreatorOptions(profiles)
+ return profiles
}
+ } catch (error) {
+ logger.error('Error fetching creator profiles:', error)
+ } finally {
+ setLoadingCreators(false)
}
+ return []
+ }
+ useEffect(() => {
fetchCreatorOptions()
}, [session?.user?.id])
+ // Auto-select creator profile when there's only one option and no selection yet
+ useEffect(() => {
+ const currentCreatorId = form.getValues('creatorId')
+ if (creatorOptions.length === 1 && !currentCreatorId) {
+ form.setValue('creatorId', creatorOptions[0].id)
+ logger.info('Auto-selected single creator profile:', creatorOptions[0].name)
+ }
+ }, [creatorOptions, form])
+
+ // Listen for creator profile saved event
+ useEffect(() => {
+ const handleCreatorProfileSaved = async () => {
+ logger.info('Creator profile saved, refreshing profiles...')
+
+ // Refetch creator profiles (autoselection will happen via the effect above)
+ await fetchCreatorOptions()
+
+ // Close settings modal and reopen deploy modal to template tab
+ window.dispatchEvent(new CustomEvent('close-settings'))
+ setTimeout(() => {
+ window.dispatchEvent(new CustomEvent('open-deploy-modal', { detail: { tab: 'template' } }))
+ }, 100)
+ }
+
+ window.addEventListener('creator-profile-saved', handleCreatorProfileSaved)
+
+ return () => {
+ window.removeEventListener('creator-profile-saved', handleCreatorProfileSaved)
+ }
+ }, [])
+
// Check for existing template
useEffect(() => {
const checkExistingTemplate = async () => {
@@ -454,12 +487,12 @@ export function TemplateDeploy({ workflowId, onDeploymentComplete }: TemplateDep
)}
{/* Template State Preview Dialog */}
- {showPreviewDialog && (
-