Add align parameter to stack

This commit is contained in:
Malo 2025-02-19 00:59:56 +01:00
parent 3de3813ca0
commit 3594e3e767
2 changed files with 23 additions and 4 deletions

View File

@ -1,6 +1,8 @@
use typst_library::diag::{bail, SourceResult};
use typst_library::engine::Engine;
use typst_library::foundations::{Content, Packed, Resolve, StyleChain, StyledElem};
use typst_library::foundations::{
Content, Packed, Resolve, Smart, StyleChain, StyledElem,
};
use typst_library::introspection::{Locator, SplitLocator};
use typst_library::layout::{
Abs, AlignElem, Axes, Axis, Dir, FixedAlignment, Fr, Fragment, Frame, HElem, Point,
@ -27,6 +29,8 @@ pub fn layout_stack(
let spacing = elem.spacing(styles);
let mut deferred = None;
let align = elem.align(styles);
for child in &elem.children {
match child {
StackChild::Spacing(kind) => {
@ -52,7 +56,15 @@ pub fn layout_stack(
layouter.layout_spacing(kind);
}
layouter.layout_block(engine, block, styles)?;
if let Smart::Custom(alignment) = align {
layouter.layout_block(
engine,
&block.clone().aligned(alignment),
styles,
)?;
} else {
layouter.layout_block(engine, block, styles)?;
}
deferred = spacing;
}
}

View File

@ -2,8 +2,10 @@ use std::fmt::{self, Debug, Formatter};
use crate::diag::SourceResult;
use crate::engine::Engine;
use crate::foundations::{cast, elem, Content, NativeElement, Packed, Show, StyleChain};
use crate::layout::{BlockElem, Dir, Spacing};
use crate::foundations::{
cast, elem, Content, NativeElement, Packed, Show, Smart, StyleChain,
};
use crate::layout::{Alignment, BlockElem, Dir, Spacing};
/// Arranges content and spacing horizontally or vertically.
///
@ -42,6 +44,11 @@ pub struct StackElem {
/// Spacing to insert between items where no explicit spacing was provided.
pub spacing: Option<Spacing>,
/// How to align the items.
///
/// If set to `{auto}`, the outer alignment is used.
pub align: Smart<Alignment>,
/// The children to stack along the axis.
#[variadic]
pub children: Vec<StackChild>,