• 3 Posts
  • 66 Comments
Joined 1 year ago
cake
Cake day: June 30th, 2023

help-circle



  • Paradox@lemdro.idOPtoProgramming@beehaw.orgCSS is fun again
    link
    fedilink
    English
    arrow-up
    2
    ·
    1 year ago

    They can both model any color equally well, it’s just oklch works even closer to how we perceive colors changing. LAB and all derivatives are in Cartesian space, with luminance, a, and b being the defining axises. Luminance is self explanatory, but a and b are just axises of how much red/green and blue/yellow there is. It can be difficult to think of a color in how much blue it is, for example, when the color is something like nearly pure red. They both affect the hue output, so varying one can create strange, unintuitive colors

    LCH works in polar space, like a color wheel. L is still luminance, c is the “colorfulness” and h is the hue. H and C let you set the same values a and b would, but in a more human way. We’re used to thinking about colors changing independent of how much of a color there is, and that’s what LCH does. Vary only the h and you get very different colors. Vary only the c and you get the same color but in different amounts of saturation, from full color to no color




  • Data comes out as a map or keyword list, which is then turned into the repository struct in question. If you want raw db data you can get that too. And you can have multiple structs that are backed by the same persistent dataset. It’s quite elegant.

    Queries themselves are constructed using a language that is near SQL, but far more composable:

    Repo.one(from p in Post, join: c in assoc(p, :comments), where: p.id == ^post_id)
    

    Queries themselves are composable

    query = from u in User, where: u.age > 18
    
    query = from u in query, select: u.name
    

    And can be written in a keyword style, like the above examples, or a functional style, like the rest of elixir:

    User
    |> where([u], u.age > 18)
    |> select([u], u.name)
    

    None of these “queries” will execute until you tell the Repo to do something. For that, you have commands like Repo.all and Repo.one, the latter of which sticks a limit: 1 on the end of the provided query


  • I much prefer the repository pattern, as used by sequel and Ecto

    Your models are essentially just enhanced structs. They hold information about the shape of data. Generally don’t hold any validations or logic related to storing the data. You perform changes on the data using changesets, which handle validation and generating the transaction to persist the data

    It works extremely well, and I’ve yet to encounter the funky problems ActiveRecord could give you











  • The amount of code you save grows with your codebase. It was 18% for that one, small example. In a larger codebase it can be quite a bit higher.

    While I have, more or less, moved to just writing html-style templates, I do miss how easy it was to refactor something to have a different tag name. Vim and other editors do have shortcuts that make it easy to change both the opening and closing tag, but in indent based syntax, I didn’t have to worry about this. There was only one tag to change.


  • CSS has been growing a lot of “super powers” lately, that used to require a pre-processor. Custom properties (variables), nesting, calc, and color-mix used to be things we’d reach for a preprocessor for, but can now be done 100% in pure CSS. And generally, the CSS based versions are better than their old preprocessor counterparts. calc can mix units, so you can easily do things like calc(100% - 1rem) to subtract a rem from 100% of the parent container. Can’t do that in Sass. Custom properties can be set by Javascript, or by media queries, and follow CSS scoping rules. Thats how I handle light/dark mode on my site.


  • Builder is mostly targeted at building XML files, and so compared to XML its fairly terse. HTML is just a nice also-have. There are template langs in ruby that are a lot closer to the Elixir temple variant, but I can’t remember any of them off the top of my head haha.

    A good template would make interfacing “easy”. JSX[1] is a very good example of how you can interface quite easily, and the templates used in Surface work really well to bridge some of the complexities of a server-rendered but client-dependent syntax.


    1. I know JSX isn’t a template language, the differences don’t matter for the purpose of this discussion ↩︎


  • Nim does a lot of things very well, I love writing JSON and parsing JSON in Nim, probably the best experience I’ve had with JSON, followed shortly by just implementing it as a protocol in Elixir.

    Karax’s pattern of just using language constructs to assemble HTML isn’t really novel, as nice as it is; Ruby has had one for ages in Builder (and several offshoots), Elixir has Temple, and there are probably some in other languages. They’re sort of one level of abstraction less than slim/haml, but its quite pleasant writing them. But they suffer some of the same issues Slim/Haml suffer, but also can suffer when trying to use them with component frameworks, or anything that exposes custom tags. This can, of course, be solved via metaprogramming or language-level templates, but it is a concern