@miguimono/json-schema 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +255 -0
  3. package/dist/schema/README.md +421 -0
  4. package/dist/schema/fesm2022/json-schema.mjs +1654 -0
  5. package/dist/schema/fesm2022/json-schema.mjs.map +1 -0
  6. package/dist/schema/index.d.ts +5 -0
  7. package/dist/schema/lib/components/schema-card.component.d.ts +128 -0
  8. package/dist/schema/lib/components/schema-links.component.d.ts +61 -0
  9. package/dist/schema/lib/components/schema.component.d.ts +115 -0
  10. package/dist/schema/lib/models.d.ts +1 -0
  11. package/dist/schema/lib/services/json-adapter.service.d.ts +1 -0
  12. package/dist/schema/lib/services/schema-layout.service.d.ts +1 -0
  13. package/dist/schema/lib/shared/models.d.ts +319 -0
  14. package/dist/schema/lib/shared/services/json-adapter.service.d.ts +12 -0
  15. package/dist/schema/lib/shared/services/schema-layout.service.d.ts +21 -0
  16. package/dist/schema/ng16/fesm2022/json-schema-ng16.mjs +1656 -0
  17. package/dist/schema/ng16/fesm2022/json-schema-ng16.mjs.map +1 -0
  18. package/dist/schema/ng16/index.d.ts +5 -0
  19. package/dist/schema/ng16/lib/components/schema-card.component.d.ts +64 -0
  20. package/dist/schema/ng16/lib/components/schema-links.component.d.ts +28 -0
  21. package/dist/schema/ng16/lib/components/schema.component.d.ts +132 -0
  22. package/dist/schema/ng16/lib/models.d.ts +1 -0
  23. package/dist/schema/ng16/lib/services/json-adapter.service.d.ts +1 -0
  24. package/dist/schema/ng16/lib/services/schema-layout.service.d.ts +1 -0
  25. package/dist/schema/ng16/lib/shared/models.d.ts +319 -0
  26. package/dist/schema/ng16/lib/shared/services/json-adapter.service.d.ts +12 -0
  27. package/dist/schema/ng16/lib/shared/services/schema-layout.service.d.ts +21 -0
  28. package/dist/schema/ng16/public-api.d.ts +6 -0
  29. package/dist/schema/public-api.d.ts +5 -0
  30. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.mjs","sources":["../../../projects/schema-ng19/src/lib/shared/models.ts","../../../projects/schema-ng19/src/lib/models.ts","../../../projects/schema-ng19/src/lib/components/schema-card.component.ts","../../../projects/schema-ng19/src/lib/components/schema-card.component.html","../../../projects/schema-ng19/src/lib/components/schema-links.component.ts","../../../projects/schema-ng19/src/lib/components/schema-links.component.html","../../../projects/schema-ng19/src/lib/shared/services/json-adapter.service.ts","../../../projects/schema-ng19/src/lib/services/json-adapter.service.ts","../../../projects/schema-ng19/src/lib/shared/services/schema-layout.service.ts","../../../projects/schema-ng19/src/lib/services/schema-layout.service.ts","../../../projects/schema-ng19/src/lib/components/schema.component.ts","../../../projects/schema-ng19/src/lib/components/schema.component.html","../../../projects/schema-ng19/src/public-api.ts","../../../projects/schema-ng19/src/json-schema.ts"],"sourcesContent":["/**\n * Tipos y modelos base de la librería Schema.\n * ---------------------------------------------------------------------------\n * Este archivo define:\n * - Tipos de configuración (dirección del layout, estilos, depuración, etc.)\n * - Estructuras del grafo normalizado (nodos y aristas)\n * - Estructura de configuración SchemaSettings (por secciones)\n * - Valores por defecto (DEFAULT_SETTINGS)\n *\n * CONVENCIONES:\n * - No se realizan operaciones lógicas aquí; solo contratos y defaults.\n * - No modifiques nombres de propiedades existentes: otros módulos dependen\n * de ellas. Cualquier cambio es breaking.\n * - Todos los ejemplos son ilustrativos y no afectan el comportamiento.\n */\n\n/* =========================================\n * Layout / Estilos\n * ========================================= */\n/**\n * Dirección del layout del grafo.\n * - \"RIGHT\": flujo de izquierda → derecha (X crece).\n * - \"DOWN\" : flujo de arriba → abajo (Y crece).\n *\n * Ejemplo de uso:\n * layoutDirection: \"RIGHT\"\n */\nexport type LayoutDirection = \"RIGHT\" | \"DOWN\";\n\n/**\n * Alineación del padre respecto a sus hijos.\n * - \"firstChild\": el centro del padre se alinea con el primer hijo (respeta orden JSON).\n * - \"center\" : el centro del padre se alinea con el promedio de los hijos.\n *\n * Ejemplo de uso:\n * layoutAlign: \"center\"\n */\nexport type LayoutAlign = \"firstChild\" | \"center\";\n\n/**\n * Estilo visual de las aristas.\n * - \"orthogonal\": segmentos tipo “L”.\n * - \"curve\" : curva cúbica suave.\n * - \"line\" : recta simple.\n *\n * Ejemplo de uso:\n * linkStyle: \"orthogonal\"\n */\nexport type LinkStyle = \"curve\" | \"orthogonal\" | \"line\";\n\n/**\n * Estrategia de ajuste de imagen en su contenedor.\n * - \"contain\" : mantiene proporción, siempre completa dentro del cuadro.\n * - \"cover\" : mantiene proporción, puede recortar para cubrir el cuadro.\n * - \"scale-down\" : como \"contain\", pero solo escala hacia abajo si es necesario.\n *\n * Nota: estos valores se mapean a CSS `object-fit`.\n */\nexport type ImageFit = \"contain\" | \"cover\" | \"scale-down\";\n\n/* =========================================\n * Grafo Normalizado\n * ========================================= */\n\n/**\n * Nodo del grafo normalizado.\n * - `id` y `jsonPath` deben ser únicos por nodo.\n * - `label` es opcionalmente derivado de claves preferidas (titleKeyPriority).\n * - `data` conserva el objeto original asociado al nodo.\n * - `width/height` pueden ajustarse dinámicamente tras medición del DOM.\n */\nexport interface SchemaNode {\n /** Identificador único (por defecto, `jsonPath`). */\n id: string;\n\n /** Etiqueta visible opcional (título corto del nodo). */\n label: string;\n\n /** Ruta JSON (ej: \"$.meta.children[0].name\"). Debe ser estable y única. */\n jsonPath: string;\n\n /** Objeto original (o sub-objeto) del cual se derivó el nodo. */\n data: Record<string, any>;\n\n /** Metadatos derivados del proceso de normalización. */\n jsonMeta?: {\n /** Título calculado a partir de `titleKeyPriority` (si existe). */\n title?: string;\n\n /** Clave usada para el título (si fue encontrada). */\n titleKeyUsed?: string;\n\n /**\n * Subconjunto de pares clave-valor “visibles” como vista previa.\n * Incluye escalares y, opcionalmente, arrays escalares (join(\", \")).\n */\n attributes?: Record<string, any>;\n\n /** Número de hijos directos (no incluye descendencia). */\n childrenCount?: number;\n\n /** Cantidades de arrays no escalares por clave (para badges). */\n arrayCounts?: Record<string, number>;\n\n /**\n * Orden relativo del hijo dentro de su padre (0, 1, 2, ...),\n * preserva el orden del JSON para un layout estable.\n */\n childOrder?: number;\n };\n\n /** Posición X (en px) dentro del “stage”; definida por el layout. */\n x?: number;\n\n /** Posición Y (en px) dentro del “stage”; definida por el layout. */\n y?: number;\n\n /** Ancho del nodo en px (puede ajustarse tras medición). */\n width?: number;\n\n /** Alto del nodo en px (puede ajustarse tras medición). */\n height?: number;\n}\n\n/**\n * Arista entre dos nodos del grafo.\n * - `source` y `target` son `id` de nodos existentes.\n * - `points` (opcional) contiene los puntos calculados por el layout; si no\n * existen, el renderizador puede trazar una línea simple entre centros.\n */\nexport interface SchemaEdge {\n /** Identificador único de la arista (sugerido: `${source}__${target}`). */\n id: string;\n\n /** Id del nodo origen. */\n source: string;\n\n /** Id del nodo destino. */\n target: string;\n\n /** Etiqueta opcional. No se usa en el render por defecto. */\n label?: string;\n\n /** Secuencia de puntos en px (para line/curve/orthogonal). */\n points?: Array<{ x: number; y: number }>;\n}\n\n/**\n * Contenedor inmutable de nodos, aristas y metadatos auxiliares.\n * - `meta` permite transportar información del layout o anclajes (pinX/pinY).\n */\nexport interface NormalizedGraph {\n nodes: SchemaNode[];\n edges: SchemaEdge[];\n meta?: Record<string, any>;\n}\n\n/* =========================================\n * Presentación de imagen en Card\n * ========================================= */\n\n/** Forma de la miniatura de imagen en la card. */\nexport type ImageShape = \"square\" | \"rounded\" | \"circle\";\n\n/* =========================================\n * Configuración (Settings)\n * ========================================= */\n\n/**\n * Configuración general de Schema, por secciones.\n * Todas las propiedades son opcionales y se fusionan con DEFAULT_SETTINGS.\n *\n * Recomendación:\n * - Define solo lo que necesites modificar.\n * - Mantén las secciones separadas para claridad (colors/layout/dataView/...).\n */\nexport interface SchemaSettings {\n /* -------------------- Mensajes / Estados -------------------- */\n messages?: {\n /** Forzar overlay de “cargando”. */\n isLoading?: boolean;\n /** Forzar overlay de “error”. */\n isError?: boolean;\n /** Texto del overlay de carga. */\n loadingMessage?: string;\n /** Texto del overlay de error. */\n errorMessage?: string;\n /** Texto del overlay “vacío”. */\n emptyMessage?: string;\n };\n\n /* -------------------------- Colores -------------------------- */\n colors?: {\n /** Color del trazo de aristas (CSS color). Ej: \"#019df4\" */\n linkStroke?: string;\n /** Grosor del trazo de aristas (px). Ej: 2 */\n linkStrokeWidth?: number;\n /**\n * Clave booleana en `node.data` para acentuar cards.\n * Si esta clave está presente en un nodo, se pintará su contorno (y/o fondo)\n * según su valor true/false/null. La clave será omitida de la vista\n * previa de atributos (se implementa en JsonAdapterService).\n * * Ej: \"in_damage\" | \"certified\" | null\n */\n accentByKey?: string | null;\n\n /** Invierte la semántica de los acentos (true ↔ false). */\n accentInverse?: boolean;\n\n /** Si `true`, aplica un relleno de fondo adicional según el valor. */\n accentFill?: boolean;\n\n /** Habilita clase de color para valor `true`. */\n showColorTrue?: boolean;\n /** Habilita clase de color para valor `false`. */\n showColorFalse?: boolean;\n /** Habilita clase de color para valor `null`. */\n showColorNull?: boolean;\n };\n\n /* -------------------------- Layout --------------------------- */\n layout?: {\n /** Dirección del layout (\"RIGHT\" | \"DOWN\"). */\n layoutDirection?: LayoutDirection;\n\n /** Alineación del padre respecto a hijos (\"firstChild\" | \"center\"). */\n layoutAlign?: LayoutAlign;\n\n /** Estilo de aristas (\"orthogonal\" | \"curve\" | \"line\"). */\n linkStyle?: LinkStyle;\n\n /**\n * Tensión para curvas (px). Rango sugerido: 20–200.\n * Valores altos generan curvas más “amplias”.\n */\n curveTension?: number;\n\n /**\n * Umbral (px) por debajo del cual una curva se renderiza como línea recta\n * (evita “curvas demasiado cortas”). Sugerido: 40–120.\n */\n straightThresholdDx?: number;\n\n /** Separación horizontal entre columnas (px). */\n columnGapPx?: number;\n\n /** Separación vertical entre filas (px). */\n rowGapPx?: number;\n };\n\n /* -------------------------- DataView ------------------------- */\n dataView?: {\n /* ---------- a) Extracción de datos ---------- */\n\n /**\n * Prioridad de claves para título del nodo.\n * Ej: [\"name\", \"title\", \"id\"]\n */\n titleKeyPriority?: string[];\n\n /**\n * Claves globales a ocultar en los atributos de vista previa.\n * Ej: [\"_internal\", \"password\"]\n */\n hiddenKeysGlobal?: string[];\n\n /**\n * Si `true`, arrays escalares se muestran en la vista previa (join(\", \")).\n * Ejemplo:\n * [\"red\",\"green\"] → \"red, green\"\n */\n treatScalarArraysAsAttribute?: boolean;\n\n /**\n * Profundidad máxima de exploración. Si `null`, sin límite.\n * - 0: solo raíz\n * - 1: raíz + 1 nivel\n * - n: niveles anidados hasta n\n */\n maxDepth?: number | null;\n\n /**\n * Mapa de claves → etiqueta legible para UI.\n * Ej: { first_name: \"Nombre\", last_name: \"Apellido\" }\n */\n labelData?: Record<string, string>;\n\n /* ---------- b) Presentación general ---------- */\n\n /**\n * Máximo de pares (k,v) en la vista previa. Evita cards demasiado largas.\n * Sugerido: 20–2000 (por defecto alto para depuración).\n */\n previewMaxKeys?: number;\n\n /**\n * Trunca valores largos en la vista previa si exceden este número de caracteres.\n * Si `null`, no se trunca.\n */\n valueMaxChars?: number | null;\n\n /**\n * Si `true`, muestra `title` con el valor completo al pasar el mouse por\n * el valor truncado.\n */\n valueShowTooltip?: boolean;\n\n /**\n * Claves que NO deben romper línea en su valor (aplica `white-space: nowrap`).\n * Útil para IDs, hashes, etc.\n * Ej: [\"id\",\"hash\",\"uuid\"]\n */\n noWrapKeys?: string[];\n\n /** Máximo ancho de la card (px). Si `null`, sin límite. */\n maxCardWidth?: number | null;\n\n /** Máximo alto de la card (px). Si `null`, sin límite. */\n maxCardHeight?: number | null;\n\n /**\n * Tamaño por defecto de cada nodo (px).\n * Se ajusta tras medir contenido cuando `autoResizeCards` es `true`.\n */\n defaultNodeSize?: { width: number; height: number };\n\n /* ---------- c) Presentación de imagen (grupo completo) ---------- */\n /**\n * Clave en `node.data` que contiene la URL de imagen.\n * Ej: \"avatarUrl\" | \"logo\" | null (si no hay imagen).\n */\n showImage?: string | null;\n\n /**\n * Tamaño de la miniatura en px (ancho/alto idénticos).\n * Rango sugerido: 16–96.\n */\n imageSizePx?: number;\n\n /** Forma de la miniatura: \"square\" | \"rounded\" | \"circle\". */\n imageShape?: ImageShape;\n\n /** Si `true`, dibuja un borde sutil alrededor de la miniatura. */\n imageBorder?: boolean;\n\n /** Color o valor CSS para el fondo de la miniatura. Ej: \"transparent\". */\n imageBg?: string | null;\n\n /** Estrategia de ajuste de la imagen dentro del cuadro (CSS `object-fit`). */\n imageFit?: ImageFit;\n\n /**\n * URL/local path de imagen de fallback si falla la carga de `showImage`.\n * Ej: \"assets/comingSoon.png\" | null para omitir fallback.\n * Nota: el componente puede optar por no utilizarlo si no se implementa.\n */\n imageFallback?: string | null;\n\n /* ---------- d) Interacción ---------- */\n\n /**\n * Habilita/Deshabilita la capacidad de colapsar nodos.\n * Cuando está activo, los descendientes de un nodo colapsado no se muestran.\n */\n enableCollapse?: boolean;\n\n /* ---------- e) Medición (auto-resize) ---------- */\n\n /** Recalcula tamaño de cards tras render para ajustar al contenido. */\n autoResizeCards?: boolean;\n\n /** Ancho extra (px) añadido tras la medición (márgenes internos). */\n paddingWidthPx?: number;\n\n /** Alto extra (px) añadido tras la medición (márgenes internos). */\n paddingHeightPx?: number;\n };\n\n /* -------------------------- Viewport ------------------------- */\n viewport?: {\n /** Alto del viewport en px (contenedor con scroll oculto). */\n height?: number;\n\n /** Alto mínimo del viewport en px. */\n minHeight?: number;\n\n /** Muestra/oculta la toolbar. */\n showToolbar?: boolean;\n\n /** Controla la visibilidad de selectores en la toolbar. */\n toolbarControls?: {\n /** Selector de estilo de enlaces. */\n showLinkStyle?: boolean;\n\n /** Selector de alineación. */\n showLayoutAlign?: boolean;\n\n /** Selector de dirección. */\n showLayoutDirection?: boolean;\n };\n };\n}\n\n/* =========================================\n * Valores por defecto\n * ========================================= */\n\n/**\n * Valores por defecto (seguros) de configuración.\n * - Estos valores son fusionados con `SchemaSettings` provistos por el usuario.\n * - No contienen lógica condicional; son constantes.\n */\nexport const DEFAULT_SETTINGS: Required<SchemaSettings> = {\n messages: {\n isLoading: false,\n isError: false,\n loadingMessage: \"Cargando…\",\n errorMessage: \"Error al cargar el esquema\",\n emptyMessage: \"No hay datos para mostrar\",\n },\n\n colors: {\n linkStroke: \"#019df4\",\n linkStrokeWidth: 2,\n accentByKey: null,\n accentInverse: false,\n accentFill: false,\n showColorTrue: false,\n showColorFalse: false,\n showColorNull: false,\n },\n\n layout: {\n layoutDirection: \"RIGHT\",\n layoutAlign: \"firstChild\",\n linkStyle: \"curve\",\n curveTension: 30,\n straightThresholdDx: 60,\n columnGapPx: 64,\n rowGapPx: 32,\n },\n\n dataView: {\n /* a) Extracción */\n titleKeyPriority: [],\n hiddenKeysGlobal: [],\n treatScalarArraysAsAttribute: true,\n maxDepth: null,\n labelData: {},\n\n /* b) Presentación general */\n previewMaxKeys: 999,\n valueMaxChars: null,\n valueShowTooltip: false,\n noWrapKeys: [],\n maxCardWidth: null,\n maxCardHeight: null,\n defaultNodeSize: { width: 256, height: 64 },\n\n /* c) Presentación de imagen */\n showImage: null,\n imageSizePx: 32,\n imageShape: \"rounded\",\n imageBorder: false,\n imageBg: \"transparent\",\n imageFit: \"contain\",\n imageFallback: null,\n\n /* d) Interacción */\n enableCollapse: true,\n\n /* e) Medición */\n autoResizeCards: true,\n paddingWidthPx: 16,\n paddingHeightPx: 0,\n },\n\n viewport: {\n height: 800,\n minHeight: 480,\n showToolbar: true,\n toolbarControls: {\n showLinkStyle: true,\n showLayoutAlign: true,\n showLayoutDirection: true,\n },\n },\n};\n","// URL: projects/schema-ng19/src/lib/models.ts\n\nexport * from \"./shared/models\";\n","// URL: projects/schema-ng19/src/lib/components/schema-card.component.ts\n\n/**\n * Componente: SchemaCardComponent\n * ----------------------------------------------------------------------------\n * Renderiza un `SchemaNode` como tarjeta posicionada en el “stage”.*\n * Responsabilidades:\n * - Mostrar título, atributos de vista previa y badges de arrays no escalares.\n * - Soportar una miniatura de imagen opcional (grupo de settings de imagen).\n * - Emitir eventos de interacción: click de nodo y solicitud de colapso.\n * - Aplicar clases de acento (accent-true/false/null y variantes fill).\n *\n * Reglas:\n * - La posición (left/top) y tamaño (width/height) vienen del layout/medición.\n * - No calcula layout; solo representa el nodo con base en `SchemaSettings`.\n * - Si `cardTemplate` está definido, se usa en lugar del template por defecto.\n *\n * Imagen (grupo completo en `settings.dataView`):\n * - `showImage`: clave en `node.data` con la URL a mostrar (si existe).\n * - `imageSizePx`: tamaño en px del cuadro (ancho/alto iguales).\n * - `imageShape`: \"square\" | \"rounded\" | \"circle\".\n * - `imageBorder`: borde sutil opcional alrededor de la miniatura.\n * - `imageBg`: color/fondo CSS del cuadro de imagen (e.g., \"transparent\").\n * - `imageFit`: \"contain\" | \"cover\" | \"scale-down\" (mapea a `object-fit`).\n * - `imageFallback`: URL local/remota a usar si la imagen falla (no implementado aquí).\n *\n * Acentos (grupo `settings.colors`):\n * - `accentByKey`: clave booleana en `node.data`. Si no hay clave, no hay acento.\n * - `accentInverse`: invierte la semántica (true↔false).\n * - `accentFill`: si `true`, además del borde aplica fondo suave.\n * - `showColorTrue/False/Null`: habilitan visuales para cada caso.\n *\n * Vista previa:\n * - `jsonMeta.attributes` se deriva en el adapter y se trunca según settings globales.\n * - Las claves incluidas en `noWrapKeys` se presentan en una sola línea (nowrap).\n *\n * Accesibilidad:\n * - `alt` para la imagen se deriva del título o `label` del nodo.\n *\n * Nota:\n * - Este componente no decide si se muestra el botón de colapso; expone\n * `showCollapseControls` e `isCollapsed`, y emite `toggleRequest`. La UI del\n * botón puede implementarse en el template custom si se usa `cardTemplate`.\n */\n\nimport { ChangeDetectionStrategy, Component, EventEmitter, Output, TemplateRef, computed, input } from \"@angular/core\";\nimport { SchemaNode, SchemaSettings, DEFAULT_SETTINGS, ImageShape } from \"../models\";\nimport { CommonModule, NgTemplateOutlet } from \"@angular/common\";\n\n@Component({\n selector: \"schema-card\",\n standalone: true,\n imports: [CommonModule, NgTemplateOutlet],\n templateUrl: \"./schema-card.component.html\",\n styleUrl: \"./schema-card.component.scss\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SchemaCardComponent {\n /* ============================ Inputs ============================ */\n\n /** Nodo a representar. Requerido. */\n node = input.required<SchemaNode>();\n\n /** Template alternativo para renderizar la card (reemplaza al default). */\n cardTemplate = input<TemplateRef<any> | null>(null);\n\n /** Settings efectivos aplicables a la card (colores, imagen, etc.). */\n settings = input<SchemaSettings>(DEFAULT_SETTINGS);\n\n /** Indica si este nodo tiene hijos (para mostrar controles de colapso). */\n hasChildren = input<boolean>(false);\n\n /** Controla si se muestra la UI de colapso (el botón/indicador). */\n showCollapseControls = input<boolean>(false);\n\n /** Indica si el nodo está colapsado (para iconografía/estado visual). */\n isCollapsed = input<boolean>(false);\n\n /* ============================ Outputs =========================== */\n\n /** Click del usuario sobre la card (burbujeo controlado). */\n @Output() nodeClick = new EventEmitter<SchemaNode>();\n\n /** Solicitud de colapso/expandir desde la card. */\n @Output() toggleRequest = new EventEmitter<SchemaNode>();\n\n /* ============================ View derivada ===================== */\n\n /**\n * Vista aplanada derivada de `settings`.\n * - Si `accentByKey` está definido y no hay showColor* en true,\n * se activan internamente los tres (true/false/null) para visual por defecto.\n */\n view = computed(() => {\n const s = this.settings() ?? DEFAULT_SETTINGS;\n\n // Grupo de imagen\n const imageSizePx = s.dataView?.imageSizePx ?? DEFAULT_SETTINGS.dataView.imageSizePx;\n const imageShape = (s.dataView?.imageShape ?? DEFAULT_SETTINGS.dataView.imageShape) as ImageShape;\n const imageBorder = s.dataView?.imageBorder ?? DEFAULT_SETTINGS.dataView.imageBorder;\n const imageBg = s.dataView?.imageBg ?? DEFAULT_SETTINGS.dataView.imageBg;\n const imageFit = s.dataView?.imageFit ?? DEFAULT_SETTINGS.dataView.imageFit;\n\n // Presentación general\n const maxCardWidth = s.dataView?.maxCardWidth ?? null;\n const maxCardHeight = s.dataView?.maxCardHeight ?? null;\n const noWrapKeys = s.dataView?.noWrapKeys ?? [];\n const labelData = s.dataView?.labelData ?? {};\n const valueShowTooltip = s.dataView?.valueShowTooltip ?? false;\n const valueMaxChars = s.dataView?.valueMaxChars ?? null;\n\n // Acentos\n const accentByKey = s.colors?.accentByKey ?? null;\n const accentFill = s.colors?.accentFill ?? false;\n const accentInverse = s.colors?.accentInverse ?? false;\n\n const reqTrue = s.colors?.showColorTrue ?? false;\n const reqFalse = s.colors?.showColorFalse ?? false;\n const reqNull = s.colors?.showColorNull ?? false;\n\n let showTrue = reqTrue;\n let showFalse = reqFalse;\n let showNull = reqNull;\n\n const anyRequested = reqTrue || reqFalse || reqNull;\n if (accentByKey && !anyRequested) {\n // Activación interna por DX; no modifica settings globales\n showTrue = true;\n showFalse = true;\n showNull = true;\n }\n\n return {\n // Imagen\n showImageKey: s.dataView?.showImage ?? null,\n imageSizePx,\n imageShape,\n imageBorder,\n imageBg,\n imageFit,\n imageFallback: s.dataView?.imageFallback ?? null,\n\n // Presentación\n maxCardWidth,\n maxCardHeight,\n noWrapKeys,\n labelData,\n valueShowTooltip,\n valueMaxChars,\n\n // Defaults para tamaño en ausencia de medición\n defaultNodeW: DEFAULT_SETTINGS.dataView.defaultNodeSize?.width ?? 120,\n defaultNodeH: DEFAULT_SETTINGS.dataView.defaultNodeSize?.height ?? 60,\n\n // Acentos\n accentByKey,\n accentFill,\n accentInverse,\n showColorTrue: showTrue,\n showColorFalse: showFalse,\n showColorNull: showNull,\n };\n });\n\n /* ============================ API interna ======================= */\n\n /** Emite click del nodo y evita burbujeo accidental. */\n onClick(event: MouseEvent) {\n event.stopPropagation();\n const n = this.node();\n if (n) this.nodeClick.emit(n);\n }\n\n /** Emite solicitud de toggle (colapso/expandir). */\n onToggle(event: MouseEvent) {\n event.stopPropagation();\n const n = this.node();\n if (n) this.toggleRequest.emit(n);\n }\n\n /** Convierte objeto a pares clave-valor iterables. */\n objToPairs(obj: Record<string, unknown>) {\n const entries = Object.entries(obj ?? {});\n const imgKey = this.view().showImageKey;\n const accentKey = this.view().accentByKey;\n\n return entries.filter(([k]) => {\n if (imgKey && k === imgKey) return false; // Oculta la URL de imagen\n if (accentKey && k === accentKey) return false; // Oculta la clave de acento (true/false)\n return true;\n });\n }\n\n /** Clave configurada para la imagen; `null` si no hay. */\n private showImageKey(): string | null {\n const k = this.view().showImageKey;\n return k && typeof k === \"string\" && k.trim() ? k : null;\n }\n\n /** URL de imagen si existe y es válida. */\n imageSrc(): string | null {\n const key = this.showImageKey();\n if (!key) return null;\n const v = this.node()?.data?.[key];\n return typeof v === \"string\" && v.trim() !== \"\" ? v : null;\n }\n\n /** Texto alternativo accesible para la miniatura. */\n imageAlt(): string {\n const n = this.node();\n if (!n) return \"imagen\";\n return n.jsonMeta?.title || n.label || \"imagen\";\n }\n\n /**\n * Determina clases de acento según `accentByKey` y flags de color.\n * No aplica estilos si `accentByKey` no está definido en `node.data`.\n */\n getAccentClasses(): string[] {\n const v = this.view();\n const k = v.accentByKey;\n if (!k) return [];\n const n = this.node();\n const val = n?.data?.[k];\n\n const classes: string[] = [];\n const pushIf = (cond: boolean, cls: string) => {\n if (cond) classes.push(cls);\n };\n\n if (!v.accentInverse) {\n pushIf(val === true && v.showColorTrue, \"accent-true\");\n pushIf(val === false && v.showColorFalse, \"accent-false\");\n pushIf(val === null && v.showColorNull, \"accent-null\");\n if (v.accentFill) {\n pushIf(val === true && v.showColorTrue, \"accent-fill-true\");\n pushIf(val === false && v.showColorFalse, \"accent-fill-false\");\n pushIf(val === null && v.showColorNull, \"accent-fill-null\");\n }\n } else {\n pushIf(val === true && v.showColorTrue, \"accent-false\");\n pushIf(val === false && v.showColorFalse, \"accent-true\");\n pushIf(val === null && v.showColorNull, \"accent-null\");\n if (v.accentFill) {\n pushIf(val === true && v.showColorTrue, \"accent-fill-false\");\n pushIf(val === false && v.showColorFalse, \"accent-fill-true\");\n pushIf(val === null && v.showColorNull, \"accent-fill-null\");\n }\n }\n return classes;\n }\n\n /** Indica si una clave debe mostrarse en una sola línea. */\n isNoWrapKey(key: string): boolean {\n const arr = this.view().noWrapKeys ?? [];\n return Array.isArray(arr) ? arr.includes(key) : false;\n }\n\n /** Glifo de flecha para estados colapsado/expandido (cuando se use). */\n arrowGlyph(): string {\n const dir = this.settings()?.layout?.layoutDirection ?? DEFAULT_SETTINGS.layout.layoutDirection;\n const collapsed = !!this.isCollapsed();\n if (dir === \"DOWN\") return collapsed ? \"▼\" : \"▲\";\n return collapsed ? \"▶\" : \"◀\";\n }\n\n /** Presentación del valor (aplica truncamiento cuando corresponde). */\n displayValue(val: unknown): string {\n const str = val == null ? String(val) : String(val);\n const limit = this.view().valueMaxChars;\n if (typeof limit === \"number\" && limit > 0 && str.length > limit) {\n return str.slice(0, limit) + \"…\";\n }\n return str;\n }\n\n /** Tooltip con el valor completo (si está habilitado). */\n valueTitle(val: unknown): string | null {\n if (!this.view().valueShowTooltip) return null;\n return val == null ? String(val) : String(val);\n }\n\n /** Mapea clave a etiqueta legible, si está definida en `labelData`. */\n displayKey(key: string): string {\n const map = this.view().labelData ?? {};\n return Object.prototype.hasOwnProperty.call(map, key) ? (map as any)[key] : key;\n }\n\n /** Indica si existe un título calculado para la card. */\n hasComputedTitle(): boolean {\n const t = this.node()?.jsonMeta?.title;\n return !!t && String(t).trim() !== \"\";\n }\n\n /**\n * Manejo de error en carga de imagen:\n * - Si existe `imageFallback` y no se intentó antes, usarla (una sola vez).\n * - Si no hay fallback o ya falló, remover `src` y aplicar fondo suave.\n */\n onImgError(ev: Event) {\n const el = ev.target as HTMLImageElement | null;\n if (!el) return;\n\n const ds = el.dataset;\n const tried = ds[\"fallbackApplied\"] === \"1\";\n const fallback = this.view().imageFallback;\n\n if (fallback && !tried) {\n ds[\"fallbackApplied\"] = \"1\";\n el.src = fallback;\n return;\n }\n\n // Sin fallback (o ya falló)\n el.removeAttribute(\"src\");\n if (!this.view().imageBg) {\n el.style.background = \"#e2e8f0\";\n }\n if (this.view().imageBorder === undefined) {\n el.style.border = \"1px solid rgba(0,0,0,0.06)\";\n }\n }\n}\n","<div\n class=\"schema-card\"\n [attr.data-node-id]=\"node()?.id ?? ''\"\n [ngClass]=\"getAccentClasses()\"\n [style.left.px]=\"node()?.x ?? 0\"\n [style.top.px]=\"node()?.y ?? 0\"\n [style.width.px]=\"node()?.width ?? view().defaultNodeW\"\n [style.height.px]=\"node()?.height ?? view().defaultNodeH\"\n [style.maxWidth.px]=\"view().maxCardWidth\"\n [style.maxHeight.px]=\"view().maxCardHeight\"\n (click)=\"onClick($event)\"\n style=\"z-index: 1; position: absolute;\"\n>\n <button\n *ngIf=\"showCollapseControls() && hasChildren()\"\n type=\"button\"\n class=\"collapse-btn\"\n [attr.aria-pressed]=\"isCollapsed()\"\n (click)=\"onToggle($event)\"\n [attr.title]=\"isCollapsed() ? 'Expandir' : 'Colapsar'\"\n >\n <span class=\"chev\">{{ arrowGlyph() }}</span>\n </button>\n\n <!--\n Si se provee un template externo (ng-template), se renderiza en lugar\n del contenido por defecto. En ese caso, el consumidor puede usar el\n contexto \"$implicit: node\" para personalizar completamente la card.\n -->\n <ng-container\n *ngIf=\"cardTemplate(); else defaultTpl\"\n [ngTemplateOutlet]=\"cardTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: node() }\"\n ></ng-container>\n\n <!-- Template por defecto -->\n <ng-template #defaultTpl>\n <div class=\"card-body\">\n <div class=\"card-row\">\n <!-- Miniatura opcional -->\n <img\n *ngIf=\"imageSrc() as src\"\n class=\"thumb\"\n [class.shape-square]=\"view().imageShape === 'square'\"\n [class.shape-rounded]=\"view().imageShape === 'rounded'\"\n [class.shape-circle]=\"view().imageShape === 'circle'\"\n [attr.width]=\"view().imageSizePx\"\n [attr.height]=\"view().imageSizePx\"\n [style.width.px]=\"view().imageSizePx\"\n [style.height.px]=\"view().imageSizePx\"\n [style.background]=\"view().imageBg ?? null\"\n [style.border]=\"view().imageBorder ? '1px solid rgba(0,0,0,0.06)' : 'none'\"\n [style.object-fit]=\"view().imageFit\"\n [src]=\"src\"\n [alt]=\"imageAlt()\"\n loading=\"lazy\"\n decoding=\"async\"\n (error)=\"onImgError($event)\"\n />\n\n <div class=\"card-col\">\n <div class=\"card-title\" *ngIf=\"hasComputedTitle()\">\n {{ node()?.jsonMeta?.title }}\n </div>\n\n <!-- Vista previa de atributos (derivados por el adapter) -->\n <div class=\"card-preview\" *ngIf=\"node()?.jsonMeta?.attributes as attrs\">\n <div *ngFor=\"let kv of objToPairs(attrs)\" class=\"kv\">\n <span class=\"k\">{{ displayKey(kv[0]) }}:</span>\n <span\n class=\"v\"\n [class.v-true]=\"kv[1] === true\"\n [class.v-false]=\"kv[1] === false\"\n [class.v-null]=\"kv[1] === null\"\n [class.nowrap]=\"isNoWrapKey(kv[0])\"\n [attr.title]=\"valueTitle(kv[1])\"\n >\n {{ displayValue(kv[1]) }}\n </span>\n </div>\n </div>\n\n <!-- Badges con conteos de arrays no escalares -->\n <div class=\"array-badges\" *ngIf=\"node()?.jsonMeta?.arrayCounts as arrs\">\n <ng-container *ngFor=\"let e of objToPairs(arrs)\">\n <span class=\"arr-badge\">\n {{ displayKey(e[0]) }}: {{ e[1] }} {{ e[1] === 1 ? \"item\" : \"items\" }}\n </span>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</div>\n","// URL: projects/schema-ng19/src/lib/components/schema-links.component.ts\n\n/**\n * Componente: SchemaLinksComponent\n * ----------------------------------------------------------------------------\n * Dibuja todas las aristas del grafo en un único SVG posicionado tras las cards.\n *\n * Responsabilidades:\n * - Convertir `SchemaEdge.points` (calculados en el layout) en paths SVG.\n * - Adaptar la forma según `settings.layout.linkStyle`:\n * - \"line\" : segmento recto entre extremos.\n * - \"curve\" : curva cúbica con tensión configurable (si el dx supera\n * `straightThresholdDx`; en tramos muy cortos, usa línea).\n * - \"orthogonal\" : secuencia de segmentos “L” usando todos los bends.\n * - Emitir `linkClick` cuando se hace click sobre una arista.\n *\n * Parámetros relevantes de `SchemaSettings`:\n * - colors.linkStroke : color del trazo (CSS).\n * - colors.linkStrokeWidth : grosor del trazo (px).\n * - layout.linkStyle : \"orthogonal\" | \"curve\" | \"line\".\n * - layout.curveTension : control de curvatura (px). Rango sugerido: 20–200.\n * - layout.straightThresholdDx: si |dx| < threshold → línea recta en modo \"curve\".\n *\n * Notas:\n * - Este componente no calcula puntos; asume que `SchemaLayoutService` ya los\n * generó y decide la forma final según el estilo actual.\n * - `width/height` del SVG deben sincronizarse con el “stage” del contenedor.\n */\n\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, computed, input } from \"@angular/core\";\nimport { SchemaEdge, SchemaSettings, DEFAULT_SETTINGS } from \"../models\";\n\n@Component({\n selector: \"schema-links\",\n standalone: true,\n templateUrl: \"./schema-links.component.html\",\n styleUrl: \"./schema-links.component.scss\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SchemaLinksComponent {\n /* ============================ Inputs ============================ */\n\n /** Conjunto de aristas a dibujar (sus `points` provienen del layout). */\n edges = input.required<SchemaEdge[]>();\n\n /** Settings efectivos para estilo y color de enlaces. */\n settings = input<SchemaSettings>(DEFAULT_SETTINGS);\n\n /** Ancho del lienzo virtual (coherente con el “stage” del contenedor). */\n @Input() width = 4000;\n\n /** Alto del lienzo virtual (coherente con el “stage” del contenedor). */\n @Input() height = 2000;\n\n /* ============================ Outputs =========================== */\n\n /** Evento emitido al hacer click en una arista. */\n @Output() linkClick = new EventEmitter<SchemaEdge>();\n\n /* ============================ View derivada ===================== */\n\n /**\n * Vista aplanada para estilos de path.\n * Usa `DEFAULT_SETTINGS` como fallback para garantizar estabilidad.\n */\n view = computed(() => {\n const s = this.settings() ?? DEFAULT_SETTINGS;\n const colors = s.colors ?? DEFAULT_SETTINGS.colors;\n const layout = s.layout ?? DEFAULT_SETTINGS.layout;\n\n // Defaults seguros (numéricos y cadenas)\n const linkStroke = colors.linkStroke ?? DEFAULT_SETTINGS.colors.linkStroke;\n const linkStrokeWidth = colors.linkStrokeWidth ?? DEFAULT_SETTINGS.colors.linkStrokeWidth;\n const linkStyle = layout.linkStyle ?? DEFAULT_SETTINGS.layout.linkStyle;\n const curveTension = layout.curveTension ?? DEFAULT_SETTINGS.layout.curveTension;\n const straightThresholdDx = layout.straightThresholdDx ?? DEFAULT_SETTINGS.layout.straightThresholdDx;\n\n return {\n linkStroke,\n linkStrokeWidth,\n linkStyle,\n curveTension,\n straightThresholdDx,\n } as const;\n });\n\n /* ============================ Render helpers ==================== */\n\n /**\n * Construye el atributo `d` del path según el estilo de enlace.\n * Supone que `e.points` contiene al menos el punto de inicio y fin.\n */\n pathFor(e: SchemaEdge): string {\n const pts = e.points ?? [];\n if (pts.length === 0) return \"\";\n\n const v = this.view();\n const style = v.linkStyle;\n\n // Estilo \"line\": un segmento recto de A a B\n if (style === \"line\") {\n const a = pts[0];\n const b = pts[pts.length - 1];\n return `M ${a.x},${a.y} L ${b.x},${b.y}`;\n }\n\n // Estilo \"curve\": curva cúbica con tensión en X\n if (style === \"curve\") {\n const a = pts[0];\n const b = pts[pts.length - 1];\n\n // Evita curvas “demasiado cortas”: usa línea recta cuando |dx| < threshold\n const threshold = Number.isFinite(v.straightThresholdDx)\n ? v.straightThresholdDx\n : DEFAULT_SETTINGS.layout.straightThresholdDx;\n const dxAbs = Math.abs(b.x - a.x);\n if (dxAbs < (threshold ?? 0)) {\n return `M ${a.x},${a.y} L ${b.x},${b.y}`;\n }\n\n // Asegura límites razonables de tensión\n const baseT = Number.isFinite(v.curveTension) ? v.curveTension : DEFAULT_SETTINGS.layout.curveTension;\n const t = Math.max(20, Math.min(200, baseT ?? 30));\n const dir = Math.sign(b.x - a.x) || 1;\n const dy = b.y - a.y;\n\n // Puntos de control con separación horizontal `t`\n let c1x = a.x + dir * t;\n let c1y = a.y;\n let c2x = b.x - dir * t;\n let c2y = b.y;\n\n // Si el delta vertical es muy pequeño, introduce una “panza” suave\n if (Math.abs(dy) < 1) {\n const bow = Math.max(8, Math.min(96, t * 0.5));\n c1y = a.y - bow;\n c2y = b.y + bow;\n }\n\n return `M ${a.x},${a.y} C ${c1x},${c1y} ${c2x},${c2y} ${b.x},${b.y}`;\n }\n\n // Estilo \"orthogonal\": usa todos los puntos como quiebres (L)\n if (pts.length === 1) return `M ${pts[0].x},${pts[0].y}`;\n const first = pts[0];\n let d = `M ${first.x},${first.y}`;\n for (let i = 1; i < pts.length; i++) {\n const p = pts[i];\n d += ` L ${p.x},${p.y}`;\n }\n return d;\n }\n\n /* ============================ Eventos ========================== */\n\n /** Maneja el click en una arista sin burbujarlo al stage. */\n onLinkClick(e: SchemaEdge, ev: MouseEvent) {\n ev.stopPropagation();\n this.linkClick.emit(e);\n }\n}\n","<svg class=\"schema-links\" [attr.width]=\"width\" [attr.height]=\"height\">\n <g>\n @for (e of edges(); track e.id) {\n <path\n [attr.d]=\"pathFor(e)\"\n [attr.stroke]=\"view().linkStroke\"\n [attr.stroke-width]=\"view().linkStrokeWidth\"\n fill=\"none\"\n (click)=\"onLinkClick(e, $event)\"\n ></path>\n }\n </g>\n</svg>\n","/**\n * Servicio: JsonAdapterService\n * Convierte un JSON arbitrario en un grafo normalizado (nodes + edges).\n * - Aplica reglas de extracción (titleKeyPriority, hiddenKeysGlobal, etc.).\n * - Conservar rutas únicas (`jsonPath`) como IDs de nodos.\n * - Incluye metadatos útiles (childOrder, arrayCounts, atributos).\n * - No calcula layout.\n */\n\nimport { Injectable } from \"@angular/core\";\nimport { DEFAULT_SETTINGS, NormalizedGraph, SchemaEdge, SchemaNode, SchemaSettings } from \"../models\";\n\n@Injectable({ providedIn: \"root\" })\nexport class JsonAdapterService {\n /**\n * Normaliza un JSON a grafo de nodos y aristas.\n * @param input Objeto JSON arbitrario.\n * @param opts Configuración parcial (`SchemaSettings`).\n */\n normalize(input: any, opts: Partial<SchemaSettings> = {}): NormalizedGraph {\n // Merge por secciones\n const settings: Required<SchemaSettings> = {\n colors: { ...DEFAULT_SETTINGS.colors, ...(opts.colors ?? {}) },\n layout: { ...DEFAULT_SETTINGS.layout, ...(opts.layout ?? {}) },\n dataView: { ...DEFAULT_SETTINGS.dataView, ...(opts.dataView ?? {}) },\n messages: { ...DEFAULT_SETTINGS.messages, ...(opts.messages ?? {}) },\n viewport: { ...DEFAULT_SETTINGS.viewport, ...(opts.viewport ?? {}) },\n };\n\n // Accesos rápidos\n const dv = settings.dataView;\n const titleKeyPriority = dv.titleKeyPriority ?? [];\n const hiddenKeysGlobal: string[] = dv.hiddenKeysGlobal ?? [];\n const treatScalarArraysAsAttribute = dv.treatScalarArraysAsAttribute ?? false;\n const previewMaxKeys = dv.previewMaxKeys ?? 999;\n const defaultNodeSize = dv.defaultNodeSize ?? { width: 256, height: 64 };\n const maxDepth = dv.maxDepth ?? null;\n\n // Claves a ocultar explícitamente en preview\n const imageKey = dv.showImage && dv.showImage.trim() !== \"\" ? dv.showImage : null;\n const accentKey =\n settings.colors.accentByKey && settings.colors.accentByKey.trim() !== \"\" ? settings.colors.accentByKey : null;\n\n const nodes: SchemaNode[] = [];\n const edges: SchemaEdge[] = [];\n\n // Helpers\n const isScalar = (v: unknown): boolean => v === null || [\"string\", \"number\", \"boolean\"].includes(typeof v);\n /** Determina si un array contiene solo escalares. */\n\n const arrayIsScalar = (arr: unknown[]): boolean => Array.isArray(arr) && arr.length > 0 && arr.every(isScalar);\n /**\n * Escoge un título a partir de prioridades de clave.\n * Retorna también la clave usada para no duplicar en atributos.\n */ const pickTitle = (obj: any, priorities: string[]): { title: string; usedKey?: string } => {\n if (Array.isArray(priorities) && priorities.length > 0) {\n for (const k of priorities) {\n const v = obj?.[k];\n if (v != null && String(v).trim() !== \"\") {\n return { title: String(v), usedKey: k };\n }\n }\n }\n return { title: \"\", usedKey: undefined };\n };\n\n /**\n * Construye un subconjunto de atributos (clave → valor) para vista previa.\n * - Excluye claves ocultas o la usada como título.\n * - Incluye escalares y arrays escalares (si está habilitado).\n */\n const buildPreviewAttributes = (obj: any, usedKey?: string): Record<string, any> => {\n const toHide = new Set<string>(hiddenKeysGlobal);\n if (usedKey) toHide.add(usedKey);\n if (imageKey) toHide.add(imageKey);\n if (accentKey) toHide.add(accentKey);\n\n const entries: [string, any][] = [];\n for (const [k, v] of Object.entries(obj ?? {})) {\n if (toHide.has(k)) continue;\n if (isScalar(v)) {\n entries.push([k, v]);\n } else if (Array.isArray(v) && treatScalarArraysAsAttribute && arrayIsScalar(v)) {\n entries.push([k, v.join(\", \")]);\n }\n }\n return Object.fromEntries(entries.slice(0, previewMaxKeys));\n };\n /** Determina si un objeto puede representarse como entidad (nodo). */\n\n const isEntity = (obj: unknown): obj is Record<string, unknown> => {\n if (!obj || typeof obj !== \"object\" || Array.isArray(obj)) return false;\n return Object.values(obj).some(isScalar);\n };\n /** Retorna un mapa clave → longitud de arrays no escalares. */\n\n const arrayCountsOf = (obj: Record<string, unknown>): Record<string, number> => {\n const out: Record<string, number> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (Array.isArray(v) && !(v.length > 0 && v.every(isScalar))) {\n out[k] = v.length;\n }\n }\n return out;\n };\n // Contadores auxiliares\n\n const childCounter = new Map<string, number>();\n const childOrderByParent = new Map<string, number>();\n /**\n * Crea un nodo y opcionalmente una arista hacia su padre.\n */\n const addNode = (jsonPath: string, obj: Record<string, unknown>, parentId?: string): string => {\n const { title, usedKey } = pickTitle(obj, titleKeyPriority);\n const attrs = buildPreviewAttributes(obj, usedKey);\n // Orden relativo entre hermanos\n\n let childOrder: number | undefined = undefined;\n if (parentId) {\n const idx = childOrderByParent.get(parentId) ?? 0;\n childOrder = idx;\n childOrderByParent.set(parentId, idx + 1);\n }\n\n const node: SchemaNode = {\n id: jsonPath,\n jsonPath,\n label: title,\n data: obj as Record<string, any>,\n jsonMeta: {\n title,\n titleKeyUsed: usedKey,\n attributes: attrs,\n childrenCount: 0,\n arrayCounts: arrayCountsOf(obj),\n childOrder,\n },\n width: defaultNodeSize.width,\n height: defaultNodeSize.height,\n };\n nodes.push(node);\n\n if (parentId) {\n edges.push({\n id: `${parentId}__${node.id}`,\n source: parentId,\n target: node.id,\n });\n }\n return node.id;\n };\n /**\n * Recorrido recursivo del JSON.\n * - Usa `jsonPath` para mantener rutas únicas.\n * - Crea nodos solo cuando `isEntity(obj)` es verdadero.\n */\n const traverse = (val: unknown, path: string, parentId?: string, depth = 0) => {\n if (maxDepth !== null && depth > maxDepth) return;\n\n if (Array.isArray(val)) {\n val.forEach((c, i) => traverse(c, `${path}[${i}]`, parentId, depth + 1));\n return;\n }\n\n if (val && typeof val === \"object\") {\n const obj = val as Record<string, unknown>;\n\n let myId = parentId;\n if (isEntity(obj)) {\n myId = addNode(path, obj, parentId);\n if (parentId) childCounter.set(parentId, (childCounter.get(parentId) ?? 0) + 1);\n }\n\n for (const [k, v] of Object.entries(obj)) {\n if (isScalar(v)) continue;\n\n if (Array.isArray(v)) {\n const scalarArr = v.length > 0 && v.every(isScalar);\n if (scalarArr && treatScalarArraysAsAttribute) continue;\n v.forEach((c, i) => traverse(c, `${path}.${k}[${i}]`, myId, depth + 1));\n } else {\n traverse(v, `${path}.${k}`, myId, depth + 1);\n }\n }\n }\n };\n\n traverse(input, \"$\", undefined, 0);\n // Completar metadatos (childrenCount)\n nodes.forEach((n) => {\n n.jsonMeta = n.jsonMeta ?? {};\n n.jsonMeta.childrenCount = childCounter.get(n.id) ?? 0;\n });\n\n return { nodes, edges, meta: {} };\n }\n}\n","// URL: projects/schema-ng19/src/lib/services/json-adapter.service.ts\n\nexport { JsonAdapterService } from \"../shared/services/json-adapter.service\";\n","/**\n * Servicio: SchemaLayoutService\n * ----------------------------------------------------------------------------\n * Calcula posiciones (x,y) para un grafo normalizado (nodos/aristas) usando\n * un layout jerárquico tipo \"tidy tree\" en dos variantes:\n * - layoutDirection = \"RIGHT\": el árbol crece de izquierda → derecha.\n * - layoutDirection = \"DOWN\" : el árbol crece de arriba → abajo.\n *\n * Características:\n * - Respeta el orden de los hijos según `jsonMeta.childOrder` (estable, derivado del JSON).\n * - Soporta alineación del padre con respecto a los hijos: \"firstChild\" o \"center\".\n * - Genera puntos para aristas compatibles con estilos: \"orthogonal\", \"curve\" y \"line\".\n * - Mantiene \"pins\" en `meta.pinY` o `meta.pinX` (pre-alistado por el componente) para anclajes.\n */\n\nimport { Injectable } from \"@angular/core\";\nimport {\n DEFAULT_SETTINGS,\n LayoutDirection,\n NormalizedGraph,\n SchemaEdge,\n SchemaNode,\n SchemaSettings,\n LinkStyle,\n} from \"../models\";\n\ntype PinMap = Record<string, number>;\n\n/**\n * Servicio de layout tipo “tidy tree” para RIGHT/DOWN.\n * No gestiona pan/zoom ni overlays; solo posiciones y trayectorias.\n */\n@Injectable({ providedIn: \"root\" })\nexport class SchemaLayoutService {\n /**\n * Aplica layout al grafo.\n * @param g Grafo normalizado (nodos/aristas).\n * @param settings Configuración parcial. Se fusiona con DEFAULT_SETTINGS.\n * @returns Grafo con nodos posicionados y aristas con `points`.\n */\n async layout(g: NormalizedGraph, settings: SchemaSettings = DEFAULT_SETTINGS): Promise<NormalizedGraph> {\n const s = this.mergeSettings(settings);\n\n // Dirección principal y opciones de alineación/estilo\n const dir: LayoutDirection = s.layout?.layoutDirection ?? DEFAULT_SETTINGS.layout.layoutDirection!;\n const alignFirstChild = (s.layout?.layoutAlign ?? DEFAULT_SETTINGS.layout.layoutAlign) === \"firstChild\";\n const linkStyle: LinkStyle = s.layout?.linkStyle ?? DEFAULT_SETTINGS.layout.linkStyle!;\n\n // Gaps (separaciones) con defaults seguros\n const GAP_X = s.layout?.columnGapPx ?? DEFAULT_SETTINGS.layout.columnGapPx ?? 0;\n const GAP_Y = s.layout?.rowGapPx ?? DEFAULT_SETTINGS.layout.rowGapPx ?? 0;\n\n // Índices de consulta rápida\n const nodesById = new Map<string, SchemaNode>(g.nodes.map((n) => [n.id, n]));\n const childrenById = new Map<string, string[]>();\n const parentsById = new Map<string, string[]>();\n for (const n of g.nodes) {\n childrenById.set(n.id, []);\n parentsById.set(n.id, []);\n }\n for (const e of g.edges) {\n if (childrenById.has(e.source)) childrenById.get(e.source)!.push(e.target);\n if (parentsById.has(e.target)) parentsById.get(e.target)!.push(e.source);\n }\n\n // Orden estable por childOrder (si empatan, ordena por id)\n for (const [pid, arr] of childrenById) {\n arr.sort((aId, bId) => {\n const a = nodesById.get(aId);\n const b = nodesById.get(bId);\n const ao = a?.jsonMeta?.childOrder ?? 0;\n const bo = b?.jsonMeta?.childOrder ?? 0;\n return ao === bo ? (a?.id ?? \"\").localeCompare(b?.id ?? \"\") : ao - bo;\n });\n }\n\n // Raíces (nodos sin padres)\n const roots = g.nodes.filter((n) => (parentsById.get(n.id)?.length ?? 0) === 0);\n\n // Profundidad por nodo (BFS)\n const depthById = new Map<string, number>();\n const q = [...roots];\n for (const r of roots) depthById.set(r.id, 0);\n while (q.length) {\n const n = q.shift()!;\n const d = depthById.get(n.id) ?? 0;\n for (const cid of childrenById.get(n.id) ?? []) {\n if (!depthById.has(cid)) {\n depthById.set(cid, d + 1);\n const cn = nodesById.get(cid);\n if (cn) q.push(cn);\n }\n }\n }\n\n // Helpers de tamaño (con fallback a defaults)\n const getW = (n: SchemaNode) => {\n const fallback = DEFAULT_SETTINGS.dataView.defaultNodeSize?.width ?? 1;\n const w = n.width ?? fallback;\n return Number.isFinite(w) && w > 0 ? w : fallback;\n };\n const getH = (n: SchemaNode) => {\n const fallback = DEFAULT_SETTINGS.dataView.defaultNodeSize?.height ?? 1;\n const h = n.height ?? fallback;\n return Number.isFinite(h) && h > 0 ? h : fallback;\n };\n\n // Tamaño acumulado de cada subárbol en el eje secundario (para apilado)\n const subtreeSize = new Map<string, number>();\n const measureSubtree = (id: string): number => {\n const node = nodesById.get(id);\n const kids = childrenById.get(id) ?? [];\n if (!node) {\n subtreeSize.set(id, 0);\n return 0;\n }\n if (kids.length === 0) {\n const leafSize = dir === \"RIGHT\" ? getH(node) : getW(node);\n subtreeSize.set(id, leafSize);\n return leafSize;\n }\n let sum = 0;\n for (let i = 0; i < kids.length; i++) {\n sum += measureSubtree(kids[i]);\n if (i < kids.length - 1) sum += GAP_Y; // espacio entre hermanos\n }\n subtreeSize.set(id, sum);\n return sum;\n };\n for (const r of roots) measureSubtree(r.id);\n\n // Offset acumulado por profundidad en el eje principal\n const depths = Array.from(depthById.values());\n const maxDepth = depths.length ? Math.max(0, ...depths) : 0;\n const sizeByDepth: number[] = new Array(maxDepth + 1).fill(0);\n for (let d = 0; d <= maxDepth; d++) {\n const nodesAtD = g.nodes.filter((n) => (depthById.get(n.id) ?? 0) === d);\n sizeByDepth[d] = dir === \"RIGHT\" ? Math.max(1, ...nodesAtD.map(getW), 1) : Math.max(1, ...nodesAtD.map(getH), 1);\n }\n const mainOffset: number[] = new Array(maxDepth + 1).fill(0);\n for (let d = 1; d <= maxDepth; d++) {\n mainOffset[d] = mainOffset[d - 1] + sizeByDepth[d - 1] + GAP_X;\n }\n\n // Preparación de \"pin\" en meta (mapa de centros por eje secundario)\n const meta = g.meta ?? {};\n const pinKey = dir === \"RIGHT\" ? \"pinY\" : \"pinX\";\n if (!meta[pinKey]) meta[pinKey] = {};\n const pin: PinMap = (meta[pinKey] as PinMap) ?? {};\n\n /**\n * Coloca recursivamente un subárbol:\n * - depth: profundidad actual\n * - start: posición inicial en el eje secundario para apilar hijos\n * Retorna el tamaño del subárbol en el eje secundario.\n */\n const placeSubtree = (id: string, depth: number, start: number): number => {\n const node = nodesById.get(id);\n const kids = childrenById.get(id) ?? [];\n const mySize = subtreeSize.get(id) ?? 0;\n const mainPos = mainOffset[depth] ?? 0;\n\n if (!node) return mySize;\n\n // Hoja: centra sobre el rango [start, start+mySize]\n if (kids.length === 0) {\n const centerSec = start + mySize / 2;\n if (dir === \"RIGHT\") {\n node.x = Math.round(mainPos);\n node.y = Math.round(centerSec - getH(node) / 2);\n pin[node.id] = Math.round((node.y ?? 0) + getH(node) / 2);\n } else {\n node.y = Math.round(mainPos);\n node.x = Math.round(centerSec - getW(node) / 2);\n pin[node.id] = Math.round((node.x ?? 0) + getW(node) / 2);\n }\n return mySize;\n }\n\n // Nodo con hijos: posiciona hijos apilados y centra el padre\n let cursor = start;\n const childCenters: number[] = [];\n for (let i = 0; i < kids.length; i++) {\n const cid = kids[i];\n const cNode = nodesById.get(cid);\n const cSize = subtreeSize.get(cid) ?? (cNode ? (dir === \"RIGHT\" ? getH(cNode) : getW(cNode)) : 0);\n\n placeSubtree(cid, depth + 1, cursor);\n\n if (cNode) {\n const cCenter = dir === \"RIGHT\" ? (cNode.y ?? 0) + getH(cNode) / 2 : (cNode.x ?? 0) + getW(cNode) / 2;\n childCenters.push(cCenter);\n }\n\n cursor += cSize + (i < kids.length - 1 ? GAP_Y : 0);\n }\n\n // Objetivo de centrado del padre\n const targetCenter =\n alignFirstChild || childCenters.length === 0\n ? (childCenters[0] ?? 0)\n : childCenters.reduce((a, b) => a + b, 0) / Math.max(1, childCenters.length);\n\n if (dir === \"RIGHT\") {\n node.x = Math.round(mainPos);\n node.y = Math.round(targetCenter - getH(node) / 2);\n pin[node.id] = Math.round(targetCenter);\n } else {\n node.y = Math.round(mainPos);\n node.x = Math.round(targetCenter - getW(node) / 2);\n pin[node.id] = Math.round(targetCenter);\n }\n\n return mySize;\n };\n\n // Coloca cada raíz con un margen superior/izquierdo inicial\n let globalCursor = 40;\n for (let i = 0; i < roots.length; i++) {\n const r = roots[i];\n const rSize = subtreeSize.get(r.id) ?? (dir === \"RIGHT\" ? getH(r) : getW(r));\n placeSubtree(r.id, 0, globalCursor);\n globalCursor += rSize + (i < roots.length - 1 ? (s.layout.rowGapPx ?? 0) : 0);\n }\n\n // Generación de puntos para aristas en función del estilo\n const edges: SchemaEdge[] = g.edges.map((e) => {\n const a = nodesById.get(e.source);\n const b = nodesById.get(e.target);\n if (!a || !b) return { ...e, points: [] };\n\n if (dir === \"RIGHT\") {\n const ax = (a.x ?? 0) + getW(a);\n const ay = (a.y ?? 0) + Math.round(getH(a) / 2);\n const bx = b.x ?? 0;\n const by = (b.y ?? 0) + Math.round(getH(b) / 2);\n\n if (linkStyle === \"orthogonal\") {\n const midX = Math.round((ax + bx) / 2);\n return {\n ...e,\n points: [\n { x: ax, y: ay },\n { x: midX, y: ay },\n { x: midX, y: by },\n { x: bx, y: by },\n ],\n };\n }\n // curve/line: el componente define la forma final (curva o línea)\n return {\n ...e,\n points: [\n { x: ax, y: ay },\n { x: bx, y: by },\n ],\n };\n } else {\n const ax = (a.x ?? 0) + Math.round(getW(a) / 2);\n const ay = (a.y ?? 0) + getH(a);\n const bx = (b.x ?? 0) + Math.round(getW(b) / 2);\n const by = b.y ?? 0;\n\n if (linkStyle === \"orthogonal\") {\n const midY = Math.round((ay + by) / 2);\n return {\n ...e,\n points: [\n { x: ax, y: ay },\n { x: ax, y: midY },\n { x: bx, y: midY },\n { x: bx, y: by },\n ],\n };\n }\n return {\n ...e,\n points: [\n { x: ax, y: ay },\n { x: bx, y: by },\n ],\n };\n }\n });\n\n // Retorna copias superficiales (no muta el original `g`)\n return { nodes: g.nodes.map((n) => ({ ...n })), edges, meta: { ...(g.meta ?? {}) } };\n }\n\n /**\n * Fusiona settings parciales con DEFAULT_SETTINGS, sección por sección.\n */\n private mergeSettings(s: SchemaSettings): Required<SchemaSettings> {\n return {\n colors: { ...DEFAULT_SETTINGS.colors, ...(s.colors ?? {}) },\n layout: { ...DEFAULT_SETTINGS.layout, ...(s.layout ?? {}) },\n dataView: { ...DEFAULT_SETTINGS.dataView, ...(s.dataView ?? {}) },\n messages: { ...DEFAULT_SETTINGS.messages, ...(s.messages ?? {}) },\n viewport: { ...DEFAULT_SETTINGS.viewport, ...(s.viewport ?? {}) },\n };\n }\n}\n","// URL: projects/schema-ng19/src/lib/services/schema-layout.service.ts\n\nexport { SchemaLayoutService } from \"../shared/services/schema-layout.service\";\n","// URL: projects/schema-ng19/src/lib/components/schema.component.ts\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n input,\n signal,\n computed,\n} from \"@angular/core\";\nimport { CommonModule, NgFor, NgIf } from \"@angular/common\";\n\nimport { JsonAdapterService } from \"../services/json-adapter.service\";\nimport { SchemaLayoutService } from \"../services/schema-layout.service\";\n\nimport {\n NormalizedGraph,\n SchemaEdge,\n SchemaNode,\n SchemaSettings,\n DEFAULT_SETTINGS,\n LinkStyle,\n LayoutAlign,\n LayoutDirection,\n} from \"../models\";\n\nimport { SchemaCardComponent } from \"./schema-card.component\";\nimport { SchemaLinksComponent } from \"./schema-links.component\";\n\n@Component({\n selector: \"schema\",\n standalone: true,\n imports: [CommonModule, NgFor, NgIf, SchemaCardComponent, SchemaLinksComponent],\n templateUrl: \"./schema.component.html\",\n styleUrl: \"./schema.component.scss\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SchemaComponent implements AfterViewInit, OnChanges, OnDestroy {\n // ===== Inputs =====\n data = input<any>();\n settings = input<SchemaSettings | null>(null);\n cardTemplate = input<TemplateRef<any> | null>(null);\n\n // Overlays\n isLoading = input<boolean>(false);\n isError = input<boolean>(false);\n emptyMessage = input<string>(\"No hay datos para mostrar\");\n loadingMessage = input<string>(\"Cargando…\");\n errorMessage = input<string>(\"Error al cargar el esquema\");\n\n // Viewport\n viewportHeight = signal<number>(800);\n minViewportHeight = signal<number>(480);\n showToolbar = signal<boolean>(true);\n\n // ===== Outputs =====\n @Output() nodeClick = new EventEmitter<SchemaNode>();\n @Output() linkClick = new EventEmitter<SchemaEdge>();\n\n // ===== Estado de grafo =====\n private fullGraph = signal<NormalizedGraph>({ nodes: [], edges: [] });\n private graph = signal<NormalizedGraph>({ nodes: [], edges: [] });\n\n nodes = computed(() => this.graph().nodes);\n edges = computed(() => this.graph().edges);\n\n @ViewChild(\"root\", { static: true }) rootRef!: ElementRef<HTMLElement>;\n\n // ===== Pan/zoom =====\n private scale = signal(1);\n private minScale = signal(0.2);\n private maxScale = signal(3);\n private tx = signal(0);\n private ty = signal(0);\n private dragging = false;\n private lastX = 0;\n private lastY = 0;\n private lastViewport: { w: number; h: number } | null = null;\n\n /** Último punto de interacción sobre la stage (coordenadas de pantalla relativas al root). */\n private lastPointerScreen: { x: number; y: number } | null = null;\n private wheelRaf: number | null = null;\n private pendingWheel: { deltaY: number; clientX: number; clientY: number } | null = null;\n\n transform = computed(() => `translate(${this.tx()}px, ${this.ty()}px) scale(${this.scale()})`);\n\n virtualWidth = 12000;\n virtualHeight = 6000;\n\n // ===== Toolbar overrides =====\n opt_linkStyle = signal<LinkStyle>(\"orthogonal\");\n opt_layoutAlign = signal<LayoutAlign>(\"firstChild\");\n opt_layoutDirection = signal<LayoutDirection>(\"RIGHT\");\n\n // ===== Mensajes derivados =====\n isLoadingView = computed(() => this.settings()?.messages?.isLoading ?? this.isLoading());\n isErrorView = computed(() => this.settings()?.messages?.isError ?? this.isError());\n emptyMessageView = computed(() => this.settings()?.messages?.emptyMessage ?? this.emptyMessage());\n loadingMessageView = computed(() => this.settings()?.messages?.loadingMessage ?? this.loadingMessage());\n errorMessageView = computed(() => this.settings()?.messages?.errorMessage ?? this.errorMessage());\n\n // ===== Collapse/expand =====\n private childrenById = new Map<string, string[]>();\n private parentsById = new Map<string, string[]>();\n private collapsed = new Set<string>();\n private measureIdsToCheck: Set<string> | null = null;\n private lastDataRef: any | undefined;\n private lastSettingsRef: SchemaSettings | null | undefined;\n private hasComputedOnce = false;\n\n enableCollapse = computed<boolean>(() => {\n const b = this.baseSettings();\n return b.dataView?.enableCollapse ?? DEFAULT_SETTINGS.dataView.enableCollapse!;\n });\n\n // ===== Toolbar controls visibility =====\n toolbarShowLinkStyle = computed<boolean>(() => {\n const b = this.baseSettings();\n return b.viewport?.toolbarControls?.showLinkStyle ?? true;\n });\n toolbarShowLayoutAlign = computed<boolean>(() => {\n const b = this.baseSettings();\n return b.viewport?.toolbarControls?.showLayoutAlign ?? true;\n });\n toolbarShowLayoutDirection = computed<boolean>(() => {\n const b = this.baseSettings();\n return b.viewport?.toolbarControls?.showLayoutDirection ?? true;\n });\n\n constructor(\n private adapter: JsonAdapterService,\n private layoutService: SchemaLayoutService,\n ) {}\n\n // ===== Settings efectivos =====\n baseSettings = computed<SchemaSettings>(() => {\n const s = this.settings() ?? {};\n return {\n messages: { ...DEFAULT_SETTINGS.messages, ...s.messages },\n viewport: { ...DEFAULT_SETTINGS.viewport, ...s.viewport },\n colors: { ...DEFAULT_SETTINGS.colors, ...s.colors },\n layout: { ...DEFAULT_SETTINGS.layout, ...s.layout },\n dataView: { ...DEFAULT_SETTINGS.dataView, ...s.dataView },\n };\n });\n\n effectiveSettings = computed<SchemaSettings>(() => {\n const b = this.baseSettings();\n return {\n ...b,\n layout: {\n ...b.layout,\n linkStyle: this.opt_linkStyle(),\n layoutAlign: this.opt_layoutAlign(),\n layoutDirection: this.opt_layoutDirection(),\n },\n };\n });\n\n private recomputeFromSettings(): void {\n const b = this.baseSettings();\n this.viewportHeight.set(b.viewport?.height ?? DEFAULT_SETTINGS.viewport.height!);\n this.minViewportHeight.set(b.viewport?.minHeight ?? DEFAULT_SETTINGS.viewport.minHeight!);\n this.showToolbar.set(b.viewport?.showToolbar ?? DEFAULT_SETTINGS.viewport.showToolbar!);\n\n this.opt_linkStyle.set((b.layout?.linkStyle ?? DEFAULT_SETTINGS.layout.linkStyle) as LinkStyle);\n this.opt_layoutAlign.set((b.layout?.layoutAlign ?? DEFAULT_SETTINGS.layout.layoutAlign) as LayoutAlign);\n this.opt_layoutDirection.set(\n (b.layout?.layoutDirection ?? DEFAULT_SETTINGS.layout.layoutDirection) as LayoutDirection,\n );\n }\n\n // ===== Ciclo de vida =====\n private resizeObs?: ResizeObserver;\n\n ngAfterViewInit(): void {\n this.recomputeFromSettings();\n\n const rootEl = this.rootRef?.nativeElement;\n if (rootEl && \"ResizeObserver\" in window) {\n const r0 = rootEl.getBoundingClientRect();\n this.lastViewport = { w: r0.width, h: r0.height };\n\n this.resizeObs = new ResizeObserver(() => {\n const rect = rootEl.getBoundingClientRect();\n this.preserveCenterOnResize(rect.width, rect.height);\n });\n this.resizeObs.observe(rootEl);\n }\n\n this.compute();\n }\n\n ngOnChanges(_: SimpleChanges): void {\n this.recomputeFromSettings();\n this.compute();\n }\n\n ngOnDestroy(): void {\n if (this.resizeObs) {\n try {\n this.resizeObs.disconnect();\n } catch {}\n }\n }\n\n // ===== Pipeline principal =====\n private async compute(): Promise<void> {\n if (this.isLoadingView()) return;\n\n if (this.hasComputedOnce && this.data() === this.lastDataRef && this.settings() === this.lastSettingsRef) {\n return;\n }\n\n const s = this.effectiveSettings();\n const normalized = this.adapter.normalize(this.data(), s);\n this.ensurePinMeta(normalized, s);\n this.fullGraph.set(this.cloneGraph(normalized));\n\n this.buildIndices();\n if (!this.enableCollapse()) this.collapsed.clear();\n\n const visible = this.buildVisibleGraphFromCollapsed();\n\n let laid = await this.layoutService.layout(visible, s);\n this.graph.set(this.cloneGraph(laid));\n\n if (s.dataView?.autoResizeCards ?? DEFAULT_SETTINGS.dataView.autoResizeCards) {\n const maxPasses = 6;\n this.measureIdsToCheck = null; // primera pasada: medir todo\n for (let pass = 1; pass <= maxPasses; pass++) {\n await this.nextFrame();\n const changed = this.measureAndApply(pass);\n if (!changed) break;\n laid = await this.layoutService.layout(this.graph(), s);\n this.graph.set(this.cloneGraph(laid));\n }\n }\n\n this.updateVirtualSizeFromGraph(laid);\n this.fitToViewByBounds(); // asegura minScale y encuadre base\n this.centerOnFirstNodeOrFit(); // centra como doble clic\n\n this.lastDataRef = this.data();\n this.lastSettingsRef = this.settings();\n this.hasComputedOnce = true;\n }\n\n private async relayoutVisible(anchorId?: string, anchorScreen?: { x: number; y: number }): Promise<void> {\n const s = this.effectiveSettings();\n\n const visible = this.buildVisibleGraphFromCollapsed();\n let laid = await this.layoutService.layout(visible, s);\n this.graph.set(this.cloneGraph(laid));\n\n if (s.dataView?.autoResizeCards ?? DEFAULT_SETTINGS.dataView.autoResizeCards) {\n const maxPasses = 4;\n this.measureIdsToCheck = null; // primera pasada: medir todo\n for (let pass = 1; pass <= maxPasses; pass++) {\n await this.nextFrame();\n const changed = this.measureAndApply(pass);\n if (!changed) break;\n laid = await this.layoutService.layout(this.graph(), s);\n this.graph.set(this.cloneGraph(laid));\n }\n }\n\n this.updateVirtualSizeFromGraph(laid);\n await this.animateToGraph(laid, 260, anchorId, anchorScreen);\n }\n async onCardToggle(n: SchemaNode): Promise<void> {\n if (!this.enableCollapse() || !n?.id) return;\n\n const anchorBefore = this.getNodeScreenCenter(n);\n\n if (this.collapsed.has(n.id)) this.collapsed.delete(n.id);\n else this.collapsed.add(n.id);\n\n await this.relayoutVisible(n.id, anchorBefore);\n }\n /** Devuelve si el nodo tiene hijos (para pintar botón de colapso). */\n hasChildren = (id: string): boolean => (this.childrenById.get(id)?.length ?? 0) > 0;\n\n /** Devuelve si el nodo está colapsado (estado visual en la card). */\n isNodeCollapsed = (id: string): boolean => this.collapsed.has(id);\n\n // --- Animación de transición entre grafos (requerido por relayoutVisible) ---\n private async animateToGraph(\n target: NormalizedGraph,\n durationMs = 260,\n anchorId?: string,\n anchorScreen?: { x: number; y: number },\n ): Promise<void> {\n const start = this.cloneGraph(this.graph());\n\n const startNodeById = new Map(start.nodes.map((n) => [n.id, n]));\n const startEdgeById = new Map(start.edges.map((e) => [e.id, e]));\n\n const lerp = (a: number, b: number, t: number) => a + (b - a) * t;\n const easeInOut = (t: number) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2);\n\n const alignPoints = (a: Array<{ x: number; y: number }> = [], b: Array<{ x: number; y: number }> = []) => {\n const aa = a.length ? [...a] : [];\n const bb = b.length ? [...b] : [];\n const len = Math.max(aa.length, bb.length, 2);\n while (aa.length < len) aa.push(aa[aa.length - 1] ?? { x: 0, y: 0 });\n while (bb.length < len) bb.push(bb[bb.length - 1] ?? { x: 0, y: 0 });\n return { aa, bb, len };\n };\n\n const t0 = performance.now();\n\n const run = (resolve: () => void) => {\n const now = performance.now();\n const raw = Math.min(1, (now - t0) / Math.max(1, durationMs));\n const t = easeInOut(raw);\n\n const frame: NormalizedGraph = { nodes: [], edges: [], meta: { ...(target.meta ?? {}) } };\n\n for (const endNode of target.nodes) {\n const sNode = startNodeById.get(endNode.id) ?? endNode;\n const xn = lerp(sNode.x ?? 0, endNode.x ?? 0, t);\n const yn = lerp(sNode.y ?? 0, endNode.y ?? 0, t);\n const wn = lerp(sNode.width ?? 0, endNode.width ?? 0, t);\n const hn = lerp(sNode.height ?? 0, endNode.height ?? 0, t);\n frame.nodes.push({\n ...endNode,\n x: Math.round(xn),\n y: Math.round(yn),\n width: Math.round(wn),\n height: Math.round(hn),\n });\n }\n\n for (const endEdge of target.edges) {\n const sEdge = startEdgeById.get(endEdge.id) ?? endEdge;\n const { aa, bb, len } = alignPoints(sEdge.points, endEdge.points);\n const pts = new Array(len)\n .fill(0)\n .map((_, i) => ({ x: lerp(aa[i].x, bb[i].x, t), y: lerp(aa[i].y, bb[i].y, t) }));\n frame.edges.push({ ...endEdge, points: pts });\n }\n\n this.graph.set(frame);\n\n if (anchorId && anchorScreen) this.applyAnchorAfterLayout(anchorId, anchorScreen);\n\n if (raw < 1) {\n requestAnimationFrame(() => run(resolve));\n } else {\n this.graph.set(this.cloneGraph(target));\n if (anchorId && anchorScreen) this.applyAnchorAfterLayout(anchorId, anchorScreen);\n resolve();\n }\n };\n\n await new Promise<void>((resolve) => requestAnimationFrame(() => run(resolve)));\n }\n // ===== Interacción (solo en .stage) =====\n onWheel(e: WheelEvent) {\n e.preventDefault();\n this.pendingWheel = { deltaY: e.deltaY, clientX: e.clientX, clientY: e.clientY };\n if (this.wheelRaf !== null) return;\n this.wheelRaf = requestAnimationFrame(() => {\n const ev = this.pendingWheel;\n this.pendingWheel = null;\n this.wheelRaf = null;\n if (!ev) return;\n\n const rect = this.rootRef.nativeElement.getBoundingClientRect();\n const mouseX = ev.clientX - rect.left;\n const mouseY = ev.clientY - rect.top;\n this.lastPointerScreen = { x: mouseX, y: mouseY };\n\n const oldScale = this.scale();\n const factor = 1 + (-ev.deltaY > 0 ? 0.08 : -0.08);\n const newScale = Math.max(this.minScale(), Math.min(this.maxScale(), oldScale * factor));\n\n const worldX = (mouseX - this.tx()) / oldScale;\n const worldY = (mouseY - this.ty()) / oldScale;\n this.tx.set(mouseX - worldX * newScale);\n this.ty.set(mouseY - worldY * newScale);\n this.scale.set(newScale);\n });\n }\n\n onPointerDown(e: PointerEvent) {\n e.preventDefault();\n\n this.dragging = true;\n const el = e.target as HTMLElement;\n if (el && el.closest && el.closest(\".collapse-btn\")) {\n this.dragging = false;\n return;\n }\n\n try {\n (e.target as Element).setPointerCapture?.(e.pointerId);\n } catch {}\n\n const rect = this.rootRef.nativeElement.getBoundingClientRect();\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n this.lastPointerScreen = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n onPointerMove(e: PointerEvent) {\n const rect = this.rootRef.nativeElement.getBoundingClientRect();\n this.lastPointerScreen = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n\n if (!this.dragging) return;\n const dx = e.clientX - this.lastX;\n const dy = e.clientY - this.lastY;\n this.tx.set(this.tx() + dx);\n this.ty.set(this.ty() + dy);\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n }\n\n onPointerUp() {\n this.dragging = false;\n }\n\n onPointerLeave() {\n this.dragging = false;\n this.lastPointerScreen = null;\n }\n\n onDblClick() {\n this.centerOnFirstNodeOrFit();\n }\n\n // ===== Toolbar actions =====\n zoomIn() {\n this.applyZoom(1.15);\n }\n\n zoomOut() {\n this.applyZoom(1 / 1.15);\n }\n\n resetView() {\n this.centerOnFirstNodeOrFit();\n }\n\n setLinkStyle(v: string) {\n const ok = v === \"orthogonal\" || v === \"curve\" || v === \"line\";\n this.opt_linkStyle.set(ok ? (v as LinkStyle) : \"orthogonal\");\n this.relayoutVisible();\n }\n\n setLayoutAlign(v: string) {\n const ok = v === \"firstChild\" || v === \"center\";\n this.opt_layoutAlign.set(ok ? (v as LayoutAlign) : \"center\");\n this.relayoutVisible();\n }\n\n setLayoutDirection(v: string) {\n const ok = v === \"RIGHT\" || v === \"DOWN\";\n this.opt_layoutDirection.set(ok ? (v as LayoutDirection) : \"RIGHT\");\n this.relayoutVisible();\n }\n\n /* ========================================================================\n * Helpers (posibles extraíbles)\n * ===================================================================== */\n\n // ---- Gráfico / DOM ----\n private cloneGraph(g: NormalizedGraph): NormalizedGraph {\n return {\n nodes: g.nodes.map((n) => ({ ...n })),\n edges: g.edges.map((e) => ({ ...e })),\n meta: { ...(g.meta ?? {}) },\n };\n }\n\n private nextFrame(): Promise<void> {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()));\n }\n\n private ensurePinMeta(g: NormalizedGraph, s: SchemaSettings): void {\n if (!g.meta) g.meta = {};\n const dir = s.layout?.layoutDirection ?? DEFAULT_SETTINGS.layout.layoutDirection;\n const key = dir === \"RIGHT\" ? \"pinY\" : \"pinX\";\n if (!g.meta[key]) g.meta[key] = {};\n }\n\n private updateVirtualSizeFromGraph(g: NormalizedGraph): void {\n const pad = 200;\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n for (const n of g.nodes) {\n const x = n.x ?? 0;\n const y = n.y ?? 0;\n const w = n.width ?? 0;\n const h = n.height ?? 0;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + w);\n maxY = Math.max(maxY, y + h);\n }\n\n if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) {\n this.virtualWidth = 12000;\n this.virtualHeight = 6000;\n return;\n }\n\n const neededW = Math.max(1, Math.ceil(maxX - Math.min(0, minX)) + pad);\n const neededH = Math.max(1, Math.ceil(maxY - Math.min(0, minY)) + pad);\n\n this.virtualWidth = Math.max(neededW, 2000);\n this.virtualHeight = Math.max(neededH, 1200);\n }\n\n private buildIndices(): void {\n this.childrenById.clear();\n this.parentsById.clear();\n const g = this.fullGraph();\n\n for (const n of g.nodes) {\n this.childrenById.set(n.id, []);\n this.parentsById.set(n.id, []);\n }\n for (const e of g.edges) {\n const ch = this.childrenById.get(e.source);\n if (ch) ch.push(e.target);\n\n const pr = this.parentsById.get(e.target);\n if (pr) pr.push(e.source);\n }\n }\n\n private isVisibleNodeByCollapsedAncestors(id: string): boolean {\n if (!this.enableCollapse()) return true;\n const stack = [...(this.parentsById.get(id) ?? [])];\n const seen = new Set<string>();\n while (stack.length) {\n const p = stack.pop()!;\n if (seen.has(p)) continue;\n seen.add(p);\n if (this.collapsed.has(p)) return false;\n const pp = this.parentsById.get(p);\n if (pp && pp.length) stack.push(...pp);\n }\n return true;\n }\n\n private buildVisibleGraphFromCollapsed(): NormalizedGraph {\n const full = this.fullGraph();\n if (!this.enableCollapse()) return this.cloneGraph(full);\n\n const visibleNodeSet = new Set<string>();\n for (const n of full.nodes) {\n if (this.isVisibleNodeByCollapsedAncestors(n.id)) visibleNodeSet.add(n.id);\n }\n const nodes = full.nodes.filter((n) => visibleNodeSet.has(n.id));\n const edges = full.edges.filter((e) => visibleNodeSet.has(e.source) && visibleNodeSet.has(e.target));\n return { nodes, edges, meta: full.meta };\n }\n\n // ---- Medición ----\n private measureAndApply(pass: number): boolean {\n const s = this.effectiveSettings();\n const extraW = s.dataView?.paddingWidthPx ?? 0;\n const extraH = s.dataView?.paddingHeightPx ?? 0;\n const maxW = s.dataView?.maxCardWidth ?? Infinity;\n const maxH = s.dataView?.maxCardHeight ?? Infinity;\n\n const root = this.rootRef.nativeElement;\n const cards = Array.from(root.querySelectorAll<HTMLElement>(\".schema-card\"));\n\n const visMap = new Map(this.graph().nodes.map((n) => [n.id, n]));\n const fullMap = new Map(this.fullGraph().nodes.map((n) => [n.id, n]));\n\n let changed = false;\n const idsToMeasure = pass === 1 ? null : this.measureIdsToCheck;\n const nextChanged = new Set<string>();\n\n const measures: Array<{ id: string; w: number; h: number }> = [];\n\n for (const el of cards) {\n const id = el.getAttribute(\"data-node-id\") ?? undefined;\n if (!id) continue;\n if (idsToMeasure && !idsToMeasure.has(id)) continue;\n\n const node = visMap.get(id);\n if (!node) continue;\n\n const prevW = el.style.width;\n const prevH = el.style.height;\n\n el.style.width = \"auto\";\n el.style.height = \"auto\";\n\n const wIntrinsic = Math.ceil(el.scrollWidth);\n const hIntrinsic = Math.ceil(el.scrollHeight);\n\n el.style.width = prevW;\n el.style.height = prevH;\n\n const targetW = Math.min(wIntrinsic + extraW, maxW);\n const targetH = Math.min(hIntrinsic + extraH, maxH);\n measures.push({ id, w: targetW, h: targetH });\n }\n\n for (const m of measures) {\n const node = visMap.get(m.id);\n if (!node) continue;\n if ((node.width ?? 0) !== m.w || (node.height ?? 0) !== m.h) {\n node.width = m.w;\n node.height = m.h;\n changed = true;\n nextChanged.add(m.id);\n\n const full = fullMap.get(m.id);\n if (full) {\n full.width = m.w;\n full.height = m.h;\n }\n }\n }\n\n this.measureIdsToCheck = nextChanged.size ? nextChanged : null;\n return changed;\n }\n\n // ---- Viewport / encuadre ----\n private getViewportSize() {\n const el = this.rootRef.nativeElement;\n const rect = el.getBoundingClientRect();\n return { w: rect.width, h: rect.height };\n }\n\n private getGraphBounds() {\n const ns = this.nodes();\n if (!ns.length) return { minX: 0, minY: 0, maxX: 1, maxY: 1 };\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const n of ns) {\n const nx = n.x ?? 0;\n const ny = n.y ?? 0;\n const nw = n.width ?? 0;\n const nh = n.height ?? 0;\n minX = Math.min(minX, nx);\n minY = Math.min(minY, ny);\n maxX = Math.max(maxX, nx + nw);\n maxY = Math.max(maxY, ny + nh);\n }\n return { minX, minY, maxX, maxY };\n }\n\n private computeScaleToFit(pad = 24) {\n const { w, h } = this.getViewportSize();\n const { minX, minY, maxX, maxY } = this.getGraphBounds();\n const gw = Math.max(1, maxX - minX);\n const gh = Math.max(1, maxY - minY);\n\n const sx = (w - pad) / gw;\n const sy = (h - pad) / gh;\n const fit = Math.max(0.05, Math.min(sx, sy));\n\n return { fit, minX, minY, maxX, maxY, w, h };\n }\n\n private fitToViewByBounds() {\n const { fit, minX, minY, maxX, maxY, w, h } = this.computeScaleToFit(24);\n this.minScale.set(Math.min(fit, 1));\n this.scale.set(Math.max(this.scale(), this.minScale()));\n\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n\n const s = this.scale();\n this.tx.set(w / 2 - cx * s);\n this.ty.set(h / 2 - cy * s);\n }\n\n /** Zoom anclado al último punto de interacción sobre la stage; si no hay, usa el centro del viewport. */\n private applyZoom(factor: number) {\n const rect = this.rootRef.nativeElement.getBoundingClientRect();\n const anchor = this.lastPointerScreen ?? { x: rect.width / 2, y: rect.height / 2 };\n\n const oldScale = this.scale();\n const newScale = Math.max(this.minScale(), Math.min(this.maxScale(), oldScale * factor));\n\n const worldX = (anchor.x - this.tx()) / oldScale;\n const worldY = (anchor.y - this.ty()) / oldScale;\n this.tx.set(anchor.x - worldX * newScale);\n this.ty.set(anchor.y - worldY * newScale);\n this.scale.set(newScale);\n }\n\n private preserveCenterOnResize(newW: number, newH: number) {\n if (!this.lastViewport) {\n this.lastViewport = { w: newW, h: newH };\n return;\n }\n const oldW = this.lastViewport.w;\n const oldH = this.lastViewport.h;\n\n const s = this.scale();\n const worldCx = (oldW / 2 - this.tx()) / s;\n const worldCy = (oldH / 2 - this.ty()) / s;\n\n this.tx.set(newW / 2 - worldCx * s);\n this.ty.set(newH / 2 - worldCy * s);\n\n this.lastViewport = { w: newW, h: newH };\n }\n\n // ---- Foco / anclaje ----\n private getNodeById(id: string | undefined): SchemaNode | undefined {\n if (!id) return undefined;\n return this.graph().nodes.find((n) => n.id === id);\n }\n\n private getNodeScreenCenter(n: SchemaNode): { x: number; y: number } {\n const s = this.scale();\n const cx = (n.x ?? 0) + (n.width ?? 0) / 2;\n const cy = (n.y ?? 0) + (n.height ?? 0) / 2;\n return { x: cx * s + this.tx(), y: cy * s + this.ty() };\n }\n\n private applyAnchorAfterLayout(nodeId: string, targetScreen: { x: number; y: number }) {\n const n = this.getNodeById(nodeId);\n if (!n) return;\n this.centerOnNodeAtScreen(n, targetScreen);\n }\n\n // ---- Centrados reutilizables ----\n private getFirstVisibleNode(): SchemaNode | null {\n const list = this.nodes();\n return list.length ? list[0] : null;\n }\n\n private centerOnNode(n: SchemaNode): void {\n const rect = this.rootRef.nativeElement.getBoundingClientRect();\n const viewportCx = rect.width / 2;\n const viewportCy = rect.height / 2;\n\n const s = this.scale();\n const nodeCx = (n.x ?? 0) + (n.width ?? 0) / 2;\n const nodeCy = (n.y ?? 0) + (n.height ?? 0) / 2;\n\n this.tx.set(viewportCx - nodeCx * s);\n this.ty.set(viewportCy - nodeCy * s);\n }\n\n /** Centra un nodo de forma que su centro quede en una posición de pantalla dada (x,y). */\n private centerOnNodeAtScreen(n: SchemaNode, screen: { x: number; y: number }): void {\n const s = this.scale();\n const nodeCx = (n.x ?? 0) + (n.width ?? 0) / 2;\n const nodeCy = (n.y ?? 0) + (n.height ?? 0) / 2;\n this.tx.set(screen.x - nodeCx * s);\n this.ty.set(screen.y - nodeCy * s);\n }\n\n private centerOnFirstNodeOrFit(): void {\n const first = this.getFirstVisibleNode();\n if (first) this.centerOnNode(first);\n else this.fitToViewByBounds();\n }\n\n}\n","<!-- URL: projects/schema-ng19/src/lib/components/schema.component.html -->\n<div class=\"schema-root\" #root [style.height.px]=\"viewportHeight()\" [style.minHeight.px]=\"minViewportHeight()\">\n <div class=\"schema-toolbar\" *ngIf=\"showToolbar() && !isLoadingView() && !isErrorView()\">\n <div class=\"toolbar-actions\">\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">−</button>\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">+</button>\n <button type=\"button\" (click)=\"resetView()\" title=\"Centrar\">⤾</button>\n </div>\n\n <div class=\"toolbar-selectors\">\n <label *ngIf=\"toolbarShowLinkStyle()\">\n Enlaces:\n <select #ls [value]=\"opt_linkStyle()\" (change)=\"setLinkStyle(ls.value)\">\n <option value=\"curve\">Curvo</option>\n <option value=\"orthogonal\">Ortogonal</option>\n <option value=\"line\">Lineal</option>\n </select>\n </label>\n\n <label *ngIf=\"toolbarShowLayoutAlign()\">\n Alineación:\n <select #la [value]=\"opt_layoutAlign()\" (change)=\"setLayoutAlign(la.value)\">\n <option value=\"firstChild\">Superior</option>\n <option value=\"center\">Centrado</option>\n </select>\n </label>\n\n <label *ngIf=\"toolbarShowLayoutDirection()\">\n Dirección:\n <select #ld [value]=\"opt_layoutDirection()\" (change)=\"setLayoutDirection(ld.value)\">\n <option value=\"RIGHT\">Derecha</option>\n <option value=\"DOWN\">Abajo</option>\n </select>\n </label>\n </div>\n </div>\n\n <!-- Overlays -->\n <div class=\"overlay loading\" *ngIf=\"isLoadingView()\">\n <div class=\"loading-banner\">\n <div class=\"shimmer\"></div>\n <span class=\"msg\">{{ loadingMessageView() }}</span>\n </div>\n </div>\n\n <div class=\"overlay empty\" *ngIf=\"!isLoadingView() && data() == null\">\n <div class=\"empty-banner\">{{ emptyMessageView() }}</div>\n </div>\n\n <div class=\"overlay error\" *ngIf=\"!isLoadingView() && isErrorView()\">\n <div class=\"error-banner\">{{ errorMessageView() }}</div>\n </div>\n\n <!-- Stage -->\n <div\n class=\"stage\"\n (wheel)=\"onWheel($event)\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp()\"\n (pointerleave)=\"onPointerLeave()\"\n (dblclick)=\"onDblClick()\"\n [style.transform]=\"transform()\"\n [style.width.px]=\"virtualWidth\"\n [style.height.px]=\"virtualHeight\"\n *ngIf=\"!isLoadingView() && !isErrorView()\"\n >\n <schema-links\n [edges]=\"edges()\"\n [settings]=\"effectiveSettings()\"\n (linkClick)=\"linkClick.emit($event)\"\n [width]=\"virtualWidth\"\n [height]=\"virtualHeight\"\n ></schema-links>\n\n @for (n of nodes(); track n.id) {\n <schema-card\n [node]=\"n\"\n [settings]=\"effectiveSettings()\"\n [cardTemplate]=\"cardTemplate()\"\n [hasChildren]=\"hasChildren(n.id)\"\n [showCollapseControls]=\"enableCollapse()\"\n [isCollapsed]=\"isNodeCollapsed(n.id)\"\n (toggleRequest)=\"onCardToggle($event)\"\n (nodeClick)=\"nodeClick.emit($event)\"\n ></schema-card>\n }\n </div>\n</div>\n","/*\n * Public API Surface of scheme\n */\n\nexport * from \"./lib/models\";\nexport * from \"./lib/components/schema.component\";\nexport * from \"./lib/components/schema-card.component\";\nexport * from \"./lib/services/schema-layout.service\";\nexport * from \"./lib/services/json-adapter.service\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.JsonAdapterService","i2.SchemaLayoutService","i3"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@miguimono/json-schema" />
5
+ export * from './public-api';
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Componente: SchemaCardComponent
3
+ * ----------------------------------------------------------------------------
4
+ * Renderiza un `SchemaNode` como tarjeta posicionada en el “stage”.*
5
+ * Responsabilidades:
6
+ * - Mostrar título, atributos de vista previa y badges de arrays no escalares.
7
+ * - Soportar una miniatura de imagen opcional (grupo de settings de imagen).
8
+ * - Emitir eventos de interacción: click de nodo y solicitud de colapso.
9
+ * - Aplicar clases de acento (accent-true/false/null y variantes fill).
10
+ *
11
+ * Reglas:
12
+ * - La posición (left/top) y tamaño (width/height) vienen del layout/medición.
13
+ * - No calcula layout; solo representa el nodo con base en `SchemaSettings`.
14
+ * - Si `cardTemplate` está definido, se usa en lugar del template por defecto.
15
+ *
16
+ * Imagen (grupo completo en `settings.dataView`):
17
+ * - `showImage`: clave en `node.data` con la URL a mostrar (si existe).
18
+ * - `imageSizePx`: tamaño en px del cuadro (ancho/alto iguales).
19
+ * - `imageShape`: "square" | "rounded" | "circle".
20
+ * - `imageBorder`: borde sutil opcional alrededor de la miniatura.
21
+ * - `imageBg`: color/fondo CSS del cuadro de imagen (e.g., "transparent").
22
+ * - `imageFit`: "contain" | "cover" | "scale-down" (mapea a `object-fit`).
23
+ * - `imageFallback`: URL local/remota a usar si la imagen falla (no implementado aquí).
24
+ *
25
+ * Acentos (grupo `settings.colors`):
26
+ * - `accentByKey`: clave booleana en `node.data`. Si no hay clave, no hay acento.
27
+ * - `accentInverse`: invierte la semántica (true↔false).
28
+ * - `accentFill`: si `true`, además del borde aplica fondo suave.
29
+ * - `showColorTrue/False/Null`: habilitan visuales para cada caso.
30
+ *
31
+ * Vista previa:
32
+ * - `jsonMeta.attributes` se deriva en el adapter y se trunca según settings globales.
33
+ * - Las claves incluidas en `noWrapKeys` se presentan en una sola línea (nowrap).
34
+ *
35
+ * Accesibilidad:
36
+ * - `alt` para la imagen se deriva del título o `label` del nodo.
37
+ *
38
+ * Nota:
39
+ * - Este componente no decide si se muestra el botón de colapso; expone
40
+ * `showCollapseControls` e `isCollapsed`, y emite `toggleRequest`. La UI del
41
+ * botón puede implementarse en el template custom si se usa `cardTemplate`.
42
+ */
43
+ import { EventEmitter, TemplateRef } from "@angular/core";
44
+ import { SchemaNode, SchemaSettings, ImageShape } from "../models";
45
+ import * as i0 from "@angular/core";
46
+ export declare class SchemaCardComponent {
47
+ /** Nodo a representar. Requerido. */
48
+ node: import("@angular/core").InputSignal<SchemaNode>;
49
+ /** Template alternativo para renderizar la card (reemplaza al default). */
50
+ cardTemplate: import("@angular/core").InputSignal<TemplateRef<any> | null>;
51
+ /** Settings efectivos aplicables a la card (colores, imagen, etc.). */
52
+ settings: import("@angular/core").InputSignal<SchemaSettings>;
53
+ /** Indica si este nodo tiene hijos (para mostrar controles de colapso). */
54
+ hasChildren: import("@angular/core").InputSignal<boolean>;
55
+ /** Controla si se muestra la UI de colapso (el botón/indicador). */
56
+ showCollapseControls: import("@angular/core").InputSignal<boolean>;
57
+ /** Indica si el nodo está colapsado (para iconografía/estado visual). */
58
+ isCollapsed: import("@angular/core").InputSignal<boolean>;
59
+ /** Click del usuario sobre la card (burbujeo controlado). */
60
+ nodeClick: EventEmitter<SchemaNode>;
61
+ /** Solicitud de colapso/expandir desde la card. */
62
+ toggleRequest: EventEmitter<SchemaNode>;
63
+ /**
64
+ * Vista aplanada derivada de `settings`.
65
+ * - Si `accentByKey` está definido y no hay showColor* en true,
66
+ * se activan internamente los tres (true/false/null) para visual por defecto.
67
+ */
68
+ view: import("@angular/core").Signal<{
69
+ showImageKey: string | null;
70
+ imageSizePx: number | undefined;
71
+ imageShape: ImageShape;
72
+ imageBorder: boolean | undefined;
73
+ imageBg: string | null | undefined;
74
+ imageFit: import("../models").ImageFit | undefined;
75
+ imageFallback: string | null;
76
+ maxCardWidth: number | null;
77
+ maxCardHeight: number | null;
78
+ noWrapKeys: string[];
79
+ labelData: Record<string, string>;
80
+ valueShowTooltip: boolean;
81
+ valueMaxChars: number | null;
82
+ defaultNodeW: number;
83
+ defaultNodeH: number;
84
+ accentByKey: string | null;
85
+ accentFill: boolean;
86
+ accentInverse: boolean;
87
+ showColorTrue: boolean;
88
+ showColorFalse: boolean;
89
+ showColorNull: boolean;
90
+ }>;
91
+ /** Emite click del nodo y evita burbujeo accidental. */
92
+ onClick(event: MouseEvent): void;
93
+ /** Emite solicitud de toggle (colapso/expandir). */
94
+ onToggle(event: MouseEvent): void;
95
+ /** Convierte objeto a pares clave-valor iterables. */
96
+ objToPairs(obj: Record<string, unknown>): [string, unknown][];
97
+ /** Clave configurada para la imagen; `null` si no hay. */
98
+ private showImageKey;
99
+ /** URL de imagen si existe y es válida. */
100
+ imageSrc(): string | null;
101
+ /** Texto alternativo accesible para la miniatura. */
102
+ imageAlt(): string;
103
+ /**
104
+ * Determina clases de acento según `accentByKey` y flags de color.
105
+ * No aplica estilos si `accentByKey` no está definido en `node.data`.
106
+ */
107
+ getAccentClasses(): string[];
108
+ /** Indica si una clave debe mostrarse en una sola línea. */
109
+ isNoWrapKey(key: string): boolean;
110
+ /** Glifo de flecha para estados colapsado/expandido (cuando se use). */
111
+ arrowGlyph(): string;
112
+ /** Presentación del valor (aplica truncamiento cuando corresponde). */
113
+ displayValue(val: unknown): string;
114
+ /** Tooltip con el valor completo (si está habilitado). */
115
+ valueTitle(val: unknown): string | null;
116
+ /** Mapea clave a etiqueta legible, si está definida en `labelData`. */
117
+ displayKey(key: string): string;
118
+ /** Indica si existe un título calculado para la card. */
119
+ hasComputedTitle(): boolean;
120
+ /**
121
+ * Manejo de error en carga de imagen:
122
+ * - Si existe `imageFallback` y no se intentó antes, usarla (una sola vez).
123
+ * - Si no hay fallback o ya falló, remover `src` y aplicar fondo suave.
124
+ */
125
+ onImgError(ev: Event): void;
126
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchemaCardComponent, never>;
127
+ static ɵcmp: i0.ɵɵComponentDeclaration<SchemaCardComponent, "schema-card", never, { "node": { "alias": "node"; "required": true; "isSignal": true; }; "cardTemplate": { "alias": "cardTemplate"; "required": false; "isSignal": true; }; "settings": { "alias": "settings"; "required": false; "isSignal": true; }; "hasChildren": { "alias": "hasChildren"; "required": false; "isSignal": true; }; "showCollapseControls": { "alias": "showCollapseControls"; "required": false; "isSignal": true; }; "isCollapsed": { "alias": "isCollapsed"; "required": false; "isSignal": true; }; }, { "nodeClick": "nodeClick"; "toggleRequest": "toggleRequest"; }, never, never, true, never>;
128
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Componente: SchemaLinksComponent
3
+ * ----------------------------------------------------------------------------
4
+ * Dibuja todas las aristas del grafo en un único SVG posicionado tras las cards.
5
+ *
6
+ * Responsabilidades:
7
+ * - Convertir `SchemaEdge.points` (calculados en el layout) en paths SVG.
8
+ * - Adaptar la forma según `settings.layout.linkStyle`:
9
+ * - "line" : segmento recto entre extremos.
10
+ * - "curve" : curva cúbica con tensión configurable (si el dx supera
11
+ * `straightThresholdDx`; en tramos muy cortos, usa línea).
12
+ * - "orthogonal" : secuencia de segmentos “L” usando todos los bends.
13
+ * - Emitir `linkClick` cuando se hace click sobre una arista.
14
+ *
15
+ * Parámetros relevantes de `SchemaSettings`:
16
+ * - colors.linkStroke : color del trazo (CSS).
17
+ * - colors.linkStrokeWidth : grosor del trazo (px).
18
+ * - layout.linkStyle : "orthogonal" | "curve" | "line".
19
+ * - layout.curveTension : control de curvatura (px). Rango sugerido: 20–200.
20
+ * - layout.straightThresholdDx: si |dx| < threshold → línea recta en modo "curve".
21
+ *
22
+ * Notas:
23
+ * - Este componente no calcula puntos; asume que `SchemaLayoutService` ya los
24
+ * generó y decide la forma final según el estilo actual.
25
+ * - `width/height` del SVG deben sincronizarse con el “stage” del contenedor.
26
+ */
27
+ import { EventEmitter } from "@angular/core";
28
+ import { SchemaEdge, SchemaSettings } from "../models";
29
+ import * as i0 from "@angular/core";
30
+ export declare class SchemaLinksComponent {
31
+ /** Conjunto de aristas a dibujar (sus `points` provienen del layout). */
32
+ edges: import("@angular/core").InputSignal<SchemaEdge[]>;
33
+ /** Settings efectivos para estilo y color de enlaces. */
34
+ settings: import("@angular/core").InputSignal<SchemaSettings>;
35
+ /** Ancho del lienzo virtual (coherente con el “stage” del contenedor). */
36
+ width: number;
37
+ /** Alto del lienzo virtual (coherente con el “stage” del contenedor). */
38
+ height: number;
39
+ /** Evento emitido al hacer click en una arista. */
40
+ linkClick: EventEmitter<SchemaEdge>;
41
+ /**
42
+ * Vista aplanada para estilos de path.
43
+ * Usa `DEFAULT_SETTINGS` como fallback para garantizar estabilidad.
44
+ */
45
+ view: import("@angular/core").Signal<{
46
+ readonly linkStroke: string | undefined;
47
+ readonly linkStrokeWidth: number | undefined;
48
+ readonly linkStyle: import("../models").LinkStyle | undefined;
49
+ readonly curveTension: number | undefined;
50
+ readonly straightThresholdDx: number | undefined;
51
+ }>;
52
+ /**
53
+ * Construye el atributo `d` del path según el estilo de enlace.
54
+ * Supone que `e.points` contiene al menos el punto de inicio y fin.
55
+ */
56
+ pathFor(e: SchemaEdge): string;
57
+ /** Maneja el click en una arista sin burbujarlo al stage. */
58
+ onLinkClick(e: SchemaEdge, ev: MouseEvent): void;
59
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchemaLinksComponent, never>;
60
+ static ɵcmp: i0.ɵɵComponentDeclaration<SchemaLinksComponent, "schema-links", never, { "edges": { "alias": "edges"; "required": true; "isSignal": true; }; "settings": { "alias": "settings"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, { "linkClick": "linkClick"; }, never, never, true, never>;
61
+ }