Editor/Templates/BundledTemplateCatalog.cs

Static catalog of UI palette templates for the RazorDesigner editor. Defines colors, fonts and many ControlRecord templates (layout primitives, typography, buttons, icons, composite widgets and screen scaffolds) and returns them via All().

File Access
using System.Collections.Generic;
using Grains.RazorDesigner.Document;
using Sandbox;
using Length = Grains.RazorDesigner.Document.Length;

namespace Grains.RazorDesigner.Templates;

public static class BundledTemplateCatalog
{
	private const string LogPrefix = "[Grains.RazorDesigner]";

	private static Color Hex( string hex ) => Color.Parse( hex ) ?? Color.White;
	private static readonly Color DefaultText      = Hex( "#fafaff" );          // $default-text
	private static readonly Color DefaultTextMuted = Hex( "#C2C9DB" );          // $default-50 / $default-text-light
	private static readonly Color DefaultBg950     = Hex( "#11141D" );          // $default-950 (page background)
	private static readonly Color DefaultBorder    = new( 194f / 255f, 201f / 255f, 219f / 255f, 0.1f ); // rgba($default-50,.1)
	private static readonly Color PrimaryBlueCta   = Hex( "#3273eb" );          // Button.primary background (= --primary-blue; was #3171E6 — fixed via drift survey grd-l5ze)

	private static readonly Color Default100    = Hex( "#B5BED4" );  // $default-100 (label.eyebrow text colour)
	private static readonly Color Default200    = Hex( "#9BA7C4" );  // $default-200
	private static readonly Color Default300    = Hex( "#8291B5" );  // $default-300
	private static readonly Color Default400    = Hex( "#687AA6" );  // $default-400
	private static readonly Color Default500    = Hex( "#556691" );  // $default-500
	private static readonly Color Default800    = Hex( "#283043" );  // $default-800 ($surface-overlay)
	private static readonly Color Default900    = Hex( "#191D2A" );  // $default-900 ($surface-elevated)
	private static readonly Color PrimaryBlue   = Hex( "#3273eb" );  // $primary-blue
	private static readonly Color PrimaryGreen  = Hex( "#63d96b" );  // $primary-green
	private static readonly Color PrimaryYellow = Hex( "#ffbd32" );  // $primary-yellow (HUD ammo bar)
	private static readonly Color PopupGrey     = Hex( "#8e9ec2" );  // PopupItem text colour
	private static readonly Color ToastLeading  = Hex( "#4a9eff" );  // ToastMockup leading-icon accent
	private static readonly Color SettingsBodyBg = Hex( "#1b202c" ); // settings.html `.settings-body` interior background
	private static readonly Color White65       = new( 1f, 1f, 1f, 0.65f );  // rgba(white,.65)
	private static readonly Color White30       = new( 1f, 1f, 1f, 0.30f );  // rgba(white,.30)
	private static readonly Color White04       = new( 1f, 1f, 1f, 0.04f );  // rgba(white,.04)
	private static readonly Color White95       = new( 1f, 1f, 1f, 0.95f );  // rgba(white,.95)
	private static readonly Color White55       = new( 1f, 1f, 1f, 0.55f );  // rgba(white,.55)
	private static readonly Color Black50       = new( 0f, 0f, 0f, 0.5f );   // rgba(black,.5)
	private static readonly Color Black45       = new( 0f, 0f, 0f, 0.45f );  // rgba(black,.45) — toast drop shadow
	private static readonly Color SettingRowBg  = new( 50f / 255f, 59f / 255f, 82f / 255f, 0.2f );    // rgba(50,59,82,.20)
	private static readonly Color SidebarOverlay20 = new( 0f, 0f, 0f, 0.2f ); // rgba(0,0,0,.20) — settings.html sidebar overlay
	private static readonly Color BlueSoft18    = new( 50f / 255f, 115f / 255f, 235f / 255f, 0.18f ); // rgba($primary-blue,.18)
	private static readonly Color ToastBgTint   = new( 17f / 255f, 20f / 255f, 29f / 255f, 0.94f );   // rgba($default-950,.94)
	private static readonly Color ToastLeadTint = new( 74f / 255f, 158f / 255f, 1f, 0.10f );          // rgba(#4a9eff,.10)
	private static readonly Color PausePanelBg  = new( 25f / 255f, 29f / 255f, 42f / 255f, 0.95f );   // rgba(25,29,42,.95) — pause-modal panel (allows backdrop blur)
	private static readonly Color ScrimDark86   = new( 16f / 255f, 17f / 255f, 23f / 255f, 0.86f );   // rgba(16,17,23,.86) — modal scrim

	private const string FontHeading = "Poppins";        // $font-heading — headings, buttons, large labels
	private const string FontMono    = "JetBrains Mono"; // $font-mono — counters, shortcuts, ping/KD
	private const string FontBody    = "Inter";          // $font-default — scoreboard rows

	public static IReadOnlyList<PaletteTemplate> All()
	{
		var list = new List<PaletteTemplate>();
		list.AddRange( LayoutPrimitives() );
		list.AddRange( TypographyPrimitives() );
		list.AddRange( ButtonPrimitives() );
		list.AddRange( IconPrimitives() );
		list.AddRange( CompositeWidgets() );
		list.AddRange( ScreenScaffolds() );
		Log.Info( $"{LogPrefix} BundledTemplateCatalog: {list.Count} templates." );
		return list;
	}

	private static PaletteTemplate One( string name, string icon, ControlRecord root ) =>
		new( Name: name, IconName: icon, WrappedInContainer: false, Roots: new[] { root }, FilePath: "" );

	private static Edges Pad( float top, float right, float bottom, float left ) =>
		new( Length.Px( top ), Length.Px( right ), Length.Px( bottom ), Length.Px( left ) );

	private static IEnumerable<PaletteTemplate> LayoutPrimitives()
	{
		yield return One( "Row · gap 8", "view_column", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "row",
			Direction = FlexDirection.Row, Gap = 8f, FlexShrink = 0,
		} );
		yield return One( "Column · gap 16", "view_stream", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "column",
			Direction = FlexDirection.Column, Gap = 16f, FlexShrink = 0,
		} );
		yield return One( "Row · tight (gap 4)", "view_column", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "row-tight",
			Direction = FlexDirection.Row, Gap = 4f, FlexShrink = 0,
		} );
		yield return One( "Section · gap 32", "view_agenda", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "section",
			Direction = FlexDirection.Column, Gap = 32f, FlexShrink = 0,
		} );
		yield return One( "Separator · horizontal", "horizontal_rule", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "separator",
			Height = Length.Px( 1 ),
			OverrideBackground = true, BackgroundColor = DefaultBorder,
			OverrideConstraints = true,
			Margin = new Edges( Length.Px( 4 ), Length.Px( 0 ), Length.Px( 4 ), Length.Px( 0 ) ),
		} );
		yield return One( "Card shell", "crop_square", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "card",
			Direction = FlexDirection.Column, Gap = 12f,
			Padding = Edges.Uniform( Length.Px( 16 ) ),
			OverrideBackground = true, BackgroundColor = DefaultBg950,
			OverrideBorder = true,
			BorderWidth = Length.Px( 1 ), BorderColor = DefaultBorder, BorderRadius = Length.Px( 6 ),
			OverrideInteraction = true, Overflow = OverflowKind.Hidden,
		} );
	}

	private static IEnumerable<PaletteTemplate> TypographyPrimitives()
	{
		yield return One( "Label · eyebrow (10px)", "text_fields", new ControlRecord
		{
			Type = ControlType.Label, ClassName = "eyebrow", Content = "EYEBROW",
			OverrideTypography = true,
			FontFamily = FontHeading, FontSize = Length.Px( 10 ), FontWeight = 700,
			Color = Default100, TextTransform = TextTransformKind.Uppercase,
			LetterSpacing = Length.Em( 0.1f ),
		} );
		yield return One( "Label · small (12px muted)", "text_fields", new ControlRecord
		{
			Type = ControlType.Label, ClassName = "small", Content = "Small label",
			OverrideTypography = true,
			FontSize = Length.Px( 12 ), FontWeight = 600, Color = DefaultTextMuted,
		} );
		yield return One( "Label · medium (16px)", "text_fields", new ControlRecord
		{
			Type = ControlType.Label, ClassName = "medium", Content = "Medium label",
			OverrideTypography = true,
			FontFamily = FontHeading, FontSize = Length.Px( 16 ), FontWeight = 600, Color = DefaultText,
		} );
		yield return One( "Label · large action (16px caps)", "text_fields", new ControlRecord
		{
			Type = ControlType.Label, ClassName = "large", Content = "LARGE ACTION",
			OverrideTypography = true,
			FontFamily = FontHeading, FontSize = Length.Px( 16 ), FontWeight = 700,
			Color = DefaultText, TextTransform = TextTransformKind.Uppercase,
			LetterSpacing = Length.Em( 0.02f ),
		} );
		yield return One( "Label · heading (16px)", "title", new ControlRecord
		{
			Type = ControlType.Label, ClassName = "heading", Content = "Heading",
			OverrideTypography = true,
			FontFamily = FontHeading, FontSize = Length.Px( 16 ), FontWeight = 700, Color = DefaultTextMuted,
		} );
	}

	private static IEnumerable<PaletteTemplate> ButtonPrimitives()
	{
		// hover/active brightness filters NOT baked — Appearance has no pseudo-class support yet (bead grd-ojc9).
		yield return One( "Button · primary (CTA)", "smart_button", new ControlRecord
		{
			Type = ControlType.Button, ClassName = "primary", Content = "Button",
			Align = AlignItems.Center, Gap = 8f,
			Padding = new Edges( Length.Px( 8 ), Length.Px( 18 ), Length.Px( 8 ), Length.Px( 18 ) ),
			OverrideTypography = true,
			FontFamily = FontHeading, FontSize = Length.Px( 14 ), FontWeight = 700, Color = Color.White,
			OverrideBackground = true, BackgroundColor = PrimaryBlueCta,
			OverrideBorder = true,
			BorderWidth = Length.Px( 3 ), BorderColor = Color.Transparent, BorderRadius = Length.Px( 8 ),
		} );
		yield return One( "Button · default", "smart_button", new ControlRecord
		{
			Type = ControlType.Button, ClassName = "default", Content = "Button",
			Align = AlignItems.Center, Gap = 8f,
			Padding = new Edges( Length.Px( 8 ), Length.Px( 16 ), Length.Px( 8 ), Length.Px( 16 ) ),
			OverrideTypography = true,
			FontSize = Length.Px( 14 ), Color = DefaultTextMuted,
			OverrideBackground = true, BackgroundColor = Color.Transparent,
			OverrideBorder = true,
			BorderWidth = Length.Px( 1 ), BorderColor = Color.Transparent, BorderRadius = Length.Px( 6 ),
		} );
		yield return One( "Button · ghost", "smart_button", new ControlRecord
		{
			Type = ControlType.Button, ClassName = "ghost", Content = "Cancel",
			Align = AlignItems.Center, Gap = 8f,
			Padding = new Edges( Length.Px( 8 ), Length.Px( 16 ), Length.Px( 8 ), Length.Px( 16 ) ),
			OverrideTypography = true,
			FontSize = Length.Px( 14 ), Color = DefaultTextMuted,
			OverrideBackground = true, BackgroundColor = Color.Transparent,
			OverrideBorder = true,
			BorderWidth = Length.Px( 1 ), BorderColor = DefaultBorder, BorderRadius = Length.Px( 6 ),
		} );
	}

	private static IEnumerable<PaletteTemplate> IconPrimitives()
	{
		yield return One( "Icon · medium (16px)", "favorite", new ControlRecord
		{
			Type = ControlType.IconPanel, ClassName = "icon-medium", IconName = "favorite",
			OverrideTypography = true, FontSize = Length.Px( 16 ),
		} );
		yield return One( "Icon · small (12px)", "favorite_border", new ControlRecord
		{
			Type = ControlType.IconPanel, ClassName = "icon-small", IconName = "favorite",
			OverrideTypography = true, FontSize = Length.Px( 12 ),
		} );
		yield return One( "Icon · eyebrow (10px)", "favorite_border", new ControlRecord
		{
			Type = ControlType.IconPanel, ClassName = "icon-eyebrow", IconName = "favorite",
			OverrideTypography = true, FontSize = Length.Px( 10 ), Color = Default100,
		} );
	}

	private static IEnumerable<PaletteTemplate> CompositeWidgets()
	{
		yield return One( "Badge · status pill", "label", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "badge",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 4f, FlexShrink = 0,
			Padding = Pad( 3, 6, 3, 6 ),
			OverrideBackground = true, BackgroundColor = Default800,
			OverrideBorder = true, BorderRadius = Length.Px( 4 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.IconPanel, IconName = "schedule",
					OverrideTypography = true, FontSize = Length.Px( 10 ), Color = DefaultTextMuted,
				},
				new ControlRecord
				{
					Type = ControlType.Label, Content = "BADGE",
					OverrideTypography = true, FontFamily = FontHeading, FontSize = Length.Px( 10 ),
					FontWeight = 700, Color = DefaultTextMuted,
					TextTransform = TextTransformKind.Uppercase, LetterSpacing = Length.Em( 0.1f ),
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "number", Content = "3",
					Padding = Pad( 1, 4, 1, 4 ),
					OverrideTypography = true, Color = Color.White,
					OverrideBackground = true, BackgroundColor = Black50,
					OverrideBorder = true, BorderRadius = Length.Px( 2 ),
					OverrideConstraints = true, Margin = Pad( 0, 0, 0, 2 ),
				},
			},
		} );

		// MenuOption — context-menu row: 32px tall, icon slot + bold text + right-aligned shortcut.
		yield return One( "Menu option row", "menu", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "menu-option",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 4f, FlexShrink = 0,
			Height = Length.Px( 32 ), Padding = Pad( 0, 8, 0, 8 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "icon-slot",
					Align = AlignItems.Center, Justify = JustifyContent.Center, FlexShrink = 0,
					Padding = Edges.Uniform( Length.Px( 8 ) ),
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.IconPanel, IconName = "content_copy",
							OverrideTypography = true, Color = White65,
						},
					},
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "text", Content = "Menu item", FlexShrink = 0,
					Padding = Edges.Uniform( Length.Px( 8 ) ),
					OverrideTypography = true, FontFamily = FontHeading, FontWeight = 700, Color = White65,
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "meta", Content = "Ctrl+K", FlexGrow = 1,
					Padding = Edges.Uniform( Length.Px( 8 ) ),
					OverrideTypography = true, FontFamily = FontMono, FontWeight = 500,
					TextAlign = TextAlignment.Right, Color = White30,
				},
			},
		} );

		// PauseItem — pause-menu / list row: 22px leading icon, name+hint column, monospace shortcut chip.
		yield return One( "Pause menu item", "pause_circle", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "pause-item",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 14f,
			Padding = Pad( 12, 16, 12, 16 ),
			OverrideBorder = true, BorderRadius = Length.Px( 6 ), BorderWidth = Length.Px( 1 ), BorderColor = Color.Transparent,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.IconPanel, IconName = "play_arrow",
					OverrideTypography = true, FontSize = Length.Px( 22 ), Color = Default200,
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "label-col",
					Direction = FlexDirection.Column, Gap = 2f, FlexGrow = 1,
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "name", Content = "Resume",
							OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600,
							FontSize = Length.Px( 15 ), Color = DefaultText,
						},
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "hint", Content = "Return to the game",
							OverrideTypography = true, FontSize = Length.Px( 12 ), Color = Default400,
						},
					},
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "shortcut", Content = "ESC", FlexShrink = 0,
					Padding = Pad( 2, 8, 2, 8 ),
					OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 11 ), Color = Default500,
					OverrideBackground = true, BackgroundColor = White04,
					OverrideBorder = true, BorderRadius = Length.Px( 4 ),
				},
			},
		} );

		// SettingRow — settings form row: tinted bar, 340px label column (name+hint), 350px control slot.
		yield return One( "Setting row", "tune", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "setting-row",
			Direction = FlexDirection.Row, Align = AlignItems.Center, FlexShrink = 0,
			Padding = Pad( 8, 12, 8, 12 ),
			OverrideBackground = true, BackgroundColor = SettingRowBg,
			OverrideBorder = true, BorderRadius = Length.Px( 10 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "row-label",
					Direction = FlexDirection.Column, Gap = 2f, FlexGrow = 0, FlexShrink = 0,
					Width = Length.Px( 340 ),
					OverrideConstraints = true, Margin = Pad( 0, 0, 0, 24 ),
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "name", Content = "Setting name",
							OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600, Color = DefaultText,
						},
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "hint", Content = "What this setting does",
							OverrideTypography = true, FontSize = Length.Px( 12 ), Color = Default400,
						},
					},
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "control",
					Align = AlignItems.Center, Justify = JustifyContent.End, Gap = 8f,
					FlexGrow = 0, FlexShrink = 0, Width = Length.Px( 350 ), Height = Length.Px( 32 ),
					OverrideConstraints = true, MaxWidth = Length.Px( 350 ),
				},
			},
		} );

		yield return One( "Checkbox row", "check_box_outline_blank", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "checkbox",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 8f, FlexShrink = 0,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "checkmark",
					Width = Length.Px( 22 ), Height = Length.Px( 22 ), FlexShrink = 0,
					OverrideBackground = true, BackgroundColor = Color.Transparent,
					OverrideBorder = true,
					BorderWidth = Length.Px( 3 ), BorderColor = PrimaryBlue, BorderRadius = Length.Px( 4 ),
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "label", Content = "Setting label",
					OverrideTypography = true, Color = DefaultTextMuted,
				},
			},
		} );

		// StatRow — HUD stat bar: 22px icon, fill bar inside a recessed track, monospace value cell.
		yield return One( "Stat bar row", "monitor_heart", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "stat-row",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 10f,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.IconPanel, IconName = "favorite", FlexShrink = 0,
					OverrideTypography = true, FontSize = Length.Px( 22 ), Color = PrimaryGreen,
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "vals",
					Direction = FlexDirection.Column, FlexGrow = 1, Gap = 4f,
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.Panel, ClassName = "bar", Height = Length.Px( 8 ),
							OverrideBackground = true, BackgroundColor = Default900,
							OverrideBorder = true, BorderRadius = Length.Px( 4 ),
							OverrideInteraction = true, Overflow = OverflowKind.Hidden,
							Children =
							{
								new ControlRecord
								{
									Type = ControlType.Panel, ClassName = "fill",
									Width = Length.Percent( 72 ), Height = Length.Percent( 100 ),
									OverrideBackground = true, BackgroundColor = PrimaryGreen,
								},
							},
						},
					},
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "num", Content = "100 HP",
					OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 13 ), FontWeight = 700,
					TextAlign = TextAlignment.Right, Color = DefaultText,
					OverrideConstraints = true, MinWidth = Length.Px( 50 ),
				},
			},
		} );

		// ScoreRow — scoreboard row: name (grows) + monospace K/D + monospace ping.
		yield return One( "Scoreboard row", "leaderboard", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "score-row",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 8f,
			Padding = Pad( 6, 8, 6, 8 ),
			OverrideBorder = true, BorderRadius = Length.Px( 4 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "name", Content = "PlayerName", FlexGrow = 1,
					OverrideTypography = true, FontFamily = FontBody, FontSize = Length.Px( 12 ),
					FontWeight = 600, Color = DefaultText,
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "kd", Content = "12 / 4",
					OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 11 ),
					TextAlign = TextAlignment.Right, Color = Default300,
					OverrideConstraints = true, MinWidth = Length.Px( 36 ),
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "ping", Content = "24ms",
					OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 10 ),
					TextAlign = TextAlignment.Right, Color = Default400,
					OverrideConstraints = true, MinWidth = Length.Px( 30 ),
				},
			},
		} );

		// SectionHeader — showcase section heading: 22px Poppins title + monospace caption.
		yield return One( "Section header", "title", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "section-header",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 12f,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "title", Content = "Section",
					OverrideTypography = true, FontFamily = FontHeading, FontWeight = 700,
					FontSize = Length.Px( 22 ), Color = DefaultText,
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "caption", Content = "optional caption",
					OverrideTypography = true, FontFamily = FontMono, FontWeight = 500,
					FontSize = Length.Px( 13 ), Color = Default500,
				},
			},
		} );

		// SettingsNavItem — sidebar nav row: icon + name (grows) + soft pill badge. Resting (inactive) look.
		yield return One( "Settings nav item", "chevron_right", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "settings-nav-item",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 10f, FlexShrink = 0,
			Padding = Pad( 8, 10, 8, 10 ),
			OverrideBorder = true, BorderRadius = Length.Px( 6 ), BorderWidth = Length.Px( 1 ), BorderColor = Color.Transparent,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.IconPanel, IconName = "settings",
					OverrideTypography = true, Color = Default200,
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "name", Content = "Gameplay", FlexGrow = 1,
					OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600,
					FontSize = Length.Px( 14 ), Color = Default200,
				},
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "badge-soft", Content = "NEW",
					Padding = Pad( 1, 6, 1, 6 ),
					OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 10 ), Color = PrimaryBlue,
					OverrideBackground = true, BackgroundColor = BlueSoft18,
					OverrideBorder = true, BorderRadius = Length.Px( 999 ),
				},
			},
		} );

		yield return One( "DropDown control", "arrow_drop_down", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "dropdown",
			Direction = FlexDirection.Row, Align = AlignItems.Center,
			Justify = JustifyContent.SpaceBetween, Gap = 4f, FlexShrink = 0,
			Padding = new Edges( Length.Px( 6 ), Length.Px( 12 ), Length.Px( 6 ), Length.Px( 12 ) ),
			OverrideConstraints = true, MinWidth = Length.Px( 140 ), MinHeight = Length.Px( 32 ),
			OverrideBackground = true, BackgroundColor = Black45,
			OverrideBorder = true,
			BorderWidth = Length.Px( 1 ), BorderColor = DefaultBorder, BorderRadius = Length.Px( 8 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Label, ClassName = "value", Content = "Option",
					OverrideTypography = true, Color = DefaultText,
				},
				new ControlRecord
				{
					Type = ControlType.IconPanel, ClassName = "chevron", IconName = "expand_more",
					FlexShrink = 0,
					OverrideTypography = true, FontSize = Length.Px( 16 ), Color = DefaultText,
				},
			},
		} );

		// PopupItem — dropdown / popup option: 18px icon + semibold label. Resting (unselected) look.
		yield return One( "Popup option", "list", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "popup-item",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 8f, FlexShrink = 0,
			Padding = Pad( 8, 16, 8, 16 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.IconPanel, IconName = "check_circle",
					OverrideTypography = true, FontSize = Length.Px( 18 ), Color = PopupGrey,
				},
				new ControlRecord
				{
					Type = ControlType.Label, Content = "Option",
					OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600,
					FontSize = Length.Px( 14 ), Color = PopupGrey,
				},
			},
		} );

		// ToastMockup — toast card: tinted leading-icon disc + title/subtitle column + round close affordance.
		yield return One( "Toast notification", "notifications", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "toast",
			Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 12f, FlexShrink = 0,
			Padding = Pad( 16, 20, 16, 20 ),
			OverrideConstraints = true, MinWidth = Length.Px( 320 ), MaxWidth = Length.Px( 420 ),
			OverrideBackground = true, BackgroundColor = ToastBgTint,
			OverrideBorder = true, BorderWidth = Length.Px( 1 ), BorderColor = DefaultBorder, BorderRadius = Length.Px( 14 ),
			OverrideEffects = true, BoxShadowY = Length.Px( 12 ), BoxShadowBlur = Length.Px( 32 ), BoxShadowColor = Black45,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.IconPanel, ClassName = "leading", IconName = "notifications", FlexShrink = 0,
					Padding = Edges.Uniform( Length.Px( 6 ) ),
					OverrideTypography = true, FontSize = Length.Px( 24 ), Color = ToastLeading,
					OverrideBackground = true, BackgroundColor = ToastLeadTint,
					OverrideBorder = true, BorderRadius = Length.Px( 999 ),
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "content",
					Direction = FlexDirection.Column, FlexGrow = 1, Gap = 2f,
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "title", Content = "Notification",
							OverrideTypography = true, FontFamily = FontHeading, FontSize = Length.Px( 14 ),
							FontWeight = 600, Color = White95,
						},
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "subtitle", Content = "Subtitle text",
							OverrideTypography = true, FontSize = Length.Px( 12 ), Color = White55,
						},
					},
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "close-x",
					Align = AlignItems.Center, Justify = JustifyContent.Center, FlexShrink = 0,
					Width = Length.Px( 28 ), Height = Length.Px( 28 ),
					OverrideBorder = true, BorderRadius = Length.Px( 999 ),
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.IconPanel, IconName = "close",
							OverrideTypography = true, Color = Default300,
						},
					},
				},
			},
		} );
	}

	private static IEnumerable<PaletteTemplate> ScreenScaffolds()
	{
		// --- Settings page shell: 400px sidebar ($default-900) + 50px-padded body ---
		yield return One( "Settings page shell", "settings_applications", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "settings-page",
			Direction = FlexDirection.Row, Width = Length.Percent( 100 ), Height = Length.Percent( 100 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "sidebar",
					Direction = FlexDirection.Column, Gap = 2f, FlexShrink = 0, Width = Length.Px( 220 ),
					Padding = Pad( 16, 12, 16, 12 ),
					OverrideBackground = true, BackgroundColor = SidebarOverlay20,
					Children =
					{
						SettingsNavRow( "settings", "Gameplay" ),
						SettingsNavRow( "sports_esports", "Video" ),
						SettingsNavRow( "tv", "Audio" ),
						SettingsNavRow( "volume_up", "Controls" ),
					},
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "pagebody",
					Direction = FlexDirection.Column, Gap = 8f, FlexGrow = 1,
					Padding = Pad( 16, 24, 16, 24 ),
					OverrideBackground = true, BackgroundColor = SettingsBodyBg,
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "page-title", Content = "Gameplay",
							OverrideTypography = true, FontFamily = FontHeading, FontWeight = 700,
							FontSize = Length.Px( 22 ), Color = DefaultText,
						},
						PageSettingRow(),
						PageSettingRow(),
						PageSettingRow(),
					},
				},
			},
		} );

		// --- Card grid browser: search bar + wrapping grid of content cards ---
		yield return One( "Card grid browser", "grid_view", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "browser",
			Direction = FlexDirection.Column, Gap = 24f, Width = Length.Percent( 100 ),
			Padding = Edges.Uniform( Length.Px( 50 ) ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "searchbar",
					Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 8f, FlexShrink = 0,
					Height = Length.Px( 40 ), Padding = Pad( 0, 16, 0, 16 ),
					OverrideBackground = true, BackgroundColor = Default800,
					OverrideBorder = true, BorderRadius = Length.Px( 8 ),
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.IconPanel, IconName = "search",
							OverrideTypography = true, Color = Default300,
						},
						new ControlRecord
						{
							Type = ControlType.TextEntry, ClassName = "search-input",
							Placeholder = "Search…", FlexGrow = 1,
						},
					},
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "card-grid",
					Direction = FlexDirection.Row, Wrap = FlexWrap.Wrap, Gap = 16f,
					Children = { CardCell(), CardCell(), CardCell(), CardCell() },
				},
			},
		} );

		yield return One( "HUD cluster", "monitor_heart", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "hud",
			Width = Length.Percent( 100 ), Height = Length.Percent( 100 ),
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "hud-bottom-left",
					OverrideConstraints = true, Position = PositionKind.Absolute,
					Left = Length.Px( 24 ), Bottom = Length.Px( 24 ),
					Direction = FlexDirection.Column, Gap = 8f, Width = Length.Px( 280 ),
					Children =
					{
						HudStatRow( "favorite", PrimaryGreen, 72f, "100 HP" ),
						HudStatRow( "bolt", PrimaryYellow, 40f, "30 / 90" ),
					},
				},
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "hud-top-right",
					OverrideConstraints = true, Position = PositionKind.Absolute,
					Right = Length.Px( 24 ), Top = Length.Px( 24 ),
					Direction = FlexDirection.Row, Gap = 8f,
					Children = { BadgePill( "WAVE 3" ), BadgePill( "01:24" ) },
				},
			},
		} );

		// --- Pause menu column: dim backdrop + centered panel with a column of list rows ---
		yield return One( "Pause menu column", "pause_circle", new ControlRecord
		{
			Type = ControlType.Panel, ClassName = "pause-menu",
			Width = Length.Percent( 100 ), Height = Length.Percent( 100 ),
			Align = AlignItems.Center, Justify = JustifyContent.Center,
			OverrideBackground = true, BackgroundColor = ScrimDark86,
			Children =
			{
				new ControlRecord
				{
					Type = ControlType.Panel, ClassName = "pause-panel",
					Direction = FlexDirection.Column, Gap = 4f, Width = Length.Px( 480 ),
					Padding = Edges.Uniform( Length.Px( 12 ) ),
					OverrideBackground = true, BackgroundColor = PausePanelBg,
					OverrideBorder = true,
					BorderWidth = Length.Px( 1 ), BorderColor = DefaultBorder, BorderRadius = Length.Px( 16 ),
					Children =
					{
						new ControlRecord
						{
							Type = ControlType.Label, ClassName = "pause-title", Content = "Paused",
							OverrideTypography = true, FontFamily = FontHeading, FontWeight = 700,
							FontSize = Length.Px( 18 ), Color = DefaultText,
						},
						PauseRow( "play_arrow", "Resume", "Return to the game", "ESC" ),
						PauseRow( "tune", "Settings", "Audio, video, controls", "F1" ),
						PauseRow( "group_add", "Invite Friends", "Bring friends into your game", "F2" ),
						PauseRow( "logout", "Quit to Menu", "Leave to the main menu", "Q" ),
					},
				},
			},
		} );
	}

	private static ControlRecord SettingsNavRow( string icon, string name ) => new()
	{
		Type = ControlType.Panel, ClassName = "settings-nav-item",
		Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 10f, FlexShrink = 0,
		Padding = Pad( 8, 10, 8, 10 ),
		OverrideBorder = true, BorderRadius = Length.Px( 6 ), BorderWidth = Length.Px( 1 ), BorderColor = Color.Transparent,
		Children =
		{
			new ControlRecord
			{
				Type = ControlType.IconPanel, IconName = icon,
				OverrideTypography = true, Color = Default200,
			},
			new ControlRecord
			{
				Type = ControlType.Label, ClassName = "name", Content = name, FlexGrow = 1,
				OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600,
				FontSize = Length.Px( 14 ), Color = Default200,
			},
		},
	};

	private static ControlRecord PageSettingRow() => new()
	{
		Type = ControlType.Panel, ClassName = "setting-row",
		Direction = FlexDirection.Row, Align = AlignItems.Center, FlexShrink = 0,
		Padding = Pad( 8, 12, 8, 12 ),
		OverrideBackground = true, BackgroundColor = SettingRowBg,
		OverrideBorder = true, BorderRadius = Length.Px( 10 ),
		Children =
		{
			new ControlRecord
			{
				Type = ControlType.Panel, ClassName = "row-label",
				Direction = FlexDirection.Column, Gap = 2f, FlexGrow = 0, FlexShrink = 0,
				Width = Length.Px( 340 ),
				OverrideConstraints = true, Margin = Pad( 0, 0, 0, 16 ),
				Children =
				{
					new ControlRecord
					{
						Type = ControlType.Label, ClassName = "name", Content = "Setting name",
						OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600, Color = DefaultText,
					},
					new ControlRecord
					{
						Type = ControlType.Label, ClassName = "hint", Content = "What this setting does",
						OverrideTypography = true, FontSize = Length.Px( 12 ), Color = Default400,
					},
				},
			},
			new ControlRecord
			{
				Type = ControlType.Panel, ClassName = "control",
				Direction = FlexDirection.Row, Align = AlignItems.Center, Justify = JustifyContent.End, Gap = 8f,
				FlexGrow = 0, FlexShrink = 0, Width = Length.Px( 350 ), Height = Length.Px( 32 ),
				OverrideConstraints = true, MaxWidth = Length.Px( 350 ),
			},
		},
	};

	private static ControlRecord CardCell() => new()
	{
		Type = ControlType.Panel, ClassName = "card",
		Direction = FlexDirection.Column, Gap = 12f, Width = Length.Px( 240 ),
		Padding = Edges.Uniform( Length.Px( 16 ) ),
		OverrideBackground = true, BackgroundColor = DefaultBg950,
		OverrideBorder = true,
		BorderWidth = Length.Px( 1 ), BorderColor = DefaultBorder, BorderRadius = Length.Px( 6 ),
		Children =
		{
			new ControlRecord
			{
				Type = ControlType.Image, ClassName = "thumb", Height = Length.Px( 120 ),
				OverrideBorder = true, BorderRadius = Length.Px( 4 ),
			},
			new ControlRecord
			{
				Type = ControlType.Label, ClassName = "heading", Content = "Card title",
				OverrideTypography = true, FontFamily = FontHeading, FontWeight = 700,
				FontSize = Length.Px( 16 ), Color = DefaultText,
			},
			new ControlRecord
			{
				Type = ControlType.Label, ClassName = "small", Content = "Supporting copy goes here.",
				OverrideTypography = true, FontSize = Length.Px( 12 ), FontWeight = 600, Color = DefaultTextMuted,
			},
		},
	};

	private static ControlRecord HudStatRow( string icon, Color accent, float fillPct, string valueText ) => new()
	{
		Type = ControlType.Panel, ClassName = "stat-row",
		Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 10f,
		Children =
		{
			new ControlRecord
			{
				Type = ControlType.IconPanel, IconName = icon, FlexShrink = 0,
				OverrideTypography = true, FontSize = Length.Px( 22 ), Color = accent,
			},
			new ControlRecord
			{
				Type = ControlType.Panel, ClassName = "vals",
				Direction = FlexDirection.Column, FlexGrow = 1, Gap = 4f,
				Children =
				{
					new ControlRecord
					{
						Type = ControlType.Panel, ClassName = "bar", Height = Length.Px( 8 ),
						OverrideBackground = true, BackgroundColor = Default900,
						OverrideBorder = true, BorderRadius = Length.Px( 4 ),
						OverrideInteraction = true, Overflow = OverflowKind.Hidden,
						Children =
						{
							new ControlRecord
							{
								Type = ControlType.Panel, ClassName = "fill",
								Width = Length.Percent( fillPct ), Height = Length.Percent( 100 ),
								OverrideBackground = true, BackgroundColor = accent,
							},
						},
					},
				},
			},
			new ControlRecord
			{
				Type = ControlType.Label, ClassName = "num", Content = valueText,
				OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 13 ), FontWeight = 700,
				TextAlign = TextAlignment.Right, Color = DefaultText,
				OverrideConstraints = true, MinWidth = Length.Px( 50 ),
			},
		},
	};

	private static ControlRecord BadgePill( string text ) => new()
	{
		Type = ControlType.Panel, ClassName = "badge",
		Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 4f, FlexShrink = 0,
		Padding = Pad( 3, 6, 2, 6 ),
		OverrideBackground = true, BackgroundColor = Default800,
		OverrideBorder = true, BorderRadius = Length.Px( 4 ),
		Children =
		{
			new ControlRecord
			{
				Type = ControlType.Label, Content = text,
				OverrideTypography = true, FontFamily = FontHeading, FontSize = Length.Px( 10 ),
				FontWeight = 700, Color = DefaultTextMuted,
				TextTransform = TextTransformKind.Uppercase, LetterSpacing = Length.Em( 0.1f ),
			},
		},
	};

	private static ControlRecord PauseRow( string icon, string name, string hint, string shortcut ) => new()
	{
		Type = ControlType.Panel, ClassName = "pause-item",
		Direction = FlexDirection.Row, Align = AlignItems.Center, Gap = 14f,
		Padding = Pad( 12, 16, 12, 16 ),
		OverrideBorder = true, BorderRadius = Length.Px( 6 ), BorderWidth = Length.Px( 1 ), BorderColor = Color.Transparent,
		Children =
		{
			new ControlRecord
			{
				Type = ControlType.IconPanel, IconName = icon,
				OverrideTypography = true, FontSize = Length.Px( 22 ), Color = Default200,
			},
			new ControlRecord
			{
				Type = ControlType.Panel, ClassName = "label-col",
				Direction = FlexDirection.Column, Gap = 2f, FlexGrow = 1,
				Children =
				{
					new ControlRecord
					{
						Type = ControlType.Label, ClassName = "name", Content = name,
						OverrideTypography = true, FontFamily = FontHeading, FontWeight = 600,
						FontSize = Length.Px( 15 ), Color = DefaultText,
					},
					new ControlRecord
					{
						Type = ControlType.Label, ClassName = "hint", Content = hint,
						OverrideTypography = true, FontSize = Length.Px( 12 ), Color = Default400,
					},
				},
			},
			new ControlRecord
			{
				Type = ControlType.Label, ClassName = "shortcut", Content = shortcut, FlexShrink = 0,
				Padding = Pad( 2, 8, 2, 8 ),
				OverrideTypography = true, FontFamily = FontMono, FontSize = Length.Px( 11 ), Color = Default500,
				OverrideBackground = true, BackgroundColor = White04,
				OverrideBorder = true, BorderRadius = Length.Px( 4 ),
			},
		},
	};
}