@@ -1,3 +1,4 @@
1+// Package logo renders a Crush wordmark in a stylized way.
12package logo
23
34import (
@@ -42,7 +43,14 @@ func Render(version string, compact bool, o Opts) string {
4243 }
4344
4445 // Title.
45− crush := renderWord(1, !compact, letterC, letterR, letterU, letterS, letterH)
46+ const spacing = 1
47+ crush := renderWord(spacing, !compact,
48+ letterC,
49+ letterR,
50+ letterU,
51+ letterSStylized,
52+ letterH,
53+ )
4654 crushWidth := lipgloss.Width(crush)
4755 b := new(strings.Builder)
4856 for r := range strings.SplitSeq(crush, "\n") {
@@ -252,6 +260,42 @@ func letterS(stretch bool) string {
252260 )
253261}
254262
263+// letterSStylized renders the letter S in a stylized way, more so than
264+// [letterS]. It takes an integer that determines how many cells to stretch the
265+// letter. If the stretch is less than 1, it defaults to no stretching.
266+func letterSStylized(stretch bool) string {
267+ // Here's what we're making:
268+ //
269+ // ▄▀▀▀▀▀
270+ // ▀▀▀▀▀█
271+ // ▀▀▀▀▀
272+
273+ left := heredoc.Doc(`
274+ ▄
275+ ▀
276+ ▀
277+ `)
278+ center := heredoc.Doc(`
279+ ▀
280+ ▀
281+ ▀
282+ `)
283+ right := heredoc.Doc(`
284+ ▀
285+ █
286+ `)
287+ return joinLetterform(
288+ left,
289+ stretchLetterformPart(center, letterformProps{
290+ stretch: stretch,
291+ width: 3,
292+ minStretch: 7,
293+ maxStretch: 12,
294+ }),
295+ right,
296+ )
297+}
298+
255299// letterU renders the letter U in a stylized way. It takes an integer that
256300// determines how many cells to stretch the letter. If the stretch is less than
257301// 1, it defaults to no stretching.