変数の型
テーマAPIを有効にするには、StyleX Babel設定でunstable_moduleResolution
オプションを有効にする必要があります。
変数の型を宣言することは、高度なユースケースです。ほとんどのユースケースでは必要ありません。
デフォルトでは、変数の値は文字列です。これはほとんどのユースケースで正しい選択です。しかし、最新のブラウザではCSS変数の型を定義することがサポートされています。変数は、変数の`
これにより、CSSでは不可能だった興味深いユースケースを実現できます。いくつかの例を以下に示します。
- 角度または色の変数をアニメーション化することで、グラデーションをアニメーション化します。
- 要素上の`1em`の値を取得し、子孫要素で使用します。
- 浮動小数点数を整数に変換します。
API
StyleXで変数に型を割り当てるには、`stylex.types.color`や`stylex.types.length`などの様々な関数を使用できます。
使用可能な関数の完全なリストについては、APIドキュメントを参照してください。
使用方法
変数に型を割り当てるには、変数の値を適切な型関数でラップできます。
例えば、次の変数のセットを考えてみましょう。
import * as stylex from '@stylexjs/stylex';
export const tokens = stylex.defineVars({
primaryText: 'black',
secondaryText: '#333',
borderRadius: '4px',
angle: '0deg',
int: '2',
});
現在、すべての値は任意の文字列です。変数に型を割り当てるには、適切な型関数でラップできます。
import * as stylex from '@stylexjs/stylex';
export const tokens = stylex.defineVars({
primaryText: stylex.types.color('black'),
secondaryText: stylex.types.color('#333'),
borderRadius: stylex.types.length('4px'),
angle: stylex.types.angle('0deg'),
int: stylex.types.integer(2),
});
条件付き値
値内でatルールを使用する場合でも、使い方は変わりません。以下は完全に有効です。
import * as stylex from '@stylexjs/stylex';
export const colors = stylex.defineVars({
primaryText: stylex.types.color({default: 'black', [DARK]: 'white'}),
});
ソースコードにおける型安全性
`stylex.types.*`関数の主な利点は、生成されたCSSで変数の型を宣言することで機能を有効にすることです。しかし、StyleX APIは独自のコードベース内の型安全性を向上させる効果もあります。
`stylex.defineVars`内で特定の型で変数が宣言されている場合、静的型は`stylex.createTheme`呼び出し内で変数がテーマ化されるときに、同じ型関数が使用されることを強制します。
import * as stylex from '@stylexjs/stylex';
import {tokens} from './tokens.stylex.js';
export const highContrast = stylex.createTheme(tokens, {
primaryText: stylex.types.color('black'),
secondaryText: stylex.types.color('#222'),
borderRadius: stylex.types.length('8px'),
angle: stylex.types.angle('0deg'),
int: stylex.types.integer(4),
});
変数の型は既に`stylex.defineVars`呼び出し内で宣言されているため、`stylex.createTheme`内の型関数を使用することは機能的には何もしませんが、型安全のために静的型によって必要とされます。
ユースケースの例
`round()`のシミュレーション
最新のブラウザでは、CSSで`round()`関数がサポートされ始めています。しかし、この機能は`integer`型の変数を使用してシミュレートできます。
const styles = stylex.create({
gradient: {
// Math.floor
[tokens.int]: `calc(16 / 9)`
// Math.round
[tokens.int]: `calc((16 / 9) + 0.5)`
},
})
`tokens.int`は`integer`型で宣言されているため、値が割り当てられるたびに、小数点以下の値は切り捨てられ、値は整数型に変換されます。
グラデーションのアニメーション
通常、グラデーションをアニメーション化することはできません。しかし、型付きの`angle`変数を使用することで、その中で使用される角度をアニメーション化することで、グラデーションをアニメーション化できます。
通常のCSSプロパティをアニメーション化する代わりに、`angle`変数を`stylex.keyframes`でアニメーション化できます。
import * as stylex from '@stylexjs/stylex';
import {tokens} from './tokens.stylex';
const rotate = stylex.keyframes({
from: { [tokens.angle]: '0deg' },
to: { [tokens.angle]: '360deg' },
});
const styles = stylex.create({
gradient: {
backgroundImage: `conic-gradient(from ${tokens.angle}, ...colors)`,
animationName: rotate,
animationDuration: '10s',
animationTimingFunction: 'linear',
animationIterationCount: 'infinite',
},
})
これを使用して、回転する円錐グラデーションを作成できます。