element_component 0.7.0 → 0.8.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 +83 -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 +5 -3
- 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: 9cbfcfb824fb827c1bd03d08c5b2d0eec50fefa7b06c392b3e3393ce07c445be
|
|
4
|
+
data.tar.gz: ef7c00a35e38318c158fd43397552d37559d62c6996ca2f9a1a0dd05c2e32fc7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f8297bcae5e86b8201fec505845b928dcf77bcfe4fc28d2d034c29b702446cf0e5566cc82468826b70173aa2392ea4c8b400b9eeeeeabad173923688ff4b5364
|
|
7
|
+
data.tar.gz: 934369f2c1d3a14b74437f6b71427ae1c92fa4ba3e27054f5755fe793e1442fa3c565783d96ce1cfa209a8cbbd35b5da338688910228240c291736ed9d24d46c
|
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,10 +73,10 @@ 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>
|
|
@@ -150,8 +150,8 @@ All components live under `ElementComponent::Components` and support the block D
|
|
|
150
150
|
|
|
151
151
|
|
|
152
152
|
```ruby
|
|
153
|
-
alert = ElementComponent::Components::Alert.new(variant: :success) do
|
|
154
|
-
add_content("Operation completed!")
|
|
153
|
+
alert = ElementComponent::Components::Alert.new(variant: :success) do |e|
|
|
154
|
+
e.add_content("Operation completed!")
|
|
155
155
|
end
|
|
156
156
|
# => <div class="alert alert-success" role="alert">Operation completed!</div>
|
|
157
157
|
```
|
|
@@ -161,10 +161,10 @@ end
|
|
|
161
161
|
Dismissible alerts, headings, and links use sub-components:
|
|
162
162
|
|
|
163
163
|
```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") })
|
|
164
|
+
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do |e|
|
|
165
|
+
e.add_content(ElementComponent::Components::AlertHeading.new { |h| h.add_content("Warning") })
|
|
166
|
+
e.add_content("Please review. ")
|
|
167
|
+
e.add_content(ElementComponent::Components::AlertLink.new(href: "/details") { |l| l.add_content("Details") })
|
|
168
168
|
end
|
|
169
169
|
# => <div class="alert alert-warning alert-dismissible" role="alert">
|
|
170
170
|
# <h4 class="alert-heading">Warning</h4>
|
|
@@ -187,15 +187,15 @@ end
|
|
|
187
187
|
|
|
188
188
|
```ruby
|
|
189
189
|
# Standard button
|
|
190
|
-
btn = ElementComponent::Components::Button.new(variant: :primary) { add_content("Click") }
|
|
190
|
+
btn = ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Click") }
|
|
191
191
|
# => <button class="btn btn-primary" type="button">Click</button>
|
|
192
192
|
|
|
193
193
|
# Outline variant
|
|
194
|
-
btn = ElementComponent::Components::Button.new(variant: :danger, outline: true) { add_content("Delete") }
|
|
194
|
+
btn = ElementComponent::Components::Button.new(variant: :danger, outline: true) { |b| b.add_content("Delete") }
|
|
195
195
|
# => <button class="btn btn-outline-danger" type="button">Delete</button>
|
|
196
196
|
|
|
197
197
|
# As a link
|
|
198
|
-
btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home") { add_content("Home") }
|
|
198
|
+
btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home") { |b| b.add_content("Home") }
|
|
199
199
|
# => <a class="btn btn-primary" href="/home">Home</a>
|
|
200
200
|
```
|
|
201
201
|
|
|
@@ -205,10 +205,10 @@ btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home")
|
|
|
205
205
|
|
|
206
206
|
|
|
207
207
|
```ruby
|
|
208
|
-
badge = ElementComponent::Components::Badge.new(variant: :primary) { add_content("New") }
|
|
208
|
+
badge = ElementComponent::Components::Badge.new(variant: :primary) { |b| b.add_content("New") }
|
|
209
209
|
# => <span class="badge bg-primary">New</span>
|
|
210
210
|
|
|
211
|
-
pill = ElementComponent::Components::Badge.new(variant: :danger, pill: true) { add_content("99+") }
|
|
211
|
+
pill = ElementComponent::Components::Badge.new(variant: :danger, pill: true) { |b| b.add_content("99+") }
|
|
212
212
|
# => <span class="badge bg-danger rounded-pill">99+</span>
|
|
213
213
|
```
|
|
214
214
|
|
|
@@ -216,13 +216,13 @@ pill = ElementComponent::Components::Badge.new(variant: :danger, pill: true) { a
|
|
|
216
216
|
|
|
217
217
|
|
|
218
218
|
```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.") })
|
|
219
|
+
card = ElementComponent::Components::Card.new do |c|
|
|
220
|
+
c.add_content(ElementComponent::Components::CardImage.new(src: "photo.jpg", top: true))
|
|
221
|
+
c.add_content(ElementComponent::Components::CardBody.new do |body|
|
|
222
|
+
body.add_content(ElementComponent::Components::CardTitle.new { |t| t.add_content("Title") })
|
|
223
|
+
body.add_content(ElementComponent::Components::CardText.new { |t| t.add_content("Some text.") })
|
|
224
224
|
end)
|
|
225
|
-
add_content(ElementComponent::Components::CardFooter.new { add_content("Footer") })
|
|
225
|
+
c.add_content(ElementComponent::Components::CardFooter.new { |f| f.add_content("Footer") })
|
|
226
226
|
end
|
|
227
227
|
```
|
|
228
228
|
|
|
@@ -241,12 +241,12 @@ end
|
|
|
241
241
|
|
|
242
242
|
|
|
243
243
|
```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") })
|
|
244
|
+
nav = ElementComponent::Components::Nav.new(type: :tabs) do |n|
|
|
245
|
+
n.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
246
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) { |l| l.add_content("Home") })
|
|
247
247
|
end)
|
|
248
|
-
add_content(ElementComponent::Components::NavItem.new do
|
|
249
|
-
add_content(ElementComponent::Components::NavLink.new(href: "/profile") { add_content("Profile") })
|
|
248
|
+
n.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
249
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/profile") { |l| l.add_content("Profile") })
|
|
250
250
|
end)
|
|
251
251
|
end
|
|
252
252
|
# => <ul class="nav nav-tabs">...</ul>
|
|
@@ -258,10 +258,10 @@ end
|
|
|
258
258
|
|
|
259
259
|
|
|
260
260
|
```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") })
|
|
261
|
+
crumb = ElementComponent::Components::Breadcrumb.new do |b|
|
|
262
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/") { |i| i.add_content("Home") })
|
|
263
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(href: "/section") { |i| i.add_content("Section") })
|
|
264
|
+
b.add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { |i| i.add_content("Current") })
|
|
265
265
|
end
|
|
266
266
|
# => <nav aria-label="breadcrumb"><ol class="breadcrumb">...</ol></nav>
|
|
267
267
|
```
|
|
@@ -270,10 +270,10 @@ end
|
|
|
270
270
|
|
|
271
271
|
|
|
272
272
|
```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") })
|
|
273
|
+
list = ElementComponent::Components::ListGroup.new(flush: true) do |l|
|
|
274
|
+
l.add_content(ElementComponent::Components::ListGroupItem.new { |i| i.add_content("Item 1") })
|
|
275
|
+
l.add_content(ElementComponent::Components::ListGroupItem.new(active: true) { |i| i.add_content("Item 2") })
|
|
276
|
+
l.add_content(ElementComponent::Components::ListGroupItem.new(href: "/link") { |i| i.add_content("Link") })
|
|
277
277
|
end
|
|
278
278
|
# => <ul class="list-group list-group-flush">...</ul>
|
|
279
279
|
```
|
|
@@ -284,9 +284,9 @@ end
|
|
|
284
284
|
|
|
285
285
|
|
|
286
286
|
```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%")
|
|
287
|
+
progress = ElementComponent::Components::Progress.new do |p|
|
|
288
|
+
p.add_content(ElementComponent::Components::ProgressBar.new(value: 75, variant: :success, striped: true) do |bar|
|
|
289
|
+
bar.add_content("75%")
|
|
290
290
|
end)
|
|
291
291
|
end
|
|
292
292
|
# => <div class="progress" role="progressbar"><div class="progress-bar bg-success progress-bar-striped" ...>75%</div></div>
|
|
@@ -307,9 +307,9 @@ grow = ElementComponent::Components::Spinner.new(type: :grow, variant: :success)
|
|
|
307
307
|
|
|
308
308
|
|
|
309
309
|
```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>")
|
|
310
|
+
table = ElementComponent::Components::Table.new(striped: true, bordered: true, hover: true) do |t|
|
|
311
|
+
t.add_content("<thead><tr><th>Name</th><th>Age</th></tr></thead>")
|
|
312
|
+
t.add_content("<tbody><tr><td>John</td><td>30</td></tr></tbody>")
|
|
313
313
|
end
|
|
314
314
|
# => <table class="table table-striped table-bordered table-hover">...</table>
|
|
315
315
|
```
|
|
@@ -320,9 +320,9 @@ end
|
|
|
320
320
|
|
|
321
321
|
|
|
322
322
|
```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") })
|
|
323
|
+
nav = ElementComponent::Components::Pagination.new(size: :lg) do |p|
|
|
324
|
+
p.add_content(ElementComponent::Components::PageItem.new(active: true) { |i| i.add_content("1") })
|
|
325
|
+
p.add_content(ElementComponent::Components::PageItem.new { |i| i.add_content("2") })
|
|
326
326
|
end
|
|
327
327
|
# => <nav aria-label="Pagination"><ul class="pagination pagination-lg">...</ul></nav>
|
|
328
328
|
```
|
|
@@ -331,10 +331,10 @@ end
|
|
|
331
331
|
|
|
332
332
|
|
|
333
333
|
```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") })
|
|
334
|
+
group = ElementComponent::Components::ButtonGroup.new do |g|
|
|
335
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Left") })
|
|
336
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Middle") })
|
|
337
|
+
g.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Right") })
|
|
338
338
|
end
|
|
339
339
|
# => <div class="btn-group" role="group">...</div>
|
|
340
340
|
```
|
|
@@ -356,15 +356,15 @@ disabled = ElementComponent::Components::CloseButton.new(disabled: true)
|
|
|
356
356
|
|
|
357
357
|
|
|
358
358
|
```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") })
|
|
359
|
+
modal = ElementComponent::Components::Modal.new(id: "exampleModal") do |m|
|
|
360
|
+
m.add_content(ElementComponent::Components::ModalContent.new do |content|
|
|
361
|
+
content.add_content(ElementComponent::Components::ModalHeader.new do |header|
|
|
362
|
+
header.add_content(ElementComponent::Components::ModalTitle.new { |t| t.add_content("Modal title") })
|
|
363
363
|
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") })
|
|
364
|
+
content.add_content(ElementComponent::Components::ModalBody.new { |body| body.add_content("Modal body text.") })
|
|
365
|
+
content.add_content(ElementComponent::Components::ModalFooter.new do |footer|
|
|
366
|
+
footer.add_content(ElementComponent::Components::Button.new(variant: :secondary) { |b| b.add_content("Close") })
|
|
367
|
+
footer.add_content(ElementComponent::Components::Button.new(variant: :primary) { |b| b.add_content("Save") })
|
|
368
368
|
end)
|
|
369
369
|
end)
|
|
370
370
|
end
|
|
@@ -387,12 +387,12 @@ end
|
|
|
387
387
|
|
|
388
388
|
|
|
389
389
|
```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="...">))
|
|
390
|
+
carousel = ElementComponent::Components::Carousel.new(id: "slides") do |c|
|
|
391
|
+
c.add_content(ElementComponent::Components::CarouselItem.new(active: true) do |item|
|
|
392
|
+
item.add_content(%(<img src="slide1.jpg" class="d-block w-100" alt="...">))
|
|
393
393
|
end)
|
|
394
|
-
add_content(ElementComponent::Components::CarouselItem.new do
|
|
395
|
-
add_content(%(<img src="slide2.jpg" class="d-block w-100" alt="...">))
|
|
394
|
+
c.add_content(ElementComponent::Components::CarouselItem.new do |item|
|
|
395
|
+
item.add_content(%(<img src="slide2.jpg" class="d-block w-100" alt="...">))
|
|
396
396
|
end)
|
|
397
397
|
end
|
|
398
398
|
```
|
|
@@ -410,20 +410,20 @@ end
|
|
|
410
410
|
|
|
411
411
|
|
|
412
412
|
```ruby
|
|
413
|
-
dropdown = ElementComponent::Components::Dropdown.new do
|
|
414
|
-
add_content(
|
|
413
|
+
dropdown = ElementComponent::Components::Dropdown.new do |d|
|
|
414
|
+
d.add_content(
|
|
415
415
|
ElementComponent::Element.new("button",
|
|
416
416
|
class: "btn btn-secondary dropdown-toggle",
|
|
417
417
|
type: "button",
|
|
418
418
|
"data-bs-toggle": "dropdown",
|
|
419
|
-
"aria-expanded": "false") { add_content("Dropdown") }
|
|
419
|
+
"aria-expanded": "false") { |b| b.add_content("Dropdown") }
|
|
420
420
|
)
|
|
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") })
|
|
421
|
+
d.add_content(
|
|
422
|
+
ElementComponent::Components::DropdownMenu.new do |menu|
|
|
423
|
+
menu.add_content(ElementComponent::Components::DropdownItem.new { |i| i.add_content("Action") })
|
|
424
|
+
menu.add_content(ElementComponent::Components::DropdownItem.new(active: true) { |i| i.add_content("Active") })
|
|
425
|
+
menu.add_content(ElementComponent::Components::DropdownDivider.new)
|
|
426
|
+
menu.add_content(ElementComponent::Components::DropdownItem.new(disabled: true) { |i| i.add_content("Disabled") })
|
|
427
427
|
end
|
|
428
428
|
)
|
|
429
429
|
end
|
|
@@ -444,16 +444,16 @@ end
|
|
|
444
444
|
|
|
445
445
|
|
|
446
446
|
```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") })
|
|
447
|
+
navbar = ElementComponent::Components::Navbar.new(theme: :dark, background: :dark) do |n|
|
|
448
|
+
n.add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { |b| b.add_content("Brand") })
|
|
449
|
+
n.add_content(ElementComponent::Components::NavbarToggler.new(target: "nav"))
|
|
450
|
+
n.add_content(ElementComponent::Components::NavbarCollapse.new(id: "nav") do |collapse|
|
|
451
|
+
collapse.add_content(ElementComponent::Components::NavbarNav.new do |nav|
|
|
452
|
+
nav.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
453
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) { |l| l.add_content("Home") })
|
|
454
454
|
end)
|
|
455
|
-
add_content(ElementComponent::Components::NavItem.new do
|
|
456
|
-
add_content(ElementComponent::Components::NavLink.new(href: "/about") { add_content("About") })
|
|
455
|
+
nav.add_content(ElementComponent::Components::NavItem.new do |item|
|
|
456
|
+
item.add_content(ElementComponent::Components::NavLink.new(href: "/about") { |l| l.add_content("About") })
|
|
457
457
|
end)
|
|
458
458
|
end)
|
|
459
459
|
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
|
|
@@ -33,8 +33,8 @@ puts
|
|
|
33
33
|
# =============================================================================
|
|
34
34
|
# Close Button Inside an Alert (simulated)
|
|
35
35
|
# =============================================================================
|
|
36
|
-
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do
|
|
37
|
-
add_content("This alert has a close button.")
|
|
36
|
+
alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do |a|
|
|
37
|
+
a.add_content("This alert has a close button.")
|
|
38
38
|
end
|
|
39
39
|
puts "=== Close Button Inside Alert ==="
|
|
40
40
|
puts alert.render
|