summaryrefslogtreecommitdiff
path: root/src/library/pad.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/pad.rs')
-rw-r--r--src/library/pad.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/library/pad.rs b/src/library/pad.rs
new file mode 100644
index 00000000..f9e4386d
--- /dev/null
+++ b/src/library/pad.rs
@@ -0,0 +1,38 @@
+use super::*;
+
+/// `pad`: Pad content at the sides.
+///
+/// # Positional arguments
+/// - Padding for all sides: `padding`, of type `linear` relative to sides.
+/// - Body: of type `template`.
+///
+/// # Named arguments
+/// - Left padding: `left`, of type `linear` relative to parent width.
+/// - Right padding: `right`, of type `linear` relative to parent width.
+/// - Top padding: `top`, of type `linear` relative to parent height.
+/// - Bottom padding: `bottom`, of type `linear` relative to parent height.
+pub fn pad(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value {
+ let all = args.find(ctx);
+ let left = args.get(ctx, "left");
+ let top = args.get(ctx, "top");
+ let right = args.get(ctx, "right");
+ let bottom = args.get(ctx, "bottom");
+ let body = args.require::<ValueTemplate>(ctx, "body").unwrap_or_default();
+
+ let padding = Sides::new(
+ left.or(all).unwrap_or_default(),
+ top.or(all).unwrap_or_default(),
+ right.or(all).unwrap_or_default(),
+ bottom.or(all).unwrap_or_default(),
+ );
+
+ Value::template("pad", move |ctx| {
+ let snapshot = ctx.state.clone();
+
+ let expand = Spec::uniform(Expansion::Fit);
+ let child = ctx.exec_body(&body, expand);
+ ctx.push(NodePad { padding, child });
+
+ ctx.state = snapshot;
+ })
+}