From b345a6e9a8191a720f2ac5cb8e9869c38bc5b402 Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 28 Nov 2025 16:52:27 +0100 Subject: [PATCH 1/7] feat: bootstrap 5 renderer --- lib/simple_navigation_bootstrap.rb | 1 + lib/simple_navigation_bootstrap/bootstrap5.rb | 28 +++++++++++++++++++ .../rendered_item.rb | 2 +- spec/lib/simple_navigation_bootstrap_spec.rb | 4 +++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 lib/simple_navigation_bootstrap/bootstrap5.rb diff --git a/lib/simple_navigation_bootstrap.rb b/lib/simple_navigation_bootstrap.rb index fc3e3cb..fbf3e46 100644 --- a/lib/simple_navigation_bootstrap.rb +++ b/lib/simple_navigation_bootstrap.rb @@ -18,3 +18,4 @@ module SimpleNavigationBootstrap SimpleNavigation.register_renderer(bootstrap2: SimpleNavigationBootstrap::Bootstrap2) SimpleNavigation.register_renderer(bootstrap3: SimpleNavigationBootstrap::Bootstrap3) SimpleNavigation.register_renderer(bootstrap4: SimpleNavigationBootstrap::Bootstrap4) +SimpleNavigation.register_renderer(bootstrap5: SimpleNavigationBootstrap::Bootstrap5) diff --git a/lib/simple_navigation_bootstrap/bootstrap5.rb b/lib/simple_navigation_bootstrap/bootstrap5.rb new file mode 100644 index 0000000..3059053 --- /dev/null +++ b/lib/simple_navigation_bootstrap/bootstrap5.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module SimpleNavigationBootstrap + class Bootstrap5 < SimpleNavigation::Renderer::Base + + include BootstrapBase + + + private + + + def bootstrap_version + 5 + end + + + def navigation_class + 'navbar-nav' + end + + + # def container_class(_level) + # remove_navigation_class = options.fetch(:remove_navigation_class, false) + # remove_navigation_class ? '' : ['nav', navigation_class].compact + # end + + end +end diff --git a/lib/simple_navigation_bootstrap/rendered_item.rb b/lib/simple_navigation_bootstrap/rendered_item.rb index 3a44297..f0aa9ca 100644 --- a/lib/simple_navigation_bootstrap/rendered_item.rb +++ b/lib/simple_navigation_bootstrap/rendered_item.rb @@ -98,7 +98,7 @@ def splitted_dropdown_part # rubocop:disable Metrics/AbcSize def dropdown_part(name) # rubocop:disable Metrics/AbcSize - options[:class] = [options[:class], 'dropdown'].flatten.compact.join(' ') + options[:class] = [options[:class], 'dropdown-menu'].flatten.compact.join(' ') link_options[:class] = [link_options[:class], 'dropdown-toggle'].flatten.compact.join(' ') link_options[:'data-toggle'] = 'dropdown' link_options[:'data-target'] = '#' diff --git a/spec/lib/simple_navigation_bootstrap_spec.rb b/spec/lib/simple_navigation_bootstrap_spec.rb index 5ddca58..e868d81 100644 --- a/spec/lib/simple_navigation_bootstrap_spec.rb +++ b/spec/lib/simple_navigation_bootstrap_spec.rb @@ -14,4 +14,8 @@ it 'registers Bootstrap4 renderer' do expect(SimpleNavigation.registered_renderers[:bootstrap4]).to eq SimpleNavigationBootstrap::Bootstrap4 end + + it 'registers Bootstrap5 renderer' do + expect(SimpleNavigation.registered_renderers[:bootstrap5]).to eq SimpleNavigationBootstrap::Bootstrap5 + end end From 26fdb5400bfe3c2d62c74050e3f417bf45549d2d Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 28 Nov 2025 17:03:33 +0100 Subject: [PATCH 2/7] chore: empty commit From 82eec4426edddc0ddac9e2deb8755b411a8560dc Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 12 Dec 2025 10:59:56 +0100 Subject: [PATCH 3/7] feat: bootstrap5 support --- lib/simple_navigation_bootstrap/bootstrap5.rb | 7 +-- .../rendered_item5.rb | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 lib/simple_navigation_bootstrap/rendered_item5.rb diff --git a/lib/simple_navigation_bootstrap/bootstrap5.rb b/lib/simple_navigation_bootstrap/bootstrap5.rb index 3059053..875b135 100644 --- a/lib/simple_navigation_bootstrap/bootstrap5.rb +++ b/lib/simple_navigation_bootstrap/bootstrap5.rb @@ -19,10 +19,9 @@ def navigation_class end - # def container_class(_level) - # remove_navigation_class = options.fetch(:remove_navigation_class, false) - # remove_navigation_class ? '' : ['nav', navigation_class].compact - # end + def render_item(*) + SimpleNavigationBootstrap::RenderedItem5.new(*).to_s + end end end diff --git a/lib/simple_navigation_bootstrap/rendered_item5.rb b/lib/simple_navigation_bootstrap/rendered_item5.rb new file mode 100644 index 0000000..891e034 --- /dev/null +++ b/lib/simple_navigation_bootstrap/rendered_item5.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module SimpleNavigationBootstrap + class RenderedItem5 < RenderedItem + private + + def li_link # rubocop:disable Metrics/AbcSize, Metrics/MethodLength + if include_sub_navigation?(item) + if level == 1 + if split + splitted_simple_part + splitted_dropdown_part + else + content = [item.name] + content << caret unless skip_caret + content = content.join(" ").html_safe + dropdown_part(content) + end + else + content_tag(:li, dropdown_submenu_link, options) + end + else + options[:class] = [options[:class], "nav-item"].flatten.compact.join( + " " + ) if level == 1 + content_tag(:li, simple_link, options) + end + end + + def dropdown_part(name) # rubocop:disable Metrics/AbcSize + options[:class] = [options[:class], "nav-item", "dropdown"].flatten + .compact + .join(" ") + link_options[:class] = [ + link_options[:class], + "nav-link", + "dropdown-toggle" + ].flatten.compact.join(" ") + link_options[:"role"] = "button" + link_options[:"data-bs-toggle"] = "dropdown" + link_options[:"aria-expanded"] = "false" + + content = + link_to(name, "#", link_options) + render_sub_navigation_for(item) + content_tag(:li, content, options) + end + + def simple_link + link_class = level == 1 ? "nav-link" : "dropdown-item" + link_options[:class] = [options[:class], link_class].flatten.compact.join(" ") + link_options[:method] ||= item.method + url = item.url || "#" + link_to(item.name, url, link_options) + end + end +end From 5de217cb45cd709490ba87396ece993950dec9bd Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 29 May 2026 11:32:49 +0200 Subject: [PATCH 4/7] fix: nav-item in link classes --- lib/simple_navigation_bootstrap/rendered_item5.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/simple_navigation_bootstrap/rendered_item5.rb b/lib/simple_navigation_bootstrap/rendered_item5.rb index 891e034..d1da98c 100644 --- a/lib/simple_navigation_bootstrap/rendered_item5.rb +++ b/lib/simple_navigation_bootstrap/rendered_item5.rb @@ -35,7 +35,7 @@ def dropdown_part(name) # rubocop:disable Metrics/AbcSize "nav-link", "dropdown-toggle" ].flatten.compact.join(" ") - link_options[:"role"] = "button" + link_options[:role] = "button" link_options[:"data-bs-toggle"] = "dropdown" link_options[:"aria-expanded"] = "false" @@ -46,7 +46,7 @@ def dropdown_part(name) # rubocop:disable Metrics/AbcSize def simple_link link_class = level == 1 ? "nav-link" : "dropdown-item" - link_options[:class] = [options[:class], link_class].flatten.compact.join(" ") + link_options[:class] = link_class link_options[:method] ||= item.method url = item.url || "#" link_to(item.name, url, link_options) From fa45d592d4e88770b012583b28640314777ac755 Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 29 May 2026 11:44:40 +0200 Subject: [PATCH 5/7] fix: broke non bootstrap5 dropdown links --- lib/simple_navigation_bootstrap/rendered_item.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/simple_navigation_bootstrap/rendered_item.rb b/lib/simple_navigation_bootstrap/rendered_item.rb index f0aa9ca..3a44297 100644 --- a/lib/simple_navigation_bootstrap/rendered_item.rb +++ b/lib/simple_navigation_bootstrap/rendered_item.rb @@ -98,7 +98,7 @@ def splitted_dropdown_part # rubocop:disable Metrics/AbcSize def dropdown_part(name) # rubocop:disable Metrics/AbcSize - options[:class] = [options[:class], 'dropdown-menu'].flatten.compact.join(' ') + options[:class] = [options[:class], 'dropdown'].flatten.compact.join(' ') link_options[:class] = [link_options[:class], 'dropdown-toggle'].flatten.compact.join(' ') link_options[:'data-toggle'] = 'dropdown' link_options[:'data-target'] = '#' From fbf5f2e983db38823c07aa328c7d8e4538da85db Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 29 May 2026 12:01:12 +0200 Subject: [PATCH 6/7] fix: merge link_class[:class] --- lib/simple_navigation_bootstrap/rendered_item5.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/simple_navigation_bootstrap/rendered_item5.rb b/lib/simple_navigation_bootstrap/rendered_item5.rb index d1da98c..5f955ef 100644 --- a/lib/simple_navigation_bootstrap/rendered_item5.rb +++ b/lib/simple_navigation_bootstrap/rendered_item5.rb @@ -46,7 +46,7 @@ def dropdown_part(name) # rubocop:disable Metrics/AbcSize def simple_link link_class = level == 1 ? "nav-link" : "dropdown-item" - link_options[:class] = link_class + link_options[:class] = [link_options[:class], link_class].flatten.compact.join(" ") link_options[:method] ||= item.method url = item.url || "#" link_to(item.name, url, link_options) From ec2c13ac495ce3c48b0f389352c0b1f3a706442f Mon Sep 17 00:00:00 2001 From: Henning Schumann Date: Fri, 29 May 2026 14:02:34 +0200 Subject: [PATCH 7/7] fix: active class and aria-current="page" for selected item --- lib/simple_navigation_bootstrap/rendered_item5.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/simple_navigation_bootstrap/rendered_item5.rb b/lib/simple_navigation_bootstrap/rendered_item5.rb index 5f955ef..2bdc039 100644 --- a/lib/simple_navigation_bootstrap/rendered_item5.rb +++ b/lib/simple_navigation_bootstrap/rendered_item5.rb @@ -46,8 +46,9 @@ def dropdown_part(name) # rubocop:disable Metrics/AbcSize def simple_link link_class = level == 1 ? "nav-link" : "dropdown-item" - link_options[:class] = [link_options[:class], link_class].flatten.compact.join(" ") + link_options[:class] = [link_options[:class], link_class, item.selected_class].flatten.compact.join(" ") link_options[:method] ||= item.method + link_options[:"aria-current"] = "page" if item.selected? url = item.url || "#" link_to(item.name, url, link_options) end