// ========================================================================== // TREE UTILS — pure helpers over the tree node data (no PixiJS, no DOM). // ========================================================================== import { treeNodes, type TreeNode } from '$lib/data'; import { NODE_RADII, MOBILE_RADIUS_FACTOR } from '$lib/config'; /** Look up a node by id. */ export function getNodeById(id: string): TreeNode | undefined { return treeNodes.find((node) => node.id === id); } /** Rendered radius for a node size, scaled down on mobile. */ export function getNodeRadius(size: TreeNode['size'], isMobile: boolean): number { const base = NODE_RADII[size] ?? NODE_RADII.default; return base * (isMobile ? MOBILE_RADIUS_FACTOR : 1); } /** Euclidean distance of a node from the tree centre (0, 0). */ export function getDistanceFromOrigin(node: TreeNode): number { return Math.sqrt(node.x * node.x + node.y * node.y); } /** * Plasma-beam intensity for the connection feeding a node. Skills scale with * years of experience (0.3–1.0); other categories use fixed tiers. */ export function getBeamIntensity(node: TreeNode): number { if (node.category === 'skills' && node.yearsOfExperience) { return Math.min(0.3 + (node.yearsOfExperience / 10) * 0.7, 1.0); } if (node.category === 'experience') return 0.7; if (node.category === 'origin') return 1.0; return 0.5; // projects and education }