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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27a79b6578d299e674340e4c1e3c7a0061ff6ac3b9c233f102bb3d4d3fd89011
4
- data.tar.gz: 501d6617270b0e5bc9cef324d270126d5cd531677cdd8ee43bb3a8e18bf1cd4c
3
+ metadata.gz: 8919d998e1eed755c1b0d52a1a755b913c00befed273951da5fab55bc2a6def4
4
+ data.tar.gz: cdb3938426b25800c14566531c14758d7202ede0e6faa76b765f7ace39530219
5
5
  SHA512:
6
- metadata.gz: d7317e82f7fc54008e4f4152372fc1f3575edf3f0956790a87298025707bbcd507422c3a3e32800dd6aa6a3954f1006ac470fde4e44ffb35ba7aba1bfe9ed5e8
7
- data.tar.gz: c358120b8d90a4ef0ea864094cae08d245286a20266c4c645814f7f60ec5795f5a62756a740e91be566b08159914674b91b0ba9af76013de02c0f3e20927d731
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`: 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,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)
@@ -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