@blaaiz/docs-core 0.1.0

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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/chunk-3ZX4WIE3.js +2984 -0
  4. package/dist/chunk-3ZX4WIE3.js.map +1 -0
  5. package/dist/chunk-JCYR6RPE.js +31 -0
  6. package/dist/chunk-JCYR6RPE.js.map +1 -0
  7. package/dist/chunk-ZKOOKLZ3.js +124 -0
  8. package/dist/chunk-ZKOOKLZ3.js.map +1 -0
  9. package/dist/cli.js +534 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/generator.cjs +508 -0
  12. package/dist/generator.cjs.map +1 -0
  13. package/dist/generator.d.cts +122 -0
  14. package/dist/generator.d.ts +122 -0
  15. package/dist/generator.js +177 -0
  16. package/dist/generator.js.map +1 -0
  17. package/dist/index.cjs +3024 -0
  18. package/dist/index.cjs.map +1 -0
  19. package/dist/index.d.cts +1182 -0
  20. package/dist/index.d.ts +1182 -0
  21. package/dist/index.js +3 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/navigation-CGqFIPlP.d.cts +498 -0
  24. package/dist/navigation-CGqFIPlP.d.ts +498 -0
  25. package/dist/openapi-types-CJ6p5Cux.d.cts +78 -0
  26. package/dist/openapi-types-CJ6p5Cux.d.ts +78 -0
  27. package/dist/ui/api-try-it.cjs +654 -0
  28. package/dist/ui/api-try-it.cjs.map +1 -0
  29. package/dist/ui/api-try-it.d.cts +78 -0
  30. package/dist/ui/api-try-it.d.ts +78 -0
  31. package/dist/ui/api-try-it.js +509 -0
  32. package/dist/ui/api-try-it.js.map +1 -0
  33. package/dist/ui/ask-ai.cjs +810 -0
  34. package/dist/ui/ask-ai.cjs.map +1 -0
  35. package/dist/ui/ask-ai.d.cts +57 -0
  36. package/dist/ui/ask-ai.d.ts +57 -0
  37. package/dist/ui/ask-ai.js +808 -0
  38. package/dist/ui/ask-ai.js.map +1 -0
  39. package/dist/ui/copy-page.cjs +312 -0
  40. package/dist/ui/copy-page.cjs.map +1 -0
  41. package/dist/ui/copy-page.d.cts +33 -0
  42. package/dist/ui/copy-page.d.ts +33 -0
  43. package/dist/ui/copy-page.js +183 -0
  44. package/dist/ui/copy-page.js.map +1 -0
  45. package/dist/ui/mermaid.cjs +363 -0
  46. package/dist/ui/mermaid.cjs.map +1 -0
  47. package/dist/ui/mermaid.d.cts +13 -0
  48. package/dist/ui/mermaid.d.ts +13 -0
  49. package/dist/ui/mermaid.js +361 -0
  50. package/dist/ui/mermaid.js.map +1 -0
  51. package/dist/ui.cjs +661 -0
  52. package/dist/ui.cjs.map +1 -0
  53. package/dist/ui.d.cts +428 -0
  54. package/dist/ui.d.ts +428 -0
  55. package/dist/ui.js +537 -0
  56. package/dist/ui.js.map +1 -0
  57. package/package.json +145 -0
  58. package/patches/fumadocs-openapi.patch +173 -0
  59. package/skills/AGENTS-section.md +36 -0
  60. package/skills/SKILL.md +363 -0
  61. package/styles/api-reference.css +1417 -0
  62. package/styles/ask-ai.css +563 -0
  63. package/styles/auth.css +462 -0
  64. package/styles/docs.css +247 -0
  65. package/styles/home.css +376 -0
  66. package/templates/init/content/docs/index.mdx.tmpl +52 -0
  67. package/templates/init/content/docs/meta.json.tmpl +3 -0
  68. package/templates/init/content/docs.json.tmpl +12 -0
  69. package/templates/init/content/nav.json.tmpl +7 -0
  70. package/templates/init/docs.config.ts.tmpl +36 -0
  71. package/templates/init/env.example.tmpl +15 -0
package/dist/ui.cjs ADDED
@@ -0,0 +1,661 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+
6
+ // src/ui/accordion.tsx
7
+ function Accordion({ title, children }) {
8
+ return /* @__PURE__ */ jsxRuntime.jsxs(
9
+ "details",
10
+ {
11
+ style: {
12
+ border: "1px solid var(--color-fd-border)",
13
+ borderRadius: 8,
14
+ padding: "10px 14px",
15
+ margin: "8px 0"
16
+ },
17
+ children: [
18
+ /* @__PURE__ */ jsxRuntime.jsx("summary", { style: { cursor: "pointer", fontWeight: 600 }, children: title }),
19
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8 }, children })
20
+ ]
21
+ }
22
+ );
23
+ }
24
+ function AccordionGroup({ children }) {
25
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { margin: "16px 0" }, children });
26
+ }
27
+ function apiOperationLayout(slots) {
28
+ let playground = slots.apiPlayground;
29
+ if (react.isValidElement(playground) && playground.type.acceptsExample === true) {
30
+ playground = react.cloneElement(playground, {
31
+ example: slots.apiExample
32
+ });
33
+ }
34
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start", children: [
35
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
36
+ slots.header,
37
+ slots.description,
38
+ playground,
39
+ slots.authSchemes,
40
+ slots.parameters,
41
+ slots.body,
42
+ slots.responses,
43
+ slots.callbacks
44
+ ] }),
45
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]", children: slots.apiExample })
46
+ ] });
47
+ }
48
+ function MethodBadge({ method }) {
49
+ const upper = method.toUpperCase();
50
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "api-method-badge", "data-method": method.toLowerCase(), children: upper });
51
+ }
52
+ function apiMethodBadges(methods) {
53
+ return {
54
+ file(node) {
55
+ const method = node.url ? methods[node.url] : void 0;
56
+ if (!method) {
57
+ return node;
58
+ }
59
+ return {
60
+ ...node,
61
+ name: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "api-nav-item", children: [
62
+ /* @__PURE__ */ jsxRuntime.jsx(MethodBadge, { method }),
63
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "api-nav-text", children: node.name })
64
+ ] })
65
+ };
66
+ }
67
+ };
68
+ }
69
+ var GLYPHS = {
70
+ house: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
71
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" }),
72
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 22V12h6v10" })
73
+ ] }),
74
+ book: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20" }),
75
+ code: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
76
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m16 18 6-6-6-6" }),
77
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m8 6-6 6 6 6" })
78
+ ] }),
79
+ rocket: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
80
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91 0z" }),
81
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" }),
82
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" }),
83
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" })
84
+ ] }),
85
+ terminal: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
86
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m4 17 6-6-6-6" }),
87
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 19h8" })
88
+ ] }),
89
+ wallet: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
90
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1" }),
91
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4" })
92
+ ] }),
93
+ key: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
94
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" }),
95
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m21 2-9.6 9.6" }),
96
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" })
97
+ ] }),
98
+ webhook: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
99
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" }),
100
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" }),
101
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" })
102
+ ] }),
103
+ globe: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
104
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
105
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" }),
106
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 12h20" })
107
+ ] }),
108
+ mail: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
109
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2", y: "4", width: "20", height: "16", rx: "2" }),
110
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" })
111
+ ] }),
112
+ user: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
113
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "8", r: "4" }),
114
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 21a8 8 0 0 1 16 0" })
115
+ ] }),
116
+ lock: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
117
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2" }),
118
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
119
+ ] }),
120
+ /** A circled `i` — an informational note, and the generic error state. */
121
+ info: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
122
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
123
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 8v4M12 16h.01", strokeLinecap: "round" })
124
+ ] }),
125
+ /** A warning triangle — a caution, and the `500` screen. */
126
+ alert: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
127
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" }),
128
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 9v4M12 17h.01", strokeLinecap: "round" })
129
+ ] }),
130
+ /** A light bulb — a tip. */
131
+ bulb: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 18h6M10 22h4M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2Z" }),
132
+ /** A circle with a cross — the `404` screen. */
133
+ crossCircle: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
134
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
135
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m14.31 8-1.31 2.4M9.69 8l4.62 8M14.31 16 9.69 8", strokeLinecap: "round" })
136
+ ] }),
137
+ /** Struck-through signal bars — the offline screen. */
138
+ offline: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 12.55a11 11 0 0 1 14 0M8.5 16.11a6 6 0 0 1 7 0M12 20h.01", strokeLinecap: "round" }),
140
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m2 2 20 20", strokeLinecap: "round" })
141
+ ] }),
142
+ copy: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 9h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" }),
143
+ check: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 6 9 17l-5-5" }),
144
+ chevronDown: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m6 9 6 6 6-6" }),
145
+ /** Stacked chevrons — a value this control switches between. */
146
+ chevronUpDown: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m7 15 5 5 5-5M7 9l5-5 5 5" }),
147
+ /** An open arc — one turn of a loading spinner. */
148
+ spinner: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56", strokeLinecap: "round" }),
149
+ markdown: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
150
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2", y: "5", width: "20", height: "14", rx: "2" }),
151
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 15V9l3 3 3-3v6M17 9v4m0 0 2-2m-2 2-2-2" })
152
+ ] })
153
+ };
154
+ function strokeIcon(name, options = {}) {
155
+ return /* @__PURE__ */ jsxRuntime.jsx(
156
+ "svg",
157
+ {
158
+ ...options.className === void 0 ? {} : { className: options.className },
159
+ ...options.size === void 0 ? {} : { width: options.size, height: options.size },
160
+ viewBox: "0 0 24 24",
161
+ fill: "none",
162
+ stroke: "currentColor",
163
+ strokeWidth: options.strokeWidth ?? 2,
164
+ ...options.rounded ? { strokeLinecap: "round", strokeLinejoin: "round" } : {},
165
+ "aria-hidden": "true",
166
+ children: GLYPHS[name]
167
+ },
168
+ options.key
169
+ );
170
+ }
171
+ function authErrorMessage(code, domains) {
172
+ if (!code) {
173
+ return null;
174
+ }
175
+ const list = domains.join(", ");
176
+ switch (code) {
177
+ case "forbidden":
178
+ case "domain":
179
+ return list ? `That email isn't on an allowed domain. Sign in with your ${list} account.` : `That account isn't allowed to access these docs.`;
180
+ case "oauth":
181
+ case "state":
182
+ return `Google sign-in didn't complete. Please try again.`;
183
+ case "badsecret":
184
+ return `That secret is incorrect. Please try again.`;
185
+ case "expired":
186
+ return `Your session expired. Sign in again to continue.`;
187
+ case "config":
188
+ return `Sign-in isn't configured for this site. Contact the site owner.`;
189
+ default:
190
+ return `Something went wrong signing in. Please try again.`;
191
+ }
192
+ }
193
+ function mailIcon() {
194
+ return strokeIcon("mail");
195
+ }
196
+ function lockIcon() {
197
+ return strokeIcon("lock");
198
+ }
199
+ function alertIcon() {
200
+ return strokeIcon("info");
201
+ }
202
+ function keyIcon() {
203
+ return strokeIcon("key");
204
+ }
205
+ function userIcon() {
206
+ return strokeIcon("user");
207
+ }
208
+ function googleIcon() {
209
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [
210
+ /* @__PURE__ */ jsxRuntime.jsx(
211
+ "path",
212
+ {
213
+ fill: "#4285F4",
214
+ d: "M23.52 12.27c0-.82-.07-1.6-.2-2.36H12v4.46h6.47a5.53 5.53 0 0 1-2.4 3.63v3.02h3.88c2.27-2.09 3.57-5.17 3.57-8.75z"
215
+ }
216
+ ),
217
+ /* @__PURE__ */ jsxRuntime.jsx(
218
+ "path",
219
+ {
220
+ fill: "#34A853",
221
+ d: "M12 24c3.24 0 5.96-1.08 7.95-2.91l-3.88-3.02c-1.08.72-2.45 1.16-4.07 1.16-3.13 0-5.78-2.11-6.73-4.96H1.29v3.12A12 12 0 0 0 12 24z"
222
+ }
223
+ ),
224
+ /* @__PURE__ */ jsxRuntime.jsx(
225
+ "path",
226
+ {
227
+ fill: "#FBBC05",
228
+ d: "M5.27 14.27a7.2 7.2 0 0 1 0-4.54V6.61H1.29a12 12 0 0 0 0 10.78l3.98-3.12z"
229
+ }
230
+ ),
231
+ /* @__PURE__ */ jsxRuntime.jsx(
232
+ "path",
233
+ {
234
+ fill: "#EA4335",
235
+ d: "M12 4.75c1.77 0 3.35.61 4.6 1.8l3.44-3.44A11.5 11.5 0 0 0 12 0 12 12 0 0 0 1.29 6.61l3.98 3.12C6.22 6.86 8.87 4.75 12 4.75z"
236
+ }
237
+ )
238
+ ] });
239
+ }
240
+ function AuthScreen(props) {
241
+ const { config, from, error } = props;
242
+ const auth = config.auth;
243
+ const workspace = auth === "public" ? null : auth;
244
+ const domains = workspace?.allowedDomains ?? [];
245
+ const target = from ?? "/";
246
+ const emailAction = props.emailAction ?? "/api/auth/email";
247
+ const secretAction = props.secretAction ?? "/api/auth/secret";
248
+ const googleStartPath = props.googleStartPath ?? "/api/auth/google/start";
249
+ const signInPath = props.signInPath ?? "/signin";
250
+ const secretEnabled = props.secretEnabled ?? Boolean(workspace?.providers.secret);
251
+ const emailProvider = workspace?.providers.email ?? false;
252
+ const hasEmailFlow = secretEnabled || emailProvider;
253
+ const showGoogle = props.googleEnabled ?? Boolean(workspace?.providers.google);
254
+ const message = authErrorMessage(error, domains);
255
+ const logo = config.theme.logo;
256
+ const onSecretStep = props.step === "secret" && secretEnabled && Boolean(props.email);
257
+ const brand = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "auth-brand", children: logo ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
258
+ /* @__PURE__ */ jsxRuntime.jsx("img", { className: "auth-logo-light", src: logo.light, alt: config.theme.name }),
259
+ /* @__PURE__ */ jsxRuntime.jsx("img", { className: "auth-logo-dark", src: logo.dark, alt: config.theme.name })
260
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
261
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "auth-dot", "aria-hidden": "true" }),
262
+ config.theme.name
263
+ ] }) });
264
+ const errorBanner = message ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "auth-error", role: "alert", children: [
265
+ alertIcon(),
266
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: message })
267
+ ] }) : null;
268
+ if (onSecretStep) {
269
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "auth-screen", children: [
270
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "auth-ambient", "aria-hidden": "true" }),
271
+ /* @__PURE__ */ jsxRuntime.jsxs("main", { className: "auth-card", children: [
272
+ brand,
273
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "auth-title", children: "Enter access secret" }),
274
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "auth-sub", children: "One more step \u2014 enter the shared secret to continue." }),
275
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "auth-identity", children: [
276
+ userIcon(),
277
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "auth-identity-email", children: props.email }),
278
+ /* @__PURE__ */ jsxRuntime.jsx("a", { className: "auth-change", href: signInPath, children: "Change" })
279
+ ] }),
280
+ errorBanner,
281
+ /* @__PURE__ */ jsxRuntime.jsxs("form", { className: "auth-form", action: secretAction, method: "post", children: [
282
+ /* @__PURE__ */ jsxRuntime.jsx("input", { type: "hidden", name: "from", value: target }),
283
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "auth-label", htmlFor: "auth-secret", children: "Access secret" }),
284
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "auth-field", children: [
285
+ keyIcon(),
286
+ /* @__PURE__ */ jsxRuntime.jsx(
287
+ "input",
288
+ {
289
+ id: "auth-secret",
290
+ name: "secret",
291
+ type: "password",
292
+ required: true,
293
+ autoFocus: true,
294
+ autoComplete: "off",
295
+ placeholder: "Enter the access secret",
296
+ className: "auth-input"
297
+ }
298
+ )
299
+ ] }),
300
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", className: "auth-submit", children: "Sign in" })
301
+ ] }),
302
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "auth-foot", children: [
303
+ lockIcon(),
304
+ "Access is limited to your workspace."
305
+ ] })
306
+ ] })
307
+ ] });
308
+ }
309
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "auth-screen", children: [
310
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "auth-ambient", "aria-hidden": "true" }),
311
+ /* @__PURE__ */ jsxRuntime.jsxs("main", { className: "auth-card", children: [
312
+ brand,
313
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "auth-title", children: "Sign in" }),
314
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "auth-sub", children: domains.length ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
315
+ "These docs are restricted to ",
316
+ /* @__PURE__ */ jsxRuntime.jsx("b", { children: domains.join(", ") }),
317
+ " accounts."
318
+ ] }) : "These docs are restricted to your workspace." }),
319
+ errorBanner,
320
+ hasEmailFlow ? /* @__PURE__ */ jsxRuntime.jsxs(
321
+ "form",
322
+ {
323
+ className: "auth-form",
324
+ action: secretEnabled ? secretAction : emailAction,
325
+ method: "post",
326
+ children: [
327
+ /* @__PURE__ */ jsxRuntime.jsx("input", { type: "hidden", name: "from", value: target }),
328
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "auth-label", htmlFor: "auth-email", children: "Work email" }),
329
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "auth-field", children: [
330
+ mailIcon(),
331
+ /* @__PURE__ */ jsxRuntime.jsx(
332
+ "input",
333
+ {
334
+ id: "auth-email",
335
+ name: "email",
336
+ type: "email",
337
+ required: true,
338
+ autoComplete: "email",
339
+ autoFocus: true,
340
+ placeholder: `you@${domains[0] ?? "company.com"}`,
341
+ className: "auth-input"
342
+ }
343
+ )
344
+ ] }),
345
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", className: "auth-submit", children: secretEnabled ? "Continue" : "Continue with email" })
346
+ ]
347
+ }
348
+ ) : null,
349
+ hasEmailFlow && showGoogle ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "auth-divider", children: "or" }) : null,
350
+ showGoogle ? /* @__PURE__ */ jsxRuntime.jsxs("a", { className: "auth-google", href: `${googleStartPath}?from=${encodeURIComponent(target)}`, children: [
351
+ googleIcon(),
352
+ "Continue with Google"
353
+ ] }) : null,
354
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "auth-foot", children: [
355
+ lockIcon(),
356
+ "Access is limited to your workspace."
357
+ ] })
358
+ ] })
359
+ ] });
360
+ }
361
+ var TONE_GLYPHS = {
362
+ note: "info",
363
+ info: "info",
364
+ tip: "bulb",
365
+ warning: "alert"
366
+ };
367
+ function Callout({ tone = "note", children }) {
368
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `cl cl-${tone}`, children: [
369
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cl-icon", children: strokeIcon(TONE_GLYPHS[tone], { size: 18, rounded: true }) }),
370
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cl-body", children })
371
+ ] });
372
+ }
373
+ function Note({ children }) {
374
+ return /* @__PURE__ */ jsxRuntime.jsx(Callout, { tone: "note", children });
375
+ }
376
+ function Warning({ children }) {
377
+ return /* @__PURE__ */ jsxRuntime.jsx(Callout, { tone: "warning", children });
378
+ }
379
+ function Info({ children }) {
380
+ return /* @__PURE__ */ jsxRuntime.jsx(Callout, { tone: "info", children });
381
+ }
382
+ function Tip({ children }) {
383
+ return /* @__PURE__ */ jsxRuntime.jsx(Callout, { tone: "tip", children });
384
+ }
385
+ function Card({
386
+ title,
387
+ href,
388
+ children
389
+ }) {
390
+ const style = {
391
+ display: "block",
392
+ border: "1px solid var(--color-fd-border)",
393
+ borderRadius: 12,
394
+ padding: "16px 18px",
395
+ textDecoration: "none",
396
+ color: "inherit",
397
+ background: "var(--color-fd-card)"
398
+ };
399
+ const body = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
400
+ title !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontWeight: 700, fontSize: 15, marginBottom: 4 }, children: title }),
401
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "var(--color-fd-muted-foreground)", fontSize: 14 }, children })
402
+ ] });
403
+ if (href !== void 0) {
404
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { href, style, children: body });
405
+ }
406
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style, children: body });
407
+ }
408
+ function CardGroup({ cols = 2, children }) {
409
+ const style = {
410
+ display: "grid",
411
+ gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))`,
412
+ gap: 12,
413
+ margin: "16px 0"
414
+ };
415
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style, children });
416
+ }
417
+
418
+ // src/ui/docs-icons.tsx
419
+ var ICONS = {
420
+ house: "house",
421
+ book: "book",
422
+ code: "code",
423
+ rocket: "rocket",
424
+ terminal: "terminal",
425
+ wallet: "wallet",
426
+ key: "key",
427
+ webhook: "webhook",
428
+ globe: "globe"
429
+ };
430
+ var ALIASES = {
431
+ home: "house",
432
+ "book-open": "book",
433
+ api: "code",
434
+ reference: "code",
435
+ terminal: "terminal",
436
+ bank: "wallet",
437
+ "credit-card": "wallet",
438
+ auth: "key",
439
+ lock: "key",
440
+ world: "globe"
441
+ };
442
+ function docsIcon(name) {
443
+ if (!name) {
444
+ return void 0;
445
+ }
446
+ const key = name.toLowerCase();
447
+ const glyph = ICONS[key] ?? ICONS[ALIASES[key] ?? ""];
448
+ return glyph === void 0 ? void 0 : strokeIcon(glyph, { size: 16, rounded: true, key: `docs-icon-${glyph}` });
449
+ }
450
+ function icon(name) {
451
+ return strokeIcon(name, { strokeWidth: 1.75 });
452
+ }
453
+ var PRESETS = {
454
+ "not-found": {
455
+ code: "404",
456
+ title: "Page not found",
457
+ description: "The page you're looking for doesn't exist or may have moved.",
458
+ icon: icon("crossCircle")
459
+ },
460
+ forbidden: {
461
+ code: "403",
462
+ title: "Access restricted",
463
+ description: "Your account is not allowed to view this page. Sign in with an allowed account.",
464
+ icon: icon("lock")
465
+ },
466
+ server: {
467
+ code: "500",
468
+ title: "Something went wrong",
469
+ description: "An unexpected error occurred on our side. Please try again in a moment.",
470
+ icon: icon("alert")
471
+ },
472
+ offline: {
473
+ code: "Offline",
474
+ title: "You're offline",
475
+ description: "Check your connection and try again.",
476
+ icon: icon("offline")
477
+ },
478
+ unknown: {
479
+ code: "Error",
480
+ title: "Something went wrong",
481
+ description: "An unexpected error occurred. Please try again.",
482
+ icon: icon("info")
483
+ }
484
+ };
485
+ function errorPreset(kind) {
486
+ return PRESETS[kind];
487
+ }
488
+ function homeIcon() {
489
+ return strokeIcon("house");
490
+ }
491
+ function ErrorScreen(props) {
492
+ const kind = props.kind ?? "unknown";
493
+ const preset = PRESETS[kind];
494
+ const code = props.code ?? preset.code;
495
+ const title = props.title ?? preset.title;
496
+ const description = props.description ?? preset.description;
497
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "error-screen", children: [
498
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "auth-ambient", "aria-hidden": "true" }),
499
+ /* @__PURE__ */ jsxRuntime.jsxs("main", { className: "error-card", children: [
500
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "error-glyph", "data-kind": kind, children: preset.icon }),
501
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "error-code", children: code }),
502
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "error-title", children: title }),
503
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "error-desc", children: description }),
504
+ props.homeHref || props.action ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "error-actions", children: [
505
+ props.homeHref ? /* @__PURE__ */ jsxRuntime.jsxs("a", { className: "error-btn error-btn-primary", href: props.homeHref, children: [
506
+ homeIcon(),
507
+ props.homeLabel ?? "Back to docs"
508
+ ] }) : null,
509
+ props.action
510
+ ] }) : null
511
+ ] })
512
+ ] });
513
+ }
514
+ function Steps({ children }) {
515
+ return /* @__PURE__ */ jsxRuntime.jsx(
516
+ "div",
517
+ {
518
+ style: {
519
+ borderLeft: "2px solid var(--color-fd-border)",
520
+ paddingLeft: 20,
521
+ margin: "16px 0",
522
+ display: "flex",
523
+ flexDirection: "column",
524
+ gap: 16
525
+ },
526
+ children
527
+ }
528
+ );
529
+ }
530
+ function Step({ title, children }) {
531
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
532
+ title !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontWeight: 700, fontSize: 15, marginBottom: 4 }, children: title }),
533
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children })
534
+ ] });
535
+ }
536
+
537
+ // src/ui/mdx.tsx
538
+ var mdxComponents = {
539
+ Note,
540
+ Warning,
541
+ Info,
542
+ Tip,
543
+ Card,
544
+ CardGroup,
545
+ Accordion,
546
+ AccordionGroup,
547
+ Steps,
548
+ Step
549
+ };
550
+ var defaultResolveHref = (page) => {
551
+ if (page.kind === "openapi") {
552
+ return "/reference";
553
+ }
554
+ if (page.file === "introduction") {
555
+ return "/";
556
+ }
557
+ return `/${page.file}`;
558
+ };
559
+ var METHOD_COLORS = {
560
+ GET: "#16a34a",
561
+ POST: "var(--color-fd-primary)",
562
+ PUT: "#d97706",
563
+ PATCH: "#d97706",
564
+ DELETE: "#dc2626"
565
+ };
566
+ function labelForDoc(file) {
567
+ const last = file.split("/").pop() ?? file;
568
+ return last.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
569
+ }
570
+ function Items({
571
+ items,
572
+ depth,
573
+ resolveHref
574
+ }) {
575
+ const list = { listStyle: "none", margin: 0, paddingLeft: depth === 0 ? 0 : 12 };
576
+ const groupLabel = {
577
+ fontSize: 11,
578
+ fontWeight: 700,
579
+ textTransform: "uppercase",
580
+ letterSpacing: "0.04em",
581
+ color: "var(--color-fd-muted-foreground)",
582
+ margin: "6px 0"
583
+ };
584
+ const link = {
585
+ display: "flex",
586
+ alignItems: "center",
587
+ gap: 8,
588
+ padding: "5px 8px",
589
+ borderRadius: 6,
590
+ color: "var(--color-fd-foreground)",
591
+ textDecoration: "none",
592
+ fontSize: 14
593
+ };
594
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { style: list, children: items.map((item, index) => {
595
+ if (item.kind === "group") {
596
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { style: { marginTop: 10 }, children: [
597
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: groupLabel, children: item.title }),
598
+ /* @__PURE__ */ jsxRuntime.jsx(Items, { items: item.items, depth: depth + 1, resolveHref })
599
+ ] }, `g-${String(index)}`);
600
+ }
601
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: resolveHref(item), style: link, children: [
602
+ item.kind === "openapi" && /* @__PURE__ */ jsxRuntime.jsx(
603
+ "span",
604
+ {
605
+ style: {
606
+ fontSize: 9,
607
+ fontWeight: 700,
608
+ color: METHOD_COLORS[item.method] ?? "var(--color-fd-muted-foreground)",
609
+ minWidth: 34
610
+ },
611
+ children: item.method
612
+ }
613
+ ),
614
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.kind === "openapi" ? item.apiPath.replace(/^\/api\//, "") : labelForDoc(item.file) })
615
+ ] }) }, `p-${String(index)}`);
616
+ }) });
617
+ }
618
+ function DocsSidebar({
619
+ nav,
620
+ resolveHref = defaultResolveHref
621
+ }) {
622
+ return /* @__PURE__ */ jsxRuntime.jsx("nav", { style: { padding: "20px 16px" }, children: nav.map((tab, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: 18 }, children: [
623
+ /* @__PURE__ */ jsxRuntime.jsx(
624
+ "div",
625
+ {
626
+ style: {
627
+ fontSize: 13,
628
+ fontWeight: 800,
629
+ color: "var(--color-fd-foreground)",
630
+ marginBottom: 4
631
+ },
632
+ children: tab.title
633
+ }
634
+ ),
635
+ /* @__PURE__ */ jsxRuntime.jsx(Items, { items: tab.items, depth: 0, resolveHref })
636
+ ] }, `t-${String(index)}`)) });
637
+ }
638
+
639
+ exports.Accordion = Accordion;
640
+ exports.AccordionGroup = AccordionGroup;
641
+ exports.AuthScreen = AuthScreen;
642
+ exports.Callout = Callout;
643
+ exports.Card = Card;
644
+ exports.CardGroup = CardGroup;
645
+ exports.DocsSidebar = DocsSidebar;
646
+ exports.ErrorScreen = ErrorScreen;
647
+ exports.Info = Info;
648
+ exports.MethodBadge = MethodBadge;
649
+ exports.Note = Note;
650
+ exports.Step = Step;
651
+ exports.Steps = Steps;
652
+ exports.Tip = Tip;
653
+ exports.Warning = Warning;
654
+ exports.apiMethodBadges = apiMethodBadges;
655
+ exports.apiOperationLayout = apiOperationLayout;
656
+ exports.authErrorMessage = authErrorMessage;
657
+ exports.docsIcon = docsIcon;
658
+ exports.errorPreset = errorPreset;
659
+ exports.mdxComponents = mdxComponents;
660
+ //# sourceMappingURL=ui.cjs.map
661
+ //# sourceMappingURL=ui.cjs.map