kaddidlehopper 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTEXT.md +139 -0
- package/README.md +47 -0
- package/add-ons/ai/README.md +34 -0
- package/add-ons/ai/assets/_dot_env.local.append +13 -0
- package/add-ons/ai/assets/src/components/AIAssistant.tsx +149 -0
- package/add-ons/ai/assets/src/lib/ai-hook.ts +21 -0
- package/add-ons/ai/assets/src/lib/weather-tools.ts +30 -0
- package/add-ons/ai/assets/src/routes/api.chat.ts +94 -0
- package/add-ons/ai/assets/src/routes/chat.css +175 -0
- package/add-ons/ai/assets/src/routes/chat.tsx +141 -0
- package/add-ons/ai/info.json +27 -0
- package/add-ons/ai/package.json +17 -0
- package/add-ons/ai/small-logo.svg +8 -0
- package/dist/cli.js +251 -0
- package/dist/index.js +33 -0
- package/dist/types/cli.d.ts +8 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/types.d.ts +14 -0
- package/dist/types.js +1 -0
- package/examples/blog/README.md +60 -0
- package/examples/blog/assets/content/posts/beach.md +12 -0
- package/examples/blog/assets/content/posts/jungle.md.ejs +12 -0
- package/examples/blog/assets/content/posts/mountains.md.ejs +12 -0
- package/examples/blog/assets/content/posts/snorkeling.md.ejs +12 -0
- package/examples/blog/assets/content/posts/waterfall.md.ejs +12 -0
- package/examples/blog/assets/content-collections.ts +30 -0
- package/examples/blog/assets/public/beach.jpg +0 -0
- package/examples/blog/assets/public/jungle.jpg +0 -0
- package/examples/blog/assets/public/mountains.jpg +0 -0
- package/examples/blog/assets/public/snorkeling.jpg +0 -0
- package/examples/blog/assets/public/waterfall.jpg +0 -0
- package/examples/blog/assets/src/components/Header.tsx +52 -0
- package/examples/blog/assets/src/components/VacayAssistant.tsx +205 -0
- package/examples/blog/assets/src/components/blog-posts.tsx +78 -0
- package/examples/blog/assets/src/components/ui/card.tsx +92 -0
- package/examples/blog/assets/src/lib/blog-ai-hook.ts +25 -0
- package/examples/blog/assets/src/lib/blog-tools.ts +111 -0
- package/examples/blog/assets/src/lib/utils.ts +6 -0
- package/examples/blog/assets/src/routes/__root.tsx +57 -0
- package/examples/blog/assets/src/routes/api.blog-chat.ts +117 -0
- package/examples/blog/assets/src/routes/category.$category.tsx +19 -0
- package/examples/blog/assets/src/routes/index.tsx +19 -0
- package/examples/blog/assets/src/routes/posts.$slug.tsx +63 -0
- package/examples/blog/assets/src/styles.css +138 -0
- package/examples/blog/info.json +43 -0
- package/examples/blog/package.json +23 -0
- package/examples/events/README.md +110 -0
- package/examples/events/assets/content/speakers/andre-costa.md +22 -0
- package/examples/events/assets/content/speakers/hans-mueller.md.ejs +22 -0
- package/examples/events/assets/content/speakers/isabella-martinez.md.ejs +22 -0
- package/examples/events/assets/content/speakers/kenji-nakamura.md.ejs +22 -0
- package/examples/events/assets/content/speakers/marie-dubois.md.ejs +20 -0
- package/examples/events/assets/content/speakers/priya-sharma.md.ejs +22 -0
- package/examples/events/assets/content/talks/croissant-lamination-secrets.md +39 -0
- package/examples/events/assets/content/talks/french-macaron-mastery.md.ejs +39 -0
- package/examples/events/assets/content/talks/neapolitan-pizza-tradition-meets-innovation.md.ejs +39 -0
- package/examples/events/assets/content/talks/savory-breads-of-the-mediterranean.md.ejs +39 -0
- package/examples/events/assets/content/talks/sourdough-from-starter-to-masterpiece.md.ejs +36 -0
- package/examples/events/assets/content/talks/the-art-of-the-perfect-tart.md.ejs +32 -0
- package/examples/events/assets/content/talks/the-science-of-sugar.md.ejs +39 -0
- package/examples/events/assets/content/talks/umami-in-pastry-east-meets-west.md.ejs +39 -0
- package/examples/events/assets/content-collections.ts +56 -0
- package/examples/events/assets/public/background-1.jpg +0 -0
- package/examples/events/assets/public/background-2.jpg +0 -0
- package/examples/events/assets/public/background-3.jpg +0 -0
- package/examples/events/assets/public/background-4.jpg +0 -0
- package/examples/events/assets/public/conference-logo.png +0 -0
- package/examples/events/assets/public/favicon.ico +0 -0
- package/examples/events/assets/public/speakers/andre-costa.jpg +0 -0
- package/examples/events/assets/public/speakers/hans-mueller.jpg +0 -0
- package/examples/events/assets/public/speakers/isabella-martinez.jpg +0 -0
- package/examples/events/assets/public/speakers/kenji-nakamura.jpg +0 -0
- package/examples/events/assets/public/speakers/marie-dubois.jpg +0 -0
- package/examples/events/assets/public/speakers/priya-sharma.jpg +0 -0
- package/examples/events/assets/public/talks/croissant-lamination-secrets.jpg +0 -0
- package/examples/events/assets/public/talks/french-macaron-mastery.jpg +0 -0
- package/examples/events/assets/public/talks/neapolitan-pizza-tradition-meets-innovation.jpg +0 -0
- package/examples/events/assets/public/talks/savory-breads-of-the-mediterranean.jpg +0 -0
- package/examples/events/assets/public/talks/sourdough-from-starter-to-masterpiece.jpg +0 -0
- package/examples/events/assets/public/talks/the-art-of-the-perfect-tart.jpg +0 -0
- package/examples/events/assets/public/talks/the-science-of-sugar.jpg +0 -0
- package/examples/events/assets/public/talks/umami-in-pastry-east-meets-west.jpg +0 -0
- package/examples/events/assets/public/tanstack-circle-logo.png +0 -0
- package/examples/events/assets/public/tanstack-word-logo-white.svg +1 -0
- package/examples/events/assets/src/components/Header.tsx +59 -0
- package/examples/events/assets/src/components/HeaderNav.tsx +67 -0
- package/examples/events/assets/src/components/HeroCarousel.tsx +61 -0
- package/examples/events/assets/src/components/RemyAssistant.tsx +207 -0
- package/examples/events/assets/src/components/SpeakerCard.tsx +67 -0
- package/examples/events/assets/src/components/TalkCard.tsx +77 -0
- package/examples/events/assets/src/components/ui/card.tsx +92 -0
- package/examples/events/assets/src/lib/conference-ai-hook.ts +26 -0
- package/examples/events/assets/src/lib/conference-tools.ts +210 -0
- package/examples/events/assets/src/lib/model-selection.ts +1 -0
- package/examples/events/assets/src/lib/utils.ts +6 -0
- package/examples/events/assets/src/routes/__root.tsx +70 -0
- package/examples/events/assets/src/routes/api.remy-chat.ts +119 -0
- package/examples/events/assets/src/routes/index.tsx +192 -0
- package/examples/events/assets/src/routes/schedule.index.tsx +274 -0
- package/examples/events/assets/src/routes/speakers.$slug.tsx +122 -0
- package/examples/events/assets/src/routes/speakers.index.tsx +40 -0
- package/examples/events/assets/src/routes/talks.$slug.tsx +116 -0
- package/examples/events/assets/src/routes/talks.index.tsx +40 -0
- package/examples/events/assets/src/styles.css +182 -0
- package/examples/events/info.json +74 -0
- package/examples/events/package.json +23 -0
- package/examples/marketing/README.md +60 -0
- package/examples/marketing/assets/public/logo.png +0 -0
- package/examples/marketing/assets/public/motorcycle-adventure.jpg +0 -0
- package/examples/marketing/assets/public/motorcycle-cruiser.jpg +0 -0
- package/examples/marketing/assets/public/motorcycle-scooter.jpg +0 -0
- package/examples/marketing/assets/public/motorcycle-sport.jpg +0 -0
- package/examples/marketing/assets/public/motorcycle-supersport.jpg +0 -0
- package/examples/marketing/assets/src/components/Header.tsx +36 -0
- package/examples/marketing/assets/src/components/MotorcycleAIAssistant.tsx +162 -0
- package/examples/marketing/assets/src/components/MotorcycleRecommendation.tsx +53 -0
- package/examples/marketing/assets/src/data/motorcycles.ts.ejs +77 -0
- package/examples/marketing/assets/src/lib/motorcycle-ai-hook.ts +24 -0
- package/examples/marketing/assets/src/lib/motorcycle-tools.ts +42 -0
- package/examples/marketing/assets/src/routes/__root.tsx +57 -0
- package/examples/marketing/assets/src/routes/api.motorcycle-chat.ts +78 -0
- package/examples/marketing/assets/src/routes/index.tsx +72 -0
- package/examples/marketing/assets/src/routes/motorcycles/$motorcycleId.tsx +56 -0
- package/examples/marketing/assets/src/store/motorcycle-assistant.ts +3 -0
- package/examples/marketing/assets/src/styles.css +212 -0
- package/examples/marketing/info.json +38 -0
- package/examples/marketing/package.json +14 -0
- package/examples/resume/README.md +82 -0
- package/examples/resume/assets/content/education/code-school.md +17 -0
- package/examples/resume/assets/content/jobs/freelance.md.ejs +13 -0
- package/examples/resume/assets/content/jobs/initech-junior.md +20 -0
- package/examples/resume/assets/content/jobs/initech-lead.md.ejs +29 -0
- package/examples/resume/assets/content/jobs/initrode-senior.md.ejs +28 -0
- package/examples/resume/assets/content-collections.ts +36 -0
- package/examples/resume/assets/public/headshot-on-white.jpg +0 -0
- package/examples/resume/assets/src/components/Header.tsx +33 -0
- package/examples/resume/assets/src/components/ResumeAssistant.tsx +193 -0
- package/examples/resume/assets/src/components/ui/badge.tsx +46 -0
- package/examples/resume/assets/src/components/ui/card.tsx +92 -0
- package/examples/resume/assets/src/components/ui/checkbox.tsx +30 -0
- package/examples/resume/assets/src/components/ui/hover-card.tsx +44 -0
- package/examples/resume/assets/src/components/ui/separator.tsx +26 -0
- package/examples/resume/assets/src/lib/resume-ai-hook.ts +21 -0
- package/examples/resume/assets/src/lib/resume-tools.ts +165 -0
- package/examples/resume/assets/src/lib/utils.ts +6 -0
- package/examples/resume/assets/src/routes/api.resume-chat.ts +110 -0
- package/examples/resume/assets/src/routes/index.tsx +220 -0
- package/examples/resume/assets/src/styles.css +138 -0
- package/examples/resume/info.json +25 -0
- package/examples/resume/package.json +26 -0
- package/package.json +39 -0
- package/project/base/_dot_claude/skills/content-collections/SKILL.md +505 -0
- package/project/base/_dot_claude/skills/netlify-blobs/SKILL.md +410 -0
- package/project/base/_dot_claude/skills/netlify-db/SKILL.md +424 -0
- package/project/base/_dot_claude/skills/netlify-debugging/SKILL.md +419 -0
- package/project/base/_dot_claude/skills/netlify-forms/SKILL.md +243 -0
- package/project/base/_dot_claude/skills/netlify-functions/SKILL.md +372 -0
- package/project/base/_dot_claude/skills/tanstack-start-api-routes/SKILL.md +421 -0
- package/project/base/_dot_claude/skills/tanstack-start-loaders/SKILL.md +426 -0
- package/project/base/_dot_claude/skills/tanstack-start-project-setup/SKILL.md +493 -0
- package/project/base/_dot_claude/skills/tanstack-start-routes/SKILL.md +430 -0
- package/project/base/_dot_claude/skills/tanstack-start-server-functions/SKILL.md +445 -0
- package/project/base/_dot_claude/skills/tanstack-start-typesafe-routing/SKILL.md +494 -0
- package/project/base/_dot_gitignore +8 -0
- package/project/base/netlify.toml +7 -0
- package/project/base/package.json +33 -0
- package/project/base/public/favicon.ico +0 -0
- package/project/base/public/tanstack-circle-logo.png +0 -0
- package/project/base/public/tanstack-word-logo-white.svg +1 -0
- package/project/base/src/components/Header.tsx +17 -0
- package/project/base/src/components/HeaderNav.tsx.ejs +179 -0
- package/project/base/src/router.tsx +15 -0
- package/project/base/src/routes/__root.tsx +57 -0
- package/project/base/src/routes/index.tsx +48 -0
- package/project/base/src/styles.css +15 -0
- package/project/base/tsconfig.json +28 -0
- package/project/base/vite.config.ts.ejs +25 -0
- package/project/packages.json +22 -0
- package/scripts/check-outdated-packages.js +421 -0
- package/src/cli.ts +343 -0
- package/src/index.ts +49 -0
- package/src/types.ts +15 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "highlight.js/styles/github-dark.css";
|
|
3
|
+
|
|
4
|
+
/* Custom scrollbar styles */
|
|
5
|
+
::-webkit-scrollbar {
|
|
6
|
+
width: 8px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
::-webkit-scrollbar-track {
|
|
10
|
+
background: transparent;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
::-webkit-scrollbar-thumb {
|
|
14
|
+
background-color: rgba(156, 163, 175, 0.5);
|
|
15
|
+
border-radius: 4px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
::-webkit-scrollbar-thumb:hover {
|
|
19
|
+
background-color: rgba(156, 163, 175, 0.7);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* Smooth transitions for dark mode */
|
|
23
|
+
html {
|
|
24
|
+
transition: background-color 0.3s ease;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Markdown content styles */
|
|
28
|
+
.prose {
|
|
29
|
+
max-width: none;
|
|
30
|
+
color: #e5e7eb; /* text-gray-200 */
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.prose code {
|
|
34
|
+
color: #e5e7eb;
|
|
35
|
+
background-color: rgba(31, 41, 55, 0.5);
|
|
36
|
+
padding: 0.2em 0.4em;
|
|
37
|
+
border-radius: 0.375rem;
|
|
38
|
+
font-size: 0.875em;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.prose pre {
|
|
42
|
+
background-color: rgba(31, 41, 55, 0.5);
|
|
43
|
+
border-radius: 0.5rem;
|
|
44
|
+
padding: 1rem;
|
|
45
|
+
margin: 1.25em 0;
|
|
46
|
+
overflow-x: auto;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.prose pre code {
|
|
50
|
+
background-color: transparent;
|
|
51
|
+
padding: 0;
|
|
52
|
+
border-radius: 0;
|
|
53
|
+
color: inherit;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.prose h1, .prose h2, .prose h3, .prose h4 {
|
|
57
|
+
color: #f9fafb; /* text-gray-50 */
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.prose ul, .prose ol {
|
|
61
|
+
margin-top: 1.25em;
|
|
62
|
+
margin-bottom: 1.25em;
|
|
63
|
+
padding-left: 1.625em;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.prose li {
|
|
67
|
+
margin-top: 0.5em;
|
|
68
|
+
margin-bottom: 0.5em;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.prose blockquote {
|
|
72
|
+
border-left-color: #f97316; /* orange-500 */
|
|
73
|
+
background-color: rgba(249, 115, 22, 0.1);
|
|
74
|
+
padding: 1em;
|
|
75
|
+
margin: 1.25em 0;
|
|
76
|
+
border-radius: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.prose hr {
|
|
80
|
+
border-color: rgba(249, 115, 22, 0.2);
|
|
81
|
+
margin: 2em 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.prose a {
|
|
85
|
+
color: #f97316; /* orange-500 */
|
|
86
|
+
text-decoration: underline;
|
|
87
|
+
text-decoration-thickness: 0.1em;
|
|
88
|
+
text-underline-offset: 0.2em;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.prose a:hover {
|
|
92
|
+
color: #fb923c; /* orange-400 */
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.prose table {
|
|
96
|
+
width: 100%;
|
|
97
|
+
border-collapse: collapse;
|
|
98
|
+
margin: 1.25em 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.prose th, .prose td {
|
|
102
|
+
padding: 0.75em;
|
|
103
|
+
border: 1px solid rgba(249, 115, 22, 0.2);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.prose th {
|
|
107
|
+
background-color: rgba(249, 115, 22, 0.1);
|
|
108
|
+
font-weight: 600;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Message transition animations */
|
|
112
|
+
.message-enter {
|
|
113
|
+
opacity: 0;
|
|
114
|
+
transform: translateY(10px);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.message-enter-active {
|
|
118
|
+
opacity: 1;
|
|
119
|
+
transform: translateY(0);
|
|
120
|
+
transition: opacity 300ms, transform 300ms;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.message-exit {
|
|
124
|
+
opacity: 1;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.message-exit-active {
|
|
128
|
+
opacity: 0;
|
|
129
|
+
transition: opacity 300ms;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Add/update these styles to match AI formatting capabilities */
|
|
133
|
+
.prose h1 {
|
|
134
|
+
font-size: 2em;
|
|
135
|
+
margin-bottom: 0.5em;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.prose h2 {
|
|
139
|
+
font-size: 1.5em;
|
|
140
|
+
margin-top: 1em;
|
|
141
|
+
margin-bottom: 0.5em;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.prose h3 {
|
|
145
|
+
font-size: 1.25em;
|
|
146
|
+
margin-top: 1em;
|
|
147
|
+
margin-bottom: 0.5em;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.prose ul {
|
|
151
|
+
list-style-type: disc;
|
|
152
|
+
padding-left: 1.5em;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.prose ol {
|
|
156
|
+
list-style-type: decimal;
|
|
157
|
+
padding-left: 1.5em;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.prose table {
|
|
161
|
+
width: 100%;
|
|
162
|
+
border-collapse: collapse;
|
|
163
|
+
margin: 1em 0;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.prose th,
|
|
167
|
+
.prose td {
|
|
168
|
+
border: 1px solid rgba(249, 115, 22, 0.2);
|
|
169
|
+
padding: 0.5em;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.prose th {
|
|
173
|
+
background-color: rgba(249, 115, 22, 0.1);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.prose strong {
|
|
177
|
+
color: #f9fafb; /* text-gray-50 */
|
|
178
|
+
font-weight: 600;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.prose em {
|
|
182
|
+
font-style: italic;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.prose blockquote {
|
|
186
|
+
border-left: 4px solid #f97316; /* orange-500 */
|
|
187
|
+
padding-left: 1em;
|
|
188
|
+
margin: 1em 0;
|
|
189
|
+
color: #d1d5db; /* text-gray-300 */
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Ensure code blocks match the AI's formatting */
|
|
193
|
+
.prose code {
|
|
194
|
+
color: #e5e7eb;
|
|
195
|
+
background-color: rgba(31, 41, 55, 0.5);
|
|
196
|
+
padding: 0.2em 0.4em;
|
|
197
|
+
border-radius: 0.375rem;
|
|
198
|
+
font-size: 0.875em;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.prose pre {
|
|
202
|
+
background-color: rgba(31, 41, 55, 0.5);
|
|
203
|
+
border-radius: 0.5rem;
|
|
204
|
+
padding: 1rem;
|
|
205
|
+
margin: 1em 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.prose pre code {
|
|
209
|
+
background-color: transparent;
|
|
210
|
+
padding: 0;
|
|
211
|
+
border-radius: 0;
|
|
212
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Marketing",
|
|
3
|
+
"description": "AI-powered motorcycle marketing site with TanStack AI chat assistant for Netlify.",
|
|
4
|
+
"phase": "example",
|
|
5
|
+
"modes": ["file-router"],
|
|
6
|
+
"type": "example",
|
|
7
|
+
"priority": 10,
|
|
8
|
+
"link": "",
|
|
9
|
+
"routes": [
|
|
10
|
+
{
|
|
11
|
+
"url": "/",
|
|
12
|
+
"name": "Home",
|
|
13
|
+
"path": "src/routes/index.tsx",
|
|
14
|
+
"jsName": "MotorcyclesIndex"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"url": "/motorcycles/$motorcycleId",
|
|
18
|
+
"path": "src/routes/motorcycles/$motorcycleId.tsx",
|
|
19
|
+
"jsName": "MotorcycleDetail"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"url": "/api/motorcycle-chat",
|
|
23
|
+
"path": "src/routes/api.motorcycle-chat.ts",
|
|
24
|
+
"jsName": "MotorcycleChatAPI"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"integrations": [],
|
|
28
|
+
"dependsOn": [],
|
|
29
|
+
"variables": [],
|
|
30
|
+
"bareBones": {
|
|
31
|
+
"deleteFiles": [
|
|
32
|
+
"public/motorcycle-adventure.jpg",
|
|
33
|
+
"public/motorcycle-cruiser.jpg",
|
|
34
|
+
"public/motorcycle-sport.jpg",
|
|
35
|
+
"public/motorcycle-supersport.jpg"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"@tanstack/ai": "0.2.2",
|
|
4
|
+
"@tanstack/ai-anthropic": "0.2.0",
|
|
5
|
+
"@tanstack/ai-client": "0.2.2",
|
|
6
|
+
"@tanstack/ai-react": "0.2.2",
|
|
7
|
+
"@tanstack/react-ai-devtools": "0.2.1",
|
|
8
|
+
"@tanstack/react-store": "^0.8.0",
|
|
9
|
+
"@tanstack/store": "^0.8.0",
|
|
10
|
+
"highlight.js": "^11.11.1",
|
|
11
|
+
"streamdown": "^2.1.0",
|
|
12
|
+
"zod": "^4.3.6"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Resume Example
|
|
2
|
+
|
|
3
|
+
A professional resume template built with TanStack Start and content-collections for Netlify deployment.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Content Collections**: Work experience and education managed as markdown files
|
|
8
|
+
- **Skills Filter**: Interactive sidebar to filter jobs by skills/technologies
|
|
9
|
+
- **Beautiful UI**: Modern design with shadcn/ui components
|
|
10
|
+
- **SSR Ready**: Full server-side rendering with TanStack Start
|
|
11
|
+
|
|
12
|
+
## Project Structure
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
├── content/
|
|
16
|
+
│ ├── jobs/ # Work experience entries
|
|
17
|
+
│ └── education/ # Education entries
|
|
18
|
+
├── src/
|
|
19
|
+
│ ├── components/
|
|
20
|
+
│ │ └── ui/ # Shadcn UI components
|
|
21
|
+
│ │ ├── badge.tsx
|
|
22
|
+
│ │ ├── card.tsx
|
|
23
|
+
│ │ ├── checkbox.tsx
|
|
24
|
+
│ │ ├── hover-card.tsx
|
|
25
|
+
│ │ └── separator.tsx
|
|
26
|
+
│ ├── lib/
|
|
27
|
+
│ │ └── utils.ts # Utility functions
|
|
28
|
+
│ └── routes/
|
|
29
|
+
│ ├── __root.tsx # Root layout
|
|
30
|
+
│ └── index.tsx # Resume page
|
|
31
|
+
└── public/
|
|
32
|
+
└── headshot-on-white.jpg
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Adding Work Experience
|
|
36
|
+
|
|
37
|
+
Create a new markdown file in `content/jobs/` with the following frontmatter:
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
---
|
|
41
|
+
jobTitle: Your Job Title
|
|
42
|
+
company: Company Name
|
|
43
|
+
location: City, State
|
|
44
|
+
startDate: 2024-01-01
|
|
45
|
+
endDate: 2024-12-31 # Optional - omit for current position
|
|
46
|
+
summary: Brief summary of your role
|
|
47
|
+
tags:
|
|
48
|
+
- React
|
|
49
|
+
- TypeScript
|
|
50
|
+
- Web Development
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
Detailed description of your responsibilities and achievements...
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Adding Education
|
|
57
|
+
|
|
58
|
+
Create a new markdown file in `content/education/`:
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
---
|
|
62
|
+
school: School Name
|
|
63
|
+
summary: Degree or Program Name
|
|
64
|
+
startDate: 2020-01-01
|
|
65
|
+
endDate: 2024-01-01
|
|
66
|
+
tags:
|
|
67
|
+
- Relevant
|
|
68
|
+
- Skills
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
Details about your education...
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Development
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Start development server
|
|
78
|
+
npm run dev
|
|
79
|
+
|
|
80
|
+
# Build for production
|
|
81
|
+
npm run build
|
|
82
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
school: Code School
|
|
3
|
+
summary: Full Stack Development
|
|
4
|
+
startDate: 2020-01-01
|
|
5
|
+
endDate: 2020-12-31
|
|
6
|
+
tags:
|
|
7
|
+
[
|
|
8
|
+
"Full Stack Development",
|
|
9
|
+
"JavaScript",
|
|
10
|
+
"React",
|
|
11
|
+
"Node.js",
|
|
12
|
+
"Express",
|
|
13
|
+
"MongoDB",
|
|
14
|
+
]
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
Completed a comprehensive full stack development course covering JavaScript, React, Node.js, Express, and MongoDB. Gained hands-on experience with modern web development frameworks and databases while building a full stack application.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<% if (addOnOption.project?.bareBones) { ignoreFile() } %>---
|
|
2
|
+
jobTitle: Frontend Development Consultant
|
|
3
|
+
company: Freelance
|
|
4
|
+
location: Remote
|
|
5
|
+
startDate: 2020-01-01
|
|
6
|
+
endDate: 2020-12-31
|
|
7
|
+
summary: Independent frontend development consultant working with multiple clients on web applications and sites
|
|
8
|
+
description:
|
|
9
|
+
tags:
|
|
10
|
+
["React", "TypeScript", "Frontend Development", "JavaScript", "CSS", "HTML"]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
Provided expert frontend development services to various clients, specializing in React, TypeScript, and modern web technologies. Delivered responsive and performant web applications while maintaining high code quality and best practices.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
jobTitle: Junior Frontend Developer
|
|
3
|
+
company: IniTech
|
|
4
|
+
location: Remote
|
|
5
|
+
startDate: 2021-01-01
|
|
6
|
+
endDate: 2021-12-31
|
|
7
|
+
summary: Junior frontend developer working on React-based web applications using modern development practices
|
|
8
|
+
description:
|
|
9
|
+
tags:
|
|
10
|
+
[
|
|
11
|
+
"React",
|
|
12
|
+
"TypeScript",
|
|
13
|
+
"Frontend Development",
|
|
14
|
+
"JavaScript",
|
|
15
|
+
"TanStack",
|
|
16
|
+
"Web Development",
|
|
17
|
+
]
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
Worked as a junior frontend developer at IniTech, contributing to React-based web applications. Collaborated with the development team to implement responsive user interfaces, integrate REST APIs, and maintain code quality. Gained hands-on experience with modern frontend technologies and development workflows while working on production applications.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<% if (addOnOption.project?.bareBones) { ignoreFile() } %>---
|
|
2
|
+
jobTitle: Frontend Team Lead
|
|
3
|
+
company: IniTech
|
|
4
|
+
location: Remote
|
|
5
|
+
startDate: 2022-01-01
|
|
6
|
+
endDate: 2022-12-31
|
|
7
|
+
summary: Led a cross-functional team of three engineers in developing and maintaining IniTech's marketing platform, driving technical decisions and implementing modern development practices
|
|
8
|
+
description:
|
|
9
|
+
tags:
|
|
10
|
+
[
|
|
11
|
+
"React",
|
|
12
|
+
"TypeScript",
|
|
13
|
+
"Team Leadership",
|
|
14
|
+
"Frontend Architecture",
|
|
15
|
+
"Technical Leadership",
|
|
16
|
+
"Project Management",
|
|
17
|
+
"TanStack",
|
|
18
|
+
"Web Development",
|
|
19
|
+
]
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
Led the development and maintenance of IniTech's marketing platform as Frontend Team Lead, managing a cross-functional team of three engineers including a backend developer and a DevOps engineer. Key achievements and responsibilities included:
|
|
23
|
+
|
|
24
|
+
- Architected and implemented a modern React-based marketing platform using TypeScript and TanStack, resulting in a 40% improvement in page load times
|
|
25
|
+
- Managed and mentored a team of three engineers, conducting regular code reviews, sprint planning, and technical guidance
|
|
26
|
+
- Collaborated with marketing stakeholders to define and implement new features while maintaining high code quality and performance standards
|
|
27
|
+
- Established CI/CD pipelines and development workflows in partnership with DevOps, reducing deployment time by 60%
|
|
28
|
+
- Coordinated with the backend developer to design and implement RESTful APIs, ensuring seamless integration between frontend and backend systems
|
|
29
|
+
- Introduced modern development practices including automated testing, component documentation, and performance monitoring
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<% if (addOnOption.project?.bareBones) { ignoreFile() } %>---
|
|
2
|
+
jobTitle: Senior Frontend Developer
|
|
3
|
+
company: Initrode
|
|
4
|
+
location: Remote
|
|
5
|
+
startDate: 2024-01-01
|
|
6
|
+
summary: Developed and architected real-time data visualization features for Initrode's enterprise dashboard platform, implementing a robust WebSocket layer and optimizing performance for large-scale data streams
|
|
7
|
+
description:
|
|
8
|
+
tags:
|
|
9
|
+
[
|
|
10
|
+
"React",
|
|
11
|
+
"TypeScript",
|
|
12
|
+
"WebSockets",
|
|
13
|
+
"Real-time Data",
|
|
14
|
+
"System Architecture",
|
|
15
|
+
"Performance Optimization",
|
|
16
|
+
"TanStack",
|
|
17
|
+
"Web Development",
|
|
18
|
+
]
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
Served as a Senior Frontend Developer on Initrode's Dashboard team, focusing on building high-performance, real-time data visualization features for enterprise clients. Key achievements and responsibilities included:
|
|
22
|
+
|
|
23
|
+
- Designed and implemented a WebSocket-based real-time data transport layer, enabling live updates for dashboard components with sub-100ms latency
|
|
24
|
+
- Architected and developed a modular dashboard framework using React and TypeScript, supporting dynamic widget composition and real-time data streams
|
|
25
|
+
- Optimized frontend performance for handling large-scale data sets, implementing efficient data structures and virtualization techniques that improved rendering performance by 65%
|
|
26
|
+
- Built reusable charting and visualization components using D3.js and TanStack libraries, supporting real-time updates and complex data transformations
|
|
27
|
+
- Implemented client-side data caching and state management strategies, reducing server load by 40% while maintaining data consistency
|
|
28
|
+
- Developed automated testing suites for WebSocket connections and real-time data flow, achieving 90% test coverage for critical paths
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { defineCollection, defineConfig } from '@content-collections/core'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const jobs = defineCollection({
|
|
5
|
+
name: 'jobs',
|
|
6
|
+
directory: 'content/jobs',
|
|
7
|
+
include: '**/*.md',
|
|
8
|
+
schema: z.object({
|
|
9
|
+
jobTitle: z.string(),
|
|
10
|
+
summary: z.string(),
|
|
11
|
+
startDate: z.string(),
|
|
12
|
+
endDate: z.string().optional(),
|
|
13
|
+
company: z.string(),
|
|
14
|
+
location: z.string(),
|
|
15
|
+
tags: z.array(z.string()),
|
|
16
|
+
content: z.string(),
|
|
17
|
+
}),
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
const education = defineCollection({
|
|
21
|
+
name: 'education',
|
|
22
|
+
directory: 'content/education',
|
|
23
|
+
include: '**/*.md',
|
|
24
|
+
schema: z.object({
|
|
25
|
+
school: z.string(),
|
|
26
|
+
summary: z.string(),
|
|
27
|
+
startDate: z.string(),
|
|
28
|
+
endDate: z.string().optional(),
|
|
29
|
+
tags: z.array(z.string()),
|
|
30
|
+
content: z.string(),
|
|
31
|
+
}),
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
export default defineConfig({
|
|
35
|
+
collections: [jobs, education],
|
|
36
|
+
})
|
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Link } from '@tanstack/react-router'
|
|
2
|
+
import { Briefcase } from 'lucide-react'
|
|
3
|
+
import HeaderNav from './HeaderNav'
|
|
4
|
+
import { showResumeAssistant } from './ResumeAssistant'
|
|
5
|
+
|
|
6
|
+
interface HeaderProps {
|
|
7
|
+
children?: React.ReactNode
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default function Header({ children }: HeaderProps) {
|
|
11
|
+
const handleToggleAssistant = () => {
|
|
12
|
+
showResumeAssistant.setState((prev) => !prev)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<header className="p-4 flex items-center justify-between bg-gray-800 text-white shadow-lg">
|
|
17
|
+
<nav className="flex items-center gap-4">{children ?? <HeaderNav />}</nav>
|
|
18
|
+
<div className="flex items-center gap-4">
|
|
19
|
+
<Link to="/" className="text-xl font-semibold">
|
|
20
|
+
Netlify TanStack Start
|
|
21
|
+
</Link>
|
|
22
|
+
<button
|
|
23
|
+
onClick={handleToggleAssistant}
|
|
24
|
+
className="flex items-center gap-2 px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 transition-colors shadow-md hover:shadow-lg"
|
|
25
|
+
title="Toggle Resume Assistant"
|
|
26
|
+
>
|
|
27
|
+
<Briefcase className="w-5 h-5" />
|
|
28
|
+
<span className="text-sm font-medium">AI Assistant</span>
|
|
29
|
+
</button>
|
|
30
|
+
</div>
|
|
31
|
+
</header>
|
|
32
|
+
)
|
|
33
|
+
}
|