ccs-frontend_helpers 0.1.0.rc.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.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/.rubocop.yml +127 -0
  4. data/CHANGELOG.md +44 -0
  5. data/Gemfile +10 -0
  6. data/Gemfile.lock +241 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +102 -0
  9. data/Rakefile +10 -0
  10. data/ccs-frontend_helpers.gemspec +47 -0
  11. data/lib/ccs/frontend_helpers/ccs_frontend/dashboard_panels.rb +79 -0
  12. data/lib/ccs/frontend_helpers/ccs_frontend/footer.rb +141 -0
  13. data/lib/ccs/frontend_helpers/ccs_frontend/header.rb +205 -0
  14. data/lib/ccs/frontend_helpers/ccs_frontend/logo.rb +49 -0
  15. data/lib/ccs/frontend_helpers/ccs_frontend.rb +20 -0
  16. data/lib/ccs/frontend_helpers/govuk_frontend/accordion.rb +115 -0
  17. data/lib/ccs/frontend_helpers/govuk_frontend/back_link.rb +39 -0
  18. data/lib/ccs/frontend_helpers/govuk_frontend/breadcrumbs.rb +76 -0
  19. data/lib/ccs/frontend_helpers/govuk_frontend/button.rb +127 -0
  20. data/lib/ccs/frontend_helpers/govuk_frontend/cookie_banner.rb +136 -0
  21. data/lib/ccs/frontend_helpers/govuk_frontend/details.rb +46 -0
  22. data/lib/ccs/frontend_helpers/govuk_frontend/error_message.rb +67 -0
  23. data/lib/ccs/frontend_helpers/govuk_frontend/error_summary.rb +100 -0
  24. data/lib/ccs/frontend_helpers/govuk_frontend/field/character_count.rb +165 -0
  25. data/lib/ccs/frontend_helpers/govuk_frontend/field/checkboxes.rb +200 -0
  26. data/lib/ccs/frontend_helpers/govuk_frontend/field/date_input.rb +153 -0
  27. data/lib/ccs/frontend_helpers/govuk_frontend/field/file_upload.rb +83 -0
  28. data/lib/ccs/frontend_helpers/govuk_frontend/field/input.rb +153 -0
  29. data/lib/ccs/frontend_helpers/govuk_frontend/field/radios.rb +201 -0
  30. data/lib/ccs/frontend_helpers/govuk_frontend/field/select.rb +124 -0
  31. data/lib/ccs/frontend_helpers/govuk_frontend/field/textarea.rb +106 -0
  32. data/lib/ccs/frontend_helpers/govuk_frontend/field.rb +213 -0
  33. data/lib/ccs/frontend_helpers/govuk_frontend/fieldset.rb +71 -0
  34. data/lib/ccs/frontend_helpers/govuk_frontend/footer.rb +183 -0
  35. data/lib/ccs/frontend_helpers/govuk_frontend/form_group.rb +50 -0
  36. data/lib/ccs/frontend_helpers/govuk_frontend/header.rb +161 -0
  37. data/lib/ccs/frontend_helpers/govuk_frontend/hint.rb +38 -0
  38. data/lib/ccs/frontend_helpers/govuk_frontend/inset_text.rb +44 -0
  39. data/lib/ccs/frontend_helpers/govuk_frontend/label.rb +92 -0
  40. data/lib/ccs/frontend_helpers/govuk_frontend/notification_banner.rb +136 -0
  41. data/lib/ccs/frontend_helpers/govuk_frontend/pagination.rb +336 -0
  42. data/lib/ccs/frontend_helpers/govuk_frontend/panel.rb +51 -0
  43. data/lib/ccs/frontend_helpers/govuk_frontend/phase_banner.rb +49 -0
  44. data/lib/ccs/frontend_helpers/govuk_frontend/skip_link.rb +40 -0
  45. data/lib/ccs/frontend_helpers/govuk_frontend/step_by_step_navigation.rb +215 -0
  46. data/lib/ccs/frontend_helpers/govuk_frontend/summary_list.rb +226 -0
  47. data/lib/ccs/frontend_helpers/govuk_frontend/table.rb +124 -0
  48. data/lib/ccs/frontend_helpers/govuk_frontend/tabs.rb +95 -0
  49. data/lib/ccs/frontend_helpers/govuk_frontend/tag.rb +42 -0
  50. data/lib/ccs/frontend_helpers/govuk_frontend/warning_text.rb +53 -0
  51. data/lib/ccs/frontend_helpers/govuk_frontend.rb +82 -0
  52. data/lib/ccs/frontend_helpers/shared_methods.rb +27 -0
  53. data/lib/ccs/frontend_helpers/version.rb +7 -0
  54. data/lib/ccs/frontend_helpers.rb +20 -0
  55. data/sig/ccs/frontend_helpers.rbs +6 -0
  56. metadata +241 -0
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'logo'
4
+ require_relative '../shared_methods'
5
+
6
+ module CCS
7
+ module FrontendHelpers
8
+ module CCSFrontend
9
+ # = CCS Footer
10
+ #
11
+ # This helper is used for generating the footer component from the
12
+ # {https://github.com/tim-s-ccs/ts-ccs-frontend/tree/main/src/ccs/components/footer CCS - Components - Footer}
13
+
14
+ module Footer
15
+ include SharedMethods
16
+ include Logo
17
+ include ActionView::Helpers::FormTagHelper
18
+ include ActionView::Helpers::UrlHelper
19
+
20
+ # rubocop:disable Metrics/AbcSize
21
+
22
+ # Generates the HTML for the CCS Footer component
23
+ #
24
+ # @param ccs_footer_options [Hash] options that will be used in customising the HTML
25
+ #
26
+ # @option ccs_footer_options [String] :classes additional CSS classes for the footer HTML
27
+ # @option ccs_footer_options [String] :container_class classes that can be added to the inner container
28
+ # @option ccs_footer_options [Array] :navigation (see: {ccs_footer_navigation})
29
+ # @option ccs_footer_options [Hash] :meta (see: {ccs_footer_meta})
30
+ # @option ccs_footer_options [ActiveSupport::SafeBuffer,String] :copyright The copyright information. See {ccs_footer_copyright}
31
+ # @option ccs_footer_options [Hash] :attributes additional attributes that will added as part of the HTML
32
+ #
33
+ # @return [ActiveSupport::SafeBuffer] the HTML for the CCS Footer
34
+ # which can then be rendered on the page
35
+
36
+ def ccs_footer(**ccs_footer_options)
37
+ initialise_attributes_and_set_classes(ccs_footer_options, 'ccs-footer')
38
+
39
+ ccs_footer_options[:attributes][:role] = 'contentinfo'
40
+
41
+ tag.footer(**ccs_footer_options[:attributes]) do
42
+ tag.div(class: "govuk-width-container #{ccs_footer_options[:container_classes]}".rstrip) do
43
+ if ccs_footer_options[:navigation]
44
+ concat(tag.div(class: 'ccs-footer__navigation') do
45
+ ccs_footer_options[:navigation].each { |navigation_item| concat(ccs_footer_navigation(navigation_item)) }
46
+ end)
47
+ concat(tag.hr(class: 'ccs-footer__section-break'))
48
+ end
49
+ concat(tag.div(class: 'ccs-footer__meta') do
50
+ concat(tag.div(class: 'ccs-footer__meta-item') do
51
+ concat(tag.div(ccs_logo, class: 'ccs-footer__logo'))
52
+ concat(ccs_footer_copyright(ccs_footer_options[:copyright]))
53
+ end)
54
+ concat(tag.div(class: 'ccs-footer__meta-item ccs-footer__meta-item--grow') do
55
+ concat(ccs_footer_meta(ccs_footer_options[:meta])) if ccs_footer_options[:meta]
56
+ end)
57
+ end)
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ # Generates the HTML for the navigation section in {ccs_footer}
65
+ #
66
+ # @param navigation_item [Hash] options that will be used for the navigation section
67
+ #
68
+ # @option navigation_item [String] :title title for a section
69
+ # @option navigation_item [String] :width (default: 'fall') width of each navigation section in the footer
70
+ # @option navigation_item [Integer] :columns amount of columns to display items in navigation section of the footer
71
+ # @option navigation_item [Array] :items array of items to display in the list in navigation section of the footer.
72
+ # Each item can have the following options:
73
+ # - +:text+ list item text
74
+ # - +:href+ list item href
75
+ # - +:attributes+ HTML attributes to add to the link
76
+ #
77
+ # @return [ActiveSupport::SafeBuffer] the HTML for the navigation section in {ccs_footer}
78
+
79
+ def ccs_footer_navigation(navigation_item)
80
+ tag.div(class: "ccs-footer__section govuk-grid-column-#{navigation_item[:width] || 'full'}") do
81
+ concat(tag.h2(navigation_item[:title], class: 'ccs-footer__heading govuk-heading-m'))
82
+ concat(tag.ul(class: "ccs-footer__list #{"ccs-footer__list--columns-#{navigation_item[:columns]}" if navigation_item[:columns]}".rstrip) do
83
+ navigation_item[:items].each do |item|
84
+ concat(tag.li(class: 'ccs-footer__list-item') do
85
+ (item[:attributes] ||= {})[:class] = 'ccs-footer__link'
86
+
87
+ link_to(item[:text], item[:href], **item[:attributes])
88
+ end)
89
+ end
90
+ end)
91
+ end
92
+ end
93
+
94
+ # Generates the HTML for the meta section in {ccs_footer}
95
+ #
96
+ # @param meta [Hash] options that will be used for the meta section
97
+ #
98
+ # @option meta [String] :visually_hidden_title (default: 'Support links') title for a meta item section
99
+ # @option meta [ActiveSupport::SafeBuffer,String] :text text to add to the meta section of the footer,
100
+ # which will appear below any links specified using meta.items
101
+ # @option meta [Array] :items array of items to display in the list in meta section of the footer.
102
+ # Each item can have the following options:
103
+ # - +:text+ list item text
104
+ # - +:href+ list item href
105
+ # - +:attributes+ HTML attributes to add to the link
106
+ #
107
+ # @return [ActiveSupport::SafeBuffer] the HTML for the meta section in {ccs_footer}
108
+
109
+ def ccs_footer_meta(meta)
110
+ concat(tag.h2(meta[:visually_hidden_title] || 'Support links', class: 'govuk-visually-hidden'))
111
+ if meta[:items]
112
+ concat(tag.ul(class: 'ccs-footer__inline-list') do
113
+ meta[:items].each do |meta_item|
114
+ concat(tag.li(class: 'ccs-footer__inline-list-item') do
115
+ (meta_item[:attributes] ||= {})[:class] = 'ccs-footer__link'
116
+
117
+ link_to(meta_item[:text], meta_item[:href], **meta_item[:attributes])
118
+ end)
119
+ end
120
+ end)
121
+ end
122
+ concat(tag.div(meta[:text], class: 'ccs-footer__meta-custom')) if meta[:text]
123
+ end
124
+
125
+ # rubocop:enable Metrics/AbcSize
126
+
127
+ # Generates the copyright used in {ccs_footer}
128
+ #
129
+ # @param copyright [ActiveSupport::SafeBuffer,String] the copyright information, this defaults to Crown Copyright
130
+ #
131
+ # @return [ActiveSupport::SafeBuffer] the HTML for the copyright used in {ccs_footer}
132
+
133
+ def ccs_footer_copyright(copyright)
134
+ tag.div(class: 'ccs-footer__copyright') do
135
+ link_to(copyright || '© Crown copyright', 'https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/', class: 'ccs-footer__link')
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,205 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'logo'
4
+ require_relative '../shared_methods'
5
+
6
+ module CCS
7
+ module FrontendHelpers
8
+ module CCSFrontend
9
+ # = CCS Header
10
+ #
11
+ # This helper is used for generating the header component from the
12
+ # {https://github.com/tim-s-ccs/ts-ccs-frontend/tree/main/src/ccs/components/header CCS - Components - Header}
13
+
14
+ module Header
15
+ include SharedMethods
16
+ include Logo
17
+ include ActionView::Helpers::FormTagHelper
18
+ include ActionView::Helpers::UrlHelper
19
+
20
+ # rubocop:disable Metrics/AbcSize
21
+
22
+ # Generates the HTML for the CCS Header component
23
+ #
24
+ # @param ccs_header_options [Hash] options that will be used to generate the header
25
+ #
26
+ # @option ccs_header_options [String] :classes additional CSS classes for the header HTML
27
+ # @option ccs_header_options [Hash] :attributes additional attributes that will added as part of the header HTML
28
+ # @option ccs_header_options [String] :container_classes classes for the container
29
+ # @option ccs_header_options [String] :homepage_url URL of the homepage. Defaults to +https://www.crowncommercial.gov.uk+
30
+ # @option ccs_header_options [Array] :service_authentication see {ccs_service_authentication}
31
+ # @option ccs_header_options [Hash] :service see {ccs_header_service_name}
32
+ # @option ccs_header_options [Hash] :navigation see {ccs_header_navigation}
33
+ # @option ccs_header_options [Hash] :menu_button see {ccs_header_navigation}
34
+ #
35
+ # @return [ActiveSupport::SafeBuffer] the HTML for the CCS Header
36
+ # which can then be rendered on the page
37
+
38
+ def ccs_header(**ccs_header_options)
39
+ determine_ccs_header_attributes(ccs_header_options)
40
+
41
+ tag.header(**ccs_header_options[:attributes]) do
42
+ concat(ccs_service_authentication(ccs_header_options[:service_authentication], ccs_header_options[:container_classes])) if ccs_header_options[:service_authentication]
43
+ concat(tag.div(class: "ccs-header__container #{ccs_header_options[:container_classes]}") do
44
+ concat(ccs_header_logo(**ccs_header_options))
45
+ if ccs_header_options[:service] || ccs_header_options[:navigation]
46
+ concat(tag.div(class: 'ccs-header__content') do
47
+ concat(ccs_header_service_name(ccs_header_options[:service])) if ccs_header_options[:service]
48
+ concat(ccs_header_navigation(ccs_header_options[:navigation], ccs_header_options[:menu_button], ccs_header_options[:service])) if ccs_header_options[:navigation]
49
+ end)
50
+ end
51
+ end)
52
+ end
53
+ end
54
+
55
+ # rubocop:enable Metrics/AbcSize
56
+
57
+ private
58
+
59
+ # Generates the service authentication section for {ccs_header}
60
+ #
61
+ # @param service_authentication [Array] array of service authentication items (see {ccs_header_navigation_item})
62
+ # @param container_classes [String] classes for the container
63
+ #
64
+ # @return [ActiveSupport::SafeBuffer] the HTML for the service authentication section which is used in {ccs_header}
65
+
66
+ def ccs_service_authentication(service_authentication, container_classes)
67
+ tag.div(class: 'ccs-header__service-authentication') do
68
+ tag.div(class: "ccs-header__service-authentication-container #{container_classes}") do
69
+ tag.ul(class: 'ccs-header__service-authentication-list') do
70
+ service_authentication.each do |service_authentication_item|
71
+ concat(tag.li(class: 'ccs-header__service-authentication-item') do
72
+ if service_authentication_item[:href]
73
+ (service_authentication_item[:attributes] ||= {})[:class] = 'ccs-header__link'
74
+
75
+ link_to(service_authentication_item[:text], service_authentication_item[:href], **service_authentication_item[:attributes])
76
+ else
77
+ service_authentication_item[:text]
78
+ end
79
+ end)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ # Generates the logo for {ccs_header}
87
+ #
88
+ # @param (see ccs_header)
89
+ #
90
+ # @option (see ccs_header)
91
+ #
92
+ # @return [ActiveSupport::SafeBuffer] the HTML for the logo used in {ccs_header}
93
+
94
+ def ccs_header_logo(ccs_header_options)
95
+ tag.div(class: 'ccs-header__logo') do
96
+ link_to(ccs_logo, ccs_header_options[:homepage_url] || 'https://www.crowncommercial.gov.uk', class: 'ccs-header__link ccs-header__link--homepage', aria: { label: 'Crown Commercial Service' })
97
+ end
98
+ end
99
+
100
+ # Generates the service name section for {ccs_header}
101
+ #
102
+ # @param service [Hash] options that will be used in the service name section
103
+ #
104
+ # @option service [String] :name the name of the service, included in the header
105
+ # @option service [String] :href URL for the service name anchor
106
+ #
107
+ # @return [ActiveSupport::SafeBuffer] the HTML for the service name section which is used in {ccs_header}
108
+
109
+ def ccs_header_service_name(service)
110
+ if service[:href]
111
+ link_to(service[:name], service[:href], class: 'ccs-header__link ccs-header__link--service-name')
112
+ else
113
+ tag.span(service[:name], class: 'ccs-header__link--service-name')
114
+ end
115
+ end
116
+
117
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
118
+
119
+ # @option ccs_header_options [String] :navigation_label text for the aria-label attribute of the navigation.
120
+ # Defaults to the same value as +:text+ in +:menu_button+
121
+ # @option ccs_header_options [String] :navigation_classes classes for the navigation section of the header
122
+
123
+ # Generates the navigation section for {ccs_header}
124
+ #
125
+ # @param navigation [Hash] options for the navigation
126
+ # @param menu_button [Hash] options for the menu button
127
+ # @param serivce_name_present [Boolean] flag to indicate if the service name section is present
128
+ #
129
+ # @option navigation [String] :label text for the aria-label attribute of the navigation.
130
+ # Defaults to the same value as +:text+ in +:menu_button+
131
+ # @option navigation [String] :classes classes for the navigation section of the header
132
+ # @option navigation [Array] :primary_items primary navigation items that will be rendered on the page (see {ccs_header_navigation_item})
133
+ # @option navigation [Array] :secondary_items secondary navigation items that will be rendered on the page (see {ccs_header_navigation_item})
134
+ #
135
+ # @option menu_button [String] :text text for the button that opens the mobile navigation menu.
136
+ # By default, this is set to +Menu+.
137
+ # @option menu_button [String] :label text for the aria-label attribute of the button that opens the mobile navigation.
138
+ # Defaults to +Show or hide menu+.
139
+ #
140
+ # @return [ActiveSupport::SafeBuffer] the HTML for the navigation section which is used in {ccs_header}
141
+
142
+ def ccs_header_navigation(navigation, menu_button, serivce_name_present)
143
+ (menu_button ||= {})[:text] ||= 'Menu'
144
+ navigation_classes = "ccs-header__navigation #{navigation[:classes]}".rstrip
145
+ navigation_classes << ' ccs-header__navigation--no-service-name' unless serivce_name_present
146
+
147
+ tag.nav(aria: { label: navigation[:label] || menu_button[:text] }, class: navigation_classes) do
148
+ concat(button_tag(menu_button[:text], type: :button, class: 'ccs-header__menu-button ccs-js-header-toggle', aria: { controls: 'navigation', label: menu_button[:label] || 'Show or hide menu' }, hidden: true))
149
+ concat(tag.div(id: 'navigation', class: 'ccs-header__navigation-lists') do
150
+ if navigation[:secondary_items]
151
+ concat(tag.ul(id: 'navigation-secondary', class: "ccs-header__navigation-secondary-list #{'ccs-header__navigation--no-second-list' unless navigation[:primary_items]}") do
152
+ navigation[:secondary_items].each { |navigation_item| concat(ccs_header_navigation_item(navigation_item)) }
153
+ end)
154
+ end
155
+ if navigation[:primary_items]
156
+ concat(tag.ul(id: 'navigation-primary', class: "ccs-header__navigation-primary-list #{'ccs-header__navigation--no-second-list' unless navigation[:secondary_items]}") do
157
+ navigation[:primary_items].each { |navigation_item| concat(ccs_header_navigation_item(navigation_item)) }
158
+ end)
159
+ end
160
+ end)
161
+ end
162
+ end
163
+
164
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
165
+
166
+ # Generates a navigation item for {ccs_header_navigation_item}
167
+ #
168
+ # @param navigation_item [Hash] options that will be used in customising the HTML
169
+ #
170
+ # @option navigation_item [Boolean] :active flag to mark the navigation item as active or not
171
+ # @option navigation_item [String] :text text for the navigation item
172
+ # @option navigation_item [String] :href URL of the navigation item anchor
173
+ # @option navigation_item [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
174
+ #
175
+ # @return [ActiveSupport::SafeBuffer] the HTML for a navigation item which is used in {ccs_header_navigation_item}
176
+
177
+ def ccs_header_navigation_item(navigation_item)
178
+ tag.li(class: "ccs-header__navigation-item #{'ccs-header__navigation-item--active' if navigation_item[:active]}".rstrip) do
179
+ if navigation_item[:href]
180
+ (navigation_item[:attributes] ||= {})[:class] = 'ccs-header__link'
181
+
182
+ link_to(navigation_item[:text], navigation_item[:href], **navigation_item[:attributes])
183
+ else
184
+ navigation_item[:text]
185
+ end
186
+ end
187
+ end
188
+
189
+ # Sets the default attributes for {ccs_header}
190
+ #
191
+ # @param ccs_header_options [Hash] options that will be used in customising the HTML
192
+ #
193
+ # @option (see ccs_header)
194
+
195
+ def determine_ccs_header_attributes(ccs_header_options)
196
+ initialise_attributes_and_set_classes(ccs_header_options, 'ccs-header')
197
+ set_data_module(ccs_header_options, 'ccs-header')
198
+
199
+ ccs_header_options[:attributes][:role] = 'banner'
200
+ ccs_header_options[:container_classes] ||= 'govuk-width-container'
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'action_view'
4
+
5
+ module CCS
6
+ module FrontendHelpers
7
+ module CCSFrontend
8
+ # = CCS Logo
9
+ #
10
+ # This helper is used for generating the logo component from the
11
+ # {https://github.com/tim-s-ccs/ts-ccs-frontend/tree/main/src/ccs/components/logo CCS - Components - Logo}
12
+
13
+ module Logo
14
+ include ActionView::Context
15
+ include ActionView::Helpers::TagHelper
16
+ include ActionView::Helpers::TextHelper
17
+
18
+ # Generates the CCS logo used in {ccs_header} and {ccs_footer}
19
+ #
20
+ # @return [ActiveSupport::SafeBuffer] the HTML for the logo used in {ccs_header} and {ccs_footer}
21
+
22
+ def ccs_logo
23
+ tag.span(class: 'ccs-logo') do
24
+ concat(tag.svg(class: 'ccs-logo__svg', xmlns: 'http://www.w3.org/2000/svg', height: '101', width: '121', aria: { hidden: 'true' }, focusable: 'false', viewBox: '0 0 121 101') do
25
+ CCS_LOGO_PATHS.each { |ccs_logo_path_attributes| concat(tag.path(**ccs_logo_path_attributes)) }
26
+ end)
27
+ concat(tag.span('Crown Commercial Service', class: 'ccs-logo__text', hidden: true))
28
+ end
29
+ end
30
+
31
+ # Array of the SVG paths for the CCS Logo
32
+
33
+ CCS_LOGO_PATHS = [
34
+ {
35
+ fill: 'currentColor',
36
+ 'fill-rule': 'evenodd',
37
+ d: 'M1.9.4H0v99.8h1.9V.4zm20 43c-.4-2.2-2.1-3.3-4.3-3.3-3.7 0-5.3 3-5.3 6.3 0 3.6 1.6 6.6 5.3 6.6 2.7 0 4.3-2 4.5-4.5h2c-.3 3.9-2.8 6.2-6.7 6.2-4.8 0-7.2-3.5-7.2-8 0-4.6 2.6-8.3 7.4-8.3 3.3 0 6 1.8 6.4 5h-2zm4-.3h1.7v2.3c1-1.8 2.2-2.7 4.2-2.6v2c-3 0-4.1 1.7-4.1 4.5v5h-1.8zm11.6-.3c3.6 0 5.5 2.6 5.5 5.9s-2 5.9-5.5 5.9c-3.6 0-5.5-2.6-5.5-6 0-3.2 2-5.8 5.5-5.8zm0 10.1c2 0 3.5-1.5 3.5-4.3s-1.6-4.2-3.5-4.2c-2 0-3.5 1.5-3.5 4.2 0 2.8 1.6 4.3 3.5 4.3zm18 1.4h-2l-2.4-9-2.3 9h-2l-3.6-11.2h2l2.6 9.2 2.3-9.2h2l2.4 9.2L57 43h2zm4.8-11.2H62v1.8a4 4 0 0 1 3.7-2.1c3 0 4 1.7 4 4.1v7.4h-2v-7.6c0-1.4-.8-2.2-2.2-2.2-2.3 0-3.4 1.5-3.4 3.5v6.4h-1.8V43zM22 66.4c-.5-2.2-2.2-3.3-4.4-3.3-3.7 0-5.3 3-5.3 6.3 0 3.5 1.6 6.5 5.3 6.5 2.7 0 4.3-2 4.5-4.5h2c-.3 3.9-2.7 6.2-6.7 6.2-4.8 0-7.2-3.5-7.2-8 0-4.6 2.6-8.3 7.4-8.3 3.3 0 6 1.8 6.4 5.1h-2zm8.8-.7c3.6 0 5.5 2.6 5.5 6s-1.9 5.8-5.5 5.8-5.4-2.6-5.4-5.9 1.9-5.9 5.4-5.9zm0 10.1c2 0 3.6-1.5 3.6-4.2s-1.6-4.3-3.6-4.3-3.5 1.5-3.5 4.3c0 2.7 1.6 4.2 3.5 4.2zM38 66h1.7v1.6c1-1.2 2.2-1.9 3.8-1.9 1.3 0 2.6.5 3 2a4.2 4.2 0 0 1 3.6-2c2.2 0 3.7 1 3.7 3.3v8.2H52v-7.4c0-1.4-.4-2.5-2.2-2.5-1.8 0-3 1.2-3 2.9v7H45v-7.4c0-1.5-.4-2.5-2.1-2.5-2.2 0-3 2-3 2.9v7H38V66zm18 0h2v1.6a4.4 4.4 0 0 1 3.7-1.9c1.3 0 2.6.5 3 2a4.2 4.2 0 0 1 3.6-2c2.2 0 3.7 1 3.7 3.3v8.2h-1.8v-7.4c0-1.4-.4-2.5-2.2-2.5-1.8 0-3 1.2-3 2.9v7h-1.8v-7.4c0-1.5-.5-2.5-2.1-2.5-2.2 0-3 2-3 2.9v7H56V66zm27.7 7.6c-.5 2.5-2.3 3.9-4.8 3.9-3.6 0-5.3-2.5-5.4-6 0-3.4 2.2-5.8 5.3-5.8 4 0 5.2 3.7 5 6.4h-8.4c0 2 1 3.7 3.5 3.7 1.6 0 2.7-.7 3-2.2zm-1.8-3c0-1.9-1.4-3.3-3.2-3.3-2 0-3.1 1.5-3.2 3.2zm3.5-4.6h1.8v2.3c.9-1.8 2.2-2.6 4.1-2.6v2c-3 0-4 1.7-4 4.5v5h-2V66zm14.4 3.6c-.2-1.4-1.3-2.3-2.8-2.3-2.7 0-3.5 2.2-3.5 4.4 0 2.1 1 4.2 3.3 4.2 1.8 0 2.9-1 3.1-2.7h1.9c-.4 2.7-2.2 4.3-5 4.3-3.4 0-5.3-2.4-5.3-5.8s1.8-6 5.4-6c2.5 0 4.5 1.2 4.8 3.9H100zm5.5-5.7h-1.8v-2.2h1.8zm-1.8 2h1.8v11.3h-1.8V66zm14.1 11.3c-.3.2-.7.3-1.3.3-1 0-1.6-.5-1.6-1.7a5 5 0 0 1-4 1.7c-2 0-3.7-1-3.7-3.2 0-2.5 1.9-3 3.8-3.4 2.1-.4 3.8-.3 3.8-1.7 0-1.6-1.3-2-2.5-2-1.6 0-2.7.6-2.8 2.2h-1.9c.1-2.8 2.3-3.8 4.8-3.8 2 0 4.2.5 4.2 3.1v5.8c0 .9 0 1.3.6 1.3h.6v1.4zm-3-5.8c-.7.5-2 .5-3.3.7-1.3.3-2.3.7-2.3 2s1 1.7 2.2 1.7c2.5 0 3.5-1.5 3.5-2.5v-2zm4.4-9.8h1.9v15.6H119zM20 89.1c-.3-2.2-1.8-3.1-4-3.1-1.7 0-3.4.6-3.4 2.6s2.4 2.2 5 2.8c2.4.6 5 1.4 5 4.5 0 3.3-3.3 4.6-6.2 4.6-3.4 0-6.4-1.7-6.4-5.5h2c0 2.6 2.1 3.8 4.5 3.8 2 0 4-.6 4-2.9 0-2-2.5-2.5-5-3s-5-1.3-5-4.1c0-3.2 2.9-4.6 5.7-4.6 3.2 0 5.6 1.5 5.7 5zm14 7.5a4.8 4.8 0 0 1-4.9 3.8c-3.6 0-5.3-2.5-5.4-6 0-3.4 2.2-5.8 5.3-5.8 4 0 5.2 3.7 5 6.5h-8.4c0 2 1 3.7 3.5 3.7 1.6 0 2.6-.8 3-2.2H34zm-1.9-3.2c0-1.7-1.4-3.2-3.3-3.2s-3 1.5-3.2 3.2zm3.5-4.5h1.8v2.4c.9-1.8 2.2-2.7 4.1-2.7v2c-3 0-4 1.7-4 4.5v5h-2V89zm12.6 11.3h-2L42 88.9h2.1l3.2 9.4 3.1-9.4h2l-4.2 11.3zm7.2-13.3h-1.9v-2.3h1.9V87zm-1.9 2h1.9v11.3h-1.9V88.9zm12 3.6c-.3-1.4-1.3-2.3-2.8-2.3-2.7 0-3.6 2.2-3.6 4.5 0 2 1 4.1 3.4 4.1 1.8 0 2.8-1 3-2.7h2c-.5 2.7-2.2 4.3-5 4.3-3.5 0-5.3-2.4-5.3-5.7s1.7-6 5.3-6c2.6 0 4.6 1.1 4.8 3.8zm13.2 4c-.5 2.5-2.3 3.9-4.8 3.9-3.6 0-5.3-2.5-5.4-6 0-3.4 2.2-5.8 5.2-5.8 4 0 5.2 3.7 5.2 6.5h-8.5c0 2 1 3.7 3.5 3.7 1.6 0 2.6-.8 3-2.2h1.8zm-1.8-3c-.1-1.8-1.4-3.3-3.3-3.3-2 0-3 1.5-3.2 3.2zM25.6 5c-.2.3-.4.5-.3.8l.4.7.3-.8-.4-.7zm4.6 0c.1.3.3.5.3.8 0 .2-.3.4-.5.7 0-.3-.3-.6-.3-.8 0-.2.4-.6.5-.7zm-7.3-.2a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3.3.3 0 0 0 .3.3zm.3.4a.3.3 0 0 0-.3-.3.3.3 0 0 0-.4.3c0 .2.2.3.4.3a.3.3 0 0 0 .3-.3zm0 .8a.3.3 0 0 0-.2-.3.3.3 0 0 0-.3.3c0 .2.1.3.3.3a.3.3 0 0 0 .3-.3zm1.5-2.7A.3.3 0 0 0 25 3a.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3c0 .2 0 .3.3.3zm-.8.3a.3.3 0 0 0 .3-.4.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3c0 .2.1.4.3.4zm-.6.5a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3c0 .2.1.3.3.3zm2.2-.7a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.4.3c0 .1.2.3.4.3zm.7.2a.3.3 0 0 0 .4-.3.3.3 0 0 0-.4-.3.3.3 0 0 0-.3.3c0 .2.2.3.3.3zm.8.4a.3.3 0 0 0 .3-.4.3.3 0 0 0-.3-.3.3.3 0 0 0-.4.3c0 .2.2.4.4.4zm5.5.5c0 .2.1.3.3.3a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3zm.4.4a.3.3 0 0 0-.3.3c0 .2 0 .3.3.3a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3zm-.2.8a.3.3 0 0 0-.3.3c0 .2.2.3.3.3A.3.3 0 0 0 33 6a.3.3 0 0 0-.3-.3zm-1.6-2.4a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.4.3c0 .2.2.3.4.3zm.8.3a.3.3 0 0 0 .3-.4.3.3 0 0 0-.4-.3.3.3 0 0 0-.3.3c0 .2.2.4.4.4zm.5.5a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3c0 .2.2.3.3.3zm-2.1-.7a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3c0 .1 0 .3.3.3zm-.8.2a.3.3 0 0 0 .3-.3.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3c0 .2.1.3.3.3zm-1 0c0 .2 0 .4.3.4a.3.3 0 0 0 .3-.4.3.3 0 0 0-.3-.3.3.3 0 0 0-.3.3zm-1.1 1.7h.3V4.1h-.3zm1-1.4a.8.8 0 0 1-.3 0v1.4h.3zm-.7-1.5v-.7a1 1 0 0 0-.8.8h.8zm.4 0h.7a1 1 0 0 0-.7-.8z'
38
+ },
39
+ { d: 'M27 3c0 .3.4.7.9.7a1 1 0 0 0 1-.8zm1.4-1.4a.8.8 0 0 1-.4-.7c.2 0 .5.2.7.5v-1l-.7.3c0-.2.1-.4.4-.7h-1c.2.3.3.5.3.8-.2 0-.5-.3-.7-.5v1l.7-.4c0 .3-.2.6-.4.7zm0 22.2a.4.4 0 0 1-.4-.4.4.4 0 1 1 .8 0c0 .2-.2.4-.4.4zm-1.8-.6a.4.4 0 0 1-.4-.4c0-.2.2-.4.4-.4s.4.2.4.4-.2.4-.4.4zm-.6-1.8l-.1-.1h-.5l-.3.2v.1c.3.3.3.4.2.5v.1h-.5l-.1-.1v.1l-.1.1a.7.7 0 0 0-.2.4 1 1 0 0 0 .2.3l.4.2a.6.6 0 0 1-.6 0l-.4-.6c0-.2 0-.5.3-.8v-.1l-.1-.3h.3c.2-.1.6-.5 1-.5a.7.7 0 0 1 .5.2l.2.4a.3.3 0 0 1-.2-.1zm3.6 1.4a23.8 23.8 0 0 1-3.3-1.1.8.8 0 0 0-.2-.7l-.6-.3h-.3c-.2 0-.3-.3-.5-.4a5.7 5.7 0 0 1-1-1.7 4.5 4.5 0 0 1-.2-1c0 .2-.4.7-1 .7V18c-.2.1-.4.3-1 .1 0 .5.2.9.3 1.3a6.6 6.6 0 0 0 1.4 2.4l.7.6v.1c0 .2.2.6.5.8l.8-.1a5 5 0 0 0 1.7.6 7 7 0 0 0 2 .3c.5 0 1.1-.2 1.7-.6l.7-.5a5 5 0 0 1-1.7-.3zm-.4 4l-.2-.2c-.4 0-.2 1-.7 1-.2 0-.3-.1-.3-.2V27l-.1-.2c-.1 0-.2 0-.2.2v.3c0 .1 0 .2-.2.2-.5 0-.3-1-.7-1-.1 0-.2 0-.3.2a.8.8 0 0 1-.1-.4c0-.2.1-.4.4-.4.6 0 .4.7.7.7l.2-.2c0-.2-.4-.4-.4-.7 0-.3.3-.6.6-.8.3.2.6.5.6.8 0 .3-.4.5-.4.7a.2.2 0 0 0 .2.2c.2 0 .1-.7.6-.7.3 0 .5.2.5.4l-.2.4zM28 28.2a.3.3 0 0 1-.3-.2c0-.1.1-.3.3-.3s.2.2.2.3a.3.3 0 0 1-.2.2zm1-2.5h-.1v-1.1a6.3 6.3 0 0 1-1.8-.3v1.4h-.2c-.4 0-.6.3-.6.7 0 .3.1.5.3.7 0-.2.1-.3.2-.3.3 0 .1 1 .7 1v.2c0 .3.2.5.5.5s.4-.3.4-.5c.5 0 .5-1.1.7-1.1 0 0 .2.1.2.3.2-.2.4-.4.4-.7 0-.4-.3-.7-.7-.7z' },
40
+ { d: 'M42.6 27.1h-.1c-1.4.3-3-.8-4.7-1.9-1.4-1-2.7-1.8-3.8-1.8-.4 0-.8.1-1 .3a2 2 0 0 0-1 1l-.5 1-.3.8c0 .2 0 .4.3.6.1.2.3.4.7.5l.2.1.5.4a9.5 9.5 0 0 1-2 .5l-3 .3c-1 0-2-.1-2.9-.3a9.4 9.4 0 0 1-2-.5c0-.2.2-.3.5-.5h.2l.7-.5.3-.6-.4-.8a5.3 5.3 0 0 1-.5-1 2 2 0 0 0-.9-1c-.3-.2-.6-.3-1-.3-1.2 0-2.5 1-3.9 1.8-1.6 1.1-3.3 2.2-4.6 1.8l-.2.1.1.2 1.2.7c.5.4 1 .8 1.4.8.5 0 1-.2 1.7-.5a25.3 25.3 0 0 0 1.6-1 7 7 0 0 1 3.3-1.7c0 .2-.2.3-.3.4-.3.2-.6.5-.6 1 0 .4.1.6.3 1l.2.4.2.8.1.4c.1.3.2.7 1 1.1.9.5 2.4.7 4.6.7 2.1 0 3.7-.2 4.6-.7.7-.4.8-.9 1-1v-.5l.2-.8.3-.5c.1-.3.3-.5.3-.8 0-.5-.3-.8-.7-1.1l-.3-.3c1.1 0 2.2.8 3.3 1.6l1.7 1c.6.3 1.1.5 1.6.5s1-.3 1.5-.7l1.1-.8v-.2zM28.1 16.5v-5c.5 0 1 0 1.5.3s1 .6 1.4 1.1c.4.5.8 1 1 1.7a5.8 5.8 0 0 1 .3 2h-4.2zm-.2-7.2c-1.5 0-2.5.4-3 .8-.4-.2-.5-.4-.5-.6 0-.9 2.3-1 3.5-1s3.5.2 3.5 1c0 .2-.1.4-.5.6-.6-.4-1.6-.8-3-.8zm-.1 7.2h-4.4a5.8 5.8 0 0 1 1.3-3.6c.4-.5 1-.8 1.5-1a3.6 3.6 0 0 1 1.6-.5zm6.6-.3c-.1-.1-.4-.3-.5-.6l-1-1.9a.7.7 0 0 1 0-.3V13l.3-.3.1-.2c-.2-.4-.4-.7-.8-1a6.5 6.5 0 0 0-1.3-1.2c.3-.2.5-.4.5-.9a.7.7 0 0 0-.2-.5c.2-1 .7-2 1.1-2.4l-.8-.4c.2.4.2.8.1 1-.2-.2-.4-.4-.4-.7a4.1 4.1 0 0 1-.4 1c.3-.1.5-.2.7 0 0 .1-.5.4-1 .3-.4-.1-.7-.3-.7-.5l.3-.3c.2 0 .3.3.2.4.2-.1.5-.9.1-1-.3 0-.6.4-.7.7 0-.4-.2-.7-.5-.7-.4 0-.3.7-.2 1 0-.3.2-.5.3-.5.1 0 .3.1.3.3s-.4.4-.8.4c-.3 0-1-.1-1-.8.1 0 .5.2.7.5a5.4 5.4 0 0 1 0-1.2c-.2.3-.5.4-.7.5a1.6 1.6 0 0 1 .6-.9H27c.3.2.6.6.6.9-.2 0-.6-.2-.7-.5v1.2c.1-.2.5-.4.7-.5 0 .7-.7.9-1 .9-.5 0-.8-.2-.8-.4a.2.2 0 0 1 .2-.3c.1 0 .3.1.3.4.1-.2.2-1-.2-1-.3 0-.4.4-.5.8 0-.4-.4-.8-.7-.7-.4 0-.1.8.1 1 0-.2 0-.5.2-.5s.3.2.3.3c0 .2-.3.4-.6.5a1 1 0 0 1-1.1-.3c.2-.2.4 0 .7 0a4.1 4.1 0 0 1-.3-1l-.5.7c0-.2 0-.7.2-1l-1 .3c.5.5 1 1.5 1.3 2.4a.7.7 0 0 0-.3.6c0 .4.3.6.5.8-.5.3-1 .7-1.3 1.2-.6.6-1 1.4-1.4 2.3l.7.8c.3.3.4.6.4.8 0 .4 0 .6.3.8l.2.6h4.4v4.7c-.2 0-.4 0-.5.2l1.5.6c0-.3 0-.5.2-.7l-1-.1v-4.6h4.3c0 .7-.1 1.3-.4 1.8a4.9 4.9 0 0 1-2.3 2.8l-.2.1-.2.4-.1.5.5.1c1.5.4 1.8.3 1.9.2l1-.8c.5-.7 1-1.5 1.3-2.4a8 8 0 0 0 .6-2.8v-.5z' },
41
+ { d: 'M30.4 13.5v.1l.1.1v.2h.2c.3.6.6 1.2.7 1.8h-.2v.1h-1v-.1H30a.3.3 0 0 0-.1-.1.3.3 0 0 0 0 .1h-.2l-.1.1h-1l.1-.2-.2.1v-1.4l.2-.1V14a.3.3 0 0 0 0-.1.3.3 0 0 0 0-.1v-.2h-.2v-1.3h.2v-.1l.8.4.8.8zm1.2 2.2c.1 0 0 .2 0 .2a4.8 4.8 0 0 0-.9-2.2c.1 0 .2 0 .2-.2l-.2.1-.1-.1-1-.9-1-.5h.2c0-.2 0-.2-.2-.2h-.2v.2h-.1l.1.3v-.1 1.6l-.2.1.3.1v1.8c-.1 0-.2-.1 0-.2-.2 0-.3.2-.3.2h.2l-.1.2h.2l.2-.1h-.2 1.3v.2c.2 0 .2-.2.2-.2h1.2l.2.2s.1 0 0-.2l.2.1v-.2c.2 0 .2-.2 0-.2z' },
42
+ { d: 'M30.9 15.2h.1-.1V15c0-.1 0-.1-.1 0s-.4 0-.4-.3h.4l-.2-.4-.2-.1v-.4l-.1-.2v.6l.5.4-.1.1h-.1a.1.1 0 0 1-.1-.1l-.3-.4c-.2-.2-.1-.4 0-.5l-.2-.5v-.1l-.2-.1h-.2l-.1.2v.1h.2-.1v.1l.2.1c0 .2-.2.2-.2.3h-.1l-.2-.2-.1-.1v-.3H29v.1c0-.1-.1-.2-.2-.1h.2l-.1.1v.1c0 .1 0 .1 0 0a.1.1 0 0 0 0 .2l.1.1c.1 0 .2.3.4.3l-.2.2a.3.3 0 0 1-.2.1h-.2v.1s-.1.1 0 .2v-.1.1h.4c.1 0 0 0 0 0l.2-.1h.2v-.2c0 .2.4.2.5.4h-.3l-.3.1.2.3h-.2c-.1 0-.1-.2-.2-.1a.1.1 0 0 0-.1 0v.2c0 .1.1.2.2.1s0 0 .1 0h.1s0-.1 0 0h.2V15l.2-.1s.2.3.4.3h.2c0 .1 0 0-.1 0a.1.1 0 0 0-.2.2h.2v.2h.1v-.2.1h.1c.1-.1 0-.1 0-.2h.1a.1.1 0 0 0 .1-.1zm-4 2.4l-.2.1.1.1v.7l-.7-1 .7-.2c.1 0 .2.1.1.3zm-.2 1.6l-1-1.4.3-.1.7 1v.5zm-.1.7L25 17.8h.4l1.1 1.7v.4zm-1.7-2.1l1.6 2.3c-.8-.4-1.7-1.1-1.6-2.3zm2.4-.2c0-.3-.2-.5-.5-.5-.2 0-.7.3-1.3.3-.3 0-.7-.1-.9-.3v.2a.2.2 0 0 0-.3-.2.2.2 0 0 0-.1.2.2.2 0 0 0 .2.2v.1c0 1 .7 2.4 2 2.7.2 0 .4 0 .4.2 0 .1 0 .2-.2.2s0 0 0-.1v-.2c-.1 0-.3 0-.3.2a.3.3 0 0 0 .3.3c.2 0 .5-.1.4-.5h.2v-2.6h.2v-.2zm-1.1-4.8v-.1.1zm0-.2v-.1zm.8.4c.4 0 .5 0 .5-.2 0-.3-.8-.1-.8-.3v-.1c.5 0 .5-.4.8-.4-.4 0-.5.2-.6.3l.1-.2-.4.2v.2c0 .3.8 0 .8.3 0 .1 0 .2-.4.2-.1 0-.3-.2-.6 0l.1-.3v-.2h-.3v.5H26v-.4h-.3.1v.1c-.1 0-.1.1 0 .2 0 .1-.2 0-.1 0-.1.1 0 .1 0 .1h.1v.2h-.2s-.2.1-.2 0H25l.2.1H25c0 .1 0 .1 0 0v.1l.1.1v-.1h.8v-.1h.2l.2-.1c.1 0-.1-.2.2-.2l.1.2h.1-.3v.2h.2v-.2h.1c.2 0 0 0 0 0h.2c0 .1 0 0 0 0l-.1.2h.2V13h-.1.1zm-1.6 1.1V14h.1v.1h-.1zm.1-.2h-.1.1zm0 0h.2l-.1.1zm2 .3L27 14h-1c0-.2.2-.2.4-.2.4.2.9 0 1.1 0-.2-.2-.5 0-.8 0l.3-.1h-.6c-.3 0-.5 0-.5.2 0 .3.8.1 1.1.1h.3c0 .2-.3.2-.4.2-.2 0-.9-.2-1.3 0a.3.3 0 0 0 .1-.3v-.2h-.1l-.1-.1h-.2v.1l-.1.2v.2h-.1L25 14v-.3l-.1-.1v.1h-.1s0-.1-.1 0v.2c0 .1 0 .1 0 0-.2.1 0 .2 0 .2h.1l.2.1s0 .1.1 0v.2h-.5c0-.1-.1-.1-.1 0a.1.1 0 0 0-.1.1s0 .1.1 0v.2l.1-.2.1.1h.7l.2-.2c.4 0 .2-.2.6-.2h.1v.2h.1c-.1 0-.1-.1-.2 0a.1.1 0 0 0-.2 0h.1v.1c0 .1.1.2.2.1l.1-.1h.2v-.2h.5v.1H27a.1.1 0 0 0-.1.1h.1v.1h.3l-.1-.1v-.4h-.4.7zM25 15.5v-.2h.1v.2H25zm.1-.3zm0 0h.2v.1h-.1zm2.2.3l-.4-.1h-1.2c0-.2.3-.1.5-.1h1.1c-.2-.2-.5 0-.7 0l.3-.1h-.7l-.6.1c0 .3 1 .2 1.3.2h.3l-.4.1h-1.6s.2-.1.1-.2v-.2H25V15l-.1.1v.4h-.2l-.1-.2v-.2l-.2-.1v.4c0 .2-.1.1 0 0a.1.1 0 0 0 0 .2h.1l.2.2h.1v.2h-.4v-.1h-.2l.2.1-.2-.1H24c0 .1 0 .1.2 0 0 .1-.1.1 0 .1h.8l.1-.1.2-.1c.5 0 .2-.2.7-.2l.1.1c0 .1 0 0-.2 0a.1.1 0 0 0-.1 0h.1c0 .1-.1 0 0 .2l.1.1h.1v-.1h.3v-.2h-.1.7c0 .1 0 0 0 0h-.1a.1.1 0 0 0-.1.2h.1v.1h.1v-.1l.2.1-.1-.2v-.3h-.4.6zm1.9 2c0-.1 0-.1 0 0v-.2.2zm0-.4zm.1 0l.2.1h-.1zm2.2.6l-.1-.1H31l.5-.2-.4-.1h-1.2c0-.2.3-.1.5-.1h1.1c-.3-.1-.5 0-.8 0l.4-.1h-.7l-.6.1c0 .3 1 .2 1.2.2h.3l-.4.1h-1.5s.1-.1 0-.2h.1V17H29v.4h-.2l-.1-.1V17l-.1-.1v.1h-.1v.1c-.1 0-.1 0 0 .1 0 .2-.2.1-.1 0a.1.1 0 0 0 .1.2l.3.2.1.1h-.6l.2.1h-.2a.1.1 0 0 0-.1 0c0 .1 0 .2.2 0 0 .1-.1.2 0 .2h.6l.1-.1h.1v-.1c.6 0 .3-.2.8-.1l.1.1h.1-.2a.1.1 0 0 0-.2 0h.1v.2s0 .1.1 0 0 0 .1 0h.2v-.2h.4c0-.1 0 0 .1 0h-.1a.1.1 0 0 0 0 .1v.1h.3v-.2h.5zm-2.2.9h-.1v-.1.1zm0-.2h-.1zm.8 0v.1c.4.1.8-.2 1 0-.2-.2-.4 0-.7 0l.4-.2h-.6c-.2 0-.4 0-.4.2 0 .3.8.1 1 .1l.2.1-.4.1h-1.2s.1-.2 0-.2h.1v-.2h-.2v-.1h-.1l-.2.1v.4h-.2v-.3h-.2.1v.1c-.1 0-.1 0 0 .1 0 .1-.1 0-.1 0a.1.1 0 0 0 .1.2h.3v.2h-.5c0-.1 0-.1 0 0h-.1s-.1 0 0 .1c0 0 0 .1 0 0v.1l.1.1V19h.4l.1.1.2-.1.1-.1h.1c.3 0 0-.3.5-.2l.1.1h.1-.3a.1.1 0 0 0-.1 0h.1v.5h.2V19h.2v-.2H30h.6c0 .1-.1 0-.1 0a.1.1 0 0 0-.2.2h.2s-.1 0 0 0v.1l.1-.1.1.1v-.3h.1v-.2h-.5l.5-.2-.3-.1h-.9.5zm-1 1.6v-.1H29v-.1h.1v.2zm0-.3H29a.5.5 0 0 1 .1 0zm.1 0v.1zm.7 0c.4.2.8 0 1 0h-.7.3-.6c-.1 0-.3 0-.3.2s1 0 1 .1l-.4.1h-1l.2-.2v-.2H29v.5l-.2-.2v-.3h-.2v.3c-.1 0 0 .1 0 0l.1.1.1.2.2.1h-.2v.1h-.4v.1h-.1s-.1 0 0 0c0 .1 0 .2 0 0v.2h.1v-.1h.5l.1.1.2-.1.1-.3h.3v.2c-.2 0-.2-.2-.3-.1v.4h.3v-.2l-.1-.3h.3l.1.1h-.2v.4l.1-.1h.1v-.2h.1v-.1l-.1-.2.5-.1c0-.3-.9 0-.9-.2l.5-.2zM15 3.7s0-.2-.2-.2-.2.2-.2.2c0 .2 0 .3.2.3.1 0 .2-.1.2-.3zm0-.5c0-.2-.2-.2-.3-.2-.1 0-.2 0-.2.2s0 .2.2.2c.1 0 .2 0 .2-.2zm0-.3c.2 0 .3 0 .3-.2s-.1-.2-.3-.2c0 0-.2 0-.2.2s.1.2.2.2zm.6 0c.1 0 .2-.1.2-.3s0-.2-.2-.2l-.2.2.2.3zm2.6-.4h.3a.2.2 0 0 0 0-.3.2.2 0 0 0-.3 0 .2.2 0 0 0 0 .3zm0-.5a.2.2 0 0 0 0-.3.2.2 0 0 0-.4 0 .2.2 0 0 0 0 .3h.3zm-.7-.1a.2.2 0 0 0 0-.3.2.2 0 0 0-.3 0 .2.2 0 0 0 0 .3h.3zm-.5.3a.2.2 0 0 0 0-.3.2.2 0 0 0-.3 0 .2.2 0 0 0 0 .3.2.2 0 0 0 .3 0zM15.6 2l.2.4.2-.2.1.5c0 .1.1.2.3.2l.2-.2-.1-.3-.3-.3h.4l-.1-.4-.3.2v-.4l-.4.1.3.4z' },
43
+ { d: 'M18.2 2.6l.1.4-.2-.3v.6l.2-.2c0 .3-.1.5-.3.5 0 0-.2 0-.2-.2 0-.1 0-.3.2-.1 0-.3-.2-.3-.4-.2.2-.3.1-.5-.1-.6-.2.2-.1.5.1.6-.2 0-.4.1-.2.3 0-.2.2-.1.2 0 0 .2 0 .3-.3.4-.3.1-.4 0-.4-.2h.3v-.4l-.4.3.1-.5-.6.3.4.3h-.5l.3.4c0-.3.1-.4.2-.4 0 .2.1.4-.2.5H16c0-.1 0-.3.2-.2 0-.3-.3-.3-.4 0 0-.4 0-.6-.4-.6 0 .3 0 .4.3.6-.1 0-.3.1 0 .3 0-.1 0-.2.2 0l-.1.3c-.1 0-.3 0-.5-.2h.2l-.3-.4v.3l-.1-.3-.3.2.9.8 1.3-.6a9.4 9.4 0 0 1 1.5-.5V2.6zm.7 3c-.3.3-.7 0-1-.3l1.3-.6c-.3.5 0 .7-.3.9zm-.1 3.2c-.4.2-.7-.2-.8-.4V8c.1-.2.2-.3 0-.5 0-.3-.3-.2-.6 0 .2-.3.2-.5 0-.5s-.2.4-.4.3V7c0-.2 0-.2.2-.3l1.2-.4h.3s.3.1.2.2c0 .2-.3-.1-.5 0 0 .1 0 .3.3.3-.3.2-.6.3-.5.5.1.2.2.3.5.3l.3.4c.2.3.2.7-.2 1zm-2.2-2.3c-.3 0-.3-.3-.9-.4l1.4-.5c0 .4-.1.8-.5.9zM23 16.8c0-.2-.4-.5-.4-.8 0-.4 0-.7-.4-1.1l-2.1-2.4s.3 0 .5.2l.7.7A7 7 0 0 1 23 11l.2-.3-.8.3c0-.4 0-.7-.2-1 0-.5 0-1.2-1.2-2 .6.1 1 .7 1.4.3-.4 0-.4-1-2-1.7.6 0 1.1.9 1.8.4-.7-.1-.9-1.3-2-1.6.4 0 .8.2 1.1-.3-.4.1-.6-.2-1-.3V3.7a1.4 1.4 0 0 0-1 .4c0-.3-.2-.4-.5-.3V4l-1.5.4-1.3.7c-.1.1-.2 0-.3-.1-.2.1-.3.3-.2.5a2 2 0 0 0-1 .3c0 .4.4.7.8 1-.7.6-.1 1.3-.7 2 .9 0 .7-1.3 1.2-1.5 0 1-.6 1-.6 2 0 .5.3 1 0 1.4.8-.2.6-1.9 1-2.3.2.2.1.5 0 .8-.2.7 0 1.8-.4 2.2.8-.1.9-1.3 1.5-1.8-.5 1.1-1 3.4-1.8 4.6-1.3 1.8-2.1 3.9-3.3 3.9-.5 0-1-.3-1-1 0-2 3.5-3.3 3.5-5.4 0-1-.8-1.4-1.3-1.4a2 2 0 0 0-1 .5l-.4-.1c-1.2 0-1 2.2-2 2.2.4.2 1.2-.3 1.6-.9-.2 1.4-2.2 1-2 2.8.2-1.4 3.5-1.2 3.5-3.2l-.3-.6.7-.2c.4 0 .7.3.7.9 0 1.7-3.4 3.2-3.4 5.4 0 .4.1.7.3 1-.2 0-.5 0-.7-.2 0 .6.8 1 1.3.6h.3c-.1.5-.7.6-1 .6 1 .7 2.4-.2 2.3-1 .7-.4 1-1.4 1.5-2v.5c-.5.8-1 1.6-1.1 2.8-.1 1-.6 1.8-1.3 1.8h-.5c-.2.1 0 .3 0 .5 0 .3-.6.6-.6 1.4 0 .4.3.9.2 1.1.2-.1.5-.5.6-1 .2 1.2-.5 1.2 0 2.1 0-.3.4-.5.7-.3s0 .2 0 .4c-.2.1-.4.9.3.8-.1 0-.1-.3.2-.3h1.1c.3 0 .4-.3.7-.3s.3.2.2.3c.4 0 .5-.3.5-.5s-.2-.3 0-.4c0-.1.5 0 .3.4.2 0 .4-.2.4-.5s-.4-.5-.7-.4c0-.2-.3-.3-.6-.3-.5 0-.5.5-.8.5-.6 0-1.2-.8-1.2-2.1 0-.8.8-1 1.3-1.2.6-.2 1.5-.8 2.1-1.8.4-.7.5-1.5.4-2.5.7.4.8 1 .8 1.5 0 .6-.3.9-.5 1-.3 0-.3 0-.3.2l.1.3c.3.1.2.4.3.7.1.3.4.7.8 1V21c.6.3.1 1.5 1.3 1.5-.3-.1-.2-.4 0-.5l.4.4c.2.3.2.3.7.3.5 0 .3-.2.6-.2s.2.4.1.6c.5-.2.6-.5.5-.9.4-.2.7 0 .7.3.5-.4 0-1-.3-1 0-.1-.2-.3-.4-.3h-.5c-.2 0-.3.3-.5.3-.7 0-2.2-1.3-2.2-1.9 0-.5 1.4-.9 1.4-1.7 0-1.2-1.1-1.6-2-2.3.3-.4 1.2-.5 1.8-.1 0-.4.3-.3.4-.8.2.4 0 .8.1 1 .2-.2.6-.2.6-.7.1.3-.2.9.1 1.2 0-.3.2-.4.4-.4s.2.1.2.3c0 .4-.6.2-.6.7 0 .2.3.3.3.5 0 .1-.2.3-.5.1l.5.1c.2 0 .5-.2.6-.4.1.3 0 .7-.2.7.2.2.8 0 .7-.7.4 0 .6.3.3.7.3-.1.6-.2.6-.5s-.3-.3-.1-.6zm22 5.5c0-.4.2-.8.6-.8.4 0 .8.4.8.8a.7.7 0 0 1-.8.7.7.7 0 0 1-.7-.7zm-.3 0c0 .5.5 1 1 1s1-.5 1-1a1 1 0 0 0-1.7-.7 1 1 0 0 0-.3.7zM41.6 24a.4.4 0 0 1-.4-.4l.1-.2.5-.1c.2 0 .4.2.4.4s-.2.4-.6.3zm-.4-.9l-.2.4a.5.5 0 0 0 .2.5l.4.2h.6a.6.6 0 0 0 .3-.4c0-.4-.2-.7-.6-.8l-.7.1zM36 10.3l.2-.4a.6.6 0 0 1 .4-.1h.2a.4.4 0 0 1 0 .3c0 .1 0 .2-.2.3H36v-.1zm0-.6c-.3.2-.3.6-.1.9.2.2.5.2.9 0a.8.8 0 0 0 .3-.5l-.1-.4-.4-.1-.5.1zm4.6 13a.3.3 0 0 1-.3-.1l-.1-.4c0-.2 0-.3.2-.4a.3.3 0 0 1 .2-.1c.2 0 .3.2.3.5l-.1.4h-.2zm-.4-1.2a.8.8 0 0 0-.2.6c0 .2 0 .5.2.6l.4.2a.5.5 0 0 0 .4-.2.8.8 0 0 0 .2-.6c0-.2 0-.4-.2-.5l-.4-.2-.4.1zm-4.5-6.7c-.3-.2-.4-.4-.3-.6l.2-.1a.5.5 0 0 1 .4 0l.3.3v.2l-.2.2h-.4zm-.2-1l-.3.3c-.1.3 0 .7.4.8.2.1.5.2.6 0 .2 0 .3 0 .3-.2 0-.1.1-.2 0-.4 0-.2-.2-.4-.4-.5a.9.9 0 0 0-.6 0z' },
44
+ { d: 'M42.3 18.2c-.1.2-.4.3-.6.1v-.6c.2-.2.4-.3.6-.2.2.2.2.4 0 .7zm-1 1.8c-.2.2-.5.3-.7.1v-.6c.2-.2.4-.3.6-.2.2.2.2.4 0 .7zm-4-9.8l.5-1.3.4.2-.4.3a.4.4 0 0 0 .4 0l-.2.4a.8.8 0 0 0-.2-.2c-.1.3 0 .4.3.5.2.2.4.2.5 0 0 0 0-.3-.3-.2 0-.2 0-.3.3-.3 0 0 .2 0 .2.2 0-.3.2-.6.5-.7.1.3 0 .6-.3.9h.4l-.1.4c0-.2-.3-.3-.4 0l.2.4c.3.1.6 0 .7-.2h-.4l.3-.5c0 .1 0 .3.2.3V10l.6.4-.4.2h.3l-.4.5-.1-.4c-.2.3-.1.5.2.7.2.1.4.2.5 0 0-.1 0-.4-.3-.3 0-.2.1-.3.2-.3.2 0 .3.1.3.3 0-.4.2-.6.6-.7 0 .4-.1.6-.4.8h.3c.1.2 0 .4-.1.5 0-.2-.4-.3-.4-.1-.1 0 0 .2.3.4.1 0 .3.2.6 0a.6.6 0 0 0-.4-.2l.3-.3.2.3v-.5l.4.3-.9 1zm4.7 5.3l.1-.2.2-.1c.2 0 .3 0 .4.2l.2.4v.2h-.7l-.2-.5zm1.8 7.9a.7.7 0 0 1 .2-.4h.7a.5.5 0 0 1 0 .3.7.7 0 0 1-.2.4h-.7v-.3zm-8.2-11.9a.5.5 0 0 1-.1.4h-.2c-.2 0-.3-.1-.3-.4a.5.5 0 0 1 .2-.4h.3a.8.8 0 0 1 .1.4zm2.5-5.2c.1-.2 0-.6.5-.6l.7.3c-.4 0-.9.1-1.2.3zm7.4 6.5c.3.9 1 1.2 1.4 1-1-.2-.2-2-1.6-2h-.2c-.2-.2-.5-.3-.9-.3-.5 0-1.5.6-1.5 1.7 0 2.5 2.8 2.7 2.8 5 0 .6-.5 1-1 1s-.9-.6-1.3-1.4c-.1-.4-.6-1-1-1.6.1.1.3.2.4.1h.4a.6.6 0 0 0 .2-.5l-.2-.6a1 1 0 0 0-.7-.2l-.3.1a.6.6 0 0 0-.2.4v.3c-.6-.8-1.2-1.6-1.2-2 0-.4.3-.8.6-1.2h.2l.9-1 .1-.1-.3-.3.2-.6c.1.4.4.6.6.5-.2-.3.2-1 0-2 .2.5.6.6.8.6-.6-.6.2-1.4-.6-2.6h.5C43 7 43.2 6 42 5.6c.3 0 .5-.2.5-.4-.4.3-.7-.5-1.8-.4-.1-.5-.5-1-1-1.1.1.3 0 .6 0 .8L35.8 1l-.2-.1V1L39 5l-.8.3c-.2 0-.3.2-.3.4a7.4 7.4 0 0 0-1.3.9c-.2.1-.4.2-.2.6 0 .1-.1.5.3.2.3-.1 1-.5 1.1-.3 0 .2-.3.3-.5.4l-.5.4h.3l.1.3c.1 0 .3-.2.4-.1 0 0 0 .5-.2.6.4 0 .6-.4.6-.7l.2-.4v.5c.2 0 .4-.3.4-.7l.2-.2c.2 0 .4.4.7.4.7 0 1-.5 1-.8a.7.7 0 0 0 0-.5c.2.2.3.5.3.7 0 .9-1.6 1.3-2.3 2l-.8-.3V9l-.1.1c0 .3-.2.8-.4 1.1v.2c-.4.6-.7 1.2-.8 2a5 5 0 0 0-.5-.5v-.3c0-.2 0-.3-.2-.5l-.3-.2a.5.5 0 0 0-.4.2h-.1l-.7-.6a.4.4 0 0 0-.4-.1h-.3l-.3.1-.5.4.3.3.1.2.2-.1c.1-.2.2-.2.3-.2l.3.2 1.2 1.5H34c-.2 0-.2 0-.4.3l-.2.2v.5c.3.3.8 1.3 1 1.8.2.4.4.5.8.6l1 .6v-.3l-.5-.3c-.2 0-.2-.1 0-.1l.8.3c0-.4-.4-.7-.6-1h-.6l-.1.2c-.1 0-.2 0-.2-.2 0 0 .2-.1.2-.3s-.3-.2-.5-.2l-.5-1c-.2 0 0-.2 0-.3.2-.1.6.1 1.3.2h1c0 .9.4 1.7 1.6 2a2 2 0 0 1 1.5 1.2c-2.5 0-2.9.9-2.9 1.8 0 1 .9 1 .9 1.7s-2 1-2.7 1.1c-.5 0-.8.2-1.1.4l-1 1h.4l.4-.4.2-.2v.3l-.3.4c1.2.1 1.3-.3 1.3-.5s-.3-.3-.2-.5c.2-.1.3 0 .5.2s.2.3.5.1l3-1.2c.3-.1.2-.3 0-.4l-.2-.7c0-.8.5-1 1.4-1v.4c0 1.2 1.8 2.5 2.3 2.5.2 0 .5-.2.6.5 0 .6.1 1 0 1.6 0 .7-.3.8-.6 1s-.8 1.1-1 1.3c.2.1.4.1.5-.3l.4-.6-.3 1c.5.2 1.3-.3 1.3-.6 0-.4-.3-.3-.3-.5 0-.1.1-.3.3-.3.2 0 .3.2.3.3.2-.2.4-.4.4-.9v-.6c.1.2.3.3.5.3h.5a.9.9 0 0 0 .3-.6v-.1a.8.8 0 0 0 0-.4l-.4-.2a.8.8 0 0 0-.6.2c-.2 0-.3.2-.4.4a37 37 0 0 1 0-1.5l-.1-.7-.5.2c-.2 0-.7-.5-.7-1 0-.6.5-1.3.5-2 0-.2.2-.4.3-.2l.5 1c-.2.9.9 1.8 1.7 1-.4.1-.7-.2-.9-.6h.4c.3.4 1.2.4 1.4-.6-.1.2-.4.4-.7.3.3-.2.5-.7.5-1.1 0-2.4-2.8-2.7-2.8-4.8 0-.8.7-1.3 1.1-1.3l.5.1c-.2.2-.3.5-.3.8.1 1.7 2.8 1.7 2.9 2.5.3-1.4-1.7-1-1.8-2.7z' }
45
+ ].freeze
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ccs_frontend/footer'
4
+ require_relative 'ccs_frontend/header'
5
+ require_relative 'ccs_frontend/logo'
6
+ require_relative 'ccs_frontend/dashboard_panels'
7
+
8
+ module CCS
9
+ module FrontendHelpers
10
+ # This module loads in all the CCS Frontend Helper methods.
11
+ # These are a collection of view helpers to help render CCS components
12
+
13
+ module CCSFrontend
14
+ include DashboardPanels
15
+ include Footer
16
+ include Header
17
+ include Logo
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'action_view'
4
+
5
+ require_relative '../shared_methods'
6
+
7
+ module CCS
8
+ module FrontendHelpers
9
+ module GovUKFrontend
10
+ # = GOV.UK Accordion
11
+ #
12
+ # This helper is used for generating the accordion component from the
13
+ # {https://design-system.service.gov.uk/accordion/back-link GDS - Components - Accordion}
14
+
15
+ module Accordion
16
+ include SharedMethods
17
+ include ActionView::Context
18
+ include ActionView::Helpers::TagHelper
19
+ include ActionView::Helpers::TextHelper
20
+
21
+ # Generates the HTML for the GOV.UK accordion component
22
+ #
23
+ # @param accordion_id [String] used as an id in the HTML for the accordion as a whole,
24
+ # and also as a prefix for the ids of the section contents
25
+ # and the buttons that open them
26
+ # @param accordion_items [Array<Hash>] an array of accordion items.
27
+ # See {#govuk_accordion_section} for details of the items in the array.
28
+ # @param govuk_accordion_options [Hash] options that will be used in customising the HTML
29
+ #
30
+ # @option govuk_accordion_options [String] :classes additional CSS classes for the accordion HTML
31
+ # @option govuk_accordion_options [Integer] :heading_level (2) heading level, from 1 to 6
32
+ # @option govuk_accordion_options [Hash] :attributes ({ data: { module: 'govuk-accordion' } }) any additional
33
+ # attributes that will added as part of the HTML
34
+ #
35
+ # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Accordion
36
+ # which can then be rendered on the page
37
+
38
+ def govuk_accordion(accordion_id, accordion_items, **govuk_accordion_options)
39
+ initialise_attributes_and_set_classes(govuk_accordion_options, 'govuk-accordion')
40
+ set_data_module(govuk_accordion_options, 'govuk-accordion')
41
+
42
+ govuk_accordion_options[:attributes][:id] = accordion_id
43
+ govuk_accordion_options[:heading_level] ||= 2
44
+
45
+ tag.div(**govuk_accordion_options[:attributes]) do
46
+ accordion_items.each.with_index(1) { |accordion_item, index| concat(govuk_accordion_section(accordion_id, accordion_item, index, govuk_accordion_options[:heading_level])) }
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ # Generates the HTML for an accordion section, used by {govuk_accordion}
53
+ #
54
+ # @param accordion_id [String] used as an id in the HTML for the accordion
55
+ # @param index [Integer] the index of the accordion item
56
+ # @param heading_level [Integer] heading level, from 1 to 6
57
+ #
58
+ # @option accordion_item [Boolean] :expanded sets whether the section should be expanded
59
+ # when the page loads for the first time.
60
+ # @option accordion_item [String] :heading_level (2) Heading level, from 1 to 6
61
+ # @option accordion_item [String] :heading the heading text for the accordion
62
+ # @option accordion_item [String] :summary (nil) optional summary text for the accordion header
63
+ # @option accordion_item [String, ActiveSupport::SafeBuffer] the content within the accordion section
64
+ #
65
+ # @return [ActiveSupport::SafeBuffer] the HTML for an accordion section
66
+ # which is used in {govuk_accordion}
67
+
68
+ def govuk_accordion_section(accordion_id, accordion_item, index, heading_level)
69
+ tag.div(class: "govuk-accordion__section #{'govuk-accordion__section--expanded' if accordion_item[:expanded]}".rstrip) do
70
+ concat(govuk_accordion_section_header(accordion_id, accordion_item, index, heading_level))
71
+ concat(govuk_accordion_section_content(accordion_id, accordion_item, index))
72
+ end
73
+ end
74
+
75
+ # Generates the HTML for an accordion section heading, used by {govuk_accordion_section}
76
+ #
77
+ # @param (see govuk_accordion_section)
78
+ #
79
+ # @option (see govuk_accordion_section)
80
+ #
81
+ # @return [ActiveSupport::SafeBuffer] the HTML for an accordion section heading
82
+ # which is used in {govuk_accordion_section}
83
+
84
+ def govuk_accordion_section_header(accordion_id, accordion_item, index, heading_level)
85
+ tag.div(class: 'govuk-accordion__section-header') do
86
+ concat(tag.send("h#{heading_level}", class: 'govuk-accordion__section-heading') do
87
+ tag.span(accordion_item[:heading], class: 'govuk-accordion__section-button', id: "#{accordion_id}-heading-#{index}")
88
+ end)
89
+ concat(tag.div(accordion_item[:summary], class: 'govuk-accordion__section-summary govuk-body', id: "#{accordion_id}-summary-#{index}")) if accordion_item[:summary]
90
+ end
91
+ end
92
+
93
+ # Generates the HTML for an accordion sections content, used by {govuk_accordion_section}
94
+ #
95
+ # @param accordion_id [String] used as an id in the HTML for the accordion
96
+ # @param index [Integer] the index of the accordion item
97
+ #
98
+ # @option (see govuk_accordion_section)
99
+ #
100
+ # @return [ActiveSupport::SafeBuffer] the HTML for an accordion sections content
101
+ # which is used in {govuk_accordion_section}
102
+
103
+ def govuk_accordion_section_content(accordion_id, accordion_item, index)
104
+ tag.div(class: 'govuk-accordion__section-content', id: "#{accordion_id}-content-#{index}", aria: { labelledby: "#{accordion_id}-heading-#{index}" }) do
105
+ if accordion_item[:content].is_a? ActiveSupport::SafeBuffer
106
+ accordion_item[:content]
107
+ else
108
+ tag.p(accordion_item[:content], class: 'govuk-body')
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'action_view'
4
+
5
+ require_relative '../shared_methods'
6
+
7
+ module CCS
8
+ module FrontendHelpers
9
+ module GovUKFrontend
10
+ # = GOV.UK Back Link
11
+ #
12
+ # This helper is used for generating the back link component from the
13
+ # {https://design-system.service.gov.uk/components/back-link GDS - Components - Back link}
14
+
15
+ module BackLink
16
+ include SharedMethods
17
+ include ActionView::Helpers::UrlHelper
18
+
19
+ # Generates the HTML for the GOV.UK Back link component
20
+ #
21
+ # @param text [String] the text for the back link
22
+ # @param href [String] the href for the back link
23
+ # @param govuk_back_link_options [Hash] options that will be used in customising the HTML
24
+ #
25
+ # @option govuk_back_link_options [String] :classes additional CSS classes for the back link HTML
26
+ # @option govuk_back_link_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
27
+ #
28
+ # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Back link
29
+ # which can then be rendered on the page
30
+
31
+ def govuk_back_link(text, href, **govuk_back_link_options)
32
+ initialise_attributes_and_set_classes(govuk_back_link_options, 'govuk-back-link')
33
+
34
+ link_to(text, href, **govuk_back_link_options[:attributes])
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end