## Legacy Token Defaults Generator

> [!WARNING]
> This legacy tool is deprecated. It only targets the frozen SDK Material library
> under `packages/flutter/lib/src/material`, and should not be used for new
> Material defaults work.

Active Material defaults generation has moved to the standalone `material_ui`
package in the `flutter/packages` repository. Use
[`packages/material_ui/tool/gen_defaults`](https://github.com/flutter/packages/tree/main/packages/material_ui/tool/gen_defaults)
there instead.

## Legacy Usage
Run this program from the root of the git repository:
```sh
dart dev/tools/gen_defaults/bin/gen_defaults.dart [-v]
```

This updates `generated/used_tokens.csv` and the frozen SDK Material component
theme files.

## Templates

There is a template file for every component that needs defaults from
the token database. These templates are implemented as subclasses of
`TokenTemplate`. This base class provides some utilities and a structure
for adding a new block of generated code to the bottom of a given file.

Templates need to override the `generate` method to provide the generated
code block as a string.

See `lib/fab_template.dart` for an example that generates defaults for the
Floating Action Button.

## Tokens

Tokens are stored in JSON files in `data/`, and are sourced from
an internal Google database.

`template.dart` should provide nearly all useful token resolvers
(e.g. `color`, `shape`, etc.). For special cases in which one shouldn't
be defined, use `getToken` to get the raw token value. The script, through
the various revolvers and `getToken`, validates tokens, keeps track of
which tokens are used, and generates `generated/used_tokens.csv`.
