Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
fbb81471
Unverified
提交
fbb81471
authored
4月 29, 2025
作者:
Will Chen
提交者:
GitHub
4月 29, 2025
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Inspiration prompts for home screen (#38)
上级
982ba488
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
396 行增加
和
83 行删除
+396
-83
home.tsx
src/pages/home.tsx
+70
-83
inspiration_prompts.tsx
src/prompts/inspiration_prompts.tsx
+326
-0
没有找到文件。
src/pages/home.tsx
浏览文件 @
fbb81471
...
...
@@ -8,11 +8,12 @@ import { useLoadApps } from "@/hooks/useLoadApps";
import
{
useSettings
}
from
"@/hooks/useSettings"
;
import
{
SetupBanner
}
from
"@/components/SetupBanner"
;
import
{
isPreviewOpenAtom
}
from
"@/atoms/viewAtoms"
;
import
{
useState
,
useEffect
}
from
"react"
;
import
{
useState
,
useEffect
,
useCallback
}
from
"react"
;
import
{
useStreamChat
}
from
"@/hooks/useStreamChat"
;
import
{
HomeChatInput
}
from
"@/components/chat/HomeChatInput"
;
import
{
usePostHog
}
from
"posthog-js/react"
;
import
{
PrivacyBanner
}
from
"@/components/TelemetryBanner"
;
import
{
INSPIRATION_PROMPTS
}
from
"@/prompts/inspiration_prompts"
;
export
default
function
HomePage
()
{
const
[
inputValue
,
setInputValue
]
=
useAtom
(
homeChatInputValueAtom
);
...
...
@@ -28,6 +29,22 @@ export default function HomePage() {
// Get the appId from search params
const
appId
=
search
.
appId
?
Number
(
search
.
appId
)
:
null
;
// State for random prompts
const
[
randomPrompts
,
setRandomPrompts
]
=
useState
<
typeof
INSPIRATION_PROMPTS
>
([]);
// Function to get random prompts
const
getRandomPrompts
=
useCallback
(()
=>
{
const
shuffled
=
[...
INSPIRATION_PROMPTS
].
sort
(()
=>
0.5
-
Math
.
random
());
return
shuffled
.
slice
(
0
,
5
);
},
[]);
// Initialize random prompts
useEffect
(()
=>
{
setRandomPrompts
(
getRandomPrompts
());
},
[
getRandomPrompts
]);
// Redirect to app details page if appId is present
useEffect
(()
=>
{
if
(
appId
)
{
...
...
@@ -92,89 +109,59 @@ export default function HomePage() {
<
div
className=
"w-full"
>
<
HomeChatInput
onSubmit=
{
handleSubmit
}
/>
<
div
className=
"flex flex-wrap gap-4 mt-4"
>
{
[
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"
/>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M15 13a3 3 0 11-6 0 3 3 0 016 0z"
/>
</
svg
>
),
label
:
"TODO list app"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1h2a1 1 0 001-1v-7m-6 0a1 1 0 00-1 1v3"
/>
</
svg
>
),
label
:
"Landing Page"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
/>
</
svg
>
),
label
:
"Sign Up Form"
,
},
].
map
((
item
,
index
)
=>
(
<
button
type=
"button"
key=
{
index
}
onClick=
{
()
=>
setInputValue
(
`Build me a ${item.label}`
)
}
className=
"flex items-center gap-3 px-4 py-2 rounded-xl border border-gray-200
bg-white/50 backdrop-blur-sm
transition-all duration-200
hover:bg-white hover:shadow-md hover:border-gray-300
active:scale-[0.98]
dark:bg-gray-800/50 dark:border-gray-700
dark:hover:bg-gray-800 dark:hover:border-gray-600"
<
div
className=
"flex flex-col gap-4 mt-4"
>
<
div
className=
"flex flex-wrap gap-4 justify-center"
>
{
randomPrompts
.
map
((
item
,
index
)
=>
(
<
button
type=
"button"
key=
{
index
}
onClick=
{
()
=>
setInputValue
(
`Build me a ${item.label}`
)
}
className=
"flex items-center gap-3 px-4 py-2 rounded-xl border border-gray-200
bg-white/50 backdrop-blur-sm
transition-all duration-200
hover:bg-white hover:shadow-md hover:border-gray-300
active:scale-[0.98]
dark:bg-gray-800/50 dark:border-gray-700
dark:hover:bg-gray-800 dark:hover:border-gray-600"
>
<
span
className=
"text-gray-700 dark:text-gray-300"
>
{
item
.
icon
}
</
span
>
<
span
className=
"text-sm font-medium text-gray-700 dark:text-gray-300"
>
{
item
.
label
}
</
span
>
</
button
>
))
}
</
div
>
<
button
type=
"button"
onClick=
{
()
=>
setRandomPrompts
(
getRandomPrompts
())
}
className=
"self-center flex items-center gap-2 px-4 py-2 rounded-xl border border-gray-200
bg-white/50 backdrop-blur-sm
transition-all duration-200
hover:bg-white hover:shadow-md hover:border-gray-300
active:scale-[0.98]
dark:bg-gray-800/50 dark:border-gray-700
dark:hover:bg-gray-800 dark:hover:border-gray-600"
>
<
svg
className=
"w-5 h-5 text-gray-700 dark:text-gray-300"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
span
className=
"text-gray-700 dark:text-gray-300"
>
{
item
.
icon
}
</
span
>
<
span
className=
"text-sm font-medium text-gray-700 dark:text-gray-300"
>
{
item
.
label
}
</
span
>
</
button
>
))
}
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
/>
</
svg
>
<
span
className=
"text-sm font-medium text-gray-700 dark:text-gray-300"
>
More ideas
</
span
>
</
button
>
</
div
>
</
div
>
<
PrivacyBanner
/>
...
...
src/prompts/inspiration_prompts.tsx
0 → 100644
浏览文件 @
fbb81471
export
const
INSPIRATION_PROMPTS
=
[
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"
/>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M15 13a3 3 0 11-6 0 3 3 0 016 0z"
/>
</
svg
>
),
label
:
"TODO list app"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1h2a1 1 0 001-1v-7m-6 0a1 1 0 00-1 1v3"
/>
</
svg
>
),
label
:
"Landing Page"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
/>
</
svg
>
),
label
:
"Sign Up Form"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M13.5 3.5C13.5 4.33 12.83 5 12 5S10.5 4.33 10.5 3.5 11.17 2 12 2s1.5.67 1.5 1.5z"
/>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M19.74 5.826a3.756 3.756 0 00-1.616-3.573 3.733 3.733 0 00-3.91-.27L12 3l-2.214-1.017a3.733 3.733 0 00-3.91.27 3.756 3.756 0 00-1.616 3.573l.284 5.294C4.858 13.8 6.83 16.269 9.5 17.5l.5.5.5.5 1.5-1 1.5 1 .5-.5.5-.5c2.67-1.231 4.642-3.7 4.956-6.38l.284-5.294z"
/>
</
svg
>
),
label
:
"Mood Journal & Tracker"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"
/>
</
svg
>
),
label
:
"Interactive Story Game"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M21 15.546c-.523 0-1.046.151-1.5.454a2.704 2.704 0 01-3 0 2.704 2.704 0 00-3 0 2.704 2.704 0 01-3 0 2.704 2.704 0 00-3 0 2.701 2.701 0 00-1.5-.454M9 6v2m3-2v2m3-2v2M9 3h.01M12 3h.01M15 3h.01M21 21v-7a2 2 0 00-2-2H5a2 2 0 00-2 2v7h18zm-3-9v-2a2 2 0 00-2-2H8a2 2 0 00-2 2v2h12z"
/>
</
svg
>
),
label
:
"Recipe Finder & Meal Planner"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"
/>
</
svg
>
),
label
:
"Personal Finance Dashboard"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"
/>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M15 11a3 3 0 11-6 0 3 3 0 016 0z"
/>
</
svg
>
),
label
:
"Travel Memory Map"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"
/>
</
svg
>
),
label
:
"AI Writing Assistant"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M14.828 14.828a4 4 0 01-5.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</
svg
>
),
label
:
"Emoji Translator"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"
/>
</
svg
>
),
label
:
"Habit Streak Tracker"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M3 8l7.89 5.26a2 2 0 012.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
/>
</
svg
>
),
label
:
"Newsletter Creator"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3"
/>
</
svg
>
),
label
:
"Music Discovery App"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"
/>
</
svg
>
),
label
:
"3D Portfolio Viewer"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</
svg
>
),
label
:
"AI Image Generator"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</
svg
>
),
label
:
"Pomodoro Focus Timer"
,
},
{
icon
:
(
<
svg
className=
"w-5 h-5"
fill=
"none"
stroke=
"currentColor"
viewBox=
"0 0 24 24"
>
<
path
strokeLinecap=
"round"
strokeLinejoin=
"round"
strokeWidth=
{
2
}
d=
"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
/>
</
svg
>
),
label
:
"Virtual Avatar Builder"
,
},
];
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论