[web-devel] [Hamlet] CSS size wrapper

Michael Snoyman michael at snoyman.com
Wed Feb 16 05:25:54 CET 2011

It looks good. Instead of the mkSize TH function, if you just define
an IsString instance, then anyone using OverloadedStrings will be able
to use string literals. I haven't confirmed this yet, but it might
even be possible to embed those string literals inside Cassius and GHC
will still apply fromString appropriately.

As far as variables inside templates: I personally think that's
crossing the line again into stuff templates shouldn't be dealing
with, but I'm open for discussions. Since templates tie in so well
with Haskell, I just don't think it's worth adding a whole bunch of
extra code and syntax to make it work.


On Tue, Feb 15, 2011 at 10:55 PM, Dmitry Kurochkin
<dmitry.kurochkin at gmail.com> wrote:
> Hi Yesod developers.
> Attached are two modules to implement CSS size wrappers for Hamlet. It
> implements several types for different CSS units:
>  * em - EmSize
>  * ex - ExSize
>  * px - PixelSize
>  * % - PercentageSize
>  * cm, in, mm, pc, pt - AbsoluteSize
> You can create them using an mkSize Template Haskell function, e.g.
>  let size = $(mkSize "100%")
> All types are instances of Show, Eq, Ord, Num, Fractional and ToCss.
> This allows you to do math and interpolate it to Hamlet.
> Ideally, I wanted to have only one type and make an implicit conversion
> from string literals. But I do not know how to forbid mixing of
> incompatible units in math (e.g. 10px + 10cm) with a single type. And I
> do not know how to make implicit conversion from string literals with
> multiple types.
> I would appreciate any comments. Including on naming style, type design,
> API and overall usefulness. Keep in mind that this is the first time I
> use Template Haskell, so the code may be not optimal and plain ugly
> (e.g. can we use quasi quotes instead of directly messing with TH?)
> BTW Michael, one more thing I miss in Hamlet is defining variables in
> templates. I would prefer to put simple CSS-related constants directly
> in Cassius instead of a dedicated module. Is it possible to implement?
> Regards,
>  Dmitry

More information about the web-devel mailing list