Inherited storage - proxy pattern confusion

I'm reading this guide from open zeppelin labs about using inherited storage in proxy contracts.

More information is also given in the Github write up.
"Then, each token behavior defines all the necessary state variables to carry out their storage."

Why should each logic contract define all the necessary state variables within the logic contract?
From my understanding when a proxy delegatecalls a function in a logic contract, the function is executed in the context of the proxy. i.e. It uses the storage (and only this storage) of the proxy, the same msg.sender and msg.value.

Hence a logic contract will never be able to interact with any storage declared within its contract.

Is this write up saying that logic contracts can access the proxy storage and also its own storage?

Any help would be much appreciated.