1// Package styles provides default styles for the glamour package.
2package styles
3
4//go:generate go run ../internal/generate-style-json
5
6import (
7 "github.com/charmbracelet/glamour/v2/ansi"
8)
9
10const (
11 defaultListIndent = 2
12 defaultListLevelIndent = 4
13 defaultMargin = 2
14)
15
16// Default styles.
17const (
18 AsciiStyle = "ascii" //nolint: revive
19 DarkStyle = "dark"
20 DraculaStyle = "dracula"
21 TokyoNightStyle = "tokyo-night"
22 LightStyle = "light"
23 NoTTYStyle = "notty"
24 PinkStyle = "pink"
25)
26
27var (
28 // ASCIIStyleConfig uses only ASCII characters.
29 ASCIIStyleConfig = ansi.StyleConfig{
30 Document: ansi.StyleBlock{
31 StylePrimitive: ansi.StylePrimitive{
32 BlockPrefix: "\n",
33 BlockSuffix: "\n",
34 },
35 Margin: uintPtr(defaultMargin),
36 },
37 BlockQuote: ansi.StyleBlock{
38 StylePrimitive: ansi.StylePrimitive{},
39 Indent: uintPtr(1),
40 IndentToken: stringPtr("| "),
41 },
42 Paragraph: ansi.StyleBlock{
43 StylePrimitive: ansi.StylePrimitive{},
44 },
45 List: ansi.StyleList{
46 StyleBlock: ansi.StyleBlock{
47 StylePrimitive: ansi.StylePrimitive{},
48 },
49 LevelIndent: defaultListLevelIndent,
50 },
51 Heading: ansi.StyleBlock{
52 StylePrimitive: ansi.StylePrimitive{
53 BlockSuffix: "\n",
54 },
55 },
56 H1: ansi.StyleBlock{
57 StylePrimitive: ansi.StylePrimitive{
58 Prefix: "# ",
59 },
60 },
61 H2: ansi.StyleBlock{
62 StylePrimitive: ansi.StylePrimitive{
63 Prefix: "## ",
64 },
65 },
66 H3: ansi.StyleBlock{
67 StylePrimitive: ansi.StylePrimitive{
68 Prefix: "### ",
69 },
70 },
71 H4: ansi.StyleBlock{
72 StylePrimitive: ansi.StylePrimitive{
73 Prefix: "#### ",
74 },
75 },
76 H5: ansi.StyleBlock{
77 StylePrimitive: ansi.StylePrimitive{
78 Prefix: "##### ",
79 },
80 },
81 H6: ansi.StyleBlock{
82 StylePrimitive: ansi.StylePrimitive{
83 Prefix: "###### ",
84 },
85 },
86 Strikethrough: ansi.StylePrimitive{
87 BlockPrefix: "~~",
88 BlockSuffix: "~~",
89 },
90 Emph: ansi.StylePrimitive{
91 BlockPrefix: "*",
92 BlockSuffix: "*",
93 },
94 Strong: ansi.StylePrimitive{
95 BlockPrefix: "**",
96 BlockSuffix: "**",
97 },
98 HorizontalRule: ansi.StylePrimitive{
99 Format: "\n--------\n",
100 },
101 Item: ansi.StylePrimitive{
102 BlockPrefix: "⢠",
103 },
104 Enumeration: ansi.StylePrimitive{
105 BlockPrefix: ". ",
106 },
107 Task: ansi.StyleTask{
108 Ticked: "[x] ",
109 Unticked: "[ ] ",
110 },
111 ImageText: ansi.StylePrimitive{
112 Format: "Image: {{.text}} ā",
113 },
114 Code: ansi.StyleBlock{
115 StylePrimitive: ansi.StylePrimitive{
116 BlockPrefix: "`",
117 BlockSuffix: "`",
118 },
119 },
120 CodeBlock: ansi.StyleCodeBlock{
121 StyleBlock: ansi.StyleBlock{
122 Margin: uintPtr(defaultMargin),
123 },
124 },
125 Table: ansi.StyleTable{
126 CenterSeparator: stringPtr("|"),
127 ColumnSeparator: stringPtr("|"),
128 RowSeparator: stringPtr("-"),
129 },
130 DefinitionDescription: ansi.StylePrimitive{
131 BlockPrefix: "\n* ",
132 },
133 }
134
135 // DarkStyleConfig is the default dark style.
136 DarkStyleConfig = ansi.StyleConfig{
137 Document: ansi.StyleBlock{
138 StylePrimitive: ansi.StylePrimitive{
139 BlockPrefix: "\n",
140 BlockSuffix: "\n",
141 Color: stringPtr("252"),
142 },
143 Margin: uintPtr(defaultMargin),
144 },
145 BlockQuote: ansi.StyleBlock{
146 StylePrimitive: ansi.StylePrimitive{},
147 Indent: uintPtr(1),
148 IndentToken: stringPtr("ā "),
149 },
150 List: ansi.StyleList{
151 LevelIndent: defaultListIndent,
152 },
153 Heading: ansi.StyleBlock{
154 StylePrimitive: ansi.StylePrimitive{
155 BlockSuffix: "\n",
156 Color: stringPtr("39"),
157 Bold: boolPtr(true),
158 },
159 },
160 H1: ansi.StyleBlock{
161 StylePrimitive: ansi.StylePrimitive{
162 Prefix: " ",
163 Suffix: " ",
164 Color: stringPtr("228"),
165 BackgroundColor: stringPtr("63"),
166 Bold: boolPtr(true),
167 },
168 },
169 H2: ansi.StyleBlock{
170 StylePrimitive: ansi.StylePrimitive{
171 Prefix: "## ",
172 },
173 },
174 H3: ansi.StyleBlock{
175 StylePrimitive: ansi.StylePrimitive{
176 Prefix: "### ",
177 },
178 },
179 H4: ansi.StyleBlock{
180 StylePrimitive: ansi.StylePrimitive{
181 Prefix: "#### ",
182 },
183 },
184 H5: ansi.StyleBlock{
185 StylePrimitive: ansi.StylePrimitive{
186 Prefix: "##### ",
187 },
188 },
189 H6: ansi.StyleBlock{
190 StylePrimitive: ansi.StylePrimitive{
191 Prefix: "###### ",
192 Color: stringPtr("35"),
193 Bold: boolPtr(false),
194 },
195 },
196 Strikethrough: ansi.StylePrimitive{
197 CrossedOut: boolPtr(true),
198 },
199 Emph: ansi.StylePrimitive{
200 Italic: boolPtr(true),
201 },
202 Strong: ansi.StylePrimitive{
203 Bold: boolPtr(true),
204 },
205 HorizontalRule: ansi.StylePrimitive{
206 Color: stringPtr("240"),
207 Format: "\n--------\n",
208 },
209 Item: ansi.StylePrimitive{
210 BlockPrefix: "⢠",
211 },
212 Enumeration: ansi.StylePrimitive{
213 BlockPrefix: ". ",
214 },
215 Task: ansi.StyleTask{
216 StylePrimitive: ansi.StylePrimitive{},
217 Ticked: "[ā] ",
218 Unticked: "[ ] ",
219 },
220 Link: ansi.StylePrimitive{
221 Color: stringPtr("30"),
222 Underline: boolPtr(true),
223 },
224 LinkText: ansi.StylePrimitive{
225 Color: stringPtr("35"),
226 Bold: boolPtr(true),
227 },
228 Image: ansi.StylePrimitive{
229 Color: stringPtr("212"),
230 Underline: boolPtr(true),
231 },
232 ImageText: ansi.StylePrimitive{
233 Color: stringPtr("243"),
234 Format: "Image: {{.text}} ā",
235 },
236 Code: ansi.StyleBlock{
237 StylePrimitive: ansi.StylePrimitive{
238 Prefix: " ",
239 Suffix: " ",
240 Color: stringPtr("203"),
241 BackgroundColor: stringPtr("236"),
242 },
243 },
244 CodeBlock: ansi.StyleCodeBlock{
245 StyleBlock: ansi.StyleBlock{
246 StylePrimitive: ansi.StylePrimitive{
247 Color: stringPtr("244"),
248 },
249 Margin: uintPtr(defaultMargin),
250 },
251 Chroma: &ansi.Chroma{
252 Text: ansi.StylePrimitive{
253 Color: stringPtr("#C4C4C4"),
254 },
255 Error: ansi.StylePrimitive{
256 Color: stringPtr("#F1F1F1"),
257 BackgroundColor: stringPtr("#F05B5B"),
258 },
259 Comment: ansi.StylePrimitive{
260 Color: stringPtr("#676767"),
261 },
262 CommentPreproc: ansi.StylePrimitive{
263 Color: stringPtr("#FF875F"),
264 },
265 Keyword: ansi.StylePrimitive{
266 Color: stringPtr("#00AAFF"),
267 },
268 KeywordReserved: ansi.StylePrimitive{
269 Color: stringPtr("#FF5FD2"),
270 },
271 KeywordNamespace: ansi.StylePrimitive{
272 Color: stringPtr("#FF5F87"),
273 },
274 KeywordType: ansi.StylePrimitive{
275 Color: stringPtr("#6E6ED8"),
276 },
277 Operator: ansi.StylePrimitive{
278 Color: stringPtr("#EF8080"),
279 },
280 Punctuation: ansi.StylePrimitive{
281 Color: stringPtr("#E8E8A8"),
282 },
283 Name: ansi.StylePrimitive{
284 Color: stringPtr("#C4C4C4"),
285 },
286 NameBuiltin: ansi.StylePrimitive{
287 Color: stringPtr("#FF8EC7"),
288 },
289 NameTag: ansi.StylePrimitive{
290 Color: stringPtr("#B083EA"),
291 },
292 NameAttribute: ansi.StylePrimitive{
293 Color: stringPtr("#7A7AE6"),
294 },
295 NameClass: ansi.StylePrimitive{
296 Color: stringPtr("#F1F1F1"),
297 Underline: boolPtr(true),
298 Bold: boolPtr(true),
299 },
300 NameDecorator: ansi.StylePrimitive{
301 Color: stringPtr("#FFFF87"),
302 },
303 NameFunction: ansi.StylePrimitive{
304 Color: stringPtr("#00D787"),
305 },
306 LiteralNumber: ansi.StylePrimitive{
307 Color: stringPtr("#6EEFC0"),
308 },
309 LiteralString: ansi.StylePrimitive{
310 Color: stringPtr("#C69669"),
311 },
312 LiteralStringEscape: ansi.StylePrimitive{
313 Color: stringPtr("#AFFFD7"),
314 },
315 GenericDeleted: ansi.StylePrimitive{
316 Color: stringPtr("#FD5B5B"),
317 },
318 GenericEmph: ansi.StylePrimitive{
319 Italic: boolPtr(true),
320 },
321 GenericInserted: ansi.StylePrimitive{
322 Color: stringPtr("#00D787"),
323 },
324 GenericStrong: ansi.StylePrimitive{
325 Bold: boolPtr(true),
326 },
327 GenericSubheading: ansi.StylePrimitive{
328 Color: stringPtr("#777777"),
329 },
330 Background: ansi.StylePrimitive{
331 BackgroundColor: stringPtr("#373737"),
332 },
333 },
334 },
335 Table: ansi.StyleTable{
336 StyleBlock: ansi.StyleBlock{
337 StylePrimitive: ansi.StylePrimitive{},
338 },
339 },
340 DefinitionDescription: ansi.StylePrimitive{
341 BlockPrefix: "\nš ¶ ",
342 },
343 }
344
345 // LightStyleConfig is the default light style.
346 LightStyleConfig = ansi.StyleConfig{
347 Document: ansi.StyleBlock{
348 StylePrimitive: ansi.StylePrimitive{
349 BlockPrefix: "\n",
350 BlockSuffix: "\n",
351 Color: stringPtr("234"),
352 },
353 Margin: uintPtr(defaultMargin),
354 },
355 BlockQuote: ansi.StyleBlock{
356 StylePrimitive: ansi.StylePrimitive{},
357 Indent: uintPtr(1),
358 IndentToken: stringPtr("ā "),
359 },
360 List: ansi.StyleList{
361 LevelIndent: defaultListIndent,
362 },
363 Heading: ansi.StyleBlock{
364 StylePrimitive: ansi.StylePrimitive{
365 BlockSuffix: "\n",
366 Color: stringPtr("27"),
367 Bold: boolPtr(true),
368 },
369 },
370 H1: ansi.StyleBlock{
371 StylePrimitive: ansi.StylePrimitive{
372 Prefix: " ",
373 Suffix: " ",
374 Color: stringPtr("228"),
375 BackgroundColor: stringPtr("63"),
376 Bold: boolPtr(true),
377 },
378 },
379 H2: ansi.StyleBlock{
380 StylePrimitive: ansi.StylePrimitive{
381 Prefix: "## ",
382 },
383 },
384 H3: ansi.StyleBlock{
385 StylePrimitive: ansi.StylePrimitive{
386 Prefix: "### ",
387 },
388 },
389 H4: ansi.StyleBlock{
390 StylePrimitive: ansi.StylePrimitive{
391 Prefix: "#### ",
392 },
393 },
394 H5: ansi.StyleBlock{
395 StylePrimitive: ansi.StylePrimitive{
396 Prefix: "##### ",
397 },
398 },
399 H6: ansi.StyleBlock{
400 StylePrimitive: ansi.StylePrimitive{
401 Prefix: "###### ",
402 Bold: boolPtr(false),
403 },
404 },
405 Strikethrough: ansi.StylePrimitive{
406 CrossedOut: boolPtr(true),
407 },
408 Emph: ansi.StylePrimitive{
409 Italic: boolPtr(true),
410 },
411 Strong: ansi.StylePrimitive{
412 Bold: boolPtr(true),
413 },
414 HorizontalRule: ansi.StylePrimitive{
415 Color: stringPtr("249"),
416 Format: "\n--------\n",
417 },
418 Item: ansi.StylePrimitive{
419 BlockPrefix: "⢠",
420 },
421 Enumeration: ansi.StylePrimitive{
422 BlockPrefix: ". ",
423 },
424 Task: ansi.StyleTask{
425 StylePrimitive: ansi.StylePrimitive{},
426 Ticked: "[ā] ",
427 Unticked: "[ ] ",
428 },
429 Link: ansi.StylePrimitive{
430 Color: stringPtr("36"),
431 Underline: boolPtr(true),
432 },
433 LinkText: ansi.StylePrimitive{
434 Color: stringPtr("29"),
435 Bold: boolPtr(true),
436 },
437 Image: ansi.StylePrimitive{
438 Color: stringPtr("205"),
439 Underline: boolPtr(true),
440 },
441 ImageText: ansi.StylePrimitive{
442 Color: stringPtr("243"),
443 Format: "Image: {{.text}} ā",
444 },
445 Code: ansi.StyleBlock{
446 StylePrimitive: ansi.StylePrimitive{
447 Prefix: " ",
448 Suffix: " ",
449 Color: stringPtr("203"),
450 BackgroundColor: stringPtr("254"),
451 },
452 },
453 CodeBlock: ansi.StyleCodeBlock{
454 StyleBlock: ansi.StyleBlock{
455 StylePrimitive: ansi.StylePrimitive{
456 Color: stringPtr("242"),
457 },
458 Margin: uintPtr(defaultMargin),
459 },
460 Chroma: &ansi.Chroma{
461 Text: ansi.StylePrimitive{
462 Color: stringPtr("#2A2A2A"),
463 },
464 Error: ansi.StylePrimitive{
465 Color: stringPtr("#F1F1F1"),
466 BackgroundColor: stringPtr("#FF5555"),
467 },
468 Comment: ansi.StylePrimitive{
469 Color: stringPtr("#8D8D8D"),
470 },
471 CommentPreproc: ansi.StylePrimitive{
472 Color: stringPtr("#FF875F"),
473 },
474 Keyword: ansi.StylePrimitive{
475 Color: stringPtr("#279EFC"),
476 },
477 KeywordReserved: ansi.StylePrimitive{
478 Color: stringPtr("#FF5FD2"),
479 },
480 KeywordNamespace: ansi.StylePrimitive{
481 Color: stringPtr("#FB406F"),
482 },
483 KeywordType: ansi.StylePrimitive{
484 Color: stringPtr("#7049C2"),
485 },
486 Operator: ansi.StylePrimitive{
487 Color: stringPtr("#FF2626"),
488 },
489 Punctuation: ansi.StylePrimitive{
490 Color: stringPtr("#FA7878"),
491 },
492 NameBuiltin: ansi.StylePrimitive{
493 Color: stringPtr("#0A1BB1"),
494 },
495 NameTag: ansi.StylePrimitive{
496 Color: stringPtr("#581290"),
497 },
498 NameAttribute: ansi.StylePrimitive{
499 Color: stringPtr("#8362CB"),
500 },
501 NameClass: ansi.StylePrimitive{
502 Color: stringPtr("#212121"),
503 Underline: boolPtr(true),
504 Bold: boolPtr(true),
505 },
506 NameConstant: ansi.StylePrimitive{
507 Color: stringPtr("#581290"),
508 },
509 NameDecorator: ansi.StylePrimitive{
510 Color: stringPtr("#A3A322"),
511 },
512 NameFunction: ansi.StylePrimitive{
513 Color: stringPtr("#019F57"),
514 },
515 LiteralNumber: ansi.StylePrimitive{
516 Color: stringPtr("#22CCAE"),
517 },
518 LiteralString: ansi.StylePrimitive{
519 Color: stringPtr("#7E5B38"),
520 },
521 LiteralStringEscape: ansi.StylePrimitive{
522 Color: stringPtr("#00AEAE"),
523 },
524 GenericDeleted: ansi.StylePrimitive{
525 Color: stringPtr("#FD5B5B"),
526 },
527 GenericEmph: ansi.StylePrimitive{
528 Italic: boolPtr(true),
529 },
530 GenericInserted: ansi.StylePrimitive{
531 Color: stringPtr("#00D787"),
532 },
533 GenericStrong: ansi.StylePrimitive{
534 Bold: boolPtr(true),
535 },
536 GenericSubheading: ansi.StylePrimitive{
537 Color: stringPtr("#777777"),
538 },
539 Background: ansi.StylePrimitive{
540 BackgroundColor: stringPtr("#373737"),
541 },
542 },
543 },
544 Table: ansi.StyleTable{
545 StyleBlock: ansi.StyleBlock{
546 StylePrimitive: ansi.StylePrimitive{},
547 },
548 },
549 DefinitionDescription: ansi.StylePrimitive{
550 BlockPrefix: "\nš ¶ ",
551 },
552 }
553
554 // PinkStyleConfig is the default pink style.
555 PinkStyleConfig = ansi.StyleConfig{
556 Document: ansi.StyleBlock{
557 Margin: uintPtr(defaultMargin),
558 },
559 BlockQuote: ansi.StyleBlock{
560 Indent: uintPtr(1),
561 IndentToken: stringPtr("ā "),
562 },
563 List: ansi.StyleList{
564 LevelIndent: defaultListIndent,
565 },
566 Heading: ansi.StyleBlock{
567 StylePrimitive: ansi.StylePrimitive{
568 BlockSuffix: "\n",
569 Color: stringPtr("212"),
570 Bold: boolPtr(true),
571 },
572 },
573 H1: ansi.StyleBlock{
574 StylePrimitive: ansi.StylePrimitive{
575 BlockSuffix: "\n",
576 BlockPrefix: "\n",
577 Prefix: "",
578 },
579 },
580 H2: ansi.StyleBlock{
581 StylePrimitive: ansi.StylePrimitive{
582 Prefix: "ā ",
583 },
584 },
585 H3: ansi.StyleBlock{
586 StylePrimitive: ansi.StylePrimitive{
587 Prefix: "ā ",
588 },
589 },
590 H4: ansi.StyleBlock{
591 StylePrimitive: ansi.StylePrimitive{
592 Prefix: "ā ",
593 },
594 },
595 H5: ansi.StyleBlock{
596 StylePrimitive: ansi.StylePrimitive{
597 Prefix: "ā ",
598 },
599 },
600 H6: ansi.StyleBlock{
601 StylePrimitive: ansi.StylePrimitive{
602 Prefix: "ā ",
603 Bold: boolPtr(false),
604 },
605 },
606 Text: ansi.StylePrimitive{},
607 Strikethrough: ansi.StylePrimitive{
608 CrossedOut: boolPtr(true),
609 },
610 Emph: ansi.StylePrimitive{
611 Italic: boolPtr(true),
612 },
613 Strong: ansi.StylePrimitive{
614 Bold: boolPtr(true),
615 },
616 HorizontalRule: ansi.StylePrimitive{
617 Color: stringPtr("212"),
618 Format: "\nāāāāāā\n",
619 },
620 Item: ansi.StylePrimitive{
621 BlockPrefix: "⢠",
622 },
623 Enumeration: ansi.StylePrimitive{
624 BlockPrefix: ". ",
625 },
626 Task: ansi.StyleTask{
627 Ticked: "[ā] ",
628 Unticked: "[ ] ",
629 },
630 Link: ansi.StylePrimitive{
631 Color: stringPtr("99"),
632 Underline: boolPtr(true),
633 },
634 LinkText: ansi.StylePrimitive{
635 Bold: boolPtr(true),
636 },
637 Image: ansi.StylePrimitive{
638 Underline: boolPtr(true),
639 },
640 ImageText: ansi.StylePrimitive{
641 Format: "Image: {{.text}}",
642 },
643 Code: ansi.StyleBlock{
644 StylePrimitive: ansi.StylePrimitive{
645 Color: stringPtr("212"),
646 BackgroundColor: stringPtr("236"),
647 Prefix: " ",
648 Suffix: " ",
649 },
650 },
651 Table: ansi.StyleTable{},
652 DefinitionList: ansi.StyleBlock{},
653 DefinitionTerm: ansi.StylePrimitive{},
654 DefinitionDescription: ansi.StylePrimitive{
655 BlockPrefix: "\nš ¶ ",
656 },
657 HTMLBlock: ansi.StyleBlock{},
658 HTMLSpan: ansi.StyleBlock{},
659 }
660
661 // NoTTYStyleConfig is the default notty style.
662 NoTTYStyleConfig = ASCIIStyleConfig
663
664 // DefaultStyles are the default styles.
665 DefaultStyles = map[string]*ansi.StyleConfig{
666 AsciiStyle: &ASCIIStyleConfig,
667 DarkStyle: &DarkStyleConfig,
668 LightStyle: &LightStyleConfig,
669 NoTTYStyle: &NoTTYStyleConfig,
670 PinkStyle: &PinkStyleConfig,
671
672 // Popular themes
673 DraculaStyle: &DraculaStyleConfig,
674 TokyoNightStyle: &TokyoNightStyleConfig,
675 }
676)
677
678func boolPtr(b bool) *bool { return &b }
679func stringPtr(s string) *string { return &s }
680func uintPtr(u uint) *uint { return &u }