AKCSS Value Syntax

AKCSS property values are strongly typed. The compiler resolves the property first, then interprets the expression using that property's type.

Most values are regular C# expressions:

@using Avalonia;
@using Avalonia.Media;

Button.card {
    Opacity: 0.85;
    IsVisible: true;
    HorizontalAlignment: Center;
    FontWeight: FontWeight.Bold;
    Background: Brushes.SlateBlue;
    CornerRadius: new CornerRadius(8);
}

AKCSS also provides concise syntax for several common Avalonia value types.

Expected-type values​

Static members of the target property type can be written without repeating the type name:

Button.card {
    HorizontalAlignment: Center;
    VerticalAlignment: Bottom;
}

The compiler uses the expected property type, so these values are resolved as:

HorizontalAlignment.Center
VerticalAlignment.Bottom

Qualified members and explicit casts are also supported:

Button.card {
    HorizontalAlignment: HorizontalAlignment.Right;
    VerticalAlignment: (VerticalAlignment)2;
    FontWeight: (FontWeight)700;
}

This behavior also applies to custom enum properties.

Thickness​

Properties such as Padding, Margin, and BorderThickness use Avalonia.Thickness.

Uniform value​

A single number is applied to every side:

Button.card {
    Padding: 10;
}

Equivalent C# value:

new Thickness(10, 10, 10, 10)

Horizontal and vertical values​

A two-item tuple uses the first value for left and right and the second value for top and bottom:

Button.card {
    Padding: (16, 8);
}
Left   = 16
Top    = 8
Right  = 16
Bottom = 8

Individual sides​

A four-item tuple follows Avalonia's left, top, right, bottom order:

Button.card {
    Margin: (4, 8, 12, 16);
}

Named sides​

Named components make partial values easier to read:

Button.card {
    Padding: (top: 8, bottom: 12);
    Margin: (horizontal: 16, vertical: 8);
}

Supported names are:

Name Applied sides
left left
top top
right right
bottom bottom
horizontal left and right
vertical top and bottom

Sides omitted from a named tuple receive 0.

Tuple items may contain runtime expressions:

@utilities {
    Control.space-(double size) {
        Margin: (
            horizontal: size * Amx.DynamicResource<double>("--spacing"),
            vertical: size
        );
    }
}

Regular C# expressions returning Thickness remain available:

Button.card {
    Margin: new Thickness(10, 5) - new Thickness(3, 2);
}

Colors and brushes​

Color literals are available when the target property is Avalonia.Media.Color or IBrush.

Named colors​

Avalonia color names can be written as identifiers or strings:

Button.primary {
    Background: DodgerBlue;
    Foreground: "White";
}

Named values are resolved from Avalonia.Media.Colors.

Hex colors​

Hex values must be string literals:

Button.primary {
    Background: "#369";
    BorderBrush: "#F369";
    Foreground: "#336699";
    Background: "#80336699";
}

Supported formats are:

Format Meaning
#RGB red, green, blue
#ARGB alpha, red, green, blue
#RRGGBB red, green, blue
#AARRGGBB alpha, red, green, blue

RGB, HSL, and HSV​

CSS-like color functions are also written as strings:

Button.primary {
    Background: "rgb(51, 102, 153)";
    BorderBrush: "rgba(51, 102, 153, 0.5)";
    Foreground: "hsl(210, 50%, 40%)";
    Background: "hsla(210, 50%, 40%, 75%)";
    BorderBrush: "hsv(210, 67%, 60%)";
    Foreground: "hsva(210, 67%, 60%, 0.75)";
}

RGB components accept byte values or percentages. Alpha accepts a value from 0 to 1 or a percentage. HSL and HSV hue values are expressed in degrees; their remaining components use percentages.

When the target property is IBrush, AKCSS converts the parsed color to a SolidColorBrush. Other brush types can be supplied with regular C# expressions or resources:

@using Avalonia.Media;

Button.primary {
    Background: Brushes.CornflowerBlue;
    BorderBrush: Amx.DynamicResource<IBrush>("ControlBorderBrush");
}

CornerRadius​

There is currently no dedicated AKCSS literal or tuple syntax for CornerRadius. Use a regular C# expression, including for a uniform radius:

@using Avalonia;

Border.card {
    CornerRadius: new CornerRadius(8);
}

For individual corners, use the four-value constructor. The order is topLeft, topRight, bottomRight, bottomLeft:

@using Avalonia;

Border.card {
    CornerRadius: new CornerRadius(8, 8, 0, 0);
}

Resources containing a CornerRadius are also supported:

Border.card {
    CornerRadius: Amx.DynamicResource<CornerRadius>("--radius-md");
}

In .akbura markup, a plain CornerRadius attribute can use Avalonia's string parser:

<Border CornerRadius="8,8,0,0" />

That markup literal conversion is separate from AKCSS value syntax.

Resource expressions​

Static and dynamic resources can participate in larger value expressions:

Control.w-(double width) {
    Width: width * Amx.DynamicResource<double>("--spacing");
}

See Markup Extensions for resource lookup and generated binding behavior.

Summary​

Value type Concise syntax
Enums and static members Center, FontWeight.Bold, (FontWeight)700
Thickness 10, (16, 8), (4, 8, 12, 16), (horizontal: 16)
Color / IBrush White, "#336699", "rgb(...)", "hsl(...)", "hsv(...)"
CornerRadius regular C# such as new CornerRadius(8) or new CornerRadius(8, 8, 0, 0)
Other values regular typed C# expressions