Web View
Type-safe HTML and CSS with intuitive layout and composable styles. Inspired by Tailwindcss and Elm-UI
Write Haskell instead of CSS
Type-safe utility functions to generate styled HTML.
myPage = col (gap 10) $ do
el (bold . fontSize 32) "My page"
button (border 1) "Click Me"
Leverage the full power of Haskell functions for reuse, instead of relying on CSS.
header = bold
h1 = header . fontSize 32
h2 = header . fontSize 24
page = gap 10
myPage = col page $ do
el h1 "My Page"
...
This approach is inspired by Tailwindcss' Utility Classes
Intuitive Layouts
Easily create layouts with row
, col
, grow
, and space
holygrail :: View c ()
holygrail = layout id $ do
row section "Top Bar"
row grow $ do
col section "Left Sidebar"
col (section . grow) "Main Content"
col section "Right Sidebar"
row section "Bottom Bar"
where section = 'border' 1
Embedded CSS
Views track which styles are used in any child node, and automatically embed all CSS when rendered.
>>> renderText $ el bold "Hello"
<style type='text/css'>.bold { font-weight:bold }</style>
<div class='bold'>Hello</div>
Stateful Styles
We can apply styles when certain states apply. For example, to change the background on hover:
button (bg Primary . hover (bg PrimaryLight)) "Hover Me"
Media states allow us to create responsive designs
el (width 100 . media (MinWidth 800) (width 400))
"Big if window > 800"
Try Example Project with Nix
If you want to get a feel for web-view without cloning the project run nix run github:seanhess/web-view
to run the example webserver locally
Local Development
Nix
Prepend targets with ghc982 or ghc966 to use GHC 9.8.2 or GHC 9.6.6
nix run
starts the example project with GHC 9.8.2
nix develop
to get a shell with all dependencies installed for GHC 9.8.2.
nix develop .#ghc966-web-view
for GHC 9.6.6
You can also get a development shell for the example project with:
cd example
nix develop ../#ghc982-example
cabal run
You can import this flake's overlay to add web-view
to all package sets and override ghc966 and ghc982 with the packages to satisfy web-view
's dependencies.
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
web-view.url = "github:seanhess/web-view"; # or "path:/path/to/cloned/web-view";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, web-view, flake-utils, ... }:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ web-view.overlays.default ];
};
haskellPackagesOverride = pkgs.haskell.packages.ghc966.override (old: {
overrides = pkgs.lib.composeExtensions (old.overrides or (_: _: { })) (hfinal: hprev: {
# your overrides here
});
});
in
{
devShells.default = haskellPackagesOverride.shellFor {
packages = p: [ p.web-view ];
};
}
);
}
Learn More
View Documentation on Hackage
View on Github
View Examples
Contributors