{
  "definitions": [
    {
      "callable": true,
      "callees": [
        {
          "file": "core/factories/element.factory.ts",
          "name": "createVectorNode",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
            "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
            "label": "core/factories/element.factory.ts",
            "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
            "ref": "anatomy:file-core-factories-element-factory-ts"
          }
        }
      ],
      "callers": [
        {
          "file": "presentation/renderers/learning.renderer.ts",
          "name": "renderLearning",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-learning-renderer-ts",
            "json": "https://banes-lab.com/json/source/tree/presentation/renderers/learning.renderer.ts",
            "label": "presentation/renderers/learning.renderer.ts",
            "markdown": "https://banes-lab.com/source/tree/presentation/renderers/learning.renderer.ts.md",
            "ref": "anatomy:file-presentation-renderers-learning-renderer-ts"
          }
        }
      ],
      "exported": false,
      "flow": "relay",
      "kind": "lexical_declaration",
      "line": 119,
      "name": "stopLink",
      "signature": "const stopLink = function stopLink(stop: LaidStop, group: Element): Element {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "presentation/renderers/learning.renderer.ts",
          "name": "renderLearning",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-learning-renderer-ts",
            "json": "https://banes-lab.com/json/source/tree/presentation/renderers/learning.renderer.ts",
            "label": "presentation/renderers/learning.renderer.ts",
            "markdown": "https://banes-lab.com/source/tree/presentation/renderers/learning.renderer.ts.md",
            "ref": "anatomy:file-presentation-renderers-learning-renderer-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 76,
      "name": "blockShell",
      "signature": "const blockShell = function blockShell(block: LaidBlock): readonly Element[] {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/factories/element.factory.ts",
          "name": "createVectorNode",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
            "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
            "label": "core/factories/element.factory.ts",
            "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
            "ref": "anatomy:file-core-factories-element-factory-ts"
          }
        },
        {
          "file": "core/factories/element.factory.ts",
          "name": "createVectorNode",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
            "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
            "label": "core/factories/element.factory.ts",
            "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
            "ref": "anatomy:file-core-factories-element-factory-ts"
          }
        },
        {
          "file": "core/factories/element.factory.ts",
          "name": "createVectorNode",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
            "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
            "label": "core/factories/element.factory.ts",
            "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
            "ref": "anatomy:file-core-factories-element-factory-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 56,
      "name": "markFor",
      "signature": "const markFor = function markFor(block: LaidBlock, x: number): Element {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "presentation/renderers/learning.renderer.ts",
          "name": "blockShell",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-learning-renderer-ts",
            "json": "https://banes-lab.com/json/source/tree/presentation/renderers/learning.renderer.ts",
            "label": "presentation/renderers/learning.renderer.ts",
            "markdown": "https://banes-lab.com/source/tree/presentation/renderers/learning.renderer.ts.md",
            "ref": "anatomy:file-presentation-renderers-learning-renderer-ts"
          }
        },
        {
          "file": "presentation/renderers/learning.renderer.ts",
          "name": "stopLink",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-learning-renderer-ts",
            "json": "https://banes-lab.com/json/source/tree/presentation/renderers/learning.renderer.ts",
            "label": "presentation/renderers/learning.renderer.ts",
            "markdown": "https://banes-lab.com/source/tree/presentation/renderers/learning.renderer.ts.md",
            "ref": "anatomy:file-presentation-renderers-learning-renderer-ts"
          }
        }
      ],
      "callers": [],
      "exported": true,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 129,
      "name": "renderLearning",
      "signature": "export const renderLearning = function renderLearning(model: LearningModel): LearningView {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/factories/element.factory.ts",
          "name": "createVectorNode",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
            "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
            "label": "core/factories/element.factory.ts",
            "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
            "ref": "anatomy:file-core-factories-element-factory-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 42,
      "name": "toneDefs",
      "signature": "const toneDefs = function toneDefs(accents: readonly string[]): Element {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/factories/element.factory.ts",
          "name": "createVectorNode",
          "source": {
            "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
            "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
            "label": "core/factories/element.factory.ts",
            "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
            "ref": "anatomy:file-core-factories-element-factory-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 99,
      "name": "stopNode",
      "signature": "const stopNode = function stopNode(stop: LaidStop, accent: string): Element {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 34,
      "name": "DECIMALS",
      "signature": "const DECIMALS = 1;"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 36,
      "name": "numbers",
      "signature": "const numbers = function numbers(record: Readonly<Record<string, number | string>>): Record<string, string> {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 40,
      "name": "TONE_PREFIX",
      "signature": "const TONE_PREFIX = \"tone-\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 43,
      "name": "gradients",
      "signature": "const gradients = accents.map((accent) =>"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 57,
      "name": "paths",
      "signature": "const paths = ICON_PATHS.get(block.icon);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 77,
      "name": "shell",
      "signature": "const shell = createVectorNode(\"rect\", {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 84,
      "name": "tagWidth",
      "signature": "const tagWidth = widthOf([block.label]) + TAG_PAD;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 85,
      "name": "tagX",
      "signature": "const tagX = block.x + (block.width - tagWidth) / 2;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 86,
      "name": "tag",
      "signature": "const tag = createVectorNode(\"rect\", {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 90,
      "name": "mark",
      "signature": "const mark = markFor(block, tagX + TAG_LIFT);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 91,
      "name": "caption",
      "signature": "const caption = createVectorNode(\"text\", {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 100,
      "name": "box",
      "signature": "const box = createVectorNode(\"rect\", {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 103,
      "name": "label",
      "signature": "const label = createVectorNode(\"text\", {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 123,
      "name": "pathData",
      "signature": "const pathData = function pathData(points: readonly LearningPoint[]): string {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 130,
      "name": "parts",
      "signature": "const parts = createVectorNode(\"g\");"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 131,
      "name": "placed",
      "signature": "const placed: PlacedStop[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 137,
      "name": "node",
      "signature": "const node = stopNode(stop, block.accent);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 142,
      "name": "grid",
      "signature": "const grid = gridFor(model);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 143,
      "name": "straight",
      "signature": "const straight = orthogonal(grid, tracePoints(grid, placed));"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 144,
      "name": "data",
      "signature": "const data = pathData(unfold(straight, placed));"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 145,
      "name": "rail",
      "signature": "const rail = createVectorNode(\"path\", { attributes: { d: data }, className: \"learning-rail\" });"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 146,
      "name": "trace",
      "signature": "const trace = createVectorNode(\"path\", { attributes: { d: data }, className: \"learning-trace\" });"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 147,
      "name": "lines",
      "signature": "const lines = createVectorNode(\"g\", { children: [rail, trace] });"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 148,
      "name": "accents",
      "signature": "const accents = [...new Set(model.blocks.map((block) => block.accent))];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 149,
      "name": "vector",
      "signature": "const vector = createVectorNode(\"svg\", {"
    }
  ],
  "document": null,
  "findings": [],
  "generated": false,
  "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-learning-renderer-ts",
  "language": "typescript",
  "layer": "product",
  "name": "learning.renderer.ts",
  "path": "presentation/renderers/learning.renderer.ts",
  "ref": "anatomy:file-presentation-renderers-learning-renderer-ts",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/tree#folder-presentation-renderers",
          "json": "https://banes-lab.com/json/anatomy/tree/folder-presentation-renderers",
          "label": "presentation/renderers",
          "markdown": "https://banes-lab.com/anatomy/tree/folder-presentation-renderers.md",
          "ref": "chapter:/anatomy/tree#folder-presentation-renderers"
        }
      ],
      "relation": "contained-in"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/tree#file-core-factories-element-factory-ts",
          "json": "https://banes-lab.com/json/source/tree/core/factories/element.factory.ts",
          "label": "core/factories/element.factory.ts",
          "markdown": "https://banes-lab.com/source/tree/core/factories/element.factory.ts.md",
          "ref": "anatomy:file-core-factories-element-factory-ts"
        }
      ],
      "relation": "uses"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/tree#folder-core-factories",
          "json": "https://banes-lab.com/json/anatomy/tree/folder-core-factories",
          "label": "core/factories",
          "markdown": "https://banes-lab.com/anatomy/tree/folder-core-factories.md",
          "ref": "chapter:/anatomy/tree#folder-core-factories"
        },
        {
          "href": "https://banes-lab.com/anatomy/tree#folder-presentation-renderers",
          "json": "https://banes-lab.com/json/anatomy/tree/folder-presentation-renderers",
          "label": "presentation/renderers",
          "markdown": "https://banes-lab.com/anatomy/tree/folder-presentation-renderers.md",
          "ref": "chapter:/anatomy/tree#folder-presentation-renderers"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "slots": {
    "concern": "renderer",
    "subject": "learning",
    "variant": null
  },
  "stats": {
    "bytes": 6151,
    "callable": 8,
    "definitions": 31,
    "edges": 8,
    "exported": 12,
    "files": 1,
    "findings": {},
    "flows": {
      "relay": 1,
      "leaf": 1,
      "entry": 4,
      "isolated": 25
    },
    "lines": {
      "blank": 10,
      "code": 145,
      "total": 155
    }
  },
  "summary": "145 lines of code and 31 definitions.",
  "text": "https://banes-lab.com/source/tree/presentation/renderers/learning.renderer.ts.txt",
  "tree": "tree",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-lesson-renderer-ts",
      "json": "https://banes-lab.com/json/source/tree/presentation/renderers/lesson.renderer.ts",
      "label": "presentation/renderers/lesson.renderer.ts",
      "markdown": "https://banes-lab.com/source/tree/presentation/renderers/lesson.renderer.ts.md",
      "ref": "anatomy:file-presentation-renderers-lesson-renderer-ts"
    },
    "previous": {
      "href": "https://banes-lab.com/anatomy/tree#file-presentation-renderers-home-renderer-ts",
      "json": "https://banes-lab.com/json/source/tree/presentation/renderers/home.renderer.ts",
      "label": "presentation/renderers/home.renderer.ts",
      "markdown": "https://banes-lab.com/source/tree/presentation/renderers/home.renderer.ts.md",
      "ref": "anatomy:file-presentation-renderers-home-renderer-ts"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/source/tree/presentation/renderers",
    "label": "presentation/renderers",
    "markdown": "https://banes-lab.com/api/source/tree/presentation/renderers.md",
    "ref": "api:source/tree/presentation/renderers"
  }
}
