Skip to content

Commit 48c2afb

Browse files
committed
Refine builder partner prompt flow
1 parent d82a4df commit 48c2afb

19 files changed

Lines changed: 1418 additions & 1947 deletions

src/components/ApplicationStarter.tsx

Lines changed: 508 additions & 636 deletions
Large diffs are not rendered by default.

src/components/ApplicationStarterHotkeys.client.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import * as React from 'react'
22
import { useHeldKeys, useHotkey } from '@tanstack/react-hotkeys'
33

44
interface ApplicationStarterHotkeysProps {
5-
onAnalyze: () => void
5+
onSubmit: () => void
66
onModKeyChange: (isHeld: boolean) => void
77
promptFocused: boolean
88
}
99

1010
export function ApplicationStarterHotkeys({
11-
onAnalyze,
11+
onSubmit,
1212
onModKeyChange,
1313
promptFocused,
1414
}: ApplicationStarterHotkeysProps) {
@@ -20,7 +20,7 @@ export function ApplicationStarterHotkeys({
2020
return
2121
}
2222

23-
onAnalyze()
23+
onSubmit()
2424
})
2525

2626
React.useEffect(() => {

src/components/application-builder/parts.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,20 +240,24 @@ const StarterPartnerButton = React.forwardRef<
240240
const tierOneTone = isTierOne
241241
? selected
242242
? 'translate-y-[-1px] border-transparent'
243-
: 'border-gray-200 bg-white hover:border-[var(--starter-partner-hover-border-color)] dark:border-gray-800 dark:bg-gray-950 dark:hover:border-[var(--starter-partner-hover-border-color)]'
243+
: 'border-gray-200 bg-white hover:border-[var(--starter-partner-hover-border-color)] active:border-[var(--starter-partner-active-border-color)] dark:border-gray-800 dark:bg-gray-950 dark:hover:border-[var(--starter-partner-hover-border-color)] dark:active:border-[var(--starter-partner-active-border-color)]'
244244
: null
245245
const tierThreeTone = isTierThree
246246
? selected
247247
? 'translate-y-[-1px] border-current bg-white shadow-[0_4px_12px_rgba(15,23,42,0.08)] dark:bg-gray-950'
248-
: 'border-gray-200 bg-white text-gray-700 hover:border-[var(--starter-partner-hover-border-color)] hover:text-current dark:border-gray-800 dark:bg-gray-950 dark:text-gray-200 dark:hover:border-[var(--starter-partner-hover-border-color)]'
248+
: 'border-gray-200 bg-white text-gray-700 hover:border-[var(--starter-partner-hover-border-color)] hover:text-current active:border-[var(--starter-partner-active-border-color)] dark:border-gray-800 dark:bg-gray-950 dark:text-gray-200 dark:hover:border-[var(--starter-partner-hover-border-color)] dark:active:border-[var(--starter-partner-active-border-color)]'
249249
: null
250+
const hoverBorderColor = colorWithAlpha(accent, 0.5) ?? accent
250251
const style: StarterPartnerButtonStyle = {
251-
'--starter-partner-border-hover': usesPaletteSurface ? accent : undefined,
252-
'--starter-partner-hover-border-color': accent,
252+
'--starter-partner-active-border-color': accent,
253+
'--starter-partner-border-hover': usesPaletteSurface
254+
? hoverBorderColor
255+
: undefined,
256+
'--starter-partner-hover-border-color': hoverBorderColor,
253257
backgroundColor: undefined,
254258
borderColor:
255259
isTierOne && selected
256-
? colorWithAlpha(accent, 0.92)
260+
? accent
257261
: selected && usesPaletteSurface
258262
? accent
259263
: undefined,
@@ -283,7 +287,7 @@ const StarterPartnerButton = React.forwardRef<
283287
tierOneTone,
284288
usesPaletteSurface && palette.chip,
285289
usesPaletteSurface &&
286-
'hover:border-[var(--starter-partner-border-hover)]',
290+
'hover:border-[var(--starter-partner-border-hover)] active:border-[var(--starter-partner-active-border-color)]',
287291
tierThreeTone,
288292
buttonProps.className,
289293
)}

src/components/application-builder/shared.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010

1111
export type StarterTone = 'cyan' | 'emerald' | 'violet'
1212
export type StarterDeployProvider = 'cloudflare' | 'netlify' | 'railway'
13+
export type StarterPromptDeployProvider = 'lovable' | 'netlify'
1314
export type StarterPackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn'
1415
export type StarterToolchain = 'biome' | 'eslint'
1516

@@ -21,7 +22,10 @@ export interface StarterPalette {
2122
}
2223

2324
export interface ApplicationStarterBuilderIntegration {
24-
applyResult: (result: ApplicationStarterResult) => Promise<boolean>
25+
applyResult: (
26+
result: ApplicationStarterResult,
27+
options?: { silent?: boolean },
28+
) => Promise<boolean>
2529
}
2630

2731
export interface ApplicationStarterAnonymousQuota {
@@ -45,6 +49,7 @@ export interface StarterTryLibrary {
4549
}
4650

4751
export type StarterPartnerButtonStyle = CSSProperties & {
52+
'--starter-partner-active-border-color'?: string
4853
'--starter-partner-border-hover'?: string
4954
'--starter-partner-hover-border-color'?: string
5055
}
@@ -138,6 +143,31 @@ export const starterLoadingPhrases = [
138143
'Finding calmer waters...',
139144
]
140145

146+
export function buildStarterPromptDeployUrl(
147+
provider: StarterPromptDeployProvider,
148+
prompt: string,
149+
) {
150+
switch (provider) {
151+
case 'lovable': {
152+
const url = new URL('https://lovable.dev/')
153+
154+
url.searchParams.set('autosubmit', 'true')
155+
url.searchParams.set('utm_source', 'tanstack')
156+
url.searchParams.set('prompt', prompt)
157+
158+
return url.toString()
159+
}
160+
case 'netlify': {
161+
const url = new URL('https://app.netlify.com/start')
162+
163+
url.searchParams.set('prompt', prompt)
164+
url.searchParams.set('utm_source', 'tanstack')
165+
166+
return url.toString()
167+
}
168+
}
169+
}
170+
141171
export function isPinnedStarterLibrary(libraryId: LibraryId) {
142172
return starterPinnedLibraryIds.some(
143173
(pinnedLibraryId) => pinnedLibraryId === libraryId,

0 commit comments

Comments
 (0)