Editor/Document/ControlType.cs
namespace Grains.RazorDesigner.Document;

public enum ControlType
{
	// Layout
	Panel,
	SplitContainer,

	// Display
	Label,
	Image,
	IconPanel,

	// Input
	Button,
	ButtonGroup,
	Checkbox,
	TextEntry,
	DropDown,

	// Form
	Form,
	Field,
	FieldControl,
}

public enum ControlCategory
{
	Layout,
	Display,
	Input,
	Form,
}

public sealed record ControlDefaults(
	Length DefaultWidth,
	Length DefaultHeight,
	string DefaultContent,
	string DefaultIcon,
	string ExtraStyle,
	float DefaultFlexGrow,
	FlexDirection DefaultDirection,
	FlexWrap DefaultWrap,
	ControlCategory Category )
{
	public static ControlDefaults For( ControlType type ) => type switch
	{
		// Layout
		ControlType.Panel          => new( Length.Auto,         Length.Auto,         "",          "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Layout ),
		ControlType.SplitContainer => new( Length.Percent(100), Length.Percent(100), "",          "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Layout ),

		// Display
		ControlType.Label          => new( Length.Auto,         Length.Auto,         "Label",     "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Display ),
		ControlType.Image          => new( Length.Auto,         Length.Auto,         "",          "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Display ),
		// IconPanel glyph lives in DefaultIcon (engine icon picker via [IconName]); DefaultContent stays empty.
		ControlType.IconPanel      => new( Length.Auto,         Length.Auto,         "",          "help", "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Display ),

		// Input
		ControlType.Button         => new( Length.Auto,         Length.Auto,         "Button",    "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Input ),
		ControlType.ButtonGroup    => new( Length.Auto,         Length.Px(32),       "",          "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Input ),
		ControlType.Checkbox       => new( Length.Auto,         Length.Auto,         "Checkbox",  "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Input ),
		ControlType.TextEntry      => new( Length.Px(200),      Length.Px(30),       "Enter text","",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Input ),
		ControlType.DropDown       => new( Length.Auto,         Length.Auto,         "",          "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Input ),

		// Form
		ControlType.Form           => new( Length.Auto,         Length.Auto,         "",          "",     "", 0f, FlexDirection.Column, FlexWrap.NoWrap, ControlCategory.Form ),
		ControlType.Field          => new( Length.Auto,         Length.Auto,         "",          "",     "", 0f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Form ),
		ControlType.FieldControl   => new( Length.Auto,         Length.Auto,         "",          "",     "", 1f, FlexDirection.Row,    FlexWrap.NoWrap, ControlCategory.Form ),

		_ => throw new System.ArgumentOutOfRangeException( nameof(type), type, null ),
	};

	public static string ClassNamePrefix( ControlType type ) =>
		type.ToString().ToLowerInvariant();

	public static string CategoryDisplayName( ControlCategory cat ) => cat switch
	{
		ControlCategory.Layout   => "Layout",
		ControlCategory.Display  => "Display",
		ControlCategory.Input    => "Input",
		ControlCategory.Form     => "Form",
		_ => cat.ToString(),
	};
}

public enum FlexDirection
{
	Row,
	Column,
}

public enum JustifyContent
{
	Start,
	Center,
	End,
	SpaceBetween,
	SpaceAround,
}

public enum AlignItems
{
	Start,
	Center,
	End,
	Stretch,
}

public enum AlignSelfKind
{
	Auto,
	Start,
	Center,
	End,
	Stretch,
	Baseline,
}

public enum PositionKind
{
	Relative,
	Absolute,
}

public enum FlexWrap
{
	NoWrap,
	Wrap,
	WrapReverse,
}

public enum CursorKind
{
	Auto,
	Default,
	Pointer,
	Text,
	Grab,
	Grabbing,
	Wait,
	Crosshair,
	Move,
	NotAllowed,
	None,
}

public enum OverflowKind
{
	Visible,
	Hidden,
	Scroll,
	Clip,
	ClipWhole,
}

public enum TextAlignment
{
	Left,
	Center,
	Right,
}

// CSS text-transform. None = leave text as authored (engine default). grd-7t2z.
public enum TextTransformKind
{
	None,
	Uppercase,
	Lowercase,
	Capitalize,
}