# Customizations — Feature Spec Each section describes one Lukas-feature: what it does, how it works, where the code lives, and known limitations. ## 1. Current-page highlighting in 3D Graph **What:** When you open a file, the corresponding node in the 3D Graph becomes brighter and larger. Nodes that the open file links to (via `[[wikilinks]]`) also brighten. All other nodes dim. **How:** 1. `HermesCustom.getCurrentFile()` reads the file path from `?file=` URL param (preferred) or tracks via the `loadFile()` hook 2. `HermesCustom.getConnectedFiles(currentFile)` looks up outgoing edges in the global graph data 3. `HermesCustom.highlightCurrentNode()` iterates `window.graphNodeObjects` (obv's Three.js node meshes) and adjusts `material.color`, `emissive`, `scale`, `opacity` **Code:** `vault-custom.js`, methods under namespace `HermesCustom.*`. **Materials used (Catppuccin palette, matches theme):** - Current: `#FFD700` (gold) + emissive glow + 1.5x scale - Connected: `#89b4fa` (light blue) + faint emissive + 1.1x scale - Other: `#313244` (muted) + 20% opacity (transparent) **Known limitation:** - Uses `window.graphNodeObjects` global from obv — if obv renames this, we need to update. Mitigation: detection in `highlightCurrentNode` waits up to 500ms for obv's graph to be ready. - Highlight doesn't preserve selection across page reload — fresh fetch on every load. ## 2. Click-to-navigate on 3D Graph **What:** Clicking a node in the 3D Graph navigates to that file's page. **How:** 1. `HermesCustom.setupGraphClickHandler()` sets up a Three.js Raycaster on the canvas DOM element 2. On click, computes normalized mouse coords, raycasts into scene 3. First intersection's `userData.nodeId` is the file path 4. Calls `window.loadFile(nodeId)` (obv's existing loader) 5. Updates URL with `window.history.pushState({}, '', '?file=')` **Code:** `vault-custom.js`, ~25 lines. **Known limitation:** - Three.js raycasting requires nodes to have `userData.nodeId` set — verified in obv's `addNodeToScene` function (line ~310 in obv's graph render). If obv removes this, our handler silently does nothing. - No keyboard navigation in graph (yet). Roadmap item. ## 3. Responsive Layout **What:** The 3-panel desktop layout collapses gracefully on smaller screens. **Breakpoints:** - **Desktop (≥1024px):** Full 3-panel layout — Tree 240px | Content 1fr | Graph 240px - **Tablet (768px–1023px):** Tree 240px | Content 1fr | Graph 200px (bottom panel) - **Mobile (<768px):** Tree as hamburger menu (off-canvas, slides in from left) | Content full-width | Graph hidden **How:** - `HermesCustom.injectResponsiveCSS()` adds `