sourcey 2.0.2

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.
Files changed (191) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +254 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +197 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client/copy.js +21 -0
  8. package/dist/client/index.d.ts +7 -0
  9. package/dist/client/index.d.ts.map +1 -0
  10. package/dist/client/index.js +8 -0
  11. package/dist/client/index.js.map +1 -0
  12. package/dist/client/scroll-tracker.js +88 -0
  13. package/dist/client/search.js +164 -0
  14. package/dist/client/sidebar.js +54 -0
  15. package/dist/client/tabs.js +51 -0
  16. package/dist/client/theme-toggle.js +36 -0
  17. package/dist/components/App.d.ts +15 -0
  18. package/dist/components/App.d.ts.map +1 -0
  19. package/dist/components/App.js +13 -0
  20. package/dist/components/App.js.map +1 -0
  21. package/dist/components/layout/Head.d.ts +2 -0
  22. package/dist/components/layout/Head.d.ts.map +1 -0
  23. package/dist/components/layout/Head.js +29 -0
  24. package/dist/components/layout/Head.js.map +1 -0
  25. package/dist/components/layout/Header.d.ts +13 -0
  26. package/dist/components/layout/Header.d.ts.map +1 -0
  27. package/dist/components/layout/Header.js +38 -0
  28. package/dist/components/layout/Header.js.map +1 -0
  29. package/dist/components/layout/Page.d.ts +2 -0
  30. package/dist/components/layout/Page.d.ts.map +1 -0
  31. package/dist/components/layout/Page.js +29 -0
  32. package/dist/components/layout/Page.js.map +1 -0
  33. package/dist/components/layout/Sidebar.d.ts +9 -0
  34. package/dist/components/layout/Sidebar.d.ts.map +1 -0
  35. package/dist/components/layout/Sidebar.js +41 -0
  36. package/dist/components/layout/Sidebar.js.map +1 -0
  37. package/dist/components/layout/TableOfContents.d.ts +10 -0
  38. package/dist/components/layout/TableOfContents.d.ts.map +1 -0
  39. package/dist/components/layout/TableOfContents.js +12 -0
  40. package/dist/components/layout/TableOfContents.js.map +1 -0
  41. package/dist/components/openapi/CodeSamples.d.ts +11 -0
  42. package/dist/components/openapi/CodeSamples.d.ts.map +1 -0
  43. package/dist/components/openapi/CodeSamples.js +16 -0
  44. package/dist/components/openapi/CodeSamples.js.map +1 -0
  45. package/dist/components/openapi/Definition.d.ts +11 -0
  46. package/dist/components/openapi/Definition.d.ts.map +1 -0
  47. package/dist/components/openapi/Definition.js +12 -0
  48. package/dist/components/openapi/Definition.js.map +1 -0
  49. package/dist/components/openapi/EndpointBar.d.ts +12 -0
  50. package/dist/components/openapi/EndpointBar.d.ts.map +1 -0
  51. package/dist/components/openapi/EndpointBar.js +22 -0
  52. package/dist/components/openapi/EndpointBar.js.map +1 -0
  53. package/dist/components/openapi/Introduction.d.ts +6 -0
  54. package/dist/components/openapi/Introduction.d.ts.map +1 -0
  55. package/dist/components/openapi/Introduction.js +14 -0
  56. package/dist/components/openapi/Introduction.js.map +1 -0
  57. package/dist/components/openapi/Operation.d.ts +13 -0
  58. package/dist/components/openapi/Operation.d.ts.map +1 -0
  59. package/dist/components/openapi/Operation.js +23 -0
  60. package/dist/components/openapi/Operation.js.map +1 -0
  61. package/dist/components/openapi/Parameters.d.ts +7 -0
  62. package/dist/components/openapi/Parameters.d.ts.map +1 -0
  63. package/dist/components/openapi/Parameters.js +10 -0
  64. package/dist/components/openapi/Parameters.js.map +1 -0
  65. package/dist/components/openapi/RequestBody.d.ts +17 -0
  66. package/dist/components/openapi/RequestBody.d.ts.map +1 -0
  67. package/dist/components/openapi/RequestBody.js +27 -0
  68. package/dist/components/openapi/RequestBody.js.map +1 -0
  69. package/dist/components/openapi/Responses.d.ts +14 -0
  70. package/dist/components/openapi/Responses.d.ts.map +1 -0
  71. package/dist/components/openapi/Responses.js +60 -0
  72. package/dist/components/openapi/Responses.js.map +1 -0
  73. package/dist/components/openapi/Security.d.ts +14 -0
  74. package/dist/components/openapi/Security.d.ts.map +1 -0
  75. package/dist/components/openapi/Security.js +32 -0
  76. package/dist/components/openapi/Security.js.map +1 -0
  77. package/dist/components/openapi/Tags.d.ts +8 -0
  78. package/dist/components/openapi/Tags.d.ts.map +1 -0
  79. package/dist/components/openapi/Tags.js +10 -0
  80. package/dist/components/openapi/Tags.js.map +1 -0
  81. package/dist/components/schema/ExampleView.d.ts +11 -0
  82. package/dist/components/schema/ExampleView.d.ts.map +1 -0
  83. package/dist/components/schema/ExampleView.js +15 -0
  84. package/dist/components/schema/ExampleView.js.map +1 -0
  85. package/dist/components/schema/SchemaDatatype.d.ts +11 -0
  86. package/dist/components/schema/SchemaDatatype.d.ts.map +1 -0
  87. package/dist/components/schema/SchemaDatatype.js +36 -0
  88. package/dist/components/schema/SchemaDatatype.js.map +1 -0
  89. package/dist/components/schema/SchemaView.d.ts +14 -0
  90. package/dist/components/schema/SchemaView.d.ts.map +1 -0
  91. package/dist/components/schema/SchemaView.js +44 -0
  92. package/dist/components/schema/SchemaView.js.map +1 -0
  93. package/dist/components/ui/Badge.d.ts +11 -0
  94. package/dist/components/ui/Badge.d.ts.map +1 -0
  95. package/dist/components/ui/Badge.js +14 -0
  96. package/dist/components/ui/Badge.js.map +1 -0
  97. package/dist/components/ui/Markdown.d.ts +8 -0
  98. package/dist/components/ui/Markdown.d.ts.map +1 -0
  99. package/dist/components/ui/Markdown.js +13 -0
  100. package/dist/components/ui/Markdown.js.map +1 -0
  101. package/dist/components/ui/SectionLabel.d.ts +10 -0
  102. package/dist/components/ui/SectionLabel.d.ts.map +1 -0
  103. package/dist/components/ui/SectionLabel.js +9 -0
  104. package/dist/components/ui/SectionLabel.js.map +1 -0
  105. package/dist/config.d.ts +46 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +102 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/core/converter.d.ts +9 -0
  110. package/dist/core/converter.d.ts.map +1 -0
  111. package/dist/core/converter.js +29 -0
  112. package/dist/core/converter.js.map +1 -0
  113. package/dist/core/loader.d.ts +7 -0
  114. package/dist/core/loader.d.ts.map +1 -0
  115. package/dist/core/loader.js +92 -0
  116. package/dist/core/loader.js.map +1 -0
  117. package/dist/core/markdown-loader.d.ts +29 -0
  118. package/dist/core/markdown-loader.d.ts.map +1 -0
  119. package/dist/core/markdown-loader.js +65 -0
  120. package/dist/core/markdown-loader.js.map +1 -0
  121. package/dist/core/navigation.d.ts +51 -0
  122. package/dist/core/navigation.d.ts.map +1 -0
  123. package/dist/core/navigation.js +108 -0
  124. package/dist/core/navigation.js.map +1 -0
  125. package/dist/core/normalizer.d.ts +7 -0
  126. package/dist/core/normalizer.d.ts.map +1 -0
  127. package/dist/core/normalizer.js +472 -0
  128. package/dist/core/normalizer.js.map +1 -0
  129. package/dist/core/parser.d.ts +10 -0
  130. package/dist/core/parser.d.ts.map +1 -0
  131. package/dist/core/parser.js +34 -0
  132. package/dist/core/parser.js.map +1 -0
  133. package/dist/core/search-indexer.d.ts +25 -0
  134. package/dist/core/search-indexer.d.ts.map +1 -0
  135. package/dist/core/search-indexer.js +72 -0
  136. package/dist/core/search-indexer.js.map +1 -0
  137. package/dist/core/types.d.ts +236 -0
  138. package/dist/core/types.d.ts.map +1 -0
  139. package/dist/core/types.js +7 -0
  140. package/dist/core/types.js.map +1 -0
  141. package/dist/dev-server.d.ts +17 -0
  142. package/dist/dev-server.d.ts.map +1 -0
  143. package/dist/dev-server.js +202 -0
  144. package/dist/dev-server.js.map +1 -0
  145. package/dist/index.d.ts +62 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +166 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/renderer/context.d.ts +46 -0
  150. package/dist/renderer/context.d.ts.map +1 -0
  151. package/dist/renderer/context.js +22 -0
  152. package/dist/renderer/context.js.map +1 -0
  153. package/dist/renderer/html-builder.d.ts +37 -0
  154. package/dist/renderer/html-builder.d.ts.map +1 -0
  155. package/dist/renderer/html-builder.js +87 -0
  156. package/dist/renderer/html-builder.js.map +1 -0
  157. package/dist/renderer/static-renderer.d.ts +10 -0
  158. package/dist/renderer/static-renderer.d.ts.map +1 -0
  159. package/dist/renderer/static-renderer.js +17 -0
  160. package/dist/renderer/static-renderer.js.map +1 -0
  161. package/dist/themes/default/main.css +61 -0
  162. package/dist/themes/default/sourcey.css +425 -0
  163. package/dist/utils/code-samples.d.ts +8 -0
  164. package/dist/utils/code-samples.d.ts.map +1 -0
  165. package/dist/utils/code-samples.js +84 -0
  166. package/dist/utils/code-samples.js.map +1 -0
  167. package/dist/utils/example-generator.d.ts +12 -0
  168. package/dist/utils/example-generator.d.ts.map +1 -0
  169. package/dist/utils/example-generator.js +123 -0
  170. package/dist/utils/example-generator.js.map +1 -0
  171. package/dist/utils/highlighter.d.ts +10 -0
  172. package/dist/utils/highlighter.d.ts.map +1 -0
  173. package/dist/utils/highlighter.js +51 -0
  174. package/dist/utils/highlighter.js.map +1 -0
  175. package/dist/utils/html-id.d.ts +6 -0
  176. package/dist/utils/html-id.d.ts.map +1 -0
  177. package/dist/utils/html-id.js +11 -0
  178. package/dist/utils/html-id.js.map +1 -0
  179. package/dist/utils/http.d.ts +14 -0
  180. package/dist/utils/http.d.ts.map +1 -0
  181. package/dist/utils/http.js +97 -0
  182. package/dist/utils/http.js.map +1 -0
  183. package/dist/utils/markdown.d.ts +9 -0
  184. package/dist/utils/markdown.d.ts.map +1 -0
  185. package/dist/utils/markdown.js +18 -0
  186. package/dist/utils/markdown.js.map +1 -0
  187. package/dist/vite-plugin.d.ts +16 -0
  188. package/dist/vite-plugin.d.ts.map +1 -0
  189. package/dist/vite-plugin.js +92 -0
  190. package/dist/vite-plugin.js.map +1 -0
  191. package/package.json +78 -0
@@ -0,0 +1,87 @@
1
+ import { mkdir, writeFile, readFile } from "node:fs/promises";
2
+ import { resolve, dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { build as viteBuild } from "vite";
5
+ import { renderPage } from "./static-renderer.js";
6
+ import { withActivePage } from "../core/navigation.js";
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ /**
9
+ * Build a documentation site.
10
+ * Renders each page as a standalone HTML file with shared navigation,
11
+ * plus shared CSS, JS, and search index.
12
+ */
13
+ export async function buildSite(pages, navigation, outputDir, options) {
14
+ const resolvedDir = resolve(outputDir);
15
+ await mkdir(resolvedDir, { recursive: true });
16
+ // Render each page
17
+ for (const page of pages) {
18
+ const pageDir = dirname(resolve(resolvedDir, page.outputPath));
19
+ await mkdir(pageDir, { recursive: true });
20
+ // Calculate asset base from page depth
21
+ const depth = page.outputPath.split("/").length - 1;
22
+ const assetBase = depth > 0 ? "../".repeat(depth) : "";
23
+ const renderOptions = {
24
+ embeddable: options?.embeddable ?? false,
25
+ singleFile: false,
26
+ assetBase,
27
+ };
28
+ const activeNav = withActivePage(navigation, page.tabSlug, page.pageSlug);
29
+ const html = renderPage(page.spec, renderOptions, activeNav, page.currentPage);
30
+ await writeFile(resolve(resolvedDir, page.outputPath), html, "utf-8");
31
+ }
32
+ // Write redirect index.html → first page
33
+ if (pages.length > 0) {
34
+ const firstPage = pages[0].outputPath;
35
+ const redirectHtml = `<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=${firstPage}"><title>Redirecting…</title></head><body><a href="${firstPage}">Redirecting…</a></body></html>`;
36
+ await writeFile(resolve(resolvedDir, "index.html"), redirectHtml, "utf-8");
37
+ }
38
+ // Write shared assets
39
+ await writeThemeCSS(resolvedDir, options?.themeOverrides);
40
+ await bundleClientJS(resolvedDir);
41
+ // Write search index if provided
42
+ if (options?.searchIndex) {
43
+ await writeFile(resolve(resolvedDir, "search-index.json"), options.searchIndex, "utf-8");
44
+ }
45
+ return { htmlPath: resolve(resolvedDir, "index.html"), outputDir: resolvedDir };
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Shared helpers
49
+ // ---------------------------------------------------------------------------
50
+ async function writeThemeCSS(outputDir, themeOverrides) {
51
+ const cssPath = resolve(__dirname, "../themes/default/sourcey.css");
52
+ let css = await readFile(cssPath, "utf-8");
53
+ if (themeOverrides && Object.keys(themeOverrides).length > 0) {
54
+ const overrides = Object.entries(themeOverrides)
55
+ .map(([prop, value]) => ` ${prop}: ${value};`)
56
+ .join("\n");
57
+ css += `\n/* Theme overrides */\n:root {\n${overrides}\n}\n`;
58
+ }
59
+ await writeFile(resolve(outputDir, "sourcey.css"), css, "utf-8");
60
+ }
61
+ /**
62
+ * Bundle client-side JavaScript using Vite.
63
+ */
64
+ async function bundleClientJS(outputDir) {
65
+ const clientEntry = resolve(__dirname, "../client/index.js");
66
+ await viteBuild({
67
+ root: process.cwd(),
68
+ logLevel: "silent",
69
+ build: {
70
+ outDir: outputDir,
71
+ emptyOutDir: false,
72
+ lib: {
73
+ entry: clientEntry,
74
+ formats: ["iife"],
75
+ name: "Sourcey",
76
+ fileName: () => "sourcey.js",
77
+ },
78
+ rollupOptions: {
79
+ output: {
80
+ entryFileNames: "sourcey.js",
81
+ },
82
+ },
83
+ minify: true,
84
+ },
85
+ });
86
+ }
87
+ //# sourceMappingURL=html-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-builder.js","sourceRoot":"","sources":["../../src/renderer/html-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { NormalizedSpec } from "../core/types.js";
2
+ import type { SiteNavigation } from "../core/navigation.js";
3
+ import type { RenderOptions, CurrentPage } from "./context.js";
4
+ /**
5
+ * Render a page to a complete HTML string using Preact SSG.
6
+ * All pages (spec or markdown) go through the same layout with full navigation.
7
+ * If options.embeddable is true, returns the inner content without html/body wrapper.
8
+ */
9
+ export declare function renderPage(spec: NormalizedSpec, options: RenderOptions, navigation: SiteNavigation, currentPage: CurrentPage): string;
10
+ //# sourceMappingURL=static-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/static-renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,WAAW,GACvB,MAAM,CASR"}
@@ -0,0 +1,17 @@
1
+ import { h } from "preact";
2
+ import { renderToString } from "preact-render-to-string";
3
+ import { App } from "../components/App.js";
4
+ /**
5
+ * Render a page to a complete HTML string using Preact SSG.
6
+ * All pages (spec or markdown) go through the same layout with full navigation.
7
+ * If options.embeddable is true, returns the inner content without html/body wrapper.
8
+ */
9
+ export function renderPage(spec, options, navigation, currentPage) {
10
+ const vnode = h(App, { spec, options, navigation, currentPage });
11
+ const html = renderToString(vnode);
12
+ if (options.embeddable) {
13
+ return html;
14
+ }
15
+ return `<!DOCTYPE html>\n${html}`;
16
+ }
17
+ //# sourceMappingURL=static-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-renderer.js","sourceRoot":"","sources":["../../src/renderer/static-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAK3C;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,IAAoB,EACpB,OAAsB,EACtB,UAA0B,EAC1B,WAAwB;IAExB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,oBAAoB,IAAI,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,61 @@
1
+ @import "tailwindcss";
2
+ @plugin "@tailwindcss/typography";
3
+
4
+ @source "../../components/**/*.tsx";
5
+
6
+ /* Dark mode via .dark class on <html> */
7
+ @custom-variant dark (&:where(.dark, .dark *));
8
+
9
+ /* ── Design Tokens ──────────────────────────────────────── */
10
+ /* RGB triplets consumed via rgb(var(--color-gray-N)) */
11
+
12
+ @theme {
13
+ /* Layout */
14
+ --sidebar-width: 18rem;
15
+ --header-height: 7rem;
16
+ --toc-width: 19rem;
17
+ --toc-inner-width: 16.5rem;
18
+ --content-padding: 2.5rem;
19
+ --content-max-width: 44rem;
20
+
21
+ /* Primary (indigo) */
22
+ --color-primary: 99 102 241;
23
+ --color-primary-light: 129 140 248;
24
+ --color-primary-dark: 79 70 229;
25
+
26
+ /* Backgrounds */
27
+ --color-background-light: 255 255 255;
28
+ --color-background-dark: 11 12 16;
29
+ --color-code-block-light: 255 255 255;
30
+ --color-code-block-dark: 11 12 14;
31
+
32
+ /* Semantic */
33
+ --color-success: 34 197 94;
34
+ --color-overlay: 0 0 0;
35
+ --color-border-dark-subtle: 255 255 255;
36
+ --color-surface-dark-tint: 255 255 255;
37
+
38
+ /* Gray scale */
39
+ --color-gray-50: 245 245 250;
40
+ --color-gray-100: 241 241 245;
41
+ --color-gray-200: 225 225 229;
42
+ --color-gray-300: 209 209 213;
43
+ --color-gray-400: 161 161 165;
44
+ --color-gray-500: 115 115 119;
45
+ --color-gray-600: 83 83 87;
46
+ --color-gray-700: 65 65 69;
47
+ --color-gray-800: 40 40 44;
48
+ --color-gray-900: 25 25 30;
49
+ --color-gray-950: 13 13 17;
50
+
51
+ /* Method colors */
52
+ --method-get: #16a34a;
53
+ --method-post: #2563eb;
54
+ --method-put: #d97706;
55
+ --method-delete: #dc2626;
56
+ --method-patch: #9333ea;
57
+
58
+ /* Typography */
59
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
60
+ --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Cascadia Code', Consolas, monospace;
61
+ }
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Sourcey — Minimal component styles.
3
+ *
4
+ * Layout and OpenAPI components use Tailwind classes directly.
5
+ * This file only contains what can't be expressed as utilities:
6
+ * focus rings, search dialog, Shiki theming, code tab state,
7
+ * parameter/schema display, selection.
8
+ */
9
+
10
+ /* ── Focus ─────────────────────────────────────────────────────────── */
11
+
12
+ #sourcey button:focus-visible {
13
+ outline: 2px solid rgb(var(--color-primary));
14
+ outline-offset: 2px;
15
+ }
16
+
17
+ /* ── Shiki Dual-Theme ─────────────────────────────────────────────── */
18
+
19
+ .dark .shiki,
20
+ .dark .shiki span {
21
+ color: var(--shiki-dark) !important;
22
+ background-color: transparent !important;
23
+ }
24
+
25
+ .shiki pre {
26
+ background-color: transparent !important;
27
+ margin: 0;
28
+ }
29
+
30
+ .shiki code {
31
+ font-family: inherit;
32
+ background: transparent;
33
+ border: none;
34
+ padding: 0;
35
+ }
36
+
37
+ /* ── Sidebar Nav Links (state managed by scroll-tracker + SSR) ────── */
38
+
39
+ #sourcey #nav .nav-link {
40
+ display: flex;
41
+ align-items: flex-start;
42
+ padding: 0.375rem 0.75rem 0.375rem 1rem;
43
+ gap: 0.75rem;
44
+ cursor: pointer;
45
+ text-align: left;
46
+ overflow-wrap: break-word;
47
+ hyphens: auto;
48
+ border-radius: 0.75rem;
49
+ width: 100%;
50
+ color: rgb(var(--color-gray-700));
51
+ transition: color 0.15s, background-color 0.15s;
52
+ }
53
+ .dark #sourcey #nav .nav-link {
54
+ color: rgb(var(--color-gray-400));
55
+ }
56
+
57
+ #sourcey #nav .nav-link:hover {
58
+ background: rgb(var(--color-gray-600) / 0.05);
59
+ color: rgb(var(--color-gray-900));
60
+ }
61
+ .dark #sourcey #nav .nav-link:hover {
62
+ background: rgb(var(--color-gray-200) / 0.05);
63
+ color: rgb(var(--color-gray-300));
64
+ }
65
+
66
+ #sourcey #nav .nav-link.active {
67
+ background: rgb(var(--color-primary) / 0.1);
68
+ color: rgb(var(--color-primary));
69
+ }
70
+ .dark #sourcey #nav .nav-link.active {
71
+ background: rgb(var(--color-primary-light) / 0.1);
72
+ color: rgb(var(--color-primary-light));
73
+ }
74
+
75
+ /* ── Code Sample Tabs (state managed by client JS) ────────────────── */
76
+
77
+ #sourcey .code-samples-panel { display: none; }
78
+ #sourcey .code-samples-panel.active { display: block; }
79
+
80
+ #sourcey .code-samples-tab {
81
+ position: relative;
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 0.375rem;
85
+ white-space: nowrap;
86
+ font-weight: 500;
87
+ outline: 0;
88
+ margin-top: 0.25rem;
89
+ margin-bottom: 0.375rem;
90
+ color: rgb(var(--color-gray-500));
91
+ transition: color 0.15s;
92
+ }
93
+ .dark #sourcey .code-samples-tab {
94
+ color: rgb(var(--color-gray-400));
95
+ }
96
+
97
+ #sourcey .code-samples-tab.active {
98
+ color: rgb(var(--color-primary));
99
+ }
100
+ .dark #sourcey .code-samples-tab.active {
101
+ color: rgb(var(--color-primary-light));
102
+ }
103
+
104
+ /* Active tab underline indicator */
105
+ #sourcey .code-samples-tab.active::after {
106
+ content: '';
107
+ position: absolute;
108
+ right: 0;
109
+ bottom: -0.375rem;
110
+ left: 0;
111
+ height: 2px;
112
+ border-radius: 9999px;
113
+ background: rgb(var(--color-primary));
114
+ }
115
+ .dark #sourcey .code-samples-tab.active::after {
116
+ background: rgb(var(--color-primary-light));
117
+ }
118
+
119
+ /* ── Copy Button Feedback ─────────────────────────────────────────── */
120
+
121
+ #sourcey .copy-btn.copied {
122
+ color: rgb(var(--color-success));
123
+ }
124
+
125
+ /* ── Schema Utilities (used by SchemaView.tsx) ─────────────────────── */
126
+
127
+ #sourcey .schema-nested {
128
+ padding-left: 1rem;
129
+ border-left: 2px solid rgb(var(--color-gray-200));
130
+ margin-top: 0.25rem;
131
+ margin-bottom: 0.25rem;
132
+ }
133
+ .dark #sourcey .schema-nested {
134
+ border-left-color: rgb(var(--color-gray-800));
135
+ }
136
+
137
+ #sourcey .schema-variant-option {
138
+ padding-left: 1rem;
139
+ border-left: 2px solid rgb(var(--color-gray-200));
140
+ margin-bottom: 0.5rem;
141
+ }
142
+ .dark #sourcey .schema-variant-option {
143
+ border-left-color: rgb(var(--color-gray-800));
144
+ }
145
+
146
+ #sourcey .schema-variant-label {
147
+ font-size: 0.75rem;
148
+ font-weight: 600;
149
+ letter-spacing: 0.05em;
150
+ color: rgb(var(--color-gray-400));
151
+ margin-bottom: 0.25rem;
152
+ }
153
+
154
+ /* ── Type Display (used by SchemaDatatype.tsx) ─────────────────────── */
155
+
156
+ #sourcey .json-property-type {
157
+ font-style: normal;
158
+ font-weight: 400;
159
+ color: rgb(var(--color-gray-500));
160
+ }
161
+
162
+ #sourcey .json-property-format {
163
+ font-size: 0.8125rem;
164
+ color: rgb(var(--color-gray-400));
165
+ }
166
+
167
+ #sourcey .json-property-enum {
168
+ display: inline-flex;
169
+ align-items: baseline;
170
+ gap: 0.25rem;
171
+ flex-wrap: wrap;
172
+ }
173
+
174
+ #sourcey .json-property-enum-item,
175
+ #sourcey .json-property-default-value,
176
+ #sourcey .json-property-range {
177
+ display: inline-flex;
178
+ align-items: center;
179
+ font-size: 0.6875rem;
180
+ font-family: var(--font-mono);
181
+ line-height: 1;
182
+ white-space: nowrap;
183
+ color: rgb(var(--color-gray-500));
184
+ background: rgb(var(--color-gray-100) / 0.5);
185
+ padding: 0.125rem 0.375rem;
186
+ border-radius: 9999px;
187
+ }
188
+ .dark #sourcey .json-property-enum-item,
189
+ .dark #sourcey .json-property-default-value,
190
+ .dark #sourcey .json-property-range {
191
+ background: rgb(var(--color-surface-dark-tint) / 0.05);
192
+ color: rgb(var(--color-gray-400));
193
+ }
194
+
195
+ #sourcey .json-property-enum-item { color: rgb(var(--color-gray-700)); }
196
+ .dark #sourcey .json-property-enum-item { color: rgb(var(--color-gray-300)); }
197
+
198
+ #sourcey .json-property-default-value::before {
199
+ content: '= ';
200
+ color: rgb(var(--color-gray-400));
201
+ }
202
+
203
+ /* ── Parameter/Schema List (used by SchemaView.tsx, Parameters.tsx) ── */
204
+
205
+ #sourcey .params-list {
206
+ border-top: 1px solid rgb(var(--color-gray-200));
207
+ }
208
+ .dark #sourcey .params-list {
209
+ border-top-color: rgb(var(--color-gray-800));
210
+ }
211
+
212
+ #sourcey .param-item {
213
+ padding: 1.25rem 0;
214
+ border-bottom: 1px solid rgb(var(--color-gray-100));
215
+ }
216
+ .dark #sourcey .param-item {
217
+ border-bottom-color: rgb(var(--color-gray-800));
218
+ }
219
+
220
+ #sourcey .param-item:last-child {
221
+ border-bottom: none;
222
+ }
223
+
224
+ #sourcey .param-header {
225
+ display: flex;
226
+ align-items: baseline;
227
+ gap: 0.5rem;
228
+ flex-wrap: wrap;
229
+ }
230
+
231
+ #sourcey .param-name {
232
+ font-family: var(--font-mono);
233
+ font-size: 0.875rem;
234
+ font-weight: 600;
235
+ color: rgb(var(--color-primary));
236
+ background: transparent;
237
+ border: none;
238
+ padding: 0;
239
+ }
240
+ .dark #sourcey .param-name {
241
+ color: rgb(var(--color-primary-light));
242
+ }
243
+
244
+ #sourcey .param-type {
245
+ display: inline-flex;
246
+ align-items: baseline;
247
+ gap: 0.375rem;
248
+ font-size: 0.8125rem;
249
+ color: rgb(var(--color-gray-500));
250
+ }
251
+
252
+ #sourcey .param-in {
253
+ display: inline-flex;
254
+ align-items: center;
255
+ padding: 0.125rem 0.5rem;
256
+ font-size: 0.75rem;
257
+ font-weight: 500;
258
+ border-radius: 0.375rem;
259
+ background: rgb(var(--color-gray-100) / 0.5);
260
+ color: rgb(var(--color-gray-600));
261
+ margin-left: auto;
262
+ }
263
+ .dark #sourcey .param-in {
264
+ background: rgb(var(--color-surface-dark-tint) / 0.05);
265
+ color: rgb(var(--color-gray-200));
266
+ }
267
+
268
+ #sourcey .param-description {
269
+ padding-top: 0.5rem;
270
+ font-size: 0.875rem;
271
+ color: rgb(var(--color-gray-700));
272
+ }
273
+ .dark #sourcey .param-description {
274
+ color: rgb(var(--color-gray-400));
275
+ }
276
+
277
+ #sourcey .param-description p {
278
+ margin-bottom: 0.25rem;
279
+ }
280
+
281
+ /* ── Selection ─────────────────────────────────────────────────────── */
282
+
283
+ #sourcey ::selection { background: rgb(var(--color-primary) / 0.12); }
284
+
285
+ /* ── Search Dialog ────────────────────────────────────────────────── */
286
+
287
+ #sourcey #search-dialog {
288
+ display: none;
289
+ position: fixed;
290
+ inset: 0;
291
+ z-index: 500;
292
+ background: rgb(var(--color-overlay) / 0.4);
293
+ backdrop-filter: blur(4px);
294
+ -webkit-backdrop-filter: blur(4px);
295
+ align-items: flex-start;
296
+ justify-content: center;
297
+ padding-top: 15vh;
298
+ }
299
+
300
+ #sourcey #search-dialog.open {
301
+ display: flex;
302
+ }
303
+
304
+ #sourcey .search-dialog-inner {
305
+ width: 100%;
306
+ max-width: 540px;
307
+ background: rgb(var(--color-background-light));
308
+ border-radius: 0.75rem;
309
+ box-shadow: 0 16px 48px rgb(var(--color-overlay) / 0.2);
310
+ overflow: hidden;
311
+ margin: 0 1rem;
312
+ }
313
+ .dark #sourcey .search-dialog-inner {
314
+ background: rgb(var(--color-gray-900));
315
+ box-shadow: 0 16px 48px rgb(var(--color-overlay) / 0.5);
316
+ }
317
+
318
+ #sourcey #search-input {
319
+ width: 100%;
320
+ padding: 0.75rem 1rem;
321
+ border: none;
322
+ border-bottom: 1px solid rgb(var(--color-gray-200));
323
+ font-family: var(--font-sans);
324
+ font-size: 1rem;
325
+ color: rgb(var(--color-gray-900));
326
+ background: transparent;
327
+ outline: none;
328
+ }
329
+ .dark #sourcey #search-input {
330
+ color: rgb(var(--color-gray-100));
331
+ border-bottom-color: rgb(var(--color-gray-800));
332
+ }
333
+
334
+ #sourcey #search-input::placeholder { color: rgb(var(--color-gray-400)); }
335
+
336
+ #sourcey #search-results {
337
+ max-height: 50vh;
338
+ overflow-y: auto;
339
+ padding: 0.25rem;
340
+ }
341
+
342
+ #sourcey .search-result {
343
+ display: flex;
344
+ align-items: baseline;
345
+ gap: 0.5rem;
346
+ padding: 0.5rem 0.75rem;
347
+ text-decoration: none;
348
+ color: rgb(var(--color-gray-700));
349
+ border-radius: 0.375rem;
350
+ cursor: pointer;
351
+ transition: background 0.1s;
352
+ }
353
+ .dark #sourcey .search-result {
354
+ color: rgb(var(--color-gray-400));
355
+ }
356
+
357
+ #sourcey .search-result:hover,
358
+ #sourcey .search-result.active {
359
+ background: rgb(var(--color-primary) / 0.06);
360
+ color: rgb(var(--color-gray-900));
361
+ }
362
+ .dark #sourcey .search-result:hover,
363
+ .dark #sourcey .search-result.active {
364
+ background: rgb(var(--color-primary-light) / 0.08);
365
+ color: rgb(var(--color-gray-200));
366
+ }
367
+
368
+ #sourcey .search-result-main {
369
+ display: flex;
370
+ align-items: baseline;
371
+ gap: 0.375rem;
372
+ flex: 1;
373
+ min-width: 0;
374
+ }
375
+
376
+ #sourcey .search-result-method {
377
+ display: inline-flex;
378
+ align-items: center;
379
+ padding: 0.125rem 0.375rem;
380
+ font-size: 0.625rem;
381
+ font-weight: 700;
382
+ line-height: 1;
383
+ letter-spacing: 0.04em;
384
+ text-transform: uppercase;
385
+ white-space: nowrap;
386
+ border: 1px solid transparent;
387
+ border-radius: 3px;
388
+ color: rgb(var(--color-background-light));
389
+ flex-shrink: 0;
390
+ }
391
+
392
+ #sourcey .search-result-method.method-get { background: var(--method-get); }
393
+ #sourcey .search-result-method.method-post { background: var(--method-post); }
394
+ #sourcey .search-result-method.method-put { background: var(--method-put); }
395
+ #sourcey .search-result-method.method-delete { background: var(--method-delete); }
396
+ #sourcey .search-result-method.method-patch { background: var(--method-patch); }
397
+
398
+ #sourcey .search-result-path {
399
+ font-family: var(--font-mono);
400
+ font-size: 0.8125rem;
401
+ white-space: nowrap;
402
+ overflow: hidden;
403
+ text-overflow: ellipsis;
404
+ }
405
+
406
+ #sourcey .search-result-summary {
407
+ font-size: 0.8125rem;
408
+ color: rgb(var(--color-gray-500));
409
+ white-space: nowrap;
410
+ overflow: hidden;
411
+ text-overflow: ellipsis;
412
+ }
413
+
414
+ #sourcey .search-result-tag {
415
+ font-size: 0.6875rem;
416
+ color: rgb(var(--color-gray-400));
417
+ white-space: nowrap;
418
+ flex-shrink: 0;
419
+ }
420
+
421
+ #sourcey .search-loading {
422
+ padding: 1rem;
423
+ color: rgb(var(--color-gray-500));
424
+ font-size: 0.8125rem;
425
+ }
@@ -0,0 +1,8 @@
1
+ import type { NormalizedOperation } from "../core/types.js";
2
+ import type { CodeSample } from "../core/types.js";
3
+ /**
4
+ * Auto-generate code samples (curl, JavaScript fetch, Python requests)
5
+ * from an operation's spec when no custom x-code-samples are provided.
6
+ */
7
+ export declare function generateCodeSamples(op: NormalizedOperation, serverUrl: string): CodeSample[];
8
+ //# sourceMappingURL=code-samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-samples.d.ts","sourceRoot":"","sources":["../../src/utils/code-samples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,mBAAmB,EACvB,SAAS,EAAE,MAAM,GAChB,UAAU,EAAE,CAkBd"}