# Native Theming Discussion
Notes from a quick followup discussion on native theming, what is done, what is missing, what needs to change.
## Native Modules
## Themes and Theme Providers
- how to attach custom info to our themes
- how to make it easy to convert - maybe our theme is a transport for your theme
```
// Layers this onto existing stuff
createRegistry(LPCThemeModule, 'LPC', invalidate)
LPC: { ... }
```
Questions:
- Do people actually create multiple themes
- Can we unify with fluent
```tsx
const myTheme = createTheme / loadTheme
<ThemeProvider theme={myTheme}>
```
```
.. ThemingModuleHelper.getPlatformThemeDefinition();
<ThemeProvider registry={...} theme={...} />
```
Proposal: Themes as recipes
All themes are produced by
1. get parent theme
2. get partial via direct, or function, or native module invocation
3. merge parent & partial => full theme
4. repeat 1-3 indefinitely at any step
Make theme transformations arrays
```ts
registry.setTheme(name: string, ...defs: ()[])
```
-- Theme chaining
```ts
type ThemeRef = {
child: (creationStuff)
inner: Theme
}
const myTheme = createNativeTheme('TaskBar').child(doLPCMods())
const myTheme = createTheme(something).child(
// load native module stuff
).child(
// do some more
);
```
## Global Tokens, Alias Tokens, Component Tokens
## CSS Variable Approach
### Codemod - turn theme into keys
```ts
colors: {
buttonBackground: string
};
typography: {
}
type Keys = 'colors.buttonBackground' | `colors.buttonText` ...
```
### Reference theme values by key
Goal to write tokens like:
```ts
const Button = compose({
tokens: [
{
backgroundColor: Var('componentValues.buttonBackground', Var('colors.neutral3', 'gray'))
}
]
})
```
in enable css var mode
```ts
backgroundColor: `var(--componentValues-buttonBackground, var(--colors.neutral3, gray))`
```
in native or non-css mode
```ts
function Var(key: ThemeKeys, fallback): (theme: ITheme) => {
}
```
A theme might look like:
```ts
interface ITheme = {
// these get specified
colors: {
neutral
...
},
// these are only specified for customization
otherStuff: {
buttonBackground?:
}
}
```
```
Theme Theme ??
buttonRootFillRest -> NeutralFill -> Gray80 -> #F3f3f3
stable... ? ?????
```