miso
Copyright(C) 2016-2026 David M. Johnson
LicenseBSD3-style (see the file LICENSE)
MaintainerDavid M. Johnson <code@dmj.io>
Stabilityexperimental
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell2010

Miso.Canvas

Description

Overview

Miso.Canvas is a typed Haskell wrapper around the browser's HTML5 Canvas 2D API. It lets you draw graphics imperatively inside a miso View without leaving Haskell.

The central abstraction is the Canvas monad:

type Canvas a = ReaderT CanvasContext2D IO a

Every drawing operation (fillRect, arc, fillText, …) is a Canvas action that reads the implicit CanvasRenderingContext2D and calls the corresponding JavaScript method.

Quick start

Wire a canvas element into your view using canvas. The runtime calls init once when the DOM node is created and draw after every VDOM update, passing the state returned by init:

import           Miso
import           Miso.Canvas
import qualified Miso.CSS       as CSS
import qualified Miso.CSS.Color as Color
import qualified Miso.Html.Property as HP

view :: Model -> View Model Action
view m =
  canvas
    [ HP.width_ "800", HP.height_ "480" ]
    (\_ -> pure ())          -- init: no canvas-level state needed
    (\() -> drawScene m)    -- draw: closure over current model

drawScene :: Model -> Canvas ()
drawScene m = do
  clearRect (0, 0, 800, 480)
  fillStyle (color Color.cornflowerblue)
  fillRect  (0, 0, 800, 480)
  fillStyle (color Color.white)
  font      "24px sans-serif"
  fillText  ("Hello, miso!", 32, 48)

canvas vs canvas_

Two element constructors are provided:

  • canvas — the standard variant. Acquires a "2d" CanvasContext2D automatically and runs init / draw inside the Canvas monad.
  • canvas_ — the escape hatch. init and draw receive raw IO callbacks and a DOMRef, letting you hand the element off to a third-party JavaScript library (e.g. Three.js, WebGL) that manages its own context.

Styling

fillStyle and strokeStyle accept a StyleArg, which can be a plain Color (via color), a Gradient (via gradient), or a Pattern (via pattern_):

fillStyle (color Color.red)
fillStyle (gradient myGradient)
fillStyle (pattern_ myPattern)

Note: color and color have the same name but different types. Import Miso.CSS qualified to avoid ambiguity when using both in the same file.

See also

Synopsis

Types

type Canvas a = ReaderT CanvasContext2D IO a Source #

DSL for expressing operations on canvas_

newtype Pattern Source #

Type used to hold a canvas Pattern

Constructors

Pattern JSVal 

Instances

Instances details
FromJSVal Pattern Source # 
Instance details

Defined in Miso.Canvas

ToJSVal Pattern Source # 
Instance details

Defined in Miso.Canvas

newtype Gradient Source #

Type used to hold a Gradient

Constructors

Gradient JSVal 

Instances

Instances details
FromJSVal Gradient Source # 
Instance details

Defined in Miso.Canvas

ToArgs Gradient Source # 
Instance details

Defined in Miso.Canvas

Methods

toArgs :: Gradient -> IO [JSVal] Source #

ToJSVal Gradient Source # 
Instance details

Defined in Miso.Canvas

newtype ImageData Source #

Type used to hold ImageData

Constructors

ImageData JSVal 

Instances

Instances details
FromJSVal ImageData Source # 
Instance details

Defined in Miso.Canvas

ToArgs ImageData Source # 
Instance details

Defined in Miso.Canvas

Methods

toArgs :: ImageData -> IO [JSVal] Source #

ToJSVal ImageData Source # 
Instance details

Defined in Miso.Canvas

ToObject ImageData Source # 
Instance details

Defined in Miso.Canvas

data LineCapType Source #

Instances

Instances details
Show LineCapType Source # 
Instance details

Defined in Miso.Canvas

Eq LineCapType Source # 
Instance details

Defined in Miso.Canvas

ToArgs LineCapType Source # 
Instance details

Defined in Miso.Canvas

ToJSVal LineCapType Source # 
Instance details

Defined in Miso.Canvas

data PatternType Source #

Various patterns used in the canvas API

Constructors

Repeat 
RepeatX 
RepeatY 
NoRepeat 

Instances

Instances details
FromJSVal PatternType Source # 
Instance details

Defined in Miso.Canvas

ToJSVal PatternType Source # 
Instance details

Defined in Miso.Canvas

data LineJoinType Source #

Instances

Instances details
Show LineJoinType Source # 
Instance details

Defined in Miso.Canvas

Eq LineJoinType Source # 
Instance details

Defined in Miso.Canvas

ToArgs LineJoinType Source # 
Instance details

Defined in Miso.Canvas

ToJSVal LineJoinType Source # 
Instance details

Defined in Miso.Canvas

data DirectionType Source #

Left-to-right, right-to-left, or inherit direction type.

Constructors

LTR 
RTL 
Inherit 

Instances

Instances details
Show DirectionType Source # 
Instance details

Defined in Miso.Canvas

Eq DirectionType Source # 
Instance details

Defined in Miso.Canvas

ToArgs DirectionType Source # 
Instance details

Defined in Miso.Canvas

ToJSVal DirectionType Source # 
Instance details

Defined in Miso.Canvas

data TextAlignType Source #

Text alignment type

Instances

Instances details
Show TextAlignType Source # 
Instance details

Defined in Miso.Canvas

Eq TextAlignType Source # 
Instance details

Defined in Miso.Canvas

ToArgs TextAlignType Source # 
Instance details

Defined in Miso.Canvas

ToJSVal TextAlignType Source # 
Instance details

Defined in Miso.Canvas

data StyleArg Source #

Color, Gradient or Pattern styling

Instances

Instances details
ToArgs StyleArg Source # 
Instance details

Defined in Miso.Canvas

Methods

toArgs :: StyleArg -> IO [JSVal] Source #

ToJSVal StyleArg Source # 
Instance details

Defined in Miso.Canvas

type Coord = (Double, Double) Source #

An (x,y) coordinate.

Property

canvas Source #

Arguments

:: forall model action canvasState. (FromJSVal canvasState, ToJSVal canvasState) 
=> [Attribute action] 
-> (DOMRef -> Canvas canvasState)

Init function, takes DOMRef as arg, returns canvas init. state.

-> (canvasState -> Canvas ())

Callback to render graphics using this canvas' context, takes init state as arg.

-> View model action 

Element for drawing on a <canvas>. This function abstracts over the context and interpret callback, including dimension ("2d" or "3d") canvas.

canvas_ Source #

Arguments

:: forall model action canvasState. (FromJSVal canvasState, ToJSVal canvasState) 
=> [Attribute action] 
-> (DOMRef -> IO canvasState)

Init function, takes DOMRef as arg, returns canvas init. state.

-> (canvasState -> IO ())

Callback to render graphics using this canvas' context, takes init state as arg.

-> View model action 

Another variant of canvas, this is not specialized to ReaderT. This is useful when building applications with three.js, or other libraries where explicit context is not necessary.

API

set :: ToArgs args => MisoString -> args -> Canvas () Source #

Property setter specialized to Canvas.

globalCompositeOperation :: CompositeOperation -> Canvas ()
globalCompositeOperation = set "globalCompositeOperation"

addColorStop Source #

Arguments

:: (Double, Color)

(stop, color) — position along the gradient (0.0–1.0) and the colour at that stop

-> Gradient

The gradient object to add the colour stop to

-> Canvas () 

Smart constructors

gradient :: Gradient -> StyleArg Source #

Smart constructor for Gradient when using StyleArg

pattern_ :: Pattern -> StyleArg Source #

Smart constructor for Pattern when using StyleArg

color :: Color -> StyleArg Source #

Smart constructor for Color when using StyleArg