Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
cfbc6ef
fix(i18n): update Czech translations (#2425)
VentyCZ Apr 9, 2026
ac1fdb3
chore: use new `dedupePeers` pnpm option (#2420)
btea Apr 9, 2026
57687cc
fix(i18n): update Russian translations (#2429)
dragomano Apr 9, 2026
69cdfd4
chore: manually add vite plus pre-commit hook (#2434)
alexdln Apr 9, 2026
ac83c56
perf: parallelize jsDelivr README fallback probes (#2384)
trivikr Apr 9, 2026
9222620
chore: upgrade vite-plus to 0.1.16 (#2436)
fengmk2 Apr 9, 2026
c93d9b0
refactor: parallelize docs rendering and shiki setup (#2382)
trivikr Apr 9, 2026
5a2b1a6
ci: revert "ci: auto-remove `needs review` label when PR is reviewed"…
serhalp Apr 9, 2026
f58c765
fix(i18n): add missing French translations (#2441)
juliendargelos Apr 9, 2026
fd7703c
fix: pass query params to OG image ISR function on Vercel (#2432)
Adebesin-Cell Apr 9, 2026
44373b5
ci: add e18e dependency diff workflow (#2435)
serhalp Apr 10, 2026
21420c0
ci: actually bump `e18e/action-dependency-diff` to v1.5.0 (#2454)
serhalp Apr 10, 2026
eb2e6bb
fix(i18n): add missing norwegian nb-NO translations (#2450)
bonsak Apr 10, 2026
017f023
fix(cli): enable web auth for package:init (#2415)
ehs5 Apr 10, 2026
6c6e274
fix(i18n): add missing zh-CN translations (#2452)
DamengRandom Apr 10, 2026
4f45d5b
ci: update Discord link to builders server (#2461)
jonchurch Apr 10, 2026
4123e8d
feat(ui): support Vite+ `vp` package manager commands (#2451)
duowb Apr 10, 2026
efe01a0
chore: shave ~1-2s off `pnpm test:types` (#2458)
serhalp Apr 10, 2026
f5bb3ed
chore: move a comment to the right line (#2456)
serhalp Apr 10, 2026
0164064
fix: add ignore attributes for password managers to input fields (#2466)
t128n Apr 10, 2026
bec2f2f
refactor: add missing IconClass type to icon props (#2462)
C1ANCYSz Apr 11, 2026
d76ee23
feat: add `socket.dev` link into package command palette (#2481)
romansp Apr 12, 2026
655ae5b
fix(i18n): add missing keys to de translations (#2475)
t128n Apr 12, 2026
51bc902
docs(ui): add stories for Brand page (#2468)
cylewaitforit Apr 12, 2026
287a3ae
fix(i18n): actually use i18n `ctrl_key` consistently (#2457)
serhalp Apr 12, 2026
8463bb9
ci: reconfigure CodeRabbit to improve signal-to-noise ratio (#2439)
serhalp Apr 12, 2026
925bf16
fix(ui): preserve root dir state when sibling dir is expanded (#2393)
trivikr Apr 12, 2026
c5b3b0f
feat: replace quadrant with scatter with selectable axes (#2472)
graphieros Apr 12, 2026
5cb6bc6
fix: highlight scatter axes on facet inputs focus (#2484)
graphieros Apr 12, 2026
ae8981e
fix(i18n): consistent casing for common.view_on en keys (#2482)
ghostdevv Apr 12, 2026
a1f6487
fix: encode username in constructed gravatar URL (#2488)
tomaioo Apr 12, 2026
3b47de4
fix: retry replacement suggestions after transient fetch failures (#2…
trivikr Apr 12, 2026
f70a11b
feat(i18n): add Chinese translations (#2485)
WishMelz Apr 12, 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
83 changes: 83 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
language: en-GB

reviews:
profile: chill
# Keep the high-level summary enabled (default), but place it in the
# walkthrough comment instead of relying on PR description updates.
high_level_summary_in_walkthrough: true
review_status: true
review_details: false
changed_files_summary: true
sequence_diagrams: true
estimate_code_review_effort: false
assess_linked_issues: true
related_issues: true
related_prs: true
suggested_labels: false
suggested_reviewers: true
in_progress_fortune: false
poem: false

slop_detection:
enabled: true
label: '007'

auto_review:
auto_pause_after_reviewed_commits: 5
labels:
- '!release'
ignore_title_keywords:
- 'WIP'
- '[skip-review]'
- 'chore(release)'
ignore_usernames:
- 'renovate[bot]'
- 'dependabot[bot]'
- 'github-actions[bot]'

# Built-in PR metadata/content checks. Modes are: off, warning, error.
pre_merge_checks:
docstrings:
mode: off
title:
mode: error
description:
mode: warning
issue_assessment:
mode: warning

tools:
gitleaks:
enabled: true
osvScanner:
enabled: true
actionlint:
enabled: true
yamllint:
enabled: true
shellcheck:
enabled: true
dotenvLint:
enabled: true

# Disable tools redundant with our own CI
eslint:
enabled: false
biome:
enabled: false
oxc:
enabled: false
markdownlint:
enabled: false
languagetool:
enabled: false
github-checks:
enabled: false

# Security-related, but not a good fit for this repo
checkov:
enabled: false
trivy:
enabled: false
opengrep:
enabled: false
31 changes: 31 additions & 0 deletions .github/workflows/dependency-diff-comment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: dependency-diff-comment

on:
workflow_run:
workflows: ['dependency-diff']
types:
- completed

permissions:
pull-requests: write
actions: read

jobs:
dependency-diff-comment:
name: 💬 Dependency diff comment
runs-on: ubuntu-slim
if: github.event.workflow_run.conclusion == 'success'

steps:
- name: 📥 Download artifact
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: e18e-diff-result
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: 💬 Post comment
uses: e18e/action-dependency-diff@f825d5b5c5ce0a42dc46c47ec20de24460affcd8 # v1.5.0
with:
mode: comment-from-artifact
artifact-path: e18e-diff-result.json
47 changes: 47 additions & 0 deletions .github/workflows/dependency-diff.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: dependency-diff

on:
pull_request:
branches:
- main
- release
paths:
- package.json
- pnpm-lock.yaml
- pnpm-workspace.yaml
- docs/package.json
- cli/package.json

concurrency:
group: ${{ github.workflow }}-${{ github.event.number || github.sha }}
cancel-in-progress: true

permissions:
contents: read

jobs:
dependency-diff:
name: 🔎 Dependency diff
runs-on: ubuntu-slim

steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

- name: 🔎 Compare dependencies
id: analyze
uses: e18e/action-dependency-diff@f825d5b5c5ce0a42dc46c47ec20de24460affcd8 # v1.5.0
with:
mode: artifact
detect-replacements: 'true'
duplicate-threshold: '4'
dependency-threshold: '15'
size-threshold: '200000'

- name: 📤 Upload artifact
if: steps.analyze.outputs.artifact-path
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: e18e-diff-result
path: ${{ steps.analyze.outputs.artifact-path }}
69 changes: 0 additions & 69 deletions .github/workflows/remove-needs-review-on-review.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/welcome-close.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
const body = [
`Thanks for your first contribution, @${author}! ${emoji}`,
'',
`We'd love to welcome you to the npmx community. Come and say hi on [Discord](https://chat.npmx.dev)! And once you've joined, visit [npmx.wamellow.com](https://npmx.wamellow.com/) to claim the **contributor** role.`,
`We'd love to welcome you to the npmx community. Come and say hi on [Discord](https://build.npmx.dev)! And once you've joined, visit [npmx.wamellow.com](https://npmx.wamellow.com/) to claim the **contributor** role.`,
].join('\n');
await github.rest.issues.createComment({
Expand Down
109 changes: 91 additions & 18 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import type { StorybookConfig } from '@storybook-vue/nuxt'
import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'

const config = {
stories: [
Expand All @@ -21,29 +23,95 @@ const config = {
async viteFinal(newConfig) {
newConfig.plugins ??= []

// Fix: nuxt:components:imports-alias relies on internal Nuxt state that is
// cleaned up after nuxt.close() in @storybook-vue/nuxt's loadNuxtViteConfig.
// When that state is gone, `import X from '#components'` is left unresolved
// and Vite 8 falls through to package-subpath resolution, which fails with
// "Missing '#components' specifier in 'nuxt' package".
// This plugin intercepts #components first and serves a virtual module built
// from the components.d.ts written during the same Nuxt boot.
// Resolve the Nuxt build dir from Vite's alias map, which can be either a
// plain-object (Record<string, string>) or Vite's resolved array form
// (readonly Alias[] where find is string | RegExp). We must handle both
// without casting to Record<string, string>, which would be unsound for the
// array form.
const aliases = newConfig.resolve?.alias
const buildDir = (() => {
if (!aliases) return undefined
if (Array.isArray(aliases)) {
const entry = aliases.find(a => a.find === '#build')
return typeof entry?.replacement === 'string' ? entry.replacement : undefined
}
const value = (aliases as Record<string, unknown>)['#build']
return typeof value === 'string' ? value : undefined
})()
newConfig.plugins.unshift({
name: 'storybook-nuxt-components',
enforce: 'pre',
resolveId(id) {
if (id === '#components') return '\0virtual:#components'
return null
},
load(id) {
if (id !== '\0virtual:#components') return
if (!buildDir) {
throw new Error('[storybook-nuxt-components] Could not resolve the `#build` alias.')
}
const dtsPath = resolve(buildDir, 'components.d.ts')
// Wire the generated declaration file into Vite's file-watch graph so
// that the virtual module is invalidated when Nuxt regenerates it.
this.addWatchFile(dtsPath)
const dts = readFileSync(dtsPath, 'utf-8')
const lines: string[] = []
// Match only the direct `typeof import("…").default` form.
// Lazy/island wrappers (LazyComponent<T>, IslandComponent<T>) are
// excluded intentionally — Storybook only needs the concrete type.
// The format has been stable across all Nuxt 3 releases.
const re =
/^export const (\w+): typeof import\("([^"]+)"\)(?:\.default|\[['"]default['"]\])\s*;?$/gm
let match: RegExpExecArray | null
while ((match = re.exec(dts)) !== null) {
const [, name, rel] = match
if (!name || !rel) continue
const abs = resolve(buildDir, rel).replaceAll('\\', '/')
lines.push(`export { default as ${name} } from ${JSON.stringify(abs)}`)
}
if (lines.length === 0) {
throw new Error(
`[storybook-nuxt-components] No component exports were found in ${dtsPath}.`,
)
}
return lines.join('\n')
},
})

// Bridge compatibility between Storybook v10 core and v9 @storybook-vue/nuxt
// v10 expects module federation globals that v9 doesn't provide
newConfig.plugins.push({
name: 'storybook-v10-compat',
transformIndexHtml: {
order: 'pre',
handler(html) {
const script = `
<script>
// Minimal shims for Storybook v10 module federation system
// These will be replaced when Storybook runtime loads
window.__STORYBOOK_MODULE_GLOBAL__ = { global: window };
window.__STORYBOOK_MODULE_CLIENT_LOGGER__ = {
deprecate: console.warn.bind(console, '[deprecated]'),
once: console.log.bind(console),
logger: console
};
window.__STORYBOOK_MODULE_CHANNELS__ = {
Channel: class { on() {} off() {} emit() {} once() {} },
createBrowserChannel: () => new window.__STORYBOOK_MODULE_CHANNELS__.Channel()
};
</script>`
return html.replace(/<script>/, script + '<script>')
handler() {
return [
{
tag: 'script',
injectTo: 'head-prepend' as const,
children: [
'// Minimal shims for Storybook v10 module federation system',
'// These will be replaced when Storybook runtime loads',
'window.__STORYBOOK_MODULE_GLOBAL__ = { global: window };',
'window.__STORYBOOK_MODULE_CLIENT_LOGGER__ = {',
" deprecate: console.warn.bind(console, '[deprecated]'),",
' once: console.log.bind(console),',
' logger: console',
'};',
'window.__STORYBOOK_MODULE_CHANNELS__ = {',
' Channel: class { on() {} off() {} emit() {} once() {} },',
' createBrowserChannel: () => new window.__STORYBOOK_MODULE_CHANNELS__.Channel()',
'};',
].join('\n'),
},
]
},
},
})
Expand Down Expand Up @@ -73,7 +141,12 @@ const config = {
const wrapped = async function (this: unknown, ...args: unknown[]) {
try {
return await originalFn.apply(this, args)
} catch {
} catch (err) {
// oxlint-disable-next-line no-console -- Log and swallow errors to avoid breaking the Storybook build when vue-docgen-api encounters an unparseable component.
console.warn(
'[storybook:vue-docgen-plugin] Suppressed docgen error (component docs may be missing):',
err,
)
return undefined
}
}
Expand Down
1 change: 1 addition & 0 deletions .vite-hooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
vp staged
2 changes: 1 addition & 1 deletion app/components/Chart/SplitSparkline.vue
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ const configs = computed(() => {

<template #skeleton>
<!-- This empty div overrides the default built-in scanning animation on load -->
<div />
<div></div>
</template>
</VueUiSparkline>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/components/Code/FileTree.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const { toggleDir, isExpanded, autoExpandAncestors } = useFileTreeState(props.ba
watch(
() => props.currentPath,
path => {
if (path) {
if (depth.value === 0 && path) {
autoExpandAncestors(path)
}
},
Expand Down
Loading
Loading