A good semantic token system usually starts from reusable UI responsibilities: background, surface, text, muted text, border, primary action, secondary action, and feedback states.
Then the values behind those tokens can change per theme without forcing the whole codebase to rename classes or selectors.