2288 Commits
Author SHA1 Message Date
github-actions[bot]GitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
ab09f500cb Version Packages (#3405)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-07 19:54:04 +08:00
Fuma Nama 889a296d06 docs: update stale content 2026-07-07 18:31:14 +08:00
Fuma Nama 9a269030df Version Packages 2026-07-07 17:53:33 +08:00
Fuma Nama 0f389cf3de feat(satteri): decouple imports/exports from compile() 2026-07-07 17:21:40 +08:00
Fuma Nama 6f703bfde7 feat(core): noCopy attribute for codeblocks 2026-07-06 02:11:15 +08:00
Fuma Nama dd8eb99f50 fix(satteri): fix weird issues with satteri 2026-07-06 01:16:27 +08:00
Fuma Nama 76c8a9f6e7 refactor(*): default to Base UI 2026-07-05 17:49:46 +08:00
Fuma Nama 3b90b4f5e0 fix: dedupe type table generator 2026-07-04 01:18:40 +08:00
aded98924a Integrate Satteri (#3402)
* feat(satteri): add @fumadocs/satteri package and compiler discriminator

Introduce @fumadocs/satteri with Sätteri-native ports of Fumadocs MDX
plugins (remark-heading, structure, image, code-tab, npm, rehype-toc,
rehype-code, and others), plus applySatteriPreset and compileMdx.

In fumadocs-mdx, add compiler: 'satteri' on doc collections with
satteriOptions typing, getSatteriOptions(), and a buildSatteriMDX path
that uses mdxToJs instead of @mdx-js/mdx.

Co-authored-by: Fuma Nama <[email protected]>

* Port native rehype-code and isolate Satteri as optional peer

- Rewrite @fumadocs/satteri rehype-code as a Satteri hast plugin using
  fumadocs-core Shiki (no unified/vfile deps in the package)
- Unwrap Shiki root fragments before ctx.replaceNode
- Move getSatteriOptions to fumadocs-mdx/config/build-satteri and expose
  fumadocs-mdx/satteri and fumadocs-mdx/config/satteri entry points
- Make @fumadocs/satteri and satteri optional peerDependencies
- Dynamic-import the satteri build path only when compiler is satteri
- Add rehype-code and fumadocs-mdx satteri pipeline tests

Co-authored-by: Fuma Nama <[email protected]>

* Port official docs app to Satteri compiler

- Switch apps/docs docs and blog collections to compiler: satteri
- Replace mdxOptions/applyMdxPreset with applySatteriPreset and Satteri plugins
- Add @fumadocs/satteri plugins: rehypeKatex, remarkElementIds, remarkLlms
- Port remarkAutoTypeTableSatteri and remarkTypeScriptToJavaScriptSatteri
- Enhance remark-structure stringify and satteri postprocess pipeline
- Drop remark-math/rehype-katex/unified from docs deps (math via features.math)

Co-authored-by: Fuma Nama <[email protected]>

* Remove custom rehypeKatex; use Satteri features.math

Satteri natively parses inline ($...$) and display ($$...$$) math via
features.math. Drop the redundant KaTeX hast plugin, katex peer dependency,
and hast-util-from-html-isomorphic from @fumadocs/satteri.

Co-authored-by: Fuma Nama <[email protected]>

* Use structuredClone for Satteri node snapshots; fix build blockers

- Replace custom materialize() with structuredClone in remark-llms and
  remark-structure (snapshot nodes during visitor, stringify after pass)
- Add GFM/math stringifiers for structured data and LLM markdown export
- Fix remark-include cwd attribute, section extraction, and node replacement
- Fix remarkAutoTypeTableSatteri cwd resolution via collection _cwd
- Restore remark deps for apps/docs markdown.tsx

Co-authored-by: Fuma Nama <[email protected]>

* docs: add AGENTS.md with Cursor Cloud setup instructions

Co-authored-by: god63820869 <[email protected]>

* Fix Satteri plugin patterns per upstream API docs

Plugins were fighting Satteri's Rust-backed AST model:

- Export once at compile end via ctx.data, not queueDataExport per visit
  (rehype-toc, remark-llms, valueExportPlugin) — avoids 1600+ duplicate exports
- Use ctx.replaceNode / insertChildAt instead of splicing parent.children
  (remark-npm, remark-code-tab, remark-auto-type-table)
- Return { raw: string } for includes instead of inserting external mdast
- Skip Shiki on math code blocks; flatten toc titles for appendExports
- Sync remark-llms _markdown writes; guard get-llm-text processed fallback

Adds satteri-toc-count test. Docs build passes.

Co-authored-by: Fuma Nama <[email protected]>

* Use Satteri exported types instead of duplicating context shapes

Centralize ctx.data keys in @fumadocs/satteri/data-map via DataMap
augmentation. Plugins use MdastVisitorContext, HastVisitorContext, and
Data from satteri rather than inline { data: Record<...> } or
Parameters<typeof queueDataExport> hacks.

Re-export visitor context types from @fumadocs/satteri. MDX loader adds
_compiler to satteri DataMap separately.

Co-authored-by: Fuma Nama <[email protected]>

* Move remarkElementIds to docs; optimize Satteri plugin hot paths

- remarkElementIds is docs-only (apps/docs/lib) for lint link validation,
  removed from @fumadocs/satteri exports
- remark-llms: stringify once after all root children collected (was O(n²))
- remark-structure: attach structuredData once instead of every visit
- rehype-toc: store textContent title strings, not hast element refs
- preset: drop valueExportPlugin; compile.ts already handles _valueToExport

Co-authored-by: Fuma Nama <[email protected]>

* reduce deps

* Further Satteri plugin perf: defer clones, use textContent

- remark-llms: collect root indices during visit, structuredClone batch at end
- remark-structure: ctx.textContent instead of flattenNode when no custom stringify;
  single shared visitor per type; attach structuredData on first visit only
- remark-heading/postprocess: ctx.textContent for slug/title (no double tree walk)
- rehype-toc: assign export object once, mutate items array in place
- rehype-code: skip elements already highlighted by shiki
- Add remark-llms tests; vitest @ path alias

Co-authored-by: Fuma Nama <[email protected]>

* Move remark-ts2js Satteri plugin to @fumadocs/satteri

- Add remarkTs2js to @fumadocs/satteri (oxc-transform dep)
- doc-gen keeps unified remarkTypeScriptToJavaScript only; drop satteri peer
- Docs source.config imports remarkTs2js from @fumadocs/satteri
- Document Satteri usage tab in remark-ts2js docs page

Co-authored-by: Fuma Nama <[email protected]>

* Move remarkAutoTypeTable Satteri plugin to @fumadocs/satteri

Extract shared generation into fumadocs-typescript/auto-type-table-generate.
fumadocs-typescript keeps unified remarkAutoTypeTable only; no satteri dep.

Satteri remarkAutoTypeTable uses createAutoTypeTableGenerator from
fumadocs-typescript. Docs imports plugin from @fumadocs/satteri.

Co-authored-by: Fuma Nama <[email protected]>

* refactor(satteri): remove barrel export, use subpath imports

Drop src/index.ts and the package root export. Each plugin, preset,
compile, utils, and data-map module is now a separate subpath export.
Consumers import from paths like @fumadocs/satteri/preset and
@fumadocs/satteri/remark-ts2js. Satteri core APIs are imported
from the satteri package directly.

Co-authored-by: Fuma Nama <[email protected]>

* fix(satteri): keep auto-type-table logic local, use markdownToHast

Revert all fumadocs-typescript changes. Move auto-type-table generation
into @fumadocs/satteri with duplicated parse-tags helper. Render JSDoc
markdown via Satteri's markdownToHast (no remark/unified deps); sanitize
raw hast nodes for hast-util-to-estree compatibility.

Co-authored-by: Fuma Nama <[email protected]>

* refactor(satteri): consolidate remark-auto-type-table into one file

Merge auto-type-table-generate, markdown-renderer, and parse-tags into
remark-auto-type-table.ts. Drop factory/helpers; inline prop parsing and
table generation in the Satteri plugin visitor.

Co-authored-by: Fuma Nama <[email protected]>

* improve performance

* Merge branch 'pr-3398' into cursor/satteri-package-b279

---------

Co-authored-by: Fuma Nama <[email protected]>
2026-07-03 19:33:29 +08:00
84e69fdc49 docs: add Sora UI to showcase (#3401)
Add Sora UI (https://ui.soralabs.io.vn) to the Fumadocs showcase with an OG preview thumbnail.

Co-authored-by: Cursor <[email protected]>
2026-07-03 16:56:07 +08:00
Fuma Nama 923e5819fb docs: add more FAQs 2026-06-27 17:01:35 +08:00
Fuma Nama 4abdb050e4 refactor: use cnfast 2026-06-25 23:54:29 +08:00
Fuma Nama 33a305ce12 Bump deps 2026-06-25 22:53:18 +08:00
Khiet Tam NguyenandGitHub 38ac5da0db fix(tanstack-start): use validator instead of inputValidator (deprecated) (#3375) 2026-06-25 13:34:04 +08:00
Fuma Nama 0bc31df324 fix(openapi): improve Schema UI tag rendering 2026-06-24 22:17:12 +08:00
Fuma Nama ae508485ab feat(core): support react router v8 2026-06-18 07:15:08 +09:00
Fuma Nama e582b15381 docs: fix typo 2026-06-17 20:00:41 +08:00
Fuma Nama 765e95f263 chore: bump deps 2026-06-17 20:00:41 +08:00
Fuma Nama ec0b6821fe chore: bump deps 2026-06-13 13:52:20 +08:00
Fuma Nama e977acfc8c refactor(ui): change TOC variants 2026-06-12 21:51:49 +08:00
Fuma Nama 0997dd65f2 refactor(core): deprecate type: "xxx" usage of useDocsSearch() 2026-06-12 19:50:07 +08:00
Fuma Nama 86083078b7 fix radix-ui types 2026-06-12 02:46:24 +08:00
Fuma Nama 501728965f chore: bump deps 2026-06-12 02:39:52 +08:00
Fuma Nama fc1beed2b5 docs: add demo for AsyncAPI 2026-06-11 02:20:00 +08:00
Fuma Nama 5d981ab540 docs: migration guide for OpenAPI v11 2026-06-11 01:18:26 +08:00
Fuma Nama e8d6cc3048 feat(openapi): backward compat with <APIPage /> 2026-06-10 14:44:54 +08:00
Fuma NamaandFuma Nama ca56eeb0c0 docs: update guides for translations 2026-06-08 20:05:08 +08:00
Fuma Nama a906cbf953 chore(asyncapi): improve UI 2026-06-07 20:14:16 +08:00
Fuma NamaandFuma Nama 74102c5655 feat(asyncapi): implement 2026-06-07 20:08:57 +08:00
Fuma NamaandFuma Nama 3e847746c7 docs: update docs for OpenAPI 2026-06-07 20:08:57 +08:00
Fuma NamaandFuma Nama 2d2c65de8f refactor: migrate old usage 2026-06-07 20:08:57 +08:00
Fuma Nama 0cc1facdac feat(ui): make uiTranslations() optional for translations API 2026-06-05 21:40:39 +08:00
Fuma Nama a62a45de0b chore: bump deps 2026-06-05 16:53:20 +08:00
Fuma Nama 9a6ac875c6 docs: add sections to landing page 2026-06-04 17:43:25 +08:00
Fuma Nama 2d0eb9a52d docs: mention fumapress 2026-06-02 18:23:18 +08:00
23055816e6 feat(openapi): anchor links for request/response/parameter properties (#3327)
* feat(openapi): anchor links on schema properties

Each property rendered inline in a request body, response body, or parameter
now gets a stable id and a hover-revealed link icon, enabling deep links to
specific fields from guides. Ids follow:
  - body-<prop> for request bodies
  - response-<status>-<prop> for responses
  - parameters-<location>-<name> for parameters

A new idPrefix option on SchemaUI opts other Schema renderings into the same
behavior. See fuma-nama/fumadocs#3322.

* feat(openapi): deep-link nested schema properties

Extend the property anchor scheme to support hashes that point inside a
popover or below an array's "Show array" collapsible. Schema-internal
segments are joined with `.` so `#body.user.address.street` resolves
unambiguously regardless of dashes in property names.

On hash match, the inline anchor scrolls into view, the matching popover
auto-opens with its breadcrumb pre-navigated, the array collapsible
expands, and oneOf/anyOf tabs switch to the variant containing the
targeted field. The deep target is consumed after the first auto-open,
so subsequent user clicks on the same trigger get the base view; a
different deep hash re-arms it.

The hover anchor is now a copy-link button (matches fumadocs heading
anchors) that writes the full URL to the clipboard and updates the
address bar via history.replaceState (no hashchange, no popover reset).

* address PR review feedback

- Clarified the changeset: split anchor ID rules by context (request/response property paths vs flat parameter anchors) so dots aren't implied to apply to parameters.
- Namespaced anchors by media type when an operation has multiple request-body or response content types: prefix becomes `<media-slug>-body` / `response-<status>-<media-slug>`, and the content-type SelectTabs auto-switches to the targeted tab when a deep link arrives. Single-content-type operations keep the simple `body` / `response-<status>` form.
- Made findUnionPropMatch validate the *full* remaining path (via new pathResolves helper) so two variants that share the first prop name no longer race; the wrong tab can't be selected for a deep hash anymore.
- Reset SchemaUIPopover breadcrumb state when initialPath changes so a fresh deep hash takes effect on an already-open popover.
- Replaced the lossy slugifyPropertyName with encodeURIComponent (plus % encoding for `.`) so property anchors stay collision-safe across case-only differences, punctuation-only differences, and non-ASCII keys, while `.` remains exclusively a path separator.

* address PR review feedback

- Fix potential hydration mismatch in useTabValueFromHash by initializing state with the fallback value and resolving from the URL hash inside useEffect; the deep-linked tab now corrects after hydration on the client.

* fix(openapi): move useTabValueFromHash into a client component

The previous hydration-mismatch fix put `useEffect`/`useState` directly in
`operation/index.tsx`, which is a Server Component — Next refused to compile
because RSC modules can't import client-only React APIs. Extract the
hash-aware tab wrapper into `operation/hash-tabs.tsx` (with `"use client"`)
and switch both body and response sites to `HashAwareSelectTabs`. The parent
tree stays server-side; only the tab wrapper hydrates on the client.

* address PR review feedback

- Wrap decodeURIComponent in try/catch in both deep-link hash parsers so a malformed percent-encoded fragment (e.g. `#body%`) is treated as "no target" instead of throwing URIError and breaking tab / popover resolution.

* address PR review feedback

- Match the URL hash against DOM ids using the raw fragment first, with the fully-decoded form as a fallback, in both DeepLinkProvider and hash-tabs. Property anchors are generated via slugifyPropertyName (which percent-encodes reserved chars like `.`), so DOM ids contain the encoded form; decoding the hash before lookup caused links like `#body.foo%2Ebar` to miss the matching element.

* redesign

* fix types

---------

Co-authored-by: Fuma Nama <[email protected]>
2026-06-02 03:43:01 +08:00
Fuma Nama 73b9cec605 docs: fix build 2026-05-29 18:33:21 +08:00
Fuma Nama a9f95ffbd9 chore: bump deps 2026-05-29 18:22:54 +08:00
Fuma Nama 42f02559da feat(core): support invalidate & revalidate on dynamic loader 2026-05-29 16:47:48 +08:00
Ismail GhallouandGitHub 8b1701942c docs: document LLM_GATEWAY_MODEL for Ask AI (#3319) 2026-05-29 11:53:29 +08:00
Ismail GhallouandGitHub cad622e541 Merge pull request #3318 from smakosh/feat/llmgateway-ai-provider
Docs: support LLMGateway for AI chat
2026-05-29 01:52:19 +08:00
Fuma Nama 4282d79571 fix(shadcn): performance 2026-05-28 15:40:44 +08:00
Fuma Nama c800347b3b feat(story): support Webpack/Turbopack plugin 2026-05-28 15:14:41 +08:00
Fuma Nama 5c5d319331 feat(story): New Vite plugin for non-RSC environment 2026-05-26 21:54:05 +08:00
Fuma Nama 93a2003df6 chore: bump deps 2026-05-26 19:49:18 +08:00
Fuma Nama cec41638ce docs: multiple orgs to one user 2026-05-25 19:18:48 +08:00
Fuma Nama 5e19560cf3 docs: introduce pagesIndex 2026-05-24 20:33:46 +08:00
Fuma Nama afe04307a9 docs: update sponsors 2026-05-24 20:11:18 +08:00
Fuma Nama 7a06062c1c docs: show past sponsors 2026-05-24 19:23:23 +08:00
Fuma Nama 334c8fd190 feat(core): support different orders of preset() calls 2026-05-22 22:08:39 +08:00