dsfr-view-components 4.0 → 4.1

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: 952489c459b0e459b926500dbd5dffa0ead338ddd8c5e7196546bcaf9627f09c
4
- data.tar.gz: 60ea4e318eb64e00070ed7858ab53f4429d177489f3fab88379535f9dedda488
3
+ metadata.gz: 1d311caf744ed3223836fc43f8e70b51666992df4c2b2f10f43ac8e302baf115
4
+ data.tar.gz: 7cdd00c96f50f984230622d24a138f2a46375ba5819daefa8e400ef65fb7c93e
5
5
  SHA512:
6
- metadata.gz: e3cd015504d4b42841a05b7a2e0969906f7ca99abdf7dae1ec8f4441608ca54b99b4b41d6023da179618a773e6e346147844c0783e2514e88e64b3e059036f60
7
- data.tar.gz: 2aa09072f0d92e5e6f3e21d315f5eb9bfff1f71e82dcae5f1db910e6721c965f0dccb5c555ebca471930d149cd9695026ea7ec50286218a9500b3bab80b99dd0
6
+ metadata.gz: 0ebe93f69a0cb26daf0bb4900c0c525a2e817cec21c748d8f9ddfa4bf7aa30bfe518b0a4163ae709f7af2a8888b90ea2d7961a71c4f33374f34595538878737d
7
+ data.tar.gz: f8ca4ff1f611861c3f60962a02d24eab0d1461b934fbf6576eaaee1b2b9f90f8a11332836dfadfba7c6fcfbc8d8f858787fb99bcfe3c18a5e4834298471d82d1
@@ -0,0 +1,20 @@
1
+ <%= tag.li(class: "fr-sidemenu__item", **html_attributes) do %>
2
+ <% if sub_items.empty? %>
3
+ <% if @current_page %>
4
+ <a href="<%= path %>" class="fr-sidemenu__link" aria-current="page"><%= title %></a>
5
+ <% else %>
6
+ <a href="<%= path %>" class="fr-sidemenu__link"><%= title %></a>
7
+ <% end %>
8
+ <% else %>
9
+ <button type="button" class="fr-sidemenu__btn" aria-expanded="<%= expanded? ? "true" : "false" %>" aria-controls="sidemenu-<%= object_id %>">
10
+ <%= title %>
11
+ </button>
12
+ <div class="fr-collapse<%= " fr-collapse--expanded" if expanded? %>" id="sidemenu-<%= object_id %>">
13
+ <ul class="fr-sidemenu__list">
14
+ <% sub_items.each do |sub_item| %>
15
+ <%= sub_item %>
16
+ <% end %>
17
+ </ul>
18
+ </div>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,33 @@
1
+ class DsfrComponent::SideMenuComponent::ItemComponent < DsfrComponent::Base
2
+ MAX_LEVEL = 3
3
+
4
+ renders_many :sub_items, ->(title:, path:, current_page: false, expanded: false, html_attributes: {}) {
5
+ DsfrComponent::SideMenuComponent::ItemComponent.new(title:, path:, current_page:, expanded:, level: @level + 1, html_attributes:)
6
+ }
7
+
8
+ # @param title [String] title of the side menu item
9
+ # @param path [String] path of the side menu item
10
+ # @param current_page [Boolean] active current page style
11
+ # @param expanded [Boolean] toggles sub menu folding
12
+ # @param level [Integer] nesting level (1-3), automatically set for sub_items
13
+ def initialize(title:, path:, current_page: false, expanded: false, level: 1, html_attributes: {})
14
+ raise ArgumentError, "Le menu latéral ne supporte pas plus de #{MAX_LEVEL} niveaux" if level > MAX_LEVEL
15
+
16
+ @title = title
17
+ @path = path
18
+ @current_page = current_page
19
+ @expanded = expanded
20
+ @level = level
21
+
22
+ super(html_attributes: html_attributes)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :title, :path, :expanded
28
+ alias_method :expanded?, :expanded
29
+
30
+ def default_attributes
31
+ { class: 'fr-sidemenu__item' }
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ <%= tag.nav(**html_attributes) do %>
2
+ <div class="fr-sidemenu__inner">
3
+ <button type="button" class="fr-sidemenu__btn" aria-expanded="false" aria-controls="sidemenu-collapse-<%= object_id %>"><%= title %></button>
4
+ <div class="fr-collapse" id="sidemenu-collapse-<%= object_id %>">
5
+ <% if title %>
6
+ <p class="fr-sidemenu__title" id="sidemenu-title-<%= object_id %>"><%= title %></p>
7
+ <% end %>
8
+ <ul class="fr-sidemenu__list">
9
+ <% items.each do |item| %>
10
+ <%= item %>
11
+ <% end %>
12
+ </ul>
13
+ </div>
14
+ </div>
15
+ <% end %>
@@ -0,0 +1,20 @@
1
+ module DsfrComponent
2
+ class SideMenuComponent < DsfrComponent::Base
3
+ renders_many :items, "DsfrComponent::SideMenuComponent::ItemComponent"
4
+
5
+ # @param title [String] title of the side menu
6
+ def initialize(title:, html_attributes: {})
7
+ @title = title
8
+
9
+ super(html_attributes:)
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :title
15
+
16
+ def default_attributes
17
+ { class: 'fr-sidemenu', role: 'navigation', "aria-labelledby": "sidemenu-title-#{object_id}" }
18
+ end
19
+ end
20
+ end
@@ -22,6 +22,8 @@ module DsfrComponentsHelper
22
22
  dsfr_notice: 'DsfrComponent::NoticeComponent',
23
23
  dsfr_search: 'DsfrComponent::SearchComponent',
24
24
  dsfr_proconnect_button: 'DsfrComponent::ProconnectButtonComponent',
25
+ dsfr_side_menu: 'DsfrComponent::SideMenuComponent',
26
+ dsfr_side_menu_item: 'DsfrComponent::SideMenuComponent::ItemComponent',
25
27
  # DO NOT REMOVE: new component mapping here
26
28
  }.freeze
27
29
  HELPER_NAME_TO_CLASS_NAME.each do |name, klass|
@@ -1,5 +1,5 @@
1
1
  module Dsfr
2
2
  module Components
3
- VERSION = '4.0'.freeze
3
+ VERSION = '4.1'.freeze
4
4
  end
5
5
  end
@@ -1,18 +1,18 @@
1
1
  class DsfrComponent::<%= @name %>Component < DsfrComponent::Base
2
2
  <% if options[:params].empty? %>
3
- def initialize(classes: [], html_attributes: {})
4
- super(classes: classes, html_attributes: html_attributes)
3
+ def initialize(html_attributes: {})
4
+ super(html_attributes: html_attributes)
5
5
  end
6
6
  <% else %>
7
7
  <%- options[:params].each do |param, type| -%>
8
8
  # @param <%= param %> [<%= type %>] FIXME: document
9
9
  <%- end -%>
10
- def initialize(<%= options[:params].keys.map { |p| "#{p}:" }.join(", ") %>, classes: [], html_attributes: {})
10
+ def initialize(<%= options[:params].keys.map { |p| "#{p}:" }.join(", ") %>, html_attributes: {})
11
11
  <%- options[:params].keys.each do |param| -%>
12
12
  <%= "@#{param} = #{param}" %>
13
13
  <%- end -%>
14
14
 
15
- super(classes: classes, html_attributes: html_attributes)
15
+ super(html_attributes: html_attributes)
16
16
  end
17
17
  <% end %>
18
18
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dsfr-view-components
3
3
  version: !ruby/object:Gem::Version
4
- version: '4.0'
4
+ version: '4.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - BetaGouv developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-30 00:00:00.000000000 Z
11
+ date: 2026-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: html-attributes-utils
@@ -42,16 +42,22 @@ dependencies:
42
42
  name: dsfr-assets
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.13.2
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '1.15'
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">="
53
56
  - !ruby/object:Gem::Version
54
57
  version: 1.13.2
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.15'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: deep_merge
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -357,6 +363,10 @@ files:
357
363
  - app/components/dsfr_component/proconnect_button_component.rb
358
364
  - app/components/dsfr_component/search_component.html.erb
359
365
  - app/components/dsfr_component/search_component.rb
366
+ - app/components/dsfr_component/side_menu_component.html.erb
367
+ - app/components/dsfr_component/side_menu_component.rb
368
+ - app/components/dsfr_component/side_menu_component/item_component.html.erb
369
+ - app/components/dsfr_component/side_menu_component/item_component.rb
360
370
  - app/components/dsfr_component/skiplink_component.html.erb
361
371
  - app/components/dsfr_component/skiplink_component.rb
362
372
  - app/components/dsfr_component/stepper_component.html.erb