|
74 | 74 | figureValue, |
75 | 75 | registry); |
76 | 76 |
|
| 77 | +var character = new Stack( |
| 78 | +[ |
| 79 | + new Fields( |
| 80 | + [ |
| 81 | + new Field(P("Name"), P("Lyra Vale")), |
| 82 | + new Field(P("Role"), P("Wayfinder")), |
| 83 | + new Field(P("Region"), P("Glasswood")), |
| 84 | + new Field(P("Status"), P("Ready")), |
| 85 | + ]) { Columns = 2, Gap = 3, Leader = P("·") }, |
| 86 | + new Rule(P("CURRENT QUEST")), |
| 87 | + new Gauge(7, 10) { Label = P("Trail"), Show = GaugeShow.Percent }, |
| 88 | + new Bullets([P("Map the moonwell"), P("Return before dawn")]), |
| 89 | +]).Bordered(P("WAYFINDER'S JOURNAL")); |
| 90 | + |
| 91 | +var fantasy = BlockLayout.Build(character.Themed(ThemePalette.Preset("fantasy")!.ToLayoutTheme()), 46); |
| 92 | +var generatedPalette = ThemePalette.Generate(new RgbColor(34, 211, 238), ThemeHarmony.Triadic, contrast: 0.35); |
| 93 | +var generated = BlockLayout.Build(character.Themed(generatedPalette.ToLayoutTheme()), 46); |
| 94 | +WriteThemePage( |
| 95 | + Path.Combine(output, "theming.html"), |
| 96 | + "One layout, a whole new world", |
| 97 | + "Presets and generated palettes recolour every semantic part — and can change the shapes too.", |
| 98 | + fantasy, |
| 99 | + generated, |
| 100 | + registry); |
| 101 | + |
77 | 102 | static MarkupText P(string text) => MarkupText.Plain(text); |
78 | 103 |
|
79 | 104 | static void WritePage(string path, string title, string subtitle, MarkupText value, MarkupRegistry registry) |
80 | 105 | { |
81 | 106 | var ansi = value.Render(MarkupFormat.Ansi, registry); |
82 | 107 | var ansiForBrowser = AnsiEscapeParser.Parse(ansi).Render(MarkupFormat.Html, registry); |
83 | 108 | var html = value.Render(MarkupFormat.Html, registry); |
84 | | - var escapedAnsi = WebUtility.HtmlEncode(ansi.Replace("\u001b", "\\e", StringComparison.Ordinal)); |
| 109 | + WriteComparisonPage( |
| 110 | + path, title, subtitle, "MarkupText <span>→</span> renderer <span>→</span> native output", |
| 111 | + "ANSI terminal", "SGR + cells", "terminal", ansiForBrowser, |
| 112 | + "HTML browser", "semantic elements", "browser", html); |
| 113 | +} |
| 114 | + |
| 115 | +static void WriteThemePage( |
| 116 | + string path, |
| 117 | + string title, |
| 118 | + string subtitle, |
| 119 | + MarkupText preset, |
| 120 | + MarkupText generated, |
| 121 | + MarkupRegistry registry) |
| 122 | +{ |
| 123 | + var presetHtml = AnsiEscapeParser.Parse(preset.Render(MarkupFormat.Ansi, registry)).Render(MarkupFormat.Html, registry); |
| 124 | + var generatedHtml = AnsiEscapeParser.Parse(generated.Render(MarkupFormat.Ansi, registry)).Render(MarkupFormat.Html, registry); |
| 125 | + WriteComparisonPage( |
| 126 | + path, title, subtitle, "layout <span>→</span> palette <span>→</span> themed output", |
| 127 | + "Fantasy preset", "colours + glyphs", "terminal", presetHtml, |
| 128 | + "Generated palette", "triadic harmony", "terminal", generatedHtml); |
| 129 | +} |
| 130 | + |
| 131 | +static void WriteComparisonPage( |
| 132 | + string path, |
| 133 | + string title, |
| 134 | + string subtitle, |
| 135 | + string flowHtml, |
| 136 | + string leftLabel, |
| 137 | + string leftNative, |
| 138 | + string leftClass, |
| 139 | + string leftContent, |
| 140 | + string rightLabel, |
| 141 | + string rightNative, |
| 142 | + string rightClass, |
| 143 | + string rightContent) |
| 144 | +{ |
| 145 | + static string PanelBody(string cssClass, string content) => cssClass == "terminal" |
| 146 | + ? "<pre class=\"terminal\">" + content + "</pre>" |
| 147 | + : "<div class=\"browser\">" + content + "</div>"; |
85 | 148 |
|
86 | 149 | File.WriteAllText(path, $$""" |
87 | 150 | <!doctype html> |
@@ -117,26 +180,24 @@ static void WritePage(string path, string title, string subtitle, MarkupText val |
117 | 180 | .browser .ms-figure-image { max-width: 220px; margin: 0 20px 14px 0; filter: drop-shadow(0 10px 20px rgba(0, 0, 0, .35)); } |
118 | 181 | .browser .ms-figure { font-family: "DejaVu Sans", sans-serif; } |
119 | 182 | .browser .ms-text { line-height: 1.65; } |
120 | | -.source { display: none; } |
121 | 183 | </style> |
122 | 184 | </head> |
123 | 185 | <body> |
124 | 186 | <main> |
125 | 187 | <header> |
126 | 188 | <div><h1>{{WebUtility.HtmlEncode(title)}}</h1><p class="subtitle">{{WebUtility.HtmlEncode(subtitle)}}</p></div> |
127 | | - <div class="flow">MarkupText <span>→</span> renderer <span>→</span> native output</div> |
| 189 | + <div class="flow">{{flowHtml}}</div> |
128 | 190 | </header> |
129 | 191 | <section class="comparison"> |
130 | 192 | <article class="panel"> |
131 | | - <div class="panel-head"><i class="dot"></i><span class="label">ANSI terminal</span><span class="native">SGR + cells</span></div> |
132 | | - <pre class="terminal">{{ansiForBrowser}}</pre> |
| 193 | + <div class="panel-head"><i class="dot"></i><span class="label">{{WebUtility.HtmlEncode(leftLabel)}}</span><span class="native">{{WebUtility.HtmlEncode(leftNative)}}</span></div> |
| 194 | + {{PanelBody(leftClass, leftContent)}} |
133 | 195 | </article> |
134 | 196 | <article class="panel"> |
135 | | - <div class="panel-head"><i class="dot"></i><span class="label">HTML browser</span><span class="native">semantic elements</span></div> |
136 | | - <div class="browser">{{html}}</div> |
| 197 | + <div class="panel-head"><i class="dot"></i><span class="label">{{WebUtility.HtmlEncode(rightLabel)}}</span><span class="native">{{WebUtility.HtmlEncode(rightNative)}}</span></div> |
| 198 | + {{PanelBody(rightClass, rightContent)}} |
137 | 199 | </article> |
138 | 200 | </section> |
139 | | - <pre class="source">{{escapedAnsi}}</pre> |
140 | 201 | </main> |
141 | 202 | </body> |
142 | 203 | </html> |
|
0 commit comments