v1-to-v2-migration.md

 1# Lip Gloss v1 to v2 Migration Quick Reference
 2
 3## Import Path
 4
 5```
 6github.com/charmbracelet/lipgloss     -> charm.land/lipgloss/v2
 7github.com/charmbracelet/lipgloss/table -> charm.land/lipgloss/v2/table
 8github.com/charmbracelet/lipgloss/tree  -> charm.land/lipgloss/v2/tree
 9github.com/charmbracelet/lipgloss/list  -> charm.land/lipgloss/v2/list
10```
11
12## Removed APIs
13
14| v1 | v2 Replacement |
15|---|---|
16| `type Renderer` | Removed entirely |
17| `DefaultRenderer()` | Not needed |
18| `NewRenderer(w, opts...)` | Not needed |
19| `ColorProfile()` | `colorprofile.Detect(w, env)` |
20| `SetColorProfile(p)` | Set `lipgloss.Writer.Profile` |
21| `HasDarkBackground()` (no args) | `lipgloss.HasDarkBackground(in, out)` |
22| `type TerminalColor` | `image/color.Color` |
23| `type Color string` | `func Color(string) color.Color` |
24| `type AdaptiveColor` | `compat.AdaptiveColor` or `LightDark()` |
25| `type CompleteColor` | `compat.CompleteColor` or `Complete()` |
26| `WithWhitespaceForeground(c)` | `WithWhitespaceStyle(s)` |
27| `WithWhitespaceBackground(c)` | `WithWhitespaceStyle(s)` |
28| `renderer.NewStyle()` | `lipgloss.NewStyle()` |
29| `style.Copy()` | plain assignment `copy := style` |
30
31## Color System Changes
32
33```go
34// v1: Color is a string type
35var c lipgloss.Color = "#ff00ff"
36
37// v2: Color is a function returning color.Color
38var c color.Color = lipgloss.Color("#ff00ff")
39
40// v1: methods accept TerminalColor
41func (s Style) Foreground(c TerminalColor) Style
42
43// v2: methods accept color.Color (from image/color)
44func (s Style) Foreground(c color.Color) Style
45```
46
47## Printing Changes
48
49```go
50// v1: fmt works, renderer handles downsampling
51fmt.Println(style.Render("hello"))
52
53// v2: use lipgloss writers for downsampling
54lipgloss.Println(style.Render("hello"))
55// Available: Print, Println, Printf, Fprint, Fprintln, Fprintf,
56//            Sprint, Sprintln, Sprintf
57```
58
59## Adaptive Colors
60
61```go
62// v1
63color := lipgloss.AdaptiveColor{Light: "#fff", Dark: "#000"}
64
65// v2 - recommended
66hasDark := lipgloss.HasDarkBackground(os.Stdin, os.Stdout)
67ld := lipgloss.LightDark(hasDark)
68color := ld(lipgloss.Color("#fff"), lipgloss.Color("#000"))
69
70// v2 - compat (quick migration)
71import "charm.land/lipgloss/v2/compat"
72color := compat.AdaptiveColor{
73    Light: lipgloss.Color("#fff"),
74    Dark:  lipgloss.Color("#000"),
75}
76```
77
78## New in v2
79
80- `UnderlineStyle()` / `UnderlineColor()` - curly, dotted, dashed, double underlines
81- `PaddingChar()` / `MarginChar()` - custom fill characters
82- `Hyperlink()` - clickable links in supporting terminals
83- `BorderForegroundBlend()` - gradient borders
84- `Blend1D()` / `Blend2D()` - color gradient generation
85- `NewLayer()` / `Compose()` - cell-based compositor
86- `Wrap()` - ANSI-aware text wrapping
87- Named ANSI color constants (`lipgloss.Red`, `lipgloss.BrightCyan`, etc.)
88- `lipgloss.Alpha()`, `lipgloss.Darken()`, `lipgloss.Lighten()`, `lipgloss.Complementary()`