d2lang/d2 · error
expected "fill" to be a valid named color ("orange"), a hex…
Error message
expected "fill" to be a valid named color ("orange"), a hex code ("#f0ff3a"), or a gradient ("linear-gradient(red, blue)") What it means
The 'fill' style key must pass color.ValidColor — a named color, hex code, or gradient. This error is returned when the fill value is invalid. Same validation pattern as stroke, applied to the shape's background fill.
Solutions
- Use a named color, hex code like "#f0ff3a", or "linear-gradient(color1, color2)".
- Validate with color.ValidColor before assigning s.Fill.Value.
- Correct hex length/characters and color name spelling.
Example fix
// before x.style.fill: #12345 // after x.style.fill: #112233
Defensive patterns
Strategy: validation
Validate before calling
if !color.ValidColor(v) {
return fmt.Errorf("fill %q is not a named color, hex code, or gradient", v)
} Type guard
func validFill(v string) bool { return color.ValidColor(v) } Try / catch
if err := applyStyle("fill", value); err != nil {
if strings.Contains(err.Error(), "fill") {
value = "transparent" // or a known-good default
}
} Prevention
- Sanity-check hex codes for '#' prefix and correct digit count.
- Run color.ValidColor on user-supplied fill values before applying.
- Keep gradients in the linear-gradient(color1, color2) form.
When it happens
Trigger: Setting style 'fill' to a non-color value, e.g. `fill: transparent-red`, `fill: #12345` (bad hex), or an unsupported function form.
Common situations: Copy-pasting CSS colors that D2 doesn't parse, typos in named colors, gradients written with unsupported syntax.
Related errors
- expected "stroke" to be a valid named color ("orange"), a…
- expected "border-radius" to be a number greater or equal to…
- expected "fill-pattern" to be one of
- expected "opacity" to be a number between 0.0 and 1.0
- expected "stroke-dash" to be a number between 0 and 10
AI-assisted analysis of d2lang/d2@0d69dca6f5 (2026-08-31).
Data as JSON: /api/errors/4218045ddf95800b.
Report an issue: GitHub.
Appendix: source
Thrown at d2graph/d2graph.go:339
f, err := strconv.ParseFloat(value, 64)
if err != nil || math.IsNaN(f) || math.IsInf(f, 0) || f < 0 || f > 1 {
return errors.New(`expected "opacity" to be a number between 0.0 and 1.0`)
}
s.Opacity.Value = value
case "stroke":
if s.Stroke == nil {
break
}
if !color.ValidColor(value) {
return errors.New(`expected "stroke" to be a valid named color ("orange"), a hex code ("#f0ff3a"), or a gradient ("linear-gradient(red, blue)")`)
}
s.Stroke.Value = value
case "fill":
if s.Fill == nil {
break
}
if !color.ValidColor(value) {
return errors.New(`expected "fill" to be a valid named color ("orange"), a hex code ("#f0ff3a"), or a gradient ("linear-gradient(red, blue)")`)
}
s.Fill.Value = value
case "fill-pattern":
if s.FillPattern == nil {
break
}
if !go2.Contains(d2ast.FillPatterns, strings.ToLower(value)) {
return fmt.Errorf(`expected "fill-pattern" to be one of: %s`, strings.Join(d2ast.FillPatterns, ", "))
}
s.FillPattern.Value = value
case "stroke-width":
if s.StrokeWidth == nil {
break
}
f, err := strconv.Atoi(value)
if err != nil || (f < 0 || f > 15) {
return errors.New(`expected "stroke-width" to be a number between 0 and 15`)
}View on GitHub (pinned to 0d69dca6f5)