$folder, 'color'=>$map[$folder] ?? null]; } /** Migrate color entries for a whole subtree (used by move/rename) */ public static function migrateSubtree(string $source, string $target): array { $src = self::normalizeFolder($source); $dst = self::normalizeFolder($target); if ($src === 'root') return ['changed'=>false, 'moved'=>0]; $map = self::getMap(); if (!$map) return ['changed'=>false, 'moved'=>0]; $new = $map; $moved = 0; foreach ($map as $key => $hex) { $isSelf = ($key === $src); $isSub = str_starts_with($key.'/', $src.'/'); if (!$isSelf && !$isSub) continue; unset($new[$key]); $suffix = substr($key, strlen($src)); // '' or '/child/...' $newKey = $dst === 'root' ? ltrim($suffix,'/') : rtrim($dst,'/') . $suffix; $new[$newKey] = $hex; $moved++; } if ($moved) self::writeMap($new); return ['changed'=> (bool)$moved, 'moved'=> $moved]; } }