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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27a79b6578d299e674340e4c1e3c7a0061ff6ac3b9c233f102bb3d4d3fd89011
4
- data.tar.gz: 501d6617270b0e5bc9cef324d270126d5cd531677cdd8ee43bb3a8e18bf1cd4c
3
+ metadata.gz: 9cbfcfb824fb827c1bd03d08c5b2d0eec50fefa7b06c392b3e3393ce07c445be
4
+ data.tar.gz: ef7c00a35e38318c158fd43397552d37559d62c6996ca2f9a1a0dd05c2e32fc7
5
5
  SHA512:
6
- metadata.gz: d7317e82f7fc54008e4f4152372fc1f3575edf3f0956790a87298025707bbcd507422c3a3e32800dd6aa6a3954f1006ac470fde4e44ffb35ba7aba1bfe9ed5e8
7
- data.tar.gz: c358120b8d90a4ef0ea864094cae08d245286a20266c4c645814f7f60ec5795f5a62756a740e91be566b08159914674b91b0ba9af76013de02c0f3e20927d731
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`: instance_eval DSL for adding content inside the element
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
- - `instance_eval(&block)` lives in `Element#initialize` — do NOT repeat it in components
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 `instance_eval`-based blocks and the `new_element` helper
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)
@@ -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
@@ -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") { add_content("Library") })
11
- add_content(ElementComponent::Components::BreadcrumbItem.new(active: true) { add_content("Data") })
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) { add_content("Current Page") })
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
@@ -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
@@ -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) { add_content("Slide 1") })
77
- add_content(ElementComponent::Components::CarouselItem.new(interval: 2000) { add_content("Slide 2") })
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