pub enum Gradient {
Linear(Arc<LinearGradient>),
Radial(Arc<RadialGradient>),
Conic(Arc<ConicGradient>),
}
Expand description
A color gradient.
Typst supports linear gradients through the
gradient.linear
function, radial gradients through
the gradient.radial
function, and conic gradients
through the gradient.conic
function.
A gradient can be used for the following purposes:
- As a fill to paint the interior of a shape:
{rect(fill: gradient.linear(..))}
- As a stroke to paint the outline of a shape:
{rect(stroke: 1pt + gradient.linear(..))}
- As the fill of text:
{set text(fill: gradient.linear(..))}
- As a color map you can sample from:
{gradient.linear(..).sample(50%)}
§Examples
>>> #set square(size: 50pt)
#stack(
dir: ltr,
spacing: 1fr,
square(fill: gradient.linear(..color.map.rainbow)),
square(fill: gradient.radial(..color.map.rainbow)),
square(fill: gradient.conic(..color.map.rainbow)),
)
Gradients are also supported on text, but only when setting the
relativeness to either {auto}
(the default value) or
{"parent"}
. To create word-by-word or glyph-by-glyph gradients, you can
wrap the words or characters of your text in boxes manually or
through a show rule.
>>> #set page(width: auto, height: auto, margin: 12pt)
>>> #set text(size: 12pt)
#set text(fill: gradient.linear(red, blue))
#let rainbow(content) = {
set text(fill: gradient.linear(..color.map.rainbow))
box(content)
}
This is a gradient on text, but with a #rainbow[twist]!
§Stops
A gradient is composed of a series of stops. Each of these stops has a color
and an offset. The offset is a ratio between {0%}
and {100%}
or
an angle between {0deg}
and {360deg}
. The offset is a relative position
that determines how far along the gradient the stop is located. The stop’s
color is the color of the gradient at that position. You can choose to omit
the offsets when defining a gradient. In this case, Typst will space all
stops evenly.
§Relativeness
The location of the {0%}
and {100%}
stops depends on the dimensions
of a container. This container can either be the shape that it is being
painted on, or the closest surrounding container. This is controlled by the
relative
argument of a gradient constructor. By default, gradients are
relative to the shape they are being painted on, unless the gradient is
applied on text, in which case they are relative to the closest ancestor
container.
Typst determines the ancestor container as follows:
- For shapes that are placed at the root/top level of the document, the closest ancestor is the page itself.
- For other shapes, the ancestor is the innermost [
block
] or [box
] that contains the shape. This includes the boxes and blocks that are implicitly created by show rules and elements. For example, a [rotate
] will not affect the parent of a gradient, but a [grid
] will.
§Color spaces and interpolation
Gradients can be interpolated in any color space. By default, gradients are interpolated in the Oklab color space, which is a perceptually uniform color space. This means that the gradient will be perceived as having a smooth progression of colors. This is particularly useful for data visualization.
However, you can choose to interpolate the gradient in any supported color space you want, but beware that some color spaces are not suitable for perceptually interpolating between colors. Consult the table below when choosing an interpolation space.
Color space | Perceptually uniform? |
---|---|
Oklab | Yes |
Oklch | Yes |
sRGB | No |
linear-RGB | Yes |
CMYK | No |
Grayscale | Yes |
HSL | No |
HSV | No |
>>> #set text(fill: white, font: "IBM Plex Sans", 8pt)
>>> #set block(spacing: 0pt)
#let spaces = (
("Oklab", color.oklab),
("Oklch", color.oklch),
("linear-RGB", color.linear-rgb),
("sRGB", color.rgb),
("CMYK", color.cmyk),
("HSL", color.hsl),
("HSV", color.hsv),
("Grayscale", color.luma),
)
#for (name, space) in spaces {
block(
width: 100%,
inset: 4pt,
fill: gradient.linear(
red,
blue,
space: space,
),
strong(upper(name)),
)
}
§Direction
Some gradients are sensitive to direction. For example, a linear gradient has an angle that determines its direction. Typst uses a clockwise angle, with 0° being from left to right, 90° from top to bottom, 180° from right to left, and 270° from bottom to top.
>>> #set square(size: 50pt)
#stack(
dir: ltr,
spacing: 1fr,
square(fill: gradient.linear(red, blue, angle: 0deg)),
square(fill: gradient.linear(red, blue, angle: 90deg)),
square(fill: gradient.linear(red, blue, angle: 180deg)),
square(fill: gradient.linear(red, blue, angle: 270deg)),
)
§Presets
Typst predefines color maps that you can use with your gradients. See the
color
documentation for more details.
§Note on file sizes
Gradients can be quite large, especially if they have many stops. This is because gradients are stored as a list of colors and offsets, which can take up a lot of space. If you are concerned about file sizes, you should consider the following:
- SVG gradients are currently inefficiently encoded. This will be improved in the future.
- PDF gradients in the
color.oklab
,color.hsv
,color.hsl
, andcolor.oklch
color spaces are stored as a list ofcolor.rgb
colors with extra stops in between. This avoids needing to encode these color spaces in your PDF file, but it does add extra stops to your gradient, which can increase the file size.
Variants§
Implementations§
Source§impl Gradient
impl Gradient
Sourcepub fn linear(
args: &mut Args,
span: Span,
stops: Vec<Spanned<GradientStop>>,
space: ColorSpace,
relative: Smart<RelativeTo>,
) -> Result<Gradient, EcoVec<SourceDiagnostic>>
pub fn linear( args: &mut Args, span: Span, stops: Vec<Spanned<GradientStop>>, space: ColorSpace, relative: Smart<RelativeTo>, ) -> Result<Gradient, EcoVec<SourceDiagnostic>>
Creates a new linear gradient, in which colors transition along a straight line.
#rect(
width: 100%,
height: 20pt,
fill: gradient.linear(
..color.map.viridis,
),
)
Sourcepub fn conic(
span: Span,
stops: Vec<Spanned<GradientStop>>,
angle: Angle,
space: ColorSpace,
relative: Smart<RelativeTo>,
center: Axes<Ratio>,
) -> Result<Gradient, EcoVec<SourceDiagnostic>>
pub fn conic( span: Span, stops: Vec<Spanned<GradientStop>>, angle: Angle, space: ColorSpace, relative: Smart<RelativeTo>, center: Axes<Ratio>, ) -> Result<Gradient, EcoVec<SourceDiagnostic>>
Creates a new conic gradient, in which colors change radially around a center point.
You can control the center point of the gradient by using the center
argument. By default, the center point is the center of the shape.
>>> #set circle(radius: 30pt)
#stack(
dir: ltr,
spacing: 1fr,
circle(fill: gradient.conic(
..color.map.viridis,
)),
circle(fill: gradient.conic(
..color.map.viridis,
center: (20%, 30%),
)),
)
Sourcepub fn sharp(
&self,
steps: Spanned<usize>,
smoothness: Spanned<Ratio>,
) -> Result<Gradient, EcoVec<SourceDiagnostic>>
pub fn sharp( &self, steps: Spanned<usize>, smoothness: Spanned<Ratio>, ) -> Result<Gradient, EcoVec<SourceDiagnostic>>
Creates a sharp version of this gradient.
Sharp gradients have discrete jumps between colors, instead of a smooth transition. They are particularly useful for creating color lists for a preset gradient.
#set rect(width: 100%, height: 20pt)
#let grad = gradient.linear(..color.map.rainbow)
#rect(fill: grad)
#rect(fill: grad.sharp(5))
#rect(fill: grad.sharp(5, smoothness: 20%))
Sourcepub fn repeat(
&self,
repetitions: Spanned<usize>,
mirror: bool,
) -> Result<Gradient, EcoVec<SourceDiagnostic>>
pub fn repeat( &self, repetitions: Spanned<usize>, mirror: bool, ) -> Result<Gradient, EcoVec<SourceDiagnostic>>
Repeats this gradient a given number of times, optionally mirroring it at each repetition.
#circle(
radius: 40pt,
fill: gradient
.radial(aqua, white)
.repeat(4),
)
Sourcepub fn stops(&self) -> Vec<GradientStop>
pub fn stops(&self) -> Vec<GradientStop>
Returns the stops of this gradient.
Sourcepub fn space(&self) -> ColorSpace
pub fn space(&self) -> ColorSpace
Returns the mixing space of this gradient.
Sourcepub fn relative(&self) -> Smart<RelativeTo>
pub fn relative(&self) -> Smart<RelativeTo>
Returns the relative placement of this gradient.
Sourcepub fn angle(&self) -> Option<Angle>
pub fn angle(&self) -> Option<Angle>
Returns the angle of this gradient.
Returns {none}
if the gradient is neither linear nor conic.
Sourcepub fn center(&self) -> Option<Axes<Ratio>>
pub fn center(&self) -> Option<Axes<Ratio>>
Returns the center of this gradient.
Returns {none}
if the gradient is neither radial nor conic.
Sourcepub fn radius(&self) -> Option<Ratio>
pub fn radius(&self) -> Option<Ratio>
Returns the radius of this gradient.
Returns {none}
if the gradient is not radial.
Sourcepub fn focal_center(&self) -> Option<Axes<Ratio>>
pub fn focal_center(&self) -> Option<Axes<Ratio>>
Returns the focal-center of this gradient.
Returns {none}
if the gradient is not radial.
Sourcepub fn focal_radius(&self) -> Option<Ratio>
pub fn focal_radius(&self) -> Option<Ratio>
Returns the focal-radius of this gradient.
Returns {none}
if the gradient is not radial.
Sourcepub fn sample(&self, t: RatioOrAngle) -> Color
pub fn sample(&self, t: RatioOrAngle) -> Color
Sample the gradient at a given position.
The position is either a position along the gradient (a [ratio] between
{0%}
and {100%}
) or an [angle]. Any value outside of this range will
be clamped.
Sourcepub fn samples(&self, ts: Vec<RatioOrAngle>) -> Array
pub fn samples(&self, ts: Vec<RatioOrAngle>) -> Array
Samples the gradient at multiple positions at once and returns the results as an array.
Source§impl Gradient
impl Gradient
Sourcepub fn with_relative(self, relative: RelativeTo) -> Gradient
pub fn with_relative(self, relative: RelativeTo) -> Gradient
Clones this gradient, but with a different relative placement.
Sourcepub fn stops_ref(&self) -> &[(Color, Ratio)]
pub fn stops_ref(&self) -> &[(Color, Ratio)]
Returns a reference to the stops of this gradient.
Sourcepub fn sample_at(&self, _: (f32, f32), _: (f32, f32)) -> Color
pub fn sample_at(&self, _: (f32, f32), _: (f32, f32)) -> Color
Samples the gradient at a given position, in the given container. Handles the aspect ratio and angle directly.
Sourcepub fn anti_alias(&self) -> bool
pub fn anti_alias(&self) -> bool
Does this gradient need to be anti-aliased?
Sourcepub fn unwrap_relative(&self, on_text: bool) -> RelativeTo
pub fn unwrap_relative(&self, on_text: bool) -> RelativeTo
Returns the relative placement of this gradient, handling
the special case of auto
.
Sourcepub fn correct_aspect_ratio(angle: Angle, aspect_ratio: Ratio) -> Angle
pub fn correct_aspect_ratio(angle: Angle, aspect_ratio: Ratio) -> Angle
Corrects this angle for the aspect ratio of a gradient.
This is used specifically for gradients.
Trait Implementations§
Source§impl FromValue for Gradient
impl FromValue for Gradient
Source§fn from_value(value: Value) -> Result<Gradient, HintedString>
fn from_value(value: Value) -> Result<Gradient, HintedString>
Self
.Source§impl NativeScope for Gradient
impl NativeScope for Gradient
Source§fn constructor() -> Option<&'static NativeFuncData>
fn constructor() -> Option<&'static NativeFuncData>
Source§impl NativeType for Gradient
impl NativeType for Gradient
impl Eq for Gradient
impl StructuralPartialEq for Gradient
Auto Trait Implementations§
impl Freeze for Gradient
impl RefUnwindSafe for Gradient
impl Send for Gradient
impl Sync for Gradient
impl Unpin for Gradient
impl UnwindSafe for Gradient
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> FromValue<Spanned<Value>> for Twhere
T: FromValue,
impl<T> FromValue<Spanned<Value>> for Twhere
T: FromValue,
Source§fn from_value(value: Spanned<Value>) -> Result<T, HintedString>
fn from_value(value: Spanned<Value>) -> Result<T, HintedString>
Self
.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T
.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult for Twhere
T: IntoValue,
impl<T> IntoResult for Twhere
T: IntoValue,
Source§fn into_result(self, _: Span) -> Result<Value, EcoVec<SourceDiagnostic>>
fn into_result(self, _: Span) -> Result<Value, EcoVec<SourceDiagnostic>>
Source§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more