Skip to main content
Flowery.Uno uses centralized design tokens to ensure consistent sizing, spacing, and typography across all controls.
This document covers sizing and layout tokens. For color and brush customization, see the Theming guide.

Overview

Design tokens provide a single source of truth for:

Control Heights

Standard heights for buttons, inputs, selects

Font Sizes

Typography scale across controls

Corner Radius

Rounded corners for controls

Padding

Internal spacing for different control types

Spacing

Layout spacing values

Border Thickness

Standard border widths

Implementation

Flowery.Uno implements design tokens in C#:
ComponentPurpose
DaisyTokenDefaults.csEnsures default tokens are present in Application.Current.Resources
DaisyResourceLookup.csProvides helper methods to read tokens and get fallback values

How It Works

  1. Controls call DaisyTokenDefaults.EnsureDefaults(resources) on load
  2. This populates Application.Current.Resources with default token values
  3. Controls use DaisyResourceLookup.GetDouble(), GetThickness(), etc. to read tokens
  4. If a token is missing, centralized GetDefault*() methods provide fallbacks

Ensuring Tokens at Startup

If you need token values before any Daisy control loads (e.g., for layout math at app startup), call the public helper:
DesignTokens.md:38-44
using Flowery.Theming;

// App startup (e.g., App.OnLaunched)
DaisyResourceLookup.EnsureTokens();

Programmatic Access

For custom controls or code-behind, use DaisyResourceLookup helper methods:
DesignTokens.md:49-63
using Flowery.Theming;
using Flowery.Controls;

// Get default values based on DaisySize
double height = DaisyResourceLookup.GetDefaultHeight(DaisySize.Medium);        // 28
double fontSize = DaisyResourceLookup.GetDefaultFontSize(DaisySize.Medium);    // 12
Thickness padding = DaisyResourceLookup.GetDefaultPadding(DaisySize.Medium);   // 10,0,10,0
CornerRadius radius = DaisyResourceLookup.GetDefaultCornerRadius(DaisySize.Medium); // 8

// Read from ResourceDictionary with fallback
var resources = Application.Current?.Resources;
double actualHeight = DaisyResourceLookup.GetDouble(resources, "DaisySizeMediumHeight", 28);

Available Helper Methods

MethodReturnsDescription
GetDefaultHeight(size)doubleStandard control height (22-36)
GetDefaultFloatingInputHeight(size)doubleTaller input height (28-46)
GetDefaultCornerRadius(size)CornerRadiusRounded corners (4-12)
GetAvatarSize(size)doubleAvatar dimensions (20-80)
GetDefaultOtpSlotSize(size)doubleOTP input slot size (32-56)
MethodReturnsDescription
GetDefaultFontSize(size)doublePrimary font size (9-16)
GetDefaultHeaderFontSize(size)doubleLarge display font size (12-24)
GetAvatarFontSize(size)doubleAvatar placeholder font (7-20)
MethodReturnsDescription
GetDefaultPadding(size)ThicknessHorizontal button padding
GetDefaultMenuPadding(size)ThicknessMenu/list item padding
GetDefaultTagPadding(size)ThicknessTag/chip padding
GetDefaultIconSpacing(size)doubleGap between icon and text (3-8)
GetDefaultOtpSpacing(size)doubleOTP slot spacing (4-10)
GetDefaultRatingSpacing(size)doubleRating star gap (2-8)
MethodReturnsDescription
GetDefaultIconSize(size)doubleIcon dimensions (10-18)
GetDefaultRatingStarSize(size)doubleRating star dimensions (16-40)
GetDefaultRadialProgressSize(size)doubleRadial progress dimensions (24-128)
GetAvatarStatusSize(size)doubleStatus indicator size (5-16)
GetAvatarIconSize(size)doubleAvatar icon size (10-34)
MethodReturnsDescription
GetDefaultRangeTrackHeight(size)doubleRange slider track (4-16)
GetDefaultRangeThumbSize(size)doubleRange slider thumb (12-36)

Token Reference

Control Heights

Used for buttons, inputs, selects, and other fixed-height controls.
TokenXSSMLXLUsed By
DaisySize{Size}Height2224283236DaisyButton, DaisyInput, DaisySelect

Floating Input Heights

Specific heights for taller input controls like DaisyNumericUpDown and DaisyFileInput.
TokenXSSMLXL
DaisyInputFloating{Size}Height2834384246

Font Sizes

Primary Font Sizes

Typography scale used across controls for main content.
TokenXSSMLXL
DaisySize{Size}FontSize910121416

Secondary Font Sizes

For hint text, helper text, captions, labels (~0.8x of primary).
TokenXSSMLXL
DaisySize{Size}SecondaryFontSize89101214

Tertiary Font Sizes

For very small captions, counters (~0.7x of primary).
TokenXSSMLXL
DaisySize{Size}TertiaryFontSize8891012

Section Header Font Sizes

For section titles within pages.
TokenXSSMLXL
DaisySize{Size}SectionHeaderFontSize1012131517

Header Font Sizes

For large display headings (~1.4x of primary).
TokenXSSMLXL
DaisySize{Size}HeaderFontSize1214172024

Corner Radius

Rounded corners for controls.
TokenXSSMLXL
DaisySize{Size}CornerRadius4681012

Padding

Button Padding

Horizontal-only padding (vertical is controlled by Height).
TokenXSSMLXL
DaisyButton{Size}Padding8,012,014,016,016,0

Input Padding

Full padding for text inputs.
TokenXSSMLXL
DaisyInput{Size}Padding8,412,512,614,614,7

Tab Padding

Both horizontal and vertical padding (tabs don’t use fixed height).
TokenXSSMLXL
DaisyTab{Size}Padding10,212,412,512,512,5

Badge Tokens

Badges use a separate, more compact scale.
TokenXSSML
DaisyBadge{Size}Height14162022
DaisyBadge{Size}FontSize891012
DaisyBadge{Size}Padding4,06,08,012,0

Card Padding

TokenValue
DaisyCardLargePadding24
DaisyCardMediumPadding18
DaisyCardSmallPadding12
DaisyCardCompactPadding8

Spacing

General spacing values for layouts.
TokenValue
DaisySpacingXL20
DaisySpacingLarge14
DaisySpacingMedium10
DaisySpacingSmall6
DaisySpacingXS3

Border Thickness

TokenValue
DaisyBorderThicknessNone0
DaisyBorderThicknessThin1
DaisyBorderThicknessMedium2
DaisyBorderThicknessThick3

Checkbox/Radio Indicator Sizes

Outer border size for checkboxes and radio buttons.
TokenXSSMLXL
DaisyCheckbox{Size}Size1216182428

Checkmark Icon Sizes

TokenXSSMLXL
DaisyCheckmark{Size}Size710121618

Radio Inner Dot Sizes

TokenXSSMLXL
DaisyRadioDot{Size}Size58101418

Toggle Switch Sizes

TokenXSSMLXL
DaisyToggle{Size}Width2428364248
DaisyToggle{Size}Height1416202428

Toggle Knob Sizes

TokenXSSMLXL
DaisyToggleKnob{Size}Size1012161822

Progress Bar Heights

TokenXSSML
DaisyProgress{Size}Height24816

Progress Corner Radius

TokenXSSML
DaisyProgress{Size}CornerRadius1248

Avatar Sizes

TokenXSSMLXL
DaisyAvatar{Size}Size2028405680
DaisyAvatarStatus{Size}Size57101416
DaisyAvatarFont{Size}Size79121620
DaisyAvatarIcon{Size}Size1014182434

Making Custom Controls Token-Aware

For custom controls, use DaisyResourceLookup methods instead of hardcoded values:
DesignTokens.md:418-435
public class MyCustomControl : ContentControl
{
    public DaisySize Size { get; set; } = DaisySize.Medium;

    private void ApplySizing()
    {
        var resources = Application.Current?.Resources;
        if (resources != null)
            DaisyTokenDefaults.EnsureDefaults(resources);

        // Use centralized defaults - single source of truth
        Height = DaisyResourceLookup.GetDefaultHeight(Size);
        FontSize = DaisyResourceLookup.GetDefaultFontSize(Size);
        Padding = DaisyResourceLookup.GetDefaultPadding(Size);
    }
}

Pattern 2: Read from ResourceDictionary with Fallback

For maximum flexibility (allows token overrides):
DesignTokens.md:441-456
private void ApplySizing()
{
    var resources = Application.Current?.Resources;
    if (resources != null)
        DaisyTokenDefaults.EnsureDefaults(resources);

    string sizeKey = DaisyResourceLookup.GetSizeKeyFull(Size); // "Medium", "Large", etc.

    // Try resource dictionary first, fallback to centralized default
    Height = DaisyResourceLookup.GetDouble(resources, $"DaisySize{sizeKey}Height",
        DaisyResourceLookup.GetDefaultHeight(Size));
    FontSize = DaisyResourceLookup.GetDouble(resources, $"DaisySize{sizeKey}FontSize",
        DaisyResourceLookup.GetDefaultFontSize(Size));
}

Controls Using Tokens

Most Daisy controls use the token system for consistent sizing:
  • DaisyButton - Heights, font sizes, padding, corner radius
  • DaisyInput - Heights, font sizes, padding, corner radius
  • DaisySelect - Heights, font sizes, corner radius
  • DaisyNumericUpDown - Floating heights, font sizes, corner radius
  • DaisyFileInput - Floating heights, font sizes, corner radius
  • DaisyTextArea - MinHeight, padding

Best Practices

Use Token Helpers

Always use DaisyResourceLookup.GetDefault*() methods instead of hardcoding pixel values. This ensures consistency and allows for easy theme customization.

Respect Size Property

When creating custom controls, honor the DaisySize enum and use the corresponding token values.

Provide Fallbacks

Always provide fallback values when reading from ResourceDictionary to ensure your controls work even if tokens are missing.

Test All Sizes

Verify your custom controls work correctly at all five size levels (XS, S, M, L, XL).

Build docs developers (and LLMs) love