Web View ============ [![Hackage](https://img.shields.io/hackage/v/web-view.svg)][hackage] 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. ```haskell 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. ```haskell 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](https://tailwindcss.com/docs/utility-first) ### Intuitive Layouts Easily create layouts with `row`, `col`, `grow`, and `space` ```haskell 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"
Hello
### Stateful Styles We can apply styles when certain states apply. For example, to change the background on hover: ```haskell button (bg Primary . hover (bg PrimaryLight)) "Hover Me" ``` Media states allow us to create responsive designs ```haskell 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. ```nix { 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][hackage] * https://hackage.haskell.org/package/web-view View on Github * https://github.com/seanhess/web-view View [Examples](https://github.com/seanhess/web-view/blob/latest/example/app/Main.hs) [hackage]: https://hackage.haskell.org/package/web-view Contributors ------------ * [Sean Hess](https://github.com/seanhess) * [Kamil Figiela](https://github.com/kfigiela) * [Pfalzgraf Martin](https://github.com/Skyfold)