Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
284e9f7
chore: bump module replacements to 3.0.0 stable (#2987)
43081j Jul 3, 2026
c1ea23e
feat: write welcome message and warning to console (#2879)
alexdln Jul 4, 2026
e304ada
fix: spacing on bluesky post embeds with a gallery on the blog (#2991)
trueberryless Jul 4, 2026
6d16021
fix(i18n): update Japanese translations (#2980)
shuuji3 Jul 4, 2026
fb67ebb
fix: add changelog shortcut to the keyboard shortcuts menu (#2873)
BittuBarnwal7479 Jul 4, 2026
e731a54
fix: standard site sync (#2994)
ghostdevv Jul 4, 2026
033756a
feat: add dependency size chart to timeline (#2979)
43081j Jul 5, 2026
80b1185
fix: remove bottom white space from PNG prints of xy charts (#3003)
graphieros Jul 5, 2026
81707e3
chore(deps): bump vite-plus to v0.2.2 (#2990)
fengmk2 Jul 5, 2026
2820641
chore(deps): update dependency fast-npm-meta to v2 (#2944)
renovate[bot] Jul 5, 2026
fc30dea
chore(deps): update playwright (#3006)
ghostdevv Jul 5, 2026
5124b29
chore(deps): update atproto related deps (#3004)
ghostdevv Jul 5, 2026
c552273
chore(deps): update connector cli deps (#3005)
ghostdevv Jul 5, 2026
d03b48b
chore(deps): update chromaui/action action to v18 (#3007)
renovate[bot] Jul 5, 2026
eed262b
chore(deps): update devdependency chromatic to v18 (#3008)
renovate[bot] Jul 5, 2026
39a6b8c
docs: fix broken badge note block by rewording contents (#2925)
btea Jul 5, 2026
532e9c5
chore(deps): update all non-major dependencies (#3010)
renovate[bot] Jul 5, 2026
db4bbc3
feat(ui): support takumi v2 og images (#2986)
harlan-zw Jul 6, 2026
ef6b240
test: collect coverage from untested files too (#2239)
AriPerkkio Jul 6, 2026
4f3c588
fix: profile page only shows user's 10 most recent likes (#2820)
gittihub-jpg Jul 6, 2026
96c8986
feat: add nub package manager support (#3014)
2u841r Jul 7, 2026
3b651c2
feat: package code file tree should keep active file in view (#1977)
btea Jul 7, 2026
1b13f53
fix(ui): fix provenance section wrap (#3017)
gameroman Jul 7, 2026
624ee14
fix(i18n): update Russian translations (#3019)
dragomano Jul 8, 2026
daf3b86
feat(ui): highlight files commonly shipped unnecessarily in packages …
mvanhorn Jul 8, 2026
f7506a0
fix(i18n): update sponsor-related Japanese translations (#3020)
shuuji3 Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/autofix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand All @@ -45,4 +45,4 @@ jobs:
- name: 🔠 Fix lint errors
run: vp run lint:fix

- uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 # v1.3.2
- uses: autofix-ci/action@c5b2d67aa2274e7b5a18224e8171550871fc7e4a # v1.3.4
4 changes: 2 additions & 2 deletions .github/workflows/chromatic.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ jobs:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
sfw: true

- name: 🧪 Run Chromatic Visual and Accessibility Tests
uses: chromaui/action@7804f34e4e59c0d9b3c856848f46ad96d7897429 # v17.5.0
uses: chromaui/action@94713c544284a14195de3b50ef24301579f1877e # v18.0.1
with:
buildCommand: vp run build-storybook
outputDir: storybook-static
Expand Down
18 changes: 9 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
sfw: true
Expand All @@ -50,7 +50,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand All @@ -68,7 +68,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand Down Expand Up @@ -107,7 +107,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand Down Expand Up @@ -144,7 +144,7 @@ jobs:
name: 🖥️ Browser tests
runs-on: ubuntu-24.04-arm
container:
image: mcr.microsoft.com/playwright:v1.60.0-noble@sha256:9bd26ad900bb5e0f4dee75839e957a89ae89c2b7ab1e76050e559790e946b948
image: mcr.microsoft.com/playwright:v1.61.1-noble@sha256:5b8f294aff9041b7191c34a4bab3ac270157a28774d4b0660e9743297b697e48

steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
Expand All @@ -154,7 +154,7 @@ jobs:
- name: 👑 Fix Git ownership
run: git config --global --add safe.directory /__w/npmx.dev/npmx.dev

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand Down Expand Up @@ -192,7 +192,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand All @@ -216,7 +216,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand All @@ -234,7 +234,7 @@ jobs:
with:
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
sfw: true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependency-diff-comment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: 💬 Post comment
uses: e18e/action-dependency-diff@f825d5b5c5ce0a42dc46c47ec20de24460affcd8 # v1.5.0
uses: e18e/action-dependency-diff@8e9b8c1957ab066d36235a43f4c1ff1522e1bdbc # v1.6.1
with:
mode: comment-from-artifact
artifact-path: e18e-diff-result.json
2 changes: 1 addition & 1 deletion .github/workflows/dependency-diff.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:

- name: 🔎 Compare dependencies
id: analyze
uses: e18e/action-dependency-diff@f825d5b5c5ce0a42dc46c47ec20de24460affcd8 # v1.5.0
uses: e18e/action-dependency-diff@8e9b8c1957ab066d36235a43f4c1ff1522e1bdbc # v1.6.1
with:
mode: artifact
detect-replacements: 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-canary.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
persist-credentials: false
fetch-depth: 2

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
run-install: false
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/lunaria.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
fetch-depth: 0
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
cache: true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
fetch-depth: 0
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
run-install: false
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
fetch-depth: 0
persist-credentials: true

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
run-install: false
Expand Down Expand Up @@ -66,7 +66,7 @@ jobs:

- name: 📦 Install dependencies
if: steps.check.outputs.skip == 'false'
uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
sfw: true
run-install: |
Expand Down Expand Up @@ -105,14 +105,14 @@ jobs:
ref: release
persist-credentials: false

- uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
- uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
node-version: lts/*
registry-url: https://registry.npmjs.org
run-install: false

- name: 📦 Install dependencies
uses: voidzero-dev/setup-vp@2dec1e33f4ab2c6d5bce1b0c4607961bb1a3f7a1 # v1.12.0
uses: voidzero-dev/setup-vp@250f29ce396baf5e8f24498e17c0dfdebabc26eb # v1.15.0
with:
sfw: true
run-install: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/stale.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
permissions:
issues: write # mark and close stale bug issues
steps:
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
- uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
with:
days-before-issue-stale: 30
days-before-issue-close: 7
Expand All @@ -37,7 +37,7 @@ jobs:
permissions:
pull-requests: write # mark and close stale pull requests
steps:
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
- uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
with:
days-before-issue-stale: -1
days-before-issue-close: -1
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/zizmor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
with:
persist-credentials: false

- uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
- uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7
with:
persona: pedantic
# Use annotations instead of SARIF as this doesn't need special permissions
Expand Down
4 changes: 4 additions & 0 deletions app/components/AppFooter.vue
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,10 @@ const footerSections = computed<Array<{ label: string; links: FooterLink[] }>>((
<kbd class="kbd">c</kbd>
<span>{{ $t('shortcuts.compare_from_package') }}</span>
</li>
<li class="flex gap-2 items-center">
<kbd class="kbd">-</kbd>
<span>{{ $t('shortcuts.changelog') }}</span>
</li>
</ul>
<p class="text-fg-muted leading-relaxed">
<i18n-t keypath="shortcuts.disable_shortcuts" tag="span" scope="global">
Expand Down
24 changes: 23 additions & 1 deletion app/components/Code/DirectoryListing.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import type { RouteLocationRaw } from 'vue-router'
import type { RouteNamedMap } from 'vue-router/auto-routes'
import { ADDITIONAL_ICONS, getFileIcon } from '~/utils/file-icons'
import { isPossiblyUnnecessaryContent } from '~/utils/package-content-hints'

const props = defineProps<{
tree: PackageFileTree[]
Expand All @@ -10,6 +11,8 @@ const props = defineProps<{
baseRoute: Pick<RouteNamedMap['code'], 'params'>
}>()

const { t } = useI18n()

// Get the current directory's contents
const currentContents = computed(() => {
if (!props.currentPath) {
Expand Down Expand Up @@ -103,6 +106,11 @@ const bytesFormatter = useBytesFormatter()
<td colspan="2">
<LinkBase
:to="getCodeRoute(node.path)"
:aria-label="
isPossiblyUnnecessaryContent(node.name, node.type)
? `${node.name} - ${t('code.possibly_unnecessary')}`
: undefined
"
class="py-2 px-4 font-mono text-sm w-full"
no-underline
>
Expand All @@ -117,7 +125,21 @@ const bytesFormatter = useBytesFormatter()
/>
</svg>
<span class="w-full flex justify-self-stretch items-center gap-2">
<span class="flex-1">{{ node.name }}</span>
<span
class="flex-1"
:class="
isPossiblyUnnecessaryContent(node.name, node.type)
? 'text-yellow-600 dark:text-yellow-400'
: undefined
"
>{{ node.name }}</span
>
<span
v-if="isPossiblyUnnecessaryContent(node.name, node.type)"
class="i-lucide:info size-[0.85em] shrink-0 text-amber-600 dark:text-amber-400"
aria-hidden="true"
:title="t('code.possibly_unnecessary')"
/>
<span v-if="typeof node.size === 'number'" class="text-end text-xs text-fg-subtle">
{{ bytesFormatter.format(node.size) }}
</span>
Expand Down
52 changes: 49 additions & 3 deletions app/components/Code/FileTree.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import type { RouteLocationRaw } from 'vue-router'
import type { RouteNamedMap } from 'vue-router/auto-routes'
import { ADDITIONAL_ICONS, getFileIcon } from '~/utils/file-icons'
import { isPossiblyUnnecessaryContent } from '~/utils/package-content-hints'

const props = defineProps<{
tree: PackageFileTree[]
Expand All @@ -12,6 +13,7 @@ const props = defineProps<{
}>()

const depth = computed(() => props.depth ?? 0)
const treeRoot = useTemplateRef('treeRoot')

// Check if a node or any of its children is currently selected
function isNodeActive(node: PackageFileTree): boolean {
Expand All @@ -35,27 +37,38 @@ function getFileRoute(nodePath: string): RouteLocationRaw {

const { toggleDir, isExpanded, autoExpandAncestors } = useFileTreeState(props.baseUrl)

const scrollIntoView = () => {
const el = treeRoot.value?.querySelector<HTMLElement>('[aria-current="true"]')
el?.scrollIntoView({ block: 'center', behavior: 'smooth' })
}

// Auto-expand directories in the current path
watch(
() => props.currentPath,
path => {
if (depth.value === 0 && path) {
autoExpandAncestors(path)
nextTick(scrollIntoView)
}
},
{ immediate: true },
)
</script>

<template>
<ul class="list-none m-0 p-0" :class="depth === 0 ? 'py-2' : ''">
<ul ref="treeRoot" class="list-none m-0 p-0" :class="depth === 0 ? 'py-2' : ''">
<li v-for="node in tree" :key="node.path">
<!-- Directory -->
<template v-if="node.type === 'directory'">
<ButtonBase
class="w-full justify-start! rounded-none! border-none! transition-[color,background-color]! duration-100!"
block
:aria-pressed="isNodeActive(node)"
:aria-label="
isPossiblyUnnecessaryContent(node.name, 'directory')
? `${node.name} - ${$t('code.possibly_unnecessary')}`
: undefined
"
:style="{ paddingLeft: `${depth * 12 + 12}px` }"
@click="toggleDir(node.path)"
:classicon="isExpanded(node.path) ? 'i-lucide:chevron-down' : 'i-lucide:chevron-right'"
Expand All @@ -70,7 +83,21 @@ watch(
:href="`/file-tree-sprite.svg#${isExpanded(node.path) ? ADDITIONAL_ICONS['folder-open'] : ADDITIONAL_ICONS['folder']}`"
/>
</svg>
<span class="truncate">{{ node.name }}</span>
<span
class="truncate"
:class="
isPossiblyUnnecessaryContent(node.name, 'directory')
? 'text-yellow-600 dark:text-yellow-400'
: undefined
"
>{{ node.name }}</span
>
<span
v-if="isPossiblyUnnecessaryContent(node.name, 'directory')"
class="i-lucide:info size-[0.85em] ms-1 shrink-0 text-amber-600 dark:text-amber-400"
aria-hidden="true"
:title="$t('code.possibly_unnecessary')"
/>
</ButtonBase>
<CodeFileTree
v-if="isExpanded(node.path) && node.children"
Expand All @@ -88,14 +115,33 @@ watch(
variant="button-secondary"
:to="getFileRoute(node.path)"
:aria-current="currentPath === node.path"
:aria-label="
isPossiblyUnnecessaryContent(node.name, 'file')
? `${node.name} - ${$t('code.possibly_unnecessary')}`
: undefined
"
class="w-full justify-start! rounded-none! border-none! transition-[color,background-color]! duration-100!"
block
:style="{ paddingLeft: `${depth * 12 + 32}px` }"
>
<svg class="size-[1em] me-1 shrink-0" viewBox="0 0 16 16" aria-hidden="true">
<use :href="`/file-tree-sprite.svg#${getFileIcon(node.name)}`" />
</svg>
<span class="truncate">{{ node.name }}</span>
<span
class="truncate"
:class="
isPossiblyUnnecessaryContent(node.name, 'file')
? 'text-yellow-600 dark:text-yellow-400'
: undefined
"
>{{ node.name }}</span
>
<span
v-if="isPossiblyUnnecessaryContent(node.name, 'file')"
class="i-lucide:info size-[0.85em] ms-1 shrink-0 text-amber-600 dark:text-amber-400"
aria-hidden="true"
:title="$t('code.possibly_unnecessary')"
/>
</LinkBase>
</template>
</li>
Expand Down
Loading
Loading