drizzle-cube 0.4.26 → 0.4.28

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 (25) hide show
  1. package/dist/client/charts.js +1 -1
  2. package/dist/client/chunks/{analysis-builder-C2jqaLZs.js → analysis-builder-DMFoAkjT.js} +5 -5
  3. package/dist/client/chunks/{analysis-builder-C2jqaLZs.js.map → analysis-builder-DMFoAkjT.js.map} +1 -1
  4. package/dist/client/chunks/{analysis-builder-shared-Bz9oSywd.js → analysis-builder-shared-CunrT3gi.js} +2 -2
  5. package/dist/client/chunks/{analysis-builder-shared-Bz9oSywd.js.map → analysis-builder-shared-CunrT3gi.js.map} +1 -1
  6. package/dist/client/chunks/chart-markdown-BT_-MBq1.js +2721 -0
  7. package/dist/client/chunks/chart-markdown-BT_-MBq1.js.map +1 -0
  8. package/dist/client/chunks/{charts-loader-Bv-IWHVd.js → charts-loader-goTYnavu.js} +2 -2
  9. package/dist/client/chunks/{charts-loader-Bv-IWHVd.js.map → charts-loader-goTYnavu.js.map} +1 -1
  10. package/dist/client/chunks/{components-CPqnw8o8.js → components-BFgYvFq6.js} +4 -4
  11. package/dist/client/chunks/{components-CPqnw8o8.js.map → components-BFgYvFq6.js.map} +1 -1
  12. package/dist/client/chunks/schema-visualization-B97a1Ybu.js +772 -0
  13. package/dist/client/chunks/schema-visualization-B97a1Ybu.js.map +1 -0
  14. package/dist/client/components/SchemaVisualization/CubeNode.d.ts +12 -1
  15. package/dist/client/components/SchemaVisualization/FieldDetailPanel.d.ts +15 -0
  16. package/dist/client/components/SchemaVisualization/xyflowContext.d.ts +11 -0
  17. package/dist/client/components.js +1 -1
  18. package/dist/client/index.js +43 -43
  19. package/dist/client/styles.css +1 -1
  20. package/dist/client-bundle-stats.html +1 -1
  21. package/package.json +2 -2
  22. package/dist/client/chunks/chart-markdown-Du4Z2iqK.js +0 -2695
  23. package/dist/client/chunks/chart-markdown-Du4Z2iqK.js.map +0 -1
  24. package/dist/client/chunks/schema-visualization-CzOuTQDu.js +0 -563
  25. package/dist/client/chunks/schema-visualization-CzOuTQDu.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-visualization-B97a1Ybu.js","sources":["../../../src/client/components/SchemaVisualization/xyflowContext.tsx","../../../src/client/components/SchemaVisualization/SchemaVisualizationLazy.tsx","../../../src/client/components/SchemaVisualization/CubeNode.tsx","../../../src/client/components/SchemaVisualization/RelationshipEdge.tsx","../../../src/client/components/SchemaVisualization/FieldDetailPanel.tsx","../../../src/client/components/SchemaVisualization/useERDLayout.ts","../../../src/client/components/SchemaVisualization/index.tsx"],"sourcesContent":["/**\n * React context for @xyflow/react modules.\n *\n * All xyflow imports are dynamic (via SchemaVisualizationLazy) so that\n * the built schema-visualization chunk has NO static imports from\n * @xyflow/react. This prevents consuming projects from failing at\n * build time when @xyflow/react is not installed.\n */\n\nimport { createContext, useContext } from 'react'\n\nexport type XyflowModule = typeof import('@xyflow/react')\n\nconst XyflowContext = createContext<XyflowModule | null>(null)\n\nexport const XyflowProvider = XyflowContext.Provider\n\nexport function useXyflow(): XyflowModule {\n const ctx = useContext(XyflowContext)\n if (!ctx) throw new Error('useXyflow must be used within XyflowProvider')\n return ctx\n}\n","/**\n * Lazy-loaded SchemaVisualization with graceful fallback\n * when @xyflow/react is not installed.\n *\n * All @xyflow/react imports are dynamic here so the built chunk\n * has NO static imports from @xyflow/react. This prevents consuming\n * projects from failing at build time when xyflow is not installed.\n */\n\nimport { lazy, Suspense, useState, useEffect } from 'react'\nimport type { SchemaVisualizationProps } from './index'\nimport { XyflowProvider } from './xyflowContext'\nimport type { XyflowModule } from './xyflowContext'\n\nlet loadFailed = false\n\nfunction MissingDependencyFallback(_props: SchemaVisualizationProps) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:h-full dc:p-8\">\n <div className=\"dc:text-center dc:max-w-md\">\n <div className=\"dc:text-4xl dc:mb-4\">&#128269;</div>\n <h3 className=\"dc:text-lg dc:font-semibold text-dc-text dc:mb-2\">\n Schema Visualization requires additional packages\n </h3>\n <p className=\"dc:text-sm text-dc-text-secondary dc:mb-4\">\n Install the required dependencies to enable the interactive schema diagram:\n </p>\n <code className=\"dc:block dc:px-4 dc:py-2 dc:rounded bg-dc-surface-secondary dc:text-sm dc:font-mono text-dc-text dc:border border-dc-border\">\n npm install @xyflow/react elkjs\n </code>\n </div>\n </div>\n )\n}\n\nfunction LoadingFallback() {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:h-full\">\n <div className=\"dc:text-center\">\n <div className=\"dc:animate-spin dc:rounded-full dc:h-8 dc:w-8 dc:border-b-2 border-dc-accent dc:mx-auto dc:mb-2\" />\n <p className=\"dc:text-sm text-dc-text-muted\">Loading schema visualization...</p>\n </div>\n </div>\n )\n}\n\nconst LazySchemaVisualization = lazy(async () => {\n const mod = await import('./index')\n return { default: mod.SchemaVisualization }\n})\n\nexport function SchemaVisualizationLazy(props: SchemaVisualizationProps) {\n const [xyflow, setXyflow] = useState<XyflowModule | null>(null)\n const [failed, setFailed] = useState(loadFailed)\n\n useEffect(() => {\n if (loadFailed) return\n let cancelled = false\n\n import('@xyflow/react')\n .then((mod) => {\n if (!cancelled) setXyflow(mod)\n })\n .catch(() => {\n loadFailed = true\n if (!cancelled) setFailed(true)\n })\n\n return () => { cancelled = true }\n }, [])\n\n if (failed) {\n return <MissingDependencyFallback {...props} />\n }\n\n if (!xyflow) {\n return <LoadingFallback />\n }\n\n return (\n <XyflowProvider value={xyflow}>\n <Suspense fallback={<LoadingFallback />}>\n <LazySchemaVisualization {...props} />\n </Suspense>\n </XyflowProvider>\n )\n}\n\nexport function isSchemaVisualizationAvailable(): boolean {\n return !loadFailed\n}\n","import type { MouseEvent } from 'react'\nimport type { CubeMetaCube } from '../../types'\nimport { getIcon } from '../../icons'\nimport { useXyflow } from './xyflowContext'\n\ninterface CubeNodeData {\n cube: CubeMetaCube\n onFieldClick?: (cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension', pos?: { x: number; y: number }) => void\n onCubeClick?: (cubeName: string, pos?: { x: number; y: number }) => void\n isHighlighted: boolean\n highlightedFields: string[]\n searchTerm?: string\n selectedField?: { cubeName: string; fieldName: string | null } | null\n [key: string]: unknown\n}\n\ninterface CubeNodeProps {\n data: CubeNodeData\n}\n\nexport function CubeNode({ data }: CubeNodeProps) {\n const { Handle, Position } = useXyflow()\n const { cube, onFieldClick, onCubeClick, isHighlighted, highlightedFields, searchTerm, selectedField } = data\n\n const handleFieldClick = (e: MouseEvent, fieldName: string, fieldType: 'measure' | 'dimension') => {\n if (onFieldClick) {\n onFieldClick(cube.name, fieldName, fieldType, { x: e.clientX, y: e.clientY })\n }\n }\n\n const InfoIcon = getIcon('info')\n\n const handleCubeInfoClick = (e: MouseEvent) => {\n e.stopPropagation() // don't start drag\n if (onCubeClick) {\n onCubeClick(cube.name, { x: e.clientX, y: e.clientY })\n }\n }\n\n const isFieldSelected = (fieldName: string) => {\n if (!selectedField) return false\n return selectedField.cubeName === cube.name && selectedField.fieldName === fieldName\n }\n\n const isCubeSelected = selectedField?.cubeName === cube.name && selectedField?.fieldName === null\n\n const isFieldHighlighted = (fullFieldName: string) => {\n return highlightedFields.includes(fullFieldName)\n }\n\n const isFieldSearchMatch = (field: { name: string; title?: string }) => {\n if (!searchTerm?.trim()) return true\n const term = searchTerm.toLowerCase()\n return (\n field.name.toLowerCase().includes(term) ||\n (field.title && field.title.toLowerCase().includes(term))\n )\n }\n\n const cubeHasMatches = () => {\n if (!searchTerm?.trim()) return true\n return cube.measures.some(m => isFieldSearchMatch(m)) ||\n cube.dimensions.some(d => isFieldSearchMatch(d))\n }\n\n const hasCubeMatches = cubeHasMatches()\n\n const getFieldClasses = (\n field: { name: string; title?: string; type?: string },\n highlighted: boolean,\n _fieldType: 'measure' | 'dimension'\n ) => {\n const fieldName = field.name.split('.')[1] || field.name\n const selected = isFieldSelected(fieldName)\n const base = 'dc:px-4 dc:py-2 dc:text-xs dc:cursor-pointer dc:transition-all dc:border-b border-dc-border last:dc:border-b-0 nodrag nopan'\n\n if (selected) {\n return `${base} bg-dc-accent-bg text-dc-accent dc:font-semibold dc:ring-1 dc:ring-inset ring-dc-accent`\n }\n\n if (!hasCubeMatches && searchTerm?.trim()) {\n if (highlighted) return `${base} bg-dc-accent-bg text-dc-accent dc:font-semibold`\n return `${base} dc:hover:bg-dc-surface-hover text-dc-text-secondary`\n }\n\n if (searchTerm?.trim() && !isFieldSearchMatch(field)) {\n return `${base} dc:opacity-40 dc:hover:opacity-60 text-dc-text-muted`\n }\n\n if (searchTerm?.trim() && isFieldSearchMatch(field) && !highlighted) {\n return `${base} dc:font-bold dc:hover:bg-dc-accent-bg`\n }\n\n if (highlighted) {\n return `${base} bg-dc-accent-bg text-dc-accent dc:font-semibold`\n }\n\n return `${base} dc:hover:bg-dc-surface-hover text-dc-text-secondary`\n }\n\n const timeDimensions = cube.dimensions.filter(d => d.type === 'time')\n const regularDimensions = cube.dimensions.filter(d => d.type !== 'time')\n\n return (\n <div\n className={`\n dc:border-2 dc:rounded-lg dc:shadow-lg dc:min-w-[280px] dc:overflow-hidden dc:transition-all\n ${!hasCubeMatches && searchTerm?.trim() ? 'dc:opacity-30 dc:grayscale' : ''}\n ${isHighlighted ? 'border-dc-accent dc:ring-2 ring-dc-accent' : 'border-dc-border'}\n `}\n style={{ backgroundColor: 'var(--dc-surface)' }}\n >\n {/* Cube Header */}\n <div className={`dc:px-4 dc:py-3 dc:transition-colors ${\n isHighlighted ? 'bg-dc-accent-bg' : 'bg-dc-surface-secondary'\n }`}>\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <div>\n <h3 className=\"dc:font-semibold text-dc-text dc:text-sm\">\n {cube.title || cube.name}\n </h3>\n {cube.description && (\n <p className=\"dc:text-xs text-dc-text-muted dc:mt-1 dc:line-clamp-2\">{cube.description}</p>\n )}\n </div>\n {onCubeClick && (\n <button\n className={`dc:ml-2 dc:p-1 dc:rounded dc:transition-colors nodrag nopan ${\n isCubeSelected\n ? 'bg-dc-accent-bg text-dc-accent'\n : 'text-dc-text-muted dc:hover:text-dc-text dc:hover:bg-dc-surface-hover'\n }`}\n onClick={handleCubeInfoClick}\n title=\"Cube info\"\n >\n <InfoIcon className=\"dc:w-5 dc:h-5\" />\n </button>\n )}\n {!onCubeClick && (\n <div className=\"dc:text-xs text-dc-text-muted dc:ml-2\">\n <div>{cube.measures.length}M</div>\n <div>{cube.dimensions.length}D</div>\n </div>\n )}\n </div>\n </div>\n\n {/* Measures */}\n {cube.measures.length > 0 && (\n <div className=\"dc:border-t border-dc-border\">\n <div className=\"dc:px-4 dc:py-1.5 dc:border-b border-dc-border\" style={{ backgroundColor: 'color-mix(in srgb, var(--dc-warning) 10%, var(--dc-surface))' }}>\n <h4 className=\"dc:text-xs dc:font-medium text-dc-text-secondary dc:flex dc:items-center\">\n <span className=\"dc:w-2 dc:h-2 bg-dc-warning dc:rounded-full dc:mr-2\" />\n Measures ({cube.measures.length})\n </h4>\n </div>\n <div className=\"dc:max-h-64 dc:overflow-y-auto nowheel\">\n {cube.measures.map((measure) => {\n const fieldName = measure.name.split('.')[1] || measure.name\n const highlighted = isFieldHighlighted(measure.name)\n return (\n <div\n key={measure.name}\n className={getFieldClasses(measure, highlighted, 'measure')}\n onClick={(e) => handleFieldClick(e, fieldName, 'measure')}\n title={measure.title}\n >\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <span className=\"dc:font-mono dc:truncate\">\n {measure.shortTitle || measure.title || fieldName}\n </span>\n <span className=\"text-dc-text-muted dc:ml-2 dc:text-[10px] dc:uppercase\">\n {measure.type}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Time Dimensions */}\n {timeDimensions.length > 0 && (\n <div className=\"dc:border-t border-dc-border\">\n <div className=\"dc:px-4 dc:py-1.5 dc:border-b border-dc-border\" style={{ backgroundColor: 'color-mix(in srgb, var(--dc-accent) 10%, var(--dc-surface))' }}>\n <h4 className=\"dc:text-xs dc:font-medium text-dc-text-secondary dc:flex dc:items-center\">\n <span className=\"dc:w-2 dc:h-2 bg-dc-accent dc:rounded-full dc:mr-2\" />\n Time Dimensions ({timeDimensions.length})\n </h4>\n </div>\n <div className=\"dc:max-h-64 dc:overflow-y-auto nowheel\">\n {timeDimensions.map((dimension) => {\n const fieldName = dimension.name.split('.')[1] || dimension.name\n const highlighted = isFieldHighlighted(dimension.name)\n return (\n <div\n key={dimension.name}\n className={getFieldClasses(dimension, highlighted, 'dimension')}\n onClick={(e) => handleFieldClick(e, fieldName, 'dimension')}\n title={dimension.title}\n >\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <span className=\"dc:font-mono dc:truncate\">\n {dimension.shortTitle || dimension.title || fieldName}\n </span>\n <span className=\"text-dc-text-muted dc:ml-2 dc:text-[10px] dc:uppercase\">\n {dimension.type}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Regular Dimensions */}\n {regularDimensions.length > 0 && (\n <div className=\"dc:border-t border-dc-border\">\n <div className=\"dc:px-4 dc:py-1.5 dc:border-b border-dc-border\" style={{ backgroundColor: 'color-mix(in srgb, var(--dc-success) 10%, var(--dc-surface))' }}>\n <h4 className=\"dc:text-xs dc:font-medium text-dc-text-secondary dc:flex dc:items-center\">\n <span className=\"dc:w-2 dc:h-2 bg-dc-success dc:rounded-full dc:mr-2\" />\n Dimensions ({regularDimensions.length})\n </h4>\n </div>\n <div className=\"dc:max-h-64 dc:overflow-y-auto nowheel\">\n {regularDimensions.map((dimension) => {\n const fieldName = dimension.name.split('.')[1] || dimension.name\n const highlighted = isFieldHighlighted(dimension.name)\n return (\n <div\n key={dimension.name}\n className={getFieldClasses(dimension, highlighted, 'dimension')}\n onClick={(e) => handleFieldClick(e, fieldName, 'dimension')}\n title={dimension.title}\n >\n <div className=\"dc:flex dc:items-center dc:justify-between\">\n <span className=\"dc:font-mono dc:truncate\">\n {dimension.shortTitle || dimension.title || fieldName}\n </span>\n <span className=\"text-dc-text-muted dc:ml-2 dc:text-[10px] dc:uppercase\">\n {dimension.type}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Connection handles - hidden */}\n <Handle type=\"source\" position={Position.Right} id=\"right\" className=\"dc:opacity-0\" isConnectable={false} />\n <Handle type=\"target\" position={Position.Left} id=\"left\" className=\"dc:opacity-0\" isConnectable={false} />\n <Handle type=\"source\" position={Position.Bottom} id=\"bottom\" className=\"dc:opacity-0\" isConnectable={false} />\n <Handle type=\"target\" position={Position.Top} id=\"top\" className=\"dc:opacity-0\" isConnectable={false} />\n </div>\n )\n}\n","import type { Edge, EdgeProps } from '@xyflow/react'\nimport type { CubeMetaRelationship } from '../../types'\nimport { useXyflow } from './xyflowContext'\n\ninterface RelationshipEdgeData {\n relationship: CubeMetaRelationship\n joinFields: Array<{\n sourceField: string\n targetField: string\n }>\n [key: string]: unknown\n}\n\nexport type RelationshipEdgeType = Edge<RelationshipEdgeData, 'relationshipEdge'>\n\nexport function RelationshipEdge({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n data,\n markerEnd,\n}: EdgeProps<RelationshipEdgeType>) {\n const { getBezierPath, BaseEdge, EdgeLabelRenderer } = useXyflow()\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n })\n\n if (!data) return null\n\n const { relationship, joinFields } = data\n\n const getSymbol = (rel: string) => {\n switch (rel) {\n case 'belongsTo': return '\\u2208' // belongs to\n case 'hasOne': return '1:1'\n case 'hasMany': return '1:M'\n case 'belongsToMany': return 'M:M'\n default: return '?'\n }\n }\n\n const getColor = (rel: string) => {\n switch (rel) {\n case 'belongsTo': return '#10b981'\n case 'hasOne': return '#3b82f6'\n case 'hasMany': return '#f59e0b'\n case 'belongsToMany': return '#8b5cf6'\n default: return '#6b7280'\n }\n }\n\n const color = getColor(relationship.relationship)\n const symbol = getSymbol(relationship.relationship)\n\n return (\n <>\n <BaseEdge path={edgePath} markerEnd={markerEnd} style={{ ...style, stroke: color }} />\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n fontSize: 10,\n pointerEvents: 'all',\n }}\n className=\"nodrag nopan\"\n >\n <div\n className=\"dc:border-2 dc:rounded-md dc:px-2 dc:py-1 dc:shadow-xs\"\n style={{ backgroundColor: 'var(--dc-surface)', borderColor: color }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:font-bold dc:text-xs dc:mb-1\" style={{ color }}>\n {symbol}\n </div>\n <div className=\"dc:text-[9px] text-dc-text-muted dc:leading-tight\">\n {joinFields.map((field, index) => (\n <div key={index} className=\"dc:font-mono\">\n {field.sourceField} → {field.targetField}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </EdgeLabelRenderer>\n </>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { CubeMetaCube, CubeMetaMeasure, CubeMetaDimension } from '../../types'\nimport { getIcon } from '../../icons'\n\nexport interface FieldSelection {\n cubeName: string\n fieldName: string | null // null = cube-level selection\n fieldType: 'measure' | 'dimension' | 'cube'\n}\n\ninterface FieldDetailPanelProps {\n selection: FieldSelection\n meta: { cubes: CubeMetaCube[] }\n onClose: () => void\n}\n\nfunction DetailRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"dc:flex dc:items-start dc:gap-2 dc:text-xs\">\n <span className=\"text-dc-text-muted dc:w-20 dc:flex-shrink-0 dc:font-medium\">{label}</span>\n <span className=\"text-dc-text dc:flex-1 dc:min-w-0\">{children}</span>\n </div>\n )\n}\n\nfunction TypeBadge({ type, color }: { type: string; color: string }) {\n return (\n <span\n className=\"dc:inline-flex dc:items-center dc:px-1.5 dc:py-0.5 dc:rounded dc:text-[10px] dc:font-medium dc:uppercase\"\n style={{ backgroundColor: `color-mix(in srgb, ${color} 15%, var(--dc-surface))`, color }}\n >\n {type}\n </span>\n )\n}\n\nfunction MeasureDetail({ measure, cube }: { measure: CubeMetaMeasure; cube: CubeMetaCube }) {\n const typeColor = {\n count: '#f59e0b',\n countDistinct: '#f59e0b',\n countDistinctApprox: '#f59e0b',\n sum: '#10b981',\n avg: '#3b82f6',\n min: '#8b5cf6',\n max: '#ec4899',\n runningTotal: '#06b6d4',\n number: '#6b7280',\n }[measure.type] || '#6b7280'\n\n return (\n <div className=\"dc:flex dc:flex-col dc:gap-2\">\n <DetailRow label=\"Cube\">{cube.title || cube.name}</DetailRow>\n <DetailRow label=\"Type\"><TypeBadge type={measure.type} color={typeColor} /></DetailRow>\n {measure.title && measure.title !== measure.shortTitle && (\n <DetailRow label=\"Title\">{measure.title}</DetailRow>\n )}\n {measure.drillMembers && measure.drillMembers.length > 0 && (\n <DetailRow label=\"Drill into\">\n <div className=\"dc:flex dc:flex-wrap dc:gap-1\">\n {measure.drillMembers.map(dm => (\n <span key={dm} className=\"dc:font-mono dc:text-[10px] dc:px-1 dc:py-0.5 dc:rounded bg-dc-surface-secondary border-dc-border dc:border\">\n {dm.split('.')[1] || dm}\n </span>\n ))}\n </div>\n </DetailRow>\n )}\n </div>\n )\n}\n\nfunction DimensionDetail({ dimension, cube }: { dimension: CubeMetaDimension; cube: CubeMetaCube }) {\n const typeColor = dimension.type === 'time' ? '#3b82f6' : '#10b981'\n\n // Find hierarchies this dimension belongs to\n const hierarchies = cube.hierarchies?.filter(h =>\n h.levels.some(l => l === dimension.name || l === `${cube.name}.${dimension.name.split('.')[1]}`)\n ) || []\n\n return (\n <div className=\"dc:flex dc:flex-col dc:gap-2\">\n <DetailRow label=\"Cube\">{cube.title || cube.name}</DetailRow>\n <DetailRow label=\"Type\"><TypeBadge type={dimension.type} color={typeColor} /></DetailRow>\n {dimension.title && dimension.title !== dimension.shortTitle && (\n <DetailRow label=\"Title\">{dimension.title}</DetailRow>\n )}\n {dimension.type === 'time' && dimension.granularities && dimension.granularities.length > 0 && (\n <DetailRow label=\"Granularity\">\n <div className=\"dc:flex dc:flex-wrap dc:gap-1\">\n {dimension.granularities.map(g => (\n <span key={g} className=\"dc:font-mono dc:text-[10px] dc:px-1 dc:py-0.5 dc:rounded bg-dc-surface-secondary border-dc-border dc:border\">\n {g}\n </span>\n ))}\n </div>\n </DetailRow>\n )}\n {hierarchies.length > 0 && (\n <DetailRow label=\"Hierarchy\">\n {hierarchies.map(h => (\n <div key={h.name} className=\"dc:text-[10px]\">\n <span className=\"dc:font-medium\">{h.title}</span>\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({h.levels.map(l => l.split('.')[1] || l).join(' > ')})\n </span>\n </div>\n ))}\n </DetailRow>\n )}\n </div>\n )\n}\n\nfunction CubeDetail({ cube }: { cube: CubeMetaCube }) {\n const relationshipColors: Record<string, string> = {\n belongsTo: '#10b981',\n hasOne: '#3b82f6',\n hasMany: '#f59e0b',\n belongsToMany: '#8b5cf6',\n }\n\n return (\n <div className=\"dc:flex dc:flex-col dc:gap-2\">\n {cube.description && (\n <DetailRow label=\"Description\">{cube.description}</DetailRow>\n )}\n <DetailRow label=\"Measures\">\n <span className=\"dc:font-mono\">{cube.measures.length}</span>\n {cube.measures.length > 0 && (\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({[...new Set(cube.measures.map(m => m.type))].join(', ')})\n </span>\n )}\n </DetailRow>\n <DetailRow label=\"Dimensions\">\n <span className=\"dc:font-mono\">{cube.dimensions.length}</span>\n {cube.dimensions.some(d => d.type === 'time') && (\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({cube.dimensions.filter(d => d.type === 'time').length} time)\n </span>\n )}\n </DetailRow>\n {cube.relationships && cube.relationships.length > 0 && (\n <DetailRow label=\"Joins\">\n <div className=\"dc:flex dc:flex-col dc:gap-1\">\n {cube.relationships.map((rel, i) => (\n <div key={i} className=\"dc:flex dc:items-center dc:gap-1.5 dc:text-[10px]\">\n <TypeBadge type={rel.relationship} color={relationshipColors[rel.relationship] || '#6b7280'} />\n <span className=\"dc:font-mono\">{rel.targetCube}</span>\n </div>\n ))}\n </div>\n </DetailRow>\n )}\n {cube.hierarchies && cube.hierarchies.length > 0 && (\n <DetailRow label=\"Hierarchies\">\n <div className=\"dc:flex dc:flex-col dc:gap-1\">\n {cube.hierarchies.map(h => (\n <div key={h.name} className=\"dc:text-[10px]\">\n <span className=\"dc:font-medium\">{h.title}</span>\n <span className=\"text-dc-text-muted dc:ml-1\">\n ({h.levels.map(l => l.split('.')[1] || l).join(' > ')})\n </span>\n </div>\n ))}\n </div>\n </DetailRow>\n )}\n {cube.meta?.eventStream && (\n <DetailRow label=\"Event Stream\">\n <div className=\"dc:text-[10px]\">\n <span className=\"text-dc-text-muted\">binding: </span>\n <span className=\"dc:font-mono\">{cube.meta.eventStream.bindingKey.split('.')[1] || cube.meta.eventStream.bindingKey}</span>\n <span className=\"text-dc-text-muted dc:ml-2\">time: </span>\n <span className=\"dc:font-mono\">{cube.meta.eventStream.timeDimension.split('.')[1] || cube.meta.eventStream.timeDimension}</span>\n </div>\n </DetailRow>\n )}\n </div>\n )\n}\n\nexport function FieldDetailPanel({ selection, meta, onClose }: FieldDetailPanelProps) {\n const CloseIcon = getIcon('close')\n\n const cube = meta.cubes.find(c => c.name === selection.cubeName)\n if (!cube) return null\n\n // Determine what to show\n let title: string\n let dotColor: string\n let sectionBgColor: string\n let content: ReactNode\n\n if (selection.fieldType === 'cube' || !selection.fieldName) {\n title = cube.title || cube.name\n dotColor = 'var(--dc-accent)'\n sectionBgColor = 'color-mix(in srgb, var(--dc-accent) 10%, var(--dc-surface))'\n content = <CubeDetail cube={cube} />\n } else if (selection.fieldType === 'measure') {\n const measure = cube.measures.find(m => {\n const mField = m.name.split('.')[1] || m.name\n return mField === selection.fieldName || m.name === selection.fieldName\n })\n if (!measure) return null\n title = measure.shortTitle || measure.title || selection.fieldName\n dotColor = 'var(--dc-warning)'\n sectionBgColor = 'color-mix(in srgb, var(--dc-warning) 10%, var(--dc-surface))'\n content = <MeasureDetail measure={measure} cube={cube} />\n } else {\n const dimension = cube.dimensions.find(d => {\n const dField = d.name.split('.')[1] || d.name\n return dField === selection.fieldName || d.name === selection.fieldName\n })\n if (!dimension) return null\n title = dimension.shortTitle || dimension.title || selection.fieldName\n dotColor = dimension.type === 'time' ? 'var(--dc-accent)' : 'var(--dc-success)'\n sectionBgColor = dimension.type === 'time'\n ? 'color-mix(in srgb, var(--dc-accent) 10%, var(--dc-surface))'\n : 'color-mix(in srgb, var(--dc-success) 10%, var(--dc-surface))'\n content = <DimensionDetail dimension={dimension} cube={cube} />\n }\n\n return (\n <div\n className=\"dc:border-2 dc:rounded-lg dc:shadow-lg dc:min-w-[260px] dc:max-w-[320px] dc:overflow-hidden dc:transition-all border-dc-border\"\n style={{ backgroundColor: 'var(--dc-surface)' }}\n >\n {/* Header - same style as CubeNode section headers */}\n <div\n className=\"dc:px-4 dc:py-2.5 dc:border-b border-dc-border dc:flex dc:items-center dc:justify-between\"\n style={{ backgroundColor: sectionBgColor }}\n >\n <div className=\"dc:flex dc:items-center dc:gap-2 dc:min-w-0\">\n <span\n className=\"dc:w-2 dc:h-2 dc:rounded-full dc:flex-shrink-0\"\n style={{ backgroundColor: dotColor }}\n />\n <h4 className=\"dc:text-sm dc:font-semibold text-dc-text dc:truncate\">{title}</h4>\n </div>\n <button\n onClick={onClose}\n className=\"dc:ml-2 dc:flex-shrink-0 text-dc-text-muted dc:hover:text-dc-text dc:transition-colors\"\n >\n <CloseIcon className=\"dc:w-3.5 dc:h-3.5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"dc:px-4 dc:py-3\">\n {content}\n </div>\n </div>\n )\n}\n","import { useState, useEffect, useRef, useMemo } from 'react'\nimport type { Node, Edge, Position } from '@xyflow/react'\n\nexport interface LayoutOptions {\n direction: 'TB' | 'LR'\n nodeWidth: number\n nodeSep: number\n rankSep: number\n}\n\nexport const defaultLayoutOptions: LayoutOptions = {\n direction: 'LR',\n nodeWidth: 340,\n nodeSep: 150,\n rankSep: 350,\n}\n\n/**\n * Layout state machine phases:\n * waiting → ELK not loaded yet, nothing to show\n * computing → ELK loaded, running layout algorithm\n * ready → layout complete, node positions available\n */\nexport type LayoutPhase = 'waiting' | 'computing' | 'ready'\n\nfunction getTargetPosition(direction: string): Position {\n switch (direction) {\n case 'TB': return 'top' as Position\n case 'LR': return 'left' as Position\n default: return 'top' as Position\n }\n}\n\nfunction getSourcePosition(direction: string): Position {\n switch (direction) {\n case 'TB': return 'bottom' as Position\n case 'LR': return 'right' as Position\n default: return 'bottom' as Position\n }\n}\n\n/**\n * Estimate the rendered pixel height of a CubeNode.\n */\nfunction estimateNodeHeight(node: Node): number {\n const cube = node.data?.cube as {\n measures?: unknown[]\n dimensions?: { type?: string }[]\n description?: string\n } | undefined\n if (!cube) return 300\n\n const HEADER = cube.description ? 80 : 56\n const SECTION_HEADER = 36\n const ROW = 34\n const MAX_BODY = 256\n const PADDING = 30\n\n let h = HEADER\n const measures = cube.measures?.length ?? 0\n const timeDims = cube.dimensions?.filter((d) => d.type === 'time').length ?? 0\n const regularDims = cube.dimensions?.filter((d) => d.type !== 'time').length ?? 0\n\n if (measures > 0) h += SECTION_HEADER + Math.min(measures * ROW, MAX_BODY)\n if (timeDims > 0) h += SECTION_HEADER + Math.min(timeDims * ROW, MAX_BODY)\n if (regularDims > 0) h += SECTION_HEADER + Math.min(regularDims * ROW, MAX_BODY)\n\n return h + PADDING\n}\n\n// --- ELK singleton (module-level, loaded once) ---\n\ninterface ELKInstance {\n layout(graph: unknown): Promise<unknown>\n}\n\nlet elkInstance: ELKInstance | null = null\n\nconst elkLoadPromise: Promise<ELKInstance | null> = import('elkjs/lib/elk.bundled.js')\n .then((mod) => {\n const ELK = (mod as unknown as { default?: new () => ELKInstance }).default || mod\n elkInstance = new (ELK as unknown as new () => ELKInstance)()\n return elkInstance\n })\n .catch(() => null)\n\n// Force-export to prevent tree shaking of the side-effectful import\nexport { elkLoadPromise as _elkLoadPromise }\n\n// --- ELK layout computation (pure async function, no hooks) ---\n\ninterface ElkPort {\n id: string\n layoutOptions: Record<string, string>\n}\n\ninterface ElkNode {\n id: string\n width: number\n height: number\n layoutOptions?: Record<string, string>\n ports?: ElkPort[]\n}\n\ninterface ElkEdge {\n id: string\n sources: string[]\n targets: string[]\n}\n\ninterface ElkResultNode { id: string; x: number; y: number }\n\ninterface ElkResult {\n children?: ElkResultNode[]\n}\n\nexport interface ElkLayoutResult {\n nodes: Node[]\n edges: Edge[]\n}\n\nasync function computeElkLayout(\n nodes: Node[],\n edges: Edge[],\n opts: LayoutOptions,\n): Promise<ElkLayoutResult> {\n // Ensure ELK is loaded (await the singleton promise)\n await elkLoadPromise\n if (!elkInstance) {\n // ELK failed to load — return grid fallback\n return { nodes: layoutWithGrid(nodes, opts), edges }\n }\n\n const sourceSide = opts.direction === 'LR' ? 'EAST' : 'SOUTH'\n const targetSide = opts.direction === 'LR' ? 'WEST' : 'NORTH'\n\n // Per-edge ports so ELK spreads connections along the node side\n const nodeSourceEdges = new Map<string, string[]>()\n const nodeTargetEdges = new Map<string, string[]>()\n edges.forEach(edge => {\n if (!nodeSourceEdges.has(edge.source)) nodeSourceEdges.set(edge.source, [])\n nodeSourceEdges.get(edge.source)!.push(edge.id)\n if (!nodeTargetEdges.has(edge.target)) nodeTargetEdges.set(edge.target, [])\n nodeTargetEdges.get(edge.target)!.push(edge.id)\n })\n\n const elkNodes: ElkNode[] = nodes.map((node) => {\n const w = opts.nodeWidth\n const h = estimateNodeHeight(node)\n\n const srcEdges = nodeSourceEdges.get(node.id) || []\n const tgtEdges = nodeTargetEdges.get(node.id) || []\n const ports: ElkPort[] = [\n ...srcEdges.map(edgeId => ({\n id: `${node.id}__src__${edgeId}`,\n layoutOptions: { 'elk.port.side': sourceSide },\n })),\n ...tgtEdges.map(edgeId => ({\n id: `${node.id}__tgt__${edgeId}`,\n layoutOptions: { 'elk.port.side': targetSide },\n })),\n ]\n\n return {\n id: node.id,\n width: w,\n height: h,\n layoutOptions: { 'elk.portConstraints': 'FIXED_SIDE' },\n ports,\n }\n })\n\n const elkEdges: ElkEdge[] = edges.map((edge) => ({\n id: edge.id,\n sources: [`${edge.source}__src__${edge.id}`],\n targets: [`${edge.target}__tgt__${edge.id}`],\n }))\n\n const elkDirection = opts.direction === 'LR' ? 'RIGHT' : 'DOWN'\n\n const graph = {\n id: 'root',\n layoutOptions: {\n 'elk.algorithm': 'layered',\n 'elk.direction': elkDirection,\n 'elk.edgeRouting': 'SPLINES',\n 'elk.layered.edgeRouting.splines.mode': 'CONSERVATIVE',\n 'elk.spacing.nodeNode': String(opts.nodeSep),\n 'elk.layered.spacing.nodeNodeBetweenLayers': String(opts.rankSep),\n 'elk.spacing.edgeNode': '60',\n 'elk.layered.spacing.edgeNodeBetweenLayers': '60',\n 'elk.spacing.edgeEdge': '25',\n 'elk.layered.nodePlacement.strategy': 'NETWORK_SIMPLEX',\n 'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',\n },\n children: elkNodes,\n edges: elkEdges,\n }\n\n const result = await elkInstance.layout(graph) as ElkResult\n\n // Extract node positions (ELK returns top-left, same as React Flow)\n const positionMap = new Map<string, { x: number; y: number }>()\n if (result.children) {\n for (const child of result.children) {\n positionMap.set(child.id, { x: child.x, y: child.y })\n }\n }\n\n const layoutedNodes = nodes.map((node) => ({\n ...node,\n position: positionMap.get(node.id) || node.position,\n targetPosition: getTargetPosition(opts.direction),\n sourcePosition: getSourcePosition(opts.direction),\n }))\n\n // Return positioned nodes + original edges.\n // Edge rendering is handled by React Flow's getBezierPath() which knows\n // the actual handle positions — much more accurate than ELK's spline routes.\n return { nodes: layoutedNodes, edges }\n}\n\nfunction layoutWithGrid(nodes: Node[], opts: LayoutOptions): Node[] {\n const COL_HEIGHT_LIMIT = 1200\n let col = 0\n let colY = 0\n\n return nodes.map((node) => {\n const h = estimateNodeHeight(node)\n if (colY + h > COL_HEIGHT_LIMIT && colY > 0) {\n col++\n colY = 0\n }\n const position = { x: col * (opts.nodeWidth + opts.nodeSep), y: colY }\n colY += h + 40\n\n return {\n ...node,\n position,\n sourcePosition: getSourcePosition(opts.direction),\n targetPosition: getTargetPosition(opts.direction),\n }\n })\n}\n\n// --- Hook: single computation per structure key, no races ---\n\n/**\n * Layout hook with explicit state machine.\n *\n * - Waits for ELK to load (phase: 'waiting')\n * - Runs layout once per unique node/edge structure (phase: 'computing')\n * - Returns stable result (phase: 'ready')\n *\n * The effect only depends on a string structure key, NOT object references.\n * This prevents re-renders from cancelling in-flight computations.\n */\nexport function useERDLayout(\n nodes: Node[],\n edges: Edge[],\n options: Partial<LayoutOptions> = {}\n): { nodes: Node[]; edges: Edge[]; phase: LayoutPhase } {\n const opts = useMemo(\n () => ({ ...defaultLayoutOptions, ...options }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options.direction, options.nodeWidth, options.nodeSep, options.rankSep]\n )\n\n // Stable structure key — only changes when node/edge IDs change\n const structureKey = useMemo(() => {\n if (nodes.length === 0) return ''\n return nodes.map(n => n.id).sort().join(',') + '|' + edges.map(e => e.id).sort().join(',')\n }, [nodes, edges])\n\n // Refs hold latest values so the effect closure always reads current data\n // without needing them as dependencies\n const nodesRef = useRef(nodes)\n const edgesRef = useRef(edges)\n const optsRef = useRef(opts)\n nodesRef.current = nodes\n edgesRef.current = edges\n optsRef.current = opts\n\n const [phase, setPhase] = useState<LayoutPhase>('waiting')\n const [result, setResult] = useState<ElkLayoutResult | null>(null)\n const [resultKey, setResultKey] = useState('')\n\n // Single computation per structure key\n const computeIdRef = useRef(0)\n\n useEffect(() => {\n if (!structureKey) {\n setPhase('ready')\n setResult(null)\n setResultKey('')\n return\n }\n\n const id = ++computeIdRef.current\n setPhase('computing')\n\n computeElkLayout(nodesRef.current, edgesRef.current, optsRef.current)\n .then(layoutResult => {\n // Only apply if this is still the latest computation\n if (id !== computeIdRef.current) return\n setResult(layoutResult)\n setResultKey(structureKey)\n setPhase('ready')\n })\n .catch(() => {\n if (id !== computeIdRef.current) return\n // On error, use grid fallback\n setResult({\n nodes: layoutWithGrid(nodesRef.current, optsRef.current),\n edges: edgesRef.current,\n })\n setResultKey(structureKey)\n setPhase('ready')\n })\n }, [structureKey]) // ONLY depends on structure key — no object refs\n\n // Output: only return layout when it matches current structure\n if (phase === 'ready' && result && resultKey === structureKey) {\n return { nodes: result.nodes, edges: result.edges, phase: 'ready' }\n }\n\n return { nodes: [], edges: [], phase }\n}\n","import { useCallback, useMemo, useEffect, useState, useRef } from 'react'\nimport type { MouseEvent as ReactMouseEvent } from 'react'\nimport type { Node, Edge, NodeChange, EdgeChange } from '@xyflow/react'\nimport '@xyflow/react/dist/style.css'\n\nimport { useCubeContext } from '../../providers/CubeProvider'\nimport { CubeNode } from './CubeNode'\nimport { RelationshipEdge } from './RelationshipEdge'\nimport { FieldDetailPanel } from './FieldDetailPanel'\nimport type { FieldSelection } from './FieldDetailPanel'\nimport { useERDLayout } from './useERDLayout'\nimport { getIcon } from '../../icons'\nimport { useXyflow } from './xyflowContext'\n\nconst nodeTypes = { cubeNode: CubeNode }\nconst edgeTypes = { relationshipEdge: RelationshipEdge }\n\n/**\n * Inner component that uses useNodesInitialized() (must be inside <ReactFlow>).\n * Calls fitView exactly once per fitViewToken change, after all nodes are measured.\n */\nfunction FitViewOnReady({ token }: { token: number }) {\n const { useNodesInitialized, useReactFlow } = useXyflow()\n const nodesInitialized = useNodesInitialized()\n const { fitView } = useReactFlow()\n const appliedTokenRef = useRef(0)\n\n useEffect(() => {\n if (token === 0 || token === appliedTokenRef.current) return\n if (!nodesInitialized) return\n appliedTokenRef.current = token\n fitView({ padding: 0.1 })\n }, [token, nodesInitialized, fitView])\n\n return null\n}\n\n// Stable empty arrays (avoid new [] on every render)\nconst EMPTY_STRINGS: string[] = []\n\nexport interface SchemaVisualizationProps {\n className?: string\n onFieldClick?: (cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension') => void\n highlightedCubes?: string[]\n highlightedFields?: string[]\n searchTerm?: string\n height?: string | number\n}\n\nfunction getRelationshipColor(relationship: string): string {\n switch (relationship) {\n case 'belongsTo': return '#10b981'\n case 'hasOne': return '#3b82f6'\n case 'hasMany': return '#f59e0b'\n case 'belongsToMany': return '#8b5cf6'\n default: return '#6b7280'\n }\n}\n\nexport function SchemaVisualization({\n className = '',\n onFieldClick,\n highlightedCubes,\n highlightedFields,\n searchTerm,\n height = '100%',\n}: SchemaVisualizationProps) {\n const {\n ReactFlow: ReactFlowComponent,\n Controls,\n MiniMap,\n Background,\n applyNodeChanges,\n } = useXyflow()\n const { meta, metaLoading, metaError } = useCubeContext()\n\n // Stabilize array props to avoid re-creating references every render\n const stableHighlightedCubes = highlightedCubes || EMPTY_STRINGS\n const stableHighlightedFields = highlightedFields || EMPTY_STRINGS\n\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null)\n const [searchInput, setSearchInput] = useState(searchTerm || '')\n const [autoLayoutCounter, setAutoLayoutCounter] = useState(0)\n const [selectedField, setSelectedField] = useState<FieldSelection | null>(null)\n const [detailPosition, setDetailPosition] = useState<{ x: number; y: number } | null>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // In standalone mode (no onFieldClick), clicking fields shows the detail panel\n const isStandaloneMode = !onFieldClick\n const [savedPositions, setSavedPositions] = useState<Record<string, { x: number; y: number }>>({})\n const [positionsLoaded, setPositionsLoaded] = useState(false)\n\n const SearchIcon = getIcon('search')\n const CloseIcon = getIcon('close')\n\n const effectiveSearchTerm = searchTerm !== undefined ? searchTerm : searchInput\n\n // Load saved positions from localStorage (once)\n useEffect(() => {\n try {\n const saved = localStorage.getItem('drizzle-cube-erd-node-positions')\n if (saved) setSavedPositions(JSON.parse(saved))\n } catch { /* ignore */ }\n setPositionsLoaded(true)\n }, [])\n\n // --- Structural data: only depends on meta (stable) ---\n // Separate structure (for layout) from presentation (highlights/search)\n\n const { structuralNodes, structuralEdges } = useMemo(() => {\n if (!meta) return { structuralNodes: [] as Node[], structuralEdges: [] as Edge[] }\n\n const nodes: Node[] = meta.cubes.map((cube, index) => ({\n id: cube.name,\n type: 'cubeNode',\n // Placeholder position — ELK will override for auto-layout\n position: { x: (index % 3) * 400, y: Math.floor(index / 3) * 300 },\n data: { cube },\n }))\n\n const edges: Edge[] = []\n meta.cubes.forEach(cube => {\n if (cube.relationships) {\n cube.relationships.forEach((rel, i) => {\n if (rel.relationship === 'belongsTo') return\n edges.push({\n id: `${cube.name}-${rel.targetCube}-${i}`,\n source: cube.name,\n target: rel.targetCube,\n type: 'relationshipEdge',\n data: { relationship: rel, joinFields: rel.joinFields || [] },\n animated: false,\n style: { stroke: getRelationshipColor(rel.relationship), strokeWidth: 2 },\n })\n })\n }\n })\n\n return { structuralNodes: nodes, structuralEdges: edges }\n }, [meta]) // Only meta — no highlights/search/callbacks\n\n // --- Layout decision ---\n const needsAutoLayout = autoLayoutCounter > 0 || (positionsLoaded && Object.keys(savedPositions).length === 0)\n\n // Run ELK layout (only when auto-layout needed, otherwise pass empty to skip)\n const { nodes: elkNodes, edges: elkEdges, phase: layoutPhase } = useERDLayout(\n needsAutoLayout ? structuralNodes : [],\n needsAutoLayout ? structuralEdges : [],\n { direction: 'LR', nodeWidth: 340, nodeSep: 150, rankSep: 350 }\n )\n\n // --- Build display data: merge layout positions + presentation data ---\n\n // Convert client coords to container-relative, clamped to keep panel in view\n const toContainerPos = useCallback((clientX: number, clientY: number) => {\n const rect = containerRef.current?.getBoundingClientRect()\n if (!rect) return { x: clientX, y: clientY }\n const panelW = 300, panelH = 200 // approximate panel size for clamping\n let x = clientX - rect.left + 12 // offset slightly right of cursor\n let y = clientY - rect.top + 12 // offset slightly below cursor\n // Clamp so panel doesn't overflow right/bottom\n if (x + panelW > rect.width) x = clientX - rect.left - panelW - 12\n if (y + panelH > rect.height) y = rect.height - panelH - 8\n if (x < 0) x = 8\n if (y < 0) y = 8\n return { x, y }\n }, [])\n\n // Internal field click handler for standalone mode\n const handleInternalFieldClick = useCallback((cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension', pos?: { x: number; y: number }) => {\n setSelectedField(prev => {\n if (prev && prev.cubeName === cubeName && prev.fieldName === fieldName) {\n setDetailPosition(null)\n return null\n }\n if (pos) setDetailPosition(toContainerPos(pos.x, pos.y))\n return { cubeName, fieldName, fieldType }\n })\n }, [toContainerPos])\n\n const handleInternalCubeClick = useCallback((cubeName: string, pos?: { x: number; y: number }) => {\n setSelectedField(prev => {\n if (prev && prev.cubeName === cubeName && prev.fieldName === null) {\n setDetailPosition(null)\n return null\n }\n if (pos) setDetailPosition(toContainerPos(pos.x, pos.y))\n return { cubeName, fieldName: null, fieldType: 'cube' }\n })\n }, [toContainerPos])\n\n const effectiveFieldClick = isStandaloneMode ? handleInternalFieldClick : onFieldClick\n const effectiveCubeClick = isStandaloneMode ? handleInternalCubeClick : undefined\n\n const buildNodeData = useCallback((cube: unknown) => ({\n cube,\n onFieldClick: effectiveFieldClick,\n onCubeClick: effectiveCubeClick,\n isHighlighted: stableHighlightedCubes.includes((cube as { name: string }).name),\n highlightedFields: stableHighlightedFields,\n searchTerm: effectiveSearchTerm,\n selectedField: isStandaloneMode ? selectedField : null,\n }), [effectiveFieldClick, effectiveCubeClick, stableHighlightedCubes, stableHighlightedFields, effectiveSearchTerm, isStandaloneMode, selectedField])\n\n // Determine if layout is resolved (ready to render ReactFlow)\n const layoutReady = !needsAutoLayout || layoutPhase === 'ready'\n\n const displayNodes = useMemo(() => {\n if (!meta || !layoutReady || !positionsLoaded) return []\n\n if (needsAutoLayout && elkNodes.length > 0) {\n // Use ELK-positioned nodes, inject presentation data\n return elkNodes.map(node => ({\n ...node,\n data: buildNodeData(node.data?.cube || meta.cubes.find(c => c.name === node.id)),\n }))\n }\n\n // Use saved positions\n return structuralNodes.map(node => ({\n ...node,\n position: savedPositions[node.id] || node.position,\n data: buildNodeData(node.data?.cube),\n }))\n }, [meta, layoutReady, positionsLoaded, needsAutoLayout, elkNodes, structuralNodes, savedPositions, buildNodeData])\n\n const displayEdges = useMemo(() => {\n if (!meta || !layoutReady) return []\n if (needsAutoLayout && elkEdges.length > 0) return elkEdges\n return structuralEdges\n }, [meta, layoutReady, needsAutoLayout, elkEdges, structuralEdges])\n\n // --- Controlled ReactFlow state ---\n const [rfNodes, setRfNodes] = useState<Node[]>([])\n const [rfEdges, setRfEdges] = useState<Edge[]>([])\n const appliedLayoutKeyRef = useRef('')\n const [fitViewToken, setFitViewToken] = useState(0) // increment to request fitView\n\n // Push layout to ReactFlow — only when positions change (not on data-only changes)\n useEffect(() => {\n if (displayNodes.length === 0) return\n\n const key = displayNodes.map(n => `${n.id}:${Math.round(n.position.x)},${Math.round(n.position.y)}`).join('|')\n if (key === appliedLayoutKeyRef.current) return\n\n const isFirstLayout = appliedLayoutKeyRef.current === ''\n appliedLayoutKeyRef.current = key\n setRfNodes(displayNodes)\n setRfEdges(displayEdges)\n\n // Request fitView on first layout\n if (isFirstLayout) {\n setFitViewToken(t => t + 1)\n }\n }, [displayNodes, displayEdges])\n\n // Update presentation data (highlights, search) without resetting positions\n const prevPresentationRef = useRef('')\n useEffect(() => {\n const selectedKey = selectedField ? `${selectedField.cubeName}.${selectedField.fieldName}` : ''\n const presentationKey = `${stableHighlightedCubes.join(',')}|${stableHighlightedFields.join(',')}|${effectiveSearchTerm}|${String(onFieldClick)}|${selectedKey}`\n if (presentationKey === prevPresentationRef.current) return\n prevPresentationRef.current = presentationKey\n\n if (rfNodes.length === 0 || !meta) return\n setRfNodes(prev => prev.map(node => {\n const cube = meta.cubes.find(c => c.name === node.id)\n if (!cube) return node\n return { ...node, data: buildNodeData(cube) }\n }))\n }, [stableHighlightedCubes, stableHighlightedFields, effectiveSearchTerm, onFieldClick, selectedField, rfNodes.length, meta, buildNodeData])\n\n // Handle node changes (dragging)\n const handleNodesChange = useCallback((changes: NodeChange[]) => {\n setRfNodes(nds => applyNodeChanges(changes, nds))\n\n // Save positions on drag end\n const dragEnds = changes.filter(\n (c) => c.type === 'position' && 'dragging' in c && c.dragging === false\n )\n if (dragEnds.length > 0) {\n setRfNodes(currentNodes => {\n const positions: Record<string, { x: number; y: number }> = {}\n currentNodes.forEach(n => { if (n.position) positions[n.id] = n.position })\n try { localStorage.setItem('drizzle-cube-erd-node-positions', JSON.stringify(positions)) } catch { /* ignore */ }\n setSavedPositions(positions)\n return currentNodes\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleEdgesChange = useCallback((_changes: EdgeChange[]) => {}, [])\n\n const handleContextMenu = useCallback((event: ReactMouseEvent | MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setContextMenu({ x: event.clientX, y: event.clientY })\n }, [])\n\n const handleClick = useCallback(() => {\n if (contextMenu) setContextMenu(null)\n if (selectedField) { setSelectedField(null); setDetailPosition(null) }\n }, [contextMenu, selectedField])\n\n const handleAutoLayout = useCallback(() => {\n setSavedPositions({})\n appliedLayoutKeyRef.current = '' // force re-apply → layout effect will request fitView\n try { localStorage.removeItem('drizzle-cube-erd-node-positions') } catch { /* ignore */ }\n setAutoLayoutCounter(c => c + 1)\n setContextMenu(null)\n }, [])\n\n // --- Render ---\n\n if (metaLoading) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center\">\n <div className=\"dc:animate-spin dc:rounded-full dc:h-8 dc:w-8 dc:border-b-2 border-dc-accent dc:mx-auto dc:mb-2\" />\n <p className=\"text-dc-text-muted\">Loading cube schema...</p>\n </div>\n </div>\n )\n }\n\n if (metaError) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center text-dc-error\">\n <p className=\"dc:font-medium\">Failed to load cube schema</p>\n <p className=\"dc:text-sm dc:mt-1\">{metaError}</p>\n </div>\n </div>\n )\n }\n\n if (!meta || meta.cubes.length === 0) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center text-dc-text-muted\">\n <p className=\"dc:font-medium\">No cubes found</p>\n <p className=\"dc:text-sm dc:mt-1\">Register some cubes to see the relationship diagram</p>\n </div>\n </div>\n )\n }\n\n // Show loading while ELK computes layout (no grid flash)\n if (!layoutReady) {\n return (\n <div className={`dc:flex dc:items-center dc:justify-center dc:h-96 ${className}`}>\n <div className=\"dc:text-center\">\n <div className=\"dc:animate-spin dc:rounded-full dc:h-8 dc:w-8 dc:border-b-2 border-dc-accent dc:mx-auto dc:mb-2\" />\n <p className=\"text-dc-text-muted\">Computing layout...</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className={`dc:flex dc:flex-col ${className}`} style={{ height, minHeight: 400 }}>\n {searchTerm === undefined && (\n <div className=\"dc:px-3 dc:py-2 dc:border-b border-dc-border bg-dc-surface dc:flex dc:items-center dc:gap-2 dc:flex-shrink-0\">\n <SearchIcon className=\"dc:w-4 dc:h-4 text-dc-text-muted\" />\n <input\n type=\"text\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder=\"Search cubes and fields...\"\n className=\"dc:flex-1 dc:text-sm dc:bg-transparent dc:outline-none text-dc-text dc:placeholder:text-dc-text-muted\"\n />\n {searchInput && (\n <button onClick={() => setSearchInput('')} className=\"text-dc-text-muted dc:hover:text-dc-text\">\n <CloseIcon className=\"dc:w-3 dc:h-3\" />\n </button>\n )}\n </div>\n )}\n\n <div ref={containerRef} className=\"dc:relative dc:flex-1 dc:min-h-0\">\n <div style={{ position: 'absolute', inset: 0 }}>\n <ReactFlowComponent\n nodes={rfNodes}\n edges={rfEdges}\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionMode={'loose' as never}\n minZoom={0.1}\n maxZoom={2}\n proOptions={{ hideAttribution: true }}\n onPaneContextMenu={handleContextMenu}\n onPaneClick={handleClick}\n >\n <Controls />\n <MiniMap\n nodeColor={(node) => stableHighlightedCubes.includes(node.id) ? '#8b5cf6' : '#e5e7eb'}\n maskColor=\"rgb(240, 242, 246, 0.7)\"\n />\n <Background variant={'dots' as never} gap={12} size={1} />\n <FitViewOnReady token={fitViewToken} />\n </ReactFlowComponent>\n </div>\n\n {/* Field detail panel for standalone browse mode */}\n {isStandaloneMode && selectedField && detailPosition && meta && (\n <div\n className=\"dc:absolute dc:z-20\"\n style={{ left: detailPosition.x, top: detailPosition.y }}\n >\n <FieldDetailPanel\n selection={selectedField}\n meta={meta}\n onClose={() => { setSelectedField(null); setDetailPosition(null) }}\n />\n </div>\n )}\n </div>\n\n {contextMenu && (\n <div\n className=\"dc:fixed dc:z-50 bg-dc-surface dc:rounded-md dc:shadow-lg dc:border border-dc-border dc:py-1 dc:min-w-[120px]\"\n style={{ left: contextMenu.x, top: contextMenu.y }}\n >\n <button\n onClick={handleAutoLayout}\n className=\"dc:w-full dc:px-3 dc:py-2 dc:text-sm text-dc-text-secondary dc:hover:bg-dc-surface-hover dc:text-left\"\n >\n Auto Layout\n </button>\n </div>\n )}\n </div>\n )\n}\n\nexport default SchemaVisualization\n"],"names":["XyflowContext","createContext","XyflowProvider","useXyflow","ctx","useContext","loadFailed","MissingDependencyFallback","_props","jsxs","jsx","LoadingFallback","LazySchemaVisualization","lazy","index","SchemaVisualizationLazy","props","xyflow","setXyflow","useState","failed","setFailed","useEffect","cancelled","mod","Suspense","CubeNode","data","Handle","Position","cube","onFieldClick","onCubeClick","isHighlighted","highlightedFields","searchTerm","selectedField","handleFieldClick","e","fieldName","fieldType","InfoIcon","getIcon","handleCubeInfoClick","isFieldSelected","isCubeSelected","isFieldHighlighted","fullFieldName","isFieldSearchMatch","field","term","hasCubeMatches","m","d","getFieldClasses","highlighted","_fieldType","selected","base","timeDimensions","regularDimensions","measure","dimension","RelationshipEdge","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","style","markerEnd","getBezierPath","BaseEdge","EdgeLabelRenderer","edgePath","labelX","labelY","relationship","joinFields","getSymbol","rel","color","symbol","Fragment","DetailRow","label","children","TypeBadge","type","MeasureDetail","typeColor","dm","DimensionDetail","hierarchies","h","l","g","CubeDetail","relationshipColors","i","FieldDetailPanel","selection","meta","onClose","CloseIcon","c","title","dotColor","sectionBgColor","content","defaultLayoutOptions","getTargetPosition","direction","getSourcePosition","estimateNodeHeight","node","HEADER","SECTION_HEADER","ROW","MAX_BODY","PADDING","measures","timeDims","regularDims","elkInstance","elkLoadPromise","ELK","computeElkLayout","nodes","edges","opts","layoutWithGrid","sourceSide","targetSide","nodeSourceEdges","nodeTargetEdges","edge","elkNodes","w","srcEdges","tgtEdges","ports","edgeId","elkEdges","graph","result","positionMap","child","col","colY","position","useERDLayout","options","useMemo","structureKey","n","nodesRef","useRef","edgesRef","optsRef","phase","setPhase","setResult","resultKey","setResultKey","computeIdRef","id","layoutResult","nodeTypes","edgeTypes","FitViewOnReady","token","useNodesInitialized","useReactFlow","nodesInitialized","fitView","appliedTokenRef","EMPTY_STRINGS","getRelationshipColor","SchemaVisualization","className","highlightedCubes","height","ReactFlowComponent","Controls","MiniMap","Background","applyNodeChanges","metaLoading","metaError","useCubeContext","stableHighlightedCubes","stableHighlightedFields","contextMenu","setContextMenu","searchInput","setSearchInput","autoLayoutCounter","setAutoLayoutCounter","setSelectedField","detailPosition","setDetailPosition","containerRef","isStandaloneMode","savedPositions","setSavedPositions","positionsLoaded","setPositionsLoaded","SearchIcon","effectiveSearchTerm","saved","structuralNodes","structuralEdges","needsAutoLayout","layoutPhase","toContainerPos","useCallback","clientX","clientY","rect","panelW","panelH","x","y","handleInternalFieldClick","cubeName","pos","prev","handleInternalCubeClick","effectiveFieldClick","effectiveCubeClick","buildNodeData","layoutReady","displayNodes","displayEdges","rfNodes","setRfNodes","rfEdges","setRfEdges","appliedLayoutKeyRef","fitViewToken","setFitViewToken","key","isFirstLayout","t","prevPresentationRef","selectedKey","presentationKey","handleNodesChange","changes","nds","currentNodes","positions","handleEdgesChange","_changes","handleContextMenu","event","handleClick","handleAutoLayout"],"mappings":";;;;AAaA,MAAMA,KAAgBC,GAAmC,IAAI,GAEhDC,KAAiBF,GAAc;AAErC,SAASG,IAA0B;AACxC,QAAMC,IAAMC,GAAWL,EAAa;AACpC,MAAI,CAACI,EAAK,OAAM,IAAI,MAAM,8CAA8C;AACxE,SAAOA;AACT;ACPA,IAAIE,KAAa;AAEjB,SAASC,GAA0BC,GAAkC;AACnE,2BACG,OAAA,EAAI,WAAU,8DACb,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uBAAsB,UAAA,MAAS;AAAA,IAC9C,gBAAAA,EAAC,MAAA,EAAG,WAAU,oDAAmD,UAAA,qDAEjE;AAAA,IACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,6CAA4C,UAAA,+EAEzD;AAAA,IACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,+HAA8H,UAAA,kCAAA,CAE9I;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAEA,SAASC,KAAkB;AACzB,2BACG,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kGAAA,CAAkG;AAAA,IACjH,gBAAAA,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,kCAAA,CAA+B;AAAA,EAAA,EAAA,CAC9E,EAAA,CACF;AAEJ;AAEA,MAAME,KAA0BC,GAAK,aAE5B,EAAE,UADG,MAAM,QAAA,QAAA,EAAA,KAAA,MAAAC,EAAA,GACI,oBAAA,EACvB;AAEM,SAASC,GAAwBC,GAAiC;AACvE,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAA8B,IAAI,GACxD,CAACC,GAAQC,CAAS,IAAIF,EAASb,EAAU;AAkB/C,SAhBAgB,EAAU,MAAM;AACd,QAAIhB,GAAY;AAChB,QAAIiB,IAAY;AAEhB,kBAAO,eAAe,EACnB,KAAK,CAACC,MAAQ;AACb,MAAKD,KAAWL,EAAUM,CAAG;AAAA,IAC/B,CAAC,EACA,MAAM,MAAM;AACX,MAAAlB,KAAa,IACRiB,KAAWF,EAAU,EAAI;AAAA,IAChC,CAAC,GAEI,MAAM;AAAE,MAAAE,IAAY;AAAA,IAAK;AAAA,EAClC,GAAG,CAAA,CAAE,GAEDH,IACK,gBAAAV,EAACH,IAAA,EAA2B,GAAGS,EAAA,CAAO,IAG1CC,IAKH,gBAAAP,EAACR,IAAA,EAAe,OAAOe,GACrB,4BAACQ,IAAA,EAAS,UAAU,gBAAAf,EAACC,IAAA,CAAA,CAAgB,GACnC,UAAA,gBAAAD,EAACE,IAAA,EAAyB,GAAGI,EAAA,CAAO,GACtC,GACF,sBARQL,IAAA,EAAgB;AAU5B;AClEO,SAASe,GAAS,EAAE,MAAAC,KAAuB;AAChD,QAAM,EAAE,QAAAC,GAAQ,UAAAC,EAAA,IAAa1B,EAAA,GACvB,EAAE,MAAA2B,GAAM,cAAAC,GAAc,aAAAC,GAAa,eAAAC,GAAe,mBAAAC,GAAmB,YAAAC,GAAY,eAAAC,MAAkBT,GAEnGU,IAAmB,CAACC,GAAeC,GAAmBC,MAAuC;AACjG,IAAIT,KACFA,EAAaD,EAAK,MAAMS,GAAWC,GAAW,EAAE,GAAGF,EAAE,SAAS,GAAGA,EAAE,QAAA,CAAS;AAAA,EAEhF,GAEMG,IAAWC,EAAQ,MAAM,GAEzBC,IAAsB,CAACL,MAAkB;AAC7C,IAAAA,EAAE,gBAAA,GACEN,KACFA,EAAYF,EAAK,MAAM,EAAE,GAAGQ,EAAE,SAAS,GAAGA,EAAE,SAAS;AAAA,EAEzD,GAEMM,IAAkB,CAACL,MAClBH,IACEA,EAAc,aAAaN,EAAK,QAAQM,EAAc,cAAcG,IADhD,IAIvBM,IAAiBT,GAAe,aAAaN,EAAK,QAAQM,GAAe,cAAc,MAEvFU,IAAqB,CAACC,MACnBb,EAAkB,SAASa,CAAa,GAG3CC,IAAqB,CAACC,MAA4C;AACtE,QAAI,CAACd,GAAY,KAAA,EAAQ,QAAO;AAChC,UAAMe,IAAOf,EAAW,YAAA;AACxB,WACEc,EAAM,KAAK,YAAA,EAAc,SAASC,CAAI,KACrCD,EAAM,SAASA,EAAM,MAAM,YAAA,EAAc,SAASC,CAAI;AAAA,EAE3D,GAQMC,IALChB,GAAY,KAAA,IACVL,EAAK,SAAS,KAAK,CAAAsB,MAAKJ,EAAmBI,CAAC,CAAC,KAC7CtB,EAAK,WAAW,KAAK,CAAAuB,MAAKL,EAAmBK,CAAC,CAAC,IAFtB,IAO5BC,IAAkB,CACtBL,GACAM,GACAC,MACG;AACH,UAAMjB,IAAYU,EAAM,KAAK,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAM,MAC9CQ,IAAWb,EAAgBL,CAAS,GACpCmB,IAAO;AAEb,WAAID,IACK,GAAGC,CAAI,4FAGZ,CAACP,KAAkBhB,GAAY,SAC7BoB,IAAoB,GAAGG,CAAI,qDACxB,GAAGA,CAAI,yDAGZvB,GAAY,KAAA,KAAU,CAACa,EAAmBC,CAAK,IAC1C,GAAGS,CAAI,0DAGZvB,GAAY,KAAA,KAAUa,EAAmBC,CAAK,KAAK,CAACM,IAC/C,GAAGG,CAAI,2CAGZH,IACK,GAAGG,CAAI,qDAGT,GAAGA,CAAI;AAAA,EAChB,GAEMC,IAAiB7B,EAAK,WAAW,OAAO,CAAAuB,MAAKA,EAAE,SAAS,MAAM,GAC9DO,IAAoB9B,EAAK,WAAW,OAAO,CAAAuB,MAAKA,EAAE,SAAS,MAAM;AAEvE,SACE,gBAAA5C;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA;AAAA,UAEP,CAAC0C,KAAkBhB,GAAY,KAAA,IAAS,+BAA+B,EAAE;AAAA,UACzEF,IAAgB,8CAA8C,kBAAkB;AAAA;AAAA,MAEpF,OAAO,EAAE,iBAAiB,oBAAA;AAAA,MAG1B,UAAA;AAAA,QAAA,gBAAAvB,EAAC,OAAA,EAAI,WAAW,wCACduB,IAAgB,oBAAoB,yBACtC,IACE,UAAA,gBAAAxB,EAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAC,EAAC,QAAG,WAAU,4CACX,UAAAoB,EAAK,SAASA,EAAK,MACtB;AAAA,YACCA,EAAK,eACJ,gBAAApB,EAAC,OAAE,WAAU,yDAAyD,YAAK,YAAA,CAAY;AAAA,UAAA,GAE3F;AAAA,UACCsB,KACC,gBAAAtB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,+DACTmC,IACI,mCACA,uEACN;AAAA,cACA,SAASF;AAAA,cACT,OAAM;AAAA,cAEN,UAAA,gBAAAjC,EAAC+B,GAAA,EAAS,WAAU,gBAAA,CAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,UAGvC,CAACT,KACA,gBAAAvB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAK,UAAA;AAAA,cAAAqB,EAAK,SAAS;AAAA,cAAO;AAAA,YAAA,GAAC;AAAA,8BAC3B,OAAA,EAAK,UAAA;AAAA,cAAAA,EAAK,WAAW;AAAA,cAAO;AAAA,YAAA,EAAA,CAAC;AAAA,UAAA,EAAA,CAChC;AAAA,QAAA,EAAA,CAEJ,EAAA,CACF;AAAA,QAGCA,EAAK,SAAS,SAAS,KACtB,gBAAArB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kDAAiD,OAAO,EAAE,iBAAiB,+DAAA,GACxF,UAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,YAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,sDAAA,CAAsD;AAAA,YAAE;AAAA,YAC7DoB,EAAK,SAAS;AAAA,YAAO;AAAA,UAAA,EAAA,CAClC,EAAA,CACF;AAAA,UACA,gBAAApB,EAAC,SAAI,WAAU,0CACZ,YAAK,SAAS,IAAI,CAACmD,MAAY;AAC9B,kBAAMtB,IAAYsB,EAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAQ,MAClDN,IAAcT,EAAmBe,EAAQ,IAAI;AACnD,mBACE,gBAAAnD;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAW4C,EAAgBO,GAASN,CAAsB;AAAA,gBAC1D,SAAS,CAACjB,MAAMD,EAAiBC,GAAGC,GAAW,SAAS;AAAA,gBACxD,OAAOsB,EAAQ;AAAA,gBAEf,UAAA,gBAAApD,EAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,kBAAA,gBAAAC,EAAC,UAAK,WAAU,4BACb,YAAQ,cAAcmD,EAAQ,SAAStB,EAAA,CAC1C;AAAA,kBACA,gBAAA7B,EAAC,QAAA,EAAK,WAAU,0DACb,YAAQ,KAAA,CACX;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,cAZKmD,EAAQ;AAAA,YAAA;AAAA,UAenB,CAAC,EAAA,CACH;AAAA,QAAA,GACF;AAAA,QAIDF,EAAe,SAAS,KACvB,gBAAAlD,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kDAAiD,OAAO,EAAE,iBAAiB,8DAAA,GACxF,UAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,YAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,qDAAA,CAAqD;AAAA,YAAE;AAAA,YACrDiD,EAAe;AAAA,YAAO;AAAA,UAAA,EAAA,CAC1C,EAAA,CACF;AAAA,4BACC,OAAA,EAAI,WAAU,0CACZ,UAAAA,EAAe,IAAI,CAACG,MAAc;AACjC,kBAAMvB,IAAYuB,EAAU,KAAK,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAU,MACtDP,IAAcT,EAAmBgB,EAAU,IAAI;AACrD,mBACE,gBAAApD;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAW4C,EAAgBQ,GAAWP,CAAwB;AAAA,gBAC9D,SAAS,CAACjB,MAAMD,EAAiBC,GAAGC,GAAW,WAAW;AAAA,gBAC1D,OAAOuB,EAAU;AAAA,gBAEjB,UAAA,gBAAArD,EAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,kBAAA,gBAAAC,EAAC,UAAK,WAAU,4BACb,YAAU,cAAcoD,EAAU,SAASvB,EAAA,CAC9C;AAAA,kBACA,gBAAA7B,EAAC,QAAA,EAAK,WAAU,0DACb,YAAU,KAAA,CACb;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,cAZKoD,EAAU;AAAA,YAAA;AAAA,UAerB,CAAC,EAAA,CACH;AAAA,QAAA,GACF;AAAA,QAIDF,EAAkB,SAAS,KAC1B,gBAAAnD,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kDAAiD,OAAO,EAAE,iBAAiB,+DAAA,GACxF,UAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,YAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,sDAAA,CAAsD;AAAA,YAAE;AAAA,YAC3DkD,EAAkB;AAAA,YAAO;AAAA,UAAA,EAAA,CACxC,EAAA,CACF;AAAA,4BACC,OAAA,EAAI,WAAU,0CACZ,UAAAA,EAAkB,IAAI,CAACE,MAAc;AACpC,kBAAMvB,IAAYuB,EAAU,KAAK,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAU,MACtDP,IAAcT,EAAmBgB,EAAU,IAAI;AACrD,mBACE,gBAAApD;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAW4C,EAAgBQ,GAAWP,CAAwB;AAAA,gBAC9D,SAAS,CAACjB,MAAMD,EAAiBC,GAAGC,GAAW,WAAW;AAAA,gBAC1D,OAAOuB,EAAU;AAAA,gBAEjB,UAAA,gBAAArD,EAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,kBAAA,gBAAAC,EAAC,UAAK,WAAU,4BACb,YAAU,cAAcoD,EAAU,SAASvB,EAAA,CAC9C;AAAA,kBACA,gBAAA7B,EAAC,QAAA,EAAK,WAAU,0DACb,YAAU,KAAA,CACb;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,cAZKoD,EAAU;AAAA,YAAA;AAAA,UAerB,CAAC,EAAA,CACH;AAAA,QAAA,GACF;AAAA,QAIF,gBAAApD,EAACkB,GAAA,EAAO,MAAK,UAAS,UAAUC,EAAS,OAAO,IAAG,SAAQ,WAAU,gBAAe,eAAe,GAAA,CAAO;AAAA,QAC1G,gBAAAnB,EAACkB,GAAA,EAAO,MAAK,UAAS,UAAUC,EAAS,MAAM,IAAG,QAAO,WAAU,gBAAe,eAAe,GAAA,CAAO;AAAA,QACxG,gBAAAnB,EAACkB,GAAA,EAAO,MAAK,UAAS,UAAUC,EAAS,QAAQ,IAAG,UAAS,WAAU,gBAAe,eAAe,GAAA,CAAO;AAAA,QAC5G,gBAAAnB,EAACkB,GAAA,EAAO,MAAK,UAAS,UAAUC,EAAS,KAAK,IAAG,OAAM,WAAU,gBAAe,eAAe,GAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG5G;ACpPO,SAASkC,GAAiB;AAAA,EAC/B,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC,IAAQ,CAAA;AAAA,EACR,MAAA3C;AAAA,EACA,WAAA4C;AACF,GAAoC;AAClC,QAAM,EAAE,eAAAC,GAAe,UAAAC,GAAU,mBAAAC,EAAA,IAAsBvE,EAAA,GACjD,CAACwE,GAAUC,GAAQC,CAAM,IAAIL,EAAc;AAAA,IAC/C,SAAAR;AAAA,IACA,SAAAC;AAAA,IACA,gBAAAG;AAAA,IACA,SAAAF;AAAA,IACA,SAAAC;AAAA,IACA,gBAAAE;AAAA,EAAA,CACD;AAED,MAAI,CAAC1C,EAAM,QAAO;AAElB,QAAM,EAAE,cAAAmD,GAAc,YAAAC,EAAA,IAAepD,GAE/BqD,IAAY,CAACC,MAAgB;AACjC,YAAQA,GAAA;AAAA,MACN,KAAK;AAAa,eAAO;AAAA;AAAA,MACzB,KAAK;AAAU,eAAO;AAAA,MACtB,KAAK;AAAW,eAAO;AAAA,MACvB,KAAK;AAAiB,eAAO;AAAA,MAC7B;AAAS,eAAO;AAAA,IAAA;AAAA,EAEpB,GAYMC,KAVW,CAACD,MAAgB;AAChC,YAAQA,GAAA;AAAA,MACN,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAU,eAAO;AAAA,MACtB,KAAK;AAAW,eAAO;AAAA,MACvB,KAAK;AAAiB,eAAO;AAAA,MAC7B;AAAS,eAAO;AAAA,IAAA;AAAA,EAEpB,GAEuBH,EAAa,YAAY,GAC1CK,IAASH,EAAUF,EAAa,YAAY;AAElD,SACE,gBAAArE,EAAA2E,IAAA,EACE,UAAA;AAAA,IAAA,gBAAA1E,EAAC+D,GAAA,EAAS,MAAME,GAAU,WAAAJ,GAAsB,OAAO,EAAE,GAAGD,GAAO,QAAQY,EAAA,EAAM,CAAG;AAAA,sBACnFR,GAAA,EACC,UAAA,gBAAAhE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,WAAW,mCAAmCkE,CAAM,MAAMC,CAAM;AAAA,UAChE,UAAU;AAAA,UACV,eAAe;AAAA,QAAA;AAAA,QAEjB,WAAU;AAAA,QAEV,UAAA,gBAAAnE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,qBAAqB,aAAawE,EAAA;AAAA,YAE5D,UAAA,gBAAAzE,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,cAAA,gBAAAC,EAAC,SAAI,WAAU,mCAAkC,OAAO,EAAE,OAAAwE,EAAA,GACvD,UAAAC,GACH;AAAA,cACA,gBAAAzE,EAAC,OAAA,EAAI,WAAU,qDACZ,UAAAqE,EAAW,IAAI,CAAC9B,GAAOnC,MACtB,gBAAAL,EAAC,OAAA,EAAgB,WAAU,gBACxB,UAAA;AAAA,gBAAAwC,EAAM;AAAA,gBAAY;AAAA,gBAAIA,EAAM;AAAA,cAAA,EAAA,GADrBnC,CAEV,CACD,EAAA,CACH;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GACF;AAEJ;ACjFA,SAASuE,EAAU,EAAE,OAAAC,GAAO,UAAAC,KAAoD;AAC9E,SACE,gBAAA9E,EAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,8DAA8D,UAAA4E,GAAM;AAAA,IACpF,gBAAA5E,EAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA6E,EAAA,CAAS;AAAA,EAAA,GAChE;AAEJ;AAEA,SAASC,GAAU,EAAE,MAAAC,GAAM,OAAAP,KAA0C;AACnE,SACE,gBAAAxE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,iBAAiB,sBAAsBwE,CAAK,4BAA4B,OAAAA,EAAA;AAAA,MAEhF,UAAAO;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASC,GAAc,EAAE,SAAA7B,GAAS,MAAA/B,KAA0D;AAC1F,QAAM6D,IAAY;AAAA,IAChB,OAAO;AAAA,IACP,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,cAAc;AAAA,IACd,QAAQ;AAAA,EAAA,EACR9B,EAAQ,IAAI,KAAK;AAEnB,SACE,gBAAApD,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,IAAA,gBAAAC,EAAC2E,KAAU,OAAM,QAAQ,UAAAvD,EAAK,SAASA,EAAK,MAAK;AAAA,IACjD,gBAAApB,EAAC2E,GAAA,EAAU,OAAM,QAAO,UAAA,gBAAA3E,EAAC8E,IAAA,EAAU,MAAM3B,EAAQ,MAAM,OAAO8B,EAAA,CAAW,EAAA,CAAE;AAAA,IAC1E9B,EAAQ,SAASA,EAAQ,UAAUA,EAAQ,cAC1C,gBAAAnD,EAAC2E,GAAA,EAAU,OAAM,SAAS,UAAAxB,EAAQ,MAAA,CAAM;AAAA,IAEzCA,EAAQ,gBAAgBA,EAAQ,aAAa,SAAS,KACrD,gBAAAnD,EAAC2E,GAAA,EAAU,OAAM,cACf,UAAA,gBAAA3E,EAAC,OAAA,EAAI,WAAU,iCACZ,UAAAmD,EAAQ,aAAa,IAAI,CAAA+B,MACxB,gBAAAlF,EAAC,QAAA,EAAc,WAAU,+GACtB,YAAG,MAAM,GAAG,EAAE,CAAC,KAAKkF,EAAA,GADZA,CAEX,CACD,GACH,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAASC,GAAgB,EAAE,WAAA/B,GAAW,MAAAhC,KAA8D;AAClG,QAAM6D,IAAY7B,EAAU,SAAS,SAAS,YAAY,WAGpDgC,IAAchE,EAAK,aAAa;AAAA,IAAO,CAAAiE,MAC3CA,EAAE,OAAO,KAAK,OAAKC,MAAMlC,EAAU,QAAQkC,MAAM,GAAGlE,EAAK,IAAI,IAAIgC,EAAU,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAAA,EAAA,KAC5F,CAAA;AAEL,SACE,gBAAArD,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,IAAA,gBAAAC,EAAC2E,KAAU,OAAM,QAAQ,UAAAvD,EAAK,SAASA,EAAK,MAAK;AAAA,IACjD,gBAAApB,EAAC2E,GAAA,EAAU,OAAM,QAAO,UAAA,gBAAA3E,EAAC8E,IAAA,EAAU,MAAM1B,EAAU,MAAM,OAAO6B,EAAA,CAAW,EAAA,CAAE;AAAA,IAC5E7B,EAAU,SAASA,EAAU,UAAUA,EAAU,cAChD,gBAAApD,EAAC2E,GAAA,EAAU,OAAM,SAAS,UAAAvB,EAAU,MAAA,CAAM;AAAA,IAE3CA,EAAU,SAAS,UAAUA,EAAU,iBAAiBA,EAAU,cAAc,SAAS,KACxF,gBAAApD,EAAC2E,GAAA,EAAU,OAAM,eACf,UAAA,gBAAA3E,EAAC,OAAA,EAAI,WAAU,iCACZ,UAAAoD,EAAU,cAAc,IAAI,CAAAmC,MAC3B,gBAAAvF,EAAC,QAAA,EAAa,WAAU,+GACrB,UAAAuF,EAAA,GADQA,CAEX,CACD,GACH,GACF;AAAA,IAEDH,EAAY,SAAS,KACpB,gBAAApF,EAAC2E,GAAA,EAAU,OAAM,aACd,UAAAS,EAAY,IAAI,CAAAC,MACf,gBAAAtF,EAAC,OAAA,EAAiB,WAAU,kBAC1B,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAqF,EAAE,OAAM;AAAA,MAC1C,gBAAAtF,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA;AAAA,QAAA;AAAA,QACzCsF,EAAE,OAAO,IAAI,CAAAC,MAAKA,EAAE,MAAM,GAAG,EAAE,CAAC,KAAKA,CAAC,EAAE,KAAK,KAAK;AAAA,QAAE;AAAA,MAAA,EAAA,CACxD;AAAA,IAAA,KAJQD,EAAE,IAKZ,CACD,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAASG,GAAW,EAAE,MAAApE,KAAgC;AACpD,QAAMqE,IAA6C;AAAA,IACjD,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,EAAA;AAGjB,SACE,gBAAA1F,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,IAAAqB,EAAK,eACJ,gBAAApB,EAAC2E,GAAA,EAAU,OAAM,eAAe,YAAK,aAAY;AAAA,IAEnD,gBAAA5E,EAAC4E,GAAA,EAAU,OAAM,YACf,UAAA;AAAA,MAAA,gBAAA3E,EAAC,QAAA,EAAK,WAAU,gBAAgB,UAAAoB,EAAK,SAAS,QAAO;AAAA,MACpDA,EAAK,SAAS,SAAS,KACtB,gBAAArB,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA;AAAA,QAAA;AAAA,QACzC,CAAC,GAAG,IAAI,IAAIqB,EAAK,SAAS,IAAI,CAAAsB,MAAKA,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,QAAE;AAAA,MAAA,EAAA,CAC5D;AAAA,IAAA,GAEJ;AAAA,IACA,gBAAA3C,EAAC4E,GAAA,EAAU,OAAM,cACf,UAAA;AAAA,MAAA,gBAAA3E,EAAC,QAAA,EAAK,WAAU,gBAAgB,UAAAoB,EAAK,WAAW,QAAO;AAAA,MACtDA,EAAK,WAAW,KAAK,CAAAuB,MAAKA,EAAE,SAAS,MAAM,KAC1C,gBAAA5C,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA;AAAA,QAAA;AAAA,QACzCqB,EAAK,WAAW,OAAO,OAAKuB,EAAE,SAAS,MAAM,EAAE;AAAA,QAAO;AAAA,MAAA,EAAA,CAC1D;AAAA,IAAA,GAEJ;AAAA,IACCvB,EAAK,iBAAiBA,EAAK,cAAc,SAAS,KACjD,gBAAApB,EAAC2E,GAAA,EAAU,OAAM,SACf,UAAA,gBAAA3E,EAAC,SAAI,WAAU,gCACZ,UAAAoB,EAAK,cAAc,IAAI,CAACmD,GAAKmB,MAC5B,gBAAA3F,EAAC,OAAA,EAAY,WAAU,qDACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC8E,IAAA,EAAU,MAAMP,EAAI,cAAc,OAAOkB,EAAmBlB,EAAI,YAAY,KAAK,UAAA,CAAW;AAAA,MAC7F,gBAAAvE,EAAC,QAAA,EAAK,WAAU,gBAAgB,YAAI,WAAA,CAAW;AAAA,IAAA,EAAA,GAFvC0F,CAGV,CACD,EAAA,CACH,GACF;AAAA,IAEDtE,EAAK,eAAeA,EAAK,YAAY,SAAS,KAC7C,gBAAApB,EAAC2E,KAAU,OAAM,eACf,4BAAC,OAAA,EAAI,WAAU,gCACZ,UAAAvD,EAAK,YAAY,IAAI,CAAAiE,MACpB,gBAAAtF,EAAC,OAAA,EAAiB,WAAU,kBAC1B,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAqF,EAAE,OAAM;AAAA,MAC1C,gBAAAtF,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA;AAAA,QAAA;AAAA,QACzCsF,EAAE,OAAO,IAAI,CAAAC,MAAKA,EAAE,MAAM,GAAG,EAAE,CAAC,KAAKA,CAAC,EAAE,KAAK,KAAK;AAAA,QAAE;AAAA,MAAA,EAAA,CACxD;AAAA,IAAA,EAAA,GAJQD,EAAE,IAKZ,CACD,EAAA,CACH,EAAA,CACF;AAAA,IAEDjE,EAAK,MAAM,eACV,gBAAApB,EAAC2E,GAAA,EAAU,OAAM,gBACf,UAAA,gBAAA5E,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,sBAAqB,UAAA,aAAS;AAAA,wBAC7C,QAAA,EAAK,WAAU,gBAAgB,UAAAoB,EAAK,KAAK,YAAY,WAAW,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAK,KAAK,YAAY,YAAW;AAAA,MACnH,gBAAApB,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA,UAAM;AAAA,wBAClD,QAAA,EAAK,WAAU,gBAAgB,UAAAoB,EAAK,KAAK,YAAY,cAAc,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAK,KAAK,YAAY,cAAA,CAAc;AAAA,IAAA,EAAA,CAC3H,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEO,SAASuE,GAAiB,EAAE,WAAAC,GAAW,MAAAC,GAAM,SAAAC,KAAkC;AACpF,QAAMC,IAAY/D,EAAQ,OAAO,GAE3BZ,IAAOyE,EAAK,MAAM,KAAK,OAAKG,EAAE,SAASJ,EAAU,QAAQ;AAC/D,MAAI,CAACxE,EAAM,QAAO;AAGlB,MAAI6E,GACAC,GACAC,GACAC;AAEJ,MAAIR,EAAU,cAAc,UAAU,CAACA,EAAU;AAC/C,IAAAK,IAAQ7E,EAAK,SAASA,EAAK,MAC3B8E,IAAW,oBACXC,IAAiB,+DACjBC,IAAU,gBAAApG,EAACwF,MAAW,MAAApE,EAAA,CAAY;AAAA,WACzBwE,EAAU,cAAc,WAAW;AAC5C,UAAMzC,IAAU/B,EAAK,SAAS,KAAK,CAAAsB,OAClBA,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAE,UACvBkD,EAAU,aAAalD,EAAE,SAASkD,EAAU,SAC/D;AACD,QAAI,CAACzC,EAAS,QAAO;AACrB,IAAA8C,IAAQ9C,EAAQ,cAAcA,EAAQ,SAASyC,EAAU,WACzDM,IAAW,qBACXC,IAAiB,gEACjBC,IAAU,gBAAApG,EAACgF,IAAA,EAAc,SAAA7B,GAAkB,MAAA/B,EAAA,CAAY;AAAA,EACzD,OAAO;AACL,UAAMgC,IAAYhC,EAAK,WAAW,KAAK,CAAAuB,OACtBA,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,KAAKA,EAAE,UACvBiD,EAAU,aAAajD,EAAE,SAASiD,EAAU,SAC/D;AACD,QAAI,CAACxC,EAAW,QAAO;AACvB,IAAA6C,IAAQ7C,EAAU,cAAcA,EAAU,SAASwC,EAAU,WAC7DM,IAAW9C,EAAU,SAAS,SAAS,qBAAqB,qBAC5D+C,IAAiB/C,EAAU,SAAS,SAChC,gEACA,gEACJgD,IAAU,gBAAApG,EAACmF,IAAA,EAAgB,WAAA/B,GAAsB,MAAAhC,EAAA,CAAY;AAAA,EAC/D;AAEA,SACE,gBAAArB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,iBAAiB,oBAAA;AAAA,MAG1B,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiBoG,EAAA;AAAA,YAE1B,UAAA;AAAA,cAAA,gBAAApG,EAAC,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,gBAAA,gBAAAC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,iBAAiBkG,EAAA;AAAA,kBAAS;AAAA,gBAAA;AAAA,gBAErC,gBAAAlG,EAAC,MAAA,EAAG,WAAU,wDAAwD,UAAAiG,EAAA,CAAM;AAAA,cAAA,GAC9E;AAAA,cACA,gBAAAjG;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS8F;AAAA,kBACT,WAAU;AAAA,kBAEV,UAAA,gBAAA9F,EAAC+F,GAAA,EAAU,WAAU,oBAAA,CAAoB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC3C;AAAA,UAAA;AAAA,QAAA;AAAA,QAIF,gBAAA/F,EAAC,OAAA,EAAI,WAAU,mBACZ,UAAAoG,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;ACpPO,MAAMC,KAAsC;AAAA,EACjD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AACX;AAUA,SAASC,GAAkBC,GAA6B;AACtD,UAAQA,GAAA;AAAA,IACN,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB;AAAS,aAAO;AAAA,EAAA;AAEpB;AAEA,SAASC,GAAkBD,GAA6B;AACtD,UAAQA,GAAA;AAAA,IACN,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB;AAAS,aAAO;AAAA,EAAA;AAEpB;AAKA,SAASE,GAAmBC,GAAoB;AAC9C,QAAMtF,IAAOsF,EAAK,MAAM;AAKxB,MAAI,CAACtF,EAAM,QAAO;AAElB,QAAMuF,IAASvF,EAAK,cAAc,KAAK,IACjCwF,IAAiB,IACjBC,IAAM,IACNC,IAAW,KACXC,IAAU;AAEhB,MAAI1B,IAAIsB;AACR,QAAMK,IAAW5F,EAAK,UAAU,UAAU,GACpC6F,IAAW7F,EAAK,YAAY,OAAO,CAACuB,MAAMA,EAAE,SAAS,MAAM,EAAE,UAAU,GACvEuE,IAAc9F,EAAK,YAAY,OAAO,CAACuB,MAAMA,EAAE,SAAS,MAAM,EAAE,UAAU;AAEhF,SAAIqE,IAAW,MAAG3B,KAAKuB,IAAiB,KAAK,IAAII,IAAWH,GAAKC,CAAQ,IACrEG,IAAW,MAAG5B,KAAKuB,IAAiB,KAAK,IAAIK,IAAWJ,GAAKC,CAAQ,IACrEI,IAAc,MAAG7B,KAAKuB,IAAiB,KAAK,IAAIM,IAAcL,GAAKC,CAAQ,IAExEzB,IAAI0B;AACb;AAQA,IAAII,IAAkC;AAEtC,MAAMC,KAA8C,OAAO,0BAA0B,EAClF,KAAK,CAACtG,MAAQ;AACb,QAAMuG,IAAOvG,EAAuD,WAAWA;AAC/E,SAAAqG,IAAc,IAAKE,EAAA,GACZF;AACT,CAAC,EACA,MAAM,MAAM,IAAI;AAqCnB,eAAeG,GACbC,GACAC,GACAC,GAC0B;AAG1B,MADA,MAAML,IACF,CAACD;AAEH,WAAO,EAAE,OAAOO,GAAeH,GAAOE,CAAI,GAAG,OAAAD,EAAA;AAG/C,QAAMG,IAAaF,EAAK,cAAc,OAAO,SAAS,SAChDG,IAAaH,EAAK,cAAc,OAAO,SAAS,SAGhDI,wBAAsB,IAAA,GACtBC,wBAAsB,IAAA;AAC5B,EAAAN,EAAM,QAAQ,CAAAO,MAAQ;AACpB,IAAKF,EAAgB,IAAIE,EAAK,MAAM,KAAGF,EAAgB,IAAIE,EAAK,QAAQ,EAAE,GAC1EF,EAAgB,IAAIE,EAAK,MAAM,EAAG,KAAKA,EAAK,EAAE,GACzCD,EAAgB,IAAIC,EAAK,MAAM,KAAGD,EAAgB,IAAIC,EAAK,QAAQ,EAAE,GAC1ED,EAAgB,IAAIC,EAAK,MAAM,EAAG,KAAKA,EAAK,EAAE;AAAA,EAChD,CAAC;AAED,QAAMC,IAAsBT,EAAM,IAAI,CAACb,MAAS;AAC9C,UAAMuB,IAAIR,EAAK,WACTpC,IAAIoB,GAAmBC,CAAI,GAE3BwB,IAAWL,EAAgB,IAAInB,EAAK,EAAE,KAAK,CAAA,GAC3CyB,IAAWL,EAAgB,IAAIpB,EAAK,EAAE,KAAK,CAAA,GAC3C0B,IAAmB;AAAA,MACvB,GAAGF,EAAS,IAAI,CAAAG,OAAW;AAAA,QACzB,IAAI,GAAG3B,EAAK,EAAE,UAAU2B,CAAM;AAAA,QAC9B,eAAe,EAAE,iBAAiBV,EAAA;AAAA,MAAW,EAC7C;AAAA,MACF,GAAGQ,EAAS,IAAI,CAAAE,OAAW;AAAA,QACzB,IAAI,GAAG3B,EAAK,EAAE,UAAU2B,CAAM;AAAA,QAC9B,eAAe,EAAE,iBAAiBT,EAAA;AAAA,MAAW,EAC7C;AAAA,IAAA;AAGJ,WAAO;AAAA,MACL,IAAIlB,EAAK;AAAA,MACT,OAAOuB;AAAA,MACP,QAAQ5C;AAAA,MACR,eAAe,EAAE,uBAAuB,aAAA;AAAA,MACxC,OAAA+C;AAAA,IAAA;AAAA,EAEJ,CAAC,GAEKE,IAAsBd,EAAM,IAAI,CAACO,OAAU;AAAA,IAC/C,IAAIA,EAAK;AAAA,IACT,SAAS,CAAC,GAAGA,EAAK,MAAM,UAAUA,EAAK,EAAE,EAAE;AAAA,IAC3C,SAAS,CAAC,GAAGA,EAAK,MAAM,UAAUA,EAAK,EAAE,EAAE;AAAA,EAAA,EAC3C,GAIIQ,IAAQ;AAAA,IACZ,IAAI;AAAA,IACJ,eAAe;AAAA,MACb,iBAAiB;AAAA,MACjB,iBANiBd,EAAK,cAAc,OAAO,UAAU;AAAA,MAOrD,mBAAmB;AAAA,MACnB,wCAAwC;AAAA,MACxC,wBAAwB,OAAOA,EAAK,OAAO;AAAA,MAC3C,6CAA6C,OAAOA,EAAK,OAAO;AAAA,MAChE,wBAAwB;AAAA,MACxB,6CAA6C;AAAA,MAC7C,wBAAwB;AAAA,MACxB,sCAAsC;AAAA,MACtC,6CAA6C;AAAA,IAAA;AAAA,IAE/C,UAAUO;AAAA,IACV,OAAOM;AAAA,EAAA,GAGHE,IAAS,MAAMrB,EAAY,OAAOoB,CAAK,GAGvCE,wBAAkB,IAAA;AACxB,MAAID,EAAO;AACT,eAAWE,KAASF,EAAO;AACzB,MAAAC,EAAY,IAAIC,EAAM,IAAI,EAAE,GAAGA,EAAM,GAAG,GAAGA,EAAM,EAAA,CAAG;AAcxD,SAAO,EAAE,OAVanB,EAAM,IAAI,CAACb,OAAU;AAAA,IACzC,GAAGA;AAAA,IACH,UAAU+B,EAAY,IAAI/B,EAAK,EAAE,KAAKA,EAAK;AAAA,IAC3C,gBAAgBJ,GAAkBmB,EAAK,SAAS;AAAA,IAChD,gBAAgBjB,GAAkBiB,EAAK,SAAS;AAAA,EAAA,EAChD,GAK6B,OAAAD,EAAA;AACjC;AAEA,SAASE,GAAeH,GAAeE,GAA6B;AAElE,MAAIkB,IAAM,GACNC,IAAO;AAEX,SAAOrB,EAAM,IAAI,CAACb,MAAS;AACzB,UAAMrB,IAAIoB,GAAmBC,CAAI;AACjC,IAAIkC,IAAOvD,IAAI,QAAoBuD,IAAO,MACxCD,KACAC,IAAO;AAET,UAAMC,IAAW,EAAE,GAAGF,KAAOlB,EAAK,YAAYA,EAAK,UAAU,GAAGmB,EAAA;AAChE,WAAAA,KAAQvD,IAAI,IAEL;AAAA,MACL,GAAGqB;AAAA,MACH,UAAAmC;AAAA,MACA,gBAAgBrC,GAAkBiB,EAAK,SAAS;AAAA,MAChD,gBAAgBnB,GAAkBmB,EAAK,SAAS;AAAA,IAAA;AAAA,EAEpD,CAAC;AACH;AAcO,SAASqB,GACdvB,GACAC,GACAuB,IAAkC,CAAA,GACoB;AACtD,QAAMtB,IAAOuB;AAAA,IACX,OAAO,EAAE,GAAG3C,IAAsB,GAAG0C;;IAErC,CAACA,EAAQ,WAAWA,EAAQ,WAAWA,EAAQ,SAASA,EAAQ,OAAO;AAAA,EAAA,GAInEE,IAAeD,EAAQ,MACvBzB,EAAM,WAAW,IAAU,KACxBA,EAAM,IAAI,CAAA2B,MAAKA,EAAE,EAAE,EAAE,OAAO,KAAK,GAAG,IAAI,MAAM1B,EAAM,IAAI,CAAA5F,MAAKA,EAAE,EAAE,EAAE,KAAA,EAAO,KAAK,GAAG,GACxF,CAAC2F,GAAOC,CAAK,CAAC,GAIX2B,IAAWC,EAAO7B,CAAK,GACvB8B,IAAWD,EAAO5B,CAAK,GACvB8B,IAAUF,EAAO3B,CAAI;AAC3B,EAAA0B,EAAS,UAAU5B,GACnB8B,EAAS,UAAU7B,GACnB8B,EAAQ,UAAU7B;AAElB,QAAM,CAAC8B,GAAOC,CAAQ,IAAI/I,EAAsB,SAAS,GACnD,CAAC+H,GAAQiB,CAAS,IAAIhJ,EAAiC,IAAI,GAC3D,CAACiJ,GAAWC,CAAY,IAAIlJ,EAAS,EAAE,GAGvCmJ,IAAeR,EAAO,CAAC;AAkC7B,SAhCAxI,EAAU,MAAM;AACd,QAAI,CAACqI,GAAc;AACjB,MAAAO,EAAS,OAAO,GAChBC,EAAU,IAAI,GACdE,EAAa,EAAE;AACf;AAAA,IACF;AAEA,UAAME,IAAK,EAAED,EAAa;AAC1B,IAAAJ,EAAS,WAAW,GAEpBlC,GAAiB6B,EAAS,SAASE,EAAS,SAASC,EAAQ,OAAO,EACjE,KAAK,CAAAQ,MAAgB;AAEpB,MAAID,MAAOD,EAAa,YACxBH,EAAUK,CAAY,GACtBH,EAAaV,CAAY,GACzBO,EAAS,OAAO;AAAA,IAClB,CAAC,EACA,MAAM,MAAM;AACX,MAAIK,MAAOD,EAAa,YAExBH,EAAU;AAAA,QACR,OAAO/B,GAAeyB,EAAS,SAASG,EAAQ,OAAO;AAAA,QACvD,OAAOD,EAAS;AAAA,MAAA,CACjB,GACDM,EAAaV,CAAY,GACzBO,EAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACL,GAAG,CAACP,CAAY,CAAC,GAGbM,MAAU,WAAWf,KAAUkB,MAAcT,IACxC,EAAE,OAAOT,EAAO,OAAO,OAAOA,EAAO,OAAO,OAAO,QAAA,IAGrD,EAAE,OAAO,CAAA,GAAI,OAAO,CAAA,GAAI,OAAAe,EAAA;AACjC;ACzTA,MAAMQ,KAAY,EAAE,UAAU/I,GAAA,GACxBgJ,KAAY,EAAE,kBAAkB3G,GAAA;AAMtC,SAAS4G,GAAe,EAAE,OAAAC,KAA4B;AACpD,QAAM,EAAE,qBAAAC,GAAqB,cAAAC,EAAA,IAAiB3K,EAAA,GACxC4K,IAAmBF,EAAA,GACnB,EAAE,SAAAG,EAAA,IAAYF,EAAA,GACdG,IAAkBnB,EAAO,CAAC;AAEhC,SAAAxI,EAAU,MAAM;AACd,IAAIsJ,MAAU,KAAKA,MAAUK,EAAgB,WACxCF,MACLE,EAAgB,UAAUL,GAC1BI,EAAQ,EAAE,SAAS,KAAK;AAAA,EAC1B,GAAG,CAACJ,GAAOG,GAAkBC,CAAO,CAAC,GAE9B;AACT;AAGA,MAAME,KAA0B,CAAA;AAWhC,SAASC,GAAqBrG,GAA8B;AAC1D,UAAQA,GAAA;AAAA,IACN,KAAK;AAAa,aAAO;AAAA,IACzB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAiB,aAAO;AAAA,IAC7B;AAAS,aAAO;AAAA,EAAA;AAEpB;AAEO,SAASsG,GAAoB;AAAA,EAClC,WAAAC,IAAY;AAAA,EACZ,cAAAtJ;AAAA,EACA,kBAAAuJ;AAAA,EACA,mBAAApJ;AAAA,EACA,YAAAC;AAAA,EACA,QAAAoJ,IAAS;AACX,GAA6B;AAC3B,QAAM;AAAA,IACJ,WAAWC;AAAA,IACX,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAC;AAAA,EAAA,IACEzL,EAAA,GACE,EAAE,MAAAoG,GAAM,aAAAsF,GAAa,WAAAC,EAAA,IAAcC,GAAA,GAGnCC,IAAyBV,KAAoBJ,IAC7Ce,IAA0B/J,KAAqBgJ,IAE/C,CAACgB,GAAaC,CAAc,IAAIhL,EAA0C,IAAI,GAC9E,CAACiL,GAAaC,CAAc,IAAIlL,EAASgB,KAAc,EAAE,GACzD,CAACmK,GAAmBC,CAAoB,IAAIpL,EAAS,CAAC,GACtD,CAACiB,GAAeoK,CAAgB,IAAIrL,EAAgC,IAAI,GACxE,CAACsL,GAAgBC,CAAiB,IAAIvL,EAA0C,IAAI,GACpFwL,IAAe7C,EAAuB,IAAI,GAG1C8C,IAAmB,CAAC7K,GACpB,CAAC8K,IAAgBC,EAAiB,IAAI3L,EAAmD,CAAA,CAAE,GAC3F,CAAC4L,IAAiBC,EAAkB,IAAI7L,EAAS,EAAK,GAEtD8L,KAAavK,EAAQ,QAAQ,GAC7B+D,KAAY/D,EAAQ,OAAO,GAE3BwK,IAAsB/K,MAAe,SAAYA,IAAaiK;AAGpE,EAAA9K,EAAU,MAAM;AACd,QAAI;AACF,YAAM6L,IAAQ,aAAa,QAAQ,iCAAiC;AACpE,MAAIA,KAAOL,GAAkB,KAAK,MAAMK,CAAK,CAAC;AAAA,IAChD,QAAQ;AAAA,IAAe;AACvB,IAAAH,GAAmB,EAAI;AAAA,EACzB,GAAG,CAAA,CAAE;AAKL,QAAM,EAAE,iBAAAI,IAAiB,iBAAAC,GAAA,IAAoB3D,EAAQ,MAAM;AACzD,QAAI,CAACnD,EAAM,QAAO,EAAE,iBAAiB,CAAA,GAAc,iBAAiB,GAAC;AAErE,UAAM0B,IAAgB1B,EAAK,MAAM,IAAI,CAACzE,GAAMhB,OAAW;AAAA,MACrD,IAAIgB,EAAK;AAAA,MACT,MAAM;AAAA;AAAA,MAEN,UAAU,EAAE,GAAIhB,IAAQ,IAAK,KAAK,GAAG,KAAK,MAAMA,IAAQ,CAAC,IAAI,IAAA;AAAA,MAC7D,MAAM,EAAE,MAAAgB,EAAA;AAAA,IAAK,EACb,GAEIoG,IAAgB,CAAA;AACtB,WAAA3B,EAAK,MAAM,QAAQ,CAAAzE,MAAQ;AACzB,MAAIA,EAAK,iBACPA,EAAK,cAAc,QAAQ,CAACmD,GAAKmB,MAAM;AACrC,QAAInB,EAAI,iBAAiB,eACzBiD,EAAM,KAAK;AAAA,UACT,IAAI,GAAGpG,EAAK,IAAI,IAAImD,EAAI,UAAU,IAAImB,CAAC;AAAA,UACvC,QAAQtE,EAAK;AAAA,UACb,QAAQmD,EAAI;AAAA,UACZ,MAAM;AAAA,UACN,MAAM,EAAE,cAAcA,GAAK,YAAYA,EAAI,cAAc,GAAC;AAAA,UAC1D,UAAU;AAAA,UACV,OAAO,EAAE,QAAQkG,GAAqBlG,EAAI,YAAY,GAAG,aAAa,EAAA;AAAA,QAAE,CACzE;AAAA,MACH,CAAC;AAAA,IAEL,CAAC,GAEM,EAAE,iBAAiBgD,GAAO,iBAAiBC,EAAA;AAAA,EACpD,GAAG,CAAC3B,CAAI,CAAC,GAGH+G,IAAkBhB,IAAoB,KAAMS,MAAmB,OAAO,KAAKF,EAAc,EAAE,WAAW,GAGtG,EAAE,OAAOnE,IAAU,OAAOM,IAAU,OAAOuE,OAAgB/D;AAAA,IAC/D8D,IAAkBF,KAAkB,CAAA;AAAA,IACpCE,IAAkBD,KAAkB,CAAA;AAAA,IACpC,EAAE,WAAW,MAAM,WAAW,KAAK,SAAS,KAAK,SAAS,IAAA;AAAA,EAAI,GAM1DG,IAAiBC,EAAY,CAACC,GAAiBC,MAAoB;AACvE,UAAMC,IAAOjB,EAAa,SAAS,sBAAA;AACnC,QAAI,CAACiB,EAAM,QAAO,EAAE,GAAGF,GAAS,GAAGC,EAAA;AACnC,UAAME,IAAS,KAAKC,IAAS;AAC7B,QAAIC,IAAIL,IAAUE,EAAK,OAAO,IAC1BI,IAAIL,IAAUC,EAAK,MAAM;AAE7B,WAAIG,IAAIF,IAASD,EAAK,cAAWF,IAAUE,EAAK,OAAOC,IAAS,KAC5DG,IAAIF,IAASF,EAAK,WAAQI,IAAIJ,EAAK,SAASE,IAAS,IACrDC,IAAI,MAAGA,IAAI,IACXC,IAAI,MAAGA,IAAI,IACR,EAAE,GAAAD,GAAG,GAAAC,EAAA;AAAA,EACd,GAAG,CAAA,CAAE,GAGCC,KAA2BR,EAAY,CAACS,GAAkB3L,GAAmBC,GAAoC2L,MAAmC;AACxJ,IAAA3B,EAAiB,CAAA4B,MACXA,KAAQA,EAAK,aAAaF,KAAYE,EAAK,cAAc7L,KAC3DmK,EAAkB,IAAI,GACf,SAELyB,KAAKzB,EAAkBc,EAAeW,EAAI,GAAGA,EAAI,CAAC,CAAC,GAChD,EAAE,UAAAD,GAAU,WAAA3L,GAAW,WAAAC,EAAA,EAC/B;AAAA,EACH,GAAG,CAACgL,CAAc,CAAC,GAEba,KAA0BZ,EAAY,CAACS,GAAkBC,MAAmC;AAChG,IAAA3B,EAAiB,CAAA4B,MACXA,KAAQA,EAAK,aAAaF,KAAYE,EAAK,cAAc,QAC3D1B,EAAkB,IAAI,GACf,SAELyB,KAAKzB,EAAkBc,EAAeW,EAAI,GAAGA,EAAI,CAAC,CAAC,GAChD,EAAE,UAAAD,GAAU,WAAW,MAAM,WAAW,OAAA,EAChD;AAAA,EACH,GAAG,CAACV,CAAc,CAAC,GAEbc,KAAsB1B,IAAmBqB,KAA2BlM,GACpEwM,KAAqB3B,IAAmByB,KAA0B,QAElEG,IAAgBf,EAAY,CAAC3L,OAAmB;AAAA,IACpD,MAAAA;AAAA,IACA,cAAcwM;AAAA,IACd,aAAaC;AAAA,IACb,eAAevC,EAAuB,SAAUlK,EAA0B,IAAI;AAAA,IAC9E,mBAAmBmK;AAAA,IACnB,YAAYiB;AAAA,IACZ,eAAeN,IAAmBxK,IAAgB;AAAA,EAAA,IAChD,CAACkM,IAAqBC,IAAoBvC,GAAwBC,GAAyBiB,GAAqBN,GAAkBxK,CAAa,CAAC,GAG9IqM,IAAc,CAACnB,KAAmBC,OAAgB,SAElDmB,IAAehF,EAAQ,MACvB,CAACnD,KAAQ,CAACkI,KAAe,CAAC1B,KAAwB,CAAA,IAElDO,KAAmB5E,GAAS,SAAS,IAEhCA,GAAS,IAAI,CAAAtB,OAAS;AAAA,IAC3B,GAAGA;AAAA,IACH,MAAMoH,EAAcpH,EAAK,MAAM,QAAQb,EAAK,MAAM,KAAK,CAAAG,MAAKA,EAAE,SAASU,EAAK,EAAE,CAAC;AAAA,EAAA,EAC/E,IAIGgG,GAAgB,IAAI,CAAAhG,OAAS;AAAA,IAClC,GAAGA;AAAA,IACH,UAAUyF,GAAezF,EAAK,EAAE,KAAKA,EAAK;AAAA,IAC1C,MAAMoH,EAAcpH,EAAK,MAAM,IAAI;AAAA,EAAA,EACnC,GACD,CAACb,GAAMkI,GAAa1B,IAAiBO,GAAiB5E,IAAU0E,IAAiBP,IAAgB2B,CAAa,CAAC,GAE5GG,KAAejF,EAAQ,MACvB,CAACnD,KAAQ,CAACkI,IAAoB,CAAA,IAC9BnB,KAAmBtE,GAAS,SAAS,IAAUA,KAC5CqE,IACN,CAAC9G,GAAMkI,GAAanB,GAAiBtE,IAAUqE,EAAe,CAAC,GAG5D,CAACuB,IAASC,CAAU,IAAI1N,EAAiB,CAAA,CAAE,GAC3C,CAAC2N,IAASC,EAAU,IAAI5N,EAAiB,CAAA,CAAE,GAC3C6N,IAAsBlF,EAAO,EAAE,GAC/B,CAACmF,IAAcC,EAAe,IAAI/N,EAAS,CAAC;AAGlD,EAAAG,EAAU,MAAM;AACd,QAAIoN,EAAa,WAAW,EAAG;AAE/B,UAAMS,IAAMT,EAAa,IAAI,CAAA9E,MAAK,GAAGA,EAAE,EAAE,IAAI,KAAK,MAAMA,EAAE,SAAS,CAAC,CAAC,IAAI,KAAK,MAAMA,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC7G,QAAIuF,MAAQH,EAAoB,QAAS;AAEzC,UAAMI,IAAgBJ,EAAoB,YAAY;AACtD,IAAAA,EAAoB,UAAUG,GAC9BN,EAAWH,CAAY,GACvBK,GAAWJ,EAAY,GAGnBS,KACFF,GAAgB,CAAAG,MAAKA,IAAI,CAAC;AAAA,EAE9B,GAAG,CAACX,GAAcC,EAAY,CAAC;AAG/B,QAAMW,KAAsBxF,EAAO,EAAE;AACrC,EAAAxI,EAAU,MAAM;AACd,UAAMiO,IAAcnN,IAAgB,GAAGA,EAAc,QAAQ,IAAIA,EAAc,SAAS,KAAK,IACvFoN,IAAkB,GAAGxD,EAAuB,KAAK,GAAG,CAAC,IAAIC,EAAwB,KAAK,GAAG,CAAC,IAAIiB,CAAmB,IAAI,OAAOnL,CAAY,CAAC,IAAIwN,CAAW;AAC9J,IAAIC,MAAoBF,GAAoB,YAC5CA,GAAoB,UAAUE,GAE1B,EAAAZ,GAAQ,WAAW,KAAK,CAACrI,MAC7BsI,EAAW,CAAAT,MAAQA,EAAK,IAAI,CAAAhH,MAAQ;AAClC,YAAMtF,IAAOyE,EAAK,MAAM,KAAK,OAAKG,EAAE,SAASU,EAAK,EAAE;AACpD,aAAKtF,IACE,EAAE,GAAGsF,GAAM,MAAMoH,EAAc1M,CAAI,EAAA,IADxBsF;AAAA,IAEpB,CAAC,CAAC;AAAA,EACJ,GAAG,CAAC4E,GAAwBC,GAAyBiB,GAAqBnL,GAAcK,GAAewM,GAAQ,QAAQrI,GAAMiI,CAAa,CAAC;AAG3I,QAAMiB,KAAoBhC,EAAY,CAACiC,MAA0B;AAC/D,IAAAb,EAAW,CAAAc,MAAO/D,EAAiB8D,GAASC,CAAG,CAAC,GAG/BD,EAAQ;AAAA,MACvB,CAAChJ,MAAMA,EAAE,SAAS,cAAc,cAAcA,KAAKA,EAAE,aAAa;AAAA,IAAA,EAEvD,SAAS,KACpBmI,EAAW,CAAAe,MAAgB;AACzB,YAAMC,IAAsD,CAAA;AAC5D,MAAAD,EAAa,QAAQ,CAAAhG,MAAK;AAAE,QAAIA,EAAE,aAAUiG,EAAUjG,EAAE,EAAE,IAAIA,EAAE;AAAA,MAAS,CAAC;AAC1E,UAAI;AAAE,qBAAa,QAAQ,mCAAmC,KAAK,UAAUiG,CAAS,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAe;AAChH,aAAA/C,GAAkB+C,CAAS,GACpBD;AAAA,IACT,CAAC;AAAA,EAGL,GAAG,CAAA,CAAE,GAECE,KAAoBrC,EAAY,CAACsC,MAA2B;AAAA,EAAC,GAAG,CAAA,CAAE,GAElEC,KAAoBvC,EAAY,CAACwC,MAAwC;AAC7E,IAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACN9D,EAAe,EAAE,GAAG8D,EAAM,SAAS,GAAGA,EAAM,SAAS;AAAA,EACvD,GAAG,CAAA,CAAE,GAECC,KAAczC,EAAY,MAAM;AACpC,IAAIvB,OAA4B,IAAI,GAChC9J,MAAiBoK,EAAiB,IAAI,GAAGE,EAAkB,IAAI;AAAA,EACrE,GAAG,CAACR,GAAa9J,CAAa,CAAC,GAEzB+N,KAAmB1C,EAAY,MAAM;AACzC,IAAAX,GAAkB,CAAA,CAAE,GACpBkC,EAAoB,UAAU;AAC9B,QAAI;AAAE,mBAAa,WAAW,iCAAiC;AAAA,IAAE,QAAQ;AAAA,IAAe;AACxF,IAAAzC,EAAqB,CAAA7F,MAAKA,IAAI,CAAC,GAC/ByF,EAAe,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AAIL,SAAIN,IAEA,gBAAAnL,EAAC,SAAI,WAAW,qDAAqD2K,CAAS,IAC5E,UAAA,gBAAA5K,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kGAAA,CAAkG;AAAA,IACjH,gBAAAA,EAAC,KAAA,EAAE,WAAU,sBAAqB,UAAA,yBAAA,CAAsB;AAAA,EAAA,EAAA,CAC1D,EAAA,CACF,IAIAoL,IAEA,gBAAApL,EAAC,SAAI,WAAW,qDAAqD2K,CAAS,IAC5E,UAAA,gBAAA5K,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,kBAAiB,UAAA,8BAA0B;AAAA,IACxD,gBAAAA,EAAC,KAAA,EAAE,WAAU,sBAAsB,UAAAoL,EAAA,CAAU;AAAA,EAAA,EAAA,CAC/C,EAAA,CACF,IAIA,CAACvF,KAAQA,EAAK,MAAM,WAAW,IAE/B,gBAAA7F,EAAC,SAAI,WAAW,qDAAqD2K,CAAS,IAC5E,UAAA,gBAAA5K,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,kBAAiB,UAAA,kBAAc;AAAA,IAC5C,gBAAAA,EAAC,KAAA,EAAE,WAAU,sBAAqB,UAAA,sDAAA,CAAmD;AAAA,EAAA,EAAA,CACvF,EAAA,CACF,IAKC+N,IAYH,gBAAAhO,EAAC,OAAA,EAAI,WAAW,uBAAuB4K,CAAS,IAAI,OAAO,EAAE,QAAAE,GAAQ,WAAW,IAAA,GAC7E,UAAA;AAAA,IAAApJ,MAAe,UACd,gBAAA1B,EAAC,OAAA,EAAI,WAAU,gHACb,UAAA;AAAA,MAAA,gBAAAC,EAACuM,IAAA,EAAW,WAAU,mCAAA,CAAmC;AAAA,MACzD,gBAAAvM;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO0L;AAAA,UACP,UAAU,CAAC9J,MAAM+J,EAAe/J,EAAE,OAAO,KAAK;AAAA,UAC9C,aAAY;AAAA,UACZ,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAEX8J,KACC,gBAAA1L,EAAC,UAAA,EAAO,SAAS,MAAM2L,EAAe,EAAE,GAAG,WAAU,4CACnD,UAAA,gBAAA3L,EAAC+F,IAAA,EAAU,WAAU,iBAAgB,EAAA,CACvC;AAAA,IAAA,GAEJ;AAAA,IAGF,gBAAAhG,EAAC,OAAA,EAAI,KAAKkM,GAAc,WAAU,oCAChC,UAAA;AAAA,MAAA,gBAAAjM,EAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,KACzC,UAAA,gBAAAD;AAAA,QAAC+K;AAAA,QAAA;AAAA,UACC,OAAOoD;AAAA,UACP,OAAOE;AAAA,UACP,eAAeW;AAAA,UACf,eAAeK;AAAA,UACf,WAAArF;AAAA,UACA,WAAAC;AAAA,UACA,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY,EAAE,iBAAiB,GAAA;AAAA,UAC/B,mBAAmBsF;AAAA,UACnB,aAAaE;AAAA,UAEb,UAAA;AAAA,YAAA,gBAAAxP,EAAC+K,GAAA,EAAS;AAAA,YACV,gBAAA/K;AAAA,cAACgL;AAAA,cAAA;AAAA,gBACC,WAAW,CAACtE,MAAS4E,EAAuB,SAAS5E,EAAK,EAAE,IAAI,YAAY;AAAA,gBAC5E,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,8BAEXuE,GAAA,EAAW,SAAS,QAAiB,KAAK,IAAI,MAAM,GAAG;AAAA,YACxD,gBAAAjL,EAACiK,IAAA,EAAe,OAAOsE,GAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAEzC;AAAA,MAGCrC,KAAoBxK,KAAiBqK,KAAkBlG,KACtD,gBAAA7F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,MAAM+L,EAAe,GAAG,KAAKA,EAAe,EAAA;AAAA,UAErD,UAAA,gBAAA/L;AAAA,YAAC2F;AAAA,YAAA;AAAA,cACC,WAAWjE;AAAA,cACX,MAAAmE;AAAA,cACA,SAAS,MAAM;AAAE,gBAAAiG,EAAiB,IAAI,GAAGE,EAAkB,IAAI;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QACnE;AAAA,MAAA;AAAA,IACF,GAEJ;AAAA,IAECR,KACC,gBAAAxL;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,MAAMwL,EAAY,GAAG,KAAKA,EAAY,EAAA;AAAA,QAE/C,UAAA,gBAAAxL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASyP;AAAA,YACT,WAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,IAAA;AAAA,EACF,GAEJ,IAnFE,gBAAAzP,EAAC,SAAI,WAAW,qDAAqD2K,CAAS,IAC5E,UAAA,gBAAA5K,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kGAAA,CAAkG;AAAA,IACjH,gBAAAA,EAAC,KAAA,EAAE,WAAU,sBAAqB,UAAA,sBAAA,CAAmB;AAAA,EAAA,EAAA,CACvD,EAAA,CACF;AAgFN;;;;;"}
@@ -1,10 +1,21 @@
1
1
  import { CubeMetaCube } from '../../types';
2
2
  interface CubeNodeData {
3
3
  cube: CubeMetaCube;
4
- onFieldClick?: (cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension') => void;
4
+ onFieldClick?: (cubeName: string, fieldName: string, fieldType: 'measure' | 'dimension', pos?: {
5
+ x: number;
6
+ y: number;
7
+ }) => void;
8
+ onCubeClick?: (cubeName: string, pos?: {
9
+ x: number;
10
+ y: number;
11
+ }) => void;
5
12
  isHighlighted: boolean;
6
13
  highlightedFields: string[];
7
14
  searchTerm?: string;
15
+ selectedField?: {
16
+ cubeName: string;
17
+ fieldName: string | null;
18
+ } | null;
8
19
  [key: string]: unknown;
9
20
  }
10
21
  interface CubeNodeProps {
@@ -0,0 +1,15 @@
1
+ import { CubeMetaCube } from '../../types';
2
+ export interface FieldSelection {
3
+ cubeName: string;
4
+ fieldName: string | null;
5
+ fieldType: 'measure' | 'dimension' | 'cube';
6
+ }
7
+ interface FieldDetailPanelProps {
8
+ selection: FieldSelection;
9
+ meta: {
10
+ cubes: CubeMetaCube[];
11
+ };
12
+ onClose: () => void;
13
+ }
14
+ export declare function FieldDetailPanel({ selection, meta, onClose }: FieldDetailPanelProps): import("react/jsx-runtime").JSX.Element | null;
15
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * React context for @xyflow/react modules.
3
+ *
4
+ * All xyflow imports are dynamic (via SchemaVisualizationLazy) so that
5
+ * the built schema-visualization chunk has NO static imports from
6
+ * @xyflow/react. This prevents consuming projects from failing at
7
+ * build time when @xyflow/react is not installed.
8
+ */
9
+ export type XyflowModule = typeof import('@xyflow/react');
10
+ export declare const XyflowProvider: import('react').Provider<typeof import("@xyflow/react") | null>;
11
+ export declare function useXyflow(): XyflowModule;
@@ -1,4 +1,4 @@
1
- import { ab as e, a as t, A as o, h as r, b as i, M as l, c as d } from "./chunks/components-CPqnw8o8.js";
1
+ import { ab as e, a as t, A as o, h as r, b as i, M as l, c as d } from "./chunks/components-BFgYvFq6.js";
2
2
  import { c as b, d as y, b as c, a as P, g as h, v as p } from "./chunks/index-CApFCBF9.js";
3
3
  export {
4
4
  e as AnalysisDisplayConfigPanel,
@@ -1,26 +1,26 @@
1
- import { D as ve, A as Ce, e as we, g as Ne, P as ke } from "./chunks/components-CPqnw8o8.js";
2
- import { j as Lt, a as Qt, C as Ft, i as _t, h as Vt, b as jt, k as Ut, f as Ot, d as $t, M as qt, c as Kt, o as zt, U as Wt, S as Jt, R as Xt, Q as Yt, T as Gt, W as Ht, J as Zt, I as es, L as ts, X as ss, H as cs, K as rs, Y as ns, N as as, O as os, V as ds, Z as ls, _ as is, B as us, r as ms, y as hs, v as fs, s as ps, x as gs, q as bs, w as xs, p as ys, t as vs, z as Cs, u as ws, l as Ns, m as ks, n as Ss, G as Ts, F as Ds, E as As } from "./chunks/components-CPqnw8o8.js";
1
+ import { D as ve, A as Ce, e as we, g as Ne, P as ke } from "./chunks/components-BFgYvFq6.js";
2
+ import { j as Lt, a as Ft, C as Qt, i as _t, h as Vt, b as jt, k as Ut, f as Ot, d as $t, M as qt, c as Kt, o as zt, U as Wt, S as Jt, R as Xt, Q as Yt, T as Gt, W as Ht, J as Zt, I as es, L as ts, X as ss, H as cs, K as rs, Y as ns, N as as, O as os, V as ds, Z as ls, _ as is, B as us, r as ms, y as hs, v as fs, s as ps, x as gs, q as bs, w as xs, p as ys, t as vs, z as Cs, u as ws, l as Ns, m as ks, n as Ss, G as Ts, F as Ds, E as As } from "./chunks/components-BFgYvFq6.js";
3
3
  import { jsx as e, jsxs as u, Fragment as ae } from "react/jsx-runtime";
4
- import G, { useRef as x, createContext as Se, useContext as Te, useState as _, useCallback as p, useEffect as F } from "react";
4
+ import G, { useRef as x, createContext as Se, useContext as Te, useState as _, useCallback as p, useEffect as Q } from "react";
5
5
  import { e as De, f as Ae, h as Ie, s as Me, i as le } from "./chunks/vendor-B2EH3V58.js";
6
6
  import { g as M, b as Ee } from "./chunks/icons-CwvgmdIP.js";
7
- import { D as Ms, i as Es, c as Rs, f as Bs, h as Ps, a as Ls, r as Qs, e as Fs, s as _s } from "./chunks/icons-CwvgmdIP.js";
8
- import { Q as Re } from "./chunks/chart-markdown-Du4Z2iqK.js";
7
+ import { D as Ms, i as Es, c as Rs, f as Bs, h as Ps, a as Ls, r as Fs, e as Qs, s as _s } from "./chunks/icons-CwvgmdIP.js";
8
+ import { N as Re } from "./chunks/chart-markdown-BT_-MBq1.js";
9
9
  import { f as Be } from "./chunks/providers-Ds7DRmnO.js";
10
10
  import { h as js, b as Us, S as Os, e as $s, d as qs, i as Ks, u as zs, g as Ws, a as Js, j as Xs, c as Ys, w as Gs } from "./chunks/providers-Ds7DRmnO.js";
11
11
  import { L as he } from "./chunks/charts-core-BUUO36OM.js";
12
12
  import { u as Zs } from "./chunks/charts-core-BUUO36OM.js";
13
13
  import { useNotebookLayout as Pe } from "./hooks.js";
14
- import { L as tc, g as sc, c as cc, b as rc, i as nc, p as ac, a as oc } from "./chunks/charts-loader-Bv-IWHVd.js";
15
- import { E as lc, a as ic, p as uc, q as mc, m as hc, l as fc, r as pc, C as gc, D as bc, o as xc, B as yc, n as vc, w as Cc, t as wc, d as Nc, f as kc, s as Sc, e as Tc, i as Dc, c as Ac, h as Ic, g as Mc, u as Ec, b as Rc, y as Bc, A as Pc, x as Lc, k as Qc, v as Fc, z as _c, j as Vc } from "./chunks/analysis-builder-shared-Bz9oSywd.js";
16
- import { S as Uc } from "./chunks/schema-visualization-CzOuTQDu.js";
14
+ import { L as tc, g as sc, c as cc, b as rc, i as nc, p as ac, a as oc } from "./chunks/charts-loader-goTYnavu.js";
15
+ import { E as lc, a as ic, p as uc, q as mc, m as hc, l as fc, r as pc, C as gc, D as bc, o as xc, B as yc, n as vc, w as Cc, t as wc, d as Nc, f as kc, s as Sc, e as Tc, i as Dc, c as Ac, h as Ic, g as Mc, u as Ec, b as Rc, y as Bc, A as Pc, x as Lc, k as Fc, v as Qc, z as _c, j as Vc } from "./chunks/analysis-builder-shared-CunrT3gi.js";
16
+ import { S as Uc } from "./chunks/schema-visualization-B97a1Ybu.js";
17
17
  import { u as $c } from "./chunks/chart-bubble-BF8Z52eW.js";
18
18
  import { c as Kc, f as zc } from "./chunks/index-CApFCBF9.js";
19
19
  import { f as Jc, d as Xc, n as Yc, j as Gc, l as Hc, k as Zc, i as er, m as tr, h as sr, g as cr, u as rr, u as nr, e as ar, b as or, a as dr, v as lr } from "./chunks/useDirtyStateTracking-CyAXd07d.js";
20
20
  import { c as ur, b as mr, f as hr, g as fr, a as pr, i as gr, t as br } from "./chunks/funnel-utils-CyonoNeC.js";
21
21
  import { T as yr, c as vr, g as Cr, a as wr, i as Nr, r as kr, s as Sr, b as Tr, w as Dr } from "./chunks/theme-Dp3hFed1.js";
22
22
  import { d as Ir, b as Mr, u as Er, e as Rr, c as Br, a as Pr } from "./chunks/useExplainAI-CfQ_JmF1.js";
23
- import { i as Qr, a as Fr } from "./chunks/flow-utils-CjQZG5qq.js";
23
+ import { i as Fr, a as Qr } from "./chunks/flow-utils-CjQZG5qq.js";
24
24
  import { h as Vr } from "./chunks/syntaxHighlighting-DAMSW_A6.js";
25
25
  const fe = () => ({
26
26
  blocks: [],
@@ -101,7 +101,7 @@ function Le(t, s) {
101
101
  reset: () => t(fe())
102
102
  };
103
103
  }
104
- function Qe() {
104
+ function Fe() {
105
105
  const t = fe();
106
106
  return Ae()(
107
107
  Ie(
@@ -114,13 +114,13 @@ function Qe() {
114
114
  );
115
115
  }
116
116
  const pe = Se(null);
117
- function Fe({
117
+ function Qe({
118
118
  children: t,
119
119
  initialConfig: s
120
120
  }) {
121
121
  const c = x(null);
122
122
  if (!c.current) {
123
- const n = Qe();
123
+ const n = Fe();
124
124
  s && n.getState().load(s), c.current = n;
125
125
  }
126
126
  return /* @__PURE__ */ e(pe.Provider, { value: c.current, children: t });
@@ -304,7 +304,7 @@ const He = {
304
304
  ] });
305
305
  }), me = G.memo(function({ colorPalette: s }) {
306
306
  const c = s ?? Ne(), n = B(_e), { removeBlock: a, moveBlock: r, updateBlock: o } = B(le(Ue)), i = x(null), [l, y] = _(null), N = x(n.length);
307
- F(() => {
307
+ Q(() => {
308
308
  n.length > N.current && i.current?.scrollIntoView({ behavior: "smooth" }), N.current = n.length;
309
309
  }, [n.length]);
310
310
  const S = p((g) => a(g), [a]), v = p((g) => r(g, "up"), [r]), k = p((g) => r(g, "down"), [r]), O = p((g) => y(g), []), R = p((g) => {
@@ -605,7 +605,7 @@ const nt = {
605
605
  placeholder: y = "Ask about your data..."
606
606
  }) {
607
607
  const N = x(null);
608
- F(() => {
608
+ Q(() => {
609
609
  const v = N.current;
610
610
  v && (v.style.height = "auto", v.style.height = `${Math.min(v.scrollHeight, 150)}px`);
611
611
  }, [s]);
@@ -679,7 +679,7 @@ const nt = {
679
679
  setIsStreaming: w,
680
680
  setInputValue: I,
681
681
  setSessionId: V
682
- } = B(le(je)), W = B((h) => h.sessionId), z = B((h) => h.addBlock), H = B((h) => h.reset), Z = B((h) => h.blocks.filter((Q) => Q.type === "portlet").length), D = x(b);
682
+ } = B(le(je)), W = B((h) => h.sessionId), z = B((h) => h.addBlock), H = B((h) => h.reset), Z = B((h) => h.blocks.filter((F) => F.type === "portlet").length), D = x(b);
683
683
  D.current = b;
684
684
  const J = x(T);
685
685
  J.current = T;
@@ -694,9 +694,9 @@ const nt = {
694
694
  timestamp: Date.now()
695
695
  }));
696
696
  }, [$]), ee = x(b.length);
697
- F(() => {
697
+ Q(() => {
698
698
  b.length > ee.current && S.current?.scrollIntoView({ behavior: "smooth" }), ee.current = b.length;
699
- }, [b]), F(() => {
699
+ }, [b]), Q(() => {
700
700
  A && S.current?.scrollIntoView({ behavior: "smooth" });
701
701
  }, [A]);
702
702
  const { sendMessage: te, abort: X } = tt({
@@ -708,10 +708,10 @@ const nt = {
708
708
  onTextDelta: p((h) => {
709
709
  d(!1), U(), P(h);
710
710
  }, [U, P]),
711
- onToolStart: p((h, Q, q) => {
712
- d(!1), U(), E({ id: h, name: Q, input: q, status: "running" });
711
+ onToolStart: p((h, F, q) => {
712
+ d(!1), U(), E({ id: h, name: F, input: q, status: "running" });
713
713
  }, [U, E]),
714
- onToolResult: p((h, Q, q, ye) => {
714
+ onToolResult: p((h, F, q, ye) => {
715
715
  C({ id: h, status: ye ? "error" : "complete", result: q });
716
716
  }, [C]),
717
717
  onAddPortlet: p((h) => {
@@ -724,8 +724,8 @@ const nt = {
724
724
  onTurnComplete: p(() => {
725
725
  m.current = !0, d(!0);
726
726
  }, []),
727
- onDone: p((h, Q) => {
728
- m.current = !1, V(h), w(!1), d(!1), Q && O(Q);
727
+ onDone: p((h, F) => {
728
+ m.current = !1, V(h), w(!1), d(!1), F && O(F);
729
729
  }, [V, w]),
730
730
  onError: p((h) => {
731
731
  d(!1), U(), L(h), w(!1);
@@ -733,7 +733,7 @@ const nt = {
733
733
  }), f = p((h) => {
734
734
  if (!h || J.current) return;
735
735
  m.current = !1;
736
- const Q = D.current.map((q) => ({
736
+ const F = D.current.map((q) => ({
737
737
  role: q.role,
738
738
  content: q.content,
739
739
  ...q.toolCalls && q.toolCalls.length > 0 ? { toolCalls: q.toolCalls } : {}
@@ -749,9 +749,9 @@ const nt = {
749
749
  content: "",
750
750
  toolCalls: [],
751
751
  timestamp: Date.now()
752
- }), I(""), w(!0), d(!0), te(h, j.current, Q);
752
+ }), I(""), w(!0), d(!0), te(h, j.current, F);
753
753
  }, [$, I, w, te]);
754
- F(() => {
754
+ Q(() => {
755
755
  if (N && !v.current && b.length === 0) {
756
756
  v.current = !0;
757
757
  const h = setTimeout(() => f(N), 100);
@@ -775,7 +775,7 @@ const nt = {
775
775
  "Save the current notebook as a dashboard with a professional layout, section headers, and appropriate filters."
776
776
  );
777
777
  }, [f]), ie = p((h) => {
778
- !k || !l || (l({ traceId: k, value: h }), g((Q) => new Set(Q).add(k)));
778
+ !k || !l || (l({ traceId: k, value: h }), g((F) => new Set(F).add(k)));
779
779
  }, [k, l]), be = !!i && !T && Z > 0 && b.length > 0, xe = !!l && !T && k && b.length > 0 && !R.has(k), ue = k ? R.has(k) : !1;
780
780
  return /* @__PURE__ */ u("div", { className: "dc:flex dc:flex-col dc:h-full bg-dc-surface", children: [
781
781
  /* @__PURE__ */ u("div", { className: "dc:flex dc:items-center dc:justify-between dc:px-4 dc:py-3 border-dc-border dc:border-b", children: [
@@ -967,11 +967,11 @@ function pt({
967
967
  initialPrompt: v
968
968
  }) {
969
969
  const [k, O] = _(60), R = x(null), g = x(!1), { containerRef: A, layoutMode: d } = Pe(), [m, b] = _("chat"), [T, K] = _(null), [$, P] = _(!1), L = x(d), E = B((f) => f.blocks), C = E.length, w = B((f) => f.messages.length), I = B((f) => f.isStreaming), V = B((f) => f.save);
970
- F(() => {
970
+ Q(() => {
971
971
  L.current === "narrow" && d === "wide" && b("chat"), L.current = d;
972
972
  }, [d]);
973
973
  const W = x(C);
974
- F(() => {
974
+ Q(() => {
975
975
  if (d === "narrow" && m === "chat" && C > W.current) {
976
976
  const f = E[E.length - 1];
977
977
  if (f) {
@@ -983,7 +983,7 @@ function pt({
983
983
  W.current = C;
984
984
  }, [C, E, d, m]);
985
985
  const z = x(!1);
986
- F(() => {
986
+ Q(() => {
987
987
  if (I)
988
988
  z.current = !0;
989
989
  else if (z.current && d === "narrow" && m === "chat" && C > 0) {
@@ -998,14 +998,14 @@ function pt({
998
998
  },
999
999
  [A]
1000
1000
  ), Z = x({ blockCount: C, msgCount: w });
1001
- F(() => {
1001
+ Q(() => {
1002
1002
  const f = C !== Z.current.blockCount || w !== Z.current.msgCount;
1003
1003
  o?.(f);
1004
1004
  }, [C, w, o]);
1005
1005
  const D = x(), J = x(!1), j = x(r);
1006
1006
  j.current = r;
1007
1007
  const U = x(C > 0 || w > 0);
1008
- F(() => {
1008
+ Q(() => {
1009
1009
  if ((C > 0 || w > 0) && (U.current = !0), !(!j.current || !U.current)) {
1010
1010
  if (I) {
1011
1011
  J.current = !0, D.current && clearTimeout(D.current);
@@ -1019,7 +1019,7 @@ function pt({
1019
1019
  D.current && clearTimeout(D.current);
1020
1020
  };
1021
1021
  }
1022
- }, [C, w, I, V]), F(() => {
1022
+ }, [C, w, I, V]), Q(() => {
1023
1023
  !I && J.current && j.current && U.current && (D.current && clearTimeout(D.current), D.current = setTimeout(() => {
1024
1024
  J.current = !1;
1025
1025
  const f = V();
@@ -1112,7 +1112,7 @@ const Mt = G.memo(function({
1112
1112
  colorPalette: c,
1113
1113
  ...n
1114
1114
  }) {
1115
- return /* @__PURE__ */ e(Fe, { initialConfig: s, children: /* @__PURE__ */ e(pt, { ...n, colorPalette: c }) });
1115
+ return /* @__PURE__ */ e(Qe, { initialConfig: s, children: /* @__PURE__ */ e(pt, { ...n, colorPalette: c }) });
1116
1116
  });
1117
1117
  function Et() {
1118
1118
  return /* @__PURE__ */ e("div", { children: "Analytics Page - Coming in Phase 4" });
@@ -1140,10 +1140,10 @@ function Rt({
1140
1140
  export {
1141
1141
  Mt as AgenticNotebook,
1142
1142
  Lt as AnalysisBuilder,
1143
- Qt as AnalyticsDashboard,
1143
+ Ft as AnalyticsDashboard,
1144
1144
  Et as AnalyticsPage,
1145
1145
  Ce as AnalyticsPortlet,
1146
- Ft as ChartErrorBoundary,
1146
+ Qt as ChartErrorBoundary,
1147
1147
  _t as ConfirmModal,
1148
1148
  js as CubeClient,
1149
1149
  Us as CubeProvider,
@@ -1159,7 +1159,7 @@ export {
1159
1159
  tc as LazyChart,
1160
1160
  he as LoadingIndicator,
1161
1161
  qt as Modal,
1162
- Fe as NotebookStoreProvider,
1162
+ Qe as NotebookStoreProvider,
1163
1163
  ke as PortletAnalysisModal,
1164
1164
  Kt as PortletContainer,
1165
1165
  Uc as SchemaVisualization,
@@ -1182,7 +1182,7 @@ export {
1182
1182
  Ir as createExplainQueryKey,
1183
1183
  Jc as createFlowQueryKey,
1184
1184
  Xc as createFunnelQueryKey,
1185
- Qe as createNotebookStore,
1185
+ Fe as createNotebookStore,
1186
1186
  mc as decodeAndDecompress,
1187
1187
  hc as detectAsymmetricDateRanges,
1188
1188
  fc as detectMeasureCollisions,
@@ -1222,8 +1222,8 @@ export {
1222
1222
  vc as isMultiQueryValid,
1223
1223
  cs as isQueryConfig,
1224
1224
  rs as isRetentionConfig,
1225
- Qr as isSankeyData,
1226
- Fr as isServerFlowQuery,
1225
+ Fr as isSankeyData,
1226
+ Qr as isServerFlowQuery,
1227
1227
  ns as isServerFunnelQuery,
1228
1228
  Cc as isShareableSize,
1229
1229
  as as isSingleQuery,
@@ -1239,8 +1239,8 @@ export {
1239
1239
  wc as parseShareUrl,
1240
1240
  ac as preloadChart,
1241
1241
  oc as preloadCharts,
1242
- Qs as registerIcons,
1243
- Fs as resetIcons,
1242
+ Fs as registerIcons,
1243
+ Qs as resetIcons,
1244
1244
  kr as resetTheme,
1245
1245
  us as selectAllActions,
1246
1246
  Ue as selectBlockActions,
@@ -1306,8 +1306,8 @@ export {
1306
1306
  Pc as validateBindingKeyForSteps,
1307
1307
  Lc as validateFunnelConfig,
1308
1308
  lr as validateMergeKey,
1309
- Qc as validateMergeKeys,
1310
- Fc as validateMultiQueryConfig,
1309
+ Fc as validateMergeKeys,
1310
+ Qc as validateMultiQueryConfig,
1311
1311
  _c as validateStepQueries,
1312
1312
  Vc as validateTimeDimensionAlignment,
1313
1313
  Gs as warnIfScreenshotLibMissing,