using System.Text.Json.Serialization;
namespace PL.Core.HtmlPlayer.Layout
public enum LayoutTemplateTargets
public class LayoutTemplate
public string Key { get; set; }
public LayoutTemplateTargets Target { get; set; }
public LayoutAlignment Alignment { get; set; }
public string[] Columns { get; set; }
public string[] Rows { get; set; }
public bool Separator { get; set; }
public bool Single { get; set; }
public Layer[] Layers { get; set; }
public LayoutTemplate(LayoutTemplate properties = null)
if (properties != null) {
Target = properties.Target;
Alignment = properties.Alignment;
Columns = properties.Columns;
Separator = properties.Separator;
Single = properties.Single;
Layers = properties.Layers;
public LayerArea[] Areas { get; set; }
public LayerGroup[] Groups { get; set; }
public AreaTypes Area { get; set; }
public Guid? ComponentValueId { get; set; }
public string ComponentKind { get; set; }
public int Order { get; set; }
public int[][] Coordinates { get; set; }
public LayoutAlignment Alignment { get; set; }
public int Order { get; set; }
public int[][] Coordinates { get; set; }
public LayerGroupElement[] Elements { get; set; }
public LayoutAlignment Alignment { get; set; }
public class LayerGroupElement
public AreaTypes Area { get; set; }
public int Order { get; set; }
public class LayoutAlignment
public Alignment Horizontal { get; set; }
public Alignment Vertical { get; set; }
public TextAlignment Text { get; set; }
public static class PredefinedLayoutTemplateKeys
public static string TextOnLeft = "TextOnLeft";
public static string TextOnRight = "TextOnRight";
public static string WideTitle = "WideTitle";
public static string SingleColumn = "SingleColumn";
public static string TaskOnLeft = "TaskOnLeft";
public static string TaskOnRight = "TaskOnRight";
public static string WideTask = "WideTask";
public static class PredefinedComponentKinds
public static string Accordion = "Accordion";
public static string Video = "Video";
public static string VideoYoutube = "VideoYoutube";
public static string VideoVimeo = "VideoVimeo";
public static string VideoDreamBroker = "VideoDreamBroker";
public static string VideoO365 = "VideoO365";
public static string ExtraInfoLauncher = "ExtraInfoLauncher";
public static string ExtraInfoContent = "ExtraInfoContent";
public static string Hotspots = "Hotspots";
public static string FlipCards = "FlipCards";
public static string Slideshow = "Slideshow";
public static string Tabs = "Tabs";
public enum TextAlignment
public static class PredefinedLayoutTemplates
private static readonly LayoutTemplate TextOnLeftTemplate = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.TextOnLeft,
Target = LayoutTemplateTargets.ContentPage,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Columns = new[] { "1", "1" },
Rows = new[] { "auto", "auto", "1" },
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {1, 1}, new[] {1, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.End,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 2}, new[] {1, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 3}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {1, 4}, new[] {1, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
private static readonly LayoutTemplate TextOnRightTemplate = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.TextOnRight,
Target = LayoutTemplateTargets.ContentPage,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Columns = new[] { "1", "1" },
Rows = new[] { "auto", "auto", "auto" },
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {2, 1}, new[] {2, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {2, 2}, new[] {2, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 3}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {2, 4}, new[] {2, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
private static readonly LayoutTemplate WideTitleTemplate = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.WideTitle,
Target = LayoutTemplateTargets.ContentPage,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Columns = new[] { "1", "1" },
Rows = new[] { "auto", "auto", "auto" },
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {1, 1}, new[] {2, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 2}, new[] {1, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 3}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {1, 4}, new[] {1, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
private static readonly LayoutTemplate SingleColumn = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.SingleColumn,
Target = LayoutTemplateTargets.ContentPage,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Rows = new[] { "auto", "auto", "auto" },
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {1, 1}, new[] {1, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 2}, new[] {1, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 3}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {1, 4}, new[] {1, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
private static readonly LayoutTemplate TaskOnLeftTemplate = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.TaskOnLeft,
Target = LayoutTemplateTargets.Task | LayoutTemplateTargets.Quiz,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Columns = new[] { "1", "1" },
Rows = new[] { "auto", "auto", "auto" },
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {1, 1}, new[] {1, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 2}, new[] {1, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 3}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {1, 4}, new[] {1, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
private static readonly LayoutTemplate TaskOnRightTemplate = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.TaskOnRight,
Target = LayoutTemplateTargets.Task | LayoutTemplateTargets.Quiz,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Columns = new[] { "1", "1" },
Rows = new[] { "auto", "auto", "auto" },
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {2, 1}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {2, 1}, new[] {2, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {2, 2}, new[] {2, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {2, 3}, new[] {2, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {2, 4}, new[] {2, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
private static readonly LayoutTemplate WideTaskTemplate = new LayoutTemplate
Key = PredefinedLayoutTemplateKeys.WideTask,
Target = LayoutTemplateTargets.Task | LayoutTemplateTargets.Quiz,
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Rows = new[] { "auto", "auto", "auto" },
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Hotspots,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Video,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoYoutube,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoVimeo,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoDreamBroker,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.VideoO365,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Center,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoLauncher,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.ExtraInfoContent,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Tabs,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.FlipCards,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Slideshow,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.Heading,
Coordinates = new[] {new[] {1, 1}, new[] {1, 1}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 2}, new[] {1, 2}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Coordinates = new[] {new[] {1, 3}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
Area = AreaTypes.QuizProgressBar,
Coordinates = new[] {new[] {1, 4}, new[] {1, 4}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
ComponentKind = PredefinedComponentKinds.Accordion,
Area = AreaTypes.Component,
Coordinates = new[] {new[] {1, 1}, new[] {1, 3}},
Alignment = new LayoutAlignment
Horizontal = Alignment.Start,
Vertical = Alignment.Start,
Text = TextAlignment.Left
public static LayoutTemplate[] LayoutTemplates =
public static void Main()
var options = new JsonSerializerOptions { IgnoreNullValues = true };
options.Converters.Add(new JsonStringEnumConverter());
string ss = JsonSerializer.Serialize(
PredefinedLayoutTemplates.LayoutTemplates,
string kek = "[\n {\n \"Areas\": [\n {\n \"Area\": \"Image\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n }\n ]\n },\n {\n \"Areas\": [\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"Hotspots\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Center\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"Diploma\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Center\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"Video\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Center\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"VideoYoutube\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Center\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"VideoVimeo\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Center\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"VideoDreamBroker\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Center\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"VideoO365\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Center\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"ExtraInfoContent\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"Tabs\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"FlipCards\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"Slideshow\",\n \"Order\": 8,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n }\n ]\n },\n {\n \"Areas\": [\n {\n \"Area\": \"Heading\",\n \"Order\": 1,\n \"Coordinates\": [\n [ 1, 1 ],\n [ 1, 1 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"End\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Body\",\n \"Order\": 4,\n \"Coordinates\": [\n [ 1, 2 ],\n [ 1, 2 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"ExtraInfoLauncher\",\n \"Order\": 4,\n \"Coordinates\": [\n [ 1, 3 ],\n [ 1, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n },\n {\n \"Area\": \"QuizProgressBar\",\n \"Order\": 5,\n \"Coordinates\": [\n [ 1, 4 ],\n [ 1, 4 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n }\n ]\n },\n {\n \"Areas\": [\n {\n \"Area\": \"Component\",\n \"ComponentKind\": \"Accordion\",\n \"Order\": 10,\n \"Coordinates\": [\n [ 2, 1 ],\n [ 2, 3 ]\n ],\n \"Alignment\": {\n \"Horizontal\": \"Start\",\n \"Vertical\": \"Start\",\n \"Text\": \"Left\"\n }\n }\n ]\n }\n ]\n";
Layer[] layers = JsonSerializer.Deserialize<Layer[]>(kek, options).ToArray();
var components = new [] {
var components2 = new [] {
var layers1 = layers.ToArray();
var layers2 = layers.ToArray();
Console.Write("ALL OLD l2: ");
foreach(var l in layers2) {
Console.Write(l.Areas.Length + " ");
foreach(var layer in layers1) {
int before = layer.Areas.Length;
layer.Areas = layer.Areas.ToArray().Where(a =>
a.Area != AreaTypes.Component
|| components.Any(c => c.Kind == a.ComponentKind)
Console.Write(before.ToString() + " ");
Console.Write("ALL NEW l2: ");
foreach(var l in layers2) {
Console.Write(l.Areas.Length + " ");
foreach(var layer in layers2) {
int before = layer.Areas.Length;
layer.Areas = layer.Areas.Where(a =>
a.Area != AreaTypes.Component
|| components2.Any(c => c.Kind == a.ComponentKind)
Console.Write(before.ToString());
Console.WriteLine(" " + layer.Areas.Length);