@djangocfg/ui-tools 2.1.212 → 2.1.215

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/JsonTree-EFWAIIUV.mjs +5 -0
  2. package/dist/{JsonTree-5CRPHRP5.mjs.map → JsonTree-EFWAIIUV.mjs.map} +1 -1
  3. package/dist/JsonTree-LULSGFAW.cjs +11 -0
  4. package/dist/{JsonTree-IIVOSSVZ.cjs.map → JsonTree-LULSGFAW.cjs.map} +1 -1
  5. package/dist/JsonTree-MLET23ZA.css +6 -0
  6. package/dist/JsonTree-MLET23ZA.css.map +1 -0
  7. package/dist/{Mermaid.client-HG24D5KB.mjs → Mermaid.client-5EKULAUZ.mjs} +12 -22
  8. package/dist/Mermaid.client-5EKULAUZ.mjs.map +1 -0
  9. package/dist/Mermaid.client-DDXWXZXY.css +6 -0
  10. package/dist/Mermaid.client-DDXWXZXY.css.map +1 -0
  11. package/dist/{Mermaid.client-2TAFAXPW.cjs → Mermaid.client-Z25LMNPA.cjs} +12 -22
  12. package/dist/Mermaid.client-Z25LMNPA.cjs.map +1 -0
  13. package/dist/{PlaygroundLayout-XYMJBNT4.cjs → PlaygroundLayout-F47LFRYB.cjs} +21 -20
  14. package/dist/PlaygroundLayout-F47LFRYB.cjs.map +1 -0
  15. package/dist/{PlaygroundLayout-DWRNA2QM.mjs → PlaygroundLayout-NFNVEPIL.mjs} +5 -4
  16. package/dist/PlaygroundLayout-NFNVEPIL.mjs.map +1 -0
  17. package/dist/PlaygroundLayout-O52C6HK5.css +6 -0
  18. package/dist/PlaygroundLayout-O52C6HK5.css.map +1 -0
  19. package/dist/PrettyCode.client-GWFAIVFN.css +6 -0
  20. package/dist/PrettyCode.client-GWFAIVFN.css.map +1 -0
  21. package/dist/{PrettyCode.client-TCVEDDCJ.cjs → PrettyCode.client-VH6C6OC5.cjs} +15 -18
  22. package/dist/PrettyCode.client-VH6C6OC5.cjs.map +1 -0
  23. package/dist/{PrettyCode.client-RHOS5D6V.mjs → PrettyCode.client-VNTMCHXR.mjs} +16 -19
  24. package/dist/PrettyCode.client-VNTMCHXR.mjs.map +1 -0
  25. package/dist/{chunk-QP6QAK3F.cjs → chunk-3IIZ5ESQ.cjs} +3 -3
  26. package/dist/{chunk-QP6QAK3F.cjs.map → chunk-3IIZ5ESQ.cjs.map} +1 -1
  27. package/dist/chunk-3Q2X3CYQ.mjs +208 -0
  28. package/dist/chunk-3Q2X3CYQ.mjs.map +1 -0
  29. package/dist/chunk-G2A6SX5L.cjs +235 -0
  30. package/dist/chunk-G2A6SX5L.cjs.map +1 -0
  31. package/dist/chunk-LJ2VEBBZ.cjs +210 -0
  32. package/dist/chunk-LJ2VEBBZ.cjs.map +1 -0
  33. package/dist/chunk-MBFBVGUP.mjs +229 -0
  34. package/dist/chunk-MBFBVGUP.mjs.map +1 -0
  35. package/dist/{chunk-FXFTJW2Y.mjs → chunk-TROOIHOR.mjs} +3 -3
  36. package/dist/{chunk-FXFTJW2Y.mjs.map → chunk-TROOIHOR.mjs.map} +1 -1
  37. package/dist/index.cjs +14 -13
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.css +6 -0
  40. package/dist/index.css.map +1 -0
  41. package/dist/index.d.cts +8 -7
  42. package/dist/index.d.ts +8 -7
  43. package/dist/index.mjs +10 -9
  44. package/dist/index.mjs.map +1 -1
  45. package/package.json +6 -6
  46. package/src/components/FloatingToolbar/FloatingToolbar.css +5 -0
  47. package/src/components/FloatingToolbar/actions/CopyAction.tsx +22 -0
  48. package/src/components/FloatingToolbar/actions/DownloadAction.tsx +46 -0
  49. package/src/components/FloatingToolbar/actions/ExpandAction.tsx +25 -0
  50. package/src/components/FloatingToolbar/actions/FullscreenAction.tsx +30 -0
  51. package/src/components/FloatingToolbar/actions/index.ts +4 -0
  52. package/src/components/FloatingToolbar/hooks/useElementCorner.ts +84 -0
  53. package/src/components/FloatingToolbar/hooks/useScrollIsolation.ts +62 -0
  54. package/src/components/FloatingToolbar/index.tsx +131 -0
  55. package/src/styles/index.css +1 -0
  56. package/src/tools/JsonTree/JsonTree.story.tsx +3 -2
  57. package/src/tools/JsonTree/README.md +60 -0
  58. package/src/tools/JsonTree/components/JsonContent.tsx +98 -0
  59. package/src/tools/JsonTree/components/JsonToolbar.tsx +88 -0
  60. package/src/tools/JsonTree/hooks/useElementCorner.ts +84 -0
  61. package/src/tools/JsonTree/hooks/useJsonExpand.ts +50 -0
  62. package/src/tools/JsonTree/hooks/useNavbarHeight.ts +83 -0
  63. package/src/tools/JsonTree/index.tsx +46 -278
  64. package/src/tools/JsonTree/types.ts +65 -0
  65. package/src/tools/Mermaid/Mermaid.client.tsx +12 -20
  66. package/src/tools/PrettyCode/PrettyCode.client.tsx +19 -19
  67. package/src/tools/PrettyCode/PrettyCode.story.tsx +476 -41
  68. package/dist/JsonTree-5CRPHRP5.mjs +0 -4
  69. package/dist/JsonTree-IIVOSSVZ.cjs +0 -10
  70. package/dist/Mermaid.client-2TAFAXPW.cjs.map +0 -1
  71. package/dist/Mermaid.client-HG24D5KB.mjs.map +0 -1
  72. package/dist/PlaygroundLayout-DWRNA2QM.mjs.map +0 -1
  73. package/dist/PlaygroundLayout-XYMJBNT4.cjs.map +0 -1
  74. package/dist/PrettyCode.client-RHOS5D6V.mjs.map +0 -1
  75. package/dist/PrettyCode.client-TCVEDDCJ.cjs.map +0 -1
  76. package/dist/chunk-DFWXRCIC.cjs +0 -242
  77. package/dist/chunk-DFWXRCIC.cjs.map +0 -1
  78. package/dist/chunk-XXFYTIQK.mjs +0 -240
  79. package/dist/chunk-XXFYTIQK.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/OpenapiViewer/hooks/useMobile.ts","../src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts","../src/tools/OpenapiViewer/components/EndpointsLibrary.tsx","../src/tools/OpenapiViewer/components/PlaygroundStepper.tsx","../src/tools/OpenapiViewer/components/EndpointInfo.tsx","../src/tools/OpenapiViewer/components/RequestParametersForm.tsx","../src/tools/OpenapiViewer/components/RequestBuilder.tsx","../src/tools/OpenapiViewer/components/ResponseViewer.tsx","../src/tools/OpenapiViewer/components/PlaygroundLayout.tsx"],"names":["__name","useIsMobile","useState","useMemo","useEffect","consola","useCallback","usePlaygroundContext","React","deduplicateEndpoints","jsx","Badge","jsxs","Skeleton","Card","CardContent","Combobox","Search","Input","Select","SelectTrigger","Filter","SelectValue","SelectContent","SelectItem","Button","List","Grid3X3","DownloadButton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","CardHeader","CardTitle","Code","Send","FileText","Check","ChevronLeft","ChevronRight","getMethodColor","CopyButton","Collapsible","CollapsibleTrigger","Database","ChevronDown","CollapsibleContent","AlertCircle","getStatusColor","Label","TooltipProvider","Tooltip","TooltipTrigger","HelpCircle","TooltipContent","Tabs","TabsList","TabsTrigger","TabsContent","Accordion","AccordionItem","AccordionTrigger","AccordionContent","Textarea","isValidJson","findApiKeyById","parseRequestHeaders","Key","Fragment","Loader2","PrettyCode_default","Download","XCircle","JsonTree_default","Sheet","SheetTrigger","Menu","SheetContent","X"],"mappings":"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","file":"PlaygroundLayout-XYMJBNT4.cjs","sourcesContent":["import { useIsMobile } from '@djangocfg/ui-core/hooks';\n\nexport const useMobile = () => {\n const isMobile = useIsMobile();\n\n return {\n isMobile,\n isDesktop: !isMobile,\n };\n}; ","'use client';\n\nimport consola from 'consola';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { ApiEndpoint, OpenApiSchema, SchemaSource, UseOpenApiSchemaReturn } from '../types';\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)\nconst extractEndpoints = (schema: OpenApiSchema): ApiEndpoint[] => {\n const endpoints: ApiEndpoint[] = [];\n\n if (!schema.paths) return [];\n\n // Get base URL from servers\n const baseUrl = schema.servers && schema.servers.length > 0 ? schema.servers[0].url : '';\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 description = op.description || op.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\n let requestBody: { type: string; description?: string } | undefined;\n if (op.requestBody) {\n const content = op.requestBody.content;\n const mediaType = content?.['application/json'] || content?.[Object.keys(content || {})[0]];\n requestBody = {\n type: mediaType?.schema?.type || 'object',\n description: op.requestBody.description,\n };\n }\n\n const endpoint: ApiEndpoint = {\n name: path.split('/').pop() || path,\n method: methodUpper,\n path: baseUrl + path,\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}\n\nexport default function useOpenApiSchema({\n schemas,\n defaultSchemaId,\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 const endpoints = useMemo(\n () => (currentOpenApiSchema ? extractEndpoints(currentOpenApiSchema) : []),\n [currentOpenApiSchema]\n );\n\n const categories = useMemo(() => getCategories(endpoints), [endpoints]);\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 setCurrentSchema,\n refresh,\n };\n}\n","'use client';\n\nimport {\n Code, Filter, Grid3X3, List, Search,\n} from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, Combobox, DownloadButton, Input,\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Skeleton, Table, TableBody,\n TableCell, TableHead, TableHeader, TableRow\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport useOpenApiSchema from '../hooks/useOpenApiSchema';\nimport { deduplicateEndpoints } from '../utils/versionManager';\n\nimport type { ApiEndpoint } from '../types';\n\n// Method color mapping for badges\nconst METHOD_BADGE_VARIANTS: Record<string, string> = {\n GET: 'bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 border-emerald-500/20',\n POST: 'bg-blue-500/15 text-blue-600 dark:text-blue-400 border-blue-500/20',\n PUT: 'bg-amber-500/15 text-amber-600 dark:text-amber-400 border-amber-500/20',\n PATCH: 'bg-orange-500/15 text-orange-600 dark:text-orange-400 border-orange-500/20',\n DELETE: 'bg-red-500/15 text-red-600 dark:text-red-400 border-red-500/20',\n};\n\nexport const EndpointsLibrary: React.FC = () => {\n const { state, config, setSelectedEndpoint, setSelectedCategory, setSearchTerm } = usePlaygroundContext();\n const { endpoints, categories, loading, error, schemas, currentSchema, setCurrentSchema } = useOpenApiSchema({\n schemas: config.schemas,\n defaultSchemaId: config.defaultSchemaId,\n });\n const [viewMode, setViewMode] = React.useState<'table' | 'grid'>('table');\n\n const getRelativePath = (fullPath: string): string => {\n try {\n const url = new URL(fullPath);\n return url.pathname;\n } catch {\n return fullPath;\n }\n };\n\n const filteredEndpoints = useMemo(() => {\n let filtered = deduplicateEndpoints(endpoints, state.selectedVersion);\n\n if (state.selectedCategory && state.selectedCategory !== 'All') {\n filtered = filtered.filter((endpoint) => endpoint.category === state.selectedCategory);\n }\n\n if (state.searchTerm) {\n const searchLower = state.searchTerm.toLowerCase();\n filtered = filtered.filter(\n (endpoint) =>\n endpoint.name.toLowerCase().includes(searchLower) ||\n endpoint.description.toLowerCase().includes(searchLower) ||\n endpoint.path.toLowerCase().includes(searchLower)\n );\n }\n\n return filtered;\n }, [endpoints, state.selectedCategory, state.searchTerm, state.selectedVersion]);\n\n const schemaOptions = useMemo(() =>\n schemas.map((s) => ({ value: s.id, label: s.name })),\n [schemas]\n );\n\n const getMethodBadge = (method: string) => (\n <Badge\n key={method}\n variant=\"outline\"\n className={`text-xs font-mono font-semibold ${METHOD_BADGE_VARIANTS[method.toUpperCase()] || ''}`}\n >\n {method}\n </Badge>\n );\n\n if (loading) {\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-9 w-44\" />\n <Skeleton className=\"h-9 flex-1 max-w-xs\" />\n <div className=\"flex-1\" />\n <Skeleton className=\"h-9 w-24\" />\n </div>\n <div className=\"space-y-1\">\n {Array.from({ length: 8 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"space-y-3\">\n <Card className=\"bg-destructive/10 border-destructive/20\">\n <CardContent className=\"p-4\">\n <p className=\"text-sm text-destructive\">Failed to load schema: {error}</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n {/* Toolbar — single row */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n {/* Left: Schema selector */}\n {schemas.length > 1 && (\n <Combobox\n options={schemaOptions}\n value={currentSchema?.id || ''}\n onValueChange={(id) => id && setCurrentSchema(id)}\n placeholder=\"Select API\"\n searchPlaceholder=\"Search APIs...\"\n emptyText=\"No APIs found\"\n className=\"w-44\"\n />\n )}\n\n {/* Search */}\n <div className=\"relative flex-1 max-w-xs\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={state.searchTerm}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchTerm(e.target.value)}\n className=\"h-9 pl-8 text-sm\"\n />\n </div>\n\n {/* Category filter */}\n <Select value={state.selectedCategory} onValueChange={setSelectedCategory}>\n <SelectTrigger className=\"w-auto h-9 gap-1.5\">\n <Filter className=\"h-3.5 w-3.5\" />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"All\">All</SelectItem>\n {categories.map((category) => (\n <SelectItem key={category} value={category}>\n {category}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Right: View toggle + count + download */}\n <span className=\"text-xs text-muted-foreground tabular-nums hidden sm:inline\">\n {filteredEndpoints.length} endpoint{filteredEndpoints.length !== 1 ? 's' : ''}\n </span>\n\n <div className=\"flex items-center border rounded-md\">\n <Button\n variant={viewMode === 'table' ? 'default' : 'ghost'}\n size=\"icon\"\n className=\"h-8 w-8 rounded-r-none\"\n onClick={() => setViewMode('table')}\n >\n <List className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant={viewMode === 'grid' ? 'default' : 'ghost'}\n size=\"icon\"\n className=\"h-8 w-8 rounded-l-none\"\n onClick={() => setViewMode('grid')}\n >\n <Grid3X3 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n\n {currentSchema && (\n <DownloadButton\n url={currentSchema.url}\n filename={`${currentSchema.id}-openapi.json`}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8\"\n >\n <span className=\"hidden sm:inline\">Schema</span>\n </DownloadButton>\n )}\n </div>\n\n {/* Endpoints list */}\n {viewMode === 'table' ? (\n <Card>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-20 text-foreground\">Method</TableHead>\n <TableHead className=\"text-foreground\">Path</TableHead>\n <TableHead className=\"text-foreground hidden lg:table-cell\">Description</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredEndpoints.length === 0 ? (\n <TableRow>\n <TableCell colSpan={3} className=\"text-center py-12 text-muted-foreground\">\n No endpoints found\n </TableCell>\n </TableRow>\n ) : (\n filteredEndpoints.map((endpoint) => (\n <TableRow\n key={`${endpoint.method}-${endpoint.path}`}\n className={`cursor-pointer transition-colors hover:bg-muted/50 ${\n state.selectedEndpoint?.path === endpoint.path &&\n state.selectedEndpoint?.method === endpoint.method\n ? 'bg-primary/5'\n : ''\n }`}\n onClick={() => setSelectedEndpoint(endpoint)}\n >\n <TableCell className=\"py-2.5\">\n {getMethodBadge(endpoint.method)}\n </TableCell>\n <TableCell className=\"font-mono text-sm text-muted-foreground py-2.5\">\n {getRelativePath(endpoint.path)}\n </TableCell>\n <TableCell className=\"text-sm text-muted-foreground max-w-sm truncate py-2.5 hidden lg:table-cell\">\n {endpoint.description}\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </Card>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3\">\n {filteredEndpoints.length === 0 ? (\n <div className=\"col-span-full text-center py-12 text-muted-foreground\">\n No endpoints found\n </div>\n ) : (\n filteredEndpoints.map((endpoint) => (\n <Card\n key={`${endpoint.method}-${endpoint.path}`}\n className={`cursor-pointer transition-all hover:shadow-md ${\n state.selectedEndpoint?.path === endpoint.path &&\n state.selectedEndpoint?.method === endpoint.method\n ? 'ring-2 ring-primary'\n : ''\n }`}\n onClick={() => setSelectedEndpoint(endpoint)}\n >\n <CardHeader className=\"pb-2 pt-3 px-4\">\n <CardTitle className=\"flex items-center justify-between text-sm\">\n <span className=\"font-mono text-xs text-muted-foreground truncate\">\n {getRelativePath(endpoint.path)}\n </span>\n {getMethodBadge(endpoint.method)}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"px-4 pb-3 pt-0\">\n <p className=\"text-xs text-muted-foreground line-clamp-2\">\n {endpoint.description}\n </p>\n </CardContent>\n </Card>\n ))\n )}\n </div>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { Check, ChevronLeft, ChevronRight, Code, FileText, Send } from 'lucide-react';\nimport React from 'react';\n\nimport { Badge, Button } from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { PlaygroundStep } from '../types';\n\nconst stepConfig = {\n endpoints: {\n title: 'Endpoints',\n icon: Code,\n description: 'Select API endpoint'\n },\n request: {\n title: 'Request',\n icon: Send,\n description: 'Configure request'\n },\n response: {\n title: 'Response',\n icon: FileText,\n description: 'View response'\n }\n};\n\nexport const PlaygroundStepper: React.FC = () => {\n const { state, setCurrentStep, goToNextStep, goToPreviousStep } = usePlaygroundContext();\n const { currentStep, steps } = state;\n\n const currentIndex = steps.indexOf(currentStep);\n const canGoNext = currentIndex < steps.length - 1;\n const canGoPrevious = currentIndex > 0;\n\n return (\n <div className=\"flex items-center justify-between w-full\">\n {/* Steps */}\n <div className=\"flex items-center space-x-4\">\n {steps.map((step, index) => {\n const config = stepConfig[step];\n const Icon = config.icon;\n const isActive = step === currentStep;\n const isCompleted = index < currentIndex;\n const isClickable = index <= currentIndex + 1;\n\n return (\n <div key={step} className=\"flex items-center space-x-2\">\n <Button\n variant={isActive ? 'default' : 'ghost'}\n size=\"sm\"\n onClick={() => isClickable && setCurrentStep(step)}\n className={`flex items-center space-x-2 ${isClickable ? 'cursor-pointer' : 'cursor-not-allowed opacity-50'\n }`}\n disabled={!isClickable}\n >\n {isCompleted ? (\n <Check className=\"h-4 w-4\" />\n ) : (\n <Icon className=\"h-4 w-4\" />\n )}\n <span className=\"hidden sm:inline\">{config.title}</span>\n </Button>\n\n {index < steps.length - 1 && (\n <div className=\"w-8 h-px bg-border\" />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Navigation */}\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goToPreviousStep}\n disabled={!canGoPrevious}\n className=\"flex items-center space-x-1\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Previous</span>\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goToNextStep}\n disabled={!canGoNext}\n className=\"flex items-center space-x-1\"\n >\n <span className=\"hidden sm:inline\">Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}; ","'use client';\n\nimport { AlertCircle, ChevronDown, Code, Database, FileText } from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport {\n Badge, Card, CardContent, CardHeader, CardTitle, Collapsible, CollapsibleContent,\n CollapsibleTrigger, CopyButton\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { getMethodColor, getStatusColor } from '../utils';\n\nexport const EndpointInfo: React.FC = () => {\n const { state } = usePlaygroundContext();\n const { selectedEndpoint } = state;\n\n // Memoize endpoint JSON for copy\n const endpointJson = useMemo(() => {\n if (!selectedEndpoint) return '';\n return JSON.stringify({\n name: selectedEndpoint.name,\n method: selectedEndpoint.method,\n path: selectedEndpoint.path,\n description: selectedEndpoint.description,\n parameters: selectedEndpoint.parameters,\n requestBody: selectedEndpoint.requestBody,\n responses: selectedEndpoint.responses\n }, null, 2);\n }, [selectedEndpoint]);\n\n if (!selectedEndpoint) {\n return null;\n }\n\n const getMethodBadges = (methods: string) => {\n return methods.split(', ').map((method) => (\n <Badge key={method} variant={getMethodColor(method) === 'success' ? 'default' : 'secondary'} className=\"text-xs\">\n {method}\n </Badge>\n ));\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Selected Endpoint</h2>\n <CopyButton value={endpointJson} variant=\"outline\" size=\"sm\">\n Copy\n </CopyButton>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between text-sm text-foreground\">\n <div className=\"flex items-center space-x-2\">\n <Code className=\"h-4 w-4\" />\n <span className=\"font-medium\">{selectedEndpoint.name}</span>\n </div>\n <div className=\"flex space-x-1\">{getMethodBadges(selectedEndpoint.method)}</div>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-xs font-mono text-muted-foreground break-all\">\n {selectedEndpoint.path}\n </p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {selectedEndpoint.description}\n </p>\n </div>\n\n {/* Parameters */}\n {selectedEndpoint.parameters && selectedEndpoint.parameters.length > 0 && (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center space-x-2 text-sm font-medium text-foreground\">\n <Database className=\"h-4 w-4\" />\n <span>Parameters ({selectedEndpoint.parameters.length})</span>\n <ChevronDown className=\"h-4 w-4\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2 space-y-2\">\n {selectedEndpoint.parameters.map((param, index) => (\n <div key={index} className=\"flex items-center space-x-2 text-xs\">\n <Badge variant={param.required ? 'destructive' : 'secondary'} className=\"text-xs\">\n {param.required ? 'Required' : 'Optional'}\n </Badge>\n <span className=\"font-mono text-muted-foreground\">\n {param.name}: {param.type}\n </span>\n {param.description && (\n <span className=\"text-muted-foreground\">- {param.description}</span>\n )}\n </div>\n ))}\n </CollapsibleContent>\n </Collapsible>\n )}\n\n {/* Request Body */}\n {selectedEndpoint.requestBody && (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center space-x-2 text-sm font-medium text-foreground\">\n <FileText className=\"h-4 w-4\" />\n <span>Request Body</span>\n <ChevronDown className=\"h-4 w-4\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2\">\n <div className=\"text-xs text-muted-foreground\">\n <p>Type: {selectedEndpoint.requestBody.type}</p>\n {selectedEndpoint.requestBody.description && (\n <p className=\"mt-1\">{selectedEndpoint.requestBody.description}</p>\n )}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n\n {/* Responses */}\n {selectedEndpoint.responses && selectedEndpoint.responses.length > 0 && (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center space-x-2 text-sm font-medium text-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n <span>Responses ({selectedEndpoint.responses.length})</span>\n <ChevronDown className=\"h-4 w-4\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2 space-y-2\">\n {selectedEndpoint.responses.map((response, index) => {\n const statusColor = getStatusColor(parseInt(response.code));\n const badgeVariant = statusColor === 'success' ? 'default' :\n statusColor === 'error' ? 'destructive' : 'secondary';\n return (\n <div key={index} className=\"flex items-center space-x-2 text-xs\">\n <Badge variant={badgeVariant} className=\"text-xs\">\n {response.code}\n </Badge>\n <span className=\"text-muted-foreground\">\n {response.description}\n </span>\n </div>\n );\n })}\n </CollapsibleContent>\n </Collapsible>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}; ","'use client';\n\nimport { HelpCircle } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n Accordion, AccordionContent, AccordionItem, AccordionTrigger, Badge, Button, Card, CardContent,\n CardHeader, CardTitle, Input, Label, Tabs, TabsContent, TabsList, TabsTrigger, Textarea,\n Tooltip, TooltipContent, TooltipProvider, TooltipTrigger\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\n\ninterface Parameter {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\nexport const RequestParametersForm: React.FC = () => {\n const { state, setParameters } = usePlaygroundContext();\n const [formData, setFormData] = useState<Record<string, string>>({});\n const [activeTab, setActiveTab] = useState('required');\n\n // Reset form data when endpoint changes\n useEffect(() => {\n if (state.selectedEndpoint?.parameters) {\n const initialData: Record<string, string> = {};\n state.selectedEndpoint.parameters.forEach(param => {\n initialData[param.name] = '';\n });\n setFormData(initialData);\n }\n }, [state.selectedEndpoint?.path, state.selectedEndpoint?.parameters]);\n\n const handleInputChange = (name: string, value: string) => {\n const newFormData = {\n ...formData,\n [name]: value\n };\n setFormData(newFormData);\n\n // Update parameters in context for URL substitution\n setParameters(newFormData);\n };\n\n const handleClearForm = () => {\n setFormData({});\n setParameters({});\n };\n\n const handleGenerateJson = () => {\n const hasData = Object.values(formData).some(value => value !== '' && value !== null && value !== undefined);\n if (hasData) {\n const jsonString = JSON.stringify(formData, null, 2);\n navigator.clipboard.writeText(jsonString);\n }\n };\n\n if (!state.selectedEndpoint) return null;\n\n const requiredParams = state.selectedEndpoint.parameters?.filter(param => param.required) || [];\n const optionalParams = state.selectedEndpoint.parameters?.filter(param => !param.required) || [];\n const hasParameters = (state.selectedEndpoint.parameters?.length || 0) > 0;\n\n if (!hasParameters) {\n return null;\n }\n\n const hasFormData = Object.values(formData).some(value => value !== '' && value !== null && value !== undefined);\n\n // Component for rendering parameter fields\n const ParameterField = ({ param }: { param: Parameter }) => (\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-1\">\n <Label htmlFor={param.name} className=\"text-xs font-medium text-foreground\">\n {param.name}\n {param.required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n {param.description && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"h-3 w-3 text-muted-foreground hover:text-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs\">\n <p className=\"text-xs\">{param.description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n <Input\n id={param.name}\n value={formData[param.name] || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleInputChange(param.name, e.target.value)}\n placeholder={`Enter ${param.name}${param.required ? '' : ' (optional)'}`}\n className=\"text-sm\"\n />\n </div>\n );\n\n // Component for rendering parameters in grid or list layout\n const ParametersGrid = ({ params, title, badgeVariant }: {\n params: Parameter[],\n title: string,\n badgeVariant: 'destructive' | 'secondary'\n }) => {\n if (params.length === 0) return null;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <Badge variant={badgeVariant} className=\"text-xs\">{title}</Badge>\n <span className=\"text-xs text-muted-foreground\">\n {params.length} parameter{params.length !== 1 ? 's' : ''}\n </span>\n </div>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {params.map((param) => (\n <ParameterField key={param.name} param={param} />\n ))}\n </div>\n </div>\n );\n };\n\n return (\n <TooltipProvider>\n <Card>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-sm text-foreground\">Request Parameters</CardTitle>\n <div className=\"flex items-center space-x-2\">\n {hasFormData && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleGenerateJson}\n className=\"text-xs\"\n >\n Copy JSON\n </Button>\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleClearForm}\n className=\"text-xs\"\n >\n Clear\n </Button>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n {/* Use Tabs for better organization when there are many parameters */}\n {(requiredParams.length + optionalParams.length) > 10 ? (\n <Tabs value={activeTab} onValueChange={setActiveTab}>\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"required\" className=\"text-xs\">\n Required ({requiredParams.length})\n </TabsTrigger>\n <TabsTrigger value=\"optional\" className=\"text-xs\">\n Optional ({optionalParams.length})\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"required\" className=\"space-y-4\">\n <ParametersGrid\n params={requiredParams}\n title=\"Required\"\n badgeVariant=\"destructive\"\n />\n </TabsContent>\n\n <TabsContent value=\"optional\" className=\"space-y-4\">\n <ParametersGrid\n params={optionalParams}\n title=\"Optional\"\n badgeVariant=\"secondary\"\n />\n </TabsContent>\n </Tabs>\n ) : (\n /* Use Accordion for smaller parameter sets */\n <Accordion type=\"multiple\" defaultValue={requiredParams.length > 0 ? [\"required\"] : [\"optional\"]}>\n {requiredParams.length > 0 && (\n <AccordionItem value=\"required\">\n <AccordionTrigger className=\"text-sm text-foreground\">\n <div className=\"flex items-center space-x-2\">\n <Badge variant=\"destructive\" className=\"text-xs\">Required</Badge>\n <span className=\"text-xs text-muted-foreground\">\n {requiredParams.length} parameter{requiredParams.length !== 1 ? 's' : ''}\n </span>\n </div>\n </AccordionTrigger>\n <AccordionContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 pt-2\">\n {requiredParams.map((param) => (\n <ParameterField key={param.name} param={param} />\n ))}\n </div>\n </AccordionContent>\n </AccordionItem>\n )}\n\n {optionalParams.length > 0 && (\n <AccordionItem value=\"optional\">\n <AccordionTrigger className=\"text-sm text-foreground\">\n <div className=\"flex items-center space-x-2\">\n <Badge variant=\"secondary\" className=\"text-xs\">Optional</Badge>\n <span className=\"text-xs text-muted-foreground\">\n {optionalParams.length} parameter{optionalParams.length !== 1 ? 's' : ''}\n </span>\n </div>\n </AccordionTrigger>\n <AccordionContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 pt-2\">\n {optionalParams.map((param) => (\n <ParameterField key={param.name} param={param} />\n ))}\n </div>\n </AccordionContent>\n </AccordionItem>\n )}\n </Accordion>\n )}\n\n {/* JSON Preview */}\n {hasFormData && (\n <div className=\"space-y-2 mt-6 pt-4 border-t\">\n <Label className=\"text-xs text-foreground\">Generated JSON</Label>\n <Textarea\n value={JSON.stringify(formData, null, 2)}\n readOnly\n className=\"text-xs font-mono\"\n rows={4}\n />\n <p className=\"text-xs text-muted-foreground\">\n Click &quot;Copy JSON&quot; to copy this to clipboard, then paste it into the Request Body field above.\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n </TooltipProvider>\n );\n}; ","'use client';\n\nimport { Key, Loader2, Send } from 'lucide-react';\nimport React, { useCallback } from 'react';\n\nimport {\n Button, Card, CardContent, CardHeader, CardTitle, CopyButton, Input, Textarea\n} from '@djangocfg/ui-core/components';\n\nimport PrettyCode from '../../PrettyCode';\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { findApiKeyById, isValidJson, parseRequestHeaders } from '../utils';\nimport { EndpointInfo } from './EndpointInfo';\nimport { RequestParametersForm } from './RequestParametersForm';\n\nexport const RequestBuilder: React.FC = () => {\n const {\n state,\n apiKeys,\n setRequestBody,\n setManualApiToken,\n sendRequest\n } = usePlaygroundContext();\n\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n // Generate cURL command\n const generateCurlCommand = () => {\n if (!state.requestUrl) return '';\n\n const apiKey = state.selectedApiKey ? findApiKeyById(apiKeys, state.selectedApiKey) : null;\n const headers = parseRequestHeaders(state.requestHeaders);\n\n if (apiKey) {\n headers['X-API-Key'] = apiKey.id || ''; // Note: using id as full key not available\n }\n\n let curl = `curl -X ${state.requestMethod} \"${state.requestUrl}\"`;\n\n // Add headers\n Object.entries(headers).forEach(([key, value]) => {\n curl += ` \\\\\\n -H \"${key}: ${value}\"`;\n });\n\n // Add body for non-GET requests\n if (state.requestBody && state.requestMethod !== 'GET' && isJsonValid) {\n curl += ` \\\\\\n -d '${state.requestBody}'`;\n }\n\n return curl;\n };\n\n const curlCommand = generateCurlCommand();\n\n const handleSendRequest = useCallback(async () => {\n await sendRequest();\n }, [sendRequest]);\n\n return (\n <div className=\"space-y-4\">\n {/* Endpoint Info */}\n {state.selectedEndpoint && <EndpointInfo />}\n\n {/* Request Parameters Form */}\n {state.selectedEndpoint && (\n <RequestParametersForm />\n )}\n\n {/* Request Body */}\n {state.requestMethod !== 'GET' && (\n <Card className=\"\">\n <CardHeader>\n <CardTitle className=\"text-sm text-foreground\">Request Body</CardTitle>\n </CardHeader>\n <CardContent>\n <Textarea\n placeholder='{\\n \"key\": \"value\"\\n}'\n value={state.requestBody}\n onChange={(e) => setRequestBody(e.target.value)}\n className={`font-mono text-sm ${\n !isJsonValid ? 'border-destructive' : ''\n }`}\n rows={6}\n />\n {!isJsonValid && (\n <p className=\"mt-1 text-xs text-destructive\">Invalid JSON format</p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Bearer Token Authentication */}\n <Card className=\"\">\n <CardHeader>\n <CardTitle className=\"flex items-center space-x-2 text-sm text-foreground\">\n <Key className=\"h-4 w-4\" />\n <span>Bearer Token</span>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"password\"\n placeholder=\"Enter Bearer token (optional, uses JWT if empty)\"\n value={state.manualApiToken}\n onChange={(e) => setManualApiToken(e.target.value)}\n className=\"font-mono text-sm\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Leave empty to use JWT token from localStorage\n </p>\n </div>\n <Button\n onClick={handleSendRequest}\n disabled={state.loading || !state.requestUrl || !isJsonValid}\n className=\"bg-primary hover:bg-primary/90 text-primary-foreground flex items-center gap-2\"\n >\n {state.loading ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"hidden sm:inline\">Sending...</span>\n </>\n ) : (\n <>\n <Send className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Send Request</span>\n </>\n )}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* cURL Command */}\n {curlCommand && (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-sm text-foreground\">cURL Command</CardTitle>\n <CopyButton\n value={curlCommand}\n variant=\"outline\"\n size=\"sm\"\n >\n Copy cURL\n </CopyButton>\n </div>\n </CardHeader>\n <CardContent>\n <PrettyCode data={curlCommand} language=\"bash\" />\n </CardContent>\n </Card>\n )}\n </div>\n );\n}; ","'use client';\n\nimport { Download, XCircle } from 'lucide-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, CopyButton\n} from '@djangocfg/ui-core/components';\n\nimport JsonTree from '../../JsonTree';\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { getStatusColor } from '../utils';\n\nexport const ResponseViewer: React.FC = () => {\n const { state } = usePlaygroundContext();\n const { response } = state;\n\n // Memoize response text for copy/download\n const responseText = useMemo(() => {\n if (!response?.data) return '';\n return typeof response.data === 'string' ? response.data : JSON.stringify(response.data, null, 2);\n }, [response?.data]);\n\n const handleDownloadResponse = useCallback(() => {\n if (!responseText) return;\n const blob = new Blob([responseText], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'response.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, [responseText]);\n\n if (!response) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Response</h2>\n </div>\n <Card>\n <CardContent className=\"flex items-center justify-center py-8\">\n <p className=\"text-sm text-muted-foreground\">No response yet. Send a request to see the response here.</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Response</h2>\n <div className=\"flex items-center space-x-2\">\n <CopyButton value={responseText} variant=\"outline\" size=\"sm\">\n Copy\n </CopyButton>\n <Button variant=\"outline\" size=\"sm\" onClick={handleDownloadResponse}>\n <Download className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Download</span>\n </Button>\n </div>\n </div>\n\n {/* Response Status */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm text-foreground\">Response Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Status Code:</span>\n <Badge\n variant={getStatusColor(response.status || 0) === 'success' ? 'default' :\n getStatusColor(response.status || 0) === 'error' ? 'destructive' : 'secondary'}\n className=\"text-xs\"\n >\n {response.status}\n </Badge>\n </div>\n {response.statusText && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Status Text:</span>\n <span className=\"text-sm text-muted-foreground\">{response.statusText}</span>\n </div>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Response Type:</span>\n <span className=\"text-sm text-muted-foreground\">\n {typeof response.data === 'string' ? 'Text' : 'JSON'}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Data Size:</span>\n <span className=\"text-sm text-muted-foreground\">\n {typeof response.data === 'string' ? response.data.length : JSON.stringify(response.data).length} chars\n </span>\n </div>\n </div>\n </div>\n\n {response.error && (\n <div className=\"bg-destructive/10 border border-destructive/20 rounded p-3\">\n <div className=\"flex items-center space-x-2\">\n <XCircle className=\"h-4 w-4 text-destructive\" />\n <p className=\"text-sm text-destructive\">{response.error}</p>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Response Body */}\n <Card>\n <CardContent className=\"p-0\">\n {(() => {\n // Check if response body should be hidden\n const is404 = response.status === 404;\n const isNonJson = typeof response.data === 'string';\n\n if (is404 || isNonJson) {\n return (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {is404\n ? 'Response body hidden for 404 Not Found status'\n : 'Response body hidden for non-JSON responses'}\n </p>\n </div>\n );\n }\n\n if (response.data) {\n return (\n <JsonTree\n title=\"Response Body\"\n data={response.data}\n config={{\n // Smart defaults for API responses\n maxAutoExpandDepth: 2,\n maxAutoExpandArrayItems: 10,\n maxAutoExpandObjectKeys: 5,\n maxStringLength: 200,\n collectionLimit: 50,\n showCollectionInfo: true,\n showExpandControls: true,\n showActionButtons: false, // We have our own copy/download buttons above\n preserveKeyOrder: true,\n className: \"border-0 rounded-none\"\n }}\n />\n );\n }\n\n return (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">No response body available</p>\n </div>\n );\n })()}\n </CardContent>\n </Card>\n\n </div>\n );\n}; ","'use client';\n\nimport { Menu, X } from 'lucide-react';\nimport React from 'react';\n\nimport { Button, Sheet, SheetContent, SheetTrigger } from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { useMobile } from '../hooks/useMobile';\nimport { EndpointsLibrary } from './EndpointsLibrary';\nimport { PlaygroundStepper } from './PlaygroundStepper';\nimport { RequestBuilder } from './RequestBuilder';\nimport { ResponseViewer } from './ResponseViewer';\n\nexport const PlaygroundLayout: React.FC = () => {\n const { state, setSidebarOpen } = usePlaygroundContext();\n const { isMobile } = useMobile();\n\n const renderStepContent = () => {\n switch (state.currentStep) {\n case 'endpoints':\n return <EndpointsLibrary />;\n case 'request':\n return <RequestBuilder />;\n case 'response':\n return <ResponseViewer />;\n default:\n return <EndpointsLibrary />;\n }\n };\n\n return (\n <div>\n {/* Stepper bar */}\n <div className=\"border-b\">\n <div className=\"container mx-auto px-6 py-3\">\n <div className=\"flex items-center justify-between\">\n {/* Mobile Menu */}\n {isMobile ? (\n <>\n <Sheet open={state.sidebarOpen} onOpenChange={setSidebarOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <Menu className=\"h-4 w-4\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-80\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Navigation</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setSidebarOpen(false)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n <PlaygroundStepper />\n </div>\n </SheetContent>\n </Sheet>\n <span className=\"text-sm font-medium text-foreground capitalize\">{state.currentStep}</span>\n <div className=\"w-8\" /> {/* Spacer for centering */}\n </>\n ) : (\n <PlaygroundStepper />\n )}\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"container mx-auto px-6 py-6\">\n {renderStepContent()}\n </div>\n\n {/* Mobile FAB */}\n {isMobile && state.currentStep === 'request' && (\n <div className=\"fixed bottom-4 right-4 z-50\">\n <Button\n size=\"lg\"\n className=\"rounded-full shadow-lg\"\n >\n Send Request\n </Button>\n </div>\n )}\n </div>\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["className"],"mappings":"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","file":"PrettyCode.client-RHOS5D6V.mjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo } from 'react';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\nimport { useTypedT, type I18nTranslations } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false }: PrettyCodeProps) => {\n const t = useTypedT<I18nTranslations>();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div className={`relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n {/* Header with language badge and copy button */}\n <div className=\"absolute top-2 left-3 right-3 z-10 flex items-center justify-between\">\n <span className=\"inline-flex items-center px-2 py-1 rounded text-xs font-medium bg-background/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n <CopyButton\n value={contentJson}\n variant=\"ghost\"\n className=\"h-7 w-7 bg-background/80 border border-border/50 backdrop-blur-sm\"\n iconClassName=\"h-3.5 w-3.5\"\n title={labels.copyCode}\n />\n </div>\n \n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["__name","useTypedT","useResolvedTheme","useMemo","themes","jsx","Highlight","className","jsxs","CopyButton"],"mappings":";;;;;;;;;;AAoBA,IAAM,UAAA,mBAAaA,wBAAA,CAAA,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,IAAA,EAAM,MAAA,GAAS,KAAA,EAAO,QAAA,EAAU,SAAA,GAAY,KAAA,EAAM,KAAuB;AACxH,EAAA,MAAM,IAAIC,cAAA,EAA4B;AACtC,EAAA,MAAM,gBAAgBC,sBAAA,EAAiB;AAEvC,EAAA,MAAM,MAAA,GAASC,cAAQ,OAAO;AAAA,IAC5B,QAAA,EAAU,EAAE,qBAAqB,CAAA;AAAA,IACjC,SAAA,EAAW,EAAE,sBAAsB;AAAA,GACrC,CAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAGP,EAAA,MAAM,QAAA,GAAW,YAAY,SAAA,GAAY,UAAA;AAGzC,EAAA,MAAM,eAAe,IAAA,IAAQ,aAAA;AAC7B,EAAA,MAAM,aAAa,YAAA,KAAiB,MAAA;AAGpC,EAAA,MAAM,UAAA,GAAa,UAAA,GAAaC,yBAAA,CAAO,MAAA,GAASA,yBAAA,CAAO,OAAA;AAGvD,EAAA,MAAM,WAAA,GAAc,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,EAAC,EAAG,IAAA,EAAM,CAAC,CAAA;AAGxF,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,IAAA,OAAW,EAAA,EAAI;AAC7C,IAAA,MAAM,YAAA,GAAe,QAAA,KAAa,UAAA,GAAa,aAAA,GAAgB,UAAA,CAAA;AAC/D,IAAA,MAAM,gBAAA,GAAmB,aAAa,iBAAA,GAAoB,eAAA;AAC1D,IAAA,uBACEC,cAAA,CAAC,SAAI,SAAA,EAAW,CAAA,gBAAA,EAAmB,YAAY,CAAA,mBAAA,EAAsB,gBAAgB,CAAA,CAAA,EAAI,SAAA,IAAa,EAAE,CAAA,CAAA,EACtG,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACb,QAAA,kBAAAA,cAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sCAAA,EAAwC,QAAA,EAAA,MAAA,CAAO,SAAA,EAAU,CAAA,EACxE,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,sBAAA,6CAA0B,IAAA,KAAyB;AACvD,IAAA,QAAQ,IAAA,CAAK,aAAY;AAAG,MAC1B,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,QAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,YAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,YAAA;AAAA,MACT,KAAK,YAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,YAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,MAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,UAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,WAAA;AAAA,MACL,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT;AACE,QAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA;AACtD,EACF,CAAA,EAtC+B,wBAAA,CAAA;AAyC/B,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAGlC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,YAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,YAAA;AAAA,MACT,KAAK,YAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,YAAA;AAAA;AAAA,MACT,KAAK,QAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,MAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,UAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,OAAO,MAAA;AAAA;AAAA,MACT;AAGE,QAAA,OAAO,IAAA,IAAQ,MAAA;AAAA;AACnB,EACF,CAAA,GAAG;AAEH,EAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,aAAA,GAAgB,QAAA,KAAa,UAAA,GAAa,aAAA,GAAgB,aAAA,CAAA;AAChE,IAAA,uBACEA,cAAA,CAACC,4BAAA,EAAA,EAAU,KAAA,EAAO,UAAA,EAAY,MAAM,WAAA,EAAa,QAAA,EAAU,kBAAA,EACxD,QAAA,EAAA,CAAC,EAAE,SAAA,EAAAC,UAAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,eAAc,qBAC1CF,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAGE,UAAS,CAAA,CAAA,EAAI,aAAa,CAAA,mBAAA,EAAsB,SAAA,GAAY,YAAY,SAAS,CAAA,uBAAA,CAAA;AAAA,QAC/F,KAAA,EAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,QAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,iBAAO,GAAA,CAAI,CAAC,SACX,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,oCACd,MAAA,EAAA,EAAgB,GAAG,cAAc,EAAE,KAAA,EAAO,CAAA,EAAA,EAAhC,GAAmC,CAC/C,CACF;AAAA;AAAA,KACH,EAEJ,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,KAAa,UAAA,GAAa,aAAA,GAAgB,UAAA,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,aAAa,iBAAA,GAAoB,eAAA;AAErD,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,gBAAA,EAAmB,OAAO,sBAAsB,WAAW,CAAA,CAAA,EAAI,SAAA,IAAa,EAAE,CAAA,CAAA,EAE5F,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gJAAA,EACb,QAAA,EAAA,eAAA,EACH,CAAA;AAAA,sBACAA,cAAA;AAAA,QAACI,qBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,OAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAU,mEAAA;AAAA,UACV,aAAA,EAAc,aAAA;AAAA,UACd,OAAO,MAAA,CAAO;AAAA;AAAA;AAChB,KAAA,EACF,CAAA;AAAA,oBAEAJ,cAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EACb,yCAACC,4BAAA,EAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAM,WAAA,EAAa,UAAU,kBAAA,EACxD,QAAA,EAAA,CAAC,EAAE,SAAA,EAAAC,UAAAA,EAAW,OAAO,MAAA,EAAQ,YAAA,EAAc,eAAc,KAAM;AAE9D,MAAA,MAAM,EAAE,eAAA,EAAiB,GAAA,EAAK,GAAG,WAAU,GAAI,KAAA;AAC/C,MAAA,uBACAF,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,GAAGE,UAAS,CAAA,WAAA,CAAA;AAAA,UACvB,KAAA,EAAO;AAAA,YACL,GAAG,SAAA;AAAA,YACH,MAAA,EAAQ,CAAA;AAAA,YACR,OAAA,EAAS,uBAAA;AAAA,YACT,QAAA;AAAA,YACA,UAAA,EAAY,YAAY,GAAA,GAAM,GAAA;AAAA,YAC9B,UAAA,EAAY,WAAA;AAAA,YACZ,UAAA,EAAY,UAAA;AAAA,YACZ,SAAA,EAAW,YAAA;AAAA,YACX,YAAA,EAAc;AAAA,WAChB;AAAA,UAEC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBACjBF,cAAA,CAAC,KAAA,EAAA,EAAa,GAAG,YAAA,CAAa,EAAE,IAAA,EAAM,GACnC,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,qBAChBA,cAAA,CAAC,MAAA,EAAA,EAAgB,GAAG,aAAA,CAAc,EAAE,KAAA,EAAO,CAAA,EAAA,EAAhC,GAAmC,CAC/C,CAAA,EAAA,EAHO,CAIV,CACD;AAAA;AAAA,OACH;AAAA,IACD,GACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA,EAtMmB,YAAA,CAAA;AAwMnB,IAAO,yBAAA,GAAQ","file":"PrettyCode.client-TCVEDDCJ.cjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo } from 'react';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\nimport { useTypedT, type I18nTranslations } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false }: PrettyCodeProps) => {\n const t = useTypedT<I18nTranslations>();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div className={`relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n {/* Header with language badge and copy button */}\n <div className=\"absolute top-2 left-3 right-3 z-10 flex items-center justify-between\">\n <span className=\"inline-flex items-center px-2 py-1 rounded text-xs font-medium bg-background/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n <CopyButton\n value={contentJson}\n variant=\"ghost\"\n className=\"h-7 w-7 bg-background/80 border border-border/50 backdrop-blur-sm\"\n iconClassName=\"h-3.5 w-3.5\"\n title={labels.copyCode}\n />\n </div>\n \n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
@@ -1,242 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
4
- var lucideReact = require('lucide-react');
5
- var react = require('react');
6
- var reactJsonTree = require('react-json-tree');
7
- var components = require('@djangocfg/ui-core/components');
8
- var jsxRuntime = require('react/jsx-runtime');
9
-
10
- var MODE_PRESETS = {
11
- full: {
12
- showExpandControls: true,
13
- showActionButtons: true,
14
- showCollectionInfo: true
15
- },
16
- compact: {
17
- showExpandControls: false,
18
- showActionButtons: false,
19
- showCollectionInfo: true
20
- },
21
- inline: {
22
- showExpandControls: false,
23
- showActionButtons: false,
24
- showCollectionInfo: false
25
- }
26
- };
27
- var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
28
- title,
29
- data,
30
- mode = "full",
31
- config = {},
32
- jsonTreeProps = {}
33
- }) => {
34
- const [expandAll, setExpandAll] = react.useState(null);
35
- const [renderKey, setRenderKey] = react.useState(0);
36
- const mergedConfig = react.useMemo(() => ({
37
- ...MODE_PRESETS[mode],
38
- ...config
39
- }), [mode, config]);
40
- const {
41
- maxAutoExpandDepth = 2,
42
- maxAutoExpandArrayItems = 10,
43
- maxAutoExpandObjectKeys = 5,
44
- maxStringLength = 200,
45
- collectionLimit = 50,
46
- showCollectionInfo = true,
47
- showExpandControls = true,
48
- showActionButtons = true,
49
- className = "",
50
- preserveKeyOrder = true
51
- } = mergedConfig;
52
- const jsonTreeTheme = {
53
- scheme: "djangocfg-dark",
54
- base00: "transparent",
55
- // Background
56
- base01: "#1a1a1a",
57
- // Lighter background
58
- base02: "#2a2a2a",
59
- // Selection background
60
- base03: "#6b7280",
61
- // Comments, invisibles
62
- base04: "#9ca3af",
63
- // Dark foreground
64
- base05: "#e5e7eb",
65
- // Default foreground
66
- base06: "#f3f4f6",
67
- // Light foreground
68
- base07: "#ffffff",
69
- // Lightest foreground
70
- base08: "#ef4444",
71
- // Red - for null, undefined
72
- base09: "#f97316",
73
- // Orange - for numbers
74
- base0A: "#eab308",
75
- // Yellow - for strings
76
- base0B: "#22c55e",
77
- // Green - for booleans (true)
78
- base0C: "#06b6d4",
79
- // Cyan - for dates, regex
80
- base0D: "#3b82f6",
81
- // Blue - for keys
82
- base0E: "#a855f7",
83
- // Purple - for functions
84
- base0F: "#f43f5e"
85
- // Pink - for deprecations
86
- };
87
- const shouldExpandNodeInitially = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((keyPath, nodeData, level) => {
88
- if (expandAll === true) return true;
89
- if (expandAll === false) return false;
90
- if (level <= maxAutoExpandDepth) return true;
91
- if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;
92
- if (nodeData && typeof nodeData === "object" && !Array.isArray(nodeData)) {
93
- const keys = Object.keys(nodeData);
94
- return keys.length <= maxAutoExpandObjectKeys;
95
- }
96
- return false;
97
- }, "shouldExpandNodeInitially");
98
- const getItemString = showCollectionInfo ? (nodeType, nodeData) => {
99
- if (nodeType === "Array") {
100
- const length = Array.isArray(nodeData) ? nodeData.length : 0;
101
- return length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground text-sm", children: [
102
- "(",
103
- length,
104
- " items)"
105
- ] }) : null;
106
- }
107
- if (nodeType === "Object") {
108
- const keys = nodeData && typeof nodeData === "object" ? Object.keys(nodeData) : [];
109
- return keys.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground text-sm", children: [
110
- "(",
111
- keys.length,
112
- " keys)"
113
- ] }) : null;
114
- }
115
- return null;
116
- } : () => null;
117
- const postprocessValue = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((value) => {
118
- if (typeof value === "string" && value.length > maxStringLength) {
119
- return value.substring(0, maxStringLength) + "... (truncated)";
120
- }
121
- return value;
122
- }, "postprocessValue");
123
- const isCustomNode = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((value) => {
124
- if (typeof value === "string" && (value.startsWith("http://") || value.startsWith("https://"))) {
125
- return true;
126
- }
127
- return false;
128
- }, "isCustomNode");
129
- const jsonString = JSON.stringify(data, null, 2);
130
- const handleDownload = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
131
- const blob = new Blob([jsonString], { type: "application/json" });
132
- const url = URL.createObjectURL(blob);
133
- const a = document.createElement("a");
134
- a.href = url;
135
- a.download = "data.json";
136
- document.body.appendChild(a);
137
- a.click();
138
- document.body.removeChild(a);
139
- URL.revokeObjectURL(url);
140
- }, "handleDownload");
141
- const containerClasses = react.useMemo(() => {
142
- const base = "relative overflow-hidden";
143
- switch (mode) {
144
- case "full":
145
- return `${base} border border-border rounded-sm h-full ${className}`;
146
- case "compact":
147
- return `${base} border border-border/50 rounded-md ${className}`;
148
- case "inline":
149
- return `${base} ${className}`;
150
- default:
151
- return `${base} ${className}`;
152
- }
153
- }, [mode, className]);
154
- const contentPadding = react.useMemo(() => {
155
- switch (mode) {
156
- case "full":
157
- return "p-4";
158
- case "compact":
159
- return "p-3";
160
- case "inline":
161
- return "p-2";
162
- default:
163
- return "p-4";
164
- }
165
- }, [mode]);
166
- const showHeader = (title || showExpandControls || showActionButtons) && mode === "full";
167
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: containerClasses, children: [
168
- showHeader && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 border-b border-border bg-muted/50 rounded-t-sm", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
169
- title && /* @__PURE__ */ jsxRuntime.jsx("h6", { className: "text-lg font-semibold text-foreground", children: title }),
170
- (showExpandControls || showActionButtons) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
171
- showExpandControls && /* @__PURE__ */ jsxRuntime.jsx(
172
- components.Button,
173
- {
174
- variant: expandAll === true ? "default" : "outline",
175
- size: "sm",
176
- onClick: () => {
177
- const newState = expandAll === true ? false : true;
178
- setExpandAll(newState);
179
- setRenderKey((prev) => prev + 1);
180
- },
181
- className: "h-8 px-2",
182
- children: expandAll === true ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
183
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { className: "h-3 w-3" }),
184
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-xs", children: "Collapse All" })
185
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
186
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-3 w-3" }),
187
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-xs", children: "Expand All" })
188
- ] })
189
- }
190
- ),
191
- showActionButtons && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
192
- /* @__PURE__ */ jsxRuntime.jsx(
193
- components.CopyButton,
194
- {
195
- value: jsonString,
196
- variant: "outline",
197
- size: "sm",
198
- className: "h-8 px-2",
199
- iconClassName: "h-3 w-3",
200
- children: "Copy"
201
- }
202
- ),
203
- /* @__PURE__ */ jsxRuntime.jsxs(
204
- components.Button,
205
- {
206
- variant: "outline",
207
- size: "sm",
208
- onClick: handleDownload,
209
- className: "h-8 px-2",
210
- children: [
211
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "h-3 w-3" }),
212
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-xs hidden sm:inline", children: "Download" })
213
- ]
214
- }
215
- )
216
- ] })
217
- ] })
218
- ] }) }),
219
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `overflow-auto ${contentPadding}`, children: /* @__PURE__ */ jsxRuntime.jsx(
220
- reactJsonTree.JSONTree,
221
- {
222
- data,
223
- theme: jsonTreeTheme,
224
- invertTheme: false,
225
- hideRoot: true,
226
- shouldExpandNodeInitially,
227
- getItemString,
228
- postprocessValue,
229
- isCustomNode,
230
- collectionLimit,
231
- sortObjectKeys: !preserveKeyOrder,
232
- ...jsonTreeProps
233
- },
234
- renderKey
235
- ) })
236
- ] });
237
- }, "JsonTreeComponent");
238
- var JsonTree_default = JsonTreeComponent;
239
-
240
- exports.JsonTree_default = JsonTree_default;
241
- //# sourceMappingURL=chunk-DFWXRCIC.cjs.map
242
- //# sourceMappingURL=chunk-DFWXRCIC.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/JsonTree/index.tsx"],"names":["__name","useState","useMemo","jsxs","jsx","Button","Fragment","ChevronUp","ChevronDown","CopyButton","Download","JSONTree"],"mappings":"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","file":"chunk-DFWXRCIC.cjs","sourcesContent":["'use client';\n\nimport { ChevronDown, ChevronUp, Download } from 'lucide-react';\nimport React, { useState, useMemo } from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nimport { Button, CopyButton } from '@djangocfg/ui-core/components';\n\nexport type { Language } from 'prism-react-renderer';\n\n/**\n * Display modes for JsonTree\n * - full: With toolbar (Expand All, Copy, Download) and border\n * - compact: No toolbar, with subtle border\n * - inline: Minimal, no border, for embedding in other components\n */\nexport type JsonTreeMode = 'full' | 'compact' | 'inline';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n}\n\nexport interface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\n// Mode presets\nconst MODE_PRESETS: Record<JsonTreeMode, Partial<JsonTreeConfig>> = {\n full: {\n showExpandControls: true,\n showActionButtons: true,\n showCollectionInfo: true,\n },\n compact: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: true,\n },\n inline: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: false,\n },\n};\n\nconst JsonTreeComponent = ({\n title,\n data,\n mode = 'full',\n config = {},\n jsonTreeProps = {}\n}: JsonTreeComponentProps) => {\n // State for expand/collapse all\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n\n // Merge mode presets with config (config overrides presets)\n const mergedConfig = useMemo(() => ({\n ...MODE_PRESETS[mode],\n ...config,\n }), [mode, config]);\n\n // Default configuration\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n } = mergedConfig;\n\n // JSON Tree theme optimized for dark theme\n const jsonTreeTheme = {\n scheme: 'djangocfg-dark',\n base00: 'transparent', // Background\n base01: '#1a1a1a', // Lighter background\n base02: '#2a2a2a', // Selection background\n base03: '#6b7280', // Comments, invisibles\n base04: '#9ca3af', // Dark foreground\n base05: '#e5e7eb', // Default foreground\n base06: '#f3f4f6', // Light foreground\n base07: '#ffffff', // Lightest foreground\n base08: '#ef4444', // Red - for null, undefined\n base09: '#f97316', // Orange - for numbers\n base0A: '#eab308', // Yellow - for strings\n base0B: '#22c55e', // Green - for booleans (true)\n base0C: '#06b6d4', // Cyan - for dates, regex\n base0D: '#3b82f6', // Blue - for keys\n base0E: '#a855f7', // Purple - for functions\n base0F: '#f43f5e', // Pink - for deprecations\n };\n\n // Smart expansion logic\n const shouldExpandNodeInitially = (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => {\n // If user explicitly clicked \"Expand All\", expand everything\n if (expandAll === true) return true;\n\n // If user explicitly clicked \"Collapse All\", collapse everything\n if (expandAll === false) return false;\n\n // Default auto-expansion (expandAll === null)\n // Always expand up to maxAutoExpandDepth\n if (level <= maxAutoExpandDepth) return true;\n\n // For arrays, expand if they have less than maxAutoExpandArrayItems\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n\n // For objects, expand if they have less than maxAutoExpandObjectKeys\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n const keys = Object.keys(nodeData);\n return keys.length <= maxAutoExpandObjectKeys;\n }\n\n return false;\n };\n\n // Collection info display\n const getItemString = showCollectionInfo\n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-sm\">({length} items)</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-sm\">({keys.length} keys)</span> : null;\n }\n return null;\n }\n : () => null;\n\n // Value processing for better display\n const postprocessValue = (value: unknown) => {\n // Truncate very long strings\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n // Custom node detection for special formatting\n const isCustomNode = (value: unknown) => {\n // Mark URLs as custom nodes for special styling\n if (typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'))) {\n return true;\n }\n return false;\n };\n\n // JSON string for copy/download\n const jsonString = JSON.stringify(data, null, 2);\n\n // Action handlers\n const handleDownload = () => {\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'data.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n // Container classes based on mode\n const containerClasses = useMemo(() => {\n const base = 'relative overflow-hidden';\n switch (mode) {\n case 'full':\n return `${base} border border-border rounded-sm h-full ${className}`;\n case 'compact':\n return `${base} border border-border/50 rounded-md ${className}`;\n case 'inline':\n return `${base} ${className}`;\n default:\n return `${base} ${className}`;\n }\n }, [mode, className]);\n\n // Content padding based on mode\n const contentPadding = useMemo(() => {\n switch (mode) {\n case 'full':\n return 'p-4';\n case 'compact':\n return 'p-3';\n case 'inline':\n return 'p-2';\n default:\n return 'p-4';\n }\n }, [mode]);\n\n // Show header only in full mode or when title is provided\n const showHeader = (title || showExpandControls || showActionButtons) && mode === 'full';\n\n return (\n <div className={containerClasses}>\n {/* Header with title and controls */}\n {showHeader && (\n <div className=\"p-4 border-b border-border bg-muted/50 rounded-t-sm\">\n <div className=\"flex items-center justify-between\">\n {title && (\n <h6 className=\"text-lg font-semibold text-foreground\">{title}</h6>\n )}\n\n {(showExpandControls || showActionButtons) && (\n <div className=\"flex items-center space-x-2\">\n {/* Expand/Collapse Controls */}\n {showExpandControls && (\n <Button\n variant={expandAll === true ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => {\n const newState = expandAll === true ? false : true;\n setExpandAll(newState);\n setRenderKey(prev => prev + 1);\n }}\n className=\"h-8 px-2\"\n >\n {expandAll === true ? (\n <>\n <ChevronUp className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs\">Collapse All</span>\n </>\n ) : (\n <>\n <ChevronDown className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs\">Expand All</span>\n </>\n )}\n </Button>\n )}\n\n {/* Action Buttons */}\n {showActionButtons && (\n <>\n <CopyButton\n value={jsonString}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 px-2\"\n iconClassName=\"h-3 w-3\"\n >\n Copy\n </CopyButton>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleDownload}\n className=\"h-8 px-2\"\n >\n <Download className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs hidden sm:inline\">Download</span>\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* JSON Tree Content */}\n <div className={`overflow-auto ${contentPadding}`}>\n <JSONTree\n key={renderKey} // Force re-render when expand/collapse state changes\n data={data}\n theme={jsonTreeTheme}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n </div>\n );\n};\n\nexport default JsonTreeComponent;\n"]}