Skip to content

Commit fd6492a

Browse files
authored
talk: Nuxt + AI Vuejs Hamburg 2025 (#12)
1 parent eb46088 commit fd6492a

File tree

7 files changed

+76
-50
lines changed

7 files changed

+76
-50
lines changed

app/app.config.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
11
export default defineAppConfig({
2-
social: {
3-
github: 'https://github.com/zoey-kaiser',
4-
bsky: 'https://bsky.app/profile/zoeykaiser.com',
5-
linkedIn: 'https://www.linkedin.com/in/zoeykaiser/',
6-
email: 'zoeykaiser8@gmail.com'
7-
}
2+
contact: {
3+
email: 'zoeykaiser8@gmail.com',
4+
calLink: 'zoeykaiser/quick-chat',
5+
},
6+
socials: [
7+
{
8+
name: 'LinkedIn',
9+
href: 'https://www.linkedin.com/in/zoeykaiser',
10+
icon: 'mingcute:linkedin-line',
11+
},
12+
{
13+
name: 'Bluesky',
14+
href: 'https://bsky.app/profile/zoeykaiser.com',
15+
icon: 'mingcute:bluesky-social-line',
16+
},
17+
{
18+
name: 'GitHub',
19+
href: 'https://github.com/zoey-kaiser',
20+
icon: 'mingcute:github-line',
21+
},
22+
]
823
})

app/components/App/Footer.vue

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
<script lang="ts" setup>
2-
const { social } = useAppConfig()
2+
const { socials } = useAppConfig()
33
</script>
44

55
<template>
66
<footer class="bg-white">
77
<div class="mx-auto max-w-7xl px-6 py-4 md:flex md:items-center md:justify-between lg:px-8">
88
<div class="flex justify-center space-x-4 md:order-2">
9-
<NuxtLink :to="social.linkedIn" :external="true" target="_blank">
10-
<AppButton type="inverse" class="h-9 w-9 grid place-content-center">
11-
<Icon name="mingcute:linkedin-line" size="20" />
12-
</AppButton>
13-
</NuxtLink>
14-
<NuxtLink :to="social.github" :external="true" target="_blank">
15-
<AppButton type="inverse" class="h-9 w-9 grid place-content-center">
16-
<Icon name="mingcute:github-line" size="20" />
9+
<NuxtLink
10+
v-for="social in socials"
11+
:key="social.href"
12+
:to="social.href"
13+
:external="true"
14+
target="_blank"
15+
>
16+
<AppButton
17+
:title="social.name"
18+
type="inverse"
19+
class="h-9 w-9 grid place-content-center"
20+
>
21+
<Icon :name="social.icon" size="20" />
1722
</AppButton>
1823
</NuxtLink>
1924
</div>

app/components/App/Navbar.vue

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts" setup>
2-
const { social } = useAppConfig()
2+
const { socials } = useAppConfig()
33
</script>
44

55
<template>
@@ -32,19 +32,19 @@ const { social } = useAppConfig()
3232
</div>
3333

3434
<div class="hidden md:flex items-center gap-2">
35-
<NuxtLink :to="social.linkedIn" :external="true" target="_blank">
36-
<AppButton type="inverse" class="h-9 w-9 grid place-content-center">
37-
<Icon name="mingcute:linkedin-line" size="26" />
38-
</AppButton>
39-
</NuxtLink>
40-
<NuxtLink :to="social.bsky" :external="true" target="_blank">
41-
<AppButton type="inverse" class="h-9 w-9 grid place-content-center">
42-
<Icon name="mingcute:bluesky-social-line" size="23" />
43-
</AppButton>
44-
</NuxtLink>
45-
<NuxtLink :to="social.github" :external="true" target="_blank">
46-
<AppButton type="inverse" class="h-9 w-9 grid place-content-center">
47-
<Icon name="mingcute:github-line" size="23" />
35+
<NuxtLink
36+
v-for="social in socials"
37+
:key="social.href"
38+
:to="social.href"
39+
:external="true"
40+
target="_blank"
41+
>
42+
<AppButton
43+
:title="social.name"
44+
type="inverse"
45+
class="h-9 w-9 grid place-content-center"
46+
>
47+
<Icon :name="social.icon" size="24" />
4848
</AppButton>
4949
</NuxtLink>
5050
</div>

app/components/Landing/Hero.vue

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts" setup>
2-
const { social } = useAppConfig()
2+
const { contact } = useAppConfig()
33
</script>
44

55
<template>
@@ -14,20 +14,14 @@ const { social } = useAppConfig()
1414
Hi, I am Zoey!
1515
</h1>
1616
<p class="max-w-2xl mb-6 font-light text-gray-700 lg:mb-8 md:text-lg lg:text-xl">
17-
I'm a developer who thrives on creating superb user interfaces and experiences,
18-
ensuring my code reaches the highest standards while adeptly building and maintaining full-
19-
stack applications.
17+
I am a full stack developer based in Hamburg. I like turning ideas into intuitive user experiences and building apps that grow and scale together with you and your users. On the side, I speak at events and host the Hamburg Vue.js meetup.
2018
</p>
2119

2220
<div class="flex items-center gap-2">
23-
<AppButton
24-
data-cal-link="zoeykaiser/sidebase"
25-
data-cal-namespace="sidebase"
26-
:data-cal-config="{ layout: 'month_view' }"
27-
>
28-
Schedule a meeting
21+
<AppButton :data-cal-link="contact.calLink" :data-cal-config="{ layout: 'month_view' }">
22+
Let's have a chat!
2923
</AppButton>
30-
<NuxtLink :to="`mailto:${social.email}`">
24+
<NuxtLink :to="`mailto:${contact.email}`">
3125
<AppButton :solid="false">
3226
Send me a mail
3327
</AppButton>
@@ -41,7 +35,7 @@ const { social } = useAppConfig()
4135
<div class="absolute top-3 left-3 h-full w-full bg-pastel-pink rounded-lg" />
4236
<img
4337
src="/profile.jpeg"
44-
alt="profile picture"
38+
alt="Picture of Zoey Kaiser"
4539
class="relative h-80 w-80 object-cover rounded-lg border-2 border-black"
4640
>
4741
</div>

app/components/Landing/Talks.vue

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { diffDays, isAfter } from '@formkit/tempo'
2+
import { isAfter } from '@formkit/tempo'
33
44
interface Link {
55
label: string
@@ -47,11 +47,16 @@ const talks: Talk[] = [
4747
description: 'What if your Nuxt app could talk? Imagine an app that doesn’t just wait for clicks — it chats, understands your data, and even takes action. In this talk, we’ll explore why AI makes sense in your app, when it’s worth adding, and how to set it up without losing your mind. You’ll learn how to connect your app to its own data quickly and easily, turning a regular Nuxt app into one with a voice — and superpowers.',
4848
links: [
4949
{
50-
label: 'Join',
51-
href: 'https://www.meetup.com/hamburg-vue-js-meetup/events/310352654',
52-
iconName: 'mingcute:user-add-2-line',
50+
label: 'Slides',
51+
href: '/talks/nuxt-and-ai-slides-25.pdf',
52+
iconName: 'mingcute:presentation-1-line',
53+
},
54+
{
55+
label: 'Code',
56+
href: 'https://github.com/zoey-kaiser/talk-nuxt-and-ai-25',
57+
iconName: 'mingcute:code-line',
5358
solid: true
54-
}
59+
},
5560
]
5661
},
5762
{
@@ -63,7 +68,7 @@ const talks: Talk[] = [
6368
links: [
6469
{
6570
label: 'Slides',
66-
href: '/talks/VueJSDE - Code with Conscience.pdf',
71+
href: '/talks/code-with-conscience-slides-24.pdf',
6772
iconName: 'mingcute:presentation-1-line'
6873
},
6974
{
@@ -122,14 +127,21 @@ const talks: Talk[] = [
122127

123128
<div class="flex flex-col lg:items-end gap-4">
124129
<p class="text-lg font-medium grow">
125-
{{ formatDate(talk.date) }}
130+
<NuxtTime :datetime="talk.date" year="numeric" month="long" day="numeric" />
131+
126132
<span v-if="isAfter(talk.date, new Date())">
127-
(In {{ diffDays(talk.date, new Date()) }} days)
133+
(<NuxtTime :datetime="talk.date" relative />)
128134
</span>
129135
</p>
130136

131137
<div class="flex items-center gap-2">
132-
<NuxtLink v-for="link in talk.links" :key="link.href" :href="link.href" :external="true" target="_blank">
138+
<NuxtLink
139+
v-for="link in talk.links"
140+
:key="link.href"
141+
:href="link.href"
142+
:external="true"
143+
target="_blank"
144+
>
133145
<AppButton type="primary" :solid="!!link.solid">
134146
<div class="flex items-center gap-1">
135147
<Icon v-if="link.iconName" :name="link.iconName" size="18" class="mb-[2px]" />
File renamed without changes.
21.6 MB
Binary file not shown.

0 commit comments

Comments
 (0)