Shape and utility commands for drawing on a Canvas. All primitives are dataclasses inheriting from DrawCommand and are passed to canvas.draw() or canvas.append().
Color parameters accept hex strings ("#FF0000") or nib.Color objects. Fill parameters additionally accept gradient objects (LinearGradient, RadialGradient, SweepGradient).
Rect¶
A rectangle drawing command.
nib.draw.Rect(x, y, width, height, corner_radius=0, fill=None, stroke=None,
stroke_width=1, opacity=1.0, blend_mode=None)
| Parameter | Type | Default | Description |
|---|---|---|---|
x |
float |
required | X coordinate of the top-left corner. |
y |
float |
required | Y coordinate of the top-left corner. |
width |
float |
required | Width of the rectangle. |
height |
float |
required | Height of the rectangle. |
corner_radius |
float |
0 |
Radius for rounded corners. 0 for sharp corners. |
fill |
str \| Color \| Gradient |
None |
Fill color or gradient. |
stroke |
str \| Color |
None |
Stroke (outline) color. |
stroke_width |
float |
1 |
Width of the stroke. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
blend_mode |
BlendMode |
None |
Blend mode for compositing. |
nib.draw.Rect(x=10, y=10, width=100, height=60, fill="#3498db", corner_radius=8)
Circle¶
A circle drawing command.
nib.draw.Circle(cx, cy, radius, fill=None, stroke=None, stroke_width=1,
opacity=1.0, blend_mode=None)
| Parameter | Type | Default | Description |
|---|---|---|---|
cx |
float |
required | X coordinate of the center. |
cy |
float |
required | Y coordinate of the center. |
radius |
float |
required | Radius of the circle. |
fill |
str \| Color \| Gradient |
None |
Fill color or gradient. |
stroke |
str \| Color |
None |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
blend_mode |
BlendMode |
None |
Blend mode for compositing. |
nib.draw.Circle(cx=100, cy=100, radius=40, fill="#e74c3c")
Ellipse¶
An ellipse drawing command.
nib.draw.Ellipse(cx, cy, rx, ry, fill=None, stroke=None, stroke_width=1,
opacity=1.0, blend_mode=None)
| Parameter | Type | Default | Description |
|---|---|---|---|
cx |
float |
required | X coordinate of the center. |
cy |
float |
required | Y coordinate of the center. |
rx |
float |
required | Horizontal radius. |
ry |
float |
required | Vertical radius. |
fill |
str \| Color \| Gradient |
None |
Fill color or gradient. |
stroke |
str \| Color |
None |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
blend_mode |
BlendMode |
None |
Blend mode for compositing. |
nib.draw.Ellipse(cx=150, cy=100, rx=80, ry=40, fill="#2ecc71", stroke="#27ae60")
Line¶
A straight line drawing command.
nib.draw.Line(x1, y1, x2, y2, stroke="#000000", stroke_width=1,
line_cap="butt", opacity=1.0)
| Parameter | Type | Default | Description |
|---|---|---|---|
x1 |
float |
required | X coordinate of the start point. |
y1 |
float |
required | Y coordinate of the start point. |
x2 |
float |
required | X coordinate of the end point. |
y2 |
float |
required | Y coordinate of the end point. |
stroke |
str \| Color |
"#000000" |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
line_cap |
str |
"butt" |
Line cap style: "butt", "round", or "square". |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
nib.draw.Line(x1=10, y1=200, x2=390, y2=200, stroke="#2ecc71", stroke_width=2)
Arc¶
An arc drawing command.
nib.draw.Arc(cx, cy, radius, start_angle, end_angle, clockwise=True,
fill=None, stroke=None, stroke_width=1, opacity=1.0)
| Parameter | Type | Default | Description |
|---|---|---|---|
cx |
float |
required | X coordinate of the center. |
cy |
float |
required | Y coordinate of the center. |
radius |
float |
required | Radius of the arc. |
start_angle |
float |
required | Start angle in radians. |
end_angle |
float |
required | End angle in radians. |
clockwise |
bool |
True |
Whether to draw in the clockwise direction. |
fill |
str \| Color |
None |
Fill color for the arc wedge. |
stroke |
str \| Color |
None |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
import math
nib.draw.Arc(cx=100, cy=100, radius=50, start_angle=0, end_angle=math.pi,
stroke="#9b59b6", stroke_width=3)
Path¶
A polyline/polygon from a list of coordinate points.
nib.draw.Path(points, closed=False, fill=None, stroke=None, stroke_width=1,
line_join="miter", opacity=1.0)
| Parameter | Type | Default | Description |
|---|---|---|---|
points |
list[tuple[float, float]] |
required | List of (x, y) coordinate tuples. |
closed |
bool |
False |
Whether to close the path back to the first point. |
fill |
str \| Color |
None |
Fill color (only meaningful when closed=True). |
stroke |
str \| Color |
None |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
line_join |
str |
"miter" |
Line join style: "miter", "round", or "bevel". |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
nib.draw.Path(
points=[(10, 10), (100, 50), (50, 120)],
closed=True,
fill="#3498db",
stroke="#2980b9",
)
Polygon¶
A closed polygon. Convenience wrapper around Path with closed=True.
nib.draw.Polygon(points, fill=None, stroke=None, stroke_width=1, opacity=1.0)
| Parameter | Type | Default | Description |
|---|---|---|---|
points |
list[tuple[float, float]] |
required | List of (x, y) coordinate tuples defining the polygon vertices. |
fill |
str \| Color |
None |
Fill color. |
stroke |
str \| Color |
None |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
nib.draw.Polygon(
points=[(50, 0), (100, 100), (0, 100)],
fill="#e74c3c",
)
BezierPath¶
A bezier path built from typed path elements or legacy dict commands. Use the typed elements API (recommended) for type safety and IDE support. See Path Elements for the full list of element types.
nib.draw.BezierPath(elements=None, commands=None, fill=None, stroke=None,
stroke_width=1, opacity=1.0)
| Parameter | Type | Default | Description |
|---|---|---|---|
elements |
list[PathElement] |
None |
List of typed path elements (MoveTo, LineTo, CubicTo, etc.). Recommended. |
commands |
list[dict] |
None |
Legacy dict format. Deprecated; use elements instead. |
fill |
str \| Color \| Gradient |
None |
Fill color or gradient. |
stroke |
str \| Color |
None |
Stroke color. |
stroke_width |
float |
1 |
Width of the stroke. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
from nib.draw import BezierPath, MoveTo, CubicTo, Close
nib.draw.BezierPath(
elements=[
MoveTo(100, 50),
CubicTo(cp1x=100, cp1y=0, cp2x=50, cp2y=0, x=50, y=50),
CubicTo(cp1x=50, cp1y=80, cp2x=100, cp2y=120, x=100, y=150),
Close(),
],
fill="#FF0000",
)
Points¶
Draws multiple points, lines between pairs, or a connected polygon.
nib.draw.Points(points, point_mode=PointMode.POINTS, stroke="#000000",
stroke_width=2, stroke_cap="round", opacity=1.0)
| Parameter | Type | Default | Description |
|---|---|---|---|
points |
list[tuple[float, float]] |
required | List of (x, y) coordinate tuples. |
point_mode |
PointMode |
PointMode.POINTS |
How to interpret points: POINTS (individual dots), LINES (pairs of points as line segments), POLYGON (connected segments). |
stroke |
str \| Color |
"#000000" |
Stroke/point color. |
stroke_width |
float |
2 |
Point size or line width. |
stroke_cap |
str |
"round" |
Cap style for points/lines. |
opacity |
float |
1.0 |
Opacity from 0.0 to 1.0. |
nib.draw.Points(
points=[(10, 10), (50, 50), (100, 30)],
point_mode=nib.draw.PointMode.POINTS,
stroke=nib.Color.RED,
stroke_width=5,
)
Shadow¶
Draws a material-elevation shadow under a shape defined by a point path.
nib.draw.Shadow(path, elevation=5, color="#000000", opacity=0.3)
| Parameter | Type | Default | Description |
|---|---|---|---|
path |
list[tuple[float, float]] |
required | List of (x, y) points defining the shadow shape. |
elevation |
float |
5 |
Shadow elevation (material design style). |
color |
str \| Color |
"#000000" |
Shadow color. |
opacity |
float |
0.3 |
Shadow opacity. |
nib.draw.Shadow(
path=[(10, 10), (110, 10), (110, 110), (10, 110)],
elevation=10,
color="#000000",
)
Fill¶
Fills the entire canvas with a solid color or gradient.
nib.draw.Fill(fill="#FFFFFF", blend_mode=None)
| Parameter | Type | Default | Description |
|---|---|---|---|
fill |
str \| Color \| Gradient |
"#FFFFFF" |
Fill color or gradient. |
blend_mode |
BlendMode |
None |
Blend mode for compositing. |
nib.draw.Fill(fill=nib.draw.LinearGradient(
start=(0, 0), end=(400, 300),
colors=[nib.Color.RED, nib.Color.BLUE],
))
ColorFill¶
Fills the canvas with a color using a specific blend mode. Useful for tinting effects.
nib.draw.ColorFill(color="#000000", blend_mode=BlendMode.NORMAL)
| Parameter | Type | Default | Description |
|---|---|---|---|
color |
str \| Color |
"#000000" |
Color to paint. |
blend_mode |
BlendMode |
BlendMode.NORMAL |
Blend mode to apply. |
nib.draw.ColorFill(color=nib.Color.RED, blend_mode=nib.BlendMode.MULTIPLY)