element_component 0.6.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/AGENTS.md +5 -5
  3. data/README.md +348 -41
  4. data/examples/alert_example.rb +17 -17
  5. data/examples/badge_example.rb +63 -0
  6. data/examples/breadcrumb_example.rb +40 -0
  7. data/examples/button_example.rb +86 -0
  8. data/examples/button_group_example.rb +55 -0
  9. data/examples/card_example.rb +62 -0
  10. data/examples/carousel_example.rb +97 -0
  11. data/examples/close_button_example.rb +40 -0
  12. data/examples/dropdown_example.rb +131 -0
  13. data/examples/list_group_example.rb +68 -0
  14. data/examples/modal_example.rb +122 -0
  15. data/examples/nav_example.rb +77 -0
  16. data/examples/navbar_example.rb +104 -0
  17. data/examples/pagination_example.rb +47 -0
  18. data/examples/progress_example.rb +54 -0
  19. data/examples/spinner_example.rb +49 -0
  20. data/examples/table_example.rb +41 -0
  21. data/lib/element_component/components/alert.rb +3 -3
  22. data/lib/element_component/components/badge.rb +18 -0
  23. data/lib/element_component/components/breadcrumb/item.rb +29 -0
  24. data/lib/element_component/components/breadcrumb.rb +26 -0
  25. data/lib/element_component/components/button.rb +25 -0
  26. data/lib/element_component/components/button_group.rb +18 -0
  27. data/lib/element_component/components/card/body.rb +14 -0
  28. data/lib/element_component/components/card/footer.rb +14 -0
  29. data/lib/element_component/components/card/header.rb +14 -0
  30. data/lib/element_component/components/card/image.rb +17 -0
  31. data/lib/element_component/components/card/text.rb +14 -0
  32. data/lib/element_component/components/card/title.rb +14 -0
  33. data/lib/element_component/components/card.rb +21 -0
  34. data/lib/element_component/components/carousel/caption.rb +14 -0
  35. data/lib/element_component/components/carousel/item.rb +16 -0
  36. data/lib/element_component/components/carousel.rb +70 -0
  37. data/lib/element_component/components/close_button.rb +17 -0
  38. data/lib/element_component/components/dropdown/divider.rb +20 -0
  39. data/lib/element_component/components/dropdown/header.rb +22 -0
  40. data/lib/element_component/components/dropdown/item.rb +33 -0
  41. data/lib/element_component/components/dropdown/menu.rb +15 -0
  42. data/lib/element_component/components/dropdown.rb +43 -0
  43. data/lib/element_component/components/list_group/item.rb +23 -0
  44. data/lib/element_component/components/list_group.rb +18 -0
  45. data/lib/element_component/components/modal/body.rb +14 -0
  46. data/lib/element_component/components/modal/content.rb +14 -0
  47. data/lib/element_component/components/modal/dialog.rb +21 -0
  48. data/lib/element_component/components/modal/footer.rb +14 -0
  49. data/lib/element_component/components/modal/header.rb +16 -0
  50. data/lib/element_component/components/modal/title.rb +14 -0
  51. data/lib/element_component/components/modal.rb +42 -0
  52. data/lib/element_component/components/nav/item.rb +14 -0
  53. data/lib/element_component/components/nav/link.rb +18 -0
  54. data/lib/element_component/components/nav.rb +23 -0
  55. data/lib/element_component/components/navbar/brand.rb +15 -0
  56. data/lib/element_component/components/navbar/collapse.rb +16 -0
  57. data/lib/element_component/components/navbar/nav.rb +14 -0
  58. data/lib/element_component/components/navbar/toggler.rb +22 -0
  59. data/lib/element_component/components/navbar.rb +51 -0
  60. data/lib/element_component/components/pagination/item.rb +27 -0
  61. data/lib/element_component/components/pagination.rb +33 -0
  62. data/lib/element_component/components/progress/bar.rb +24 -0
  63. data/lib/element_component/components/progress.rb +17 -0
  64. data/lib/element_component/components/spinner.rb +19 -0
  65. data/lib/element_component/components/table.rb +21 -0
  66. data/lib/element_component/components.rb +16 -0
  67. data/lib/element_component/element.rb +5 -3
  68. data/lib/element_component/version.rb +1 -1
  69. metadata +61 -1
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Breadcrumb
7
+ # =============================================================================
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") })
14
+ end
15
+ puts "=== Basic Breadcrumb ==="
16
+ puts breadcrumb.render
17
+ puts
18
+
19
+ # =============================================================================
20
+ # Breadcrumb with Two Items
21
+ # =============================================================================
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)
27
+ end
28
+ puts "=== Two-Item Breadcrumb ==="
29
+ puts breadcrumb.render
30
+ puts
31
+
32
+ # =============================================================================
33
+ # Breadcrumb with Custom Class
34
+ # =============================================================================
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") })
38
+ end
39
+ puts "=== Breadcrumb with Custom Class ==="
40
+ puts breadcrumb.render
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Button
7
+ # =============================================================================
8
+ btn = ElementComponent::Components::Button.new(variant: :primary)
9
+ btn.add_content("Click Me")
10
+ puts "=== Basic Button ==="
11
+ puts btn.render
12
+ puts
13
+
14
+ # =============================================================================
15
+ # Outline Button
16
+ # =============================================================================
17
+ btn = ElementComponent::Components::Button.new(variant: :danger, outline: true)
18
+ btn.add_content("Delete")
19
+ puts "=== Outline Button ==="
20
+ puts btn.render
21
+ puts
22
+
23
+ # =============================================================================
24
+ # Size Variants
25
+ # =============================================================================
26
+ btn_lg = ElementComponent::Components::Button.new(variant: :success, size: :lg)
27
+ btn_lg.add_content("Large Button")
28
+
29
+ btn_sm = ElementComponent::Components::Button.new(variant: :secondary, size: :sm)
30
+ btn_sm.add_content("Small Button")
31
+
32
+ puts "=== Size Variants ==="
33
+ puts btn_lg.render
34
+ puts btn_sm.render
35
+ puts
36
+
37
+ # =============================================================================
38
+ # Button as Link
39
+ # =============================================================================
40
+ btn = ElementComponent::Components::Button.new(variant: :primary, href: "/home")
41
+ btn.add_content("Home")
42
+ puts "=== Button as Link ==="
43
+ puts btn.render
44
+ puts
45
+
46
+ # =============================================================================
47
+ # All Contexts
48
+ # =============================================================================
49
+ puts "=== All Button Variants ==="
50
+ ElementComponent::Components::Button::VALID_VARIANTS.each do |variant|
51
+ btn = ElementComponent::Components::Button.new(variant: variant)
52
+ btn.add_content(variant.to_s.capitalize)
53
+ puts btn.render
54
+ end
55
+ puts
56
+
57
+ # =============================================================================
58
+ # Button with Block
59
+ # =============================================================================
60
+ btn = ElementComponent::Components::Button.new(variant: :info) do |b|
61
+ b.add_content("Info Button")
62
+ end
63
+ puts "=== Button with Block ==="
64
+ puts btn.render
65
+ puts
66
+
67
+ # =============================================================================
68
+ # Chained API
69
+ # =============================================================================
70
+ btn = ElementComponent::Components::Button.new(variant: :warning)
71
+ .add_content("Caution")
72
+ puts "=== Chained API ==="
73
+ puts btn.render
74
+ puts
75
+
76
+ # =============================================================================
77
+ # Button with Custom Attributes
78
+ # =============================================================================
79
+ btn = ElementComponent::Components::Button.new(
80
+ variant: :dark,
81
+ id: "btn-submit",
82
+ data: { action: "submit" }
83
+ )
84
+ btn.add_content("Submit")
85
+ puts "=== Button with Custom Attributes ==="
86
+ puts btn.render
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Button Group
7
+ # =============================================================================
8
+ group = ElementComponent::Components::ButtonGroup.new
9
+ group.add_content(
10
+ ElementComponent::Components::Button.new(variant: :primary).add_content("Left")
11
+ )
12
+ group.add_content(
13
+ ElementComponent::Components::Button.new(variant: :primary).add_content("Middle")
14
+ )
15
+ group.add_content(
16
+ ElementComponent::Components::Button.new(variant: :primary).add_content("Right")
17
+ )
18
+ puts "=== Basic Button Group ==="
19
+ puts group.render
20
+ puts
21
+
22
+ # =============================================================================
23
+ # Vertical Button Group
24
+ # =============================================================================
25
+ group = ElementComponent::Components::ButtonGroup.new(vertical: true)
26
+ group.add_content(
27
+ ElementComponent::Components::Button.new(variant: :secondary).add_content("Top")
28
+ )
29
+ group.add_content(
30
+ ElementComponent::Components::Button.new(variant: :secondary).add_content("Bottom")
31
+ )
32
+ puts "=== Vertical Button Group ==="
33
+ puts group.render
34
+ puts
35
+
36
+ # =============================================================================
37
+ # Button Group with Size
38
+ # =============================================================================
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
+ end
43
+ puts "=== Small Button Group ==="
44
+ puts group.render
45
+ puts
46
+
47
+ # =============================================================================
48
+ # Chained API
49
+ # =============================================================================
50
+ group = ElementComponent::Components::ButtonGroup.new(class: "my-group")
51
+ group.add_content(
52
+ ElementComponent::Components::Button.new(variant: :info).add_content("Action")
53
+ )
54
+ puts "=== Button Group with Custom Class ==="
55
+ puts group.render
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Card
7
+ # =============================================================================
8
+ card = ElementComponent::Components::Card.new
9
+ card.add_content("Simple card content")
10
+ puts "=== Basic Card ==="
11
+ puts card.render
12
+ puts
13
+
14
+ # =============================================================================
15
+ # Card with Header, Body, and Footer
16
+ # =============================================================================
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
+ end
22
+ puts "=== Card with Header, Body, Footer ==="
23
+ puts card.render
24
+ puts
25
+
26
+ # =============================================================================
27
+ # Card with Title and Text
28
+ # =============================================================================
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
+ end)
34
+ end
35
+ puts "=== Card with Title and Text ==="
36
+ puts card.render
37
+ puts
38
+
39
+ # =============================================================================
40
+ # Card with Image
41
+ # =============================================================================
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
+ end)
48
+ end
49
+ puts "=== Card with Image ==="
50
+ puts card.render
51
+ puts
52
+
53
+ # =============================================================================
54
+ # Chained API
55
+ # =============================================================================
56
+ card = ElementComponent::Components::Card.new
57
+ card.add_content(
58
+ ElementComponent::Components::CardBody.new
59
+ .add_content("Chained content")
60
+ )
61
+ puts "=== Chained API ==="
62
+ puts card.render
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Carousel
7
+ # =============================================================================
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
+ end)
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
+ end)
15
+ end
16
+ puts "=== Basic Carousel ==="
17
+ puts carousel.render
18
+ puts
19
+
20
+ # =============================================================================
21
+ # Carousel with Captions
22
+ # =============================================================================
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
+ end)
29
+ end)
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
+ end)
35
+ end)
36
+ end
37
+ puts "=== Carousel with Captions ==="
38
+ puts carousel.render
39
+ puts
40
+
41
+ # =============================================================================
42
+ # Fade Carousel
43
+ # =============================================================================
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
+ end
48
+ puts "=== Fade Carousel ==="
49
+ puts carousel.render
50
+ puts
51
+
52
+ # =============================================================================
53
+ # Carousel Without Indicators
54
+ # =============================================================================
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
+ end
58
+ puts "=== Carousel Without Indicators ==="
59
+ puts carousel.render
60
+ puts
61
+
62
+ # =============================================================================
63
+ # Carousel Without Controls
64
+ # =============================================================================
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
+ end
68
+ puts "=== Carousel Without Controls ==="
69
+ puts carousel.render
70
+ puts
71
+
72
+ # =============================================================================
73
+ # Custom Interval
74
+ # =============================================================================
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") })
80
+ end
81
+ puts "=== Carousel with Custom Interval ==="
82
+ puts carousel.render
83
+ puts
84
+
85
+ # =============================================================================
86
+ # Sub-Components Rendered Independently
87
+ # =============================================================================
88
+ puts "=== CarouselItem ==="
89
+ puts ElementComponent::Components::CarouselItem.new.render
90
+ puts
91
+
92
+ puts "=== CarouselItem Active ==="
93
+ puts ElementComponent::Components::CarouselItem.new(active: true).render
94
+ puts
95
+
96
+ puts "=== CarouselCaption ==="
97
+ puts ElementComponent::Components::CarouselCaption.new.render
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Close Button
7
+ # =============================================================================
8
+ btn = ElementComponent::Components::CloseButton.new
9
+ puts "=== Basic Close Button ==="
10
+ puts btn.render
11
+ puts
12
+
13
+ # =============================================================================
14
+ # Disabled Close Button
15
+ # =============================================================================
16
+ btn = ElementComponent::Components::CloseButton.new(disabled: true)
17
+ puts "=== Disabled Close Button ==="
18
+ puts btn.render
19
+ puts
20
+
21
+ # =============================================================================
22
+ # Close Button with Custom Attributes
23
+ # =============================================================================
24
+ btn = ElementComponent::Components::CloseButton.new(
25
+ class: "custom-close",
26
+ id: "close-btn-1",
27
+ data: { dismiss: "modal" }
28
+ )
29
+ puts "=== Close Button with Custom Attributes ==="
30
+ puts btn.render
31
+ puts
32
+
33
+ # =============================================================================
34
+ # Close Button Inside an Alert (simulated)
35
+ # =============================================================================
36
+ alert = ElementComponent::Components::Alert.new(variant: :warning, dismissible: true) do |a|
37
+ a.add_content("This alert has a close button.")
38
+ end
39
+ puts "=== Close Button Inside Alert ==="
40
+ puts alert.render
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Dropdown
7
+ # =============================================================================
8
+ dropdown = ElementComponent::Components::Dropdown.new do |d|
9
+ d.add_content(
10
+ ElementComponent::Element.new("button",
11
+ class: "btn btn-secondary dropdown-toggle",
12
+ type: "button",
13
+ "data-bs-toggle": "dropdown",
14
+ "aria-expanded": "false") do |btn|
15
+ btn.add_content("Dropdown")
16
+ end
17
+ )
18
+ d.add_content(
19
+ ElementComponent::Components::DropdownMenu.new do |menu|
20
+ menu.add_content(ElementComponent::Components::DropdownItem.new { |item| item.add_content("Action") })
21
+ menu.add_content(ElementComponent::Components::DropdownItem.new { |item| item.add_content("Another action") })
22
+ menu.add_content(ElementComponent::Components::DropdownDivider.new)
23
+ menu.add_content(ElementComponent::Components::DropdownItem.new { |item| item.add_content("Something else") })
24
+ end
25
+ )
26
+ end
27
+ puts "=== Basic Dropdown ==="
28
+ puts dropdown.render
29
+ puts
30
+
31
+ # =============================================================================
32
+ # Dropdown with Active and Disabled Items
33
+ # =============================================================================
34
+ dropdown = ElementComponent::Components::Dropdown.new do |d|
35
+ d.add_content(
36
+ ElementComponent::Element.new("button",
37
+ class: "btn btn-primary dropdown-toggle",
38
+ type: "button",
39
+ "data-bs-toggle": "dropdown",
40
+ "aria-expanded": "false") do |btn|
41
+ btn.add_content("Menu")
42
+ end
43
+ )
44
+ d.add_content(
45
+ ElementComponent::Components::DropdownMenu.new do |menu|
46
+ menu.add_content(ElementComponent::Components::DropdownHeader.new { |h| h.add_content("Section 1") })
47
+ menu.add_content(ElementComponent::Components::DropdownItem.new { |item| item.add_content("Regular item") })
48
+ menu.add_content(ElementComponent::Components::DropdownItem.new(active: true) do |item|
49
+ item.add_content("Active item")
50
+ end)
51
+ menu.add_content(ElementComponent::Components::DropdownItem.new(disabled: true) do |item|
52
+ item.add_content("Disabled item")
53
+ end)
54
+ end
55
+ )
56
+ end
57
+ puts "=== Dropdown with States ==="
58
+ puts dropdown.render
59
+ puts
60
+
61
+ # =============================================================================
62
+ # Dropdown Type Button Items
63
+ # =============================================================================
64
+ dropdown = ElementComponent::Components::Dropdown.new do |d|
65
+ d.add_content(
66
+ ElementComponent::Element.new("button",
67
+ class: "btn btn-success dropdown-toggle",
68
+ type: "button",
69
+ "data-bs-toggle": "dropdown",
70
+ "aria-expanded": "false") do |btn|
71
+ btn.add_content("Actions")
72
+ end
73
+ )
74
+ d.add_content(
75
+ ElementComponent::Components::DropdownMenu.new do |menu|
76
+ menu.add_content(ElementComponent::Components::DropdownItem.new(type: :button) do |item|
77
+ item.add_content("Save")
78
+ end)
79
+ menu.add_content(ElementComponent::Components::DropdownItem.new(type: :button) do |item|
80
+ item.add_content("Delete")
81
+ end)
82
+ end
83
+ )
84
+ end
85
+ puts "=== Dropdown with Button Items ==="
86
+ puts dropdown.render
87
+ puts
88
+
89
+ # =============================================================================
90
+ # Dropup Direction
91
+ # =============================================================================
92
+ dropdown = ElementComponent::Components::Dropdown.new(direction: :dropup) do |d|
93
+ d.add_content(
94
+ ElementComponent::Element.new("button",
95
+ class: "btn btn-warning dropdown-toggle",
96
+ type: "button",
97
+ "data-bs-toggle": "dropdown",
98
+ "aria-expanded": "false") do |btn|
99
+ btn.add_content("Up")
100
+ end
101
+ )
102
+ d.add_content(
103
+ ElementComponent::Components::DropdownMenu.new do |menu|
104
+ menu.add_content(ElementComponent::Components::DropdownItem.new { |item| item.add_content("Item 1") })
105
+ menu.add_content(ElementComponent::Components::DropdownItem.new { |item| item.add_content("Item 2") })
106
+ end
107
+ )
108
+ end
109
+ puts "=== Dropup ==="
110
+ puts dropdown.render
111
+ puts
112
+
113
+ # =============================================================================
114
+ # Sub-Components Rendered Independently
115
+ # =============================================================================
116
+ puts "=== DropdownMenu ==="
117
+ puts ElementComponent::Components::DropdownMenu.new.render
118
+ puts
119
+
120
+ puts "=== DropdownItem ==="
121
+ dropdown_item = ElementComponent::Components::DropdownItem.new { |item| item.add_content("Item") }
122
+ puts dropdown_item.render
123
+ puts
124
+
125
+ puts "=== DropdownDivider ==="
126
+ puts ElementComponent::Components::DropdownDivider.new.render
127
+ puts
128
+
129
+ puts "=== DropdownHeader ==="
130
+ dropdown_header = ElementComponent::Components::DropdownHeader.new { |h| h.add_content("Header") }
131
+ puts dropdown_header.render
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic List Group
7
+ # =============================================================================
8
+ group = ElementComponent::Components::ListGroup.new do |g|
9
+ g.add_content(ElementComponent::Components::ListGroupItem.new { |item| item.add_content("Item 1") })
10
+ g.add_content(ElementComponent::Components::ListGroupItem.new { |item| item.add_content("Item 2") })
11
+ g.add_content(ElementComponent::Components::ListGroupItem.new { |item| item.add_content("Item 3") })
12
+ end
13
+ puts "=== Basic List Group ==="
14
+ puts group.render
15
+ puts
16
+
17
+ # =============================================================================
18
+ # Flush List Group
19
+ # =============================================================================
20
+ group = ElementComponent::Components::ListGroup.new(flush: true) do |g|
21
+ g.add_content(ElementComponent::Components::ListGroupItem.new { |item| item.add_content("Flush Item 1") })
22
+ g.add_content(ElementComponent::Components::ListGroupItem.new { |item| item.add_content("Flush Item 2") })
23
+ end
24
+ puts "=== Flush List Group ==="
25
+ puts group.render
26
+ puts
27
+
28
+ # =============================================================================
29
+ # Active and Disabled Items
30
+ # =============================================================================
31
+ group = ElementComponent::Components::ListGroup.new do |g|
32
+ g.add_content(ElementComponent::Components::ListGroupItem.new(active: true) do |item|
33
+ item.add_content("Active Item")
34
+ end)
35
+ g.add_content(ElementComponent::Components::ListGroupItem.new { |item| item.add_content("Regular Item") })
36
+ g.add_content(ElementComponent::Components::ListGroupItem.new(disabled: true) do |item|
37
+ item.add_content("Disabled Item")
38
+ end)
39
+ end
40
+ puts "=== Active and Disabled Items ==="
41
+ puts group.render
42
+ puts
43
+
44
+ # =============================================================================
45
+ # List Group with Links
46
+ # =============================================================================
47
+ group = ElementComponent::Components::ListGroup.new do |g|
48
+ g.add_content(ElementComponent::Components::ListGroupItem.new(href: "/page1") { |item| item.add_content("Link 1") })
49
+ g.add_content(ElementComponent::Components::ListGroupItem.new(href: "/page2") { |item| item.add_content("Link 2") })
50
+ end
51
+ puts "=== List Group with Links ==="
52
+ puts group.render
53
+ puts
54
+
55
+ # =============================================================================
56
+ # Variant Items
57
+ # =============================================================================
58
+ group = ElementComponent::Components::ListGroup.new do |g|
59
+ g.add_content(ElementComponent::Components::ListGroupItem.new(variant: :success) do |item|
60
+ item.add_content("Success")
61
+ end)
62
+ g.add_content(ElementComponent::Components::ListGroupItem.new(variant: :danger) { |item| item.add_content("Danger") })
63
+ g.add_content(ElementComponent::Components::ListGroupItem.new(variant: :warning) do |item|
64
+ item.add_content("Warning")
65
+ end)
66
+ end
67
+ puts "=== Variant Items ==="
68
+ puts group.render