@djangocfg/ui-tools 2.1.285 → 2.1.287
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DocsLayout-BCVU6TTX.cjs +2027 -0
- package/dist/DocsLayout-BCVU6TTX.cjs.map +1 -0
- package/dist/DocsLayout-ERETJLLV.mjs +2020 -0
- package/dist/DocsLayout-ERETJLLV.mjs.map +1 -0
- package/dist/{PlaygroundLayout-O52C6HK5.css → DocsLayout-MBFIB4NO.css} +1 -1
- package/dist/{PrettyCode.client-SGDGQTYT.cjs → PrettyCode.client-5GABIN2I.cjs} +57 -35
- package/dist/PrettyCode.client-5GABIN2I.cjs.map +1 -0
- package/dist/{PrettyCode.client-DW5LTG47.mjs → PrettyCode.client-IZTXXYHG.mjs} +57 -35
- package/dist/PrettyCode.client-IZTXXYHG.mjs.map +1 -0
- package/dist/chunk-IULI4XII.cjs +1129 -0
- package/dist/chunk-IULI4XII.cjs.map +1 -0
- package/dist/chunk-VZGQC3NG.mjs +1100 -0
- package/dist/chunk-VZGQC3NG.mjs.map +1 -0
- package/dist/index.cjs +88 -552
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -6
- package/dist/index.d.ts +18 -6
- package/dist/index.mjs +25 -496
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/tools/OpenapiViewer/.claude/.sidecar/activity.jsonl +6 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/history/2026-04-22.md +35 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/map_cache.json +30 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/review.md +35 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/scan.log +3 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/tasks/T-001.md +18 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/tasks/T-002.md +18 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/tasks/T-003.md +18 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/tasks/T-004.md +18 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/tasks/T-005.md +18 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/usage.json +5 -0
- package/src/tools/OpenapiViewer/.claude/project-map.md +23 -0
- package/src/tools/OpenapiViewer/OpenapiViewer.story.tsx +28 -2
- package/src/tools/OpenapiViewer/README.md +104 -51
- package/src/tools/OpenapiViewer/components/DocsLayout/ApiIntroSection.tsx +64 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/DocsView.tsx +137 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc.tsx +268 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/SchemaCopyMenu.tsx +139 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar.tsx +211 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/SlideInPlayground.tsx +101 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/TryItSheet.tsx +57 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/anchor.ts +11 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/grouping.ts +71 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/index.tsx +166 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/schemaFields.ts +121 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/sidebarLabel.ts +60 -0
- package/src/tools/OpenapiViewer/components/index.ts +5 -2
- package/src/tools/OpenapiViewer/components/shared/BodyFormEditor.tsx +422 -0
- package/src/tools/OpenapiViewer/components/shared/EndpointDraftSync.tsx +108 -0
- package/src/tools/OpenapiViewer/components/shared/EndpointResetButton.tsx +50 -0
- package/src/tools/OpenapiViewer/components/{PlaygroundLayout → shared}/RequestPanel.tsx +174 -87
- package/src/tools/OpenapiViewer/components/shared/SendButton.tsx +91 -0
- package/src/tools/OpenapiViewer/components/{PlaygroundLayout → shared}/ui.tsx +5 -4
- package/src/tools/OpenapiViewer/context/PlaygroundContext.tsx +82 -8
- package/src/tools/OpenapiViewer/hooks/useEndpointDraft.ts +142 -0
- package/src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts +126 -13
- package/src/tools/OpenapiViewer/index.tsx +3 -7
- package/src/tools/OpenapiViewer/lazy.tsx +6 -27
- package/src/tools/OpenapiViewer/types.ts +44 -0
- package/src/tools/OpenapiViewer/utils/formatters.ts +2 -23
- package/src/tools/OpenapiViewer/utils/index.ts +3 -1
- package/src/tools/OpenapiViewer/utils/schemaExport.ts +206 -0
- package/src/tools/OpenapiViewer/utils/url.ts +202 -0
- package/src/tools/PrettyCode/PrettyCode.client.tsx +42 -8
- package/src/tools/PrettyCode/index.tsx +6 -0
- package/dist/PlaygroundLayout-DHUATCHB.cjs +0 -798
- package/dist/PlaygroundLayout-DHUATCHB.cjs.map +0 -1
- package/dist/PlaygroundLayout-NONWOVQR.mjs +0 -791
- package/dist/PlaygroundLayout-NONWOVQR.mjs.map +0 -1
- package/dist/PrettyCode.client-DW5LTG47.mjs.map +0 -1
- package/dist/PrettyCode.client-SGDGQTYT.cjs.map +0 -1
- package/dist/chunk-5FKE7OME.cjs +0 -369
- package/dist/chunk-5FKE7OME.cjs.map +0 -1
- package/dist/chunk-BKWDHJKF.mjs +0 -356
- package/dist/chunk-BKWDHJKF.mjs.map +0 -1
- package/src/tools/OpenapiViewer/components/PlaygroundLayout/EndpointList.tsx +0 -228
- package/src/tools/OpenapiViewer/components/PlaygroundLayout/index.tsx +0 -107
- /package/dist/{PlaygroundLayout-O52C6HK5.css.map → DocsLayout-MBFIB4NO.css.map} +0 -0
- /package/src/tools/OpenapiViewer/components/{PlaygroundLayout → shared}/ResponsePanel.tsx +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts","../src/tools/OpenapiViewer/hooks/useEndpointDraft.ts","../src/tools/OpenapiViewer/components/shared/EndpointDraftSync.tsx","../src/tools/OpenapiViewer/components/shared/ui.tsx","../src/tools/OpenapiViewer/components/DocsLayout/anchor.ts","../src/tools/OpenapiViewer/components/DocsLayout/sidebarLabel.ts","../src/tools/OpenapiViewer/components/DocsLayout/Sidebar.tsx","../src/tools/OpenapiViewer/components/DocsLayout/SchemaCopyMenu.tsx","../src/tools/OpenapiViewer/components/DocsLayout/ApiIntroSection.tsx","../src/tools/OpenapiViewer/components/DocsLayout/schemaFields.ts","../src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc.tsx","../src/tools/OpenapiViewer/components/DocsLayout/DocsView.tsx","../src/tools/OpenapiViewer/components/shared/BodyFormEditor.tsx","../src/tools/OpenapiViewer/components/shared/EndpointResetButton.tsx","../src/tools/OpenapiViewer/components/shared/RequestPanel.tsx","../src/tools/OpenapiViewer/components/shared/ResponsePanel.tsx","../src/tools/OpenapiViewer/components/shared/SendButton.tsx","../src/tools/OpenapiViewer/components/DocsLayout/SlideInPlayground.tsx","../src/tools/OpenapiViewer/components/DocsLayout/TryItSheet.tsx","../src/tools/OpenapiViewer/components/DocsLayout/index.tsx"],"names":["__name","joinUrl","useState","useMemo","dereferenceSchema","resolveBaseUrl","useEffect","consola","useCallback","useRef","usePlaygroundContext","jsx","cn","jsxs","React","ChevronRight","relativePath","deduplicateEndpoints","Combobox","Search","Input","Tooltip","TooltipTrigger","TooltipContent","toMarkdown","toCompactJson","toRawJson","formatBytes","DropdownMenu","DropdownMenuTrigger","Button","Sparkles","ChevronDown","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","Check","MarkdownMessage","endpointToMarkdown","Link2","CopyButton","Play","DocsView","MAX_DEPTH","Switch","Textarea","Minus","Plus","RotateCcw","isValidJson","resolveAbsolute","findApiKeyById","parseRequestHeaders","Send","Fragment","Key","Terminal","PrettyCode_default","Loader2","WifiOff","JsonTree_default","UrlBuilder","AlertCircle","SidePanel","ResponsiveSheet","ResponsiveSheetContent","ResponsiveSheetHeader","ResponsiveSheetTitle","useMediaQuery","Skeleton","TooltipProvider"],"mappings":"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","file":"DocsLayout-BCVU6TTX.cjs","sourcesContent":["'use client';\n\nimport consola from 'consola';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { ApiEndpoint, OpenApiInfo, OpenApiSchema, SchemaSource, UseOpenApiSchemaReturn } from '../types';\nimport { dereferenceSchema } from '../utils/schemaExport';\nimport { joinUrl, resolveBaseUrl } from '../utils/url';\n\n// ─── JSON Schema → example value ──────────────────────────────────────────────\n\ntype JsonSchemaNode = Record<string, unknown> & {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n example?: unknown;\n default?: unknown;\n format?: string;\n};\n\n/** Walk a JSON Schema and build a realistic-looking example value. */\nfunction exampleFromSchema(schema: JsonSchemaNode | undefined, depth = 0): unknown {\n if (!schema || depth > 8) return null;\n\n // Respect schema-provided examples first — no need to invent a value\n // when the spec author already did the work.\n if (schema.example !== undefined) return schema.example;\n if (schema.default !== undefined) return schema.default;\n if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0];\n\n switch (schema.type) {\n case 'object': {\n const out: Record<string, unknown> = {};\n const props = schema.properties ?? {};\n for (const [k, v] of Object.entries(props)) {\n out[k] = exampleFromSchema(v, depth + 1);\n }\n return out;\n }\n case 'array':\n return [exampleFromSchema(schema.items, depth + 1)];\n case 'integer':\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'string':\n if (schema.format === 'date-time') return new Date().toISOString();\n if (schema.format === 'date') return new Date().toISOString().slice(0, 10);\n if (schema.format === 'email') return 'user@example.com';\n if (schema.format === 'uri' || schema.format === 'url') return 'https://example.com';\n if (schema.format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n return '';\n default:\n // No type (or composed schema like allOf/oneOf we don't unpack) —\n // fall back to an empty object rather than ``null`` so the resulting\n // JSON is still valid-looking.\n if (schema.properties) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema.properties)) {\n out[k] = exampleFromSchema(v, depth + 1);\n }\n return out;\n }\n return null;\n }\n}\n\n// HTTP methods to extract from OpenAPI schema\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n// Extract endpoints from OpenAPI schema (all methods). ``baseUrl`` is\n// resolved by the caller via ``resolveBaseUrl`` — we just paste it onto\n// the front of each path here.\nconst extractEndpoints = (schema: OpenApiSchema, baseUrl: string): ApiEndpoint[] => {\n const endpoints: ApiEndpoint[] = [];\n\n if (!schema.paths) return [];\n\n for (const [path, methods] of Object.entries(schema.paths)) {\n for (const method of HTTP_METHODS) {\n const op = (methods as any)[method];\n if (!op) continue;\n\n const methodUpper = method.toUpperCase();\n const summary = (op.summary || '').trim();\n const description = op.description || summary || `${methodUpper} ${path}`;\n const category = op.tags?.[0] || 'Other';\n\n const parameters: Array<{\n name: string;\n type: string;\n required: boolean;\n description?: string;\n }> = [];\n\n // Collect parameters (path-level + operation-level)\n const allParams = [...((methods as any).parameters || []), ...(op.parameters || [])];\n for (const param of allParams) {\n parameters.push({\n name: param.name,\n type: param.schema?.type || 'string',\n required: param.required || false,\n description: param.description,\n });\n }\n\n // Collect responses\n const responses: Array<{\n code: string;\n description: string;\n }> = [];\n\n if (op.responses) {\n for (const [code, response] of Object.entries(op.responses)) {\n responses.push({\n code,\n description: (response as any).description || `Response ${code}`,\n });\n }\n }\n\n // Extract request body info — keep the dereferenced schema so\n // downstream UI can render a fields table and generate a starter\n // example instead of showing an opaque ``object`` / ``array`` tag.\n let requestBody: ApiEndpoint['requestBody'];\n if (op.requestBody) {\n const content = op.requestBody.content;\n const mediaType = content?.['application/json'] || content?.[Object.keys(content || {})[0]];\n const rawSchema = mediaType?.schema as JsonSchemaNode | undefined;\n requestBody = {\n type: rawSchema?.type || 'object',\n description: op.requestBody.description,\n schema: rawSchema,\n example: rawSchema\n ? JSON.stringify(exampleFromSchema(rawSchema), null, 2)\n : undefined,\n };\n }\n\n const endpoint: ApiEndpoint = {\n name: path.split('/').pop() || path,\n method: methodUpper,\n path: baseUrl ? joinUrl(baseUrl, path) : path,\n summary,\n description,\n category,\n parameters: parameters.length > 0 ? parameters : undefined,\n requestBody,\n responses: responses.length > 0 ? responses : undefined,\n };\n\n endpoints.push(endpoint);\n }\n }\n\n return endpoints;\n};\n\n// Get unique categories from endpoints\nconst getCategories = (endpoints: ApiEndpoint[]): string[] => {\n const categories = new Set<string>();\n endpoints.forEach((endpoint) => categories.add(endpoint.category));\n return Array.from(categories).sort();\n};\n\n// Fetch schema from URL\nconst fetchSchema = async (url: string): Promise<OpenApiSchema> => {\n const response = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch schema: ${response.statusText}`);\n }\n return response.json();\n};\n\ninterface UseOpenApiSchemaProps {\n schemas: SchemaSource[];\n defaultSchemaId?: string;\n /** Global base URL override from ``PlaygroundConfig.baseUrl``.\n * Per-schema ``SchemaSource.baseUrl`` takes precedence over this. */\n baseUrl?: string;\n}\n\nexport default function useOpenApiSchema({\n schemas,\n defaultSchemaId,\n baseUrl: configBaseUrl,\n}: UseOpenApiSchemaProps): UseOpenApiSchemaReturn {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [currentSchemaId, setCurrentSchemaId] = useState<string>(\n defaultSchemaId || schemas[0]?.id\n );\n const [loadedSchemas, setLoadedSchemas] = useState<Map<string, OpenApiSchema>>(\n new Map()\n );\n\n const currentSchema = useMemo(\n () => schemas.find((s) => s.id === currentSchemaId) || null,\n [schemas, currentSchemaId]\n );\n\n const currentOpenApiSchema = useMemo(\n () => (currentSchemaId ? loadedSchemas.get(currentSchemaId) : null),\n [loadedSchemas, currentSchemaId]\n );\n\n // Dereference once per schema load so endpoint extraction sees fully\n // resolved ``$ref`` graphs. The raw schema is still exposed via\n // ``rawSchema`` for Copy-for-AI (juniors may want to hand the raw\n // document to an LLM and have it resolve refs itself).\n const dereferencedSchema = useMemo(\n () => (currentOpenApiSchema ? dereferenceSchema(currentOpenApiSchema) : null),\n [currentOpenApiSchema],\n );\n\n // Resolve base URL with priority chain. Centralised in ``resolveBaseUrl``\n // so the same logic is reused by the schema-export utilities.\n const resolvedBaseUrl = useMemo(\n () =>\n resolveBaseUrl({\n schemaSource: currentSchema?.baseUrl,\n config: configBaseUrl,\n fromServers: currentOpenApiSchema?.servers?.[0]?.url,\n }),\n [currentSchema?.baseUrl, configBaseUrl, currentOpenApiSchema],\n );\n\n const endpoints = useMemo(\n () => (dereferencedSchema ? extractEndpoints(dereferencedSchema, resolvedBaseUrl) : []),\n [dereferencedSchema, resolvedBaseUrl]\n );\n\n const categories = useMemo(() => getCategories(endpoints), [endpoints]);\n\n const schemaInfo = useMemo<OpenApiInfo | null>(() => {\n if (!currentOpenApiSchema?.info) return null;\n const { title, version, description } = currentOpenApiSchema.info;\n return {\n title,\n version,\n description,\n servers: currentOpenApiSchema.servers,\n };\n }, [currentOpenApiSchema]);\n\n // Load schema when current schema changes\n useEffect(() => {\n if (!currentSchema) return;\n\n // Skip if already loaded\n if (loadedSchemas.has(currentSchema.id)) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n fetchSchema(currentSchema.url)\n .then((schema) => {\n setLoadedSchemas((prev) => new Map(prev).set(currentSchema.id, schema));\n consola.success(`Schema loaded: ${currentSchema.name}`);\n setLoading(false);\n })\n .catch((err) => {\n consola.error(`Error loading schema from ${currentSchema.url}:`, err);\n setError(err instanceof Error ? err.message : 'Failed to load schema');\n setLoading(false);\n });\n }, [currentSchema, loadedSchemas]);\n\n const setCurrentSchema = useCallback((schemaId: string) => {\n setCurrentSchemaId(schemaId);\n }, []);\n\n const refresh = useCallback(() => {\n if (!currentSchema) return;\n\n setLoading(true);\n setError(null);\n\n // Remove from cache to force reload\n setLoadedSchemas((prev) => {\n const next = new Map(prev);\n next.delete(currentSchema.id);\n return next;\n });\n\n fetchSchema(currentSchema.url)\n .then((schema) => {\n setLoadedSchemas((prev) => new Map(prev).set(currentSchema.id, schema));\n consola.success(`Schema refreshed: ${currentSchema.name}`);\n setLoading(false);\n })\n .catch((err) => {\n consola.error(`Error refreshing schema from ${currentSchema.url}:`, err);\n setError(err instanceof Error ? err.message : 'Failed to refresh schema');\n setLoading(false);\n });\n }, [currentSchema]);\n\n return {\n loading,\n error,\n endpoints,\n categories,\n schemas,\n currentSchema,\n schemaInfo,\n rawSchema: currentOpenApiSchema ?? null,\n // Consumers expect ``undefined`` when no base URL was resolved (for\n // conditional ``{ baseUrl?: … }`` plumbing). Turn the empty-string\n // convention from the resolver into undefined at the API boundary.\n resolvedBaseUrl: resolvedBaseUrl || undefined,\n setCurrentSchema,\n refresh,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ApiEndpoint } from '../types';\n\n/**\n * Per-endpoint draft kept in localStorage so user input survives across\n * reloads and across switching back-and-forth between endpoints.\n *\n * Scoped by ``schemaId`` + ``method`` + ``path`` — two endpoints on the\n * same path with different methods don't share drafts. Two different\n * APIs don't collide either.\n *\n * Storage shape:\n * { parameters: { [name]: string }, requestBody: string }\n *\n * Implementation note: we deliberately DO NOT build on top of\n * ``useLocalStorage`` here. That hook's ``setValue`` callback reference\n * changes whenever its internal state changes, and when EndpointDraftSync\n * mirrors context → draft, the chain\n * state change ⇒ persist call ⇒ hook state change ⇒ new callback ⇒\n * effect rerun ⇒ persist call …\n * blew up into a maximum-update-depth loop. Writing straight to\n * ``localStorage`` with a stable ref-based writer breaks the cycle.\n */\nexport interface EndpointDraft {\n parameters: Record<string, string>;\n requestBody: string;\n}\n\nconst EMPTY_DRAFT: EndpointDraft = { parameters: {}, requestBody: '' };\n\nfunction storageKey(schemaId: string | null, ep: ApiEndpoint | null): string | null {\n if (!schemaId || !ep) return null;\n return `openapi-playground:draft:${schemaId}:${ep.method}:${ep.path}`;\n}\n\nfunction readDraft(key: string | null): EndpointDraft {\n if (!key || typeof window === 'undefined') return EMPTY_DRAFT;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return EMPTY_DRAFT;\n const parsed = JSON.parse(raw) as Partial<EndpointDraft>;\n return {\n parameters: parsed?.parameters ?? {},\n requestBody: typeof parsed?.requestBody === 'string' ? parsed.requestBody : '',\n };\n } catch {\n return EMPTY_DRAFT;\n }\n}\n\nfunction writeDraft(key: string | null, value: EndpointDraft): void {\n if (!key || typeof window === 'undefined') return;\n try {\n // Skip writes for empty drafts — reduces storage noise and keeps\n // \"never edited\" endpoints out of storage entirely.\n if (Object.keys(value.parameters).length === 0 && !value.requestBody) {\n window.localStorage.removeItem(key);\n return;\n }\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Quota / private mode — silently drop; UI state still works.\n }\n}\n\nexport interface UseEndpointDraftResult {\n /** Draft snapshot loaded on mount / endpoint change. Does not update\n * as the user types — the caller owns the \"live\" state (context). */\n draft: EndpointDraft;\n /** Persist the current parameters. Safe to call on every change;\n * writes skip when the endpoint has no key yet. */\n setParameters: (params: Record<string, string>) => void;\n setRequestBody: (body: string) => void;\n /** Wipe the persisted draft for the current endpoint. */\n reset: () => void;\n}\n\nexport function useEndpointDraft(\n schemaId: string | null,\n endpoint: ApiEndpoint | null,\n): UseEndpointDraftResult {\n const key = storageKey(schemaId, endpoint);\n\n // ``draft`` is reloaded from storage only when the key changes —\n // not when we write. Writes don't need to come back to us because\n // the caller keeps the live state and re-reads on key change.\n const [draft, setDraftSnapshot] = useState<EndpointDraft>(() => readDraft(key));\n\n // Track the last loaded key so we reload exactly once per endpoint.\n const loadedKeyRef = useRef<string | null>(key);\n useEffect(() => {\n if (loadedKeyRef.current === key) return;\n loadedKeyRef.current = key;\n setDraftSnapshot(readDraft(key));\n }, [key]);\n\n // Keep a ref of the current key so the writers below stay stable\n // across renders — React callback identity was the root cause of\n // the infinite render loop we had before.\n const keyRef = useRef(key);\n useEffect(() => {\n keyRef.current = key;\n }, [key]);\n\n // Same for the latest full draft value — both writers need to merge\n // their field into the last known shape before writing.\n const latestRef = useRef<EndpointDraft>(draft);\n useEffect(() => {\n latestRef.current = draft;\n }, [draft]);\n\n const setParameters = useCallback((params: Record<string, string>) => {\n const next: EndpointDraft = {\n parameters: params,\n requestBody: latestRef.current.requestBody,\n };\n latestRef.current = next;\n writeDraft(keyRef.current, next);\n }, []);\n\n const setRequestBody = useCallback((body: string) => {\n const next: EndpointDraft = {\n parameters: latestRef.current.parameters,\n requestBody: body,\n };\n latestRef.current = next;\n writeDraft(keyRef.current, next);\n }, []);\n\n const reset = useCallback(() => {\n latestRef.current = EMPTY_DRAFT;\n if (keyRef.current && typeof window !== 'undefined') {\n try { window.localStorage.removeItem(keyRef.current); } catch { /* noop */ }\n }\n setDraftSnapshot(EMPTY_DRAFT);\n }, []);\n\n return { draft, setParameters, setRequestBody, reset };\n}\n","'use client';\n\nimport React, { useEffect, useRef } from 'react';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { useEndpointDraft } from '../../hooks/useEndpointDraft';\n\ninterface EndpointDraftSyncProps {\n /** Active schema id (so drafts don't bleed between different APIs).\n * When null — drafts are disabled (hook returns empty draft, writes\n * are no-ops). Pass the current schema's ``id`` from useOpenApiSchema. */\n schemaId: string | null;\n}\n\n/**\n * Headless component: keeps ``RequestPanel`` state mirrored with a\n * per-endpoint draft in localStorage.\n *\n * Flow:\n * 1. On endpoint change ⇒ read draft ⇒ push into context state.\n * 2. On context state change (user edits params/body) ⇒ write draft.\n *\n * Step 1 is gated by a ref so \"just-loaded\" drafts don't immediately\n * trigger step 2. Step 2 additionally compares against a serialised\n * snapshot of the last persisted value so a re-render without a real\n * value change doesn't touch storage.\n *\n * Had an infinite-render-loop bug here earlier: the persist callbacks\n * were driven by ``useLocalStorage`` whose setter identity changed on\n * every internal state update, so depending on them from an effect\n * created a cycle. Fixed by making ``useEndpointDraft``'s writers\n * stable (ref-based), and by gating writes with value comparison below.\n */\nexport function EndpointDraftSync({ schemaId }: EndpointDraftSyncProps) {\n const { state, setParameters, setRequestBody, setActiveSchemaId } = usePlaygroundContext();\n const ep = state.selectedEndpoint;\n\n // Mirror schemaId into context so other components (e.g. the Reset\n // button in RequestPanel) can read it without receiving props from\n // a parent they don't own.\n useEffect(() => {\n setActiveSchemaId(schemaId);\n }, [schemaId, setActiveSchemaId]);\n\n const { draft, setParameters: persistParams, setRequestBody: persistBody } =\n useEndpointDraft(schemaId, ep);\n\n const lastLoadedKeyRef = useRef<string | null>(null);\n const lastPersistedParamsRef = useRef<string>('');\n const lastPersistedBodyRef = useRef<string>('');\n const currentKey = ep ? `${ep.method}|${ep.path}` : null;\n\n // Step 1 — hydrate context from draft on endpoint switch.\n //\n // IMPORTANT: only apply fields that actually exist in the saved draft.\n // SELECT_ENDPOINT in the reducer pre-fills ``requestBody`` with an\n // auto-generated schema example, and ``parameters`` with ``{}``.\n // If we blindly overwrite those with an empty draft we wipe the\n // example before the user ever sees it. Tracked via a bug: opening\n // POST /pet showed ``{\"key\":\"value\"}`` instead of the Pet example.\n useEffect(() => {\n if (!ep || !currentKey) {\n lastLoadedKeyRef.current = null;\n return;\n }\n if (lastLoadedKeyRef.current === currentKey) return;\n lastLoadedKeyRef.current = currentKey;\n\n const hasStoredParams =\n draft.parameters && Object.keys(draft.parameters).length > 0;\n const hasStoredBody = typeof draft.requestBody === 'string' && draft.requestBody !== '';\n\n if (hasStoredParams) {\n setParameters(draft.parameters);\n lastPersistedParamsRef.current = JSON.stringify(draft.parameters);\n } else {\n // Keep whatever the reducer put there; mirror it into the\n // \"last persisted\" ref so step-2 treats it as a baseline.\n lastPersistedParamsRef.current = JSON.stringify(state.parameters);\n }\n\n if (hasStoredBody) {\n setRequestBody(draft.requestBody);\n lastPersistedBodyRef.current = draft.requestBody;\n } else {\n lastPersistedBodyRef.current = state.requestBody;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentKey]);\n\n // Step 2 — persist user edits.\n useEffect(() => {\n if (!ep || lastLoadedKeyRef.current !== currentKey) return;\n const serialised = JSON.stringify(state.parameters);\n if (serialised === lastPersistedParamsRef.current) return;\n lastPersistedParamsRef.current = serialised;\n persistParams(state.parameters);\n }, [state.parameters, ep, currentKey, persistParams]);\n\n useEffect(() => {\n if (!ep || lastLoadedKeyRef.current !== currentKey) return;\n if (state.requestBody === lastPersistedBodyRef.current) return;\n lastPersistedBodyRef.current = state.requestBody;\n persistBody(state.requestBody);\n }, [state.requestBody, ep, currentKey, persistBody]);\n\n return null;\n}\n","'use client';\n\n/**\n * Shared primitive UI components used by the playground panels\n * (Request, Response) in both the slide-in and mobile-sheet surfaces.\n * Keep this file free of any business logic or context reads.\n */\n\nimport { ChevronRight } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\n// ─── Style helpers ────────────────────────────────────────────────────────────\n\nconst METHOD_STYLES: Record<string, string> = {\n GET: 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25',\n POST: 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25',\n PUT: 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25',\n PATCH: 'bg-orange-500/10 text-orange-600 dark:text-orange-400 border-orange-500/25',\n DELETE: 'bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/25',\n} as const;\n\nconst METHOD_FALLBACK = 'bg-muted text-muted-foreground border-border';\n\nexport function getMethodStyle(method: string): string {\n return METHOD_STYLES[method.toUpperCase()] ?? METHOD_FALLBACK;\n}\n\nexport function getStatusStyle(status: number): string {\n if (status >= 500) return 'bg-red-500/10 text-red-500 dark:text-red-400 border-red-500/25';\n if (status >= 400) return 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25';\n if (status >= 300) return 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25';\n return 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25';\n}\n\n// ``relativePath`` lives in utils/url.ts now — re-exported here so every\n// component that used to import it from ``./ui`` keeps working.\nexport { relativePath } from '../../utils/url';\n\n// ─── Atoms ────────────────────────────────────────────────────────────────────\n\nexport function MethodBadge({ method }: { method: string }) {\n return (\n <span className={cn(\n 'inline-flex shrink-0 items-center rounded border px-1.5 py-px',\n 'font-mono text-[10px] font-bold uppercase tracking-wider leading-none',\n getMethodStyle(method),\n )}>\n {method}\n </span>\n );\n}\n\nexport function StatusBadge({ status }: { status: number }) {\n return (\n <span className={cn(\n 'inline-flex items-center rounded border px-1.5 py-px',\n 'font-mono text-[11px] font-bold leading-none',\n getStatusStyle(status),\n )}>\n {status}\n </span>\n );\n}\n\nexport function SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60 select-none\">\n {children}\n </p>\n );\n}\n\nexport function Panel({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={cn('flex flex-col min-h-0 overflow-hidden', className)}>\n {children}\n </div>\n );\n}\n\nexport function ScrollArea({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={cn('flex-1 overflow-y-auto min-h-0', className)}>\n {children}\n </div>\n );\n}\n\nexport function PanelHeader({ title }: { title: string }) {\n return (\n <div className=\"shrink-0 border-b px-4 h-10 flex items-center\">\n <span className=\"text-[11px] font-semibold uppercase tracking-widest text-muted-foreground/50\">\n {title}\n </span>\n </div>\n );\n}\n\nexport function EmptyState({\n icon: Icon,\n text,\n className,\n}: {\n icon: React.ElementType;\n text: string;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center h-full gap-3 px-6 text-center',\n className,\n )}\n >\n <Icon className=\"h-7 w-7 text-muted-foreground/25\" />\n <p className=\"text-xs text-muted-foreground\">{text}</p>\n </div>\n );\n}\n\nexport function CollapsibleSection({\n label,\n action,\n children,\n defaultOpen = false,\n}: {\n label: React.ReactNode;\n action?: React.ReactNode;\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) {\n const [open, setOpen] = React.useState(defaultOpen);\n return (\n <div className=\"space-y-0\">\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60 hover:text-muted-foreground transition-colors py-1\"\n >\n <ChevronRight className={cn('h-3 w-3 transition-transform', open && 'rotate-90')} />\n {label}\n </button>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n {open && <div>{children}</div>}\n </div>\n );\n}\n","import type { ApiEndpoint } from '../../types';\n\nexport function endpointAnchor(ep: Pick<ApiEndpoint, 'method' | 'path'>): string {\n const slug = ep.path\n .replace(/^https?:\\/\\/[^/]+/, '')\n .replace(/[{}]/g, '')\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return `ep-${ep.method.toLowerCase()}-${slug}`;\n}\n","import type { ApiEndpoint } from '../../types';\n\n/**\n * Given a list of full endpoint paths, return the longest ``/``-aligned\n * prefix they all share. Used to strip the redundant group prefix\n * (``/api/v3/pet``) from sidebar labels so the meaningful tail is visible.\n *\n * Works on full URLs too — if every path begins with the same origin,\n * the origin is part of the common prefix and gets stripped.\n */\nexport function longestCommonPrefix(paths: string[]): string {\n if (paths.length === 0) return '';\n if (paths.length === 1) return '';\n\n const segments = paths.map((p) => p.split('/'));\n const minLen = Math.min(...segments.map((s) => s.length));\n\n const shared: string[] = [];\n for (let i = 0; i < minLen; i++) {\n const first = segments[0]![i];\n if (segments.every((s) => s[i] === first)) {\n shared.push(first!);\n } else {\n break;\n }\n }\n // Don't strip everything — we always want at least a leading \"/\" or\n // the method on the visible side. If the group has one endpoint,\n // the caller guards with paths.length check already.\n const joined = shared.join('/');\n // Trim trailing slash so the tail is clean (``/foo`` not ``foo``).\n return joined;\n}\n\n/**\n * Compute the label to show in the sidebar for a given endpoint.\n *\n * Priority:\n * 1. ``ep.summary`` — human-readable, from OpenAPI ``operation.summary``.\n * 2. The tail of ``ep.path`` after stripping the group's common prefix.\n * 3. Full ``ep.path`` if the group has a single endpoint (no prefix to strip).\n */\nexport function sidebarLabel(ep: ApiEndpoint, groupCommonPrefix: string): string {\n if (ep.summary) return ep.summary;\n\n if (groupCommonPrefix && ep.path.startsWith(groupCommonPrefix)) {\n const tail = ep.path.slice(groupCommonPrefix.length) || '/';\n return tail;\n }\n return relativePath(ep.path);\n}\n\nfunction relativePath(full: string): string {\n try { return new URL(full).pathname; } catch { return full; }\n}\n\n/** Tooltip text: always the definitive ``METHOD relative/path``. */\nexport function sidebarTooltip(ep: ApiEndpoint): string {\n return `${ep.method} ${relativePath(ep.path)}`;\n}\n","'use client';\n\nimport { Search } from 'lucide-react';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport {\n Combobox,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ApiEndpoint, OpenApiInfo, SchemaSource } from '../../types';\nimport { deduplicateEndpoints } from '../../utils/versionManager';\nimport { MethodBadge, ScrollArea } from '../shared/ui';\nimport { endpointAnchor } from './anchor';\nimport { longestCommonPrefix, sidebarLabel, sidebarTooltip } from './sidebarLabel';\n\ntype Group = {\n category: string;\n endpoints: ApiEndpoint[];\n /** Longest ``/``-aligned prefix shared by every endpoint in this group.\n * Stripped from labels that fall back to showing the path. */\n commonPrefix: string;\n};\n\nconst METHOD_ORDER: Record<string, number> = {\n GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4,\n};\n\nfunction groupEndpoints(list: ApiEndpoint[]): Group[] {\n const map = new Map<string, ApiEndpoint[]>();\n for (const ep of list) {\n const arr = map.get(ep.category) ?? [];\n arr.push(ep);\n map.set(ep.category, arr);\n }\n const groups: Group[] = Array.from(map.entries()).map(([category, endpoints]) => ({\n category,\n endpoints: [...endpoints].sort((a, b) => {\n const byPath = a.path.localeCompare(b.path);\n if (byPath !== 0) return byPath;\n return (METHOD_ORDER[a.method] ?? 99) - (METHOD_ORDER[b.method] ?? 99);\n }),\n commonPrefix: longestCommonPrefix(endpoints.map((e) => e.path)),\n }));\n // Alphabetical, but \"Other\" sinks to the bottom.\n groups.sort((a, b) => {\n if (a.category === 'Other') return 1;\n if (b.category === 'Other') return -1;\n return a.category.localeCompare(b.category);\n });\n return groups;\n}\n\nexport interface DocsSidebarProps {\n info: OpenApiInfo | null;\n endpoints: ApiEndpoint[];\n schemas: SchemaSource[];\n currentSchemaId: string | null;\n onSchemaChange: (id: string) => void;\n activeEndpointId: string | null;\n selectedVersion: string;\n onNavigate: (anchor: string) => void;\n}\n\nexport function DocsSidebar({\n info,\n endpoints,\n schemas,\n currentSchemaId,\n onSchemaChange,\n activeEndpointId,\n selectedVersion,\n onNavigate,\n}: DocsSidebarProps) {\n const [search, setSearch] = useState('');\n const [debounced, setDebounced] = useState('');\n\n useEffect(() => {\n const id = setTimeout(() => setDebounced(search), 120);\n return () => clearTimeout(id);\n }, [search]);\n\n const filteredGroups = useMemo(() => {\n let list = deduplicateEndpoints(endpoints, selectedVersion);\n if (debounced) {\n const q = debounced.toLowerCase();\n list = list.filter((e) =>\n e.summary.toLowerCase().includes(q) ||\n e.name.toLowerCase().includes(q) ||\n e.description.toLowerCase().includes(q) ||\n e.path.toLowerCase().includes(q),\n );\n }\n return groupEndpoints(list);\n }, [endpoints, debounced, selectedVersion]);\n\n const schemaOptions = useMemo(\n () => schemas.map((s) => ({ value: s.id, label: s.name })),\n [schemas],\n );\n const hasMultipleSchemas = schemas.length > 1;\n const apiTitle = info?.title ?? 'API Reference';\n\n return (\n <aside className=\"flex flex-col min-h-0 border-r bg-muted/10\">\n {/* Brand row */}\n <div className=\"shrink-0 border-b px-4 h-12 flex items-center gap-2\">\n <span className=\"text-[13px] font-semibold text-foreground truncate\">\n {apiTitle}\n </span>\n {info?.version && (\n <span className=\"font-mono text-[10px] text-muted-foreground/70 shrink-0\">\n v{info.version}\n </span>\n )}\n </div>\n\n {/* Controls */}\n <div className=\"shrink-0 border-b px-3 py-3 space-y-2\">\n {hasMultipleSchemas && (\n <Combobox\n options={schemaOptions}\n value={currentSchemaId ?? ''}\n onValueChange={(id) => id && onSchemaChange(id)}\n placeholder=\"Select API\"\n searchPlaceholder=\"Search APIs…\"\n emptyText=\"No APIs found\"\n className=\"w-full h-8 text-xs\"\n />\n )}\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground/50 pointer-events-none\" />\n <Input\n placeholder=\"Search endpoints…\"\n value={search}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}\n className=\"pl-8 h-8 text-xs\"\n />\n </div>\n </div>\n\n <ScrollArea>\n {filteredGroups.length === 0 ? (\n <div className=\"py-10 px-4 text-center text-xs text-muted-foreground\">\n {debounced\n ? `No endpoints match \"${debounced}\"`\n : 'No endpoints in this schema'}\n </div>\n ) : (\n <nav className=\"py-2\">\n {filteredGroups.map((group) => (\n <div key={group.category} className=\"mb-4 last:mb-2\">\n <div className=\"px-4 py-1.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground/50 select-none\">\n {group.category}\n </div>\n <div>\n {group.endpoints.map((ep) => {\n const anchor = endpointAnchor(ep);\n const isActive = activeEndpointId === anchor;\n const label = sidebarLabel(ep, group.commonPrefix);\n const tooltip = sidebarTooltip(ep);\n // Summary → sans-serif (reads like an outline).\n // Path-tail fallback → mono (reads like code).\n const useMono = !ep.summary;\n return (\n <Tooltip key={`${ep.method}-${ep.path}`} delayDuration={350}>\n <TooltipTrigger asChild>\n <button\n onClick={() => onNavigate(anchor)}\n aria-current={isActive ? 'location' : undefined}\n className={cn(\n 'relative group w-full text-left flex items-center gap-2 pl-4 pr-3 py-1.5 transition-colors',\n isActive\n ? 'bg-primary/10 text-foreground'\n : 'hover:bg-muted/40 text-foreground/75 hover:text-foreground',\n )}\n >\n {isActive && (\n <span className=\"absolute left-0 top-1 bottom-1 w-0.5 rounded-r bg-primary\" />\n )}\n <MethodBadge method={ep.method} />\n <span\n className={cn(\n 'truncate leading-tight flex-1 min-w-0',\n useMono ? 'font-mono text-[11px]' : 'text-[12px]',\n isActive && 'text-foreground font-medium',\n )}\n >\n {label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" className=\"font-mono text-[11px]\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n )}\n </ScrollArea>\n </aside>\n );\n}\n","'use client';\n\nimport { Check, ChevronDown, Sparkles } from 'lucide-react';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@djangocfg/ui-core/components';\n\nimport type { ApiEndpoint, OpenApiSchema } from '../../types';\nimport {\n formatBytes,\n toCompactJson,\n toMarkdown,\n toRawJson,\n} from '../../utils/schemaExport';\n\ntype Flavour = 'markdown' | 'compact' | 'raw';\n\nconst FLAVOUR_LABELS: Record<Flavour, { title: string; hint: string }> = {\n markdown: {\n title: 'Markdown for LLM',\n hint: 'Endpoints + params as prose. Smallest.',\n },\n compact: {\n title: 'Compact JSON',\n hint: 'Dereferenced, no examples, minified.',\n },\n raw: {\n title: 'Raw JSON',\n hint: 'Full OpenAPI document with $refs.',\n },\n};\n\ninterface SchemaCopyMenuProps {\n schema: OpenApiSchema | null;\n endpoints: ApiEndpoint[];\n /** Resolved base URL that gets embedded into the copy so the AI\n * receives working URLs, not the ones originally in ``schema.servers``. */\n baseUrl?: string;\n}\n\n/**\n * Per-schema copy dropdown. Shows three flavours tuned for different LLM\n * use-cases. We compute each flavour lazily (only on click) because\n * dereferencing + stringifying a large schema can be non-trivial — sizes\n * are displayed after the first successful copy, via a tiny cache.\n */\nexport function SchemaCopyMenu({ schema, endpoints, baseUrl }: SchemaCopyMenuProps) {\n const [sizeCache, setSizeCache] = useState<Partial<Record<Flavour, string>>>({});\n const [justCopied, setJustCopied] = useState<Flavour | null>(null);\n const [open, setOpen] = useState(false);\n\n const isReady = schema !== null && endpoints.length > 0;\n\n const build = useCallback(\n (flavour: Flavour): string => {\n if (!schema) return '';\n if (flavour === 'markdown') return toMarkdown(schema, endpoints, baseUrl);\n if (flavour === 'compact') return toCompactJson(schema, baseUrl);\n return toRawJson(schema, baseUrl);\n },\n [schema, endpoints, baseUrl],\n );\n\n const handleCopy = useCallback(\n async (flavour: Flavour) => {\n if (!isReady) return;\n const text = build(flavour);\n try {\n await navigator.clipboard.writeText(text);\n setSizeCache((prev) => ({ ...prev, [flavour]: formatBytes(text) }));\n setJustCopied(flavour);\n setTimeout(() => setJustCopied(null), 1500);\n setOpen(false);\n } catch {\n // Silent: clipboard perm denied. CopyButton handles the same case.\n }\n },\n [build, isReady],\n );\n\n const flavours = useMemo<Flavour[]>(() => ['markdown', 'compact', 'raw'], []);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 gap-1.5 text-xs\" disabled={!isReady}>\n <Sparkles className=\"h-3 w-3\" />\n Copy for AI\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <DropdownMenuLabel className=\"text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n Copy schema\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {flavours.map((f) => {\n const label = FLAVOUR_LABELS[f];\n const size = sizeCache[f];\n const isDone = justCopied === f;\n return (\n <DropdownMenuItem\n key={f}\n onClick={(e) => {\n e.preventDefault();\n void handleCopy(f);\n }}\n className=\"flex flex-col items-start gap-0.5 py-2 cursor-pointer\"\n >\n <div className=\"flex w-full items-center gap-2\">\n <span className=\"text-xs font-medium flex-1\">{label.title}</span>\n {isDone ? (\n <span className=\"inline-flex items-center gap-1 text-[10px] text-emerald-500\">\n <Check className=\"h-3 w-3\" /> Copied\n </span>\n ) : size ? (\n <span className=\"text-[10px] font-mono text-muted-foreground/70 tabular-nums\">\n {size}\n </span>\n ) : null}\n </div>\n <span className=\"text-[10px] text-muted-foreground/70 leading-snug\">\n {label.hint}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nimport { MarkdownMessage } from '../../../../components/markdown';\nimport type { ApiEndpoint, OpenApiInfo, OpenApiSchema } from '../../types';\nimport { SchemaCopyMenu } from './SchemaCopyMenu';\n\ninterface ApiIntroSectionProps {\n info: OpenApiInfo;\n schema: OpenApiSchema | null;\n endpoints: ApiEndpoint[];\n resolvedBaseUrl?: string;\n}\n\nexport function ApiIntroSection({ info, schema, endpoints, resolvedBaseUrl }: ApiIntroSectionProps) {\n return (\n <section className=\"pb-10 mb-10 border-b\">\n <div className=\"flex items-start justify-between gap-4 flex-wrap\">\n <div className=\"flex items-center gap-3 flex-wrap min-w-0\">\n <h1 className=\"text-3xl font-semibold tracking-tight text-foreground leading-tight\">\n {info.title}\n </h1>\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 font-mono text-[11px] text-muted-foreground\">\n v{info.version}\n </span>\n </div>\n <SchemaCopyMenu\n schema={schema}\n endpoints={endpoints}\n baseUrl={resolvedBaseUrl}\n />\n </div>\n\n {info.description && (\n <div className=\"mt-4 text-muted-foreground\">\n <MarkdownMessage content={info.description} />\n </div>\n )}\n\n {info.servers && info.servers.length > 0 && (\n <div className=\"mt-6 space-y-2\">\n <h4 className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n Base URL\n </h4>\n <div className=\"space-y-1.5\">\n {info.servers.map((s, i) => (\n <div key={`${s.url}-${i}`} className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-xs px-2 py-1 rounded bg-muted border\">\n {s.url}\n </code>\n {s.description && (\n <span className=\"text-xs text-muted-foreground\">\n {s.description}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </section>\n );\n}\n","/**\n * Flatten a JSON Schema node into a flat list of (name, type, required,\n * description) rows, ready to feed into the existing parameter table.\n *\n * Rules:\n * - ``type: object`` → one row per property.\n * - ``type: array`` → recurse into items; prefix each row with ``[].``\n * so the caller sees \"[].username string\" etc.\n * - Nested objects → dot-joined path: ``category.name``. We expand\n * one level; deeper graphs get a single summary\n * row (\"category.* (object)\") to keep the table\n * readable.\n *\n * This is a presentation helper — not a full form generator. It powers\n * the read-only fields table shown in the docs longread.\n */\n\ntype JsonSchemaNode = Record<string, unknown> & {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n description?: string;\n format?: string;\n};\n\nexport interface SchemaField {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\nconst MAX_DEPTH = 2;\n\nfunction describeType(node: JsonSchemaNode): string {\n if (!node.type && node.properties) return 'object';\n const base = node.type || 'any';\n if (base === 'array') {\n const itemType = node.items ? describeType(node.items) : 'any';\n return `array<${itemType}>`;\n }\n if (Array.isArray(node.enum) && node.enum.length > 0) {\n return `${base} enum`;\n }\n if (node.format) return `${base} (${node.format})`;\n return base;\n}\n\nexport function schemaToFields(\n schema: JsonSchemaNode | undefined,\n prefix = '',\n depth = 0,\n): SchemaField[] {\n if (!schema || depth > MAX_DEPTH) return [];\n\n // Unwrap arrays: show the inner item's fields, prefixed with ``[]``.\n if (schema.type === 'array') {\n if (!schema.items) {\n return [{ name: prefix || '[]', type: 'array', required: false }];\n }\n const inner = schemaToFields(schema.items, prefix ? `${prefix}[]` : '[]', depth);\n if (inner.length === 0) {\n return [\n {\n name: prefix || '[]',\n type: describeType(schema),\n required: false,\n description: schema.description,\n },\n ];\n }\n return inner;\n }\n\n // Primitives and unknown — single row.\n if (schema.type !== 'object' && !schema.properties) {\n return [\n {\n name: prefix || '(body)',\n type: describeType(schema),\n required: false,\n description: schema.description,\n },\n ];\n }\n\n // Objects — one row per property, recurse for nested objects/arrays.\n const required = new Set(schema.required ?? []);\n const rows: SchemaField[] = [];\n const props = schema.properties ?? {};\n for (const [key, node] of Object.entries(props)) {\n const fullName = prefix ? `${prefix}.${key}` : key;\n const isRequired = required.has(key);\n\n const isNestedExpandable =\n (node.type === 'object' && node.properties) ||\n (node.type === 'array' && node.items);\n\n if (isNestedExpandable && depth < MAX_DEPTH) {\n // Leaf summary row for the parent itself (so the user sees\n // its description) + recurse for inner fields.\n rows.push({\n name: fullName,\n type: describeType(node),\n required: isRequired,\n description: node.description,\n });\n rows.push(...schemaToFields(node, fullName, depth + 1));\n } else {\n rows.push({\n name: fullName,\n type: describeType(node),\n required: isRequired,\n description: node.description,\n });\n }\n }\n return rows;\n}\n","'use client';\n\nimport { Check, Link2, Play } from 'lucide-react';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { Button, CopyButton } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { MarkdownMessage } from '../../../../components/markdown';\nimport type { ApiEndpoint } from '../../types';\nimport { endpointToMarkdown } from '../../utils/schemaExport';\nimport { MethodBadge, relativePath } from '../shared/ui';\nimport { endpointAnchor } from './anchor';\nimport { schemaToFields, type SchemaField } from './schemaFields';\n\ninterface EndpointDocProps {\n endpoint: ApiEndpoint;\n /** Is this endpoint currently loaded in the sticky playground? */\n isLoadedInPlayground: boolean;\n onTryIt: () => void;\n}\n\nexport function EndpointDoc({ endpoint, isLoadedInPlayground, onTryIt }: EndpointDocProps) {\n const anchor = endpointAnchor(endpoint);\n const pathParams = endpoint.parameters?.filter((p) => endpoint.path.includes(`{${p.name}}`)) ?? [];\n const queryParams = endpoint.parameters?.filter((p) => !endpoint.path.includes(`{${p.name}}`)) ?? [];\n\n const [copied, setCopied] = useState(false);\n const copyAnchor = useCallback(() => {\n if (typeof window === 'undefined') return;\n const url = `${window.location.origin}${window.location.pathname}#${anchor}`;\n void navigator.clipboard?.writeText(url).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n });\n }, [anchor]);\n\n // Markdown summary used by the Copy-for-AI button. Memoised so moving\n // the mouse over the section doesn't rebuild the same string.\n const endpointMd = useMemo(() => endpointToMarkdown(endpoint), [endpoint]);\n\n return (\n <section\n id={anchor}\n data-endpoint-anchor={anchor}\n className=\"scroll-mt-24 py-10 first:pt-0\"\n >\n <header className=\"space-y-4\">\n <div className=\"flex items-start justify-between gap-3 flex-wrap\">\n <div className=\"flex items-baseline gap-2.5 min-w-0 flex-1 group/header\">\n <span className=\"shrink-0 translate-y-[2px]\">\n <MethodBadge method={endpoint.method} />\n </span>\n <code\n className=\"font-mono text-sm md:text-[15px] font-medium text-foreground leading-snug min-w-0\"\n style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }}\n >\n {relativePath(endpoint.path)}\n </code>\n <button\n type=\"button\"\n onClick={copyAnchor}\n title=\"Copy link to this section\"\n className={cn(\n 'shrink-0 p-1 rounded text-muted-foreground/40 hover:text-foreground hover:bg-muted transition-all',\n 'opacity-0 group-hover/header:opacity-100',\n copied && 'opacity-100 text-emerald-500',\n )}\n >\n {copied ? <Check className=\"h-3.5 w-3.5\" /> : <Link2 className=\"h-3.5 w-3.5\" />}\n </button>\n <CopyButton\n value={endpointMd}\n title=\"Copy endpoint as markdown (for AI)\"\n variant=\"ghost\"\n size=\"icon\"\n iconClassName=\"h-3.5 w-3.5\"\n className={cn(\n 'shrink-0 h-6 w-6 text-muted-foreground/40 hover:text-foreground',\n 'opacity-0 group-hover/header:opacity-100 focus-visible:opacity-100',\n )}\n />\n </div>\n <Button\n size=\"sm\"\n variant={isLoadedInPlayground ? 'secondary' : 'default'}\n onClick={onTryIt}\n className=\"shrink-0 h-8 text-xs gap-1.5 lg:flex hidden\"\n >\n <Play className=\"h-3 w-3\" />\n {isLoadedInPlayground ? 'Loaded' : 'Try it'}\n </Button>\n </div>\n {endpoint.description && (\n <div className=\"text-muted-foreground\">\n <MarkdownMessage content={endpoint.description} />\n </div>\n )}\n {/* Mobile/tablet: Try it sits under the description so it's always reachable */}\n <Button\n size=\"sm\"\n variant={isLoadedInPlayground ? 'secondary' : 'default'}\n onClick={onTryIt}\n className=\"lg:hidden h-8 text-xs gap-1.5\"\n >\n <Play className=\"h-3 w-3\" />\n {isLoadedInPlayground ? 'Loaded in playground' : 'Try it'}\n </Button>\n </header>\n\n {(pathParams.length > 0 || queryParams.length > 0 || endpoint.requestBody || endpoint.responses?.length) && (\n <div className=\"mt-8 space-y-8\">\n {pathParams.length > 0 && (\n <ParamTable title=\"Path parameters\" params={pathParams} />\n )}\n {queryParams.length > 0 && (\n <ParamTable title=\"Query parameters\" params={queryParams} />\n )}\n {endpoint.requestBody && (\n <RequestBodySection body={endpoint.requestBody} />\n )}\n {endpoint.responses && endpoint.responses.length > 0 && (\n <Subsection title=\"Responses\">\n <div className=\"divide-y border rounded-md overflow-hidden\">\n {endpoint.responses.map((r) => (\n <div\n key={r.code}\n className=\"grid grid-cols-[72px_minmax(0,1fr)] items-center gap-3 px-3 py-2.5 bg-background\"\n >\n <div className=\"flex justify-start\">\n <StatusTag code={r.code} />\n </div>\n <span className=\"text-sm text-muted-foreground leading-relaxed break-words\">\n {r.description}\n </span>\n </div>\n ))}\n </div>\n </Subsection>\n )}\n </div>\n )}\n </section>\n );\n}\n\nfunction RequestBodySection({ body }: { body: NonNullable<ApiEndpoint['requestBody']> }) {\n const fields = useMemo(() => schemaToFields(body.schema), [body.schema]);\n const typeLabel = body.schema\n ? body.type === 'array'\n ? `array<${(body.schema as { items?: { type?: string } }).items?.type ?? 'object'}>`\n : body.type\n : body.type;\n\n return (\n <Subsection title=\"Request body\">\n <div className=\"space-y-2\">\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-[11px] text-muted-foreground/80\">{typeLabel}</code>\n {body.description && (\n <span className=\"text-xs text-muted-foreground\">{body.description}</span>\n )}\n </div>\n {fields.length > 0 && <FieldsTable fields={fields} />}\n </div>\n </Subsection>\n );\n}\n\nfunction FieldsTable({ fields }: { fields: SchemaField[] }) {\n return (\n <div className=\"divide-y border rounded-md overflow-hidden\">\n {fields.map((f) => (\n <div key={f.name} className=\"px-3 py-2.5 bg-background space-y-1\">\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-xs font-medium text-foreground\">{f.name}</code>\n {f.required && (\n <span\n title=\"Required\"\n className=\"text-[9px] text-destructive font-bold leading-none\"\n >\n *\n </span>\n )}\n <code className=\"font-mono text-[11px] text-muted-foreground/70\">{f.type}</code>\n </div>\n {f.description && (\n <p className=\"text-xs text-muted-foreground leading-relaxed break-words\">\n {f.description}\n </p>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction Subsection({ title, children }: { title: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-2.5\">\n <h4 className=\"text-[10px] font-semibold uppercase tracking-[0.12em] text-muted-foreground/70\">\n {title}\n </h4>\n {children}\n </div>\n );\n}\n\nfunction ParamTable({\n title,\n params,\n}: {\n title: string;\n params: NonNullable<ApiEndpoint['parameters']>;\n}) {\n return (\n <Subsection title={title}>\n <div className=\"divide-y border rounded-md overflow-hidden\">\n {params.map((p) => (\n <div key={p.name} className=\"px-3 py-2.5 bg-background space-y-1\">\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-xs font-medium text-foreground\">\n {p.name}\n </code>\n {p.required && (\n <span\n title=\"Required\"\n className=\"text-[9px] text-destructive font-bold leading-none\"\n >\n *\n </span>\n )}\n <code className=\"font-mono text-[11px] text-muted-foreground/70\">\n {p.type}\n </code>\n </div>\n {p.description ? (\n <p className=\"text-xs text-muted-foreground leading-relaxed break-words\">\n {p.description}\n </p>\n ) : null}\n </div>\n ))}\n </div>\n </Subsection>\n );\n}\n\nfunction StatusTag({ code }: { code: string }) {\n const numeric = Number.parseInt(code, 10);\n const cls = !Number.isFinite(numeric)\n ? 'bg-muted text-muted-foreground border-border'\n : numeric >= 500\n ? 'bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/25'\n : numeric >= 400\n ? 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25'\n : numeric >= 300\n ? 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25'\n : 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25';\n return (\n <span className={cn(\n 'inline-flex items-center justify-center rounded border px-2 py-0.5 font-mono text-[11px] font-bold leading-none shrink-0 tabular-nums',\n cls,\n )}>\n {code}\n </span>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport type { ApiEndpoint, OpenApiInfo, OpenApiSchema } from '../../types';\nimport { deduplicateEndpoints } from '../../utils/versionManager';\nimport { ApiIntroSection } from './ApiIntroSection';\nimport { EndpointDoc } from './EndpointDoc';\nimport { endpointAnchor } from './anchor';\n\nexport interface DocsViewHandle {\n scrollToAnchor: (anchor: string) => void;\n}\n\ninterface DocsViewProps {\n info: OpenApiInfo | null;\n rawSchema: OpenApiSchema | null;\n resolvedBaseUrl?: string;\n endpoints: ApiEndpoint[];\n selectedVersion: string;\n loadedEndpoint: ApiEndpoint | null;\n onTryEndpoint: (ep: ApiEndpoint) => void;\n onActiveChange: (anchor: string | null) => void;\n}\n\nexport const DocsView = React.forwardRef<DocsViewHandle, DocsViewProps>(function DocsView(\n {\n info,\n rawSchema,\n resolvedBaseUrl,\n endpoints,\n selectedVersion,\n loadedEndpoint,\n onTryEndpoint,\n onActiveChange,\n },\n ref,\n) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const visibleEndpoints = useMemo(\n () => deduplicateEndpoints(endpoints, selectedVersion),\n [endpoints, selectedVersion],\n );\n\n // Scroll a given section into view. Imperative handle so the\n // sidebar (not a descendant) can trigger this without props drilling.\n const scrollToAnchor = useCallback((anchor: string) => {\n const root = scrollRef.current;\n if (!root) return;\n const el = root.querySelector<HTMLElement>(`[data-endpoint-anchor=\"${anchor}\"]`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }, []);\n\n React.useImperativeHandle(ref, () => ({ scrollToAnchor }), [scrollToAnchor]);\n\n // Scrollspy: pick the topmost endpoint section whose top is near the\n // upper third of the viewport. Runs on every scroll event (rAF-throttled)\n // — an IntersectionObserver has flaky behaviour for \"which one is active\"\n // when several sections overlap the root margin band at once.\n useEffect(() => {\n const root = scrollRef.current;\n if (!root) return;\n\n let rafId = 0;\n let lastActive: string | null = null;\n\n const compute = () => {\n rafId = 0;\n const sections = root.querySelectorAll<HTMLElement>('[data-endpoint-anchor]');\n if (sections.length === 0) return;\n const rootTop = root.getBoundingClientRect().top;\n const threshold = rootTop + root.clientHeight * 0.25;\n let active: string | null = null;\n for (const s of Array.from(sections)) {\n const top = s.getBoundingClientRect().top;\n if (top <= threshold) {\n active = s.dataset.endpointAnchor ?? null;\n } else {\n break;\n }\n }\n if (active !== lastActive) {\n lastActive = active;\n onActiveChange(active);\n }\n };\n\n const onScroll = () => {\n if (rafId) return;\n rafId = requestAnimationFrame(compute);\n };\n\n compute();\n root.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n root.removeEventListener('scroll', onScroll);\n if (rafId) cancelAnimationFrame(rafId);\n };\n }, [visibleEndpoints, onActiveChange]);\n\n return (\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto min-h-0\">\n <div className=\"mx-auto w-full max-w-[860px] px-6 md:px-10 lg:px-14 py-12\">\n {info && (\n <ApiIntroSection\n info={info}\n schema={rawSchema}\n endpoints={visibleEndpoints}\n resolvedBaseUrl={resolvedBaseUrl}\n />\n )}\n {visibleEndpoints.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">\n No endpoints to display.\n </div>\n ) : (\n <div className=\"divide-y divide-border/60\">\n {visibleEndpoints.map((ep) => {\n const isLoaded =\n loadedEndpoint?.method === ep.method && loadedEndpoint?.path === ep.path;\n return (\n <EndpointDoc\n key={`${ep.method}-${ep.path}`}\n endpoint={ep}\n isLoadedInPlayground={isLoaded}\n onTryIt={() => onTryEndpoint(ep)}\n />\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n});\n","'use client';\n\n/**\n * Form-based request body editor driven by JSON Schema.\n *\n * Replaces the ``{\"key\":\"value\"}`` textarea prompt with a real form:\n * one input per property, typed widgets for primitives, nested objects\n * indented, arrays with add/remove. The component is controlled — the\n * parent owns the body value (as any JSON) and persists to localStorage.\n *\n * Intentionally not a full JSON-Schema-Form: we don't cover oneOf/anyOf,\n * pattern validation, min/max — the playground just needs a usable\n * interactive shape. Users who hit a corner case can flip the ``JSON``\n * toggle in RequestPanel and edit raw.\n */\n\nimport { Minus, Plus } from 'lucide-react';\nimport React, { useCallback } from 'react';\n\nimport { Combobox, Input, Switch, Textarea } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { SectionLabel } from './ui';\n\ntype JsonSchemaNode = Record<string, unknown> & {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n description?: string;\n format?: string;\n};\n\nconst MAX_DEPTH = 6;\n\n// ─── Value helpers ────────────────────────────────────────────────────────────\n\nfunction defaultForSchema(schema: JsonSchemaNode | undefined): unknown {\n if (!schema) return null;\n if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0];\n switch (schema.type) {\n case 'object': {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema.properties ?? {})) {\n out[k] = defaultForSchema(v);\n }\n return out;\n }\n case 'array':\n return [];\n case 'integer':\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'string':\n return '';\n default:\n if (schema.properties) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema.properties)) {\n out[k] = defaultForSchema(v);\n }\n return out;\n }\n return '';\n }\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport interface BodyFormEditorProps {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\nexport function BodyFormEditor({ schema, value, onChange }: BodyFormEditorProps) {\n return (\n <SchemaField\n schema={schema}\n value={value}\n onChange={onChange}\n depth={0}\n required={false}\n />\n );\n}\n\n// ─── Recursive renderer ───────────────────────────────────────────────────────\n\ninterface SchemaFieldProps {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown) => void;\n depth: number;\n required: boolean;\n label?: string;\n}\n\nfunction SchemaField({ schema, value, onChange, depth, required, label }: SchemaFieldProps) {\n // Depth cutoff: collapse further nesting into a raw JSON textarea —\n // deeper forms get impossible to navigate and lose value for the UX\n // we're trying to offer (quick exploration).\n if (depth > MAX_DEPTH) {\n return <RawJsonField label={label} value={value} onChange={onChange} />;\n }\n\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n return <EnumField schema={schema} value={value} onChange={onChange} label={label} required={required} />;\n }\n\n switch (schema.type) {\n case 'object':\n return <ObjectField schema={schema} value={value} onChange={onChange} depth={depth} label={label} />;\n case 'array':\n return <ArrayField schema={schema} value={value} onChange={onChange} depth={depth} label={label} required={required} />;\n case 'boolean':\n return <BooleanField value={value} onChange={onChange} label={label} schema={schema} required={required} />;\n case 'integer':\n case 'number':\n return <NumberField value={value} onChange={onChange} label={label} schema={schema} required={required} />;\n case 'string':\n default:\n // Untyped / string-ish — plain text input. Covers the\n // \"body is a free-form string\" case too (e.g. text/plain).\n if (!schema.type && schema.properties) {\n return <ObjectField schema={schema} value={value} onChange={onChange} depth={depth} label={label} />;\n }\n return <StringField value={value} onChange={onChange} label={label} schema={schema} required={required} />;\n }\n}\n\n// ─── Primitive widgets ────────────────────────────────────────────────────────\n\nfunction FieldHeader({\n label,\n type,\n required,\n description,\n}: {\n label?: string;\n type: string;\n required: boolean;\n description?: string;\n}) {\n if (!label) return null;\n return (\n <div className=\"space-y-0.5\">\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{label}</span>\n {required && <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">{type}</span>\n </div>\n {description && (\n <p className=\"text-[10px] text-muted-foreground/70 leading-snug\">{description}</p>\n )}\n </div>\n );\n}\n\nfunction StringField({\n value, onChange, label, schema, required,\n}: {\n value: unknown;\n onChange: (next: string) => void;\n label?: string;\n schema: JsonSchemaNode;\n required: boolean;\n}) {\n const stringValue = typeof value === 'string' ? value : value == null ? '' : String(value);\n const placeholder = schema.format ? `${schema.type ?? 'string'} (${schema.format})` : schema.description || schema.type || 'string';\n return (\n <div className=\"space-y-1\">\n <FieldHeader label={label} type={schema.format ? `string (${schema.format})` : 'string'} required={required} description={schema.description} />\n <Input\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n}\n\nfunction NumberField({\n value, onChange, label, schema, required,\n}: {\n value: unknown;\n onChange: (next: number | null) => void;\n label?: string;\n schema: JsonSchemaNode;\n required: boolean;\n}) {\n const raw = value == null ? '' : String(value);\n const type = schema.type === 'integer' ? 'integer' : 'number';\n return (\n <div className=\"space-y-1\">\n <FieldHeader label={label} type={schema.format ? `${type} (${schema.format})` : type} required={required} description={schema.description} />\n <Input\n type=\"number\"\n value={raw}\n onChange={(e) => {\n const v = e.target.value;\n if (v === '') return onChange(null);\n const n = schema.type === 'integer' ? parseInt(v, 10) : parseFloat(v);\n onChange(Number.isNaN(n) ? null : n);\n }}\n placeholder={type}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n}\n\nfunction BooleanField({\n value, onChange, label, schema, required,\n}: {\n value: unknown;\n onChange: (next: boolean) => void;\n label?: string;\n schema: JsonSchemaNode;\n required: boolean;\n}) {\n const bool = value === true;\n return (\n <div className=\"flex items-start justify-between gap-3\">\n <FieldHeader label={label} type=\"boolean\" required={required} description={schema.description} />\n <Switch checked={bool} onCheckedChange={onChange} className=\"mt-0.5 shrink-0\" />\n </div>\n );\n}\n\nfunction EnumField({\n schema, value, onChange, label, required,\n}: {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown) => void;\n label?: string;\n required: boolean;\n}) {\n const options = (schema.enum ?? []).map((v) => ({\n value: String(v),\n label: String(v),\n }));\n const strValue = value == null ? '' : String(value);\n return (\n <div className=\"space-y-1\">\n <FieldHeader label={label} type={`${schema.type ?? 'enum'} enum`} required={required} description={schema.description} />\n <Combobox\n options={options}\n value={strValue}\n onValueChange={(v) => {\n // Preserve original type if schema declares integer/number.\n if (schema.type === 'integer') onChange(parseInt(v, 10));\n else if (schema.type === 'number') onChange(parseFloat(v));\n else onChange(v);\n }}\n placeholder=\"Select…\"\n searchPlaceholder=\"Search…\"\n className=\"h-8 text-xs\"\n />\n </div>\n );\n}\n\nfunction RawJsonField({\n label, value, onChange,\n}: {\n label?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n}) {\n const [text, setText] = React.useState(() => JSON.stringify(value ?? null, null, 2));\n // Resync when value changes from outside (e.g. endpoint switch).\n React.useEffect(() => {\n setText(JSON.stringify(value ?? null, null, 2));\n }, [value]);\n return (\n <div className=\"space-y-1\">\n {label && <SectionLabel>{label} (raw)</SectionLabel>}\n <Textarea\n value={text}\n onChange={(e) => {\n setText(e.target.value);\n try { onChange(JSON.parse(e.target.value)); } catch { /* keep last valid */ }\n }}\n className=\"font-mono text-[11px] min-h-[80px]\"\n rows={4}\n />\n </div>\n );\n}\n\n// ─── Composite widgets ────────────────────────────────────────────────────────\n\nfunction ObjectField({\n schema, value, onChange, depth, label,\n}: {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: Record<string, unknown>) => void;\n depth: number;\n label?: string;\n}) {\n const obj = (value && typeof value === 'object' && !Array.isArray(value))\n ? (value as Record<string, unknown>)\n : {};\n const required = new Set(schema.required ?? []);\n const entries = Object.entries(schema.properties ?? {});\n\n const setKey = useCallback(\n (key: string) => (next: unknown) => {\n onChange({ ...obj, [key]: next });\n },\n [obj, onChange],\n );\n\n if (entries.length === 0) {\n return <RawJsonField label={label} value={obj} onChange={onChange as (v: unknown) => void} />;\n }\n\n // Root-level object (depth === 0) renders flat; nested gets an\n // indented, bordered group so the hierarchy is visible.\n const wrapperClass = depth === 0\n ? 'space-y-3'\n : 'space-y-2 border-l-2 border-border/60 pl-3 ml-px';\n\n return (\n <div className=\"space-y-1.5\">\n {label && depth > 0 && (\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{label}</span>\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">object</span>\n </div>\n )}\n <div className={cn(wrapperClass)}>\n {entries.map(([key, subSchema]) => (\n <SchemaField\n key={key}\n schema={subSchema}\n value={obj[key]}\n onChange={setKey(key)}\n depth={depth + 1}\n required={required.has(key)}\n label={key}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ArrayField({\n schema, value, onChange, depth, label, required,\n}: {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown[]) => void;\n depth: number;\n label?: string;\n required: boolean;\n}) {\n const arr = Array.isArray(value) ? value : [];\n const items = schema.items ?? { type: 'string' };\n\n const addItem = () => onChange([...arr, defaultForSchema(items)]);\n const removeAt = (i: number) => onChange(arr.filter((_, idx) => idx !== i));\n const setAt = (i: number) => (next: unknown) =>\n onChange(arr.map((v, idx) => (idx === i ? next : v)));\n\n return (\n <div className=\"space-y-1.5\">\n {label && (\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{label}</span>\n {required && <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">\n {`array<${items.type ?? 'any'}>`}\n </span>\n </div>\n )}\n <div className=\"space-y-2 border-l-2 border-border/60 pl-3 ml-px\">\n {arr.length === 0 && (\n <p className=\"text-[10px] text-muted-foreground/50 italic\">Empty array</p>\n )}\n {arr.map((v, i) => (\n <div key={i} className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n <SchemaField\n schema={items}\n value={v}\n onChange={setAt(i)}\n depth={depth + 1}\n required={false}\n label={`${label ?? ''}[${i}]`}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => removeAt(i)}\n title=\"Remove item\"\n className=\"shrink-0 h-7 w-7 inline-flex items-center justify-center rounded-md text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors\"\n >\n <Minus className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={addItem}\n className=\"inline-flex items-center gap-1.5 text-[10px] text-muted-foreground hover:text-foreground transition-colors py-1\"\n >\n <Plus className=\"h-3 w-3\" />\n Add item\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { RotateCcw } from 'lucide-react';\nimport React, { useCallback } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { useEndpointDraft } from '../../hooks/useEndpointDraft';\n\n/**\n * \"Reset\" ghost button for the current endpoint's draft.\n *\n * Wipes both the in-memory context state (parameters + body) and the\n * persisted localStorage entry. We call reset() *after* clearing the\n * context so the EndpointDraftSync effect that mirrors state → storage\n * doesn't immediately re-create a now-empty draft with an empty object\n * (benign, but uglier in storage).\n */\nexport function EndpointResetButton() {\n const { state, setParameters, setRequestBody } = usePlaygroundContext();\n const ep = state.selectedEndpoint;\n const { reset } = useEndpointDraft(state.activeSchemaId, ep);\n\n const hasDraft =\n Object.keys(state.parameters).length > 0 || state.requestBody.length > 0;\n\n const onClick = useCallback(() => {\n setParameters({});\n setRequestBody('');\n reset();\n }, [setParameters, setRequestBody, reset]);\n\n if (!ep || !hasDraft) return null;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title=\"Reset parameters & body (keeps auth)\"\n className={cn(\n 'inline-flex items-center gap-1 text-[10px] text-muted-foreground',\n 'hover:text-foreground transition-colors',\n )}\n >\n <RotateCcw className=\"h-2.5 w-2.5\" />\n Reset\n </button>\n );\n}\n","'use client';\n\nimport { Key, Send, Sparkles, Terminal } from 'lucide-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Combobox,\n type ComboboxOption,\n Input,\n Textarea,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport PrettyCode from '../../../PrettyCode';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { findApiKeyById, isValidJson, parseRequestHeaders } from '../../utils';\nimport { resolveAbsolute } from '../../utils/url';\nimport { BodyFormEditor } from './BodyFormEditor';\nimport { EndpointResetButton } from './EndpointResetButton';\nimport {\n CollapsibleSection,\n EmptyState,\n ScrollArea,\n SectionLabel,\n relativePath,\n} from './ui';\n\n// ─── Param fields ─────────────────────────────────────────────────────────────\n\ntype Param = { name: string; type: string; required: boolean; description?: string };\n\nfunction ParamFields({ label, params }: { label: string; params: Param[] }) {\n const { state, setParameters } = usePlaygroundContext();\n\n function handleChange(name: string, value: string) {\n setParameters({ ...state.parameters, [name]: value });\n }\n\n return (\n <div className=\"space-y-2\">\n <SectionLabel>{label}</SectionLabel>\n <div className=\"space-y-2\">\n {params.map((p) => {\n const value = state.parameters[p.name] ?? '';\n const placeholder = p.description || p.name;\n return (\n <div key={p.name} className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{p.name}</span>\n {p.required && (\n <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>\n )}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">{p.type}</span>\n </div>\n <Input\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleChange(p.name, e.target.value)\n }\n placeholder={placeholder}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ─── RequestPanel ─────────────────────────────────────────────────────────────\n\nexport function RequestPanel() {\n const {\n state,\n apiKeys,\n apiKeysLoading,\n setRequestBody,\n setRequestHeaders,\n setSelectedApiKey,\n setManualApiToken,\n sendRequest,\n } = usePlaygroundContext();\n\n // Pre-compute every per-key view-model so the JSX stays a flat\n // render — no boolean math in the markup.\n const apiKeyOptions: ComboboxOption[] = useMemo(\n () =>\n apiKeys.map((k) => ({\n value: k.id,\n label: k.name || 'Unnamed key',\n // Surface the first 8 chars of the secret so the user\n // can tell two similarly-named keys apart at a glance.\n description: k.secret\n ? `${k.secret.slice(0, 8)}…`\n : undefined,\n })),\n [apiKeys],\n );\n const hasApiKeys = apiKeyOptions.length > 0;\n\n const ep = state.selectedEndpoint;\n\n // ── Data (hooks must not be conditional) ─────────────────────────────────\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n const curlCommand = useMemo(() => {\n if (!state.requestUrl) return '';\n // Resolve to an absolute URL so the snippet is runnable from a\n // shell. The live ``fetch`` inside the playground resolves the\n // relative form itself via the browser; copy-pasting to curl\n // doesn't get that treatment.\n const absoluteUrl = resolveAbsolute(state.requestUrl);\n const apiKey = state.selectedApiKey ? findApiKeyById(apiKeys, state.selectedApiKey) : null;\n const hdrs = parseRequestHeaders(state.requestHeaders);\n if (apiKey) hdrs['X-API-Key'] = apiKey.secret || apiKey.id;\n let cmd = `curl -X ${state.requestMethod} \"${absoluteUrl}\"`;\n Object.entries(hdrs).forEach(([k, v]) => { cmd += ` \\\\\\n -H \"${k}: ${v}\"`; });\n if (state.requestBody && state.requestMethod !== 'GET' && isJsonValid) {\n cmd += ` \\\\\\n -d '${state.requestBody}'`;\n }\n return cmd;\n }, [state, apiKeys, isJsonValid]);\n\n const pathParams = useMemo(\n () => ep?.parameters?.filter((p) => ep.path.includes(`{${p.name}}`)) ?? [],\n [ep],\n );\n const queryParams = useMemo(\n () => ep?.parameters?.filter((p) => !ep.path.includes(`{${p.name}}`)) ?? [],\n [ep],\n );\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const isSendDisabled = state.loading || !state.requestUrl || !isJsonValid;\n // Show the absolute URL in the meta row so the user sees exactly\n // what will go over the wire — same rewrite we do for cURL.\n const displayUrl = resolveAbsolute(state.requestUrl || ep?.path || '');\n const hasBody = ep?.method !== 'GET';\n const bodyType = ep?.requestBody?.type ?? '';\n const hasPathParams = pathParams.length > 0;\n const hasQueryParams = queryParams.length > 0;\n const hasCurl = Boolean(curlCommand);\n const epPath = ep ? relativePath(ep.path) : '';\n // Show the URL meta row only when it differs from the endpoint's\n // template shape — i.e. the user has substituted path params or the\n // URL host is worth showing explicitly.\n const urlChanged = displayUrl !== '' && displayUrl !== epPath;\n\n // ── Early return ──────────────────────────────────────────────────────────\n if (!ep) {\n return <EmptyState icon={Send} text=\"Select an endpoint to build a request\" />;\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Inline meta row — shows the effective URL when it differs\n from the endpoint's path template (e.g. after substituting\n path parameters), plus the Reset action. We dropped the\n full endpoint header because the containing surface (SidePanel\n in docs layout, column header in classic layout) already\n shows the method + path, and duplicating the Send button\n next to a full-width Send at the bottom read as confusing. */}\n {(urlChanged || ep) && (\n <div className=\"shrink-0 border-b px-4 py-2 bg-muted/10 flex items-center gap-2 min-h-[28px]\">\n {urlChanged ? (\n <span className=\"font-mono text-[10px] text-muted-foreground/60 break-all leading-snug truncate min-w-0 flex-1\">\n {displayUrl}\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n <EndpointResetButton />\n </div>\n )}\n\n {/* Scrollable fields */}\n <ScrollArea className=\"px-4 py-3 space-y-3\">\n\n {hasPathParams && <ParamFields label=\"Path Parameters\" params={pathParams} />}\n {hasQueryParams && <ParamFields label=\"Query Parameters\" params={queryParams} />}\n\n {/* Body */}\n {hasBody && (\n <BodySection\n schema={ep.requestBody?.schema}\n bodyType={bodyType}\n bodyDescription={ep.requestBody?.description}\n value={state.requestBody}\n onChange={setRequestBody}\n isJsonValid={isJsonValid}\n />\n )}\n\n {/* Auth & Headers — collapsed by default */}\n <CollapsibleSection\n label={\n <span className=\"inline-flex items-center gap-1\">\n <Key className=\"h-2.5 w-2.5\" />\n Auth & Headers\n </span>\n }\n >\n <div className=\"space-y-3 pt-2\">\n <div className=\"space-y-1.5\">\n <SectionLabel>API Key</SectionLabel>\n <Combobox\n options={apiKeyOptions}\n value={state.selectedApiKey ?? ''}\n onValueChange={(v) => setSelectedApiKey(v || null)}\n placeholder={\n apiKeysLoading\n ? 'Loading keys…'\n : hasApiKeys\n ? 'Select an API key'\n : 'No API keys yet'\n }\n searchPlaceholder=\"Search keys…\"\n emptyText=\"No matching key\"\n disabled={apiKeysLoading || !hasApiKeys}\n className=\"h-8\"\n />\n <p className=\"text-[10px] text-muted-foreground\">\n Picks are sent via the{' '}\n <span className=\"font-mono\">X-API-Key</span> header.\n </p>\n </div>\n <div className=\"space-y-1.5\">\n <SectionLabel>Bearer Token</SectionLabel>\n <Input\n type=\"password\"\n placeholder=\"Leave empty to use JWT from localStorage\"\n value={state.manualApiToken}\n onChange={(e) => setManualApiToken(e.target.value)}\n className=\"font-mono text-xs h-8\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <SectionLabel>Headers</SectionLabel>\n <Textarea\n value={state.requestHeaders}\n onChange={(e) => setRequestHeaders(e.target.value)}\n className=\"font-mono text-[11px] min-h-[60px] resize-y\"\n rows={3}\n />\n </div>\n </div>\n </CollapsibleSection>\n\n {/* cURL — collapsed by default. PrettyCode has its own\n hover-toolbar with Copy, so no duplicate action here. */}\n {hasCurl && (\n <CollapsibleSection\n label={\n <span className=\"inline-flex items-center gap-1\">\n <Terminal className=\"h-2.5 w-2.5\" />\n cURL\n </span>\n }\n >\n <div className=\"mt-2\">\n <PrettyCode\n data={curlCommand}\n language=\"bash\"\n isCompact\n maxLines={50}\n />\n </div>\n </CollapsibleSection>\n )}\n\n {/* Bottom breathing room — the Send footer lives outside\n this component (in SlideInPlayground / TryItSheet),\n so we just leave a little space so the last section\n doesn't crash against the container edge. */}\n <div className=\"h-4\" />\n </ScrollArea>\n </>\n );\n}\n\n// ─── Body section ─────────────────────────────────────────────────────────────\n\ninterface BodySectionProps {\n schema: Record<string, unknown> | undefined;\n bodyType: string;\n bodyDescription?: string;\n /** JSON-serialised body kept in context. Form edits are re-serialised\n * before being written back so one source of truth survives across\n * the two view modes. */\n value: string;\n onChange: (raw: string) => void;\n isJsonValid: boolean;\n}\n\ntype BodyViewMode = 'form' | 'json';\n\nfunction BodySection({ schema, bodyType, bodyDescription, value, onChange, isJsonValid }: BodySectionProps) {\n // Default to form view when we have a schema to drive it. Fall back\n // to raw JSON for schemaless endpoints (or binary bodies, etc.).\n const hasSchema = !!schema;\n const [mode, setMode] = React.useState<BodyViewMode>(hasSchema ? 'form' : 'json');\n\n // Parse the context's JSON string once per value change so the form\n // sees a structured object. Invalid JSON is tolerated — the form\n // simply shows empty fields until the user fixes it.\n const parsed = React.useMemo(() => {\n if (!value) return null;\n try { return JSON.parse(value); } catch { return null; }\n }, [value]);\n\n const handleFormChange = useCallback(\n (next: unknown) => {\n onChange(JSON.stringify(next, null, 2));\n },\n [onChange],\n );\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2 flex-wrap\">\n <div className=\"flex items-baseline gap-2 min-w-0\">\n <SectionLabel>Body</SectionLabel>\n {bodyType && (\n <span className=\"text-[10px] text-muted-foreground/40 font-mono\">{bodyType}</span>\n )}\n {bodyDescription && (\n <span className=\"text-[10px] text-muted-foreground/60 truncate\">{bodyDescription}</span>\n )}\n </div>\n {hasSchema && (\n <div className=\"inline-flex rounded-md border overflow-hidden text-[10px]\">\n <ModeButton active={mode === 'form'} onClick={() => setMode('form')}>Form</ModeButton>\n <ModeButton active={mode === 'json'} onClick={() => setMode('json')}>JSON</ModeButton>\n </div>\n )}\n {mode === 'json' && isJsonValid && value && (\n <button\n type=\"button\"\n onClick={() => {\n try { onChange(JSON.stringify(JSON.parse(value), null, 2)); } catch { /* noop */ }\n }}\n className=\"inline-flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Sparkles className=\"h-2.5 w-2.5\" />\n Format\n </button>\n )}\n </div>\n\n {mode === 'form' && hasSchema ? (\n <BodyFormEditor\n schema={schema as Record<string, unknown>}\n value={parsed}\n onChange={handleFormChange}\n />\n ) : (\n <>\n <Textarea\n placeholder={'{\\n \"key\": \"value\"\\n}'}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={cn(\n 'font-mono text-[11px] min-h-[90px] resize-y',\n !isJsonValid && 'border-destructive focus-visible:ring-destructive/30',\n )}\n rows={4}\n />\n {!isJsonValid && <p className=\"text-[10px] text-destructive\">Invalid JSON</p>}\n </>\n )}\n </div>\n );\n}\n\nfunction ModeButton({\n active, onClick, children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'px-2 py-0.5 font-medium transition-colors',\n active\n ? 'bg-primary/10 text-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {children}\n </button>\n );\n}\n","'use client';\n\nimport { Loader2, Send, Terminal, WifiOff } from 'lucide-react';\nimport { useMemo } from 'react';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\nimport JsonTree from '../../../JsonTree';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { EmptyState, ScrollArea, StatusBadge } from './ui';\n\n// ─── JsonTree config (static, no re-creation on render) ──────────────────────\n\nconst JSON_TREE_CONFIG = {\n maxAutoExpandDepth: 2,\n maxAutoExpandArrayItems: 10,\n maxAutoExpandObjectKeys: 5,\n maxStringLength: 200,\n collectionLimit: 50,\n showCollectionInfo: true,\n showExpandControls: true,\n showActionButtons: false,\n preserveKeyOrder: true,\n className: 'border-0 rounded-none',\n} as const;\n\n// ─── ResponsePanel ────────────────────────────────────────────────────────────\n\nexport function ResponsePanel() {\n const { state } = usePlaygroundContext();\n const { response, loading, selectedEndpoint } = state;\n\n // ── Normalise response data ───────────────────────────────────────────────\n // Always try to parse as JSON first so JsonTree gets an object, not a string.\n // Falls back to raw text for non-JSON responses (HTML errors, plain text, etc.)\n const { treeData, rawText } = useMemo(() => {\n const d = response?.data;\n if (d == null) return { treeData: null, rawText: '' };\n\n if (typeof d === 'string') {\n try {\n return { treeData: JSON.parse(d), rawText: d };\n } catch {\n return { treeData: null, rawText: d };\n }\n }\n\n return { treeData: d, rawText: JSON.stringify(d, null, 2) };\n }, [response?.data]);\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const sizeKb = rawText ? `${(rawText.length / 1024).toFixed(1)} KB` : '';\n const duration = response?.duration != null ? `${response.duration}ms` : '';\n const hasError = Boolean(response?.error);\n const hasStatus = response?.status != null;\n const hasCopy = Boolean(rawText);\n\n // ── Early returns ─────────────────────────────────────────────────────────\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">Sending…</span>\n </div>\n );\n }\n\n if (!selectedEndpoint) return <EmptyState icon={Terminal} text=\"Response will appear here\" />;\n if (!response) return <EmptyState icon={Send} text='Press \"Send Request\" to see the response' />;\n\n // Pure network error (no HTTP response at all — CORS, offline, timeout)\n if (hasError && !hasStatus) {\n return (\n <EmptyState\n icon={WifiOff}\n text={response.error!}\n className=\"text-destructive [&_svg]:text-destructive\"\n />\n );\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Status bar */}\n <div className=\"shrink-0 border-b px-4 py-2 flex items-center justify-between gap-3 bg-muted/20\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {hasStatus && <StatusBadge status={response.status!} />}\n {response.statusText && (\n <span className=\"text-xs text-muted-foreground truncate\">{response.statusText}</span>\n )}\n {sizeKb && (\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums shrink-0\">{sizeKb}</span>\n )}\n {duration && (\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums shrink-0\">{duration}</span>\n )}\n </div>\n {hasCopy && (\n <CopyButton value={rawText} variant=\"ghost\" size=\"sm\" className=\"h-6 px-2 text-[10px] text-muted-foreground shrink-0\">\n Copy\n </CopyButton>\n )}\n </div>\n\n {/* HTTP-level error body (4xx/5xx — has status but also error flag) */}\n {hasError && (\n <div className=\"shrink-0 mx-4 mt-3 rounded border border-destructive/20 bg-destructive/5 px-3 py-2\">\n <p className=\"text-xs text-destructive\">{response.error}</p>\n </div>\n )}\n\n {/* Body */}\n <ScrollArea>\n {treeData != null ? (\n <JsonTree title=\"Response Body\" data={treeData} config={JSON_TREE_CONFIG} />\n ) : rawText ? (\n <pre className=\"p-4 text-[11px] font-mono text-foreground/70 whitespace-pre-wrap break-all leading-relaxed\">\n {rawText}\n </pre>\n ) : (\n <div className=\"py-10 text-center text-xs text-muted-foreground\">Empty response body</div>\n )}\n </ScrollArea>\n </>\n );\n}\n","'use client';\n\nimport { AlertCircle, Loader2, Send } from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { isValidJson } from '../../utils';\nimport { UrlBuilder } from '../../utils/url';\n\ninterface SendButtonProps {\n className?: string;\n}\n\n/**\n * Standalone Send button that reads from and acts on the playground\n * context. Disabled + explainer-banner when required inputs are missing.\n *\n * Validation rules (in order — first failure wins the banner text):\n * 1. Required path/query parameters must be non-empty.\n * 2. Path template must be fully substituted (no leftover ``{name}``).\n * 3. Request body, when present, must be valid JSON.\n *\n * We validate on the client so the user isn't punished with a 404 from\n * the server for a trivially detectable mistake (e.g. empty ``{petId}``).\n */\nexport function SendButton({ className }: SendButtonProps) {\n const { state, sendRequest } = usePlaygroundContext();\n\n const ep = state.selectedEndpoint;\n\n // Single source of truth for URL-level validation lives in UrlBuilder.\n // Recomputing every render is cheap (pure string work).\n const builder = useMemo(\n () => (ep ? new UrlBuilder(ep, state.parameters) : null),\n [ep, state.parameters],\n );\n const missingRequired = builder?.missingRequired() ?? [];\n const unsubstituted = builder?.unfilledPlaceholders() ?? [];\n\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n const blockers: string[] = [];\n if (missingRequired.length > 0) {\n blockers.push(\n `Fill required parameter${missingRequired.length > 1 ? 's' : ''}: ${missingRequired.join(', ')}`,\n );\n } else if (unsubstituted.length > 0) {\n blockers.push(`URL still has unfilled placeholder${unsubstituted.length > 1 ? 's' : ''}: ${unsubstituted.map((n) => `{${n}}`).join(', ')}`);\n }\n if (!isJsonValid) blockers.push('Request body is not valid JSON');\n\n const disabled =\n state.loading ||\n !state.requestUrl ||\n blockers.length > 0;\n\n const tooltip = blockers.length > 0 ? blockers.join('\\n') : undefined;\n\n return (\n <div className={cn('space-y-2', className)}>\n {blockers.length > 0 && (\n <div className=\"flex items-start gap-2 rounded-md border border-amber-500/25 bg-amber-500/[0.06] px-3 py-2 text-[11px] text-amber-600 dark:text-amber-400\">\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0 mt-px\" />\n <span className=\"leading-snug\">{blockers[0]}</span>\n </div>\n )}\n <Button\n onClick={sendRequest}\n disabled={disabled}\n size=\"sm\"\n title={tooltip}\n className=\"w-full gap-2 h-9\"\n >\n {state.loading ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Sending…\n </>\n ) : (\n <>\n <Send className=\"h-3.5 w-3.5\" />\n Send Request\n </>\n )}\n </Button>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nimport { SidePanel } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { RequestPanel } from '../shared/RequestPanel';\nimport { ResponsePanel } from '../shared/ResponsePanel';\nimport { SendButton } from '../shared/SendButton';\nimport { MethodBadge, Panel, relativePath } from '../shared/ui';\n\ninterface SlideInPlaygroundProps {\n open: boolean;\n onClose: () => void;\n}\n\n// Width when only Request is visible vs. when Response is also rendered.\n// ``clamp(min, preferred, max)`` lets the panel scale with the viewport\n// instead of sitting at a fixed size that looks tiny on ultra-wide or\n// cramped on laptops.\n//\n// Narrow (Request only) — form content, no need to ever exceed ~480px.\n// 1280 viewport → 384 | 1440 → 432 | 1920 → 480 (cap) | 2560 → 480 (cap)\n//\n// Wide (Request + Response) — response can be huge JSON/HTML; give it room.\n// 1280 → 768 | 1440 → 864 | 1920 → 1152 | 2560 → 1280 (cap) | 3840 → 1280 (cap)\n//\n// Transition between the two values is animated by SidePanel.Content\n// (both ``transform`` and ``width`` listed there). clamp() interpolates\n// smoothly during that transition, no extra plumbing needed.\nconst WIDTH_NARROW = 'clamp(380px, 30vw, 480px)';\nconst WIDTH_WIDE = 'clamp(720px, 60vw, 1280px)';\n\n/**\n * Right-side slide-in playground. Two-column layout appears once the\n * user has a response in hand — before that, only the Request form is\n * shown and the panel stays narrow so docs have room to breathe.\n *\n * State transitions:\n * - no endpoint ⇒ panel not rendered\n * - endpoint, no resp ⇒ narrow (Request only)\n * - endpoint + loading ⇒ wide (Request + Response spinner)\n * - endpoint + resp ⇒ wide (Request + Response)\n *\n * Selecting a different endpoint clears ``response`` in the reducer,\n * so the panel smoothly collapses back to narrow.\n */\nexport function SlideInPlayground({ open, onClose }: SlideInPlaygroundProps) {\n const { state } = usePlaygroundContext();\n const ep = state.selectedEndpoint;\n const showResponse = state.response !== null || state.loading;\n const width = showResponse ? WIDTH_WIDE : WIDTH_NARROW;\n\n return (\n <SidePanel open={open} onOpenChange={(v) => !v && onClose()} side=\"right\">\n <SidePanel.Content width={width} className=\"max-w-[95vw]\">\n <SidePanel.Header>\n <SidePanel.Title>Playground</SidePanel.Title>\n {ep && (\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <MethodBadge method={ep.method} />\n <code className=\"font-mono text-[11px] text-muted-foreground truncate\">\n {relativePath(ep.path)}\n </code>\n </div>\n )}\n <SidePanel.Close className=\"ml-auto\" />\n </SidePanel.Header>\n\n {/* Body: 1 or 2 columns depending on whether we have a\n response to show. ``divide-x`` gives a 1px seam\n between the panes so they read as distinct surfaces. */}\n <SidePanel.Body\n className={cn(\n 'overflow-hidden grid divide-x transition-[grid-template-columns] duration-250',\n showResponse\n ? 'grid-cols-[minmax(0,1fr)_minmax(0,1fr)]'\n : 'grid-cols-1',\n )}\n >\n <Panel>\n <RequestPanel />\n </Panel>\n {showResponse && (\n <Panel>\n <ResponsePanel />\n </Panel>\n )}\n </SidePanel.Body>\n\n {ep && (\n <SidePanel.Footer className=\"px-4 py-3\">\n <SendButton />\n </SidePanel.Footer>\n )}\n </SidePanel.Content>\n </SidePanel>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nimport {\n ResponsiveSheet,\n ResponsiveSheetContent,\n ResponsiveSheetHeader,\n ResponsiveSheetTitle,\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { RequestPanel } from '../shared/RequestPanel';\nimport { ResponsePanel } from '../shared/ResponsePanel';\nimport { SendButton } from '../shared/SendButton';\n\ninterface TryItSheetProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Mobile/tablet fallback: the slide-in playground doesn't fit, so we\n * open Request + Response inside a ResponsiveSheet (bottom drawer on\n * mobile, side sheet on desktop). Response stays hidden until a\n * request has been sent — matching the desktop ``SlideInPlayground``\n * behaviour.\n */\nexport function TryItSheet({ open, onOpenChange }: TryItSheetProps) {\n const { state } = usePlaygroundContext();\n const showResponse = state.response !== null || state.loading;\n\n return (\n <ResponsiveSheet open={open} onOpenChange={onOpenChange}>\n <ResponsiveSheetContent className=\"sm:max-w-xl flex flex-col h-full p-0\">\n <ResponsiveSheetHeader className=\"px-4 py-3 border-b shrink-0\">\n <ResponsiveSheetTitle className=\"text-sm\">Playground</ResponsiveSheetTitle>\n </ResponsiveSheetHeader>\n <div className=\"flex-1 min-h-0 flex flex-col divide-y\">\n <div className={showResponse ? 'flex-1 min-h-0 flex flex-col' : 'flex-1 min-h-0 flex flex-col'}>\n <RequestPanel />\n </div>\n {showResponse && (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <ResponsePanel />\n </div>\n )}\n </div>\n {state.selectedEndpoint && (\n <div className=\"shrink-0 border-t px-4 py-3 bg-background/95 backdrop-blur-sm\">\n <SendButton />\n </div>\n )}\n </ResponsiveSheetContent>\n </ResponsiveSheet>\n );\n}\n","'use client';\n\nimport React, { useCallback, useRef, useState } from 'react';\n\nimport { Skeleton, TooltipProvider } from '@djangocfg/ui-core/components';\nimport { useMediaQuery } from '@djangocfg/ui-core/hooks';\n\nimport useOpenApiSchema from '../../hooks/useOpenApiSchema';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport type { ApiEndpoint } from '../../types';\nimport { EndpointDraftSync } from '../shared/EndpointDraftSync';\nimport { DocsSidebar } from './Sidebar';\nimport { DocsView, type DocsViewHandle } from './DocsView';\nimport { SlideInPlayground } from './SlideInPlayground';\nimport { TryItSheet } from './TryItSheet';\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport const DocsLayout: React.FC = () => {\n const { state, config, setSelectedEndpoint } = usePlaygroundContext();\n // The docs layout has a sidebar + docs column that already eat ~260px\n // before the slide-in opens. Below 1024px the slide-in (min 720 wide)\n // leaves docs with <250px — unreadable — so we fall back to the\n // mobile-style ``TryItSheet`` on those viewports.\n const isDesktop = useMediaQuery('(min-width: 1024px)');\n const isMobile = !isDesktop;\n const {\n endpoints,\n schemaInfo,\n rawSchema,\n resolvedBaseUrl,\n loading,\n error,\n schemas,\n currentSchema,\n setCurrentSchema,\n } = useOpenApiSchema({\n schemas: config.schemas,\n defaultSchemaId: config.defaultSchemaId,\n baseUrl: config.baseUrl,\n });\n\n const [activeAnchor, setActiveAnchor] = useState<string | null>(null);\n const [sheetOpen, setSheetOpen] = useState(false);\n const docsRef = useRef<DocsViewHandle | null>(null);\n\n // Desktop slide-in is driven directly by ``selectedEndpoint``. Keeping a\n // separate open-state would mean two sources of truth for the same\n // semantic — \"which endpoint is loaded into the playground\".\n const slideOpen = !isMobile && state.selectedEndpoint !== null;\n\n const handleTry = useCallback(\n (ep: ApiEndpoint) => {\n setSelectedEndpoint(ep);\n if (isMobile) setSheetOpen(true);\n },\n [isMobile, setSelectedEndpoint],\n );\n\n const handleCloseSlide = useCallback(() => {\n setSelectedEndpoint(null);\n }, [setSelectedEndpoint]);\n\n const handleNavigate = useCallback((anchor: string) => {\n docsRef.current?.scrollToAnchor(anchor);\n }, []);\n // Esc handling lives inside SidePanel itself — no duplicate listener.\n\n if (loading) {\n return (\n <div\n className=\"grid grid-cols-[260px_1fr] min-h-0 overflow-hidden\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n <div className=\"border-r p-3 space-y-1.5\">\n {Array.from({ length: 12 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded\" />\n ))}\n </div>\n <div className=\"p-8 space-y-4\">\n <Skeleton className=\"h-8 w-1/2\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <div className=\"mt-8 space-y-6\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"space-y-3\">\n <Skeleton className=\"h-6 w-1/3\" />\n <Skeleton className=\"h-20 w-full\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className=\"flex items-center justify-center p-8\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n <p className=\"text-sm text-destructive\">Failed to load schema: {error}</p>\n </div>\n );\n }\n\n // Mobile/tablet: sidebar + docs only, playground opens in sheet.\n if (isMobile) {\n return (\n <div\n className=\"flex flex-col overflow-hidden\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n <EndpointDraftSync schemaId={currentSchema?.id ?? null} />\n <DocsView\n ref={docsRef}\n info={schemaInfo}\n rawSchema={rawSchema}\n resolvedBaseUrl={resolvedBaseUrl}\n endpoints={endpoints}\n selectedVersion={state.selectedVersion}\n loadedEndpoint={state.selectedEndpoint}\n onTryEndpoint={handleTry}\n onActiveChange={setActiveAnchor}\n />\n <TryItSheet open={sheetOpen} onOpenChange={setSheetOpen} />\n </div>\n );\n }\n\n return (\n <TooltipProvider delayDuration={350}>\n <div\n className=\"grid grid-cols-[260px_minmax(0,1fr)] min-h-0 overflow-hidden\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n <EndpointDraftSync schemaId={currentSchema?.id ?? null} />\n <DocsSidebar\n info={schemaInfo}\n endpoints={endpoints}\n schemas={schemas}\n currentSchemaId={currentSchema?.id ?? null}\n onSchemaChange={setCurrentSchema}\n activeEndpointId={activeAnchor}\n selectedVersion={state.selectedVersion}\n onNavigate={handleNavigate}\n />\n <DocsView\n ref={docsRef}\n info={schemaInfo}\n rawSchema={rawSchema}\n resolvedBaseUrl={resolvedBaseUrl}\n endpoints={endpoints}\n selectedVersion={state.selectedVersion}\n loadedEndpoint={state.selectedEndpoint}\n onTryEndpoint={handleTry}\n onActiveChange={setActiveAnchor}\n />\n {/* SidePanel renders into <body> via portal, so it floats\n above the whole layout (sidebar + navbar included). */}\n <SlideInPlayground open={slideOpen} onClose={handleCloseSlide} />\n </div>\n </TooltipProvider>\n );\n};\n"]}
|