Skip to content

Commit 38dd369

Browse files
Merge branch 'main' into feat/action-bar
2 parents f330343 + 0d952fa commit 38dd369

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+1111
-341
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ test-results/
4040
# generated files
4141
shared/types/lexicons
4242
file-tree-sprite.svg
43+
public/blog/avatar
4344

4445
**/__screenshots__/**
4546

Lines changed: 42 additions & 0 deletions
Loading
Lines changed: 42 additions & 1 deletion
Loading

app/assets/logos/oss-partners/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import LogoFastCheck from './fast-check.svg'
2929
import LogoLunaria from './lunaria.svg'
3030
import LogoJsr from './jsr.svg'
3131
import LogoIconify from './iconify.svg'
32+
import LogoIconifyLight from './iconify-light.svg'
3233
import LogoFloatingUi from './floating-ui-vue.svg'
3334
import LogoBlento from './blento.svg'
3435

@@ -188,7 +189,10 @@ export const OSS_PARTNERS = [
188189
},
189190
{
190191
name: 'Iconify',
191-
logo: LogoIconify,
192+
logo: {
193+
dark: LogoIconify,
194+
light: LogoIconifyLight,
195+
},
192196
url: 'https://iconify.design/',
193197
},
194198
{

app/components/AppFooter.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ const closeModal = () => modalRef.value?.close?.()
131131
</div>
132132
</div>
133133
</div>
134-
<p class="text-xs text-fg-muted text-center sm:text-start m-0">
134+
<small class="text-xs text-fg-muted text-center sm:text-start m-0">
135135
<span class="sm:hidden">{{ $t('non_affiliation_disclaimer') }}</span>
136136
<span class="hidden sm:inline">{{ $t('trademark_disclaimer') }}</span>
137-
</p>
137+
</small>
138138
</div>
139139
</footer>
140140
</template>

app/components/AuthorList.vue

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
<script setup lang="ts">
2-
import type { Author } from '#shared/schemas/blog'
2+
import type { ResolvedAuthor } from '#shared/schemas/blog'
33
4-
const props = defineProps<{
5-
authors: Author[]
4+
defineProps<{
5+
authors: ResolvedAuthor[]
66
variant?: 'compact' | 'expanded'
77
}>()
8-
9-
const { resolvedAuthors } = useBlueskyAuthorProfiles(props.authors)
108
</script>
119

1210
<template>
1311
<!-- Expanded variant: vertical list with larger avatars -->
1412
<div v-if="variant === 'expanded'" class="flex flex-wrap items-center gap-4">
15-
<div v-for="author in resolvedAuthors" :key="author.name" class="flex items-center gap-2">
13+
<div v-for="author in authors" :key="author.name" class="flex items-center gap-2">
1614
<AuthorAvatar :author="author" size="md" disable-link />
1715
<div class="flex flex-col">
1816
<span class="text-sm font-medium text-fg">{{ author.name }}</span>
@@ -34,7 +32,7 @@ const { resolvedAuthors } = useBlueskyAuthorProfiles(props.authors)
3432
<div v-else class="flex items-center gap-2 min-w-0">
3533
<div class="flex items-center">
3634
<AuthorAvatar
37-
v-for="(author, index) in resolvedAuthors"
35+
v-for="(author, index) in authors"
3836
:key="author.name"
3937
:author="author"
4038
size="md"
@@ -43,7 +41,7 @@ const { resolvedAuthors } = useBlueskyAuthorProfiles(props.authors)
4341
/>
4442
</div>
4543
<span class="text-xs text-fg-muted font-mono truncate">
46-
{{ resolvedAuthors.map(a => a.name).join(', ') }}
44+
{{ authors.map(a => a.name).join(', ') }}
4745
</span>
4846
</div>
4947
</template>

app/components/BlogPostListCard.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<script setup lang="ts">
2-
import type { Author } from '#shared/schemas/blog'
2+
import type { ResolvedAuthor } from '#shared/schemas/blog'
33
44
defineProps<{
55
/** Authors of the blog post */
6-
authors: Author[]
6+
authors: ResolvedAuthor[]
77
/** Blog Title */
88
title: string
99
/** Tags such as OpenSource, Architecture, Community, etc. */

app/components/Code/Viewer.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ watch(
115115
<!-- Code content -->
116116
<div class="code-content flex-1 overflow-x-auto min-w-0">
117117
<!-- eslint-disable vue/no-v-html -- HTML is generated server-side by Shiki -->
118-
<div ref="codeRef" class="code-lines w-fit" v-html="html" />
118+
<div ref="codeRef" class="code-lines min-w-full w-fit" v-html="html" />
119119
<!-- eslint-enable vue/no-v-html -->
120120
</div>
121121
</div>
@@ -157,7 +157,7 @@ watch(
157157
158158
/* Highlighted lines in code content - extend full width with negative margin */
159159
.code-content :deep(.line.highlighted) {
160-
background: rgb(234 179 8 / 0.2); /* yellow-500/20 */
160+
@apply bg-yellow-500/20;
161161
margin: 0 -1rem;
162162
padding: 0 1rem;
163163
}

app/components/Header/SearchBox.vue

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,17 @@ const showSearchBar = computed(() => {
1717
})
1818
1919
const { model: searchQuery, startSearch } = useGlobalSearch('header')
20+
const hasSearchQuery = computed(() => searchQuery.value.trim().length > 0)
2021
2122
function handleSubmit() {
2223
startSearch()
2324
}
2425
26+
function clearSearch() {
27+
searchQuery.value = ''
28+
inputRef.value?.focus()
29+
}
30+
2531
// Expose focus method for parent components
2632
const inputRef = useTemplateRef('inputRef')
2733
function focus() {
@@ -52,11 +58,21 @@ defineExpose({ focus })
5258
name="q"
5359
:placeholder="$t('search.placeholder')"
5460
no-correct
55-
class="w-full min-w-25 ps-7"
61+
class="w-full min-w-25 ps-7 pe-8"
5662
@focus="isSearchFocused = true"
5763
@blur="isSearchFocused = false"
5864
size="small"
5965
/>
66+
<button
67+
v-if="hasSearchQuery"
68+
type="button"
69+
class="absolute inset-ie-2 h-6 w-6 items-center justify-center rounded text-fg-muted hover:text-fg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent group-focus-within:flex group-hover:inline-flex hidden"
70+
@click="clearSearch"
71+
aria-hidden="true"
72+
tabindex="-1"
73+
>
74+
<span class="i-lucide:circle-x h-4 w-4" />
75+
</button>
6076
<button type="submit" class="sr-only">{{ $t('search.button') }}</button>
6177
</div>
6278
</div>

app/components/OgImage/BlogPost.vue

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script setup lang="ts">
2-
import type { Author } from '#shared/schemas/blog'
2+
import type { ResolvedAuthor } from '#shared/schemas/blog'
33
44
const props = withDefaults(
55
defineProps<{
66
title: string
7-
authors?: Author[]
7+
authors?: ResolvedAuthor[]
88
date?: string
99
primaryColor?: string
1010
}>(),
@@ -15,8 +15,6 @@ const props = withDefaults(
1515
},
1616
)
1717
18-
const { resolvedAuthors } = useBlueskyAuthorProfiles(props.authors)
19-
2018
const formattedDate = computed(() => {
2119
if (!props.date) return ''
2220
try {
@@ -41,17 +39,17 @@ const getInitials = (name: string) =>
4139
.slice(0, 2)
4240
4341
const visibleAuthors = computed(() => {
44-
if (resolvedAuthors.value.length <= 3) return resolvedAuthors.value
45-
return resolvedAuthors.value.slice(0, MAX_VISIBLE_AUTHORS)
42+
if (props.authors.length <= 3) return props.authors
43+
return props.authors.slice(0, MAX_VISIBLE_AUTHORS)
4644
})
4745
4846
const extraCount = computed(() => {
49-
if (resolvedAuthors.value.length <= 3) return 0
50-
return resolvedAuthors.value.length - MAX_VISIBLE_AUTHORS
47+
if (props.authors.length <= 3) return 0
48+
return props.authors.length - MAX_VISIBLE_AUTHORS
5149
})
5250
5351
const formattedAuthorNames = computed(() => {
54-
const allNames = resolvedAuthors.value.map(a => a.name)
52+
const allNames = props.authors.map(a => a.name)
5553
if (allNames.length === 0) return ''
5654
if (allNames.length === 1) return allNames[0]
5755
if (allNames.length === 2) return `${allNames[0]} and ${allNames[1]}`
@@ -96,7 +94,7 @@ const formattedAuthorNames = computed(() => {
9694

9795
<!-- Authors -->
9896
<div
99-
v-if="resolvedAuthors.length"
97+
v-if="authors.length"
10098
class="flex items-center gap-4 self-start justify-start flex-nowrap"
10199
style="font-family: 'Geist', sans-serif"
102100
>

0 commit comments

Comments
 (0)