From c9e86bfa80f4b7d4433b206e491b8e71af8e534a Mon Sep 17 00:00:00 2001
From: stephann <3025661+stephannv@users.noreply.github.com>
Date: Sat, 14 Sep 2024 15:14:17 -0300
Subject: [PATCH] release: Prepare 0.8.0 release (#73)
---
CHANGELOG.md | 305 ++++++++++++++++++++++++++++++++++++---
shard.yml | 2 +-
src/blueprint/version.cr | 2 +-
3 files changed, 283 insertions(+), 26 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f18c1a9..3d2b461 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,19 +2,138 @@
All notable changes to this project will be documented on .
-## [0.7.0] - 2023-09-09
+# [0.8.0] - 2024-09-14
+
+### Overhauled docs
+The [Blueprint Docs](https://stephannv.github.io/blueprint-docs/) was revised.
+
+### Style Variants (Experimental)
+Defining a schema for variants within the component class to compile the final list of CSS classes.
+
+```crystal
+class AlertComponent
+ include Blueprint::HTML
+
+ style_builder do
+ base "alert"
+
+ variants do
+ type {
+ info "alert-info"
+ danger "alert-danger"
+ }
+
+ size {
+ xs "text-xs p-2"
+ md "text-md p-4"
+ lg "text-lg p-6"
+ }
+
+ closable {
+ yes "alert-closable"
+ }
+
+ special {
+ yes "alert-special"
+ no "alert-default"
+ }
+ end
+
+ defaults type: :info, size: :md
+ end
+
+ def blueprint
+ div(class: build_style(type: :danger, size: :lg, closable: true)) do
+ "My styled alert component"
+ end
+ end
+end
+
+puts AlertComponent.build_style(type: :info, size: :xs, special: false)
+# "alert alert-info text-xs p-2 alert-default"
+
+puts AlertComponent.new.to_s
+#
+# My styled alert component
+#
+```
+
+### Tokens (Experimental)
+Allows to build classes based on conditionals.
+
+```crystal
+class UserComponent
+ include Blueprint::HTML
+
+ def blueprint
+ h1 class: tokens(admin?: "is-admin", moderator?: "is-moderator") do
+ "Jane Doe"
+ end
+ end
+
+ def admin?
+ false
+ end
+
+ def moderator?
+ true
+ end
+end
+
+puts UserComponent.new.to_s
+
+#
+# Jane Doe
+#
+```
+
+### Add `#safe` helper
+The `#safe` method wraps the given object in a `Blueprint::SafeValue`, indicating
+to Blueprint that the content should be rendered without escaping.
+
+### BREAKING: Change `#to_html` to `#to_s`
+Instead of `MyComponent.new.to_html` you should use `MyComponent.new.to_s`.
+
+### BREAKING: Remove some utils methods
+The methods `#plain(&)` and `#comment(&)` were removed, but you still can use
+the `#plain(content : String)` and `#comment(content : String)`.
+
+### BREAKING: Remove `#unsafe_raw`
+`#unsafe_raw` was removed in favor of `#raw`.
+```crystal
+# BEFORE
+unsafe_raw ""
+
+# AFTER
+raw safe("")
+```
+
+### BREAKING: Remove `Blueprint::RawHTML`
+The `Blueprint::RawHTML` included in 0.7.0 was removed. A module focused on performance will be planned in the future.
+
+### Include Blueprint::HTML::ComponenentRegistrar by default
+You don't need to require and include `Blueprint::HTML::ComponenentRegistrar`, it
+is already included when you include `Blueprint::HTML`.
+
+
+# [0.7.0] - 2024-09-09
+
+### Allow passing comment via argument
-- Allow passing comment via argument
```crystal
comment "Cool comment here"
```
-- Allow rendering unsafe content using `unsafe_raw`
+### Allow rendering unsafe content using `unsafe_raw`
+
```crystal
unsafe_raw ""
```
-- Add `RawHtml` to priorize performance over safety
+
+### RawHTML
+
+Add `RawHtml` to priorize performance over safety
```crystal
require "blueprint/unsafe_html"
class MyHTML
@@ -26,11 +145,16 @@ class MyHTML
end
```
-- Code refactoring to improve performance
-- Fix safety when passing content to elements via argument
+### Code refactoring
+Code refactoring to improve performance
+
+### Fix escaping
+Fix safety when passing content to elements via argument
+
+# [0.6.0] - 2024-09-08
-## [0.6.0] - 2023-09-08
+### Passing content via argument
Allows passing content to elements without using blocks, eg.
@@ -40,39 +164,172 @@ Allows passing content to elements without using blocks, eg.
h1 "Hello World!"
```
-Release details:
+# [0.5.1] - 2024-09-08
-## [0.5.1] - 2023-09-08
+Fix Crystal version string requirement allowing using Blueprint with newer crystal versions.
-Fix Crystal version string requirement.
+# [0.5.0] - 2024-09-08
-Release details:
+### Performance improvements
-## [0.5.0] - 2023-09-08
+Increased speed execution by 15%.
-Performance improvements: Increased speed execution by 15%.
```
-
-
v0.5.0 364.46k ( 2.74µs) (± 0.52%) 7.95kB/op fastest
v0.4.0 317.83k ( 3.15µs) (± 0.76%) 8.99kB/op 1.15× slower
+```
+
+### Fix Array attributes
+
+Ignore nil elements from array attribute parsing
+
+```crystal
+class Example
+ include Blueprint::HTML
+
+ private def blueprint
+ h1(class: ["a", "b", nil, ["c", "d"]]) { "Example" }
+ end
+end
+
+example = Example.new
+example.to_html # => "
Example
"
+```
+
+
+# [0.4.0] - 2023-04-25
+
+### SVG support
+
+It's possible to create SVG elements:
+
+```crystal
+class Example
+ include Blueprint::HTML
+
+ private def blueprint
+ svg width: 30, height: 10 do
+ g fill: :red do
+ rect x: 0, y: 0, width: 10, height: 10
+ rect x: 20, y: 0, width: 10, height: 10
+ end
+ end
+ end
+end
+```
+
+Output:
+```html
+
+```
+
+
+# [0.3.0] - 2023-04-07
+
+### Build HTML without defining classes or structs
+It's possible build HTML without using classes or structs
+
+```crystal
+html = Blueprint::HTML.build do
+ h1 { "Hello" }
+ div do
+ h2 { "World" }
+ end
+end
+
+puts html # =>
Hello
World
```
-Release details:
-## [0.4.0] - 2023-04-25
+# [0.2.0] - 2023-04-07
+
+### Allow conditional rendering
-Release details:
+It's possible to override `#render?` method to control blueprint render.
-## [0.3.0] - 2023-04-07
+```crystal
+class Example
+ include Blueprint::HTML
+
+ private def blueprint
+ h1 { "Example" }
+ end
+
+ private def render?
+ false
+ end
+end
+
+example = Example.new
+example.to_html # => ""
+```
+
+### Handles array attributes
+
+Arrays passed as attribute values will be flattened and joined with `" "`.
+
+```crystal
+class Example
+ include Blueprint::HTML
+
+ private def blueprint
+ h1(class: ["a", "b", ["c", "d"]]) { "Example" }
+ end
+end
+
+example = Example.new
+example.to_html # => "
Example
"
+```
+
+### Adds `#envelope(&)` method
+
+By overriding the `#envelope(&)` method, you can create a wrapper around
+blueprint content. This is useful when defining layouts for pages.
+
+```crystal
+class Example
+ include Blueprint::HTML
+
+ private def blueprint
+ h1 { "Example" }
+ end
+
+ private def envelope(&)
+ html do
+ body do
+ yield
+ end
+ end
+ end
+end
+
+example = Example.new
+example.to_html # => "
Hello
"
+```
-Release details:
+### Breaking changes
+- Requires `require "blueprint/html"` instead `require "blueprint"` to use `Blueprint::HTML` module
-## [0.2.0] - 2023-04-07
-Release details:
-## [0.1.0] - 2023-03-27
+# [0.1.0] - 2023-03-27
-Release details:
+### Added
+- Basic html builder
+- Allow element attributes
+- Allow rendering blueprints
+- Allow NamedTuple attributes
+- Add `doctype` util
+- Transform attribute names
+- Handle boolean attributes
+- Escape content
+- Add `comment` util
+- Add `whitespace` util
+- Allow custom component registration
+- Allow custom element registration
diff --git a/shard.yml b/shard.yml
index 33c79c9..ff704dc 100644
--- a/shard.yml
+++ b/shard.yml
@@ -2,7 +2,7 @@ name: blueprint
description: |
Blueprint is a lib for writing reusable and testable HTML templates in plain Crystal, allowing an OOP (Oriented Object Programming) approach when building your views.
-version: 0.7.0
+version: 0.8.0
authors:
- Stephann V. <3025661+stephannv@users.noreply.github.com>
diff --git a/src/blueprint/version.cr b/src/blueprint/version.cr
index 05d9edb..bab014e 100644
--- a/src/blueprint/version.cr
+++ b/src/blueprint/version.cr
@@ -1,3 +1,3 @@
module Blueprint
- VERSION = "0.7.0"
+ VERSION = "0.8.0"
end