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,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Modal
7
+ # =============================================================================
8
+ modal = ElementComponent::Components::Modal.new(id: "basicModal")
9
+ modal.add_content(
10
+ ElementComponent::Components::ModalContent.new do |mc|
11
+ mc.add_content(ElementComponent::Components::ModalHeader.new do |mh|
12
+ mh.add_content(ElementComponent::Components::ModalTitle.new { |mt| mt.add_content("Modal title") })
13
+ end)
14
+ mc.add_content(ElementComponent::Components::ModalBody.new { |mb| mb.add_content("Modal body text goes here.") })
15
+ mc.add_content(ElementComponent::Components::ModalFooter.new do |mf|
16
+ mf.add_content(ElementComponent::Components::Button.new(variant: :secondary) { |btn| btn.add_content("Close") })
17
+ mf.add_content(ElementComponent::Components::Button.new(variant: :primary) do |btn|
18
+ btn.add_content("Save changes")
19
+ end)
20
+ end)
21
+ end
22
+ )
23
+ puts "=== Basic Modal ==="
24
+ puts modal.render
25
+ puts
26
+
27
+ # =============================================================================
28
+ # Scrollable Modal
29
+ # =============================================================================
30
+ modal = ElementComponent::Components::Modal.new(id: "scrollModal", scrollable: true)
31
+ modal.add_content(
32
+ ElementComponent::Components::ModalContent.new do |mc|
33
+ mc.add_content(ElementComponent::Components::ModalHeader.new do |mh|
34
+ mh.add_content(ElementComponent::Components::ModalTitle.new { |mt| mt.add_content("Scrollable") })
35
+ end)
36
+ mc.add_content(ElementComponent::Components::ModalBody.new { |mb| mb.add_content("Long content body...") })
37
+ mc.add_content(ElementComponent::Components::ModalFooter.new { |mf| mf.add_content("Footer") })
38
+ end
39
+ )
40
+ puts "=== Scrollable Modal ==="
41
+ puts modal.render
42
+ puts
43
+
44
+ # =============================================================================
45
+ # Centered Modal
46
+ # =============================================================================
47
+ modal = ElementComponent::Components::Modal.new(id: "centerModal", centered: true)
48
+ modal.add_content(
49
+ ElementComponent::Components::ModalContent.new do |mc|
50
+ mc.add_content(ElementComponent::Components::ModalBody.new { |mb| mb.add_content("Centered content") })
51
+ end
52
+ )
53
+ puts "=== Centered Modal ==="
54
+ puts modal.render
55
+ puts
56
+
57
+ # =============================================================================
58
+ # Large Modal
59
+ # =============================================================================
60
+ modal = ElementComponent::Components::Modal.new(id: "lgModal", size: :lg)
61
+ modal.add_content(
62
+ ElementComponent::Components::ModalContent.new do |mc|
63
+ mc.add_content(ElementComponent::Components::ModalBody.new { |mb| mb.add_content("Large modal body") })
64
+ end
65
+ )
66
+ puts "=== Large Modal ==="
67
+ puts modal.render
68
+ puts
69
+
70
+ # =============================================================================
71
+ # Static Backdrop Modal
72
+ # =============================================================================
73
+ modal = ElementComponent::Components::Modal.new(id: "staticModal", static: true)
74
+ modal.add_content(
75
+ ElementComponent::Components::ModalContent.new do |mc|
76
+ mc.add_content(ElementComponent::Components::ModalBody.new { |mb| mb.add_content("Click outside does not close") })
77
+ end
78
+ )
79
+ puts "=== Static Backdrop Modal ==="
80
+ puts modal.render
81
+ puts
82
+
83
+ # =============================================================================
84
+ # Header Without Close
85
+ # =============================================================================
86
+ modal = ElementComponent::Components::Modal.new(id: "noCloseModal")
87
+ modal.add_content(
88
+ ElementComponent::Components::ModalContent.new do |mc|
89
+ mc.add_content(ElementComponent::Components::ModalHeader.new(close_button: false) do |mh|
90
+ mh.add_content(ElementComponent::Components::ModalTitle.new { |mt| mt.add_content("No close button") })
91
+ end)
92
+ end
93
+ )
94
+ puts "=== Modal Header Without Close ==="
95
+ puts modal.render
96
+ puts
97
+
98
+ # =============================================================================
99
+ # Sub-Components Rendered Independently
100
+ # =============================================================================
101
+ puts "=== ModalDialog ==="
102
+ puts ElementComponent::Components::ModalDialog.new.render
103
+ puts
104
+
105
+ puts "=== ModalContent ==="
106
+ puts ElementComponent::Components::ModalContent.new.render
107
+ puts
108
+
109
+ puts "=== ModalHeader ==="
110
+ puts ElementComponent::Components::ModalHeader.new.render
111
+ puts
112
+
113
+ puts "=== ModalTitle ==="
114
+ puts ElementComponent::Components::ModalTitle.new.render
115
+ puts
116
+
117
+ puts "=== ModalBody ==="
118
+ puts ElementComponent::Components::ModalBody.new.render
119
+ puts
120
+
121
+ puts "=== ModalFooter ==="
122
+ puts ElementComponent::Components::ModalFooter.new.render
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Nav
7
+ # =============================================================================
8
+ nav = ElementComponent::Components::Nav.new
9
+ puts "=== Basic Nav ==="
10
+ puts nav.render
11
+ puts
12
+
13
+ # =============================================================================
14
+ # Nav Tabs
15
+ # =============================================================================
16
+ nav = ElementComponent::Components::Nav.new(type: :tabs) do |n|
17
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
18
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) do |link|
19
+ link.add_content("Home")
20
+ end)
21
+ end)
22
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
23
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/profile") { |link| link.add_content("Profile") })
24
+ end)
25
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
26
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/messages", disabled: true) do |link|
27
+ link.add_content("Messages")
28
+ end)
29
+ end)
30
+ end
31
+ puts "=== Nav Tabs ==="
32
+ puts nav.render
33
+ puts
34
+
35
+ # =============================================================================
36
+ # Nav Pills
37
+ # =============================================================================
38
+ nav = ElementComponent::Components::Nav.new(type: :pills) do |n|
39
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
40
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/") { |link| link.add_content("Home") })
41
+ end)
42
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
43
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/about") { |link| link.add_content("About") })
44
+ end)
45
+ end
46
+ puts "=== Nav Pills ==="
47
+ puts nav.render
48
+ puts
49
+
50
+ # =============================================================================
51
+ # Nav Fill and Justified
52
+ # =============================================================================
53
+ nav = ElementComponent::Components::Nav.new(type: :pills, fill: true) do |n|
54
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
55
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/") { |link| link.add_content("Home") })
56
+ end)
57
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
58
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/about") { |link| link.add_content("About") })
59
+ end)
60
+ end
61
+ puts "=== Nav Fill ==="
62
+ puts nav.render
63
+ puts
64
+
65
+ # =============================================================================
66
+ # Vertical Nav
67
+ # =============================================================================
68
+ nav = ElementComponent::Components::Nav.new(vertical: true) do |n|
69
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
70
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/") { |link| link.add_content("Home") })
71
+ end)
72
+ n.add_content(ElementComponent::Components::NavItem.new do |item|
73
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/about") { |link| link.add_content("About") })
74
+ end)
75
+ end
76
+ puts "=== Vertical Nav ==="
77
+ puts nav.render
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Navbar
7
+ # =============================================================================
8
+ navbar = ElementComponent::Components::Navbar.new do |n|
9
+ n.add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { |brand| brand.add_content("Navbar") })
10
+ n.add_content(ElementComponent::Components::NavbarToggler.new(target: "basicNav"))
11
+ n.add_content(ElementComponent::Components::NavbarCollapse.new(id: "basicNav") do |collapse|
12
+ collapse.add_content(ElementComponent::Components::NavbarNav.new do |nav|
13
+ nav.add_content(ElementComponent::Components::NavItem.new do |item|
14
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) do |link|
15
+ link.add_content("Home")
16
+ end)
17
+ end)
18
+ nav.add_content(ElementComponent::Components::NavItem.new do |item|
19
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/about") { |link| link.add_content("About") })
20
+ end)
21
+ end)
22
+ end)
23
+ end
24
+ puts "=== Basic Navbar ==="
25
+ puts navbar.render
26
+ puts
27
+
28
+ # =============================================================================
29
+ # Dark Navbar
30
+ # =============================================================================
31
+ navbar = ElementComponent::Components::Navbar.new(theme: :dark, background: :dark) do |n|
32
+ n.add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { |brand| brand.add_content("Dark") })
33
+ n.add_content(ElementComponent::Components::NavbarToggler.new(target: "darkNav"))
34
+ n.add_content(ElementComponent::Components::NavbarCollapse.new(id: "darkNav") do |collapse|
35
+ collapse.add_content(ElementComponent::Components::NavbarNav.new do |nav|
36
+ nav.add_content(ElementComponent::Components::NavItem.new do |item|
37
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) do |link|
38
+ link.add_content("Home")
39
+ end)
40
+ end)
41
+ nav.add_content(ElementComponent::Components::NavItem.new do |item|
42
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/contact") do |link|
43
+ link.add_content("Contact")
44
+ end)
45
+ end)
46
+ nav.add_content(ElementComponent::Components::NavItem.new do |item|
47
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/disabled", disabled: true) do |link|
48
+ link.add_content("Disabled")
49
+ end)
50
+ end)
51
+ end)
52
+ end)
53
+ end
54
+ puts "=== Dark Navbar ==="
55
+ puts navbar.render
56
+ puts
57
+
58
+ # =============================================================================
59
+ # Navbar with Container
60
+ # =============================================================================
61
+ navbar = ElementComponent::Components::Navbar.new(container: "container") do |n|
62
+ n.add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { |brand| brand.add_content("Container") })
63
+ n.add_content(ElementComponent::Components::NavbarToggler.new(target: "containerNav"))
64
+ n.add_content(ElementComponent::Components::NavbarCollapse.new(id: "containerNav") do |collapse|
65
+ collapse.add_content(ElementComponent::Components::NavbarNav.new do |nav|
66
+ nav.add_content(ElementComponent::Components::NavItem.new do |item|
67
+ item.add_content(ElementComponent::Components::NavLink.new(href: "/", active: true) do |link|
68
+ link.add_content("Home")
69
+ end)
70
+ end)
71
+ end)
72
+ end)
73
+ end
74
+ puts "=== Navbar with Container ==="
75
+ puts navbar.render
76
+ puts
77
+
78
+ # =============================================================================
79
+ # Navbar Without Container
80
+ # =============================================================================
81
+ navbar = ElementComponent::Components::Navbar.new(container: false) do |n|
82
+ n.add_content(ElementComponent::Components::NavbarBrand.new(href: "/") { |brand| brand.add_content("Fluid") })
83
+ end
84
+ puts "=== Navbar Without Container ==="
85
+ puts navbar.render
86
+ puts
87
+
88
+ # =============================================================================
89
+ # Sub-Components Rendered Independently
90
+ # =============================================================================
91
+ puts "=== NavbarBrand ==="
92
+ puts ElementComponent::Components::NavbarBrand.new(href: "/").render
93
+ puts
94
+
95
+ puts "=== NavbarToggler ==="
96
+ puts ElementComponent::Components::NavbarToggler.new(target: "myNav").render
97
+ puts
98
+
99
+ puts "=== NavbarCollapse ==="
100
+ puts ElementComponent::Components::NavbarCollapse.new(id: "myNav").render
101
+ puts
102
+
103
+ puts "=== NavbarNav ==="
104
+ puts ElementComponent::Components::NavbarNav.new.render
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Pagination
7
+ # =============================================================================
8
+ pager = ElementComponent::Components::Pagination.new do |p|
9
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("1") })
10
+ p.add_content(ElementComponent::Components::PageItem.new(active: true) { |item| item.add_content("2") })
11
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("3") })
12
+ end
13
+ puts "=== Basic Pagination ==="
14
+ puts pager.render
15
+ puts
16
+
17
+ # =============================================================================
18
+ # Pagination with Previous/Next
19
+ # =============================================================================
20
+ pager = ElementComponent::Components::Pagination.new do |p|
21
+ p.add_content(ElementComponent::Components::PageItem.new(disabled: true) { |item| item.add_content("Previous") })
22
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("1") })
23
+ p.add_content(ElementComponent::Components::PageItem.new(active: true) { |item| item.add_content("2") })
24
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("3") })
25
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("Next") })
26
+ end
27
+ puts "=== Pagination with Previous/Next ==="
28
+ puts pager.render
29
+ puts
30
+
31
+ # =============================================================================
32
+ # Pagination Sizes
33
+ # =============================================================================
34
+ pager_sm = ElementComponent::Components::Pagination.new(size: :sm) do |p|
35
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("1") })
36
+ p.add_content(ElementComponent::Components::PageItem.new(active: true) { |item| item.add_content("2") })
37
+ end
38
+ puts "=== Small Pagination ==="
39
+ puts pager_sm.render
40
+ puts
41
+
42
+ pager_lg = ElementComponent::Components::Pagination.new(size: :lg) do |p|
43
+ p.add_content(ElementComponent::Components::PageItem.new { |item| item.add_content("1") })
44
+ p.add_content(ElementComponent::Components::PageItem.new(active: true) { |item| item.add_content("2") })
45
+ end
46
+ puts "=== Large Pagination ==="
47
+ puts pager_lg.render
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Progress Bar
7
+ # =============================================================================
8
+ progress = ElementComponent::Components::Progress.new do |p|
9
+ p.add_content(ElementComponent::Components::ProgressBar.new(value: 75))
10
+ end
11
+ puts "=== Basic Progress Bar ==="
12
+ puts progress.render
13
+ puts
14
+
15
+ # =============================================================================
16
+ # Progress Bar with Variant
17
+ # =============================================================================
18
+ progress = ElementComponent::Components::Progress.new do |p|
19
+ p.add_content(ElementComponent::Components::ProgressBar.new(value: 50, variant: :info))
20
+ end
21
+ puts "=== Progress Bar with Variant ==="
22
+ puts progress.render
23
+ puts
24
+
25
+ # =============================================================================
26
+ # Striped and Animated Progress Bar
27
+ # =============================================================================
28
+ progress = ElementComponent::Components::Progress.new do |p|
29
+ p.add_content(ElementComponent::Components::ProgressBar.new(
30
+ value: 60, variant: :warning, striped: true, animated: true
31
+ ))
32
+ end
33
+ puts "=== Striped and Animated ==="
34
+ puts progress.render
35
+ puts
36
+
37
+ # =============================================================================
38
+ # Multiple Progress Bars
39
+ # =============================================================================
40
+ progress = ElementComponent::Components::Progress.new do |p|
41
+ p.add_content(ElementComponent::Components::ProgressBar.new(value: 30, variant: :danger))
42
+ p.add_content(ElementComponent::Components::ProgressBar.new(value: 20, variant: :warning))
43
+ p.add_content(ElementComponent::Components::ProgressBar.new(value: 40, variant: :success))
44
+ end
45
+ puts "=== Multiple Progress Bars ==="
46
+ puts progress.render
47
+ puts
48
+
49
+ # =============================================================================
50
+ # Standalone Progress Bar
51
+ # =============================================================================
52
+ bar = ElementComponent::Components::ProgressBar.new(value: 85, variant: :success)
53
+ puts "=== Standalone Progress Bar ==="
54
+ puts bar.render
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Border Spinner
7
+ # =============================================================================
8
+ spinner = ElementComponent::Components::Spinner.new
9
+ puts "=== Basic Border Spinner ==="
10
+ puts spinner.render
11
+ puts
12
+
13
+ # =============================================================================
14
+ # Grow Spinner
15
+ # =============================================================================
16
+ spinner = ElementComponent::Components::Spinner.new(type: :grow)
17
+ puts "=== Grow Spinner ==="
18
+ puts spinner.render
19
+ puts
20
+
21
+ # =============================================================================
22
+ # Color Variants
23
+ # =============================================================================
24
+ puts "=== Color Variants ==="
25
+ %i[primary secondary success danger warning info light dark].each do |variant|
26
+ spinner = ElementComponent::Components::Spinner.new(variant: variant)
27
+ puts spinner.render
28
+ end
29
+ puts
30
+
31
+ # =============================================================================
32
+ # Spinner with Screen Reader Text
33
+ # =============================================================================
34
+ spinner = ElementComponent::Components::Spinner.new do |s|
35
+ s.add_content(ElementComponent::Element.new("span", class: "visually-hidden") { |e| e.add_content("Loading...") })
36
+ end
37
+ puts "=== Spinner with Text ==="
38
+ puts spinner.render
39
+ puts
40
+
41
+ # =============================================================================
42
+ # Spinner with Custom Attributes
43
+ # =============================================================================
44
+ spinner = ElementComponent::Components::Spinner.new(
45
+ variant: :primary,
46
+ style: "width: 3rem; height: 3rem;"
47
+ )
48
+ puts "=== Spinner with Custom Attributes ==="
49
+ puts spinner.render
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/element_component"
4
+
5
+ # =============================================================================
6
+ # Basic Table
7
+ # =============================================================================
8
+ table = ElementComponent::Components::Table.new
9
+ puts "=== Basic Table ==="
10
+ puts table.render
11
+ puts
12
+
13
+ # =============================================================================
14
+ # Table with All Options
15
+ # =============================================================================
16
+ table = ElementComponent::Components::Table.new(
17
+ striped: true, bordered: true, hover: true, small: true, variant: :dark
18
+ )
19
+ puts "=== Table with All Options ==="
20
+ puts table.render
21
+ puts
22
+
23
+ # =============================================================================
24
+ # Table with Content
25
+ # =============================================================================
26
+ table = ElementComponent::Components::Table.new(striped: true) do |t|
27
+ t.add_content("<thead><tr><th>Name</th><th>Age</th></tr></thead>")
28
+ t.add_content("<tbody><tr><td>John</td><td>30</td></tr></tbody>")
29
+ end
30
+ puts "=== Table with Content ==="
31
+ puts table.render
32
+ puts
33
+
34
+ # =============================================================================
35
+ # Table Variants
36
+ # =============================================================================
37
+ puts "=== Table Variants ==="
38
+ %i[primary secondary success danger warning info light dark].each do |variant|
39
+ t = ElementComponent::Components::Table.new(variant: variant)
40
+ puts t.render
41
+ end
@@ -7,13 +7,13 @@ require_relative "alert/close_button"
7
7
  module ElementComponent
8
8
  module Components
9
9
  class Alert < Element
10
- VALID_CONTEXTS = %i[primary secondary success danger warning info light dark].freeze
10
+ VALID_VARIANTS = %i[primary secondary success danger warning info light dark].freeze
11
11
 
12
- def initialize(context: :primary, dismissible: false, **attributes, &block)
12
+ def initialize(variant: :primary, dismissible: false, **attributes, &block)
13
13
  super("div", &block)
14
14
 
15
15
  add_attribute(class: "alert")
16
- add_attribute(class: "alert-#{context}")
16
+ add_attribute(class: "alert-#{variant}")
17
17
  add_attribute(class: "alert-dismissible") if dismissible
18
18
  add_attribute(role: "alert")
19
19
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElementComponent
4
+ module Components
5
+ class Badge < Element
6
+ VALID_VARIANTS = %i[primary secondary success danger warning info light dark].freeze
7
+
8
+ def initialize(variant: :primary, pill: false, **attributes, &block)
9
+ super("span", &block)
10
+
11
+ add_attribute(class: "badge")
12
+ add_attribute(class: "bg-#{variant}")
13
+ add_attribute(class: "rounded-pill") if pill
14
+ add_attribute(attributes) unless attributes.empty?
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElementComponent
4
+ module Components
5
+ class BreadcrumbItem < Element
6
+ def initialize(href: nil, active: false, **attributes, &block)
7
+ super("li", &block)
8
+
9
+ add_attribute(class: "breadcrumb-item")
10
+ add_attribute(class: "active") if active
11
+ add_attribute("aria-current": "page") if active
12
+ add_attribute(attributes) unless attributes.empty?
13
+
14
+ @href = href
15
+ end
16
+
17
+ private
18
+
19
+ def mount_content
20
+ inner = super
21
+ if @href && @contents.none?(Element)
22
+ "<a href=\"#{@href}\">#{inner}</a>"
23
+ else
24
+ inner
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "breadcrumb/item"
4
+
5
+ module ElementComponent
6
+ module Components
7
+ class Breadcrumb < Element
8
+ def initialize(**attributes, &)
9
+ super("nav", &)
10
+
11
+ add_attribute("aria-label": "breadcrumb")
12
+ add_attribute(attributes) unless attributes.empty?
13
+ end
14
+
15
+ def build
16
+ @html << "<#{@element}"
17
+ @html << (mount_attributes.empty? ? ">" : " #{mount_attributes}>")
18
+ @html << "<ol class=\"breadcrumb\">"
19
+ @html << mount_content
20
+ @html << "</ol>"
21
+ @html << "</#{@element}>" if @closing_tag
22
+ @html
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElementComponent
4
+ module Components
5
+ class Button < Element
6
+ VALID_VARIANTS = %i[primary secondary success danger warning info light dark link].freeze
7
+ VALID_SIZES = %i[sm lg].freeze
8
+
9
+ def initialize(variant: :primary, outline: false, size: nil, href: nil, **attributes, &block)
10
+ if href
11
+ super("a", &block)
12
+ add_attribute(href: href)
13
+ else
14
+ super("button", &block)
15
+ add_attribute(type: "button")
16
+ end
17
+
18
+ add_attribute(class: "btn")
19
+ add_attribute(class: outline ? "btn-outline-#{variant}" : "btn-#{variant}")
20
+ add_attribute(class: "btn-#{size}") if size
21
+ add_attribute(attributes) unless attributes.empty?
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElementComponent
4
+ module Components
5
+ class ButtonGroup < Element
6
+ VALID_SIZES = %i[sm lg].freeze
7
+
8
+ def initialize(size: nil, vertical: false, **attributes, &block)
9
+ super("div", &block)
10
+
11
+ add_attribute(class: vertical ? "btn-group-vertical" : "btn-group")
12
+ add_attribute(class: "btn-group-#{size}") if size
13
+ add_attribute(role: "group")
14
+ add_attribute(attributes) unless attributes.empty?
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElementComponent
4
+ module Components
5
+ class CardBody < Element
6
+ def initialize(**attributes, &)
7
+ super("div", &)
8
+
9
+ add_attribute(class: "card-body")
10
+ add_attribute(attributes) unless attributes.empty?
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElementComponent
4
+ module Components
5
+ class CardFooter < Element
6
+ def initialize(**attributes, &)
7
+ super("div", &)
8
+
9
+ add_attribute(class: "card-footer")
10
+ add_attribute(attributes) unless attributes.empty?
11
+ end
12
+ end
13
+ end
14
+ end