govuk-components 3.3.0 → 4.0.0a2

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: 1df60620e63644cfc2a2007fb73966c65701a0034787a34a504e309f8c2666f9
4
- data.tar.gz: f0c1980dde2b151960efc9a56bf6b1e443459a47f36137346e8e6336cd31ef52
3
+ metadata.gz: 4a89715e3ac54c26a25f8711ffcc1bcbae3c7cd697e6dc4993d6581c52fe4885
4
+ data.tar.gz: 8c781f15f6e02d50b5c463732770340502a7c3e300b63f633c6ca09b084effab
5
5
  SHA512:
6
- metadata.gz: cdf8542481bbae72b25a5a16775c2bbad8d1ed51fce15f03997e5b6f24f2e18b1c03312d04a176b8cb90ba857909bd06f464a302502d1cf316b3947b81f5c4a2
7
- data.tar.gz: ae8afa05dc72db60956893985d0c0b2cab9d81573f24bf513ec0276b1d38a0472e1ae26f36bc9fd923a43a6512c7af06225de1b67cf09bb3e1cc4c828424ee61
6
+ metadata.gz: 4c89afcba1f59b8b7d02142b891904667a9b6aaeb84db7f1d4c6c373d516b7ee302aa23e6431d21e3144f1ea6bbdc7d78703bc6d3dfe88e5c00c2f987ce8368c
7
+ data.tar.gz: 1dc348dde934a1806118c18c75d20b4cee98b03ba2032a1a86a4a0519461662acab039b8a8f65fd41ef3406faf634da95e72db9a2e33456af191375f87477b19
data/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
  [![Gem](https://img.shields.io/gem/dt/govuk-components?logo=rubygems)](https://rubygems.org/gems/govuk-components)
7
7
  [![Test Coverage](https://api.codeclimate.com/v1/badges/cbcbc140f300b920d833/test_coverage)](https://codeclimate.com/github/DFE-Digital/govuk-components/test_coverage)
8
8
  [![GitHub license](https://img.shields.io/github/license/DFE-Digital/govuk-components)](https://github.com/DFE-Digital/govuk-components/blob/main/LICENSE)
9
- [![GOV.UK Design System Version](https://img.shields.io/badge/GOV.UK%20Design%20System-4.4.0-brightgreen)](https://design-system.service.gov.uk)
10
- [![Rails](https://img.shields.io/badge/Rails-6.1.5%20%E2%95%B1%207.0.3-E16D6D)](https://weblog.rubyonrails.org/releases/)
11
- [![Ruby](https://img.shields.io/badge/Ruby-2.7.6%20%20%E2%95%B1%203.0.3%20%20%E2%95%B1%203.1.2-E16D6D)](https://www.ruby-lang.org/en/downloads/)
9
+ [![GOV.UK Design System Version](https://img.shields.io/badge/GOV.UK%20Design%20System-4.5.0-brightgreen)](https://design-system.service.gov.uk)
10
+ [![Rails](https://img.shields.io/badge/Rails-6.1.7%20%E2%95%B1%207.0.3-E16D6D)](https://weblog.rubyonrails.org/releases/)
11
+ [![Ruby](https://img.shields.io/badge/Ruby-3.0.5%20%20%E2%95%B1%203.1.3%20%20%E2%95%B1%203.2.0-E16D6D)](https://www.ruby-lang.org/en/downloads/)
12
12
 
13
13
  This gem provides a suite of reusable components for the [GOV.UK Design System](https://design-system.service.gov.uk/). It is intended to provide a lightweight alternative to the [GOV.UK Publishing Components](https://github.com/alphagov/govuk_publishing_components) library and is built with GitHub’s [ViewComponent](https://github.com/github/view_component) framework.
14
14
 
@@ -96,7 +96,7 @@ private
96
96
  text: @previous_text,
97
97
  }
98
98
 
99
- previous_page(**kwargs.compact)
99
+ with_previous_page(**kwargs.compact)
100
100
  end
101
101
 
102
102
  def build_next
@@ -107,11 +107,11 @@ private
107
107
  text: @next_text,
108
108
  }
109
109
 
110
- next_page(**kwargs.compact)
110
+ with_next_page(**kwargs.compact)
111
111
  end
112
112
 
113
113
  def build_items
114
- pagy.series.map { |i| item(number: i, href: pagy_url_for(pagy, i), from_pagy: true) }
114
+ pagy.series.map { |i| with_item(number: i, href: pagy_url_for(pagy, i), from_pagy: true) }
115
115
  end
116
116
 
117
117
  def default_adjacent_text(side)
@@ -0,0 +1,16 @@
1
+ <%= tag.div(**html_attributes) do %>
2
+ <div class="govuk-summary-card__title-wrapper">
3
+ <%= tag.h2(title, class: "govuk-summary-card__title") %>
4
+
5
+ <% if actions.any? %>
6
+ <ul class="govuk-summary-card__actions">
7
+ <% actions.each do |action| %>
8
+ <%= tag.li(action, class: "govuk-summary-card__action") %>
9
+ <% end %>
10
+ </ul>
11
+ <% end %>
12
+ </div>
13
+ <div class="govuk-summary-card__content">
14
+ <%= summary_list || content %>
15
+ </div>
16
+ <% end %>
@@ -0,0 +1,19 @@
1
+ class GovukComponent::SummaryListComponent::CardComponent < GovukComponent::Base
2
+ attr_reader :title
3
+
4
+ renders_many :actions
5
+ renders_one :summary_list, "GovukComponent::SummaryListComponent"
6
+
7
+ def initialize(title:, actions: [], classes: [], html_attributes: {})
8
+ @title = title
9
+ actions.each { |a| with_action { a } } if actions.any?
10
+
11
+ super(classes: classes, html_attributes: html_attributes)
12
+ end
13
+
14
+ private
15
+
16
+ def default_attributes
17
+ { class: %w(govuk-summary-card) }
18
+ end
19
+ end
@@ -1,6 +1,6 @@
1
1
  module GovukComponent
2
2
  class SummaryListComponent < GovukComponent::Base
3
- attr_reader :borders, :actions
3
+ attr_reader :borders, :actions, :card
4
4
 
5
5
  renders_many :rows, ->(classes: [], html_attributes: {}, &block) do
6
6
  GovukComponent::SummaryListComponent::RowComponent.new(
@@ -11,9 +11,10 @@ module GovukComponent
11
11
  )
12
12
  end
13
13
 
14
- def initialize(rows: nil, actions: true, borders: config.default_summary_list_borders, classes: [], html_attributes: {})
14
+ def initialize(rows: nil, actions: true, borders: config.default_summary_list_borders, card: nil, classes: [], html_attributes: {})
15
15
  @borders = borders
16
16
  @show_actions_column = actions
17
+ @card = card
17
18
 
18
19
  super(classes: classes, html_attributes: html_attributes)
19
20
 
@@ -22,8 +23,21 @@ module GovukComponent
22
23
  build(rows)
23
24
  end
24
25
 
26
+ def call
27
+ summary_list = tag.dl(**html_attributes) { safe_join(rows) }
28
+
29
+ (card.nil?) ? summary_list : card_with(summary_list)
30
+ end
31
+
25
32
  private
26
33
 
34
+ # we're not using `renders_one` here because we always want the card to render
35
+ # outside of the summary list. when manually building use
36
+ # govuk_summary_list_card { govuk_summary_list }
37
+ def card_with(summary_list)
38
+ render(GovukComponent::SummaryListComponent::CardComponent.new(**card)) { summary_list }
39
+ end
40
+
27
41
  def borders_class
28
42
  %(govuk-summary-list--no-border) unless borders
29
43
  end
@@ -38,10 +52,10 @@ module GovukComponent
38
52
  rows.each do |data|
39
53
  k, v, a = data.values_at(:key, :value, :actions)
40
54
 
41
- row(**data.slice(:classes, :html_attributes)) do |r|
42
- r.key(**k)
43
- r.value(**v)
44
- Array.wrap(a).each { |ad| r.action(**ad) }
55
+ with_row(**data.slice(:classes, :html_attributes)) do |r|
56
+ r.with_key(**k)
57
+ r.with_value(**v)
58
+ Array.wrap(a).each { |ad| r.with_action(**ad) }
45
59
  end
46
60
  end
47
61
  end
@@ -1,5 +1,13 @@
1
1
  class GovukComponent::TableComponent::BodyComponent < GovukComponent::Base
2
- renders_many :rows, "GovukComponent::TableComponent::RowComponent"
2
+ renders_many :rows, ->(cell_data: nil, first_cell_is_header: false, classes: [], html_attributes: {}, &block) do
3
+ GovukComponent::TableComponent::RowComponent.from_body(
4
+ cell_data: cell_data,
5
+ first_cell_is_header: first_cell_is_header,
6
+ classes: classes,
7
+ html_attributes: html_attributes,
8
+ &block
9
+ )
10
+ end
3
11
 
4
12
  def initialize(rows: nil, first_cell_is_header: false, classes: [], html_attributes: {})
5
13
  super(classes: classes, html_attributes: html_attributes)
@@ -7,12 +15,16 @@ class GovukComponent::TableComponent::BodyComponent < GovukComponent::Base
7
15
  build_rows_from_row_data(rows, first_cell_is_header)
8
16
  end
9
17
 
18
+ def call
19
+ tag.tbody(**html_attributes) { safe_join(rows) }
20
+ end
21
+
10
22
  private
11
23
 
12
24
  def build_rows_from_row_data(data, first_cell_is_header)
13
25
  return if data.blank?
14
26
 
15
- data.each { |d| row(cell_data: d, first_cell_is_header: first_cell_is_header) }
27
+ data.each { |d| with_row(cell_data: d, first_cell_is_header: first_cell_is_header) }
16
28
  end
17
29
 
18
30
  def default_attributes
@@ -1,7 +1,8 @@
1
1
  class GovukComponent::TableComponent::CellComponent < GovukComponent::Base
2
- attr_reader :text, :header, :numeric, :width
2
+ attr_reader :text, :header, :numeric, :width, :scope, :parent, :colspan, :rowspan
3
3
 
4
4
  alias_method :numeric?, :numeric
5
+ alias_method :header?, :header
5
6
 
6
7
  WIDTHS = {
7
8
  "full" => "govuk-!-width-full",
@@ -12,11 +13,15 @@ class GovukComponent::TableComponent::CellComponent < GovukComponent::Base
12
13
  "one-quarter" => "govuk-!-width-one-quarter",
13
14
  }.freeze
14
15
 
15
- def initialize(header: false, text: nil, numeric: false, width: nil, classes: [], html_attributes: {})
16
- @header = header
16
+ def initialize(scope: nil, header: nil, numeric: false, text: nil, width: nil, parent: nil, rowspan: nil, colspan: nil, classes: [], html_attributes: {})
17
17
  @text = text
18
18
  @numeric = numeric
19
19
  @width = width
20
+ @scope = scope
21
+ @parent = parent
22
+ @colspan = colspan
23
+ @rowspan = rowspan
24
+ @header = (header.nil?) ? in_thead? : header
20
25
 
21
26
  super(classes: classes, html_attributes: html_attributes)
22
27
  end
@@ -36,22 +41,61 @@ private
36
41
  end
37
42
 
38
43
  def cell_element
39
- header ? :th : :td
44
+ if in_thead? || header?
45
+ 'th'
46
+ else
47
+ 'td'
48
+ end
40
49
  end
41
50
 
42
51
  def default_attributes
43
- { class: default_classes }
52
+ { class: default_classes, scope: determine_scope, colspan: colspan, rowspan: rowspan }.compact
53
+ end
54
+
55
+ def determine_scope
56
+ conditions = { scope: scope, parent: parent, header: header, auto_table_scopes: config.enable_auto_table_scopes }
57
+
58
+ case conditions
59
+ in { scope: String }
60
+ scope
61
+ in { scope: false } | { header: false } | { auto_table_scopes: false }
62
+ nil
63
+ in { auto_table_scopes: true, parent: 'thead' }
64
+ 'col'
65
+ in { auto_table_scopes: true, parent: 'tbody' } | { auto_table_scopes: true, parent: 'tfoot' }
66
+ 'row'
67
+ else
68
+ nil
69
+ end
44
70
  end
45
71
 
46
72
  def default_classes
47
- if header
48
- class_names("govuk-table__header", "govuk-table__header--numeric" => numeric?, width_class => width?).split
73
+ class_names(
74
+ "govuk-table__#{class_suffix}",
75
+ "govuk-table__#{class_suffix}--numeric" => numeric?,
76
+ width => width?,
77
+ )
78
+ end
79
+
80
+ def class_suffix
81
+ if in_thead? || (in_tbody? && header?)
82
+ "header"
83
+ elsif in_tfoot?
84
+ "footer"
49
85
  else
50
- class_names("govuk-table__cell", "govuk-table__cell--numeric" => numeric?, width_class => width?).split
86
+ "cell"
51
87
  end
52
88
  end
53
89
 
54
- def width_class
55
- WIDTHS.fetch(width, nil)
90
+ def in_thead?
91
+ parent == "thead"
92
+ end
93
+
94
+ def in_tfoot?
95
+ parent == "tfoot"
96
+ end
97
+
98
+ def in_tbody?
99
+ parent == "tbody"
56
100
  end
57
101
  end
@@ -0,0 +1,45 @@
1
+ class GovukComponent::TableComponent::ColGroupComponent < GovukComponent::Base
2
+ renders_many :cols, "ColComponent"
3
+
4
+ def initialize(classes: [], cols: [], html_attributes: {})
5
+ super(classes: classes, html_attributes: html_attributes)
6
+
7
+ return if cols.blank?
8
+
9
+ cols.each { |c| with_col(span: c) }
10
+ end
11
+
12
+ def call
13
+ tag.colgroup(**html_attributes) { safe_join(cols) }
14
+ end
15
+
16
+ def render?
17
+ cols.any?
18
+ end
19
+
20
+ private
21
+
22
+ def default_attributes
23
+ {}
24
+ end
25
+
26
+ class ColComponent < GovukComponent::Base
27
+ attr_reader :span
28
+
29
+ def initialize(span: 1, classes: [], html_attributes: {})
30
+ @span = span.to_s
31
+
32
+ super(classes: classes, html_attributes: html_attributes)
33
+ end
34
+
35
+ def call
36
+ tag.col(span: span, **html_attributes)
37
+ end
38
+
39
+ private
40
+
41
+ def default_attributes
42
+ {}
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ class GovukComponent::TableComponent::FootComponent < GovukComponent::Base
2
+ renders_many :rows, ->(cell_data: nil, first_cell_is_header: false, classes: [], html_attributes: {}, &block) do
3
+ GovukComponent::TableComponent::RowComponent.from_foot(
4
+ cell_data: cell_data,
5
+ first_cell_is_header: first_cell_is_header,
6
+ classes: classes,
7
+ html_attributes: html_attributes,
8
+ &block
9
+ )
10
+ end
11
+
12
+ attr_reader :first_cell_is_header, :row_data
13
+
14
+ def initialize(rows: nil, first_cell_is_header: false, classes: [], html_attributes: {})
15
+ @rows = rows
16
+ @first_cell_is_header = first_cell_is_header
17
+
18
+ super(classes: classes, html_attributes: html_attributes)
19
+
20
+ return unless rows.presence
21
+
22
+ build_rows_from_row_data(rows)
23
+ end
24
+
25
+ def call
26
+ tag.tfoot(**html_attributes) { safe_join(rows) }
27
+ end
28
+
29
+ def render?
30
+ rows.any?
31
+ end
32
+
33
+ private
34
+
35
+ def build_rows_from_row_data(data)
36
+ return if data.blank?
37
+
38
+ with_row(cell_data: data, first_cell_is_header: first_cell_is_header)
39
+ end
40
+
41
+ def default_attributes
42
+ { class: %w(govuk-table__foot) }
43
+ end
44
+ end
@@ -1,5 +1,12 @@
1
1
  class GovukComponent::TableComponent::HeadComponent < GovukComponent::Base
2
- renders_many :rows, "GovukComponent::TableComponent::RowComponent"
2
+ renders_many :rows, ->(cell_data: nil, classes: [], html_attributes: {}, &block) do
3
+ GovukComponent::TableComponent::RowComponent.from_head(
4
+ cell_data: cell_data,
5
+ classes: classes,
6
+ html_attributes: html_attributes,
7
+ &block
8
+ )
9
+ end
3
10
 
4
11
  attr_reader :row_data
5
12
 
@@ -9,12 +16,16 @@ class GovukComponent::TableComponent::HeadComponent < GovukComponent::Base
9
16
  build_rows_from_row_data(rows)
10
17
  end
11
18
 
19
+ def call
20
+ tag.thead(**html_attributes) { safe_join(rows) }
21
+ end
22
+
12
23
  private
13
24
 
14
25
  def build_rows_from_row_data(data)
15
26
  return if data.blank?
16
27
 
17
- data.each { |d| row(cell_data: d, header: true) }
28
+ data.each { |d| with_row(cell_data: d) }
18
29
  end
19
30
 
20
31
  def default_attributes
@@ -1,30 +1,77 @@
1
1
  class GovukComponent::TableComponent::RowComponent < GovukComponent::Base
2
- renders_many :cells, "GovukComponent::TableComponent::CellComponent"
2
+ renders_many :cells, ->(scope: nil, header: nil, text: nil, numeric: false, width: nil, rowspan: nil, colspan: nil, classes: [], html_attributes: {}, &block) do
3
+ GovukComponent::TableComponent::CellComponent.new(
4
+ scope: scope,
5
+ header: header,
6
+ text: text,
7
+ numeric: numeric,
8
+ width: width,
9
+ parent: parent,
10
+ rowspan: rowspan,
11
+ colspan: colspan,
12
+ classes: classes,
13
+ html_attributes: html_attributes,
14
+ &block
15
+ )
16
+ end
3
17
 
4
- attr_reader :header, :first_cell_is_header
18
+ attr_reader :first_cell_is_header, :parent
5
19
 
6
- def initialize(cell_data: nil, first_cell_is_header: false, header: false, classes: [], html_attributes: {})
7
- @header = header
20
+ def initialize(cell_data: nil, first_cell_is_header: false, parent: nil, classes: [], html_attributes: {})
8
21
  @first_cell_is_header = first_cell_is_header
22
+ @parent = parent
9
23
 
10
24
  super(classes: classes, html_attributes: html_attributes)
11
25
 
12
26
  build_cells_from_cell_data(cell_data)
13
27
  end
14
28
 
29
+ def self.from_head(*args, **kwargs, &block)
30
+ new(*args, parent: 'thead', **kwargs, &block)
31
+ end
32
+
33
+ def self.from_body(*args, **kwargs, &block)
34
+ new(*args, parent: 'tbody', **kwargs, &block)
35
+ end
36
+
37
+ def self.from_foot(*args, **kwargs, &block)
38
+ new(*args, parent: 'tfoot', **kwargs, &block)
39
+ end
40
+
41
+ def call
42
+ tag.tr(**html_attributes) { safe_join(cells) }
43
+ end
44
+
15
45
  private
16
46
 
17
47
  def build_cells_from_cell_data(cell_data)
18
48
  return if cell_data.blank?
19
49
 
20
- cell_data.map.with_index { |cd, i| cell(header: cell_is_header?(i), text: cd) }
50
+ cell_data.each_with_index do |data, i|
51
+ case data
52
+ when Hash
53
+ with_cell(**data, **cell_attributes(i))
54
+ when String
55
+ with_cell(text: data, **cell_attributes(i))
56
+ end
57
+ end
58
+ end
59
+
60
+ def cell_attributes(count)
61
+ cell_is_header?(count).then do |cell_is_header|
62
+ { header: cell_is_header }
63
+ end
21
64
  end
22
65
 
23
66
  def cell_is_header?(count)
24
- header || (first_cell_is_header && count.zero?)
67
+ in_thead? || (first_cell_is_header && count.zero?)
25
68
  end
26
69
 
27
70
  def default_attributes
28
71
  { class: %w(govuk-table__row) }
29
72
  end
73
+
74
+ def in_thead?
75
+ parent == "thead"
76
+ end
30
77
  end
@@ -1,12 +1,15 @@
1
1
  module GovukComponent
2
2
  class TableComponent < GovukComponent::Base
3
3
  renders_one :caption, "GovukComponent::TableComponent::CaptionComponent"
4
+ renders_many :cols, "GovukComponent::TableComponent::ColGroupComponent::ColComponent"
5
+ renders_many :colgroups, "GovukComponent::TableComponent::ColGroupComponent"
4
6
  renders_one :head, "GovukComponent::TableComponent::HeadComponent"
5
7
  renders_many :bodies, "GovukComponent::TableComponent::BodyComponent"
8
+ renders_one :foot, "GovukComponent::TableComponent::FootComponent"
6
9
 
7
10
  attr_accessor :id, :first_cell_is_header, :caption_text
8
11
 
9
- def initialize(id: nil, rows: nil, head: nil, caption: nil, first_cell_is_header: false, classes: [], html_attributes: {})
12
+ def initialize(id: nil, rows: nil, head: nil, foot: nil, caption: nil, first_cell_is_header: false, classes: [], html_attributes: {})
10
13
  @id = id
11
14
  @first_cell_is_header = first_cell_is_header
12
15
  @caption_text = caption
@@ -17,15 +20,20 @@ module GovukComponent
17
20
  return unless rows.presence
18
21
 
19
22
  # if no head is passed in,use the first row for headers
20
- build(*(head ? [head, rows] : [rows[0], rows[1..]]), caption_text)
23
+ build(*(head ? [head, rows] : [rows[0], rows[1..]]), foot, caption_text)
24
+ end
25
+
26
+ def call
27
+ tag.table(**html_attributes) { safe_join([caption, colgroups, head, bodies, foot]) }
21
28
  end
22
29
 
23
30
  private
24
31
 
25
- def build(head_data, body_data, caption_text)
26
- caption(text: caption_text)
27
- head(rows: [head_data])
28
- body(rows: body_data, first_cell_is_header: first_cell_is_header)
32
+ def build(head_data, body_data, foot_data, caption_text)
33
+ with_caption(text: caption_text)
34
+ with_head(rows: [head_data])
35
+ with_body(rows: body_data, first_cell_is_header: first_cell_is_header)
36
+ with_foot(rows: foot_data, first_cell_is_header: first_cell_is_header)
29
37
  end
30
38
 
31
39
  def default_attributes
@@ -15,6 +15,7 @@ module GovukComponentsHelper
15
15
  govuk_section_break: 'GovukComponent::SectionBreakComponent',
16
16
  govuk_start_button: 'GovukComponent::StartButtonComponent',
17
17
  govuk_summary_list: 'GovukComponent::SummaryListComponent',
18
+ govuk_summary_card: 'GovukComponent::SummaryListComponent::CardComponent',
18
19
  govuk_table: 'GovukComponent::TableComponent',
19
20
  govuk_tabs: 'GovukComponent::TabComponent',
20
21
  govuk_tag: 'GovukComponent::TagComponent',
@@ -1,4 +1,8 @@
1
+ require "html_attributes_utils"
2
+
1
3
  module GovukLinkHelper
4
+ using HTMLAttributesUtils
5
+
2
6
  LINK_STYLES = {
3
7
  inverse: "govuk-link--inverse",
4
8
  muted: "govuk-link--muted",
@@ -88,17 +92,16 @@ module GovukLinkHelper
88
92
  private
89
93
 
90
94
  def build_html_options(provided_options, style: :link)
91
- styles = case style
92
- when :link then LINK_STYLES
93
- when :button then BUTTON_STYLES
94
- else {}
95
- end
95
+ element_styles = { link: LINK_STYLES, button: BUTTON_STYLES }.fetch(style, {})
96
+
97
+ # we need to take a couple of extra steps here because we don't want the style
98
+ # params (inverse, muted, etc) to end up as extra attributes on the link.
96
99
 
97
- remaining_options = provided_options&.slice!(*styles.keys)
100
+ remaining_options = remove_styles_from_provided_options(element_styles, provided_options)
98
101
 
99
- return {} unless (style_classes = build_style_classes(style, provided_options))
102
+ style_classes = build_style_classes(style, extract_styles_from_provided_options(element_styles, provided_options))
100
103
 
101
- inject_class(remaining_options, class_name: style_classes)
104
+ combine_attributes(remaining_options, class_name: style_classes)
102
105
  end
103
106
 
104
107
  def build_style_classes(style, provided_options)
@@ -111,13 +114,25 @@ private
111
114
  end
112
115
  end
113
116
 
114
- def inject_class(attributes, class_name:)
117
+ def combine_attributes(attributes, class_name:)
115
118
  attributes ||= {}
116
119
 
117
120
  attributes.with_indifferent_access.tap do |attrs|
118
121
  attrs[:class] = Array.wrap(attrs[:class]).prepend(class_name).flatten.join(" ")
119
122
  end
120
123
  end
124
+
125
+ def extract_styles_from_provided_options(styles, provided_options)
126
+ return {} if provided_options.blank?
127
+
128
+ provided_options.slice(*styles.keys)
129
+ end
130
+
131
+ def remove_styles_from_provided_options(styles, provided_options)
132
+ return {} if provided_options.blank?
133
+
134
+ provided_options&.except(*styles.keys)
135
+ end
121
136
  end
122
137
 
123
138
  ActiveSupport.on_load(:action_view) { include GovukLinkHelper }
@@ -64,6 +64,7 @@ module Govuk
64
64
  # +:default_warning_text_icon+ "!"
65
65
  #
66
66
  # +:require_summary_list_action_visually_hidden_text+ when true forces visually hidden text to be set for every action. It can still be explicitly skipped by passing in +nil+. Defaults to +false+
67
+ # +:enable_auto_table_scopes+ automatically adds a scope of 'col' to th elements in thead and 'row' to th elements in tbody.
67
68
  DEFAULTS = {
68
69
  default_back_link_text: 'Back',
69
70
  default_breadcrumbs_collapse_on_mobile: false,
@@ -96,7 +97,10 @@ module Govuk
96
97
  default_warning_text_icon_fallback_text: "Warning",
97
98
  default_warning_text_icon: "!",
98
99
 
100
+ default_link_new_tab_text: "(opens in new tab)",
101
+
99
102
  require_summary_list_action_visually_hidden_text: false,
103
+ enable_auto_table_scopes: true,
100
104
  }.freeze
101
105
 
102
106
  DEFAULTS.each_key { |k| config_accessor(k) { DEFAULTS[k] } }
@@ -1,5 +1,5 @@
1
1
  module Govuk
2
2
  module Components
3
- VERSION = '3.3.0'.freeze
3
+ VERSION = '4.0.0a2'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk-components
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 4.0.0a2
5
5
  platform: ruby
6
6
  authors:
7
7
  - DfE developers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-16 00:00:00.000000000 Z
11
+ date: 2023-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: html-attributes-utils
@@ -16,48 +16,48 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.9'
19
+ version: 1.0.0
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.9.2
22
+ version: 1.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '0.9'
29
+ version: 1.0.0
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.9.2
32
+ version: 1.0.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: pagy
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 5.10.1
39
+ version: '6.0'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 5.10.1
46
+ version: '6.0'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: view_component
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 2.74.1
53
+ version: 3.0.0rc1
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 2.74.1
60
+ version: 3.0.0rc1
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: deep_merge
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -120,14 +120,14 @@ dependencies:
120
120
  requirements:
121
121
  - - '='
122
122
  - !ruby/object:Gem::Version
123
- version: 4.0.0
123
+ version: 4.9.0
124
124
  type: :development
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - '='
129
129
  - !ruby/object:Gem::Version
130
- version: 4.0.0
130
+ version: 4.9.0
131
131
  - !ruby/object:Gem::Dependency
132
132
  name: sassc-rails
133
133
  requirement: !ruby/object:Gem::Requirement
@@ -204,14 +204,14 @@ dependencies:
204
204
  requirements:
205
205
  - - "~>"
206
206
  - !ruby/object:Gem::Version
207
- version: 3.5.1
207
+ version: 3.6.0
208
208
  type: :development
209
209
  prerelease: false
210
210
  version_requirements: !ruby/object:Gem::Requirement
211
211
  requirements:
212
212
  - - "~>"
213
213
  - !ruby/object:Gem::Version
214
- version: 3.5.1
214
+ version: 3.6.0
215
215
  - !ruby/object:Gem::Dependency
216
216
  name: rouge
217
217
  requirement: !ruby/object:Gem::Requirement
@@ -288,28 +288,28 @@ dependencies:
288
288
  requirements:
289
289
  - - "~>"
290
290
  - !ruby/object:Gem::Version
291
- version: 0.22.0
291
+ version: 0.24.0
292
292
  type: :development
293
293
  prerelease: false
294
294
  version_requirements: !ruby/object:Gem::Requirement
295
295
  requirements:
296
296
  - - "~>"
297
297
  - !ruby/object:Gem::Version
298
- version: 0.22.0
298
+ version: 0.24.0
299
299
  - !ruby/object:Gem::Dependency
300
300
  name: webrick
301
301
  requirement: !ruby/object:Gem::Requirement
302
302
  requirements:
303
303
  - - "~>"
304
304
  - !ruby/object:Gem::Version
305
- version: 1.7.0
305
+ version: 1.8.1
306
306
  type: :development
307
307
  prerelease: false
308
308
  version_requirements: !ruby/object:Gem::Requirement
309
309
  requirements:
310
310
  - - "~>"
311
311
  - !ruby/object:Gem::Version
312
- version: 1.7.0
312
+ version: 1.8.1
313
313
  description: A collection of components intended to ease the building of GOV.UK Design
314
314
  System web applications
315
315
  email:
@@ -349,23 +349,22 @@ files:
349
349
  - app/components/govuk_component/phase_banner_component.rb
350
350
  - app/components/govuk_component/section_break_component.rb
351
351
  - app/components/govuk_component/start_button_component.rb
352
- - app/components/govuk_component/summary_list_component.html.erb
353
352
  - app/components/govuk_component/summary_list_component.rb
354
353
  - app/components/govuk_component/summary_list_component/action_component.rb
354
+ - app/components/govuk_component/summary_list_component/card_component.html.erb
355
+ - app/components/govuk_component/summary_list_component/card_component.rb
355
356
  - app/components/govuk_component/summary_list_component/key_component.rb
356
357
  - app/components/govuk_component/summary_list_component/row_component.rb
357
358
  - app/components/govuk_component/summary_list_component/value_component.rb
358
359
  - app/components/govuk_component/tab_component.html.erb
359
360
  - app/components/govuk_component/tab_component.rb
360
- - app/components/govuk_component/table_component.html.erb
361
361
  - app/components/govuk_component/table_component.rb
362
- - app/components/govuk_component/table_component/body_component.html.erb
363
362
  - app/components/govuk_component/table_component/body_component.rb
364
363
  - app/components/govuk_component/table_component/caption_component.rb
365
364
  - app/components/govuk_component/table_component/cell_component.rb
366
- - app/components/govuk_component/table_component/head_component.html.erb
365
+ - app/components/govuk_component/table_component/col_group_component.rb
366
+ - app/components/govuk_component/table_component/foot_component.rb
367
367
  - app/components/govuk_component/table_component/head_component.rb
368
- - app/components/govuk_component/table_component/row_component.html.erb
369
368
  - app/components/govuk_component/table_component/row_component.rb
370
369
  - app/components/govuk_component/tag_component.rb
371
370
  - app/components/govuk_component/traits.rb
@@ -385,7 +384,7 @@ homepage: https://github.com/DFE-Digital/govuk-components
385
384
  licenses:
386
385
  - MIT
387
386
  metadata: {}
388
- post_install_message:
387
+ post_install_message:
389
388
  rdoc_options: []
390
389
  require_paths:
391
390
  - lib
@@ -396,12 +395,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
396
395
  version: '0'
397
396
  required_rubygems_version: !ruby/object:Gem::Requirement
398
397
  requirements:
399
- - - ">="
398
+ - - ">"
400
399
  - !ruby/object:Gem::Version
401
- version: '0'
400
+ version: 1.3.1
402
401
  requirements: []
403
- rubygems_version: 3.1.6
404
- signing_key:
402
+ rubygems_version: 3.2.33
403
+ signing_key:
405
404
  specification_version: 4
406
405
  summary: Lightweight set of reusable GOV.UK Design System components
407
406
  test_files: []
@@ -1,5 +0,0 @@
1
- <%= tag.dl(**html_attributes) do %>
2
- <% rows.each do |row| %>
3
- <%= row %>
4
- <% end %>
5
- <% end %>
@@ -1,5 +0,0 @@
1
- <%= tag.tbody(**html_attributes) do %>
2
- <% rows.each do |row| %>
3
- <%= row %>
4
- <% end %>
5
- <% end %>
@@ -1,5 +0,0 @@
1
- <%= tag.thead(**html_attributes) do %>
2
- <% rows.each do |row| %>
3
- <%= row %>
4
- <% end %>
5
- <% end %>
@@ -1,5 +0,0 @@
1
- <%= tag.tr(**html_attributes) do %>
2
- <% cells.each do |cell| %>
3
- <%= cell %>
4
- <% end %>
5
- <% end %>
@@ -1,7 +0,0 @@
1
- <%= tag.table(**html_attributes) do %>
2
- <%= caption %>
3
- <%= head %>
4
- <% bodies.each do |body| %>
5
- <%= body %>
6
- <% end %>
7
- <% end %>