Skip to content

Commit dd9253b

Browse files
authored
Merge branch 'main' into app-footer-use-space-between
2 parents 2cdd112 + cea6729 commit dd9253b

26 files changed

Lines changed: 478 additions & 181 deletions

app/assets/main.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,9 @@ html.light .shiki span {
281281
white-space: pre;
282282
word-break: normal;
283283
overflow-wrap: normal;
284+
/* Makes unicode and ascii art work properly */
285+
line-height: 1.25;
286+
display: inline-block;
284287
}
285288

286289
.readme-content ul,

app/components/CodeDirectoryListing.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ function formatBytes(bytes: number): string {
7070
:to="parentPath ? `${baseUrl}/${parentPath}` : baseUrl"
7171
class="flex items-center gap-2 font-mono text-sm text-fg-muted hover:text-fg transition-colors"
7272
>
73-
<span class="i-carbon-folder w-4 h-4 text-yellow-600" />
73+
<span class="i-carbon:folder w-4 h-4 text-yellow-600" />
7474
<span>..</span>
7575
</NuxtLink>
7676
</td>
@@ -91,13 +91,13 @@ function formatBytes(bytes: number): string {
9191
>
9292
<span
9393
v-if="node.type === 'directory'"
94-
class="i-carbon-folder w-4 h-4 text-yellow-600"
94+
class="i-carbon:folder w-4 h-4 text-yellow-600"
9595
/>
9696
<span v-else class="w-4 h-4" :class="getFileIcon(node.name)" />
9797
<span>{{ node.name }}</span>
9898
</NuxtLink>
9999
</td>
100-
<td class="py-2 px-4 text-right font-mono text-xs text-fg-subtle">
100+
<td class="py-2 px-4 text-end font-mono text-xs text-fg-subtle">
101101
<span v-if="node.type === 'file' && node.size">
102102
{{ formatBytes(node.size) }}
103103
</span>

app/components/DateTime.vue

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,20 @@ const { locale } = useI18n()
3333
3434
const relativeDates = useRelativeDates()
3535
36+
const dateFormatter = new Intl.DateTimeFormat(locale.value, {
37+
month: 'short',
38+
day: 'numeric',
39+
year: 'numeric',
40+
hour: 'numeric',
41+
minute: '2-digit',
42+
timeZoneName: 'short',
43+
})
44+
3645
// Compute the title - always show full date for accessibility
3746
const titleValue = computed(() => {
3847
if (props.title) return props.title
39-
if (typeof props.datetime === 'string') return props.datetime
40-
return props.datetime.toISOString()
48+
const date = typeof props.datetime === 'string' ? new Date(props.datetime) : props.datetime
49+
return dateFormatter.format(date)
4150
})
4251
</script>
4352

app/components/PackagePlaygrounds.vue

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ const props = defineProps<{
77
88
// Map provider id to icon class
99
const providerIcons: Record<string, string> = {
10-
'stackblitz': 'i-simple-icons-stackblitz',
11-
'codesandbox': 'i-simple-icons-codesandbox',
12-
'codepen': 'i-simple-icons-codepen',
13-
'replit': 'i-simple-icons-replit',
14-
'gitpod': 'i-simple-icons-gitpod',
15-
'vue-playground': 'i-simple-icons-vuedotjs',
16-
'nuxt-new': 'i-simple-icons-nuxtdotjs',
17-
'vite-new': 'i-simple-icons-vite',
18-
'jsfiddle': 'i-carbon-code',
10+
'stackblitz': 'i-simple-icons:stackblitz',
11+
'codesandbox': 'i-simple-icons:codesandbox',
12+
'codepen': 'i-simple-icons:codepen',
13+
'replit': 'i-simple-icons:replit',
14+
'gitpod': 'i-simple-icons:gitpod',
15+
'vue-playground': 'i-simple-icons:vuedotjs',
16+
'nuxt-new': 'i-simple-icons:nuxtdotjs',
17+
'vite-new': 'i-simple-icons:vite',
18+
'jsfiddle': 'i-carbon:code',
1919
}
2020
2121
// Map provider id to color class
@@ -32,7 +32,7 @@ const providerColors: Record<string, string> = {
3232
}
3333
3434
function getIcon(provider: string): string {
35-
return providerIcons[provider] || 'i-carbon-play'
35+
return providerIcons[provider] || 'i-carbon:play'
3636
}
3737
3838
function getColor(provider: string): string {
@@ -141,13 +141,13 @@ function focusMenuItem(index: number) {
141141
@keydown="handleKeydown"
142142
>
143143
<span class="flex items-center gap-2">
144-
<span class="i-carbon-play w-4 h-4 shrink-0 text-fg-muted" aria-hidden="true" />
144+
<span class="i-carbon:play w-4 h-4 shrink-0 text-fg-muted" aria-hidden="true" />
145145
<span class="text-fg-muted"
146146
>{{ $t('package.playgrounds.choose') }} ({{ links.length }})</span
147147
>
148148
</span>
149149
<span
150-
class="i-carbon-chevron-down w-3 h-3 text-fg-subtle transition-transform duration-200 motion-reduce:transition-none"
150+
class="i-carbon:chevron-down w-3 h-3 text-fg-subtle transition-transform duration-200 motion-reduce:transition-none"
151151
:class="{ 'rotate-180': isOpen }"
152152
aria-hidden="true"
153153
/>
@@ -166,7 +166,7 @@ function focusMenuItem(index: number) {
166166
v-if="isOpen && hasMultipleLinks"
167167
ref="menuRef"
168168
role="menu"
169-
class="absolute top-full left-0 right-0 mt-1 bg-bg-elevated border border-border rounded-lg shadow-lg z-50 py-1 overflow-visible"
169+
class="absolute top-full inset-is-0 inset-ie-0 mt-1 bg-bg-elevated border border-border rounded-lg shadow-lg z-50 py-1 overflow-visible"
170170
@keydown="handleKeydown"
171171
>
172172
<AppTooltip v-for="link in links" :key="link.url" :text="link.providerName" class="block">

app/components/PackageSkeleton.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,10 @@
110110
</h2>
111111
<!-- code-block with relative positioning for copy button -->
112112
<div class="relative">
113-
<div class="code-block pr-16">
113+
<div class="code-block pe-16">
114114
<span class="skeleton inline-block h-5 w-52" />
115115
</div>
116-
<span class="skeleton absolute top-3 right-3 h-6 w-12 rounded" />
116+
<span class="skeleton absolute top-3 inset-ie-3 h-6 w-12 rounded" />
117117
</div>
118118
</section>
119119

app/components/PackageVersions.vue

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
318318
>
319319
{{ $t('package.versions.title') }}
320320
<span
321-
class="i-carbon-link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
321+
class="i-carbon:link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
322322
aria-hidden="true"
323323
/>
324324
</a>
@@ -343,15 +343,15 @@ function getTagVersions(tag: string): VersionDisplay[] {
343343
>
344344
<span
345345
v-if="loadingTags.has(row.tag)"
346-
class="i-carbon-rotate-180 w-3 h-3 motion-safe:animate-spin"
346+
class="i-carbon:rotate-180 w-3 h-3 motion-safe:animate-spin"
347347
data-testid="loading-spinner"
348348
aria-hidden="true"
349349
/>
350350
<span
351351
v-else
352-
class="w-3 h-3 transition-transform duration-200"
352+
class="w-3 h-3 transition-transform duration-200 rtl-flip"
353353
:class="
354-
expandedTags.has(row.tag) ? 'i-carbon-chevron-down' : 'i-carbon-chevron-right'
354+
expandedTags.has(row.tag) ? 'i-carbon:chevron-down' : 'i-carbon:chevron-right'
355355
"
356356
aria-hidden="true"
357357
/>
@@ -412,7 +412,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
412412
<!-- Expanded versions -->
413413
<div
414414
v-if="expandedTags.has(row.tag) && getTagVersions(row.tag).length > 1"
415-
class="ml-4 pl-2 border-l border-border space-y-0.5"
415+
class="ms-4 ps-2 border-is border-border space-y-0.5"
416416
>
417417
<div v-for="v in getTagVersions(row.tag).slice(1)" :key="v.version" class="py-1">
418418
<div class="flex items-center justify-between gap-2">
@@ -470,7 +470,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
470470
<div class="pt-1">
471471
<button
472472
type="button"
473-
class="flex items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg-muted focus-visible:ring-offset-1 focus-visible:ring-offset-bg rounded-sm"
473+
class="flex items-center gap-2 text-start focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg-muted focus-visible:ring-offset-1 focus-visible:ring-offset-bg rounded-sm"
474474
:aria-expanded="otherVersionsExpanded"
475475
:aria-label="
476476
otherVersionsExpanded
@@ -484,14 +484,14 @@ function getTagVersions(tag: string): VersionDisplay[] {
484484
>
485485
<span
486486
v-if="otherVersionsLoading"
487-
class="i-carbon-rotate-180 w-3 h-3 motion-safe:animate-spin"
487+
class="i-carbon:rotate-180 w-3 h-3 motion-safe:animate-spin"
488488
data-testid="loading-spinner"
489489
aria-hidden="true"
490490
/>
491491
<span
492492
v-else
493-
class="w-3 h-3 transition-transform duration-200"
494-
:class="otherVersionsExpanded ? 'i-carbon-chevron-down' : 'i-carbon-chevron-right'"
493+
class="w-3 h-3 transition-transform duration-200 rtl-flip"
494+
:class="otherVersionsExpanded ? 'i-carbon:chevron-down' : 'i-carbon:chevron-right'"
495495
aria-hidden="true"
496496
/>
497497
</span>
@@ -504,7 +504,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
504504
</button>
505505

506506
<!-- Expanded other versions -->
507-
<div v-if="otherVersionsExpanded" class="ml-4 pl-2 border-l border-border space-y-0.5">
507+
<div v-if="otherVersionsExpanded" class="ms-4 ps-2 border-is border-border space-y-0.5">
508508
<!-- Hidden tag rows (overflow from visible tags) -->
509509
<div v-for="row in hiddenTagRows" :key="row.id" class="py-1">
510510
<div class="flex items-center justify-between gap-2">
@@ -568,11 +568,11 @@ function getTagVersions(tag: string): VersionDisplay[] {
568568
@click="toggleMajorGroup(group.groupKey)"
569569
>
570570
<span
571-
class="w-3 h-3 transition-transform duration-200"
571+
class="w-3 h-3 transition-transform duration-200 rtl-flip"
572572
:class="
573573
expandedMajorGroups.has(group.groupKey)
574-
? 'i-carbon-chevron-down'
575-
: 'i-carbon-chevron-right'
574+
? 'i-carbon:chevron-down'
575+
: 'i-carbon:chevron-right'
576576
"
577577
aria-hidden="true"
578578
/>
@@ -616,7 +616,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
616616
</div>
617617
<div
618618
v-if="group.versions[0]?.tags?.length"
619-
class="flex items-center gap-1 ml-5 flex-wrap"
619+
class="flex items-center gap-1 ms-5 flex-wrap"
620620
>
621621
<span
622622
v-for="tag in group.versions[0].tags"
@@ -670,7 +670,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
670670
/>
671671
</div>
672672
</div>
673-
<div v-if="group.versions[0]?.tags?.length" class="flex items-center gap-1 ml-5">
673+
<div v-if="group.versions[0]?.tags?.length" class="flex items-center gap-1 ms-5">
674674
<span
675675
v-for="tag in group.versions[0].tags"
676676
:key="tag"
@@ -684,7 +684,7 @@ function getTagVersions(tag: string): VersionDisplay[] {
684684
<!-- Version group versions -->
685685
<div
686686
v-if="expandedMajorGroups.has(group.groupKey) && group.versions.length > 1"
687-
class="ml-6 space-y-0.5"
687+
class="ms-6 space-y-0.5"
688688
>
689689
<div v-for="v in group.versions.slice(1)" :key="v.version" class="py-1">
690690
<div class="flex items-center justify-between gap-2">

app/components/PackageVulnerabilityTree.vue

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ const summaryText = computed(() => {
3939
// Styling for each depth level - using accessible colors for both themes
4040
const depthStyles = {
4141
root: {
42-
bg: 'bg-amber-500/5 border-l-2 border-l-amber-600',
42+
bg: 'bg-amber-500/5 border-is-2 border-is-amber-600',
4343
text: 'text-fg',
4444
},
4545
direct: {
46-
bg: 'bg-amber-500/5 border-l-2 border-l-amber-500',
46+
bg: 'bg-amber-500/5 border-is-2 border-is-amber-500',
4747
text: 'text-fg-muted',
4848
},
4949
transitive: {
50-
bg: 'bg-amber-500/5 border-l-2 border-l-amber-400',
50+
bg: 'bg-amber-500/5 border-is-2 border-is-amber-400',
5151
text: 'text-fg-muted',
5252
},
5353
} as const
@@ -72,13 +72,13 @@ function getDepthStyle(depth: string | undefined) {
7272
<!-- Header -->
7373
<button
7474
type="button"
75-
class="w-full flex items-center justify-between gap-3 px-4 py-3 text-left transition-colors duration-200 hover:bg-white/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fg/50"
75+
class="w-full flex items-center justify-between gap-3 px-4 py-3 text-start transition-colors duration-200 hover:bg-white/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fg/50"
7676
:aria-expanded="isExpanded"
7777
aria-controls="vuln-tree-details"
7878
@click="isExpanded = !isExpanded"
7979
>
8080
<div class="flex items-center gap-2 min-w-0">
81-
<span class="i-carbon-warning-alt w-4 h-4 shrink-0" aria-hidden="true" />
81+
<span class="i-carbon:warning-alt w-4 h-4 shrink-0" aria-hidden="true" />
8282
<span class="font-mono text-sm font-medium truncate">
8383
{{
8484
$t(
@@ -96,7 +96,7 @@ function getDepthStyle(depth: string | undefined) {
9696
<div class="flex items-center gap-2 shrink-0">
9797
<span class="text-xs opacity-80 hidden sm:inline">{{ summaryText }}</span>
9898
<span
99-
class="i-carbon-chevron-down w-4 h-4 transition-transform duration-200"
99+
class="i-carbon:chevron-down w-4 h-4 transition-transform duration-200"
100100
:class="{ 'rotate-180': isExpanded }"
101101
aria-hidden="true"
102102
/>
@@ -181,7 +181,7 @@ function getDepthStyle(depth: string | undefined) {
181181
v-if="vulnTree!.failedQueries"
182182
class="px-4 py-2 text-xs text-fg-subtle border-t border-border flex items-center gap-2"
183183
>
184-
<span class="i-carbon-warning w-3 h-3" aria-hidden="true" />
184+
<span class="i-carbon:warning w-3 h-3" aria-hidden="true" />
185185
<span>{{ $t('package.vulnerabilities.packages_failed', vulnTree!.failedQueries) }}</span>
186186
</div>
187187
</div>
@@ -196,7 +196,7 @@ function getDepthStyle(depth: string | undefined) {
196196
<section v-else-if="status === 'error'" aria-labelledby="vuln-tree-error">
197197
<div class="rounded-lg border border-border bg-bg-subtle px-4 py-3">
198198
<div class="flex items-center gap-2">
199-
<span class="i-carbon-warning w-4 h-4 text-fg-subtle" aria-hidden="true" />
199+
<span class="i-carbon:warning w-4 h-4 text-fg-subtle" aria-hidden="true" />
200200
<span class="text-sm text-fg-muted">
201201
{{ $t('package.vulnerabilities.scan_failed') }}
202202
</span>

app/components/PackageWeeklyDownloadStats.vue

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,18 +178,18 @@ const config = computed(() => {
178178
>
179179
{{ $t('package.downloads.title') }}
180180
<span
181-
class="i-carbon-link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
181+
class="i-carbon:link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
182182
aria-hidden="true"
183183
/>
184184
</a>
185185
</h2>
186186
<button
187187
type="button"
188188
@click="showModal = true"
189-
class="link-subtle font-mono text-sm inline-flex items-center gap-1.5 ml-auto shrink-0 self-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
189+
class="link-subtle font-mono text-sm inline-flex items-center gap-1.5 ms-auto shrink-0 self-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
190190
:title="$t('package.downloads.analyze')"
191191
>
192-
<span class="i-carbon-data-analytics w-4 h-4" aria-hidden="true" />
192+
<span class="i-carbon:data-analytics w-4 h-4" aria-hidden="true" />
193193
<span class="sr-only">{{ $t('package.downloads.analyze') }}</span>
194194
</button>
195195
</div>
@@ -201,17 +201,17 @@ const config = computed(() => {
201201
<!-- Skeleton matching sparkline layout: title row + chart with data label -->
202202
<div class="min-h-[100px]">
203203
<!-- Title row: date range (24px height) -->
204-
<div class="h-6 flex items-center pl-3">
204+
<div class="h-6 flex items-center ps-3">
205205
<span class="skeleton h-3 w-36" />
206206
</div>
207207
<!-- Chart area: data label left, sparkline right -->
208208
<div class="aspect-[500/80] flex items-center">
209209
<!-- Data label (covers ~42% width) -->
210-
<div class="w-[42%] flex items-center pl-0.5">
210+
<div class="w-[42%] flex items-center ps-0.5">
211211
<span class="skeleton h-7 w-24" />
212212
</div>
213213
<!-- Sparkline area (~58% width) -->
214-
<div class="flex-1 flex items-end gap-0.5 h-4/5 pr-3">
214+
<div class="flex-1 flex items-end gap-0.5 h-4/5 pe-3">
215215
<span
216216
v-for="i in 16"
217217
:key="i"
@@ -245,7 +245,7 @@ const config = computed(() => {
245245
class="w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg flex items-center justify-center text-fg-muted hover:text-fg transition-colors"
246246
:aria-label="$t('common.close')"
247247
>
248-
<span class="w-5 h-5 i-carbon-close" aria-hidden="true" />
248+
<span class="w-5 h-5 i-carbon:close" aria-hidden="true" />
249249
</button>
250250
</div>
251251
</template>

app/components/ScrollToTop.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ onMounted(() => {
3636
<button
3737
v-if="isActive && supportsScrollStateQueries"
3838
type="button"
39-
class="scroll-to-top-css fixed bottom-4 right-4 z-50 w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg md:hidden flex items-center justify-center text-fg-muted hover:text-fg transition-colors active:scale-95"
39+
class="scroll-to-top-css fixed bottom-4 inset-ie-4 z-50 w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg md:hidden flex items-center justify-center text-fg-muted hover:text-fg transition-colors active:scale-95"
4040
:aria-label="$t('common.scroll_to_top')"
4141
@click="scrollToTop"
4242
>
43-
<span class="i-carbon-arrow-up w-5 h-5" aria-hidden="true" />
43+
<span class="i-carbon:arrow-up w-5 h-5" aria-hidden="true" />
4444
</button>
4545

4646
<!-- JS fallback for browsers without scroll-state support -->
@@ -56,11 +56,11 @@ onMounted(() => {
5656
<button
5757
v-if="isActive && isMounted && isVisible"
5858
type="button"
59-
class="fixed bottom-4 right-4 z-50 w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg md:hidden flex items-center justify-center text-fg-muted hover:text-fg transition-colors active:scale-95"
59+
class="fixed bottom-4 inset-ie-4 z-50 w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg md:hidden flex items-center justify-center text-fg-muted hover:text-fg transition-colors active:scale-95"
6060
:aria-label="$t('common.scroll_to_top')"
6161
@click="scrollToTop"
6262
>
63-
<span class="i-carbon-arrow-up w-5 h-5" aria-hidden="true" />
63+
<span class="i-carbon:arrow-up w-5 h-5" aria-hidden="true" />
6464
</button>
6565
</Transition>
6666
</template>

app/components/SearchSuggestionCard.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ const emit = defineEmits<{
7777
</div>
7878

7979
<span
80-
class="i-carbon-arrow-right w-4 h-4 text-fg-subtle group-hover:text-fg transition-colors shrink-0"
80+
class="i-carbon:arrow-right rtl-flip w-4 h-4 text-fg-subtle group-hover:text-fg transition-colors shrink-0"
8181
aria-hidden="true"
8282
/>
8383
</NuxtLink>

0 commit comments

Comments
 (0)