cbc7cd0808
* Add fontScale, gate it, fix some computes * Add inter, integrate * Clean up * Apply to old Text component * Use numeric weight * Cleanup * Clean up appearance settings * Global tracking * Fix regular italic variant * Refactor settings and fontScale values * Remove flags * Get rid of lower weight font usage * Remove gate from settings * Refactor appearance settings for reuse * Add neue type nux * Update defaults * Load fonts, add fallback families * Load fonts via plugin in production * Fixes * Fix for web * Nits --------- Co-authored-by: Hailey <me@haileyok.com>
#/storage
Usage
Import the correctly scoped store from #/storage. Each instance of Storage
(the base class, not to be used directly), has the following interface:
set([...scope, key], value)get([...scope, key])remove([...scope, key])removeMany([...scope], [...keys])
For example, using our device store looks like this, since it's scoped to the
device (the most base level scope):
import { device } from '#/storage';
device.set(['foobar'], true);
device.get(['foobar']);
device.remove(['foobar']);
device.removeMany([], ['foobar']);
TypeScript
Stores are strongly typed, and when setting a given value, it will need to
conform to the schemas defined in #/storage/schema. When getting a value, it
will be returned to you as the type defined in its schema.
Scoped Stores
Some stores are (or might be) scoped to an account or other identifier. In this case, storage instances are created with type-guards, like this:
type AccountSchema = {
language: `${string}-${string}`;
};
type DID = `did:${string}`;
const account = new Storage<
[DID],
AccountSchema
>({
id: 'account',
});
account.set(
['did:plc:abc', 'language'],
'en-US',
);
const language = account.get([
'did:plc:abc',
'language',
]);
Here, if ['did:plc:abc'] is not supplied along with the key of
language, the get will return undefined (and TS will yell at you).