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,164 @@
1
+ // Search — client-side search dialog with keyboard navigation
2
+ (function () {
3
+ var dialog = document.getElementById('search-dialog');
4
+ var input = document.getElementById('search-input');
5
+ var results = document.getElementById('search-results');
6
+ var openBtn = document.getElementById('search-open');
7
+ if (!dialog || !input || !results) return;
8
+
9
+ var entries = [];
10
+ var activeIndex = -1;
11
+ var filtered = [];
12
+ var indexLoaded = false;
13
+
14
+ // Always load from JSON search index
15
+ var searchMeta = document.querySelector('meta[name="sourcey-search"]');
16
+
17
+ function loadJsonIndex(callback) {
18
+ if (indexLoaded) { callback(); return; }
19
+ if (!searchMeta) { indexLoaded = true; callback(); return; }
20
+ var url = searchMeta.getAttribute('content');
21
+ fetch(url).then(function (r) { return r.json(); }).then(function (data) {
22
+ entries = data.map(function (e) {
23
+ return {
24
+ url: e.url,
25
+ method: e.method || '',
26
+ path: e.path || '',
27
+ summary: e.title || '',
28
+ tag: e.tab || '',
29
+ content: e.content || '',
30
+ category: e.category || '',
31
+ searchText: [e.method || '', e.path || '', e.title || '', e.content || '', e.tab || ''].join(' ').toLowerCase()
32
+ };
33
+ });
34
+ indexLoaded = true;
35
+ callback();
36
+ }).catch(function () {
37
+ indexLoaded = true;
38
+ callback();
39
+ });
40
+ }
41
+
42
+ function open() {
43
+ dialog.classList.add('open');
44
+ input.value = '';
45
+ input.focus();
46
+ if (!indexLoaded) {
47
+ results.innerHTML = '<div class="search-loading">Loading…</div>';
48
+ loadJsonIndex(function () { showResults(''); });
49
+ } else {
50
+ showResults('');
51
+ }
52
+ document.addEventListener('keydown', onDialogKey);
53
+ }
54
+
55
+ function close() {
56
+ dialog.classList.remove('open');
57
+ document.removeEventListener('keydown', onDialogKey);
58
+ }
59
+
60
+ function showResults(query) {
61
+ var q = query.toLowerCase().trim();
62
+ if (!q) {
63
+ filtered = entries.slice(0, 20);
64
+ } else {
65
+ var terms = q.split(/\s+/);
66
+ filtered = entries.filter(function (e) {
67
+ return terms.every(function (t) { return e.searchText.indexOf(t) !== -1; });
68
+ });
69
+ }
70
+
71
+ activeIndex = filtered.length ? 0 : -1;
72
+ render();
73
+ }
74
+
75
+ function render() {
76
+ results.innerHTML = filtered.map(function (e, i) {
77
+ var cls = 'search-result' + (i === activeIndex ? ' active' : '');
78
+ var label = e.method
79
+ ? '<span class="search-result-method method-' + e.method.toLowerCase() + '">' + e.method + '</span> ' +
80
+ '<span class="search-result-path">' + escapeHtml(e.path) + '</span>'
81
+ : '<span class="search-result-path">' + escapeHtml(e.summary) + '</span>';
82
+ var tagLine = e.tag ? '<span class="search-result-tag">' + escapeHtml(e.tag) + '</span>' : '';
83
+ var summaryLine = e.method && e.summary ? '<span class="search-result-summary">' + escapeHtml(e.summary) + '</span>' : '';
84
+ return '<a href="' + e.url + '" class="' + cls + '" data-index="' + i + '">' +
85
+ '<div class="search-result-main">' + label + summaryLine + '</div>' +
86
+ tagLine + '</a>';
87
+ }).join('');
88
+ }
89
+
90
+ function escapeHtml(s) {
91
+ var el = document.createElement('span');
92
+ el.textContent = s;
93
+ return el.innerHTML;
94
+ }
95
+
96
+ function navigate(index) {
97
+ if (index < 0 || index >= filtered.length) return;
98
+ var entry = filtered[index];
99
+ close();
100
+ window.location.href = entry.url;
101
+ }
102
+
103
+ function onDialogKey(e) {
104
+ if (e.key === 'Escape') { close(); e.preventDefault(); return; }
105
+ if (e.key === 'ArrowDown') {
106
+ e.preventDefault();
107
+ activeIndex = Math.min(activeIndex + 1, filtered.length - 1);
108
+ render();
109
+ return;
110
+ }
111
+ if (e.key === 'ArrowUp') {
112
+ e.preventDefault();
113
+ activeIndex = Math.max(activeIndex - 1, 0);
114
+ render();
115
+ return;
116
+ }
117
+ if (e.key === 'Enter') {
118
+ e.preventDefault();
119
+ if (activeIndex >= 0) navigate(activeIndex);
120
+ return;
121
+ }
122
+ }
123
+
124
+ input.addEventListener('input', function () {
125
+ showResults(input.value);
126
+ });
127
+
128
+ results.addEventListener('click', function (e) {
129
+ var result = e.target.closest('.search-result');
130
+ if (result) {
131
+ e.preventDefault();
132
+ navigate(parseInt(result.getAttribute('data-index'), 10));
133
+ }
134
+ });
135
+
136
+ // Open search
137
+ if (openBtn) openBtn.addEventListener('click', open);
138
+
139
+ // Also bind mobile search button
140
+ var mobileBtn = document.getElementById('search-open-mobile');
141
+ if (mobileBtn) mobileBtn.addEventListener('click', open);
142
+
143
+ // Keyboard shortcut: Ctrl+K or /
144
+ document.addEventListener('keydown', function (e) {
145
+ if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
146
+ e.preventDefault();
147
+ open();
148
+ }
149
+ if (e.key === '/' && !isEditable(e.target)) {
150
+ e.preventDefault();
151
+ open();
152
+ }
153
+ });
154
+
155
+ // Close on backdrop click
156
+ dialog.addEventListener('click', function (e) {
157
+ if (e.target === dialog) close();
158
+ });
159
+
160
+ function isEditable(el) {
161
+ var tag = el.tagName;
162
+ return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el.isContentEditable;
163
+ }
164
+ })();
@@ -0,0 +1,54 @@
1
+ // Mobile sidebar drawer — toggle visibility on small screens.
2
+ //
3
+ // The sidebar is CSS-hidden on mobile (hidden lg:block). This script
4
+ // overrides inline styles to show it as a fullscreen overlay when the
5
+ // hamburger menu is tapped. Escape key and nav link clicks close it.
6
+ (function () {
7
+ var sidebar = document.getElementById('sidebar');
8
+ var openBtns = document.querySelectorAll('[data-drawer-slide]');
9
+ if (!sidebar) return;
10
+
11
+ function open() {
12
+ var isDark = document.documentElement.classList.contains('dark');
13
+ sidebar.style.display = 'block';
14
+ sidebar.style.position = 'fixed';
15
+ sidebar.style.inset = '0';
16
+ sidebar.style.zIndex = '50';
17
+ sidebar.style.background = isDark
18
+ ? 'rgb(var(--color-background-dark))'
19
+ : 'rgb(var(--color-background-light))';
20
+ document.addEventListener('keydown', onKey);
21
+ }
22
+
23
+ function close() {
24
+ sidebar.style.display = '';
25
+ sidebar.style.position = '';
26
+ sidebar.style.inset = '';
27
+ sidebar.style.zIndex = '';
28
+ sidebar.style.background = '';
29
+ document.removeEventListener('keydown', onKey);
30
+ }
31
+
32
+ function isOpen() {
33
+ return sidebar.style.display === 'block';
34
+ }
35
+
36
+ function onKey(e) {
37
+ if (e.key === 'Escape') close();
38
+ }
39
+
40
+ openBtns.forEach(function (btn) {
41
+ btn.addEventListener('click', function () {
42
+ if (isOpen()) {
43
+ close();
44
+ } else {
45
+ open();
46
+ }
47
+ });
48
+ });
49
+
50
+ // Close drawer on nav link click (mobile)
51
+ sidebar.addEventListener('click', function (e) {
52
+ if (e.target.closest('#nav a') && isOpen()) close();
53
+ });
54
+ })();
@@ -0,0 +1,51 @@
1
+ // Code sample tabs — switches active tab and syncs language across groups.
2
+ //
3
+ // Toggles .active on .code-samples-tab and .code-samples-panel elements.
4
+ // All visual styling (color, underline indicator) is in sourcey.css;
5
+ // this file only manages the .active class and aria-selected attribute.
6
+ (function () {
7
+ var selectedLang = null;
8
+
9
+ document.addEventListener('click', function (e) {
10
+ var tab = e.target.closest('.code-samples-tab');
11
+ if (!tab) return;
12
+
13
+ var container = tab.closest('.code-samples');
14
+ var index = tab.getAttribute('data-tab-index');
15
+ var lang = tab.textContent.trim();
16
+
17
+ // Preserve scroll position so panel height changes don't shift the page
18
+ var scrollY = window.scrollY;
19
+
20
+ activateTab(container, index);
21
+
22
+ // Sync: activate same language in all other code-sample groups on the page
23
+ if (lang !== selectedLang) {
24
+ selectedLang = lang;
25
+ document.querySelectorAll('.code-samples').forEach(function (group) {
26
+ if (group === container) return;
27
+ group.querySelectorAll('.code-samples-tab').forEach(function (t) {
28
+ if (t.textContent.trim() === lang) {
29
+ activateTab(group, t.getAttribute('data-tab-index'));
30
+ }
31
+ });
32
+ });
33
+ }
34
+
35
+ window.scrollTo(0, scrollY);
36
+ });
37
+
38
+ function activateTab(container, index) {
39
+ // Update tabs
40
+ container.querySelectorAll('.code-samples-tab').forEach(function (t) {
41
+ var isActive = t.getAttribute('data-tab-index') === index;
42
+ t.classList.toggle('active', isActive);
43
+ t.setAttribute('aria-selected', isActive ? 'true' : 'false');
44
+ });
45
+
46
+ // Update panels
47
+ container.querySelectorAll('.code-samples-panel').forEach(function (p) {
48
+ p.classList.toggle('active', p.getAttribute('data-panel-index') === index);
49
+ });
50
+ }
51
+ })();
@@ -0,0 +1,36 @@
1
+ // Theme toggle — dark/light mode with localStorage persistence
2
+ // Uses .dark class on <html> (standard convention)
3
+ (function () {
4
+ var STORAGE_KEY = 'sourcey-theme';
5
+ var btn = document.getElementById('theme-toggle');
6
+ var root = document.documentElement;
7
+
8
+ function getPreferred() {
9
+ var stored = localStorage.getItem(STORAGE_KEY);
10
+ if (stored === 'dark' || stored === 'light') return stored;
11
+ return 'light';
12
+ }
13
+
14
+ function apply(theme) {
15
+ if (theme === 'dark') {
16
+ root.classList.add('dark');
17
+ } else {
18
+ root.classList.remove('dark');
19
+ }
20
+ root.style.colorScheme = theme;
21
+ if (btn) {
22
+ btn.setAttribute('aria-label', theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode');
23
+ btn.setAttribute('title', theme === 'dark' ? 'Light mode' : 'Dark mode');
24
+ }
25
+ }
26
+
27
+ apply(getPreferred());
28
+
29
+ if (btn) {
30
+ btn.addEventListener('click', function () {
31
+ var next = root.classList.contains('dark') ? 'light' : 'dark';
32
+ localStorage.setItem(STORAGE_KEY, next);
33
+ apply(next);
34
+ });
35
+ }
36
+ })();
@@ -0,0 +1,15 @@
1
+ import type { NormalizedSpec } from "../core/types.js";
2
+ import type { SiteNavigation } from "../core/navigation.js";
3
+ import type { RenderOptions, CurrentPage } from "../renderer/context.js";
4
+ export interface AppProps {
5
+ spec: NormalizedSpec;
6
+ options: RenderOptions;
7
+ navigation: SiteNavigation;
8
+ currentPage: CurrentPage;
9
+ }
10
+ /**
11
+ * Root component. Renders a complete HTML document with modern layout.
12
+ * When embeddable, renders just the page content without html/body wrapper.
13
+ */
14
+ export declare function App({ spec, options, navigation, currentPage }: AppProps): import("preact").JSX.Element;
15
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAIzE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,QAAQ,gCAwBvE"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { SpecContext, OptionsContext, NavigationContext, PageContext, } from "../renderer/context.js";
3
+ import { Head } from "./layout/Head.js";
4
+ import { Page } from "./layout/Page.js";
5
+ /**
6
+ * Root component. Renders a complete HTML document with modern layout.
7
+ * When embeddable, renders just the page content without html/body wrapper.
8
+ */
9
+ export function App({ spec, options, navigation, currentPage }) {
10
+ const content = options.embeddable ? (_jsx(Page, {})) : (_jsxs("html", { lang: "en", children: [_jsx(Head, {}), _jsxs("body", { id: "sourcey", children: [_jsx(Page, {}), _jsx("script", { src: `${options.assetBase}sourcey.js`, defer: true })] })] }));
11
+ return (_jsx(SpecContext.Provider, { value: spec, children: _jsx(OptionsContext.Provider, { value: options, children: _jsx(NavigationContext.Provider, { value: navigation, children: _jsx(PageContext.Provider, { value: currentPage, children: content }) }) }) }));
12
+ }
13
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":";AAEA,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AASxC;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAY;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CACnC,KAAC,IAAI,KAAG,CACT,CAAC,CAAC,CAAC,CACF,gBAAM,IAAI,EAAC,IAAI,aACb,KAAC,IAAI,KAAG,EACR,gBAAM,EAAE,EAAC,SAAS,aAChB,KAAC,IAAI,KAAG,EACR,iBAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,KAAK,SAAG,IAClD,IACF,CACR,CAAC;IAEF,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAC/B,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YACrC,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,UAAU,YAC3C,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,WAAW,YACrC,OAAO,GACa,GACI,GACL,GACL,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function Head(): import("preact").JSX.Element;
2
+ //# sourceMappingURL=Head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Head.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Head.tsx"],"names":[],"mappings":"AAGA,wBAAgB,IAAI,iCA6CnB"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useContext } from "preact/hooks";
3
+ import { SpecContext, OptionsContext, PageContext } from "../../renderer/context.js";
4
+ export function Head() {
5
+ const spec = useContext(SpecContext);
6
+ const options = useContext(OptionsContext);
7
+ const page = useContext(PageContext);
8
+ // Page title: use markdown page title, or spec title
9
+ const siteName = spec.info.title || "";
10
+ const pageTitle = page.kind === "markdown"
11
+ ? (siteName ? `${page.markdown.title} — ${siteName}` : page.markdown.title)
12
+ : `${siteName} — API Reference`;
13
+ const pageDescription = page.kind === "markdown"
14
+ ? page.markdown.description || pageTitle
15
+ : spec.info.description ?? `${siteName} API Documentation`;
16
+ // Blocking style to prevent flash: sets body bg from design tokens
17
+ // before the main stylesheet loads. The tokens are defined here as
18
+ // fallback values matching main.css so there's no hardcoded hex.
19
+ const antiFlashCSS = `
20
+ :root {
21
+ --color-background-light: 255 255 255;
22
+ --color-background-dark: 11 12 16;
23
+ }
24
+ body { margin: 0; background: rgb(var(--color-background-light)); }
25
+ .dark body { background: rgb(var(--color-background-dark)); }
26
+ `;
27
+ return (_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("title", { children: pageTitle }), _jsx("meta", { name: "description", content: pageDescription }), _jsx("meta", { name: "sourcey-search", content: `${options.assetBase}search-index.json` }), _jsx("style", { dangerouslySetInnerHTML: { __html: antiFlashCSS } }), _jsx("script", { dangerouslySetInnerHTML: { __html: `(function(){var t=localStorage.getItem('sourcey-theme');if(t==='dark')document.documentElement.classList.add('dark')})()` } }), _jsx("link", { rel: "preconnect", href: "https://fonts.googleapis.com" }), _jsx("link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossOrigin: "anonymous" }), _jsx("link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" }), _jsx("link", { rel: "stylesheet", href: `${options.assetBase}sourcey.css` }), spec.info.favicon && _jsx("link", { rel: "icon", href: spec.info.favicon })] }));
28
+ }
29
+ //# sourceMappingURL=Head.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Head.js","sourceRoot":"","sources":["../../../src/components/layout/Head.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAErF,MAAM,UAAU,IAAI;IAClB,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAErC,qDAAqD;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU;QACxC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAS,CAAC,KAAK,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAS,CAAC,KAAK,CAAC;QAC7E,CAAC,CAAC,GAAG,QAAQ,kBAAkB,CAAC;IAElC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU;QAC9C,CAAC,CAAC,IAAI,CAAC,QAAS,CAAC,WAAW,IAAI,SAAS;QACzC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,QAAQ,oBAAoB,CAAC;IAE7D,mEAAmE;IACnE,mEAAmE;IACnE,iEAAiE;IACjE,MAAM,YAAY,GAAG;;;;;;;GAOpB,CAAC;IAEF,OAAO,CACL,2BACE,eAAM,OAAO,EAAC,OAAO,GAAG,EACxB,eAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,qCAAqC,GAAG,EACtE,0BAAQ,SAAS,GAAS,EAC1B,eAAM,IAAI,EAAC,aAAa,EAAC,OAAO,EAAE,eAAe,GAAI,EACrD,eAAM,IAAI,EAAC,gBAAgB,EAAC,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,mBAAmB,GAAI,EAEhF,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,GAAI,EAE5D,iBAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,0HAA0H,EAAE,GAAI,EAC3K,eAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAC,8BAA8B,GAAG,EAC7D,eAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAC,2BAA2B,EAAC,WAAW,EAAC,WAAW,GAAG,EAClF,eAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAC,sFAAsF,GAAG,EACrH,eAAM,GAAG,EAAC,YAAY,EAAC,IAAI,EAAE,GAAG,OAAO,CAAC,SAAS,aAAa,GAAI,EACjE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAM,GAAG,EAAC,MAAM,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAI,IAC7D,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Two-row site header two-row layout.
3
+ * Row 1 (h-16): logo, search, theme toggle
4
+ * Row 2 (h-12): navigation tabs
5
+ * Total: 7rem (header-height)
6
+ */
7
+ export declare function Header(): import("preact").JSX.Element;
8
+ /**
9
+ * Mobile header is now integrated into the main Header component.
10
+ * This is kept as a no-op for backward compatibility.
11
+ */
12
+ export declare function MobileHeader(): null;
13
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":"AAsCA;;;;;GAKG;AACH,wBAAgB,MAAM,iCAwHrB;AAED;;;GAGG;AACH,wBAAgB,YAAY,SAE3B"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useContext } from "preact/hooks";
3
+ import { NavigationContext, OptionsContext, SpecContext } from "../../renderer/context.js";
4
+ function SearchIcon() {
5
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", class: "min-w-4 flex-none", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }));
6
+ }
7
+ function SunIcon() {
8
+ return (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", class: "h-4 w-4 block dark:hidden", children: _jsxs("g", { strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M8 1.11V2" }), _jsx("path", { d: "M12.87 3.13L12.24 3.76" }), _jsx("path", { d: "M14.89 8H14" }), _jsx("path", { d: "M12.87 12.87L12.24 12.24" }), _jsx("path", { d: "M8 14.89V14" }), _jsx("path", { d: "M3.13 12.87L3.76 12.24" }), _jsx("path", { d: "M1.11 8H2" }), _jsx("path", { d: "M3.13 3.13L3.76 3.76" }), _jsx("circle", { cx: "8", cy: "8", r: "3.78" })] }) }));
9
+ }
10
+ function MoonIcon() {
11
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", class: "h-4 w-4 hidden dark:block", children: _jsx("path", { d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" }) }));
12
+ }
13
+ /**
14
+ * Two-row site header two-row layout.
15
+ * Row 1 (h-16): logo, search, theme toggle
16
+ * Row 2 (h-12): navigation tabs
17
+ * Total: 7rem (header-height)
18
+ */
19
+ export function Header() {
20
+ const nav = useContext(NavigationContext);
21
+ const options = useContext(OptionsContext);
22
+ const spec = useContext(SpecContext);
23
+ const base = options.assetBase;
24
+ return (_jsxs("div", { id: "navbar", class: "z-30 fixed lg:sticky top-0 w-full", children: [_jsx("div", { class: "absolute w-full h-full flex-none border-b border-[rgb(var(--color-gray-200)/0.7)] dark:border-[rgb(var(--color-gray-300)/0.06)] bg-[rgb(var(--color-background-light))] dark:bg-[rgb(var(--color-background-dark))]" }), _jsxs("div", { class: "max-w-[92rem] mx-auto relative", children: [_jsxs("div", { class: "relative", children: [_jsx("div", { class: "flex items-center lg:px-12 h-16 min-w-0 mx-4 lg:mx-0", children: _jsxs("div", { class: "h-full relative flex-1 flex items-center gap-x-4 min-w-0 border-b border-[rgb(var(--color-gray-500)/0.05)] dark:border-[rgb(var(--color-gray-300)/0.06)]", children: [_jsx("div", { class: "flex-1 flex items-center gap-x-4", children: spec.info.logo && (_jsx("a", { href: `${base}${nav.tabs[0]?.href ?? ""}`, class: "select-none", children: _jsx("img", { src: spec.info.logo, alt: spec.info.title || "Home", class: "w-auto h-7 relative object-contain shrink-0" }) })) }), _jsx("div", { class: "relative hidden lg:flex items-center flex-1 z-20 gap-2.5", children: _jsxs("button", { id: "search-open", type: "button", "aria-label": "Search", class: "group flex pointer-events-auto rounded-xl w-full items-center text-sm leading-6 h-9 pl-3.5 pr-3 text-[rgb(var(--color-gray-500))] dark:text-[rgb(var(--color-gray-400))] ring-1 ring-[rgb(var(--color-gray-400)/0.3)] hover:ring-[rgb(var(--color-gray-600)/0.3)] dark:ring-[rgb(var(--color-gray-600)/0.3)] dark:hover:ring-[rgb(var(--color-gray-500)/0.3)] justify-between truncate gap-2 min-w-[43px] cursor-pointer bg-[rgb(var(--color-background-light))] dark:bg-[rgb(var(--color-background-dark))] dark:brightness-110 dark:hover:brightness-125", children: [_jsxs("div", { class: "flex items-center gap-2 min-w-[42px]", children: [_jsx(SearchIcon, {}), _jsx("div", { class: "truncate min-w-0", children: "Search docs..." })] }), _jsx("kbd", { class: "flex-none ml-auto size-5 flex items-center justify-center text-xs font-semibold text-[rgb(var(--color-gray-400))] bg-[rgb(var(--color-gray-100)/0.5)] dark:bg-[rgb(var(--color-surface-dark-tint)/0.1)] border border-[rgb(var(--color-gray-200))] dark:border-[rgb(var(--color-border-dark-subtle)/0.1)] rounded", children: "/" })] }) }), _jsx("div", { class: "flex-1 relative hidden lg:flex items-center ml-auto justify-end space-x-4", children: _jsx("div", { class: "flex items-center", children: _jsxs("button", { id: "theme-toggle", type: "button", "aria-label": "Toggle theme", class: "group p-2 flex items-center justify-center cursor-pointer text-[rgb(var(--color-gray-400))] hover:text-[rgb(var(--color-gray-600))] dark:text-[rgb(var(--color-gray-500))] dark:hover:text-[rgb(var(--color-gray-300))]", children: [_jsx(SunIcon, {}), _jsx(MoonIcon, {})] }) }) }), _jsxs("div", { class: "flex lg:hidden items-center gap-3", children: [_jsx("button", { type: "button", "data-drawer-slide": "right", "aria-label": "Open menu", class: "text-[rgb(var(--color-gray-500))] w-8 h-8 flex items-center justify-center hover:text-[rgb(var(--color-gray-600))]", children: _jsx("svg", { class: "h-4", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 448 512", children: _jsx("path", { d: "M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z" }) }) }), _jsx("button", { id: "search-open-mobile", type: "button", "aria-label": "Search", class: "text-[rgb(var(--color-gray-500))] w-8 h-8 flex items-center justify-center", children: _jsx(SearchIcon, {}) })] })] }) }), _jsx("button", { type: "button", class: "flex items-center h-14 py-4 px-5 lg:hidden focus:outline-0 w-full text-left", "data-drawer-slide": "right", children: _jsx("div", { class: "text-[rgb(var(--color-gray-500))]", children: _jsx("svg", { class: "h-4", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 448 512", children: _jsx("path", { d: "M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z" }) }) }) })] }), _jsx("div", { class: "hidden lg:flex px-12 h-12", children: _jsx("div", { class: "h-full flex text-sm gap-x-6", children: nav.tabs.map((tab) => {
25
+ const isActive = tab.slug === nav.activeTabSlug;
26
+ return (_jsxs("a", { href: `${base}${tab.href}`, class: `group relative h-full gap-2 flex items-center font-medium transition-colors ${isActive
27
+ ? "text-[rgb(var(--color-gray-800))] dark:text-[rgb(var(--color-gray-200))]"
28
+ : "text-[rgb(var(--color-gray-600))] dark:text-[rgb(var(--color-gray-400))] hover:text-[rgb(var(--color-gray-800))] dark:hover:text-[rgb(var(--color-gray-300))]"}`, children: [tab.label, isActive ? (_jsx("div", { class: "absolute bottom-0 h-[1.5px] w-full left-0 bg-[rgb(var(--color-primary))] dark:bg-[rgb(var(--color-primary-light))]" })) : (_jsx("div", { class: "absolute bottom-0 h-[1.5px] w-full left-0 group-hover:bg-[rgb(var(--color-gray-200))] dark:group-hover:bg-[rgb(var(--color-gray-700))]" }))] }, tab.slug));
29
+ }) }) })] })] }));
30
+ }
31
+ /**
32
+ * Mobile header is now integrated into the main Header component.
33
+ * This is kept as a no-op for backward compatibility.
34
+ */
35
+ export function MobileHeader() {
36
+ return null;
37
+ }
38
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function Page(): import("preact").JSX.Element;
2
+ //# sourceMappingURL=Page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Page.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Page.tsx"],"names":[],"mappings":"AAsEA,wBAAgB,IAAI,iCAwCnB"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useContext } from "preact/hooks";
3
+ import { SpecContext, PageContext } from "../../renderer/context.js";
4
+ import { Header, MobileHeader } from "./Header.js";
5
+ import { Sidebar } from "./Sidebar.js";
6
+ import { TableOfContents } from "./TableOfContents.js";
7
+ import { Introduction } from "../openapi/Introduction.js";
8
+ import { SecurityDefinitions } from "../openapi/Security.js";
9
+ import { Tags } from "../openapi/Tags.js";
10
+ import { Definition } from "../openapi/Definition.js";
11
+ /**
12
+ * Markdown page content with prose typography.
13
+ */
14
+ function MarkdownPageContent({ page }) {
15
+ return (_jsxs("div", { class: "relative grow box-border flex-col w-full mx-auto px-1 lg:pl-[23.7rem] lg:-ml-12 xl:w-[calc(100%-28rem)]", id: "content-area", children: [_jsxs("header", { class: "relative leading-none", children: [_jsx("div", { class: "mt-0.5 space-y-2.5", children: _jsx("div", { class: "flex flex-col sm:flex-row items-start sm:items-center relative gap-2 min-w-0", children: _jsx("h1", { class: "text-2xl sm:text-3xl text-[rgb(var(--color-gray-900))] tracking-tight dark:text-[rgb(var(--color-gray-200))] font-bold break-all", children: page.title }) }) }), page.description && (_jsx("div", { class: "mt-2 text-lg prose prose-gray dark:prose-invert", children: _jsx("p", { children: page.description }) }))] }), _jsx("div", { class: "prose prose-gray dark:prose-invert relative mt-8 mb-14 max-w-none", dangerouslySetInnerHTML: { __html: page.html } })] }));
16
+ }
17
+ /**
18
+ * OpenAPI spec page content with single-column layout.
19
+ */
20
+ function SpecPageContent() {
21
+ const spec = useContext(SpecContext);
22
+ const serverUrl = spec.servers[0]?.url ?? "/";
23
+ return (_jsx("div", { class: "relative grow box-border flex-col w-full mx-auto px-1 lg:pl-[23.7rem] lg:-ml-12", id: "content-area", children: _jsxs("article", { children: [_jsx("header", { class: "mb-8", children: _jsxs("div", { class: "flex items-baseline gap-3", children: [_jsx("h1", { class: "text-2xl sm:text-3xl font-bold text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))] tracking-tight", children: spec.info.title }), _jsxs("span", { class: "text-sm text-[rgb(var(--color-gray-400))]", children: ["v", spec.info.version] })] }) }), _jsx(Introduction, {}), _jsx(SecurityDefinitions, {}), _jsx(Tags, { tags: spec.tags, serverUrl: serverUrl }), Object.keys(spec.schemas).length > 0 && (_jsxs("div", { class: "mt-12", children: [_jsx("div", { class: "mb-6", children: _jsx("h1", { class: "text-xl font-bold text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))]", children: "Models" }) }), Object.entries(spec.schemas).map(([name, schema]) => (_jsx(Definition, { name: name, schema: schema }, name)))] }))] }) }));
24
+ }
25
+ export function Page() {
26
+ const page = useContext(PageContext);
27
+ return (_jsxs("div", { id: "page", class: "relative antialiased text-[rgb(var(--color-gray-500))] dark:text-[rgb(var(--color-gray-400))]", children: [_jsx(Header, {}), _jsx(MobileHeader, {}), _jsx("span", { class: "fixed inset-0 bg-[rgb(var(--color-background-light))] dark:bg-[rgb(var(--color-background-dark))] -z-10 pointer-events-none" }), _jsxs("div", { class: "max-w-[92rem] mx-auto relative px-4 lg:px-8", children: [_jsx(Sidebar, {}), _jsx("div", { id: "docs", class: "pt-40 lg:pt-10", children: page.kind === "markdown" ? (_jsxs("div", { class: "flex flex-row-reverse gap-12 box-border w-full", children: [_jsx(TableOfContents, { headings: page.markdown.headings }), _jsx(MarkdownPageContent, { page: page.markdown })] })) : (_jsx(SpecPageContent, {})) })] }), _jsx("div", { id: "search-dialog", role: "dialog", "aria-label": "Search", children: _jsxs("div", { class: "search-dialog-inner", children: [_jsx("input", { id: "search-input", type: "text", placeholder: "Search...", autocomplete: "off", spellcheck: false }), _jsx("div", { id: "search-results" })] }) })] }));
28
+ }
29
+ //# sourceMappingURL=Page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Page.js","sourceRoot":"","sources":["../../../src/components/layout/Page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Sidebar clean design:
3
+ * - No border-right
4
+ * - Bold group headers (not uppercase)
5
+ * - Method pills for API operations
6
+ * - Active item with primary bg/text and text-shadow trick
7
+ */
8
+ export declare function Sidebar(): import("preact").JSX.Element | null;
9
+ //# sourceMappingURL=Sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Sidebar.tsx"],"names":[],"mappings":"AA8BA;;;;;;GAMG;AACH,wBAAgB,OAAO,wCAkDtB"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useContext } from "preact/hooks";
3
+ import { NavigationContext, OptionsContext } from "../../renderer/context.js";
4
+ /**
5
+ * Method pill for API sidebar navigation items.
6
+ * Colored method badges.
7
+ */
8
+ function MethodPill({ method }) {
9
+ const m = method.toUpperCase();
10
+ const label = m === "DELETE" ? "DEL" : m;
11
+ // Method pill colors
12
+ const colors = {
13
+ GET: "bg-green-400/20 dark:bg-green-400/20 text-green-700 dark:text-green-400",
14
+ POST: "bg-blue-400/20 dark:bg-blue-400/20 text-blue-700 dark:text-blue-400",
15
+ PUT: "bg-yellow-400/20 dark:bg-yellow-400/20 text-yellow-700 dark:text-yellow-400",
16
+ DELETE: "bg-red-400/20 dark:bg-red-400/20 text-red-700 dark:text-red-400",
17
+ DEL: "bg-red-400/20 dark:bg-red-400/20 text-red-700 dark:text-red-400",
18
+ PATCH: "bg-orange-400/20 dark:bg-orange-400/20 text-orange-700 dark:text-orange-400",
19
+ };
20
+ return (_jsx("span", { class: "flex items-center w-8 h-[1lh] shrink-0", children: _jsx("span", { class: `px-1 py-0.5 rounded-md text-[0.55rem] leading-tight font-bold ${colors[m] ?? "bg-gray-400/20 text-gray-700"}`, children: label }) }));
21
+ }
22
+ /**
23
+ * Sidebar clean design:
24
+ * - No border-right
25
+ * - Bold group headers (not uppercase)
26
+ * - Method pills for API operations
27
+ * - Active item with primary bg/text and text-shadow trick
28
+ */
29
+ export function Sidebar() {
30
+ const nav = useContext(NavigationContext);
31
+ const options = useContext(OptionsContext);
32
+ const activeTab = nav.tabs.find((t) => t.slug === nav.activeTabSlug);
33
+ if (!activeTab)
34
+ return null;
35
+ const base = options.assetBase;
36
+ return (_jsx("div", { id: "sidebar", class: "z-20 hidden lg:block fixed bottom-0 right-auto w-[18rem]", style: "top: 7rem", children: _jsx("div", { class: "absolute inset-0 z-10 overflow-auto pr-8 pb-10", id: "sidebar-content", children: _jsxs("div", { class: "relative lg:text-sm lg:leading-6", children: [_jsx("div", { class: "sticky top-0 h-8 z-10 bg-gradient-to-b from-[rgb(var(--color-background-light))] dark:from-[rgb(var(--color-background-dark))]" }), _jsx("nav", { id: "nav", role: "navigation", children: activeTab.groups.map((group, gi) => (_jsxs("div", { class: gi > 0 ? "mt-6 lg:mt-8" : "", children: [group.label && (_jsx("div", { class: "flex items-center gap-2.5 pl-4 mb-3.5 lg:mb-2.5 font-semibold text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))]", children: _jsx("h5", { children: group.label }) })), _jsx("ul", { class: "space-y-px", children: group.items.map((item) => {
37
+ const isActive = item.id === nav.activePageSlug;
38
+ return (_jsx("li", { class: "relative", children: _jsxs("a", { href: `${base}${item.href}`, class: `nav-link${isActive ? " active" : ""}`, children: [item.method && _jsx(MethodPill, { method: item.method }), _jsx("div", { class: "flex-1 break-words [word-break:break-word]", children: item.label })] }) }, item.id));
39
+ }) })] }, group.label))) })] }) }) }));
40
+ }
41
+ //# sourceMappingURL=Sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/components/layout/Sidebar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE9E;;;GAGG;AACH,SAAS,UAAU,CAAC,EAAE,MAAM,EAAsB;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,qBAAqB;IACrB,MAAM,MAAM,GAA2B;QACrC,GAAG,EAAE,yEAAyE;QAC9E,IAAI,EAAE,qEAAqE;QAC3E,GAAG,EAAE,6EAA6E;QAClF,MAAM,EAAE,iEAAiE;QACzE,GAAG,EAAE,iEAAiE;QACtE,KAAK,EAAE,6EAA6E;KACrF,CAAC;IAEF,OAAO,CACL,eAAM,KAAK,EAAC,wCAAwC,YAClD,eAAM,KAAK,EAAE,iEAAiE,MAAM,CAAC,CAAC,CAAC,IAAI,8BAA8B,EAAE,YACxH,KAAK,GACD,GACF,CACR,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;IACrE,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAE/B,OAAO,CACL,cACE,EAAE,EAAC,SAAS,EACZ,KAAK,EAAC,0DAA0D,EAChE,KAAK,EAAC,WAAW,YAEjB,cAAK,KAAK,EAAC,gDAAgD,EAAC,EAAE,EAAC,iBAAiB,YAC9E,eAAK,KAAK,EAAC,kCAAkC,aAE3C,cAAK,KAAK,EAAC,gIAAgI,GAAG,EAE9I,cAAK,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,YAAY,YAC5B,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CACnC,eAAuB,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,aACvD,KAAK,CAAC,KAAK,IAAI,CACd,cAAK,KAAK,EAAC,wIAAwI,YACjJ,uBAAK,KAAK,CAAC,KAAK,GAAM,GAClB,CACP,EACD,aAAI,KAAK,EAAC,YAAY,YACnB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wCACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,cAAc,CAAC;wCAChD,OAAO,CACL,aAAkB,KAAK,EAAC,UAAU,YAChC,aACE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAC3B,KAAK,EAAE,WAAW,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,aAE5C,IAAI,CAAC,MAAM,IAAI,KAAC,UAAU,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAI,EACnD,cAAK,KAAK,EAAC,4CAA4C,YAAE,IAAI,CAAC,KAAK,GAAO,IACxE,IAPG,IAAI,CAAC,EAAE,CAQX,CACN,CAAC;oCACJ,CAAC,CAAC,GACC,KArBG,KAAK,CAAC,KAAK,CAsBf,CACP,CAAC,GACE,IACF,GACF,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PageHeading } from "../../core/markdown-loader.js";
2
+ /**
3
+ * Right-sidebar table of contents for prose pages.
4
+ * TOC layout: w-[19rem] outer, w-[16.5rem] inner,
5
+ * sticky at 9.5rem, "On this page" with icon.
6
+ */
7
+ export declare function TableOfContents({ headings }: {
8
+ headings: PageHeading[];
9
+ }): import("preact").JSX.Element | null;
10
+ //# sourceMappingURL=TableOfContents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.d.ts","sourceRoot":"","sources":["../../../src/components/layout/TableOfContents.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,uCAwCxE"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ /**
3
+ * Right-sidebar table of contents for prose pages.
4
+ * TOC layout: w-[19rem] outer, w-[16.5rem] inner,
5
+ * sticky at 9.5rem, "On this page" with icon.
6
+ */
7
+ export function TableOfContents({ headings }) {
8
+ if (headings.length === 0)
9
+ return null;
10
+ return (_jsx("aside", { id: "toc", class: "hidden xl:flex self-start sticky xl:flex-col max-w-[28rem] z-[21] h-[calc(100vh-9.5rem)] top-[9.5rem]", children: _jsx("div", { class: "z-10 hidden xl:flex box-border max-h-full pl-10 w-[19rem]", children: _jsxs("div", { class: "text-[rgb(var(--color-gray-600))] text-sm leading-6 w-[16.5rem] overflow-y-auto space-y-2 pb-4 -mt-10 pt-10", children: [_jsxs("button", { class: "text-[rgb(var(--color-gray-700))] dark:text-[rgb(var(--color-gray-300))] font-medium flex items-center space-x-2 cursor-default", children: [_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", class: "h-3 w-3", children: [_jsx("path", { d: "M2.44 12.67H13.56", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M2.44 3.33H13.56", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M2.44 8H7.33", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { children: "On this page" })] }), _jsx("nav", { children: _jsx("ul", { class: "space-y-0.5", children: headings.map((h) => (_jsx("li", { class: "relative", children: _jsx("a", { href: `#${h.id}`, class: `toc-item break-words py-1 block hover:text-[rgb(var(--color-gray-900))] dark:hover:text-[rgb(var(--color-gray-300))] dark:text-[rgb(var(--color-gray-400))] transition-colors ${h.level >= 3 ? "pl-3 text-[13px]" : ""}`, children: h.text }) }, h.id))) }) })] }) }) }));
11
+ }
12
+ //# sourceMappingURL=TableOfContents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.js","sourceRoot":"","sources":["../../../src/components/layout/TableOfContents.tsx"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAA+B;IACvE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,OAAO,CACL,gBACE,EAAE,EAAC,KAAK,EACR,KAAK,EAAC,uGAAuG,YAE7G,cAAK,KAAK,EAAC,2DAA2D,YACpE,eAAK,KAAK,EAAC,6GAA6G,aAEtH,kBAAQ,KAAK,EAAC,iIAAiI,aAC7I,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,KAAK,EAAC,SAAS,aAC/G,eAAM,CAAC,EAAC,mBAAmB,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EAC3E,eAAM,CAAC,EAAC,kBAAkB,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EAC1E,eAAM,CAAC,EAAC,cAAc,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,IAClE,EACN,0CAAyB,IAClB,EAET,wBACE,aAAI,KAAK,EAAC,aAAa,YACpB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,aAAe,KAAK,EAAC,UAAU,YAC7B,YACE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAChB,KAAK,EAAE,iLACL,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EACtC,EAAE,YAED,CAAC,CAAC,IAAI,GACL,IARG,CAAC,CAAC,EAAE,CASR,CACN,CAAC,GACC,GACD,IACF,GACF,GACA,CACT,CAAC;AACJ,CAAC"}