element_component 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/AGENTS.md +2 -2
- data/README.md +88 -83
- data/examples/alert_example.rb +10 -10
- data/examples/badge_example.rb +2 -2
- data/examples/breadcrumb_example.rb +14 -10
- data/examples/button_example.rb +2 -2
- data/examples/button_group_example.rb +3 -3
- data/examples/card_example.rb +13 -13
- data/examples/carousel_example.rb +26 -24
- data/examples/close_button_example.rb +2 -2
- data/examples/dropdown_example.rb +46 -38
- data/examples/list_group_example.rb +26 -18
- data/examples/modal_example.rb +23 -21
- data/examples/nav_example.rb +25 -23
- data/examples/navbar_example.rb +38 -30
- data/examples/pagination_example.rb +16 -16
- data/examples/progress_example.rb +12 -12
- data/examples/spinner_example.rb +2 -2
- data/examples/table_example.rb +3 -3
- data/lib/element_component/components/dropdown.rb +1 -1
- data/lib/element_component/element.rb +9 -5
- data/lib/element_component/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8919d998e1eed755c1b0d52a1a755b913c00befed273951da5fab55bc2a6def4
|
|
4
|
+
data.tar.gz: cdb3938426b25800c14566531c14758d7202ede0e6faa76b765f7ace39530219
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 37fa2859a76cc025dae9c07765e0ab492a8a79970da462f01225d20fa7c146fe850d1915882e5891fd42cbf2046de8828e25c052d3d518a8f699996b0fe2002a
|
|
7
|
+
data.tar.gz: c53fb1bf1fec326bd4ae2daafc2b704923e9a7a6fae40006d28fea7d656b4d3c0419e1250121a5989630e2e8f53a46c45e1e6d63a04d299582e0515ddde3f06e
|
data/AGENTS.md
CHANGED
|
@@ -52,13 +52,13 @@ Components live under `ElementComponent::Components`. Each component folder cont
|
|
|
52
52
|
**Alert constructor**: `Alert.new(variant: :primary, dismissible: false, **attributes, &block)`
|
|
53
53
|
- `variant`: one of `:primary`, `:secondary`, `:success`, `:danger`, `:warning`, `:info`, `:light`, `:dark`
|
|
54
54
|
- `dismissible`: adds `.alert-dismissible` class and appends a `CloseButton`
|
|
55
|
-
- `&block`:
|
|
55
|
+
- `&block`: block with element parameter for adding content inside the element
|
|
56
56
|
|
|
57
57
|
**Component guidelines**:
|
|
58
58
|
- Always use `add_attribute()` instead of manipulating the `attributes` hash directly
|
|
59
59
|
- Each class in its own file under a component-named folder
|
|
60
60
|
- Call `super("tag_name", closing_tag: ..., &block)` first, then chain `add_attribute` calls
|
|
61
|
-
- `
|
|
61
|
+
- `block.call(self)` lives in `Element#initialize` — passes element to block via block parameter
|
|
62
62
|
- Pass user attributes last via `add_attribute(attributes)`
|
|
63
63
|
|
|
64
64
|
### Sub-component example pattern:
|
data/README.md
CHANGED
|
@@ -5,7 +5,7 @@ A lightweight and flexible HTML builder for Ruby. `ElementComponent` provides a
|
|
|
5
5
|
## Key Features
|
|
6
6
|
|
|
7
7
|
- **Object-Oriented HTML Construction** — Build HTML trees using Ruby objects with dynamic attribute management
|
|
8
|
-
- **Block DSL** — Nest content inline with
|
|
8
|
+
- **Block DSL** — Nest content inline with block parameters and the `new_element` helper
|
|
9
9
|
- **Rendering Hooks** — `before_render`, `after_render`, and `around_render` callbacks for dynamic content
|
|
10
10
|
- **17 Bootstrap 5 Components** — Ready-to-use Alert, Badge, Breadcrumb, Button, ButtonGroup, Card, Carousel, CloseButton, Dropdown, ListGroup, Modal, Nav, Navbar, Pagination, Progress, Spinner, and Table
|
|
11
11
|
- **Chained API** — All `add_*` methods return `self` for method chaining
|
|
@@ -41,9 +41,9 @@ puts p.render
|
|
|
41
41
|
Use a block to add content inline:
|
|
42
42
|
|
|
43
43
|
```ruby
|
|
44
|
-
div = ElementComponent::Element.new("div", class: "container") do
|
|
45
|
-
add_content("Welcome")
|
|
46
|
-
add_content(ElementComponent::Element.new("h1") { add_content("Title") })
|
|
44
|
+
div = ElementComponent::Element.new("div", class: "container") do |e|
|
|
45
|
+
e.add_content("Welcome")
|
|
46
|
+
e.add_content(ElementComponent::Element.new("h1") { |h| h.add_content("Title") })
|
|
47
47
|
end
|
|
48
48
|
puts div.render
|
|
49
49
|
# => <div class="container">Welcome<h1>Title</h1></div>
|
|
@@ -54,9 +54,9 @@ puts div.render
|
|
|
54
54
|
Inside a block, use `new_element` as a shorthand:
|
|
55
55
|
|
|
56
56
|
```ruby
|
|
57
|
-
div = ElementComponent::Element.new("div") do
|
|
58
|
-
add_content(new_element("h1") { add_content("Hello") })
|
|
59
|
-
add_content(new_element("p", class: "lead") { add_content("World") })
|
|
57
|
+
div = ElementComponent::Element.new("div") do |e|
|
|
58
|
+
e.add_content(e.new_element("h1") { |h| h.add_content("Hello") })
|
|
59
|
+
e.add_content(e.new_element("p", class: "lead") { |p| p.add_content("World") })
|
|
60
60
|
end
|
|
61
61
|
puts div.render
|
|
62
62
|
# => <div><h1>Hello</h1><p class="lead">World</p></div>
|
|
@@ -73,13 +73,18 @@ div = ElementComponent::Element.new("div")
|
|
|
73
73
|
div.add_content("plain text")
|
|
74
74
|
|
|
75
75
|
# Element instance
|
|
76
|
-
div.add_content(ElementComponent::Element.new("span") { add_content("nested") })
|
|
76
|
+
div.add_content(ElementComponent::Element.new("span") { |s| s.add_content("nested") })
|
|
77
77
|
|
|
78
78
|
# Block (evaluated at render time, has access to new_element)
|
|
79
|
-
div.add_content { new_element("em") { add_content("deferred") } }
|
|
79
|
+
div.add_content { |e| e.new_element("em") { |em| em.add_content("deferred") } }
|
|
80
80
|
|
|
81
81
|
puts div.render
|
|
82
82
|
# => <div>plain text<span>nested</span><em>deferred</em></div>
|
|
83
|
+
|
|
84
|
+
# Array of content
|
|
85
|
+
div.add_content(["Hello ", ElementComponent::Element.new("strong") { |s| s.add_content("World") }, "!"])
|
|
86
|
+
puts div.render
|
|
87
|
+
# => <div>Hello <strong>World</strong>!</div>
|
|
83
88
|
```
|
|
84
89
|
|
|
85
90
|
### Attribute Management
|
|
@@ -150,8 +155,8 @@ All components live under `ElementComponent::Components` and support the block D
|
|
|
150
155
|
|
|
151
156
|
|
|
152
157
|
```ruby
|
|
153
|
-
alert = ElementComponent::Components::Alert.new(variant: :success) do
|
|
154
|
-
add_content("Operation completed!")
|
|
158
|
+
alert = ElementComponent::Components::Alert.new(variant: :success) do |e|
|
|
159
|
+
e.add_content("Operation completed!")
|
|
155
160
|
end
|
|
156
161
|
# => <div class="alert alert-success" role="alert">Operation completed!</div>
|
|
157
162
|
```
|
|
@@ -161,10 +166,10 @@ end
|
|
|
161
166
|
Dismissible alerts, headings, and links use sub-components:
|
|
162
167
|
|
|
163
168
|
```ruby
|
|
164
|
-
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do
|
|
165
|
-
add_content(ElementComponent::Components::AlertHeading.new { add_content("Warning") })
|
|
166
|
-
add_content("Please review. ")
|
|
167
|
-
add_content(ElementComponent::Components::AlertLink.new(href: "/details") { add_content("Details") })
|
|
169
|
+
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do |e|
|
|
170
|
+
e.add_content(ElementComponent::Components::AlertHeading.new { |h| h.add_content("Warning") })
|
|
171
|
+
e.add_content("Please review. ")
|
|
172
|
+
e.add_content(ElementComponent::Components::AlertLink.new(href: "/details") { |l| l.add_content("Details") })
|
|
168
173
|
end
|
|
169
174
|
# => <div class="alert alert-warning alert-dismissible" role="alert">
|
|
170
175
|
# <h4 class="alert-heading">Warning</h4>
|
|
@@ -187,15 +192,15 @@ end
|
|
|
187
192
|
|
|
188
193
|
```ruby
|
|
189
194
|
# Standard button
|
|
190
|
-
btn = ElementComponent::Components::Button.new(variant: :primary) { add_content("Click") }
|
|
195
|
+
btn = ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Click") }
|
|
191
196
|
# => <button class="btn btn-primary" type="button">Click</button>
|
|
192
197
|
|
|
193
198
|
# Outline variant
|
|
194
|
-
btn = ElementComponent::Components::Button.new(variant: :danger, outline: true) { add_content("Delete") }
|
|
199
|
+
btn = ElementComponent::Components::Button.new(variant: :danger, outline: true) { |b| b.add_content("Delete") }
|
|
195
200
|
# => <button class="btn btn-outline-danger" type="button">Delete</button>
|
|
196
201
|
|
|
197
202
|
# As a link
|
|
198
|
-
btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home") { add_content("Home") }
|
|
203
|
+
btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home") { |b| b.add_content("Home") }
|
|
199
204
|
# => <a class="btn btn-primary" href="/home">Home</a>
|
|
200
205
|
```
|
|
201
206
|
|
|
@@ -205,10 +210,10 @@ btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home")
|
|
|
205
210
|
|
|
206
211
|
|
|
207
212
|
```ruby
|
|
208
|
-
badge = ElementComponent::Components::Badge.new(variant: :primary) { add_content("New") }
|
|
213
|
+
badge = ElementComponent::Components::Badge.new(variant: :primary) { |b| b.add_content("New") }
|
|
209
214
|
# => <span class="badge bg-primary">New</span>
|
|
210
215
|
|
|
211
|
-
pill = ElementComponent::Components::Badge.new(variant: :danger, pill: true) { add_content("99+") }
|
|
216
|
+
pill = ElementComponent::Components::Badge.new(variant: :danger, pill: true) { |b| b.add_content("99+") }
|
|
212
217
|
# => <span class="badge bg-danger rounded-pill">99+</span>
|
|
213
218
|
```
|
|
214
219
|
|
|
@@ -216,13 +221,13 @@ pill = ElementComponent::Components::Badge.new(variant: :danger, pill: true) { a
|
|
|
216
221
|
|
|
217
222
|
|
|
218
223
|
```ruby
|
|
219
|
-
card = ElementComponent::Components::Card.new do
|
|
220
|
-
add_content(ElementComponent::Components::CardImage.new(src: "photo.jpg", top: true))
|
|
221
|
-
add_content(ElementComponent::Components::CardBody.new do
|
|
222
|
-
add_content(ElementComponent::Components::CardTitle.new { add_content("Title") })
|
|
223
|
-
add_content(ElementComponent::Components::CardText.new { add_content("Some text.") })
|
|
224
|
+
card = ElementComponent::Components::Card.new do |c|
|
|
225
|
+
c.add_content(ElementComponent::Components::CardImage.new(src: "photo.jpg", top: true))
|
|
226
|
+
c.add_content(ElementComponent::Components::CardBody.new do |body|
|
|
227
|
+
body.add_content(ElementComponent::Components::CardTitle.new { |t| t.add_content("Title") })
|
|
228
|
+
body.add_content(ElementComponent::Components::CardText.new { |t| t.add_content("Some text.") })
|
|
224
229
|
end)
|
|
225
|
-
add_content(ElementComponent::Components::CardFooter.new { add_content("Footer") })
|
|
230
|
+
c.add_content(ElementComponent::Components::CardFooter.new { |f| f.add_content("Footer") })
|
|
226
231
|
end
|
|
227
232
|
```
|
|
228
233
|
|
|
@@ -241,12 +246,12 @@ end
|
|
|
241
246
|
|
|
242
247
|
|
|
243
248
|
```ruby
|
|
244
|
-
nav = ElementComponent::Components::Nav.new(type: :tabs) do
|
|
245
|
-
add_content(ElementComponent::Components::NavItem.new do
|
|
246
|
-
add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) { add_content("Home") })
|
|
249
|
+
nav = ElementComponent::Components::Nav.new(type: :tabs) do |n|
|
|
250
|
+
n.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
251
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) { |l| l.add_content("Home") })
|
|
247
252
|
end)
|
|
248
|
-
add_content(ElementComponent::Components::NavItem.new do
|
|
249
|
-
add_content(ElementComponent::Components::NavLink.new(href: "/profile") { add_content("Profile") })
|
|
253
|
+
n.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
254
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/profile") { |l| l.add_content("Profile") })
|
|
250
255
|
end)
|
|
251
256
|
end
|
|
252
257
|
# => <ul class="nav nav-tabs">...</ul>
|
|
@@ -258,10 +263,10 @@ end
|
|
|
258
263
|
|
|
259
264
|
|
|
260
265
|
```ruby
|
|
261
|
-
crumb = ElementComponent::Components::Breadcrumb.new do
|
|
262
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { add_content("Home") })
|
|
263
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/section") { add_content("Section") })
|
|
264
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { add_content("Current") })
|
|
266
|
+
crumb = ElementComponent::Components::Breadcrumb.new do |b|
|
|
267
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { |i| i.add_content("Home") })
|
|
268
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/section") { |i| i.add_content("Section") })
|
|
269
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { |i| i.add_content("Current") })
|
|
265
270
|
end
|
|
266
271
|
# => <nav aria-label="breadcrumb"><ol class="breadcrumb">...</ol></nav>
|
|
267
272
|
```
|
|
@@ -270,10 +275,10 @@ end
|
|
|
270
275
|
|
|
271
276
|
|
|
272
277
|
```ruby
|
|
273
|
-
list = ElementComponent::Components::ListGroup.new(flush: true) do
|
|
274
|
-
add_content(ElementComponent::Components::ListGroupItem.new { add_content("Item 1") })
|
|
275
|
-
add_content(ElementComponent::Components::ListGroupItem.new(active: true) { add_content("Item 2") })
|
|
276
|
-
add_content(ElementComponent::Components::ListGroupItem.new(href: "/link") { add_content("Link") })
|
|
278
|
+
list = ElementComponent::Components::ListGroup.new(flush: true) do |l|
|
|
279
|
+
l.add_content(ElementComponent::Components::ListGroupItem.new { |i| i.add_content("Item 1") })
|
|
280
|
+
l.add_content(ElementComponent::Components::ListGroupItem.new(active: true) { |i| i.add_content("Item 2") })
|
|
281
|
+
l.add_content(ElementComponent::Components::ListGroupItem.new(href: "/link") { |i| i.add_content("Link") })
|
|
277
282
|
end
|
|
278
283
|
# => <ul class="list-group list-group-flush">...</ul>
|
|
279
284
|
```
|
|
@@ -284,9 +289,9 @@ end
|
|
|
284
289
|
|
|
285
290
|
|
|
286
291
|
```ruby
|
|
287
|
-
progress = ElementComponent::Components::Progress.new do
|
|
288
|
-
add_content(ElementComponent::Components::ProgressBar.new(value: 75, variant: :success, striped: true) do
|
|
289
|
-
add_content("75%")
|
|
292
|
+
progress = ElementComponent::Components::Progress.new do |p|
|
|
293
|
+
p.add_content(ElementComponent::Components::ProgressBar.new(value: 75, variant: :success, striped: true) do |bar|
|
|
294
|
+
bar.add_content("75%")
|
|
290
295
|
end)
|
|
291
296
|
end
|
|
292
297
|
# => <div class="progress" role="progressbar"><div class="progress-bar bg-success progress-bar-striped" ...>75%</div></div>
|
|
@@ -307,9 +312,9 @@ grow = ElementComponent::Components::Spinner.new(type: :grow, variant: :success)
|
|
|
307
312
|
|
|
308
313
|
|
|
309
314
|
```ruby
|
|
310
|
-
table = ElementComponent::Components::Table.new(striped: true, bordered: true, hover: true) do
|
|
311
|
-
add_content("<thead><tr><th>Name</th><th>Age</th></tr></thead>")
|
|
312
|
-
add_content("<tbody><tr><td>John</td><td>30</td></tr></tbody>")
|
|
315
|
+
table = ElementComponent::Components::Table.new(striped: true, bordered: true, hover: true) do |t|
|
|
316
|
+
t.add_content("<thead><tr><th>Name</th><th>Age</th></tr></thead>")
|
|
317
|
+
t.add_content("<tbody><tr><td>John</td><td>30</td></tr></tbody>")
|
|
313
318
|
end
|
|
314
319
|
# => <table class="table table-striped table-bordered table-hover">...</table>
|
|
315
320
|
```
|
|
@@ -320,9 +325,9 @@ end
|
|
|
320
325
|
|
|
321
326
|
|
|
322
327
|
```ruby
|
|
323
|
-
nav = ElementComponent::Components::Pagination.new(size: :lg) do
|
|
324
|
-
add_content(ElementComponent::Components::PageItem.new(active: true) { add_content("1") })
|
|
325
|
-
add_content(ElementComponent::Components::PageItem.new { add_content("2") })
|
|
328
|
+
nav = ElementComponent::Components::Pagination.new(size: :lg) do |p|
|
|
329
|
+
p.add_content(ElementComponent::Components::PageItem.new(active: true) { |i| i.add_content("1") })
|
|
330
|
+
p.add_content(ElementComponent::Components::PageItem.new { |i| i.add_content("2") })
|
|
326
331
|
end
|
|
327
332
|
# => <nav aria-label="Pagination"><ul class="pagination pagination-lg">...</ul></nav>
|
|
328
333
|
```
|
|
@@ -331,10 +336,10 @@ end
|
|
|
331
336
|
|
|
332
337
|
|
|
333
338
|
```ruby
|
|
334
|
-
group = ElementComponent::Components::ButtonGroup.new do
|
|
335
|
-
add_content(ElementComponent::Components::Button.new(variant: :primary) { add_content("Left") })
|
|
336
|
-
add_content(ElementComponent::Components::Button.new(variant: :primary) { add_content("Middle") })
|
|
337
|
-
add_content(ElementComponent::Components::Button.new(variant: :primary) { add_content("Right") })
|
|
339
|
+
group = ElementComponent::Components::ButtonGroup.new do |g|
|
|
340
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Left") })
|
|
341
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Middle") })
|
|
342
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Right") })
|
|
338
343
|
end
|
|
339
344
|
# => <div class="btn-group" role="group">...</div>
|
|
340
345
|
```
|
|
@@ -356,15 +361,15 @@ disabled = ElementComponent::Components::CloseButton.new(disabled: true)
|
|
|
356
361
|
|
|
357
362
|
|
|
358
363
|
```ruby
|
|
359
|
-
modal = ElementComponent::Components::Modal.new(id: "exampleModal") do
|
|
360
|
-
add_content(ElementComponent::Components::ModalContent.new do
|
|
361
|
-
add_content(ElementComponent::Components::ModalHeader.new do
|
|
362
|
-
add_content(ElementComponent::Components::ModalTitle.new { add_content("Modal title") })
|
|
364
|
+
modal = ElementComponent::Components::Modal.new(id: "exampleModal") do |m|
|
|
365
|
+
m.add_content(ElementComponent::Components::ModalContent.new do |content|
|
|
366
|
+
content.add_content(ElementComponent::Components::ModalHeader.new do |header|
|
|
367
|
+
header.add_content(ElementComponent::Components::ModalTitle.new { |t| t.add_content("Modal title") })
|
|
363
368
|
end)
|
|
364
|
-
add_content(ElementComponent::Components::ModalBody.new { add_content("Modal body text.") })
|
|
365
|
-
add_content(ElementComponent::Components::ModalFooter.new do
|
|
366
|
-
add_content(ElementComponent::Components::Button.new(variant: :secondary) { add_content("Close") })
|
|
367
|
-
add_content(ElementComponent::Components::Button.new(variant: :primary) { add_content("Save") })
|
|
369
|
+
content.add_content(ElementComponent::Components::ModalBody.new { |body| body.add_content("Modal body text.") })
|
|
370
|
+
content.add_content(ElementComponent::Components::ModalFooter.new do |footer|
|
|
371
|
+
footer.add_content(ElementComponent::Components::Button.new(variant: :secondary) { |b| b.add_content("Close") })
|
|
372
|
+
footer.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Save") })
|
|
368
373
|
end)
|
|
369
374
|
end)
|
|
370
375
|
end
|
|
@@ -387,12 +392,12 @@ end
|
|
|
387
392
|
|
|
388
393
|
|
|
389
394
|
```ruby
|
|
390
|
-
carousel = ElementComponent::Components::Carousel.new(id: "slides") do
|
|
391
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true) do
|
|
392
|
-
add_content(%(<img src="slide1.jpg" class="d-block w-100" alt="...">))
|
|
395
|
+
carousel = ElementComponent::Components::Carousel.new(id: "slides") do |c|
|
|
396
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) do |item|
|
|
397
|
+
item.add_content(%(<img src="slide1.jpg" class="d-block w-100" alt="...">))
|
|
393
398
|
end)
|
|
394
|
-
add_content(ElementComponent::Components::CarouselItem.new do
|
|
395
|
-
add_content(%(<img src="slide2.jpg" class="d-block w-100" alt="...">))
|
|
399
|
+
c.add_content(ElementComponent::Components::CarouselItem.new do |item|
|
|
400
|
+
item.add_content(%(<img src="slide2.jpg" class="d-block w-100" alt="...">))
|
|
396
401
|
end)
|
|
397
402
|
end
|
|
398
403
|
```
|
|
@@ -410,20 +415,20 @@ end
|
|
|
410
415
|
|
|
411
416
|
|
|
412
417
|
```ruby
|
|
413
|
-
dropdown = ElementComponent::Components::Dropdown.new do
|
|
414
|
-
add_content(
|
|
418
|
+
dropdown = ElementComponent::Components::Dropdown.new do |d|
|
|
419
|
+
d.add_content(
|
|
415
420
|
ElementComponent::Element.new("button",
|
|
416
421
|
class: "btn btn-secondary dropdown-toggle",
|
|
417
422
|
type: "button",
|
|
418
423
|
"data-bs-toggle": "dropdown",
|
|
419
|
-
"aria-expanded": "false") { add_content("Dropdown") }
|
|
424
|
+
"aria-expanded": "false") { |b| b.add_content("Dropdown") }
|
|
420
425
|
)
|
|
421
|
-
add_content(
|
|
422
|
-
ElementComponent::Components::DropdownMenu.new do
|
|
423
|
-
add_content(ElementComponent::Components::DropdownItem.new { add_content("Action") })
|
|
424
|
-
add_content(ElementComponent::Components::DropdownItem.new(active: true) { add_content("Active") })
|
|
425
|
-
add_content(ElementComponent::Components::DropdownDivider.new)
|
|
426
|
-
add_content(ElementComponent::Components::DropdownItem.new(disabled: true) { add_content("Disabled") })
|
|
426
|
+
d.add_content(
|
|
427
|
+
ElementComponent::Components::DropdownMenu.new do |menu|
|
|
428
|
+
menu.add_content(ElementComponent::Components::DropdownItem.new { |i| i.add_content("Action") })
|
|
429
|
+
menu.add_content(ElementComponent::Components::DropdownItem.new(active: true) { |i| i.add_content("Active") })
|
|
430
|
+
menu.add_content(ElementComponent::Components::DropdownDivider.new)
|
|
431
|
+
menu.add_content(ElementComponent::Components::DropdownItem.new(disabled: true) { |i| i.add_content("Disabled") })
|
|
427
432
|
end
|
|
428
433
|
)
|
|
429
434
|
end
|
|
@@ -444,16 +449,16 @@ end
|
|
|
444
449
|
|
|
445
450
|
|
|
446
451
|
```ruby
|
|
447
|
-
navbar = ElementComponent::Components::Navbar.new(theme: :dark, background: :dark) do
|
|
448
|
-
add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { add_content("Brand") })
|
|
449
|
-
add_content(ElementComponent::Components::NavbarToggler.new(target: "nav"))
|
|
450
|
-
add_content(ElementComponent::Components::NavbarCollapse.new(id: "nav") do
|
|
451
|
-
add_content(ElementComponent::Components::NavbarNav.new do
|
|
452
|
-
add_content(ElementComponent::Components::NavItem.new do
|
|
453
|
-
add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) { add_content("Home") })
|
|
452
|
+
navbar = ElementComponent::Components::Navbar.new(theme: :dark, background: :dark) do |n|
|
|
453
|
+
n.add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { |b| b.add_content("Brand") })
|
|
454
|
+
n.add_content(ElementComponent::Components::NavbarToggler.new(target: "nav"))
|
|
455
|
+
n.add_content(ElementComponent::Components::NavbarCollapse.new(id: "nav") do |collapse|
|
|
456
|
+
collapse.add_content(ElementComponent::Components::NavbarNav.new do |nav|
|
|
457
|
+
nav.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
458
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) { |l| l.add_content("Home") })
|
|
454
459
|
end)
|
|
455
|
-
add_content(ElementComponent::Components::NavItem.new do
|
|
456
|
-
add_content(ElementComponent::Components::NavLink.new(href: "/about") { add_content("About") })
|
|
460
|
+
nav.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
461
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/about") { |l| l.add_content("About") })
|
|
457
462
|
end)
|
|
458
463
|
end)
|
|
459
464
|
end)
|
data/examples/alert_example.rb
CHANGED
|
@@ -25,8 +25,8 @@ puts
|
|
|
25
25
|
# =============================================================================
|
|
26
26
|
# Dismissible Alert (use block DSL so close button is always last)
|
|
27
27
|
# =============================================================================
|
|
28
|
-
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do
|
|
29
|
-
add_content("This alert can be dismissed.")
|
|
28
|
+
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do |e|
|
|
29
|
+
e.add_content("This alert can be dismissed.")
|
|
30
30
|
end
|
|
31
31
|
puts "=== Dismissible Alert ==="
|
|
32
32
|
puts alert.render
|
|
@@ -48,10 +48,10 @@ puts
|
|
|
48
48
|
# =============================================================================
|
|
49
49
|
# Alert with Heading and Link (block DSL)
|
|
50
50
|
# =============================================================================
|
|
51
|
-
alert = ElementComponent::Components::Alert.new(variant: :info) do
|
|
52
|
-
add_content(ElementComponent::Components::AlertHeading.new.tap { |h| h.add_content("Information") })
|
|
53
|
-
add_content("This is an important notice. ")
|
|
54
|
-
add_content(ElementComponent::Components::AlertLink.new(href: "/details").tap { |l| l.add_content("View details") })
|
|
51
|
+
alert = ElementComponent::Components::Alert.new(variant: :info) do |e|
|
|
52
|
+
e.add_content(ElementComponent::Components::AlertHeading.new.tap { |h| h.add_content("Information") })
|
|
53
|
+
e.add_content("This is an important notice. ")
|
|
54
|
+
e.add_content(ElementComponent::Components::AlertLink.new(href: "/details").tap { |l| l.add_content("View details") })
|
|
55
55
|
end
|
|
56
56
|
puts "=== Alert with Heading and Link ==="
|
|
57
57
|
puts alert.render
|
|
@@ -60,10 +60,10 @@ puts
|
|
|
60
60
|
# =============================================================================
|
|
61
61
|
# Dismissible Alert with Heading and Link
|
|
62
62
|
# =============================================================================
|
|
63
|
-
alert = ElementComponent::Components::Alert.new(variant: :danger, dismissible: true) do
|
|
64
|
-
add_content(ElementComponent::Components::AlertHeading.new.tap { |h| h.add_content("Error!") })
|
|
65
|
-
add_content("Something went wrong. ")
|
|
66
|
-
add_content(ElementComponent::Components::AlertLink.new(href: "/support").tap do |l|
|
|
63
|
+
alert = ElementComponent::Components::Alert.new(variant: :danger, dismissible: true) do |e|
|
|
64
|
+
e.add_content(ElementComponent::Components::AlertHeading.new.tap { |h| h.add_content("Error!") })
|
|
65
|
+
e.add_content("Something went wrong. ")
|
|
66
|
+
e.add_content(ElementComponent::Components::AlertLink.new(href: "/support").tap do |l|
|
|
67
67
|
l.add_content("Contact support")
|
|
68
68
|
end)
|
|
69
69
|
end
|
data/examples/badge_example.rb
CHANGED
|
@@ -34,8 +34,8 @@ puts
|
|
|
34
34
|
# =============================================================================
|
|
35
35
|
# Badge with Block
|
|
36
36
|
# =============================================================================
|
|
37
|
-
badge = ElementComponent::Components::Badge.new(variant: :success) do
|
|
38
|
-
add_content("Completed")
|
|
37
|
+
badge = ElementComponent::Components::Badge.new(variant: :success) do |b|
|
|
38
|
+
b.add_content("Completed")
|
|
39
39
|
end
|
|
40
40
|
puts "=== Badge with Block ==="
|
|
41
41
|
puts badge.render
|
|
@@ -5,10 +5,12 @@ require_relative "../lib/element_component"
|
|
|
5
5
|
# =============================================================================
|
|
6
6
|
# Basic Breadcrumb
|
|
7
7
|
# =============================================================================
|
|
8
|
-
breadcrumb = ElementComponent::Components::Breadcrumb.new do
|
|
9
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { add_content("Home") })
|
|
10
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/library")
|
|
11
|
-
|
|
8
|
+
breadcrumb = ElementComponent::Components::Breadcrumb.new do |b|
|
|
9
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { |item| item.add_content("Home") })
|
|
10
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/library") do |item|
|
|
11
|
+
item.add_content("Library")
|
|
12
|
+
end)
|
|
13
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { |item| item.add_content("Data") })
|
|
12
14
|
end
|
|
13
15
|
puts "=== Basic Breadcrumb ==="
|
|
14
16
|
puts breadcrumb.render
|
|
@@ -17,9 +19,11 @@ puts
|
|
|
17
19
|
# =============================================================================
|
|
18
20
|
# Breadcrumb with Two Items
|
|
19
21
|
# =============================================================================
|
|
20
|
-
breadcrumb = ElementComponent::Components::Breadcrumb.new do
|
|
21
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { add_content("Home") })
|
|
22
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(active: true)
|
|
22
|
+
breadcrumb = ElementComponent::Components::Breadcrumb.new do |b|
|
|
23
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { |item| item.add_content("Home") })
|
|
24
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) do |item|
|
|
25
|
+
item.add_content("Current Page")
|
|
26
|
+
end)
|
|
23
27
|
end
|
|
24
28
|
puts "=== Two-Item Breadcrumb ==="
|
|
25
29
|
puts breadcrumb.render
|
|
@@ -28,9 +32,9 @@ puts
|
|
|
28
32
|
# =============================================================================
|
|
29
33
|
# Breadcrumb with Custom Class
|
|
30
34
|
# =============================================================================
|
|
31
|
-
breadcrumb = ElementComponent::Components::Breadcrumb.new(class: "custom-breadcrumb") do
|
|
32
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { add_content("Home") })
|
|
33
|
-
add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { add_content("Active") })
|
|
35
|
+
breadcrumb = ElementComponent::Components::Breadcrumb.new(class: "custom-breadcrumb") do |b|
|
|
36
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { |item| item.add_content("Home") })
|
|
37
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { |item| item.add_content("Active") })
|
|
34
38
|
end
|
|
35
39
|
puts "=== Breadcrumb with Custom Class ==="
|
|
36
40
|
puts breadcrumb.render
|
data/examples/button_example.rb
CHANGED
|
@@ -57,8 +57,8 @@ puts
|
|
|
57
57
|
# =============================================================================
|
|
58
58
|
# Button with Block
|
|
59
59
|
# =============================================================================
|
|
60
|
-
btn = ElementComponent::Components::Button.new(variant: :info) do
|
|
61
|
-
add_content("Info Button")
|
|
60
|
+
btn = ElementComponent::Components::Button.new(variant: :info) do |b|
|
|
61
|
+
b.add_content("Info Button")
|
|
62
62
|
end
|
|
63
63
|
puts "=== Button with Block ==="
|
|
64
64
|
puts btn.render
|
|
@@ -36,9 +36,9 @@ puts
|
|
|
36
36
|
# =============================================================================
|
|
37
37
|
# Button Group with Size
|
|
38
38
|
# =============================================================================
|
|
39
|
-
group = ElementComponent::Components::ButtonGroup.new(size: :sm) do
|
|
40
|
-
add_content(ElementComponent::Components::Button.new(variant: :success) { add_content("Save") })
|
|
41
|
-
add_content(ElementComponent::Components::Button.new(variant: :danger) { add_content("Delete") })
|
|
39
|
+
group = ElementComponent::Components::ButtonGroup.new(size: :sm) do |g|
|
|
40
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :success) { |b| b.add_content("Save") })
|
|
41
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :danger) { |b| b.add_content("Delete") })
|
|
42
42
|
end
|
|
43
43
|
puts "=== Small Button Group ==="
|
|
44
44
|
puts group.render
|
data/examples/card_example.rb
CHANGED
|
@@ -14,10 +14,10 @@ puts
|
|
|
14
14
|
# =============================================================================
|
|
15
15
|
# Card with Header, Body, and Footer
|
|
16
16
|
# =============================================================================
|
|
17
|
-
card = ElementComponent::Components::Card.new do
|
|
18
|
-
add_content(ElementComponent::Components::CardHeader.new { add_content("Header") })
|
|
19
|
-
add_content(ElementComponent::Components::CardBody.new { add_content("Body content here") })
|
|
20
|
-
add_content(ElementComponent::Components::CardFooter.new { add_content("Footer") })
|
|
17
|
+
card = ElementComponent::Components::Card.new do |c|
|
|
18
|
+
c.add_content(ElementComponent::Components::CardHeader.new { |ch| ch.add_content("Header") })
|
|
19
|
+
c.add_content(ElementComponent::Components::CardBody.new { |cb| cb.add_content("Body content here") })
|
|
20
|
+
c.add_content(ElementComponent::Components::CardFooter.new { |cf| cf.add_content("Footer") })
|
|
21
21
|
end
|
|
22
22
|
puts "=== Card with Header, Body, Footer ==="
|
|
23
23
|
puts card.render
|
|
@@ -26,10 +26,10 @@ puts
|
|
|
26
26
|
# =============================================================================
|
|
27
27
|
# Card with Title and Text
|
|
28
28
|
# =============================================================================
|
|
29
|
-
card = ElementComponent::Components::Card.new do
|
|
30
|
-
add_content(ElementComponent::Components::CardBody.new do
|
|
31
|
-
add_content(ElementComponent::Components::CardTitle.new { add_content("Card Title") })
|
|
32
|
-
add_content(ElementComponent::Components::CardText.new { add_content("Some quick example text.") })
|
|
29
|
+
card = ElementComponent::Components::Card.new do |c|
|
|
30
|
+
c.add_content(ElementComponent::Components::CardBody.new do |cb|
|
|
31
|
+
cb.add_content(ElementComponent::Components::CardTitle.new { |ct| ct.add_content("Card Title") })
|
|
32
|
+
cb.add_content(ElementComponent::Components::CardText.new { |ct| ct.add_content("Some quick example text.") })
|
|
33
33
|
end)
|
|
34
34
|
end
|
|
35
35
|
puts "=== Card with Title and Text ==="
|
|
@@ -39,11 +39,11 @@ puts
|
|
|
39
39
|
# =============================================================================
|
|
40
40
|
# Card with Image
|
|
41
41
|
# =============================================================================
|
|
42
|
-
card = ElementComponent::Components::Card.new do
|
|
43
|
-
add_content(ElementComponent::Components::CardImage.new(src: "image.jpg", top: true))
|
|
44
|
-
add_content(ElementComponent::Components::CardBody.new do
|
|
45
|
-
add_content(ElementComponent::Components::CardTitle.new { add_content("Image Card") })
|
|
46
|
-
add_content(ElementComponent::Components::CardText.new { add_content("Card with an image on top.") })
|
|
42
|
+
card = ElementComponent::Components::Card.new do |c|
|
|
43
|
+
c.add_content(ElementComponent::Components::CardImage.new(src: "image.jpg", top: true))
|
|
44
|
+
c.add_content(ElementComponent::Components::CardBody.new do |cb|
|
|
45
|
+
cb.add_content(ElementComponent::Components::CardTitle.new { |ct| ct.add_content("Image Card") })
|
|
46
|
+
cb.add_content(ElementComponent::Components::CardText.new { |ct| ct.add_content("Card with an image on top.") })
|
|
47
47
|
end)
|
|
48
48
|
end
|
|
49
49
|
puts "=== Card with Image ==="
|
|
@@ -5,12 +5,12 @@ require_relative "../lib/element_component"
|
|
|
5
5
|
# =============================================================================
|
|
6
6
|
# Basic Carousel
|
|
7
7
|
# =============================================================================
|
|
8
|
-
carousel = ElementComponent::Components::Carousel.new(id: "basicCarousel") do
|
|
9
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true) do
|
|
10
|
-
add_content(%(<img src="slide1.jpg" class="d-block w-100" alt="Slide 1">))
|
|
8
|
+
carousel = ElementComponent::Components::Carousel.new(id: "basicCarousel") do |c|
|
|
9
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) do |item|
|
|
10
|
+
item.add_content(%(<img src="slide1.jpg" class="d-block w-100" alt="Slide 1">))
|
|
11
11
|
end)
|
|
12
|
-
add_content(ElementComponent::Components::CarouselItem.new do
|
|
13
|
-
add_content(%(<img src="slide2.jpg" class="d-block w-100" alt="Slide 2">))
|
|
12
|
+
c.add_content(ElementComponent::Components::CarouselItem.new do |item|
|
|
13
|
+
item.add_content(%(<img src="slide2.jpg" class="d-block w-100" alt="Slide 2">))
|
|
14
14
|
end)
|
|
15
15
|
end
|
|
16
16
|
puts "=== Basic Carousel ==="
|
|
@@ -20,17 +20,17 @@ puts
|
|
|
20
20
|
# =============================================================================
|
|
21
21
|
# Carousel with Captions
|
|
22
22
|
# =============================================================================
|
|
23
|
-
carousel = ElementComponent::Components::Carousel.new(id: "captionCarousel") do
|
|
24
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true) do
|
|
25
|
-
add_content(%(<img src="hero.jpg" class="d-block w-100" alt="Hero">))
|
|
26
|
-
add_content(ElementComponent::Components::CarouselCaption.new do
|
|
27
|
-
add_content(%(<h5>First slide</h5><p>Some description here.</p>))
|
|
23
|
+
carousel = ElementComponent::Components::Carousel.new(id: "captionCarousel") do |c|
|
|
24
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) do |item|
|
|
25
|
+
item.add_content(%(<img src="hero.jpg" class="d-block w-100" alt="Hero">))
|
|
26
|
+
item.add_content(ElementComponent::Components::CarouselCaption.new do |cap|
|
|
27
|
+
cap.add_content(%(<h5>First slide</h5><p>Some description here.</p>))
|
|
28
28
|
end)
|
|
29
29
|
end)
|
|
30
|
-
add_content(ElementComponent::Components::CarouselItem.new do
|
|
31
|
-
add_content(%(<img src="hero2.jpg" class="d-block w-100" alt="Hero 2">))
|
|
32
|
-
add_content(ElementComponent::Components::CarouselCaption.new do
|
|
33
|
-
add_content(%(<h5>Second slide</h5><p>Another description.</p>))
|
|
30
|
+
c.add_content(ElementComponent::Components::CarouselItem.new do |item|
|
|
31
|
+
item.add_content(%(<img src="hero2.jpg" class="d-block w-100" alt="Hero 2">))
|
|
32
|
+
item.add_content(ElementComponent::Components::CarouselCaption.new do |cap|
|
|
33
|
+
cap.add_content(%(<h5>Second slide</h5><p>Another description.</p>))
|
|
34
34
|
end)
|
|
35
35
|
end)
|
|
36
36
|
end
|
|
@@ -41,9 +41,9 @@ puts
|
|
|
41
41
|
# =============================================================================
|
|
42
42
|
# Fade Carousel
|
|
43
43
|
# =============================================================================
|
|
44
|
-
carousel = ElementComponent::Components::Carousel.new(id: "fadeCarousel", fade: true) do
|
|
45
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true) { add_content("Slide 1") })
|
|
46
|
-
add_content(ElementComponent::Components::CarouselItem.new { add_content("Slide 2") })
|
|
44
|
+
carousel = ElementComponent::Components::Carousel.new(id: "fadeCarousel", fade: true) do |c|
|
|
45
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) { |item| item.add_content("Slide 1") })
|
|
46
|
+
c.add_content(ElementComponent::Components::CarouselItem.new { |item| item.add_content("Slide 2") })
|
|
47
47
|
end
|
|
48
48
|
puts "=== Fade Carousel ==="
|
|
49
49
|
puts carousel.render
|
|
@@ -52,8 +52,8 @@ puts
|
|
|
52
52
|
# =============================================================================
|
|
53
53
|
# Carousel Without Indicators
|
|
54
54
|
# =============================================================================
|
|
55
|
-
carousel = ElementComponent::Components::Carousel.new(id: "noIndicators", indicators: false) do
|
|
56
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true) { add_content("Slide 1") })
|
|
55
|
+
carousel = ElementComponent::Components::Carousel.new(id: "noIndicators", indicators: false) do |c|
|
|
56
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) { |item| item.add_content("Slide 1") })
|
|
57
57
|
end
|
|
58
58
|
puts "=== Carousel Without Indicators ==="
|
|
59
59
|
puts carousel.render
|
|
@@ -62,8 +62,8 @@ puts
|
|
|
62
62
|
# =============================================================================
|
|
63
63
|
# Carousel Without Controls
|
|
64
64
|
# =============================================================================
|
|
65
|
-
carousel = ElementComponent::Components::Carousel.new(id: "noControls", controls: false) do
|
|
66
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true) { add_content("Slide 1") })
|
|
65
|
+
carousel = ElementComponent::Components::Carousel.new(id: "noControls", controls: false) do |c|
|
|
66
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) { |item| item.add_content("Slide 1") })
|
|
67
67
|
end
|
|
68
68
|
puts "=== Carousel Without Controls ==="
|
|
69
69
|
puts carousel.render
|
|
@@ -72,9 +72,11 @@ puts
|
|
|
72
72
|
# =============================================================================
|
|
73
73
|
# Custom Interval
|
|
74
74
|
# =============================================================================
|
|
75
|
-
carousel = ElementComponent::Components::Carousel.new(id: "intervalCarousel") do
|
|
76
|
-
add_content(ElementComponent::Components::CarouselItem.new(active: true, interval: 5000)
|
|
77
|
-
|
|
75
|
+
carousel = ElementComponent::Components::Carousel.new(id: "intervalCarousel") do |c|
|
|
76
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true, interval: 5000) do |item|
|
|
77
|
+
item.add_content("Slide 1")
|
|
78
|
+
end)
|
|
79
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(interval: 2000) { |item| item.add_content("Slide 2") })
|
|
78
80
|
end
|
|
79
81
|
puts "=== Carousel with Custom Interval ==="
|
|
80
82
|
puts carousel.render
|