Cette page a été traduite automatiquement et peut contenir des erreurs. Lire l'original en anglais

API

Référence des styles

Cette page liste chaque clé de la prop style, ainsi que la méthode de Styled qui la définit en Rust. Les composants Rust stylent les éléments avec des méthodes typées nommées d’après les utilitaires de Tailwind (.p_4(), .rounded(px(12.0)), .bg(color), depuis nsh_core::prelude), qui se réduisent aux mêmes clés ; TSX passe des objets style (et des classes). La colonne Rust indique la méthode ; la plupart acceptent une valeur, un signal ou une closure, et .style_when(…) / .style_with(…) rendent n’importe laquelle conditionnelle. Les clés et leurs types proviennent des déclarations générées dans .nsh/types/nsh/types.d.ts, si bien que votre éditeur les vérifie pendant la saisie. Une clé de style désigne la propriété CSS du même nom, comme la classe qui la définit : paddingLeft correspond à padding-left et pl-4 en CSS, boxShadow à box-shadow et shadow-md ; quelques clés prennent des noms plus simples, ceux qu’écrivent les applications (paddingHorizontal pour padding-inline, marginStart pour margin-inline-start, numberOfLines pour line-clamp). Les nombres sont des points, et les fonctionnalités CSS sont aussi présentes : grille, dégradés, ombres portées, filtres, modes de fusion, contours, transformations, transitions et animations par keyframes.

Pour savoir comment appliquer les styles, les combiner avec des classes et hériter des styles de texte, consultez Styles. Pour la syntaxe des classes, consultez la référence Tailwind.

#Les cinq interfaces

Chaque interface étend la précédente :

InterfaceÉtendUtilisée par
LayoutStyleMise en page de chaque élément (flexbox, grille, tailles, espacements, position)
ViewStyleLayoutStyle<View>, <Scroll>, <List>, les contrôles et tous les autres éléments
TextStyleViewStyle<Text> et <Input> (et les vues, dont les styles de texte passent au texte qu’elles contiennent)
InputStyleTextStyle<Input> : ajoute placeholderColor et caretColor
ImageStyleViewStyle<Image>
use nsh_core::prelude::*;

fn card() -> View {
    view().p_4().rounded(px(12.0)).bg(white()).shadow([BoxShadow {
        offset_y: px(4.0),
        blur: px(12.0),
        color: rgba(0x00000014).into(),
        ..BoxShadow::default()
    }])
}

fn title(label: &str) -> Text {
    text(label.to_string()).text_size(px(17.0)).font_weight(FontWeight::SEMIBOLD).text_color(rgb(0x111111))
}

card().child(title("Hello"))

style accepte aussi un tableau ; les entrées sont fusionnées de gauche à droite et les entrées falsy sont ignorées, ce qui évite d’utiliser la décomposition (spread) pour les styles conditionnels. En Rust, .style_when(condition, …) ajoute des styles tant que la condition est vraie :

card().style_when(selected, |s| s.border_color(rgb(0x2563eb)).border(px(2.0)))

#Comment lire les clés de style

Les clés de style suivent le CSS : un style et une classe qui désignent la même propriété produisent le même effet.

  • Direction de la mise en page. Une vue qui ne définit pas display dispose ses enfants en colonne. display: "flex" donne une ligne sauf si flexDirection est défini, comme en CSS et avec la classe flex. flexShrink vaut 0 sauf indication contraire.
  • Côtés physiques et logiques. left, right, marginLeft, paddingRight, borderLeftWidth, borderTopLeftRadius et textAlign: "left" conservent leur côté dans les mises en page de droite à gauche. Les clés de début et de fin (marginStart, paddingEnd, start, end, borderStartWidth, …), la famille borderTopStartRadius et textAlign: "start" | "end" suivent la direction : le début en ligne est la gauche dans les mises en page de gauche à droite et la droite dans celles de droite à gauche.
  • Couleurs de bordure. Une bordure ou un contour dont l’épaisseur est définie mais pas la couleur est dessiné avec la couleur du texte (currentColor en CSS).
  • Transformations. translate, rotate et scale sont des propriétés à part entière, et transform accepte la chaîne de fonctions CSS ou une liste d’étapes dont les valeurs peuvent être des valeurs animées. Elles se composent dans cet ordre : translate, rotate, scale, puis transform.

#Types de valeurs

TypeAccepteRust
numberPoints (indépendants de la densité). 1 vaut un point sur iOS et un dp sur Android.Points : px(16.0)
DimensionValuenumber (points), `${number}%` (du parent), ou "auto".Length : px(…), relative(0.5), auto()
LengthValuenumber (points) ou `${number}%`. Pas de "auto".DefiniteLength : px(…), relative(0.5)
ColorValueUne chaîne de couleur CSS : #rgb, #rgba, #rrggbb, #rrggbbaa, rgb(), rgba(), hsl(), hsla(), oklch(), oklab(), ou une couleur CSS nommée (black, white, transparent, rebeccapurple, …).Hsla / AdaptiveColor : rgb(0x2563eb), hsla(…), couleurs du thème (theme().primary)
EnvValueUne variable d’environnement dans un padding ou une marge : env(name), env(name, <length>) (la longueur remplace un nom inconnu), calc(env(name) + <length>) ou calc(<length> + env(name)). Les noms sont safe-area-inset-top, -right, -bottom, -left (Zone de sécurité) et keyboard-inset-height (Clavier). Acceptée par les clés physiques de padding et de marge et leurs raccourcis..p_safe_area(), .pt_safe_area_plus(px(8.0)), .pb_keyboard(), .mb_keyboard_plus(…), …
AnimatedNodeUne valeur animée native ou un nœud qui en dérive (voir l’API d’animation de nsh). Acceptée par opacity, backgroundColor, borderColor, color, translate, rotate, scale, les étapes d’une liste transform, et les top / left d’une vue sticky ; la valeur s’anime alors sur le thread UI sans JS.AnimatedValue / AnimatedNode, liée avec .bind_opacity(&v), .bind_background(&v), .bind_border_color(&v), .bind_color(&v), .bind_translate_x(&v), …

Les chaînes à syntaxe CSS (boxShadow, textShadow, backgroundImage, filter, gridTemplateColumns, …) acceptent des longueurs en px et des nombres sans unité (tous deux en points), en pt (4/3 de point, comme en CSS) ou en rem (16 points).

#LayoutStyle

La mise en page est calculée en Rust (flexbox et grille CSS). Une vue qui ne définit pas display est un conteneur flex dont les enfants s’empilent en colonne ; display: "flex" en fait une ligne sauf si flexDirection est défini, comme en CSS. Par défaut, les éléments ont flexShrink: 0, alignContent: "flex-start" (grilles : "normal" du CSS), alignItems: "stretch", et aucune taille minimale automatique. Voir Mise en page.

#Affichage et position

CléTypeRustDescription
display"flex" | "grid" | "block" | "flow-root" | "none".flex(), .grid(), .hidden()La mise en page des enfants. "flex" les dispose en ligne sauf si flexDirection définit une direction, comme en CSS ; une vue qui ne définit pas display les dispose en colonne. "none" retire l’élément de la mise en page et le masque. "block" empile les enfants comme le fait la mise en page de bloc CSS.
boxSizing"border-box" | "content-box"Les dimensions incluent les bordures et le padding, ou uniquement le contenu. Par défaut "border-box".
position"relative" | "absolute" | "static" | "fixed" | "sticky".relative(), .absolute()"absolute" sort l’élément du flux et le place avec top / right / bottom / left par rapport à son ancêtre positionné le plus proche (son parent, sauf si celui-ci est "static"). "static" reste dans le flux et ignore les décalages. "fixed" préserve le type de l’élément, le met en page et le monte dans sa surface ou sa racine modale, en le gardant en place pendant que le contenu environnant défile. "sticky" reste dans le flux et, tant que son parent est visible, se fixe à top (left dans une vue à défilement horizontal) depuis le début de la zone visible de la vue à défilement qui l’entoure, jusqu’à ce que sa fin rejoigne celle de la boîte de contenu de son parent ; il est dessiné au-dessus de ses frères du même zIndex. Par défaut "relative".
topDimensionValue | AnimatedNode.top(…), .inset(…), .bind_sticky_top(&node)Décalage depuis le bord supérieur du parent (absolute) ou depuis la position propre de l’élément (relative). Sur une vue sticky, l’endroit où elle se fixe, qu’une valeur animée déplace à chaque frame.
rightDimensionValue.right(…)Décalage depuis le bord droit, quelle que soit la direction.
bottomDimensionValue.bottom(…)Décalage depuis le bord inférieur.
leftDimensionValue | AnimatedNode.left(…), .bind_sticky_left(&node)Décalage depuis le bord gauche, quelle que soit la direction. Sur une vue sticky dans une vue à défilement horizontal, l’endroit où elle se fixe, qu’une valeur animée déplace à chaque frame.
startDimensionValueDécalage depuis le bord de début en ligne : gauche dans les mises en page de gauche à droite, droite dans celles de droite à gauche.
endDimensionValueDécalage depuis le bord de fin en ligne : droite dans les mises en page de gauche à droite, gauche dans celles de droite à gauche.
zIndexnumber.z_index(z)Ordre parmi les frères (stable pour des valeurs égales) ; c’est aussi l’ordre d’empilement natif.
direction"inherit" | "ltr" | "rtl"Direction de la mise en page, héritée par défaut. Comme en CSS, les propriétés left et right conservent leurs côtés de droite à gauche, tandis que celles de début / fin en ligne (marginStart, end, …) prennent les côtés que leur donne la direction.

#Flexbox

CléTypeRustDescription
flexDirection"row" | "column" | "row-reverse" | "column-reverse".flex_row(), .flex_col(), .flex_row_reverse(), .flex_col_reverse()L’axe principal. Par défaut "column" pour une vue qui ne définit pas display, "row" dès que display: "flex" est défini.
flexWrap"wrap" | "nowrap" | "wrap-reverse".flex_wrap()Indique si les enfants passent à la ligne sur plusieurs lignes. Par défaut "nowrap".
flexnumber.flex_1(), .flex_auto(), .flex_none()Un seul nombre, pas le raccourci CSS : un nombre positif lui fixe flexGrow, flexShrink: 1 et flexBasis: 0 ; 0 rend l’élément non flexible ; un nombre négatif le fait rétrécir jusqu’à sa taille minimale.
flexGrownumber.flex_grow(f)La part de l’espace libre que prend l’élément. Par défaut 0.
flexShrinknumber.flex_shrink(f), .flex_shrink_0()Le degré de rétrécissement de l’élément lorsque l’espace manque. Par défaut 0, et non 1 comme en CSS.
flexBasisDimensionValue.basis(…)La taille sur l’axe principal avant la répartition de l’espace libre.
justifyContent"flex-start" | "flex-end" | "start" | "end" | "center" | "space-between" | "space-around" | "space-evenly" | "stretch" | "normal".justify_start(), .justify_center(), .justify_end(), .justify_between(), .justify_around(), .justify_evenly()Répartition des enfants le long de l’axe principal. Par défaut "normal" : "flex-start" dans les conteneurs flex ; dans les grilles, les pistes dimensionnées auto s’étirent.
alignItems"flex-start" | "flex-end" | "start" | "end" | "self-start" | "self-end" | "center" | "stretch" | "baseline" | "normal".items_start(), .items_center(), .items_end(), .items_stretch(), .items_baseline()Alignement des enfants sur l’axe transversal. Par défaut "stretch".
alignSelf"auto" | "flex-start" | "flex-end" | "start" | "end" | "self-start" | "self-end" | "center" | "stretch" | "baseline" | "normal".self_start(), .self_center(), .self_end(), .self_stretch()Remplace le alignItems du parent pour cet élément.
alignContent"flex-start" | "flex-end" | "start" | "end" | "center" | "stretch" | "space-between" | "space-around" | "space-evenly" | "normal".content_start(), .content_center(), .content_between(), …Répartition des lignes enveloppées (et des pistes de grille) sur l’axe transversal. Par défaut "flex-start" dans les conteneurs flex et "normal" dans les grilles, où les pistes dimensionnées auto s’étirent. "start" / "end" suivent la direction d’écriture.
gapLengthValue.gap(…), .gap_4()Espace entre les lignes et les colonnes d’enfants.
rowGapLengthValue.gap_y(…)Espace entre les lignes.
columnGapLengthValue.gap_x(…)Espace entre les colonnes.

#Grille

Définissez display: "grid" pour disposer les enfants dans une grille CSS. Les listes de pistes utilisent la syntaxe CSS.

CléTypeRustDescription
gridTemplateColumnsstring.grid_template_columns(…), .grid_cols(n)Pistes de colonnes : "repeat(3, 1fr)", "200px 1fr", minmax(), auto-fill / auto-fit, noms de lignes ("[a] 40px [b c] 1fr [d]").
gridTemplateRowsstring.grid_template_rows(…), .grid_rows(n)Pistes de lignes, même syntaxe.
gridAutoColumnsstringTaille des colonnes créées implicitement.
gridAutoRowsstringTaille des lignes créées implicitement.
gridAutoFlow"row" | "column" | "dense" | "row dense" | "column dense".grid_flow_col(), .grid_flow_dense()Manière dont les éléments sans placement remplissent la grille.
gridColumnnumber | string.col_span(n), .col_span_full()Placement en colonne : "1 / 3", "span 2", un numéro de ligne ou un nom de ligne ("content-start / content-end", "2 col", "span col").
gridColumnStartnumber | string.col_start(…)Ligne de colonne de début.
gridColumnEndnumber | string.col_end(…)Ligne de colonne de fin.
gridRownumber | string.row_span(n), .row_span_full()Placement en ligne, même syntaxe que gridColumn.
gridRowStartnumber | string.row_start(…)Ligne de rangée de début.
gridRowEndnumber | string.row_end(…)Ligne de rangée de fin.
justifyItems"flex-start" | "flex-end" | "start" | "end" | "self-start" | "self-end" | "center" | "stretch" | "baseline" | "normal"Manière dont les éléments de grille se placent dans leurs zones le long de la ligne.
justifySelf"auto" | "flex-start" | "flex-end" | "start" | "end" | "self-start" | "self-end" | "center" | "stretch" | "baseline" | "normal"Remplace justifyItems pour cet élément.
view()
    .grid()
    .grid_template_columns("repeat(3, 1fr)")
    .gap_2()
    .child(view().col_span(2).h(px(60.0)).bg(rgb(0xc7d2fe)))
    .child(view().h(px(60.0)).bg(rgb(0xa5b4fc)))

#Taille

CléTypeRustDescription
widthDimensionValue.w(…), .w_full(), .size(…)Largeur.
heightDimensionValue.h(…), .h_full()Hauteur.
minWidthLengthValue.min_w(…)Largeur minimale.
minHeightLengthValue.min_h(…)Hauteur minimale.
maxWidthLengthValue.max_w(…)Largeur maximale.
maxHeightLengthValue.max_h(…)Hauteur maximale.
aspectRationumber | "auto" | "16 / 9".aspect_ratio(r), .aspect_square()Largeur divisée par hauteur, un nombre (1.5) ou le ratio CSS ("16 / 9") ; la dimension manquante est calculée à partir de l’autre. "auto" n’en définit aucun.

#Marges

Les marges acceptent "auto" (absorbe l’espace libre, comme en flexbox) et les valeurs négatives. Les clés physiques (toutes sauf marginStart / marginEnd) acceptent aussi un EnvValue : marginBottom: "env(keyboard-inset-height)" (en Rust .mb_keyboard(), .mt_safe_area(), …).

CléTypeRustDescription
marginDimensionValue | EnvValue.m(…), .m_4()Les quatre côtés.
marginHorizontalDimensionValue | EnvValue.mx(…)Gauche et droite.
marginVerticalDimensionValue | EnvValue.my(…)Haut et bas.
marginTopDimensionValue | EnvValue.mt(…)Haut.
marginRightDimensionValue | EnvValue.mr(…)Droite.
marginBottomDimensionValue | EnvValue.mb(…)Bas.
marginLeftDimensionValue | EnvValue.ml(…)Gauche.
marginStartDimensionValue.ms(…)Début en ligne : gauche dans les mises en page de gauche à droite, droite dans celles de droite à gauche.
marginEndDimensionValue.me(…)Fin en ligne : le côté opposé à marginStart.

#Padding

Les clés physiques (toutes sauf paddingStart / paddingEnd) acceptent aussi un EnvValue : paddingTop: "env(safe-area-inset-top)", paddingBottom: "calc(env(safe-area-inset-bottom) + 16px)" (en Rust .pt_safe_area(), .pb_safe_area_plus(px(16.0)), .pb_keyboard(), …). Un padding vaut au minimum 0.

CléTypeRustDescription
paddingLengthValue | EnvValue.p(…), .p_4()Les quatre côtés.
paddingHorizontalLengthValue | EnvValue.px(…)Gauche et droite.
paddingVerticalLengthValue | EnvValue.py(…)Haut et bas.
paddingTopLengthValue | EnvValue.pt(…)Haut.
paddingRightLengthValue | EnvValue.pr(…)Droite.
paddingBottomLengthValue | EnvValue.pb(…)Bas.
paddingLeftLengthValue | EnvValue.pl(…)Gauche.
paddingStartLengthValue.ps(…)Début en ligne : gauche dans les mises en page de gauche à droite, droite dans celles de droite à gauche.
paddingEndLengthValue.pe(…)Fin en ligne : le côté opposé à paddingStart.

#ViewStyle

Tout ce qui est dessiné par une vue. Toutes les clés de LayoutStyle s’appliquent aussi.

#Arrière-plan

CléTypeRustDescription
backgroundColorColorValue | AnimatedNode.bg(color), .bind_background(&node)La couleur de remplissage. Accepte une couleur animée native.
backgroundImagestring.bg_linear(angle), .bg_radial(), .bg_conic() avec .gradient_from / _via / _toDégradés CSS dessinés par-dessus la couleur d’arrière-plan : linear-gradient(...), radial-gradient(...), conic-gradient(...), plusieurs séparés par des virgules.
view().h(px(120.0)).rounded(px(16.0)).bg_linear(deg(135.0)).gradient_from(rgb(0x6366f1)).gradient_to(rgb(0xec4899))

#Bordures

CléTypeRustDescription
borderWidthnumber.border(w), .border_1(), .border_2()Épaisseur des quatre côtés.
borderTopWidthnumber.border_t(w)Côté supérieur.
borderRightWidthnumber.border_r(w)Côté droit.
borderBottomWidthnumber.border_b(w)Côté inférieur.
borderLeftWidthnumber.border_l(w)Côté gauche.
borderStartWidthnumber.border_s(w)Côté de début en ligne (gauche dans les mises en page de gauche à droite, droit dans celles de droite à gauche).
borderEndWidthnumber.border_e(w)Côté de fin en ligne.
borderColorColorValue | AnimatedNode.border_color(c), .bind_border_color(&node)Couleur des quatre côtés. Accepte une couleur animée native.
borderTopColorColorValue.border_t_color(c)Côté supérieur.
borderRightColorColorValue.border_r_color(c)Côté droit.
borderBottomColorColorValue.border_b_color(c)Côté inférieur.
borderLeftColorColorValue.border_l_color(c)Côté gauche.
borderStartColorColorValue.border_s_color(c)Côté de début en ligne.
borderEndColorColorValue.border_e_color(c)Côté de fin en ligne.
borderStyle"solid" | "dashed" | "dotted" | "none" | "hidden".border_solid(), .border_dashed(), .border_dotted(), .border_none()Style de trait. Par défaut "solid". "none" et "hidden" ne dessinent ni ne réservent aucune bordure dans la mise en page, quelles que soient les épaisseurs, définies avant ou après, comme en CSS.

Un côté dont l’épaisseur est définie et dont la couleur n’est définie par rien est dessiné avec la couleur du texte, le currentColor de CSS : { borderWidth: 1, color: "#2563eb" } dessine une bordure bleue. Les contours prennent la couleur du texte de la même façon.

#Coins

CléTypeRustDescription
borderRadiusnumber.rounded(r), .rounded_lg()Rayon des quatre coins.
borderTopLeftRadiusnumber.rounded_tl(r)Coin supérieur gauche.
borderTopRightRadiusnumber.rounded_tr(r)Coin supérieur droit.
borderBottomRightRadiusnumber.rounded_br(r)Coin inférieur droit.
borderBottomLeftRadiusnumber.rounded_bl(r)Coin inférieur gauche.
borderTopStartRadiusnumber.rounded_ss(r)Coin supérieur du côté de début en ligne.
borderTopEndRadiusnumber.rounded_se(r)Coin supérieur du côté de fin en ligne.
borderBottomStartRadiusnumber.rounded_es(r)Coin inférieur du côté de début en ligne.
borderBottomEndRadiusnumber.rounded_ee(r)Coin inférieur du côté de fin en ligne.
borderCurve"circular" | "continuous".border_curve(curve)"continuous" : coins dont la courbure se fond progressivement dans les bords, comme les icônes d’app iOS. Lorsque la boîte est trop petite, la courbe redevient circulaire, de sorte que les pilules restent des pilules. Fonctionne sur les deux plateformes.

#Contour

Un contour est dessiné à l’extérieur de la bordure et ne prend aucune place dans la mise en page.

CléTypeRustDescription
outlineWidthnumber.outline(w)Épaisseur du trait.
outlineColorColorValue.outline_color(c)Couleur du trait. Par défaut, la couleur du texte.
outlineStyle"solid" | "dashed" | "dotted" | "none" | "hidden".outline_dashed(), .outline_dotted(), .outline_none()Style de trait.
outlineOffsetnumber.outline_offset(o)Distance depuis le bord de la bordure ; les valeurs négatives le déplacent vers l’intérieur.

#Ombres

Une vue projette des ombres avec le boxShadow de CSS : plusieurs couches, ombres avec étalement et ombres internes. Les transitions l’animent (transitionProperty: "boxShadow").

CléTypeRustDescription
boxShadowstring | BoxShadowLayer[].shadow([BoxShadow { … }]), .shadow_md(), .shadow_color(c)box-shadow CSS : décalages, flou, étalement et couleur, plusieurs couches séparées par des virgules, inset pour les ombres internes ; ou ses couches sous forme de nombres, [{ x, y, blur, spread, color, inset }] (seuls x et y sont requis) ; une couche sans couleur est dessinée avec la couleur du texte, comme le currentColor de CSS. .shadow_color(c) recolore les couches d’un préréglage ou de .shadow(…).
view().p_4().rounded(px(12.0)).bg(white()).shadow([
    BoxShadow { offset_y: px(1.0), blur: px(2.0), color: rgba(0x0000000f).into(), ..BoxShadow::default() },
    BoxShadow { offset_y: px(8.0), blur: px(24.0), spread: px(-4.0), color: rgba(0x0000001f).into(), ..BoxShadow::default() },
])

#Opacité, visibilité et débordement

CléTypeRustDescription
opacitynumber | AnimatedNode.opacity(o), .bind_opacity(&value)De 0 (invisible) à 1. Accepte une valeur animée native.
visibility"visible" | "hidden" | "collapse"Les vues masquées conservent leur espace dans la mise en page (contrairement à display: "none").
overflow"visible" | "hidden".overflow_hidden()"hidden" rogne les enfants aux limites de la vue (et à ses coins).
backfaceVisibility"visible" | "hidden".backface_hidden(), .backface_visible()"hidden" : invisible lorsqu’une rotation 3D la détourne.
verticalAlign"baseline" | "text-top" | "text-bottom" | "middle".align_baseline(), .align_text_top(), .align_text_bottom(), .align_middle()Où une vue ou une image à l’intérieur d’un <Text> se place dans sa ligne, comme le vertical-align de CSS : son bas sur la ligne de base (par défaut), son haut ou son bas au haut ou au bas de la police du texte, ou son milieu à la moitié de la hauteur d’x au-dessus de la ligne de base. La ligne s’agrandit pour l’accueillir.

#Transformations

Les transformations sont celles de CSS : les propriétés translate, rotate et scale puis transform, composées dans cet ordre. Chacune est une propriété à part entière, donc le scale d’un style remplace le scale-* d’une classe et conserve son rotate-*, et le transform d’un style remplace les fonctions de transformation d’une classe (rotate-x-*, skew-*).

CléTypeRustDescription
translatestring | number | AnimatedNode | [x, y].translate_x(…), .translate_y(…) ; .bind_translate_x(&v), .bind_translate_y(&v)translate de CSS : x, puis y ("10px 20px" ; pourcentages de la taille propre de la vue, "-50% 0"). Un nombre correspond à des points le long de x. [x, y] accepte un nombre, une chaîne ("50%", "10px") ou une valeur animée par axe ; une valeur animée seule la déplace le long de x.
rotatestring | number | AnimatedNode.rotate(deg(…)) ; .bind_rotate(&v)rotate de CSS : "45deg", "0.5turn", ou autour d’un axe, "x 90deg". Un nombre, comme une valeur animée, représente des degrés autour de z, dans le sens horaire.
scalestring | number | AnimatedNode | [x, y].scale(f), .scale_x(f), .scale_y(f) ; .bind_scale(&v)scale de CSS : 1.5, "150%", x et y ("1 2"). Une valeur animée met à l’échelle les deux axes ; [x, y] accepte un nombre ou une valeur animée par axe.
transformstring | TransformStep[].rotate_x(…), .rotate_y(…), .skew_x(…), .skew_y(…), .transform_none() ; étapes animées : .bind_transform(kind, &v), .bind_motion(&m) (après toutes les transformations du style)transform de CSS : "translateX(10px) rotate(45deg) scale(1.5)", ou "none". Fonctions : translate(), translateX(), translateY(), scale(), scaleX(), scaleY(), rotate() / rotateZ(), rotateX(), rotateY(), skew(), skewX(), skewY(), perspective(). Les longueurs acceptent px (les translations aussi %, de la taille propre de la vue), les angles deg, rad ou turn. Ou une liste d’étapes dont les quantités peuvent être des valeurs animées : ce que la chaîne ne peut pas contenir, comme une rotation 3D animée ([{ perspective: 800 }, { rotateY: angle }]), et les canaux d’un mouvement (m.transform). Le transform d’un style prend l’une ou l’autre forme, donc une perspective placée avant des étapes animées est elle-même une étape de la liste. Appliquée après translate, rotate et scale.
transformOriginstring | (number | string)[].transform_origin(…), .origin_top_left(), …Le point autour duquel agissent les transformations : mots-clés, pourcentages et longueurs ("top left", "50% 0", [10, 20]). Par défaut, le centre.

Une TransformStep est un objet à une seule clé, appliquée dans l’ordre de la liste :

ÉtapeValeurAnimée nativement
translateX, translateYnumber (points)oui
scale, scaleX, scaleYnumber (facteur)oui
rotate, rotateZ, rotateX, rotateYnumber (degrés) ou string ("45deg", "0.5rad")oui
skewX, skewYnumber (degrés) ou stringnon
perspectivenumber (points)non
view().perspective(px(600.0)).child(view().rotate_y(deg(20.0)).scale(0.95))

Une valeur animée pilote directement translate, rotate et scale, ainsi que les étapes d’une liste transform :

const x = createAnimatedValue(0);
const angle = createAnimatedValue(0);

<View style={{ translate: [x, 0], rotate: angle }} />
<View style={{ transform: [{ perspective: 800 }, { rotateY: angle }] }} />

#Filtres et fusion

CléTypeRustDescription
filterstring.blur(r), .brightness(…), .contrast(…), .grayscale(…), .hue_rotate(…), .invert(…), .saturate(…), .sepia(…)Filtres CSS de la vue et de son contenu : brightness(), contrast(), grayscale(), hue-rotate(), invert(), saturate(), sepia(), opacity(), blur(), drop-shadow().
backdropFilterstring.backdrop_blur(r), .backdrop_brightness(…), …Filtres CSS de ce qui se trouve derrière la vue, comme "blur(10px)" pour un effet de verre dépoli.
maskImagestringUn dégradé CSS dont l’alpha décide de la part de la vue qui est dessinée, entièrement là où il est opaque et pas du tout là où il est transparent : linear-gradient(...), radial-gradient(...), conic-gradient(...). Masque tout ce que la vue dessine, y compris son filtre d’arrière-plan.
glassEffect"none" | "regular" | "clear".glass_effect(GlassEffect::Regular)Liquid Glass derrière le contenu de la vue sur iOS 26 et macOS 26 et versions ultérieures. "regular" utilise le matériau standard ; "clear" prend moins de couleur à l’arrière-plan. "none" est la valeur par défaut. À associer à backdropFilter pour le flou affiché sur les versions antérieures d’iOS et sur les autres plateformes.
mixBlendMode"normal" | "multiply" | "screen" | "overlay" | "darken" | "lighten" | "color-dodge" | "color-burn" | "hard-light" | "soft-light" | "difference" | "exclusion" | "hue" | "saturation" | "color" | "luminosity" | "plus-darker" | "plus-lighter".mix_blend_mode(mode)Comment la vue se fond avec ce qui se trouve derrière elle.

#Transitions

Lorsqu’une propriété dotée d’une transition change (à partir d’un nouveau style, d’une classe ou d’une variante telle que active:), la plateforme l’anime nativement. Aucun JS ne s’exécute pendant l’animation.

CléTypeRustDescription
transitionPropertystring.transition(), .transition_all(), .transition_colors(), .transition_opacity(), .transition_shadow(), .transition_transform(), .transition_none()Propriétés à animer, séparées par des virgules : "all", "colors" (color, backgroundColor, borderColor, …), "opacity", "transform" (toutes les propriétés de transformation), "boxShadow", "borderRadius", "borderWidth", ou "none".
transitionDurationnumber | "${number}ms" | "${number}s".duration(ms)Millisecondes sous forme de nombre, ou "150ms" / "0.2s".
transitionDelaynumber | "${number}ms" | "${number}s".delay(ms)Délai avant le début de la transition.
transitionTimingFunction"linear" | "ease" | "ease-in" | "ease-out" | "ease-in-out" | "cubic-bezier(...)".ease_linear(), .ease_in(), .ease_out(), .ease_in_out(), .ease_bezier(…)La courbe d’accélération.
view()
    .on_press(move || open.update(|o| *o = !*o))
    .h(move || px(if open.get() { 160.0 } else { 56.0 }))
    .opacity(move || if open.get() { 1.0 } else { 0.8 })
    .transition()
    .duration(200.0)

#Animations par images clés

Animations par images clés intégrées, exécutées nativement (animate-* de Tailwind).

CléTypeRustDescription
animationName"none" | "spin" | "ping" | "pulse" | "bounce".animate_spin(), .animate_ping(), .animate_pulse(), .animate_bounce(), .animate_none()L’animation.
animationDurationnumber | "${number}ms" | "${number}s".animation(KeyframeAnimation { … })Durée d’une itération.
animationDelaynumber | "${number}ms" | "${number}s".animation(KeyframeAnimation { … })Délai avant la première itération.
animationTimingFunction"linear" | "ease" | "ease-in" | "ease-out" | "ease-in-out" | "cubic-bezier(...)".animation(KeyframeAnimation { … })La courbe d’accélération.
animationIterationCountnumber | "infinite".animation(KeyframeAnimation { … })Nombre d’exécutions.

Pour les animations pilotées par des valeurs, des gestes ou des ressorts, utilisez plutôt l’API d’animation de nsh.

#Pointeur et sélection

CléTypeRustDescription
cursor"auto" | "default" | "pointer" | "text" | "grab" | "grabbing" | "not-allowed" | ... (tous les mots-clés de curseur CSS, et "none").cursor(Cursor), .cursor_pointer()La forme du pointeur au-dessus de la vue, pour les pointeurs (trackpads d’iPad, Mac Catalyst, ordinateurs de bureau). Les mots-clés de redimensionnement diagonal gardent leur axe : nwse-resize / nw-resize / se-resize (Cursor::NwseResize) et nesw-resize / ne-resize / sw-resize (Cursor::NeswResize). Windows, Linux, Android, le web et GPUI affichent des curseurs diagonaux ; AppKit les utilise sur macOS 15+, avec une main ouverte sur macOS 14. UIKit utilise des effets de pointeur sur iPad et Mac Catalyst.
pointerEvents"auto" | "none" | "box-none" | "box-only".pointer_events(PointerEvents::BoxNone)Quels contacts tactiles la vue et les vues qu’elle contient reçoivent (pointer-events-none, pointer-events-auto). "none" : aucun, y compris pour les vues qu’elle contient, sauf si l’une d’elles définit "auto", hérité comme en CSS. "box-none" : aucun sur la vue elle-même, les vues qu’elle contient reçoivent les leurs ; "box-only" : la vue elle-même les reçoit, les vues qu’elle contient n’en reçoivent aucun (les deux sont ceux de React Native, pour la vue seule). Par défaut "auto". Voir toucher et gestes.
userSelect"auto" | "none" | "text".select_text(), .select_none()Indique si un <Text> peut être sélectionné et copié ("text", select-text) ou non ("none", select-none) ; la valeur d’une vue s’étend aux textes qu’elle contient qui n’en définissent aucune. "auto" (select-auto), la valeur par défaut, s’en remet à la vue englobante, sinon à la plateforme. Voir texte.

#Peinture SVG

Les propriétés de peinture CSS des formes SVG, que tout élément accepte et dont héritent les éléments qu’il contient, comme dans un navigateur. Elles peignent ce que les composants Rust dessinent sur des canevas.

CléTypeRustDescription
fill"none" | "currentColor" | ColorValue.fill_color(c), .fill_none(), .fill_current()Ce dont les formes sont remplies ; currentColor est la couleur du texte de l’élément.
stroke"none" | "currentColor" | ColorValue.stroke_color(c), .stroke_none(), .stroke_current()Ce avec quoi les contours des formes sont peints.
strokeWidthnumber | string.stroke_width(w)L’épaisseur de ces contours, une longueur (1 par défaut).
strokeDasharraynumber | string—Tirets et espaces le long de ces contours : longueurs séparées par des espaces ou des virgules ("4 2"), une liste de longueur impaire est répétée, ou "none".

#TextStyle

Les styles de texte s’appliquent à <Text> et <Input>. Ils sont aussi hérités, comme en CSS : les propriétés de texte définies sur une vue passent aux textes et aux champs de saisie qu’elle contient, et les spans <Text> imbriqués héritent de leur texte parent. Toutes les clés de ViewStyle s’appliquent aussi. Voir Texte.

#Police

CléTypeRustDescription
colorColorValue | AnimatedNode.text_color(c), .bind_color(&node)Couleur du texte. Accepte une couleur animée native. C’est aussi la couleur des bordures et des contours qui n’en définissent aucune.
fontSizenumber.text_size(s), .text_sm(), .text_lg(), …Taille en points.
fontWeight"normal" | "bold" | number | "${number}".font_weight(FontWeight::SEMIBOLD)"normal" (400), "bold" (700) ou 100–900.
fontFamilystring.font_family(name)Une famille système, ou le nom auquel s’évalue une police importée (import Inter from "./Inter.ttf"), ou une liste de familles, la plus préférée en premier ("Brand, 'Noto Sans SC', sans-serif"). Voir Polices.
fontStyle"normal" | "italic".italic()Italique.
fontVariantFontVariantName[] | string.small_caps(), .oldstyle_nums(), .lining_nums(), .tabular_nums(), .proportional_nums()Formes OpenType des chiffres et des lettres, une liste (["tabular-nums"]) ou les noms CSS séparés par des espaces ("tabular-nums small-caps"). tabular-nums garde les chiffres à la même largeur, utile pour les compteurs et les minuteurs.

#Espacement et alignement

CléTypeRustDescription
lineHeightnumber.line_height(h)Hauteur de ligne en points.
letterSpacingnumber.letter_spacing(s)Espace supplémentaire entre les caractères, en points.
textAlign"auto" | "left" | "center" | "right" | "justify" | "start" | "end".text_left(), .text_center(), .text_right(), .text_justify()Alignement horizontal. "left" et "right" conservent leur côté dans les mises en page de droite à gauche ; "start" et "end" suivent la direction.
writingDirection"auto" | "ltr" | "rtl".writing_direction(d)Direction de base du texte ; "auto" la déduit du contenu.
textTransform"none" | "uppercase" | "lowercase" | "capitalize".uppercase(), .lowercase(), .capitalize(), .normal_case()Transformation de la casse.

#Lignes et débordement

CléTypeRustDescription
numberOfLinesnumber.number_of_lines(n), .truncate()Le nombre maximal de lignes qu’affiche un <Text> (line-clamp, line-clamp-* en CSS) ; 0 (line-clamp-none), la valeur par défaut, les affiche toutes. truncate correspond à une seule ligne coupée par une ellipse.
textOverflow"ellipsis" | "clip" | "ellipsis-start" | "ellipsis-middle".text_overflow(EllipsizeMode::Middle)Façon dont un <Text> limité est coupé : une ellipse à la fin ("ellipsis", text-ellipsis, valeur par défaut), un rognage ("clip", text-clip), ou l’ellipse au début ou au milieu (chemins de fichiers).

#Décoration

CléTypeRustDescription
textDecorationLine"none" | "underline" | "line-through" | "underline line-through".underline(), .line_through(), .no_underline()Lignes tracées avec le texte.
textDecorationColorColorValue.text_decoration_color(c)Couleur des lignes (par défaut, la couleur du texte).
textDecorationStyle"solid" | "double" | "dotted" | "dashed" | "wavy".text_decoration_solid(), _double(), _dotted(), _dashed(), _wavy()Style de ligne.
textDecorationThicknessnumber | "auto" | "from-font".text_decoration_thickness(t)Épaisseur de la ligne.
textUnderlineOffsetnumber | "auto".underline_offset(o)Distance du soulignement à la ligne de base.

#Placeholder, curseur et sélection

placeholderColor et caretColor appartiennent à InputStyle, le style de <Input> ; selectionColor appartient à TextStyle, car les textes sélectionnables l’acceptent aussi.

CléTypeRustDescription
placeholderColorColorValue.placeholder_color(c) d’un inputLa couleur du placeholder d’un <Input> (placeholder:text-*).
textAlignVertical"auto" | "top" | "center" | "bottom"Emplacement d’un texte plus court que sa boîte (un <Text> avec une hauteur).
selectionColorColorValue.selection_color(c) d’un input ou d’un texteLa surbrillance de sélection et les poignées d’un <Input> ou d’un <Text> sélectionnable (selection:bg-*) ; par défaut, la couleur d’accent de la plateforme. Sur iOS, également le curseur d’un input, sauf si caretColor est défini (UIKit teinte les deux avec une seule couleur).
caretColorColorValue.caret_color(c) d’un inputLe curseur d’un <Input> (caret-*) ; la valeur par défaut de la plateforme si non défini.

#Ombre du texte

CléTypeRustDescription
textShadowstring | TextShadowLayer[].text_shadow([TextShadow { … }]), .text_shadow_sm(), .text_shadow_color(c)text-shadow de CSS : décalages, flou et couleur ("0 1px 2px rgb(0 0 0 / 0.3)"), ou ses couches sous forme de nombres, [{ x, y, blur, color }] ; plusieurs couches sont dessinées comme la plus large ; une couche sans couleur est dessinée avec la couleur du texte ; "none".
text("Title").text_shadow([TextShadow {
    offset_y: px(1.0),
    radius: px(2.0),
    color: rgba(0x0000004d).into(),
    ..TextShadow::default()
}])

#ImageStyle

Toutes les clés de ViewStyle, plus :

CléTypeRustDescription
tintColorColorValue.tint_color(c) d’une imageRecolore une image modèle (chaque pixel opaque prend cette couleur), pour les icônes monochromes.
objectFit"fill" | "contain" | "cover" | "none" | "scale-down".object_fit(ResizeMode::Contain)object-fit de CSS : comment une image ou une vidéo s’adapte à sa boîte. "cover" la remplit et rogne, "contain" l’ajuste à l’intérieur, "fill" l’étire, "none" conserve la taille naturelle, "scale-down" vaut "none" ou "contain", selon la plus petite. Par défaut, les images couvrent leur boîte et les vidéos y sont contenues.
objectPositionstring.object_position(p), .object_top(), … d’une imagePosition de l’image dans sa boîte une fois dimensionnée par objectFit, comme object-position en CSS : mots-clés, pourcentages et longueurs ("top", "left bottom", "25% 75%", "right 10px bottom 20%"). Une image qui couvre sa boîte est rognée autour de cette position. Par défaut, le centre.

objectFit s’applique aussi à <Video> ; voir image et video.

#Props qui ressemblent à des styles

L’ombre Material d’Android est une prop de plateforme, définie à côté du style :

RéglagePropRustClasse
Ombre Material (Android)android={{ elevation }}.elevation(e)

#Voir aussi

  • Styling : style, class, héritage et priorité.
  • Tailwind reference : tous les utilitaires et variantes pris en charge.
  • Layout : flexbox et grid en pratique.
  • view, text, image : les éléments auxquels ces styles s’appliquent.

width, height et flexBasis acceptent également "min-content", "max-content" et "fit-content", calculés par Taffy.