Bracket folders → params: [id] one segment, [...slug] one+, [[...slug]] zero+; generateStaticParams для pre-build, остальное on-demand.
Разбор
Static folders = literal segments; bracketed capture params. Bracket count = quantifier:
| Folder | Matches | Example URL | params |
|---|
[id] | exactly one segment | /posts/42 | { id: '42' } |
[...slug] | one or more | /docs/a/b/c | { slug: ['a','b','c'] } |
[[...slug]] | zero or more | /docs and /docs/a/b | { slug: undefined | [...] } |
Catch-all [...slug] не match parent (/docs 404); optional catch-all [[...slug]] match base path — double brackets для same page на /docs и /docs/a/b.
Итог
Optional vs required catch-all — частая путаница; quantifier в имени folder определяет match parent route.