@djangocfg/ui-tools 2.1.247 → 2.1.249
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/JsonTree-F27RMYSI.cjs +11 -0
- package/dist/{JsonTree-63J76I75.mjs.map → JsonTree-F27RMYSI.cjs.map} +1 -1
- package/dist/JsonTree-QTJYSHCV.mjs +5 -0
- package/dist/{JsonTree-BJVX7XUH.cjs.map → JsonTree-QTJYSHCV.mjs.map} +1 -1
- package/dist/{Mermaid.client-Z25LMNPA.cjs → Mermaid.client-RSWUUHIL.cjs} +6 -6
- package/dist/{Mermaid.client-Z25LMNPA.cjs.map → Mermaid.client-RSWUUHIL.cjs.map} +1 -1
- package/dist/{Mermaid.client-5EKULAUZ.mjs → Mermaid.client-XFQ74OYN.mjs} +3 -3
- package/dist/{Mermaid.client-5EKULAUZ.mjs.map → Mermaid.client-XFQ74OYN.mjs.map} +1 -1
- package/dist/{PlaygroundLayout-KE2ME6WH.cjs → PlaygroundLayout-FKXSULJ3.cjs} +21 -21
- package/dist/{PlaygroundLayout-KE2ME6WH.cjs.map → PlaygroundLayout-FKXSULJ3.cjs.map} +1 -1
- package/dist/{PlaygroundLayout-4TCSESTD.mjs → PlaygroundLayout-XMMHPZYP.mjs} +5 -5
- package/dist/{PlaygroundLayout-4TCSESTD.mjs.map → PlaygroundLayout-XMMHPZYP.mjs.map} +1 -1
- package/dist/{PrettyCode.client-K45ON7DD.mjs → PrettyCode.client-OO3KAJSM.mjs} +3 -3
- package/dist/{PrettyCode.client-K45ON7DD.mjs.map → PrettyCode.client-OO3KAJSM.mjs.map} +1 -1
- package/dist/{PrettyCode.client-EMBU27DJ.cjs → PrettyCode.client-V2ZN5DTH.cjs} +5 -5
- package/dist/{PrettyCode.client-EMBU27DJ.cjs.map → PrettyCode.client-V2ZN5DTH.cjs.map} +1 -1
- package/dist/{chunk-G2A6SX5L.cjs → chunk-2SMCH62O.cjs} +34 -82
- package/dist/chunk-2SMCH62O.cjs.map +1 -0
- package/dist/{chunk-TNTCWAVZ.cjs → chunk-33AMWFBZ.cjs} +7 -7
- package/dist/{chunk-TNTCWAVZ.cjs.map → chunk-33AMWFBZ.cjs.map} +1 -1
- package/dist/{chunk-N7EDSU3Z.cjs → chunk-CRHHUOVJ.cjs} +3 -3
- package/dist/{chunk-N7EDSU3Z.cjs.map → chunk-CRHHUOVJ.cjs.map} +1 -1
- package/dist/{chunk-C5PVPPR7.mjs → chunk-LFWQ36LJ.mjs} +3 -3
- package/dist/{chunk-C5PVPPR7.mjs.map → chunk-LFWQ36LJ.mjs.map} +1 -1
- package/dist/{chunk-MBFBVGUP.mjs → chunk-SSUOENAZ.mjs} +35 -83
- package/dist/chunk-SSUOENAZ.mjs.map +1 -0
- package/dist/{chunk-TSDCMPCW.mjs → chunk-SZ2CZEQZ.mjs} +3 -3
- package/dist/{chunk-TSDCMPCW.mjs.map → chunk-SZ2CZEQZ.mjs.map} +1 -1
- package/dist/index.cjs +14 -14
- package/dist/index.mjs +10 -10
- package/package.json +6 -6
- package/src/components/FloatingToolbar/index.tsx +36 -56
- package/dist/JsonTree-63J76I75.mjs +0 -5
- package/dist/JsonTree-BJVX7XUH.cjs +0 -11
- package/dist/chunk-G2A6SX5L.cjs.map +0 -1
- package/dist/chunk-MBFBVGUP.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/PrettyCode/index.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/constants.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["React","jsx"],"mappings":"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","file":"chunk-TSDCMPCW.mjs","sourcesContent":["/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n /** Block scroll capture until user clicks (default: true) */\n scrollIsolation?: boolean;\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","// HTTP method colors mapping\nexport const HTTP_METHOD_COLORS = {\n GET: 'success',\n POST: 'primary',\n PUT: 'warning',\n DELETE: 'error',\n PATCH: 'default',\n} as const;\n\n// HTTP status code colors mapping\nexport const HTTP_STATUS_COLORS = {\n '2': 'success',\n '3': 'default',\n '4': 'warning',\n '5': 'error',\n} as const;\n\n// Default request headers\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n} as const;\n\n// Playground steps configuration\nexport const PLAYGROUND_STEPS = ['endpoints', 'request', 'response'] as const;\n\nexport const STEP_CONFIG = {\n endpoints: {\n title: 'API Endpoints',\n description: 'Browse and select API endpoints',\n },\n request: {\n title: 'Request Builder',\n description: 'Configure your API request',\n },\n response: {\n title: 'Response Viewer',\n description: 'View API response and details',\n },\n} as const;\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// Substitute URL parameters like {id}, {userId}, etc.\nexport const substituteUrlParameters = (\n url: string,\n parameters: Record<string, string>\n): string => {\n let substitutedUrl = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value && value.trim() !== '') {\n // Replace both {key} and %7Bkey%7D patterns (URL encoded version)\n const patterns = [\n new RegExp(`\\\\{${key}\\\\}`, 'g'),\n new RegExp(`%7B${key}%7D`, 'gi'),\n ];\n\n patterns.forEach((pattern) => {\n substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));\n });\n }\n });\n\n return substitutedUrl;\n};\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders, substituteUrlParameters } from '../utils';\nimport { getDefaultVersion } from '../utils/versionManager';\n\nconst createInitialState = (): PlaygroundState => ({\n // Step management\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n\n // Endpoint selection\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n\n // Request configuration\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n\n // Response\n response: null,\n loading: false,\n\n // UI state\n sidebarOpen: false,\n});\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) {\n throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n }\n return context;\n};\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, setState] = useState<PlaygroundState>(() => createInitialState());\n\n // TODO: Get API keys from CFG context - temporarily disabled\n // const { apiKeys: apiKeysResponse, isLoadingApiKeys } = useApiKeysContext();\n // const apiKeys = (apiKeysResponse && apiKeysResponse.results) ? apiKeysResponse.results : [];\n const apiKeys = React.useMemo(() => [], []);\n const isLoadingApiKeys = false;\n\n const updateState = (updates: Partial<PlaygroundState>) => {\n setState((prev) => ({ ...prev, ...updates }));\n };\n\n // Auto-select first API key when available\n useEffect(() => {\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {\n updateState({ selectedApiKey: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);\n\n // Update headers when API key changes\n useEffect(() => {\n try {\n setState(prev => {\n const headers = parseRequestHeaders(prev.requestHeaders);\n let hasChanged = false;\n\n if (prev.selectedApiKey) {\n const apiKey = apiKeys.find(k => k.id === prev.selectedApiKey);\n\n if (apiKey) {\n // Add API key to headers only if it changed\n if (headers['X-API-Key'] !== apiKey.id) {\n headers['X-API-Key'] = apiKey.id;\n hasChanged = true;\n }\n } else {\n // Selected API key no longer exists, clear selection\n return { ...prev, selectedApiKey: null };\n }\n } else {\n // Remove API key from headers if no key is selected\n if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n hasChanged = true;\n }\n }\n\n // Only update if headers actually changed\n if (hasChanged) {\n const updatedHeaders = JSON.stringify(headers, null, 2);\n return { ...prev, requestHeaders: updatedHeaders };\n }\n\n return prev;\n });\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // Removed state.requestHeaders dependency\n\n // Update URL when parameters change\n useEffect(() => {\n if (state.selectedEndpoint && state.parameters) {\n // Path is already a full URL from the endpoint\n const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);\n\n // Only update if URL actually changed to avoid infinite loop\n if (updatedUrl !== state.requestUrl) {\n updateState({ requestUrl: updatedUrl });\n }\n }\n }, [state.parameters, state.selectedEndpoint, state.requestUrl]);\n\n // Step management\n const setCurrentStep = (step: PlaygroundStep) => {\n updateState({ currentStep: step });\n };\n\n const goToNextStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex < state.steps.length - 1) {\n updateState({ currentStep: state.steps[currentIndex + 1] });\n }\n };\n\n const goToPreviousStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex > 0) {\n updateState({ currentStep: state.steps[currentIndex - 1] });\n }\n };\n\n // Endpoint management\n const setSelectedEndpoint = (endpoint: ApiEndpoint | null) => {\n if (endpoint) {\n updateState({\n selectedEndpoint: endpoint,\n requestMethod: endpoint.method,\n requestUrl: endpoint.path,\n parameters: {}, // Reset parameters when endpoint changes\n currentStep: 'request'\n });\n } else {\n updateState({ selectedEndpoint: endpoint });\n }\n };\n\n const setSelectedCategory = (category: string) => {\n updateState({ selectedCategory: category });\n };\n\n const setSearchTerm = (term: string) => {\n updateState({ searchTerm: term });\n };\n\n const setSelectedVersion = (version: string) => {\n updateState({ selectedVersion: version });\n };\n\n // Request management\n const setRequestUrl = (url: string) => {\n updateState({ requestUrl: url });\n };\n\n const setRequestMethod = (method: string) => {\n updateState({ requestMethod: method });\n };\n\n const setRequestHeaders = (headers: string) => {\n updateState({ requestHeaders: headers });\n };\n\n const setRequestBody = (body: string) => {\n updateState({ requestBody: body });\n };\n\n const setSelectedApiKey = (apiKeyId: string | null) => {\n updateState({ selectedApiKey: apiKeyId });\n };\n\n const setManualApiToken = (manualApiToken: string) => {\n updateState({ manualApiToken });\n };\n\n const setParameters = (parameters: Record<string, string>) => {\n updateState({ parameters });\n };\n\n // Response management\n const setResponse = (response: ApiResponse | null) => {\n updateState({ response });\n };\n\n const setLoading = (loading: boolean) => {\n updateState({ loading });\n };\n\n // UI management\n const setSidebarOpen = (sidebarOpen: boolean) => {\n updateState({ sidebarOpen });\n };\n\n // Actions\n const clearAll = useCallback(() => {\n setState(createInitialState());\n }, []);\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n setLoading(true);\n setResponse(null);\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n // Bearer token priority: manual token → JWT token from localStorage\n let bearerToken: string | null = null;\n\n if (state.manualApiToken) {\n // Use manual token if provided\n bearerToken = state.manualApiToken;\n } else {\n // Try to get JWT token from localStorage\n if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n }\n\n if (bearerToken) {\n headers['Authorization'] = `Bearer ${bearerToken}`;\n }\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const responseText = await response.text();\n\n let responseData;\n try {\n responseData = JSON.parse(responseText);\n } catch {\n responseData = responseText;\n }\n\n setResponse({\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n });\n\n consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);\n\n // Auto-advance to response step\n updateState({ currentStep: 'response' });\n } catch (error) {\n consola.error('Request failed:', error);\n setResponse({\n error: error instanceof Error ? error.message : 'Request failed',\n });\n } finally {\n setLoading(false);\n }\n }, [state, setLoading, setResponse]);\n\n const contextValue: PlaygroundContextType = {\n // State\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n\n // Step management\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n\n // Endpoint management\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n\n // Request management\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n\n // Response management\n setResponse,\n setLoading,\n\n // UI management\n setSidebarOpen,\n\n // Actions\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n}; "]}
|
|
1
|
+
{"version":3,"sources":["../src/tools/PrettyCode/index.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/constants.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["React","jsx"],"mappings":"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","file":"chunk-SZ2CZEQZ.mjs","sourcesContent":["/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n /** Block scroll capture until user clicks (default: true) */\n scrollIsolation?: boolean;\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","// HTTP method colors mapping\nexport const HTTP_METHOD_COLORS = {\n GET: 'success',\n POST: 'primary',\n PUT: 'warning',\n DELETE: 'error',\n PATCH: 'default',\n} as const;\n\n// HTTP status code colors mapping\nexport const HTTP_STATUS_COLORS = {\n '2': 'success',\n '3': 'default',\n '4': 'warning',\n '5': 'error',\n} as const;\n\n// Default request headers\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n} as const;\n\n// Playground steps configuration\nexport const PLAYGROUND_STEPS = ['endpoints', 'request', 'response'] as const;\n\nexport const STEP_CONFIG = {\n endpoints: {\n title: 'API Endpoints',\n description: 'Browse and select API endpoints',\n },\n request: {\n title: 'Request Builder',\n description: 'Configure your API request',\n },\n response: {\n title: 'Response Viewer',\n description: 'View API response and details',\n },\n} as const;\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// Substitute URL parameters like {id}, {userId}, etc.\nexport const substituteUrlParameters = (\n url: string,\n parameters: Record<string, string>\n): string => {\n let substitutedUrl = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value && value.trim() !== '') {\n // Replace both {key} and %7Bkey%7D patterns (URL encoded version)\n const patterns = [\n new RegExp(`\\\\{${key}\\\\}`, 'g'),\n new RegExp(`%7B${key}%7D`, 'gi'),\n ];\n\n patterns.forEach((pattern) => {\n substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));\n });\n }\n });\n\n return substitutedUrl;\n};\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders, substituteUrlParameters } from '../utils';\nimport { getDefaultVersion } from '../utils/versionManager';\n\nconst createInitialState = (): PlaygroundState => ({\n // Step management\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n\n // Endpoint selection\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n\n // Request configuration\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n\n // Response\n response: null,\n loading: false,\n\n // UI state\n sidebarOpen: false,\n});\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) {\n throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n }\n return context;\n};\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, setState] = useState<PlaygroundState>(() => createInitialState());\n\n // TODO: Get API keys from CFG context - temporarily disabled\n // const { apiKeys: apiKeysResponse, isLoadingApiKeys } = useApiKeysContext();\n // const apiKeys = (apiKeysResponse && apiKeysResponse.results) ? apiKeysResponse.results : [];\n const apiKeys = React.useMemo(() => [], []);\n const isLoadingApiKeys = false;\n\n const updateState = (updates: Partial<PlaygroundState>) => {\n setState((prev) => ({ ...prev, ...updates }));\n };\n\n // Auto-select first API key when available\n useEffect(() => {\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {\n updateState({ selectedApiKey: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);\n\n // Update headers when API key changes\n useEffect(() => {\n try {\n setState(prev => {\n const headers = parseRequestHeaders(prev.requestHeaders);\n let hasChanged = false;\n\n if (prev.selectedApiKey) {\n const apiKey = apiKeys.find(k => k.id === prev.selectedApiKey);\n\n if (apiKey) {\n // Add API key to headers only if it changed\n if (headers['X-API-Key'] !== apiKey.id) {\n headers['X-API-Key'] = apiKey.id;\n hasChanged = true;\n }\n } else {\n // Selected API key no longer exists, clear selection\n return { ...prev, selectedApiKey: null };\n }\n } else {\n // Remove API key from headers if no key is selected\n if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n hasChanged = true;\n }\n }\n\n // Only update if headers actually changed\n if (hasChanged) {\n const updatedHeaders = JSON.stringify(headers, null, 2);\n return { ...prev, requestHeaders: updatedHeaders };\n }\n\n return prev;\n });\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // Removed state.requestHeaders dependency\n\n // Update URL when parameters change\n useEffect(() => {\n if (state.selectedEndpoint && state.parameters) {\n // Path is already a full URL from the endpoint\n const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);\n\n // Only update if URL actually changed to avoid infinite loop\n if (updatedUrl !== state.requestUrl) {\n updateState({ requestUrl: updatedUrl });\n }\n }\n }, [state.parameters, state.selectedEndpoint, state.requestUrl]);\n\n // Step management\n const setCurrentStep = (step: PlaygroundStep) => {\n updateState({ currentStep: step });\n };\n\n const goToNextStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex < state.steps.length - 1) {\n updateState({ currentStep: state.steps[currentIndex + 1] });\n }\n };\n\n const goToPreviousStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex > 0) {\n updateState({ currentStep: state.steps[currentIndex - 1] });\n }\n };\n\n // Endpoint management\n const setSelectedEndpoint = (endpoint: ApiEndpoint | null) => {\n if (endpoint) {\n updateState({\n selectedEndpoint: endpoint,\n requestMethod: endpoint.method,\n requestUrl: endpoint.path,\n parameters: {}, // Reset parameters when endpoint changes\n currentStep: 'request'\n });\n } else {\n updateState({ selectedEndpoint: endpoint });\n }\n };\n\n const setSelectedCategory = (category: string) => {\n updateState({ selectedCategory: category });\n };\n\n const setSearchTerm = (term: string) => {\n updateState({ searchTerm: term });\n };\n\n const setSelectedVersion = (version: string) => {\n updateState({ selectedVersion: version });\n };\n\n // Request management\n const setRequestUrl = (url: string) => {\n updateState({ requestUrl: url });\n };\n\n const setRequestMethod = (method: string) => {\n updateState({ requestMethod: method });\n };\n\n const setRequestHeaders = (headers: string) => {\n updateState({ requestHeaders: headers });\n };\n\n const setRequestBody = (body: string) => {\n updateState({ requestBody: body });\n };\n\n const setSelectedApiKey = (apiKeyId: string | null) => {\n updateState({ selectedApiKey: apiKeyId });\n };\n\n const setManualApiToken = (manualApiToken: string) => {\n updateState({ manualApiToken });\n };\n\n const setParameters = (parameters: Record<string, string>) => {\n updateState({ parameters });\n };\n\n // Response management\n const setResponse = (response: ApiResponse | null) => {\n updateState({ response });\n };\n\n const setLoading = (loading: boolean) => {\n updateState({ loading });\n };\n\n // UI management\n const setSidebarOpen = (sidebarOpen: boolean) => {\n updateState({ sidebarOpen });\n };\n\n // Actions\n const clearAll = useCallback(() => {\n setState(createInitialState());\n }, []);\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n setLoading(true);\n setResponse(null);\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n // Bearer token priority: manual token → JWT token from localStorage\n let bearerToken: string | null = null;\n\n if (state.manualApiToken) {\n // Use manual token if provided\n bearerToken = state.manualApiToken;\n } else {\n // Try to get JWT token from localStorage\n if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n }\n\n if (bearerToken) {\n headers['Authorization'] = `Bearer ${bearerToken}`;\n }\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const responseText = await response.text();\n\n let responseData;\n try {\n responseData = JSON.parse(responseText);\n } catch {\n responseData = responseText;\n }\n\n setResponse({\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n });\n\n consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);\n\n // Auto-advance to response step\n updateState({ currentStep: 'response' });\n } catch (error) {\n consola.error('Request failed:', error);\n setResponse({\n error: error instanceof Error ? error.message : 'Request failed',\n });\n } finally {\n setLoading(false);\n }\n }, [state, setLoading, setResponse]);\n\n const contextValue: PlaygroundContextType = {\n // State\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n\n // Step management\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n\n // Endpoint management\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n\n // Request management\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n\n // Response management\n setResponse,\n setLoading,\n\n // UI management\n setSidebarOpen,\n\n // Actions\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n}; "]}
|
package/dist/index.cjs
CHANGED
|
@@ -6,9 +6,9 @@ require('./chunk-F2N7P5XU.cjs');
|
|
|
6
6
|
var chunkIHAY6FO6_cjs = require('./chunk-IHAY6FO6.cjs');
|
|
7
7
|
var chunk77HQWEQ6_cjs = require('./chunk-77HQWEQ6.cjs');
|
|
8
8
|
var chunkF2CMIIOH_cjs = require('./chunk-F2CMIIOH.cjs');
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
require('./chunk-
|
|
9
|
+
var chunkCRHHUOVJ_cjs = require('./chunk-CRHHUOVJ.cjs');
|
|
10
|
+
var chunk33AMWFBZ_cjs = require('./chunk-33AMWFBZ.cjs');
|
|
11
|
+
require('./chunk-2SMCH62O.cjs');
|
|
12
12
|
var chunkL37FZYJU_cjs = require('./chunk-L37FZYJU.cjs');
|
|
13
13
|
var chunkPRPG2T2E_cjs = require('./chunk-PRPG2T2E.cjs');
|
|
14
14
|
var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
|
|
@@ -218,7 +218,7 @@ function createLazyComponent(loader, options = {}) {
|
|
|
218
218
|
return WrappedComponent;
|
|
219
219
|
}
|
|
220
220
|
chunkWGEGR3DF_cjs.__name(createLazyComponent, "createLazyComponent");
|
|
221
|
-
var MermaidClient = React3.lazy(() => import('./Mermaid.client-
|
|
221
|
+
var MermaidClient = React3.lazy(() => import('./Mermaid.client-RSWUUHIL.cjs'));
|
|
222
222
|
var LoadingFallback2 = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center items-center min-h-[100px]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "animate-spin rounded-full h-6 w-6 border-b-2 border-primary" }) }), "LoadingFallback");
|
|
223
223
|
var Mermaid = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((props) => {
|
|
224
224
|
return /* @__PURE__ */ jsxRuntime.jsx(React3.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback2, {}), children: /* @__PURE__ */ jsxRuntime.jsx(MermaidClient, { ...props }) });
|
|
@@ -372,7 +372,7 @@ var CodeBlock = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ code, language, isUs
|
|
|
372
372
|
}
|
|
373
373
|
),
|
|
374
374
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
375
|
-
|
|
375
|
+
chunkCRHHUOVJ_cjs.PrettyCode_default,
|
|
376
376
|
{
|
|
377
377
|
data: code,
|
|
378
378
|
language,
|
|
@@ -700,7 +700,7 @@ var LazyMapView = createLazyComponent(
|
|
|
700
700
|
}
|
|
701
701
|
);
|
|
702
702
|
var LazyMermaid = createLazyComponent(
|
|
703
|
-
() => import('./Mermaid.client-
|
|
703
|
+
() => import('./Mermaid.client-RSWUUHIL.cjs'),
|
|
704
704
|
{
|
|
705
705
|
displayName: "LazyMermaid",
|
|
706
706
|
fallback: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -721,7 +721,7 @@ function CodeLoadingFallback() {
|
|
|
721
721
|
}
|
|
722
722
|
chunkWGEGR3DF_cjs.__name(CodeLoadingFallback, "CodeLoadingFallback");
|
|
723
723
|
var LazyPrettyCode = createLazyComponent(
|
|
724
|
-
() => import('./PrettyCode.client-
|
|
724
|
+
() => import('./PrettyCode.client-V2ZN5DTH.cjs'),
|
|
725
725
|
{
|
|
726
726
|
displayName: "LazyPrettyCode",
|
|
727
727
|
fallback: /* @__PURE__ */ jsxRuntime.jsx(CodeLoadingFallback, {})
|
|
@@ -735,14 +735,14 @@ function OpenapiLoadingFallback() {
|
|
|
735
735
|
}
|
|
736
736
|
chunkWGEGR3DF_cjs.__name(OpenapiLoadingFallback, "OpenapiLoadingFallback");
|
|
737
737
|
var LazyPlaygroundLayout = createLazyComponent(
|
|
738
|
-
() => import('./PlaygroundLayout-
|
|
738
|
+
() => import('./PlaygroundLayout-FKXSULJ3.cjs').then((mod) => ({ default: mod.PlaygroundLayout })),
|
|
739
739
|
{
|
|
740
740
|
displayName: "LazyPlaygroundLayout",
|
|
741
741
|
fallback: /* @__PURE__ */ jsxRuntime.jsx(OpenapiLoadingFallback, {})
|
|
742
742
|
}
|
|
743
743
|
);
|
|
744
744
|
var LazyOpenapiViewer = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ config }) => {
|
|
745
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
745
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkCRHHUOVJ_cjs.PlaygroundProvider, { config, children: /* @__PURE__ */ jsxRuntime.jsx(LazyPlaygroundLayout, {}) });
|
|
746
746
|
}, "LazyOpenapiViewer");
|
|
747
747
|
LazyOpenapiViewer.displayName = "LazyOpenapiViewer";
|
|
748
748
|
var LazyJsonSchemaForm = createLazyComponent(
|
|
@@ -851,7 +851,7 @@ var LazyVideoPlayer = createLazyComponent(
|
|
|
851
851
|
}
|
|
852
852
|
);
|
|
853
853
|
var LazyJsonTree = createLazyComponent(
|
|
854
|
-
() => import('./JsonTree-
|
|
854
|
+
() => import('./JsonTree-F27RMYSI.cjs'),
|
|
855
855
|
{
|
|
856
856
|
displayName: "LazyJsonTree",
|
|
857
857
|
fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback, { minHeight: 100, text: "Loading JSON viewer..." })
|
|
@@ -890,11 +890,11 @@ function LottiePlayer(props) {
|
|
|
890
890
|
}
|
|
891
891
|
chunkWGEGR3DF_cjs.__name(LottiePlayer, "LottiePlayer");
|
|
892
892
|
var PlaygroundLayout = React3.lazy(
|
|
893
|
-
() => import('./PlaygroundLayout-
|
|
893
|
+
() => import('./PlaygroundLayout-FKXSULJ3.cjs').then((mod) => ({ default: mod.PlaygroundLayout }))
|
|
894
894
|
);
|
|
895
895
|
var LoadingFallback9 = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center min-h-[400px]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground", children: "Loading API Playground..." }) }), "LoadingFallback");
|
|
896
896
|
var Playground = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ config }) => {
|
|
897
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
897
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkCRHHUOVJ_cjs.PlaygroundProvider, { config, children: /* @__PURE__ */ jsxRuntime.jsx(React3.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback9, {}), children: /* @__PURE__ */ jsxRuntime.jsx(PlaygroundLayout, {}) }) });
|
|
898
898
|
}, "Playground");
|
|
899
899
|
var OpenapiViewer_default = Playground;
|
|
900
900
|
var CronSchedulerClient = React3.lazy(() => import('./CronScheduler.client-A4GO6YBY.cjs'));
|
|
@@ -2151,11 +2151,11 @@ Object.defineProperty(exports, "useCronWeekDays", {
|
|
|
2151
2151
|
});
|
|
2152
2152
|
Object.defineProperty(exports, "PrettyCode", {
|
|
2153
2153
|
enumerable: true,
|
|
2154
|
-
get: function () { return
|
|
2154
|
+
get: function () { return chunkCRHHUOVJ_cjs.PrettyCode_default; }
|
|
2155
2155
|
});
|
|
2156
2156
|
Object.defineProperty(exports, "JsonTree", {
|
|
2157
2157
|
enumerable: true,
|
|
2158
|
-
get: function () { return
|
|
2158
|
+
get: function () { return chunk33AMWFBZ_cjs.JsonTree_default; }
|
|
2159
2159
|
});
|
|
2160
2160
|
Object.defineProperty(exports, "ArrayFieldItemTemplate", {
|
|
2161
2161
|
enumerable: true,
|
package/dist/index.mjs
CHANGED
|
@@ -4,10 +4,10 @@ import './chunk-JWB2EWQO.mjs';
|
|
|
4
4
|
export { ImageViewer } from './chunk-GGKGH5PM.mjs';
|
|
5
5
|
export { generateContentKey, useAudioCache, useBlobUrlCleanup, useImageCache, useMediaCacheStore, useVideoCache, useVideoPlayerSettings } from './chunk-5LBDYFWH.mjs';
|
|
6
6
|
export { CronSchedulerProvider, CustomInput, DayChips, MonthDayGrid, SchedulePreview, ScheduleTypeSelector, TimeSelector, buildCron, humanizeCron, isValidCron, parseCron, useCronCustom, useCronMonthDays, useCronPreview, useCronScheduler, useCronSchedulerContext, useCronTime, useCronType, useCronWeekDays } from './chunk-PZKAH7WQ.mjs';
|
|
7
|
-
import { PlaygroundProvider, PrettyCode_default } from './chunk-
|
|
8
|
-
export { PrettyCode_default as PrettyCode } from './chunk-
|
|
9
|
-
export { JsonTree_default as JsonTree } from './chunk-
|
|
10
|
-
import './chunk-
|
|
7
|
+
import { PlaygroundProvider, PrettyCode_default } from './chunk-SZ2CZEQZ.mjs';
|
|
8
|
+
export { PrettyCode_default as PrettyCode } from './chunk-SZ2CZEQZ.mjs';
|
|
9
|
+
export { JsonTree_default as JsonTree } from './chunk-LFWQ36LJ.mjs';
|
|
10
|
+
import './chunk-SSUOENAZ.mjs';
|
|
11
11
|
export { ArrayFieldItemTemplate, ArrayFieldTemplate, BaseInputTemplate, CheckboxWidget, ColorWidget, ErrorListTemplate, FieldTemplate, JsonSchemaForm, NumberWidget, ObjectFieldTemplate, SelectWidget, SliderWidget, SwitchWidget, TextWidget, getRequiredFields, hasRequiredFields, mergeDefaults, normalizeFormData, safeJsonParse, safeJsonStringify, validateRequiredFields, validateSchema } from './chunk-JUGQNNDC.mjs';
|
|
12
12
|
export { useLottie } from './chunk-6JTB2X72.mjs';
|
|
13
13
|
import { __name } from './chunk-CGILA3WO.mjs';
|
|
@@ -191,7 +191,7 @@ function createLazyComponent(loader, options = {}) {
|
|
|
191
191
|
return WrappedComponent;
|
|
192
192
|
}
|
|
193
193
|
__name(createLazyComponent, "createLazyComponent");
|
|
194
|
-
var MermaidClient = lazy(() => import('./Mermaid.client-
|
|
194
|
+
var MermaidClient = lazy(() => import('./Mermaid.client-XFQ74OYN.mjs'));
|
|
195
195
|
var LoadingFallback2 = /* @__PURE__ */ __name(() => /* @__PURE__ */ jsx("div", { className: "flex justify-center items-center min-h-[100px]", children: /* @__PURE__ */ jsx("div", { className: "animate-spin rounded-full h-6 w-6 border-b-2 border-primary" }) }), "LoadingFallback");
|
|
196
196
|
var Mermaid = /* @__PURE__ */ __name((props) => {
|
|
197
197
|
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingFallback2, {}), children: /* @__PURE__ */ jsx(MermaidClient, { ...props }) });
|
|
@@ -673,7 +673,7 @@ var LazyMapView = createLazyComponent(
|
|
|
673
673
|
}
|
|
674
674
|
);
|
|
675
675
|
var LazyMermaid = createLazyComponent(
|
|
676
|
-
() => import('./Mermaid.client-
|
|
676
|
+
() => import('./Mermaid.client-XFQ74OYN.mjs'),
|
|
677
677
|
{
|
|
678
678
|
displayName: "LazyMermaid",
|
|
679
679
|
fallback: /* @__PURE__ */ jsx(
|
|
@@ -694,7 +694,7 @@ function CodeLoadingFallback() {
|
|
|
694
694
|
}
|
|
695
695
|
__name(CodeLoadingFallback, "CodeLoadingFallback");
|
|
696
696
|
var LazyPrettyCode = createLazyComponent(
|
|
697
|
-
() => import('./PrettyCode.client-
|
|
697
|
+
() => import('./PrettyCode.client-OO3KAJSM.mjs'),
|
|
698
698
|
{
|
|
699
699
|
displayName: "LazyPrettyCode",
|
|
700
700
|
fallback: /* @__PURE__ */ jsx(CodeLoadingFallback, {})
|
|
@@ -708,7 +708,7 @@ function OpenapiLoadingFallback() {
|
|
|
708
708
|
}
|
|
709
709
|
__name(OpenapiLoadingFallback, "OpenapiLoadingFallback");
|
|
710
710
|
var LazyPlaygroundLayout = createLazyComponent(
|
|
711
|
-
() => import('./PlaygroundLayout-
|
|
711
|
+
() => import('./PlaygroundLayout-XMMHPZYP.mjs').then((mod) => ({ default: mod.PlaygroundLayout })),
|
|
712
712
|
{
|
|
713
713
|
displayName: "LazyPlaygroundLayout",
|
|
714
714
|
fallback: /* @__PURE__ */ jsx(OpenapiLoadingFallback, {})
|
|
@@ -824,7 +824,7 @@ var LazyVideoPlayer = createLazyComponent(
|
|
|
824
824
|
}
|
|
825
825
|
);
|
|
826
826
|
var LazyJsonTree = createLazyComponent(
|
|
827
|
-
() => import('./JsonTree-
|
|
827
|
+
() => import('./JsonTree-QTJYSHCV.mjs'),
|
|
828
828
|
{
|
|
829
829
|
displayName: "LazyJsonTree",
|
|
830
830
|
fallback: /* @__PURE__ */ jsx(LoadingFallback, { minHeight: 100, text: "Loading JSON viewer..." })
|
|
@@ -863,7 +863,7 @@ function LottiePlayer(props) {
|
|
|
863
863
|
}
|
|
864
864
|
__name(LottiePlayer, "LottiePlayer");
|
|
865
865
|
var PlaygroundLayout = lazy(
|
|
866
|
-
() => import('./PlaygroundLayout-
|
|
866
|
+
() => import('./PlaygroundLayout-XMMHPZYP.mjs').then((mod) => ({ default: mod.PlaygroundLayout }))
|
|
867
867
|
);
|
|
868
868
|
var LoadingFallback9 = /* @__PURE__ */ __name(() => /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-[400px]", children: /* @__PURE__ */ jsx("div", { className: "text-muted-foreground", children: "Loading API Playground..." }) }), "LoadingFallback");
|
|
869
869
|
var Playground = /* @__PURE__ */ __name(({ config }) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@djangocfg/ui-tools",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.249",
|
|
4
4
|
"description": "Heavy React tools with lazy loading - for Electron, Vite, CRA, Next.js apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ui-tools",
|
|
@@ -85,8 +85,8 @@
|
|
|
85
85
|
"check": "tsc --noEmit"
|
|
86
86
|
},
|
|
87
87
|
"peerDependencies": {
|
|
88
|
-
"@djangocfg/i18n": "^2.1.
|
|
89
|
-
"@djangocfg/ui-core": "^2.1.
|
|
88
|
+
"@djangocfg/i18n": "^2.1.249",
|
|
89
|
+
"@djangocfg/ui-core": "^2.1.249",
|
|
90
90
|
"consola": "^3.4.2",
|
|
91
91
|
"lucide-react": "^0.545.0",
|
|
92
92
|
"react": "^19.1.0",
|
|
@@ -128,10 +128,10 @@
|
|
|
128
128
|
"@maplibre/maplibre-gl-geocoder": "^1.7.0"
|
|
129
129
|
},
|
|
130
130
|
"devDependencies": {
|
|
131
|
-
"@djangocfg/i18n": "^2.1.
|
|
131
|
+
"@djangocfg/i18n": "^2.1.249",
|
|
132
132
|
"@djangocfg/playground": "workspace:*",
|
|
133
|
-
"@djangocfg/typescript-config": "^2.1.
|
|
134
|
-
"@djangocfg/ui-core": "^2.1.
|
|
133
|
+
"@djangocfg/typescript-config": "^2.1.249",
|
|
134
|
+
"@djangocfg/ui-core": "^2.1.249",
|
|
135
135
|
"@types/mapbox__mapbox-gl-draw": "^1.4.8",
|
|
136
136
|
"@types/node": "^24.7.2",
|
|
137
137
|
"@types/react": "^19.1.0",
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import React, { useState } from 'react';
|
|
4
4
|
|
|
5
5
|
import './FloatingToolbar.css';
|
|
6
|
-
import { useElementCorner } from './hooks/useElementCorner';
|
|
7
6
|
import { useScrollIsolation } from './hooks/useScrollIsolation';
|
|
8
7
|
|
|
9
8
|
export interface FloatingToolbarProps {
|
|
@@ -27,8 +26,10 @@ export interface FloatingToolbarProps {
|
|
|
27
26
|
scrollIsolation?: boolean;
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Toolbar is anchored with `position: absolute` inside the container (PrettyCode, etc.).
|
|
31
|
+
* `position: fixed` + viewport coordinates breaks embedded layouts (e.g. chat composer overlap).
|
|
32
|
+
*/
|
|
32
33
|
export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
|
|
33
34
|
containerRef,
|
|
34
35
|
children,
|
|
@@ -38,14 +39,9 @@ export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
|
|
|
38
39
|
zIndex = 30,
|
|
39
40
|
scrollIsolation = true,
|
|
40
41
|
}) => {
|
|
41
|
-
const corner = useElementCorner(containerRef);
|
|
42
42
|
const { locked, unlock } = useScrollIsolation(containerRef, scrollIsolation);
|
|
43
43
|
const [overlayHovered, setOverlayHovered] = useState(false);
|
|
44
44
|
|
|
45
|
-
// Overlay always renders (even before corner is measured) — it's position:absolute
|
|
46
|
-
// inside the container so it works immediately on mount.
|
|
47
|
-
// It absorbs wheel events (pointer-events cover the container) so the page scrolls normally.
|
|
48
|
-
// Click anywhere inside unlocks it; click outside re-locks it.
|
|
49
45
|
const overlay =
|
|
50
46
|
scrollIsolation && locked ? (
|
|
51
47
|
<div
|
|
@@ -65,62 +61,46 @@ export const FloatingToolbar: React.FC<FloatingToolbarProps> = ({
|
|
|
65
61
|
}}
|
|
66
62
|
>
|
|
67
63
|
{overlayHovered && (
|
|
68
|
-
<span
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
<span
|
|
65
|
+
style={{
|
|
66
|
+
fontSize: '0.75rem',
|
|
67
|
+
padding: '0.25rem 0.625rem',
|
|
68
|
+
borderRadius: '9999px',
|
|
69
|
+
background: 'rgba(0,0,0,0.55)',
|
|
70
|
+
color: '#fff',
|
|
71
|
+
pointerEvents: 'none',
|
|
72
|
+
userSelect: 'none',
|
|
73
|
+
}}
|
|
74
|
+
>
|
|
77
75
|
Click to scroll
|
|
78
76
|
</span>
|
|
79
77
|
)}
|
|
80
78
|
</div>
|
|
81
79
|
) : null;
|
|
82
80
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const viewportHeight = window.visualViewport?.height ?? document.documentElement.clientHeight;
|
|
88
|
-
|
|
89
|
-
const inView = bottom > 0 && top < viewportHeight && bottom - top >= MIN_HEIGHT;
|
|
81
|
+
const positionStyle: React.CSSProperties =
|
|
82
|
+
position === 'bottom-right'
|
|
83
|
+
? { bottom: offset, right: offset }
|
|
84
|
+
: { top: offset, right: offset };
|
|
90
85
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
const toolbar = (
|
|
87
|
+
<div
|
|
88
|
+
className="flex items-center gap-1"
|
|
89
|
+
style={{
|
|
90
|
+
position: 'absolute',
|
|
91
|
+
...positionStyle,
|
|
95
92
|
zIndex,
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (style.bottom !== undefined || style.top !== undefined) {
|
|
110
|
-
toolbar = (
|
|
111
|
-
<div className="flex items-center gap-1" style={style}>
|
|
112
|
-
{label && (
|
|
113
|
-
<>
|
|
114
|
-
{label}
|
|
115
|
-
<div className="w-px h-4 bg-border/50 mx-0.5" />
|
|
116
|
-
</>
|
|
117
|
-
)}
|
|
118
|
-
{children}
|
|
119
|
-
</div>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
93
|
+
}}
|
|
94
|
+
>
|
|
95
|
+
{label && (
|
|
96
|
+
<>
|
|
97
|
+
{label}
|
|
98
|
+
<div className="w-px h-4 bg-border/50 mx-0.5" />
|
|
99
|
+
</>
|
|
100
|
+
)}
|
|
101
|
+
{children}
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
124
104
|
|
|
125
105
|
return (
|
|
126
106
|
<>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkTNTCWAVZ_cjs = require('./chunk-TNTCWAVZ.cjs');
|
|
4
|
-
require('./chunk-G2A6SX5L.cjs');
|
|
5
|
-
require('./chunk-WGEGR3DF.cjs');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
module.exports = chunkTNTCWAVZ_cjs.JsonTree_default;
|
|
10
|
-
//# sourceMappingURL=JsonTree-BJVX7XUH.cjs.map
|
|
11
|
-
//# sourceMappingURL=JsonTree-BJVX7XUH.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/FloatingToolbar/hooks/useElementCorner.ts","../src/components/FloatingToolbar/hooks/useScrollIsolation.ts","../src/components/FloatingToolbar/index.tsx","../src/components/FloatingToolbar/actions/CopyAction.tsx","../src/components/FloatingToolbar/actions/DownloadAction.tsx","../src/components/FloatingToolbar/actions/ExpandAction.tsx","../src/components/FloatingToolbar/actions/FullscreenAction.tsx"],"names":["useState","useRef","useEffect","__name","useCallback","jsx","jsxs","Fragment","CopyButton","BUTTON_CLASS","Button","Download","ChevronUp","ChevronDown","Minimize2","Maximize2"],"mappings":"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","file":"chunk-G2A6SX5L.cjs","sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\ninterface Corner {\n top: number;\n right: number;\n bottom: number;\n}\n\n/**\n * Tracks the top-right corner of a referenced element in viewport coordinates.\n * Returns { top, right } in px — ready for `position: fixed` toolbar placement.\n *\n * Uses `visualViewport` for accurate viewport width — correctly handles:\n * - DevTools panel open (docked left/right/bottom)\n * - Browser zoom\n * - Mobile virtual keyboard / pinch-zoom\n * - Scrollbars\n *\n * Falls back to `document.documentElement.clientWidth` (excludes scrollbars,\n * matches `position: fixed` coordinate space) when visualViewport is unavailable.\n *\n * Updates on:\n * - Any ancestor scroll (capture phase)\n * - visualViewport resize/scroll\n * - ResizeObserver on the element itself\n */\nexport function useElementCorner(ref: React.RefObject<HTMLElement | null>) {\n const [corner, setCorner] = useState<Corner | null>(null);\n const updateRef = useRef<() => void>(() => {});\n\n updateRef.current = () => {\n if (!ref.current) return;\n const rect = ref.current.getBoundingClientRect();\n\n // `position: fixed` is relative to the layout viewport (document.documentElement.clientWidth),\n // NOT window.innerWidth (which includes scrollbar gutter).\n // visualViewport.width is the visible area — same as layout viewport when no zoom/keyboard.\n const viewportWidth =\n window.visualViewport?.width ?? document.documentElement.clientWidth;\n\n setCorner({\n top: rect.top,\n right: viewportWidth - rect.right,\n bottom: rect.bottom,\n });\n };\n\n useEffect(() => {\n const handler = () => updateRef.current();\n\n handler();\n\n // Element size changes\n const ro = new ResizeObserver(handler);\n if (ref.current) ro.observe(ref.current);\n\n // Any ancestor scroll (capture catches all, including overflow:auto containers)\n window.addEventListener('scroll', handler, { capture: true, passive: true });\n\n // visualViewport handles: DevTools resize, browser zoom, mobile keyboard\n const vv = window.visualViewport;\n if (vv) {\n vv.addEventListener('resize', handler);\n vv.addEventListener('scroll', handler);\n } else {\n window.addEventListener('resize', handler, { passive: true });\n }\n\n return () => {\n ro.disconnect();\n window.removeEventListener('scroll', handler, { capture: true });\n if (vv) {\n vv.removeEventListener('resize', handler);\n vv.removeEventListener('scroll', handler);\n } else {\n window.removeEventListener('resize', handler);\n }\n };\n }, [ref]);\n\n return corner;\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nconst UNLOCKED_CLASS = 'scroll-unlocked';\n\n/**\n * Scroll isolation — prevents the container from capturing wheel scroll\n * until the user explicitly clicks inside it (like Google Maps).\n *\n * Locked (overlay visible): wheel events on container scroll the PAGE.\n * Unlocked: normal scroll inside the container.\n *\n * Unlock: click anywhere inside the container.\n * Re-lock: click outside the container.\n *\n * When unlocked, adds `scroll-unlocked` class to the container element\n * so it can be styled (e.g. focus ring) via CSS.\n */\nexport function useScrollIsolation(\n ref: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n) {\n const [locked, setLocked] = useState(true);\n\n const unlock = useCallback(() => setLocked(false), []);\n\n // Re-lock when clicking outside the container\n useEffect(() => {\n if (!enabled) return;\n\n const handleDocClick = (e: MouseEvent) => {\n const el = ref.current;\n if (!el) return;\n if (!el.contains(e.target as Node)) {\n setLocked(true);\n }\n };\n\n document.addEventListener('click', handleDocClick, true);\n return () => document.removeEventListener('click', handleDocClick, true);\n }, [enabled, ref]);\n\n // Toggle class on container to allow CSS-driven focus ring\n useEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n if (locked) {\n el.classList.remove(UNLOCKED_CLASS);\n } else {\n el.classList.add(UNLOCKED_CLASS);\n }\n return () => el.classList.remove(UNLOCKED_CLASS);\n }, [locked, enabled, ref]);\n\n // Reset to locked when feature toggled on\n useEffect(() => {\n if (enabled) setLocked(true);\n }, [enabled]);\n\n return { locked, unlock };\n}\n","'use client';\n\nimport React, { useState } from 'react';\n\nimport './FloatingToolbar.css';\nimport { useElementCorner } from './hooks/useElementCorner';\nimport { useScrollIsolation } from './hooks/useScrollIsolation';\n\nexport interface FloatingToolbarProps {\n /** Ref to the container element the toolbar anchors to */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Action buttons to render (right side) */\n children: React.ReactNode;\n /** Optional label shown left of the buttons (e.g. language badge) */\n label?: React.ReactNode;\n /** Where to anchor relative to the container (default: bottom-right) */\n position?: 'top-right' | 'bottom-right';\n /** Offset from the edge in px (default: 8) */\n offset?: number;\n /** z-index (default: 30) */\n zIndex?: number;\n /**\n * Block wheel scroll inside the container until user clicks into it.\n * Re-locks when mouse leaves. Like Google Maps scroll isolation.\n * @default true\n */\n scrollIsolation?: boolean;\n}\n\nconst MIN_HEIGHT = 40; // minimum container height to show toolbar\n\nexport const FloatingToolbar: React.FC<FloatingToolbarProps> = ({\n containerRef,\n children,\n label,\n position = 'bottom-right',\n offset = 8,\n zIndex = 30,\n scrollIsolation = true,\n}) => {\n const corner = useElementCorner(containerRef);\n const { locked, unlock } = useScrollIsolation(containerRef, scrollIsolation);\n const [overlayHovered, setOverlayHovered] = useState(false);\n\n // Overlay always renders (even before corner is measured) — it's position:absolute\n // inside the container so it works immediately on mount.\n // It absorbs wheel events (pointer-events cover the container) so the page scrolls normally.\n // Click anywhere inside unlocks it; click outside re-locks it.\n const overlay =\n scrollIsolation && locked ? (\n <div\n onClick={unlock}\n onMouseEnter={() => setOverlayHovered(true)}\n onMouseLeave={() => setOverlayHovered(false)}\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: zIndex - 1,\n cursor: 'pointer',\n background: overlayHovered ? 'rgba(0,0,0,0.04)' : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 150ms',\n }}\n >\n {overlayHovered && (\n <span style={{\n fontSize: '0.75rem',\n padding: '0.25rem 0.625rem',\n borderRadius: '9999px',\n background: 'rgba(0,0,0,0.55)',\n color: '#fff',\n pointerEvents: 'none',\n userSelect: 'none',\n }}>\n Click to scroll\n </span>\n )}\n </div>\n ) : null;\n\n // Toolbar is position:fixed and needs measured coords — skip until ready\n let toolbar: React.ReactNode = null;\n if (corner) {\n const { top, right, bottom } = corner;\n const viewportHeight = window.visualViewport?.height ?? document.documentElement.clientHeight;\n\n const inView = bottom > 0 && top < viewportHeight && bottom - top >= MIN_HEIGHT;\n\n if (inView) {\n const style: React.CSSProperties = {\n position: 'fixed',\n right: right + offset,\n zIndex,\n };\n\n if (position === 'bottom-right') {\n const clampedBottom = Math.min(bottom - offset, viewportHeight - offset);\n style.bottom = viewportHeight - clampedBottom;\n } else {\n if (top >= 0) {\n style.top = top + offset;\n } else {\n // top of block scrolled above viewport — hide toolbar\n }\n }\n\n if (style.bottom !== undefined || style.top !== undefined) {\n toolbar = (\n <div className=\"flex items-center gap-1\" style={style}>\n {label && (\n <>\n {label}\n <div className=\"w-px h-4 bg-border/50 mx-0.5\" />\n </>\n )}\n {children}\n </div>\n );\n }\n }\n }\n\n return (\n <>\n {overlay}\n {toolbar}\n </>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\ninterface CopyActionProps {\n value: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const CopyAction: React.FC<CopyActionProps> = ({ value, title = 'Copy' }) => (\n <CopyButton\n value={value}\n variant=\"ghost\"\n size=\"icon\"\n className={BUTTON_CLASS}\n iconClassName=\"h-3 w-3\"\n title={title}\n />\n);\n","'use client';\n\nimport { Download } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface DownloadActionProps {\n value: string;\n filename?: string;\n mimeType?: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const DownloadAction: React.FC<DownloadActionProps> = ({\n value,\n filename = 'download.txt',\n mimeType = 'text/plain',\n title = 'Download',\n}) => {\n const handleDownload = () => {\n const blob = new Blob([value], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDownload}\n className={BUTTON_CLASS}\n title={title}\n >\n <Download className=\"h-3 w-3\" />\n </Button>\n );\n};\n","'use client';\n\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface ExpandActionProps {\n isExpanded: boolean;\n onToggle: () => void;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const ExpandAction: React.FC<ExpandActionProps> = ({ isExpanded, onToggle }) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={isExpanded ? 'Collapse All' : 'Expand All'}\n >\n {isExpanded ? <ChevronUp className=\"h-3 w-3\" /> : <ChevronDown className=\"h-3 w-3\" />}\n </Button>\n);\n","'use client';\n\nimport { Maximize2, Minimize2 } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface FullscreenActionProps {\n isFullscreen?: boolean;\n onToggle: () => void;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const FullscreenAction: React.FC<FullscreenActionProps> = ({\n isFullscreen = false,\n onToggle,\n title,\n}) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={title ?? (isFullscreen ? 'Exit fullscreen' : 'Fullscreen')}\n >\n {isFullscreen ? <Minimize2 className=\"h-3 w-3\" /> : <Maximize2 className=\"h-3 w-3\" />}\n </Button>\n);\n"]}
|