sourcey 3.6.3 → 3.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,18 +2,14 @@
2
2
 
3
3
  > Docs straight from the source.
4
4
 
5
- Sourcey tells the whole product story. It turns specs, code, rich guides, changelog, roadmap pages, examples, and portable context files from your project into static HTML you can deploy anywhere.
5
+ Sourcey turns OpenAPI, MCP, Doxygen XML, godoc, rustdoc, and Markdown into one static HTML site you own: reference, guides, changelog, roadmap, and llms.txt from the same build, deployable anywhere.
6
6
 
7
- No dashboard. No runtime. No API calls to render your own documentation.
7
+ Everything renders at build time: no dashboard, no runtime, no API calls to render your own documentation.
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/sourcey)](https://www.npmjs.com/package/sourcey)
10
10
  [![build](https://img.shields.io/github/actions/workflow/status/sourcey/sourcey/ci.yml?branch=main)](https://github.com/sourcey/sourcey/actions)
11
11
  [![node](https://img.shields.io/node/v/sourcey)](https://nodejs.org)
12
12
  [![license](https://img.shields.io/npm/l/sourcey)](LICENSE)
13
- [![Go Reference](https://pkg.go.dev/badge/github.com/sourcey/sourcey/go/sourcey-godoc.svg)](https://pkg.go.dev/github.com/sourcey/sourcey/go/sourcey-godoc)
14
- [![Go Report Card](https://goreportcard.com/badge/github.com/sourcey/sourcey/go/sourcey-godoc)](https://goreportcard.com/report/github.com/sourcey/sourcey/go/sourcey-godoc)
15
- [![crates.io](https://img.shields.io/crates/v/sourcey.svg)](https://crates.io/crates/sourcey)
16
- [![docs.rs](https://docs.rs/sourcey/badge.svg)](https://docs.rs/sourcey)
17
13
 
18
14
  ```bash
19
15
  npx sourcey init
@@ -60,6 +56,9 @@ Then `sourcey init` to scaffold a new project, or `sourcey build` against an exi
60
56
 
61
57
  ### Standalone Go docs generator
62
58
 
59
+ [![Go Reference](https://pkg.go.dev/badge/github.com/sourcey/sourcey/go/sourcey-godoc.svg)](https://pkg.go.dev/github.com/sourcey/sourcey/go/sourcey-godoc)
60
+ [![Go Report Card](https://goreportcard.com/badge/github.com/sourcey/sourcey/go/sourcey-godoc)](https://goreportcard.com/report/github.com/sourcey/sourcey/go/sourcey-godoc)
61
+
63
62
  For Go-only consumers without a JavaScript toolchain, `sourcey-godoc` ships as a separate native binary. It produces static Go docs sites or portable `godoc.json` snapshots.
64
63
 
65
64
  | Path | Command |
@@ -68,19 +67,31 @@ For Go-only consumers without a JavaScript toolchain, `sourcey-godoc` ships as a
68
67
  | Homebrew | `brew install sourcey/tap/sourcey-godoc` |
69
68
  | Scoop | `scoop bucket add sourcey https://github.com/sourcey/scoop-bucket && scoop install sourcey-godoc` |
70
69
 
70
+ ### Rust snapshot converter
71
+
72
+ [![crates.io](https://img.shields.io/crates/v/sourcey.svg)](https://crates.io/crates/sourcey)
73
+ [![docs.rs](https://docs.rs/sourcey/badge.svg)](https://docs.rs/sourcey)
74
+
75
+ The `rustdoc()` adapter consumes nightly rustdoc JSON through the [`sourcey`](https://crates.io/crates/sourcey) companion crate and its `sourcey-rustdoc` converter, so CI can build Rust API docs from a committed snapshot on a stable toolchain. See [docs/adapters/rustdoc.md](docs/adapters/rustdoc.md).
76
+
71
77
  ## Quick start
72
78
 
73
79
  ```bash
74
- # From a single OpenAPI spec
75
- sourcey build api.yaml -o docs/
76
-
77
- # Multi-page site (reads sourcey.config.ts)
78
- sourcey build -o docs/
80
+ # Scaffold a project (detects OpenAPI specs and Doxyfiles)
81
+ npx sourcey init
79
82
 
80
83
  # Dev server with hot reload
81
84
  sourcey dev
85
+
86
+ # Build static HTML to dist/
87
+ sourcey build
88
+
89
+ # Quick build from a single OpenAPI spec
90
+ sourcey build api.yaml -o dist/
82
91
  ```
83
92
 
93
+ In CI, the [`sourcey/build-docs`](https://github.com/sourcey/build-docs) GitHub Action runs the build and deploys to GitHub Pages; see [deploying](https://sourcey.com/docs/deploying).
94
+
84
95
  ## Configuration
85
96
 
86
97
  Create `sourcey.config.ts` in your project root:
@@ -168,8 +179,8 @@ cd sourcey && npm install
168
179
  npm run build && npm test
169
180
  cd go/sourcey-godoc && go test ./... && go vet ./...
170
181
 
171
- # Run the demo site
172
- cd demo && npx tsx ../src/cli.ts dev
182
+ # Run the in-repo docs site against your working copy
183
+ cd docs && npx tsx ../src/cli.ts dev
173
184
  ```
174
185
 
175
186
  ## License
@@ -1,12 +1,12 @@
1
1
  // Scroll tracker — highlights the active sidebar nav link as user scrolls.
2
2
  //
3
3
  // Observes [data-traverse-target] section anchors and toggles .active
4
- // on the matching #nav .nav-link. All visual styling is in sourcey.css;
4
+ // on the matching #nav fragment link. All visual styling is in sourcey.css;
5
5
  // this file only manages the class.
6
6
  (function () {
7
7
  function init() {
8
8
  var navbar = document.getElementById('navbar');
9
- var navLinks = document.querySelectorAll('#nav .nav-link');
9
+ var navLinks = document.querySelectorAll('#nav .nav-link, #nav .nav-group-link');
10
10
  var targets = document.querySelectorAll('[data-traverse-target]');
11
11
 
12
12
  // For prose pages, also track heading elements that TOC links point to
@@ -113,7 +113,7 @@
113
113
  if (tocEl) tocEl.addEventListener('click', function (e) { handleAnchorClick(e, '.toc-item'); });
114
114
 
115
115
  var navEl = document.getElementById('nav');
116
- if (navEl) navEl.addEventListener('click', function (e) { handleAnchorClick(e, '.nav-link'); });
116
+ if (navEl) navEl.addEventListener('click', function (e) { handleAnchorClick(e, '.nav-link, .nav-group-link'); });
117
117
 
118
118
  // Use scroll event for reliable activation at all positions.
119
119
  function onScroll() {
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Sidebar.tsx"],"names":[],"mappings":"AA+FA;;GAEG;AACH,wBAAgB,OAAO,wCA2GtB"}
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Sidebar.tsx"],"names":[],"mappings":"AAsGA;;GAEG;AACH,wBAAgB,OAAO,wCA2GtB"}
@@ -32,7 +32,7 @@ function MethodPill({ method }) {
32
32
  * Shared nav group rendering used by both desktop sidebar and mobile drawer.
33
33
  */
34
34
  function NavGroups({ groups, activePageSlug, base }) {
35
- return (_jsx(_Fragment, { children: groups.map((group, gi) => (_jsxs("div", { class: gi > 0 ? "mt-6 lg:mt-8" : "", children: [group.label && (_jsx("h5", { class: "nav-group-label", children: group.label })), _jsx("ul", { class: "space-y-px", children: group.items.map((item) => {
35
+ return (_jsx(_Fragment, { children: groups.map((group, gi) => (_jsxs("div", { class: gi > 0 ? "mt-6 lg:mt-8" : "", children: [group.label && (group.href ? (_jsx("a", { href: `${base}${group.href}`, class: `nav-group-label nav-group-link${group.id === activePageSlug ? " active" : ""}`, children: group.label })) : (_jsx("h5", { class: "nav-group-label", children: group.label }))), _jsx("ul", { class: "space-y-px", children: group.items.map((item) => {
36
36
  const isActive = item.id === activePageSlug;
37
37
  return (_jsx("li", { children: _jsxs("a", { href: `${base}${item.href}`, class: `nav-link${isActive ? " active" : ""}`, children: [item.method && _jsx(MethodPill, { method: item.method }), _jsx("span", { class: "flex-1 break-words [word-break:break-word]", children: item.label })] }) }, item.id));
38
38
  }) })] }, group.label))) }));
@@ -26,7 +26,7 @@ export function Operation({ operation: op, serverUrl }) {
26
26
  const hasParams = op.parameters.length > 0;
27
27
  const hasBody = !!op.requestBody;
28
28
  const mcp = op.mcpExtras;
29
- return (_jsxs("div", { id: id, class: "py-8 border-t border-[rgb(var(--color-gray-100))] dark:border-[rgb(var(--color-gray-800))]", "data-traverse-target": id, children: [_jsx("header", { class: "mb-6", children: op.summary && (_jsxs("div", { class: "flex items-baseline gap-2 flex-wrap", children: [_jsx("h2", { class: "text-2xl sm:text-3xl text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))] tracking-tight font-bold mb-2", children: _jsx(Markdown, { content: op.summary, inline: true }) }), op.deprecated && _jsx(DeprecatedBadge, {}), mcp?.annotations && _jsx(AnnotationBadges, { annotations: mcp.annotations })] })) }), mcp ? (_jsx(McpEndpointBar, { method: op.method, path: op.path })) : (_jsx(EndpointBar, { method: op.method, path: op.path, serverUrl: serverUrl })), _jsxs("div", { class: `flex flex-col ${apiFirst ? "lg:flex-row" : "xl:flex-row"} gap-8`, children: [_jsxs("div", { class: "flex-1 min-w-0", children: [op.description && (_jsx(Markdown, { content: op.description, class: "mb-6" })), hasBody && (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { meta: bodyMediaType(op.requestBody), children: "Body" }), _jsx(RequestBody, { body: op.requestBody })] })), hasParams && (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { children: "Parameters" }), _jsx(Parameters, { parameters: op.parameters })] })), mcp ? (_jsx(McpReturnsCopy, { schema: mcp.outputSchema })) : (op.responses.length > 0 && (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { children: "Response" }), _jsx(ResponsesCopy, { responses: op.responses })] }))), !mcp && _jsx(SecurityCopy, { security: op.security })] }), _jsxs("aside", { class: `hidden ${apiFirst ? "lg:block" : "xl:block"} w-[28rem] shrink-0 sticky self-start overflow-y-auto space-y-4`, style: "top: calc(var(--header-height) + 2.5rem); max-height: calc(100vh - var(--header-height) - 5rem)", children: [_jsx(CodeSamplesExamples, { operation: op, serverUrl: serverUrl, codeSampleLangs: site.codeSamples }), hasBody && _jsx(RequestBodyExample, { body: op.requestBody }), mcp ? (_jsx(McpReturnsExample, { schema: mcp.outputSchema })) : (_jsx(ResponsesExamples, { responses: op.responses }))] })] }), _jsxs("div", { class: `${apiFirst ? "lg:hidden" : "xl:hidden"} mt-8 space-y-4`, children: [_jsx(CodeSamplesExamples, { operation: op, serverUrl: serverUrl, codeSampleLangs: site.codeSamples }), hasBody && _jsx(RequestBodyExample, { body: op.requestBody }), mcp ? (_jsx(McpReturnsExample, { schema: mcp.outputSchema })) : (_jsx(ResponsesExamples, { responses: op.responses }))] })] }));
29
+ return (_jsxs("div", { id: id, class: "py-8 border-t border-[rgb(var(--color-gray-100))] dark:border-[rgb(var(--color-gray-800))]", "data-traverse-target": id, children: [_jsx("header", { class: "mb-6", children: op.summary && (_jsxs("div", { class: "flex items-baseline gap-2 flex-wrap", children: [_jsx("h2", { class: "text-2xl sm:text-3xl text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))] tracking-tight font-bold mb-2", children: _jsx(Markdown, { content: op.summary, inline: true }) }), op.deprecated && _jsx(DeprecatedBadge, {}), mcp?.annotations && _jsx(AnnotationBadges, { annotations: mcp.annotations })] })) }), mcp ? (_jsx(McpEndpointBar, { method: op.method, path: op.path })) : (_jsx(EndpointBar, { method: op.method, path: op.path, serverUrl: serverUrl })), _jsxs("div", { class: `flex flex-col ${apiFirst ? "lg:flex-row" : "xl:flex-row"} gap-8`, children: [_jsxs("div", { class: "flex-1 min-w-0", children: [op.description && (_jsx(Markdown, { content: op.description, class: "mb-6 max-w-none" })), hasBody && (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { meta: bodyMediaType(op.requestBody), children: "Body" }), _jsx(RequestBody, { body: op.requestBody })] })), hasParams && (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { children: "Parameters" }), _jsx(Parameters, { parameters: op.parameters })] })), mcp ? (_jsx(McpReturnsCopy, { schema: mcp.outputSchema })) : (op.responses.length > 0 && (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { children: "Response" }), _jsx(ResponsesCopy, { responses: op.responses })] }))), !mcp && _jsx(SecurityCopy, { security: op.security })] }), _jsxs("aside", { class: `hidden ${apiFirst ? "lg:block" : "xl:block"} w-[28rem] shrink-0 sticky self-start overflow-y-auto space-y-4`, style: "top: calc(var(--header-height) + 2.5rem); max-height: calc(100vh - var(--header-height) - 5rem)", children: [_jsx(CodeSamplesExamples, { operation: op, serverUrl: serverUrl, codeSampleLangs: site.codeSamples }), hasBody && _jsx(RequestBodyExample, { body: op.requestBody }), mcp ? (_jsx(McpReturnsExample, { schema: mcp.outputSchema })) : (_jsx(ResponsesExamples, { responses: op.responses }))] })] }), _jsxs("div", { class: `${apiFirst ? "lg:hidden" : "xl:hidden"} mt-8 space-y-4`, children: [_jsx(CodeSamplesExamples, { operation: op, serverUrl: serverUrl, codeSampleLangs: site.codeSamples }), hasBody && _jsx(RequestBodyExample, { body: op.requestBody }), mcp ? (_jsx(McpReturnsExample, { schema: mcp.outputSchema })) : (_jsx(ResponsesExamples, { responses: op.responses }))] })] }));
30
30
  }
31
31
  function bodyMediaType(body) {
32
32
  const types = Object.keys(body.content);
@@ -17,6 +17,10 @@ export interface SiteTab {
17
17
  }
18
18
  export interface SiteNavGroup {
19
19
  label: string;
20
+ /** Optional section link for generated groups such as OpenAPI tag intros. */
21
+ href?: string;
22
+ /** Unique ID for section-level active-state matching. */
23
+ id?: string;
20
24
  items: SiteNavItem[];
21
25
  }
22
26
  export interface SiteNavItem {
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/core/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgB/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,UAAkB,GAC7B,OAAO,CAiDT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClC,UAAU,GAAE,UAAkB,GAC7B,OAAO,CA8BT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,CASnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,cAAc,CAEhB"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/core/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgB/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,UAAkB,GAC7B,OAAO,CAuDT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClC,UAAU,GAAE,UAAkB,GAC7B,OAAO,CA8BT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,CASnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,cAAc,CAEhB"}
@@ -40,6 +40,7 @@ export function buildNavFromSpec(spec, tabSlug, prettyUrls = false) {
40
40
  for (const tag of spec.tags) {
41
41
  if (tag.hidden)
42
42
  continue;
43
+ const tagId = `tag-${htmlId(tag.name)}`;
43
44
  const items = tag.operations.map((op) => ({
44
45
  label: op.summary ?? `${op.method.toUpperCase()} ${op.path}`,
45
46
  href: `${basePath}#operation-${htmlId(op.path)}-${htmlId(op.method)}`,
@@ -48,7 +49,12 @@ export function buildNavFromSpec(spec, tabSlug, prettyUrls = false) {
48
49
  }));
49
50
  if (!items.length)
50
51
  continue;
51
- groups.push({ label: tagNavigationLabel(tag, tagsByName), items });
52
+ groups.push({
53
+ label: tagNavigationLabel(tag, tagsByName),
54
+ href: `${basePath}#${tagId}`,
55
+ id: tagId,
56
+ items,
57
+ });
52
58
  }
53
59
  // Models group
54
60
  const schemaNames = Object.keys(spec.schemas);
@@ -66,15 +66,15 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
66
66
 
67
67
  [[package]]
68
68
  name = "bitflags"
69
- version = "2.11.1"
69
+ version = "2.13.0"
70
70
  source = "registry+https://github.com/rust-lang/crates.io-index"
71
- checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
71
+ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
72
72
 
73
73
  [[package]]
74
74
  name = "camino"
75
- version = "1.2.2"
75
+ version = "1.2.3"
76
76
  source = "registry+https://github.com/rust-lang/crates.io-index"
77
- checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48"
77
+ checksum = "b4ce8d3bd5823c7504d3f579f13e7b2f3da252fcb938c594d5680ee508bf846f"
78
78
  dependencies = [
79
79
  "serde_core",
80
80
  ]
@@ -180,9 +180,6 @@ name = "deranged"
180
180
  version = "0.5.8"
181
181
  source = "registry+https://github.com/rust-lang/crates.io-index"
182
182
  checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
183
- dependencies = [
184
- "powerfmt",
185
- ]
186
183
 
187
184
  [[package]]
188
185
  name = "equivalent"
@@ -245,9 +242,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
245
242
 
246
243
  [[package]]
247
244
  name = "memchr"
248
- version = "2.8.1"
245
+ version = "2.8.2"
249
246
  source = "registry+https://github.com/rust-lang/crates.io-index"
250
- checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
247
+ checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
251
248
 
252
249
  [[package]]
253
250
  name = "miniz_oxide"
@@ -452,9 +449,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
452
449
 
453
450
  [[package]]
454
451
  name = "syn"
455
- version = "2.0.117"
452
+ version = "2.0.118"
456
453
  source = "registry+https://github.com/rust-lang/crates.io-index"
457
- checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
454
+ checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
458
455
  dependencies = [
459
456
  "proc-macro2",
460
457
  "quote",
@@ -503,12 +500,11 @@ dependencies = [
503
500
 
504
501
  [[package]]
505
502
  name = "time"
506
- version = "0.3.47"
503
+ version = "0.3.49"
507
504
  source = "registry+https://github.com/rust-lang/crates.io-index"
508
- checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
505
+ checksum = "711a53c2d47bbd818258c498c8dbfe186a2526c631495cfe7e078567f86b8469"
509
506
  dependencies = [
510
507
  "deranged",
511
- "itoa",
512
508
  "num-conv",
513
509
  "powerfmt",
514
510
  "serde_core",
@@ -518,15 +514,15 @@ dependencies = [
518
514
 
519
515
  [[package]]
520
516
  name = "time-core"
521
- version = "0.1.8"
517
+ version = "0.1.9"
522
518
  source = "registry+https://github.com/rust-lang/crates.io-index"
523
- checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
519
+ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
524
520
 
525
521
  [[package]]
526
522
  name = "time-macros"
527
- version = "0.2.27"
523
+ version = "0.2.29"
528
524
  source = "registry+https://github.com/rust-lang/crates.io-index"
529
- checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
525
+ checksum = "71c652a3727a9cbb9a02f707f530b618ce00d0ccd762009c8c23bd191df3c17d"
530
526
  dependencies = [
531
527
  "num-conv",
532
528
  "time-core",
@@ -6,7 +6,7 @@ description = "Convert nightly rustdoc JSON into a stable RustdocSpec snapshot.
6
6
  license = "AGPL-3.0-only"
7
7
  repository = "https://github.com/sourcey/sourcey"
8
8
  homepage = "https://sourcey.com"
9
- documentation = "https://sourcey.com/docs/adapters/rustdoc"
9
+ documentation = "https://sourcey.com/docs/rustdoc-integration"
10
10
  readme = "README.md"
11
11
  keywords = ["rustdoc", "documentation", "json", "rust-api"]
12
12
  categories = ["development-tools", "command-line-utilities"]
@@ -16,7 +16,7 @@ this crate directly. It is published for:
16
16
  - CI tools that drive snapshot generation from Rust
17
17
 
18
18
  If you just want sourcey for your project, see
19
- [sourcey.com/docs/adapters/rustdoc](https://sourcey.com/docs/adapters/rustdoc).
19
+ [sourcey.com/docs/rustdoc-integration](https://sourcey.com/docs/rustdoc-integration).
20
20
 
21
21
  ## CLI
22
22
 
@@ -218,6 +218,7 @@ h1[id], h2[id], h3[id], h4[id], h5[id], h6[id] {
218
218
  /* ── Nav Links ────────────────────────────────────────────────────── */
219
219
 
220
220
  #sourcey .nav-group-label {
221
+ display: block;
221
222
  padding: 0 0.75rem 0.25rem 1rem;
222
223
  margin-bottom: 0.625rem;
223
224
  font-size: inherit;
@@ -227,6 +228,24 @@ h1[id], h2[id], h3[id], h4[id], h5[id], h6[id] {
227
228
  .dark #sourcey .nav-group-label {
228
229
  color: rgb(var(--color-gray-200));
229
230
  }
231
+ #sourcey .nav-group-link {
232
+ cursor: pointer;
233
+ border-radius: 0.75rem;
234
+ text-decoration: none;
235
+ transition: color 0.15s, background-color 0.15s;
236
+ }
237
+ #sourcey .nav-group-link:hover {
238
+ color: rgb(var(--color-primary-ink));
239
+ }
240
+ .dark #sourcey .nav-group-link:hover {
241
+ color: rgb(var(--color-primary-light));
242
+ }
243
+ #sourcey .nav-group-link.active {
244
+ color: rgb(var(--color-primary-ink));
245
+ }
246
+ .dark #sourcey .nav-group-link.active {
247
+ color: rgb(var(--color-primary-light));
248
+ }
230
249
 
231
250
  #sourcey .nav-tab-label {
232
251
  display: block;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sourcey",
3
- "version": "3.6.3",
3
+ "version": "3.6.4",
4
4
  "description": "Precision documentation from OpenAPI, MCP, Doxygen, godoc, rustdoc, and Markdown. Static HTML you own.",
5
5
  "type": "module",
6
6
  "engines": {