katalyst-govuk-formbuilder 1.10.2 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -0
  3. data/app/assets/builds/katalyst/govuk/formbuilder.css +30 -30
  4. data/app/assets/stylesheets/katalyst/govuk/components/combobox/_index.scss +100 -0
  5. data/app/assets/stylesheets/katalyst/govuk/components/richtextarea/_index.scss +3 -4
  6. data/lib/katalyst/govuk/formbuilder/builder.rb +41 -1
  7. data/lib/katalyst/govuk/formbuilder/elements/combobox.rb +60 -0
  8. data/node_modules/govuk-frontend/dist/govuk/components/_index.scss +1 -0
  9. data/node_modules/govuk-frontend/dist/govuk/components/accordion/_index.scss +35 -31
  10. data/node_modules/govuk-frontend/dist/govuk/components/character-count/_index.scss +4 -4
  11. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/_index.scss +6 -1
  12. data/node_modules/govuk-frontend/dist/govuk/components/cookie-banner/_index.scss +16 -13
  13. data/node_modules/govuk-frontend/dist/govuk/components/date-input/_index.scss +1 -2
  14. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/_index.scss +4 -0
  15. data/node_modules/govuk-frontend/dist/govuk/components/fieldset/_index.scss +3 -5
  16. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/_index.scss +8 -9
  17. data/node_modules/govuk-frontend/dist/govuk/components/header/_index.scss +8 -0
  18. data/node_modules/govuk-frontend/dist/govuk/components/input/_index.scss +7 -4
  19. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/_index.scss +3 -2
  20. data/node_modules/govuk-frontend/dist/govuk/components/pagination/_index.scss +24 -37
  21. data/node_modules/govuk-frontend/dist/govuk/components/panel/_index.scss +13 -9
  22. data/node_modules/govuk-frontend/dist/govuk/components/password-input/_index.scss +12 -9
  23. data/node_modules/govuk-frontend/dist/govuk/components/phase-banner/_index.scss +0 -8
  24. data/node_modules/govuk-frontend/dist/govuk/components/radios/_index.scss +7 -5
  25. data/node_modules/govuk-frontend/dist/govuk/components/select/_index.scss +5 -5
  26. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_index.scss +162 -0
  27. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_service-navigation.scss +4 -0
  28. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/_index.scss +6 -4
  29. data/node_modules/govuk-frontend/dist/govuk/components/summary-list/_index.scss +2 -1
  30. data/node_modules/govuk-frontend/dist/govuk/components/tag/_index.scss +11 -8
  31. data/node_modules/govuk-frontend/dist/govuk/components/task-list/_index.scss +12 -10
  32. data/node_modules/govuk-frontend/dist/govuk/components/textarea/_index.scss +3 -3
  33. data/node_modules/govuk-frontend/dist/govuk/components/warning-text/_index.scss +2 -2
  34. data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +1 -1
  35. data/node_modules/govuk-frontend/dist/govuk/helpers/_colour.scss +44 -8
  36. data/node_modules/govuk-frontend/dist/govuk/helpers/_grid.scss +1 -1
  37. data/node_modules/govuk-frontend/dist/govuk/helpers/_links.scss +2 -2
  38. data/node_modules/govuk-frontend/dist/govuk/helpers/_shape-arrow.scss +1 -1
  39. data/node_modules/govuk-frontend/dist/govuk/helpers/_typography.scss +17 -0
  40. data/node_modules/govuk-frontend/dist/govuk/helpers/_visually-hidden.scss +30 -62
  41. data/node_modules/govuk-frontend/dist/govuk/overrides/_typography.scss +5 -1
  42. data/node_modules/govuk-frontend/dist/govuk/settings/_colours-organisations.scss +235 -9
  43. metadata +7 -4
  44. data/app/assets/stylesheets/katalyst/govuk/components/richtextarea/_richtextarea.scss +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e79ac6a3af6144f42fe879e01703e1d7ba5f56616f245ae3224ad2ad146445b3
4
- data.tar.gz: d03cb6a9f1b339bb2e2e8e302e2f955352d36587117f4cd3351c44921c155009
3
+ metadata.gz: 2d371dc77a725f4e009f3a0a61e75d085f3080bad8cb64857299a3a7264fb95e
4
+ data.tar.gz: 392fcc8460909ba2a4190352a15cdd536a5e5e6e3d3ce896ae874a56a5aebef6
5
5
  SHA512:
6
- metadata.gz: 235fc122738b7aeee77dcc262b9a9988008fabd4f54b00c683406ae92b73c1818f9d150d702e3058de2ef02ccc6d9ca493720c2bd6bff0cd29b76e36afb9b9bb
7
- data.tar.gz: b585ddf72b1160a06651c4840e4ca382173b5670348f45b9024fae253fc4bc9fac85acc39bf0cc57afa2e52cc77c938b5cb52d3617d4d8c8f6974eb259e62efd
6
+ metadata.gz: cefbeb3e8423be0a86e33b324f59a3745aab8fd7e8a150a9e0be5dc4f874378108253db1f722c68b67defc3d96606db4dcef6576684f895445463cd905bf7f43
7
+ data.tar.gz: 8d688517167cc77a120aa50ac7d5e101524e8478c381071d603f650e303cc17ed9b0ea802cb6be15859717a2555f30589868768e55f7848df5c4072cdec87c04
data/README.md CHANGED
@@ -27,6 +27,12 @@ Add the stylesheet to your default layout:
27
27
  <%= stylesheet_link_tag "katalyst/govuk/formbuilder" %>
28
28
  ```
29
29
 
30
+ You can also add it to your SASS build:
31
+
32
+ ```scss
33
+ @use "katalyst/govuk/formbuilder";
34
+ ```
35
+
30
36
  Some GOVUK components require javascript enhancements
31
37
  (see [GOVUK docs](https://frontend.design-system.service.gov.uk/get-started/#5-get-the-javascript-working)).
32
38
 
@@ -43,6 +49,30 @@ You'll need to include the helper to make this method available, which you can a
43
49
  helper Katalyst::GOVUK::Formbuilder::Frontend
44
50
  ```
45
51
 
52
+ ## Extensions
53
+
54
+ We include some optional extensions for integrating with gems that we (Katalyst) commonly use.
55
+
56
+ These require additional steps to use.
57
+
58
+ ### Hotwire Combobox
59
+
60
+ [Hotwire Combobox](https://hotwirecombobox.com) is a promising option for adding asynchronous multi-select inputs to
61
+ Rails forms. We're assuming importmaps and Turbo if this option is used.
62
+
63
+ There's no explicit dependency so if you want to use this input you'll need to add:
64
+
65
+ ```
66
+ gem "hotwire_combobox"
67
+ ```
68
+
69
+ JS is added by the gem automatically (via importmaps), but you'll need to explicitly add CSS:
70
+
71
+ ```scss
72
+ @use "katalyst/govuk/formbuilder";
73
+ @use "katalyst/govuk/components/combobox";
74
+ ```
75
+
46
76
  ## Contributing
47
77
 
48
78
  Bug reports and pull requests are welcome on GitHub at https://github.com/katalyst/govuk-formbuilder.
@@ -43,7 +43,7 @@
43
43
 
44
44
 
45
45
  :root {
46
- --govuk-frontend-version: "5.4.0";
46
+ --govuk-frontend-version: "5.6.0";
47
47
  --govuk-frontend-breakpoint-mobile: 20rem;
48
48
  --govuk-frontend-breakpoint-tablet: 40.0625rem;
49
49
  --govuk-frontend-breakpoint-desktop: 48.0625rem;
@@ -1365,7 +1365,7 @@
1365
1365
  border-radius: 0;
1366
1366
  color: #ffffff;
1367
1367
  background-color: #00703c;
1368
- box-shadow: 0 2px 0 #002d18;
1368
+ box-shadow: 0 2px 0 rgb(0, 44.8, 24);
1369
1369
  text-align: center;
1370
1370
  vertical-align: top;
1371
1371
  cursor: pointer;
@@ -1407,7 +1407,7 @@
1407
1407
  border: 0;
1408
1408
  }
1409
1409
  .govuk-button:hover {
1410
- background-color: #005a30;
1410
+ background-color: rgb(0, 89.6, 48);
1411
1411
  }
1412
1412
  .govuk-button:active {
1413
1413
  top: 2px;
@@ -1446,18 +1446,18 @@
1446
1446
  }
1447
1447
  .govuk-button[disabled]:active {
1448
1448
  top: 0;
1449
- box-shadow: 0 2px 0 #002d18;
1449
+ box-shadow: 0 2px 0 rgb(0, 44.8, 24);
1450
1450
  }
1451
1451
 
1452
1452
  .govuk-button--secondary {
1453
1453
  background-color: #f3f2f1;
1454
- box-shadow: 0 2px 0 #929191;
1454
+ box-shadow: 0 2px 0 rgb(145.8, 145.2, 144.6);
1455
1455
  }
1456
1456
  .govuk-button--secondary, .govuk-button--secondary:link, .govuk-button--secondary:visited, .govuk-button--secondary:active, .govuk-button--secondary:hover {
1457
1457
  color: #0b0c0c;
1458
1458
  }
1459
1459
  .govuk-button--secondary:hover {
1460
- background-color: #dbdad9;
1460
+ background-color: rgb(218.7, 217.8, 216.9);
1461
1461
  }
1462
1462
  .govuk-button--secondary:hover[disabled] {
1463
1463
  background-color: #f3f2f1;
@@ -1465,13 +1465,13 @@
1465
1465
 
1466
1466
  .govuk-button--warning {
1467
1467
  background-color: #d4351c;
1468
- box-shadow: 0 2px 0 #55150b;
1468
+ box-shadow: 0 2px 0 rgb(84.8, 21.2, 11.2);
1469
1469
  }
1470
1470
  .govuk-button--warning, .govuk-button--warning:link, .govuk-button--warning:visited, .govuk-button--warning:active, .govuk-button--warning:hover {
1471
1471
  color: #ffffff;
1472
1472
  }
1473
1473
  .govuk-button--warning:hover {
1474
- background-color: #aa2a16;
1474
+ background-color: rgb(169.6, 42.4, 22.4);
1475
1475
  }
1476
1476
  .govuk-button--warning:hover[disabled] {
1477
1477
  background-color: #d4351c;
@@ -1479,13 +1479,13 @@
1479
1479
 
1480
1480
  .govuk-button--inverse {
1481
1481
  background-color: #ffffff;
1482
- box-shadow: 0 2px 0 #144e81;
1482
+ box-shadow: 0 2px 0 rgb(20.3, 78.4, 128.8);
1483
1483
  }
1484
1484
  .govuk-button--inverse, .govuk-button--inverse:link, .govuk-button--inverse:visited, .govuk-button--inverse:active, .govuk-button--inverse:hover {
1485
1485
  color: #1d70b8;
1486
1486
  }
1487
1487
  .govuk-button--inverse:hover {
1488
- background-color: #e8f1f8;
1488
+ background-color: rgb(232.4, 240.7, 247.9);
1489
1489
  }
1490
1490
  .govuk-button--inverse:hover[disabled] {
1491
1491
  background-color: #ffffff;
@@ -1958,8 +1958,8 @@
1958
1958
 
1959
1959
  .govuk-checkboxes__conditional {
1960
1960
  margin-bottom: 15px;
1961
- margin-left: 18px;
1962
- padding-left: 33px;
1961
+ margin-left: 20px;
1962
+ padding-left: 35px;
1963
1963
  border-left: 4px solid #b1b4b6;
1964
1964
  }
1965
1965
  @media (min-width: 40.0625em) {
@@ -2003,6 +2003,10 @@
2003
2003
  margin-left: 10px;
2004
2004
  padding-left: 20px;
2005
2005
  }
2006
+ .govuk-checkboxes--small .govuk-checkboxes__divider {
2007
+ width: 24px;
2008
+ margin-bottom: 5px;
2009
+ }
2006
2010
  .govuk-checkboxes--small .govuk-checkboxes__item:hover .govuk-checkboxes__input:not(:disabled) + .govuk-checkboxes__label::before {
2007
2011
  outline: 3px dashed transparent;
2008
2012
  outline-offset: 1px;
@@ -2330,6 +2334,9 @@
2330
2334
  margin-top: 20px;
2331
2335
  }
2332
2336
  }
2337
+ .govuk-error-summary__body > :last-child {
2338
+ margin-bottom: 5px;
2339
+ }
2333
2340
 
2334
2341
  .govuk-error-summary__list {
2335
2342
  margin-bottom: 0;
@@ -2373,7 +2380,7 @@
2373
2380
  color: #d4351c;
2374
2381
  }
2375
2382
  .govuk-error-summary__list a:hover {
2376
- color: #942514;
2383
+ color: rgb(148.4, 37.1, 19.6);
2377
2384
  }
2378
2385
  .govuk-error-summary__list a:active {
2379
2386
  color: #d4351c;
@@ -2592,8 +2599,8 @@
2592
2599
 
2593
2600
  .govuk-radios__conditional {
2594
2601
  margin-bottom: 15px;
2595
- margin-left: 18px;
2596
- padding-left: 33px;
2602
+ margin-left: 20px;
2603
+ padding-left: 35px;
2597
2604
  border-left: 4px solid #b1b4b6;
2598
2605
  }
2599
2606
  @media (min-width: 40.0625em) {
@@ -2817,34 +2824,22 @@
2817
2824
  content: " ";
2818
2825
  }
2819
2826
 
2820
- .govuk-visually-hidden-focusable {
2827
+ .govuk-visually-hidden-focusable:not(:active):not(:focus) {
2821
2828
  position: absolute !important;
2822
2829
  width: 1px !important;
2823
2830
  height: 1px !important;
2824
2831
  margin: 0 !important;
2832
+ padding: 0 !important;
2825
2833
  overflow: hidden !important;
2826
2834
  clip: rect(0 0 0 0) !important;
2827
2835
  -webkit-clip-path: inset(50%) !important;
2828
2836
  clip-path: inset(50%) !important;
2837
+ border: 0 !important;
2829
2838
  white-space: nowrap !important;
2830
2839
  -webkit-user-select: none;
2831
2840
  -ms-user-select: none;
2832
2841
  user-select: none;
2833
2842
  }
2834
- .govuk-visually-hidden-focusable:active, .govuk-visually-hidden-focusable:focus {
2835
- position: static !important;
2836
- width: auto !important;
2837
- height: auto !important;
2838
- margin: inherit !important;
2839
- overflow: visible !important;
2840
- clip: auto !important;
2841
- -webkit-clip-path: none !important;
2842
- clip-path: none !important;
2843
- white-space: inherit !important;
2844
- -webkit-user-select: text;
2845
- -ms-user-select: text;
2846
- user-select: text;
2847
- }
2848
2843
 
2849
2844
 
2850
2845
 
@@ -4132,6 +4127,11 @@
4132
4127
  font-variant-numeric: tabular-nums !important;
4133
4128
  }
4134
4129
 
4130
+ .govuk-\!-text-break-word {
4131
+ word-wrap: break-word !important;
4132
+ overflow-wrap: break-word !important;
4133
+ }
4134
+
4135
4135
 
4136
4136
  .govuk-\!-width-full {
4137
4137
  width: 100% !important;
@@ -0,0 +1,100 @@
1
+ // assumes that hotwire_combobox is in the load paths, implies dartsass-rails is the compiler
2
+ @use "hotwire_combobox";
3
+
4
+ @import "govuk-frontend/dist/govuk/base";
5
+ @import "govuk-frontend/dist/govuk/components/error-message/index";
6
+ @import "govuk-frontend/dist/govuk/components/hint/index";
7
+ @import "govuk-frontend/dist/govuk/components/label/index";
8
+
9
+ // Based on components/select
10
+ @include govuk-exports("govuk/component/combobox") {
11
+ .hw-combobox:has(.govuk-combobox) {
12
+ --hw-border-radius: 0;
13
+ --hw-border-width--slim: #{$govuk-border-width-form-element};
14
+ --hw-border-color: #{$govuk-input-border-colour};
15
+ --hw-focus-color: #{$govuk-focus-colour};
16
+ --hw-combobox-width: 100%;
17
+ --hw-combobox-width--multiple: 100%;
18
+ --hw-active-bg-color: #{govuk-colour("blue")};
19
+ --hw-padding--slim: #{govuk-spacing(1)};
20
+ --hw-padding--slimmer: #{govuk-spacing(1)};
21
+ --hw-padding--thick: #{govuk-spacing(1)};
22
+ --hw-font-size: 1rem;
23
+ --hw-line-height: 1.25;
24
+
25
+ display: flex;
26
+
27
+ .hw-combobox__main__wrapper {
28
+ // This min-width was chosen because:
29
+ // - it makes the Select wider than it is tall (which is what users expect)
30
+ // - 11.5em matches the 'length-10' variant of the input component
31
+ // - it fits comfortably on screens as narrow as 240px wide
32
+ min-width: 11.5em;
33
+ max-width: var(--text-width, 100%);
34
+
35
+ display: flex;
36
+ min-height: 2.5rem;
37
+ align-items: center;
38
+
39
+ // Default user agent colours for selects can have low contrast,
40
+ // and may look disabled (#2435)
41
+ color: $govuk-text-colour;
42
+ background-color: govuk-colour("white");
43
+ }
44
+
45
+ .hw-combobox__main__wrapper:focus-within {
46
+ outline: $govuk-focus-width solid $govuk-focus-colour;
47
+ // Ensure outline appears outside of the element
48
+ outline-offset: 0;
49
+ // Double the border by adding its width again. Use `box-shadow` to do
50
+ // this instead of changing `border-width` (which changes element size)
51
+ // and since `outline` is already used for the yellow focus state.
52
+ box-shadow: inset 0 0 0 $govuk-border-width-form-element;
53
+ }
54
+
55
+ .govuk-combobox {
56
+ @include govuk-font($size: 16, $line-height: 1.25);
57
+
58
+ // override input styles from form/govuk
59
+ border: none;
60
+ outline: none;
61
+ box-shadow: none;
62
+ width: 100%;
63
+ padding: 0;
64
+ height: unset;
65
+ }
66
+
67
+ // disabled
68
+ &:has(.govuk-combobox:disabled) {
69
+ opacity: 0.5;
70
+ color: inherit;
71
+ cursor: not-allowed;
72
+ }
73
+
74
+ // extend existing hover/active styles (--hw-active-bg-color)
75
+ .hw-combobox__option:hover,
76
+ .hw-combobox__option--navigated,
77
+ .hw-combobox__option--selected {
78
+ color: govuk-colour("white");
79
+ }
80
+
81
+ .hw-combobox__dialog__input {
82
+ width: 100%;
83
+ }
84
+
85
+ .hw-combobox__listbox {
86
+ left: -$govuk-border-width-form-element;
87
+ right: -$govuk-border-width-form-element;
88
+ top: calc(100% + $govuk-border-width-form-element * 2 + 0.2rem);
89
+ width: unset;
90
+ }
91
+ }
92
+
93
+ .govuk-combobox--error {
94
+ border-color: $govuk-error-colour;
95
+
96
+ .hw-combobox__main__wrapper:focus-within {
97
+ border-color: $govuk-input-border-colour;
98
+ }
99
+ }
100
+ }
@@ -2,12 +2,11 @@
2
2
  @import "govuk-frontend/dist/govuk/components/hint/index";
3
3
  @import "govuk-frontend/dist/govuk/components/label/index";
4
4
 
5
- // Based on components/textarea
6
5
  @include govuk-exports("govuk/component/richtextarea") {
7
6
  .govuk-richtextarea {
8
7
  @include govuk-font($size: 19, $line-height: 1.25);
9
8
 
10
- box-sizing: border-box; // should this be global?
9
+ box-sizing: border-box;
11
10
  display: block;
12
11
  width: 100%;
13
12
  // min-height inherited from trix-editor styles
@@ -26,8 +25,8 @@
26
25
  // Ensure outline appears outside of the element
27
26
  outline-offset: 0;
28
27
  // Double the border by adding its width again. Use `box-shadow` to do
29
- // this instead of changing `border-width` (which changes element size) and
30
- // since `outline` is already used for the yellow focus state.
28
+ // this instead of changing `border-width` (which changes element size)
29
+ // and since `outline` is already used for the yellow focus state.
31
30
  box-shadow: inset 0 0 0 $govuk-border-width-form-element;
32
31
  }
33
32
 
@@ -157,7 +157,7 @@ module Katalyst
157
157
  # @param form_group [Hash] configures the form group
158
158
  # @option form_group classes [Array,String] sets the form group's classes
159
159
  # @option form_group kwargs [Hash] additional attributes added to the form group
160
- # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
160
+ # @param & [Block] arbitrary HTML that will be rendered between the hint and the input
161
161
  # @return [ActiveSupport::SafeBuffer] HTML output
162
162
  #
163
163
  # @example A rich text area with injected content
@@ -186,6 +186,46 @@ module Katalyst
186
186
  ).html
187
187
  end
188
188
 
189
+ # Generates a +combobox+ element that uses Hotwire Combobox to generate a combobox selection element.
190
+ # @see https://hotwirecombobox.com
191
+ # @see https://github.com/josefarias/hotwire_combobox
192
+ #
193
+ # @param attribute_name [Symbol] The name of the attribute
194
+ # @param options_or_src [Array] The +option+ values or a source path for async combobox
195
+ # @param options [Hash] Options hash passed through to the +combobox+ helper
196
+ # @param hint [Hash,Proc] The content of the hint. No hint will be added if 'text' is left +nil+.
197
+ # When a +Proc+ is supplied the hint will be wrapped in a +div+ instead of a +span+
198
+ # @option hint text [String] the hint text
199
+ # @option hint kwargs [Hash] additional arguments are applied as attributes to the hint
200
+ # @param label [Hash,Proc] configures or sets the associated label content
201
+ # @option label text [String] the label text
202
+ # @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
203
+ # @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
204
+ # @option label hidden [Boolean] control the visibility of the label.
205
+ # Hidden labels will still be read by screenreaders
206
+ # @option label kwargs [Hash] additional arguments are applied as attributes on the +label+ element
207
+ # @param form_group [Hash] configures the form group
208
+ # @option form_group kwargs [Hash] additional attributes added to the form group
209
+ # @return [ActiveSupport::SafeBuffer] HTML output
210
+ #
211
+ # @example A combobox that allows the user to choose from a list of states
212
+ #
213
+ # = f.combobox "state", State.all
214
+ #
215
+ # @example A combobox that allows the user to choose from an asynchronous states endpoint
216
+ #
217
+ # = f.combobox "state", states_path
218
+ #
219
+ # @example A multi-select combobox that allows the user to choose multiple states
220
+ #
221
+ # = f.combobox "state", State.all, multiselect_chip_src: states_chips_path
222
+ #
223
+ def govuk_combobox(attribute_name, options_or_src = [], options: {}, label: {}, hint: {}, form_group: {},
224
+ caption: {}, **, &)
225
+ Elements::Combobox.new(self, object_name, attribute_name, options_or_src,
226
+ options:, label:, hint:, form_group:, caption:, **, &).html
227
+ end
228
+
189
229
  # Keep track of whether we are inside a fieldset
190
230
  # This allows labels to default to bold ("s") normally but use the default otherwise
191
231
  def fieldset_context
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "govuk_design_system_formbuilder"
4
+
5
+ module Katalyst
6
+ module GOVUK
7
+ module Formbuilder
8
+ module Elements
9
+ class Combobox < GOVUKDesignSystemFormBuilder::Base
10
+ include GOVUKDesignSystemFormBuilder::Traits::Error
11
+ include GOVUKDesignSystemFormBuilder::Traits::Label
12
+ include GOVUKDesignSystemFormBuilder::Traits::Hint
13
+ include GOVUKDesignSystemFormBuilder::Traits::HTMLAttributes
14
+
15
+ def initialize(builder, object_name, attribute_name, options_or_src, options:, form_group:, label:, hint:,
16
+ caption:, **kwargs, &block)
17
+ super(builder, object_name, attribute_name)
18
+ @block = block
19
+
20
+ @form_group = form_group
21
+ @hint = hint
22
+ @label = label
23
+ @caption = caption
24
+ @options_or_src = options_or_src
25
+ @options = options
26
+ @html_attributes = kwargs
27
+ end
28
+
29
+ def html
30
+ GOVUKDesignSystemFormBuilder::Containers::FormGroup.new(*bound, **@form_group).html do
31
+ safe_join([label_element, hint_element, error_element, combobox])
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def combobox
38
+ @builder.combobox(@attribute_name, @options_or_src, **@options, **attributes(@html_attributes), &@block)
39
+ end
40
+
41
+ def options
42
+ {
43
+ id: field_id(link_errors: true),
44
+ class: classes,
45
+ aria: { describedby: combine_references(hint_id, error_id) },
46
+ }
47
+ end
48
+
49
+ def classes
50
+ combine_references(%(#{brand}-combobox), error_class)
51
+ end
52
+
53
+ def error_class
54
+ %(#{brand}-combobox--error) if has_errors?
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -27,6 +27,7 @@
27
27
  @import "phase-banner/index";
28
28
  @import "radios/index";
29
29
  @import "select/index";
30
+ @import "service-navigation/index";
30
31
  @import "skip-link/index";
31
32
  @import "summary-list/index";
32
33
  @import "table/index";
@@ -102,9 +102,9 @@
102
102
  &:hover {
103
103
  color: $govuk-accordion-base-colour;
104
104
  background: $govuk-accordion-hover-colour;
105
- // The GOV.UK Design System focus state adds a box-shadow to the top and bottom of the
106
- // button. We add a grey box-shadow on hover too, to make the height of the hover state
107
- // match the height of the focus state.
105
+ // The focus state adds a box-shadow to the top and bottom of the
106
+ // button. We add a grey box-shadow on hover too, to make the height of
107
+ // the hover state match the height of the focus state.
108
108
  box-shadow:
109
109
  0 -2px $govuk-accordion-hover-colour,
110
110
  0 4px $govuk-accordion-hover-colour;
@@ -147,7 +147,7 @@
147
147
 
148
148
  position: relative;
149
149
 
150
- // Set size using rems to make the icon scale with text if user resizes text in their browser
150
+ // Set size using rems so icon scales with text
151
151
  width: govuk-px-to-rem(20px);
152
152
  height: govuk-px-to-rem(20px);
153
153
 
@@ -184,14 +184,15 @@
184
184
  .govuk-accordion__section-button {
185
185
  width: 100%;
186
186
 
187
- padding: govuk-spacing(2) 0 0 0;
187
+ padding: govuk-spacing(2) 0 0;
188
188
 
189
189
  border: 0;
190
190
 
191
191
  border-top: $govuk-accordion-bottom-border-width solid $govuk-border-colour;
192
192
 
193
- // Visually separate the section from the one underneath when user changes colours in their
194
- // browser. See https://github.com/alphagov/govuk-frontend/issues/2321#issuecomment-924201488
193
+ // Visually separate the section from the one underneath when user changes
194
+ // colours in their browser. See
195
+ // https://github.com/alphagov/govuk-frontend/issues/2321#issuecomment-924201488
195
196
  border-bottom: govuk-spacing(2) solid transparent;
196
197
 
197
198
  color: $govuk-text-colour;
@@ -230,8 +231,8 @@
230
231
  }
231
232
 
232
233
  &:focus {
233
- // Remove default focus border around button as
234
- // styling is being applied to inner text elements that receive focus
234
+ // Remove default focus border around button as styling is being applied
235
+ // to inner text elements that receive focus
235
236
  outline: 0;
236
237
 
237
238
  .govuk-accordion__section-heading-text-focus,
@@ -257,9 +258,10 @@
257
258
  }
258
259
  }
259
260
 
260
- // Remove the transparent border when the section is expanded to make it clear that the heading
261
- // relates to the content below. Adjust padding to maintain the height of the element.
262
- // See https://github.com/alphagov/govuk-frontend/pull/2257#issuecomment-951920798
261
+ // Remove the transparent border when the section is expanded to make it
262
+ // clear that the heading relates to the content below. Adjust padding to
263
+ // maintain the height of the element. See
264
+ // https://github.com/alphagov/govuk-frontend/pull/2257#issuecomment-951920798
263
265
  .govuk-accordion__section--expanded .govuk-accordion__section-button {
264
266
  padding-bottom: govuk-spacing(3);
265
267
  border-bottom: 0;
@@ -269,8 +271,8 @@
269
271
  }
270
272
  }
271
273
 
272
- // As Chevron icon is vertically aligned it overlaps with the focus state bottom border
273
- // Styling adds some spacing
274
+ // As Chevron icon is vertically aligned it overlaps with the focus state
275
+ // bottom border – this adds some spacing
274
276
  .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
275
277
  padding-bottom: 3px;
276
278
 
@@ -299,9 +301,9 @@
299
301
  color: $govuk-link-colour;
300
302
  }
301
303
 
302
- // Add space between the icon and text.
303
- // Avoid applying spacing directly to the icon as the use of `transform` will change the
304
- // placement of any margins.
304
+ // Add space between the icon and text. Avoid applying spacing directly to
305
+ // the icon as the use of `transform` will change the placement of any
306
+ // margins.
305
307
  .govuk-accordion__show-all-text,
306
308
  .govuk-accordion__section-toggle-text {
307
309
  margin-left: govuk-spacing(1);
@@ -310,23 +312,25 @@
310
312
 
311
313
  // Background colour adjustment when user changes colours in Firefox
312
314
  //
313
- // When user changes colours in Firefox, text colour inside <button> is always black
314
- // (regardless of the custom colours the user has set). This is fine when the text in the
315
- // button is not nested inside another element because when user changes colours in Firefox,
316
- // the immediate background colour of buttons is always white (again, regardless of user's
317
- // custom colours).
315
+ // When user changes colours in Firefox, text colour inside <button> is
316
+ // always black (regardless of the custom colours the user has set). This is
317
+ // fine when the text in the button is not nested inside another element
318
+ // because when user changes colours in Firefox, the immediate background
319
+ // colour of buttons is always white (again, regardless of user's custom
320
+ // colours).
318
321
  //
319
- // However, when the text inside <button> is wrapped inside another element AND that element
320
- // sets a background colour, the text colour is still black but the background of that nested
321
- // element gets the user's custom background colour. When the custom background is a lighter
322
- // hue, the contrast might be sufficient. But if the user's custom background colour is a
323
- // darker colour, the contrast with the text might not be sufficient.
322
+ // However, when the text inside <button> is wrapped inside another element
323
+ // AND that element sets a background colour, the text colour is still black
324
+ // but the background of that nested element gets the user's custom
325
+ // background colour. When the custom background is a lighter hue, the
326
+ // contrast might be sufficient. But if the user's custom background colour
327
+ // is a darker colour, the contrast with the text might not be sufficient.
324
328
  //
325
- // To ensure sufficient contrast, override the background colour set by the focus state on the
326
- // nested elements to be transparent.
329
+ // To ensure sufficient contrast, override the background colour set by the
330
+ // focus state on the nested elements to be transparent.
327
331
  //
328
- // Also override the background colour of the Show/Hide chevrons which set a background colour
329
- // on hover.
332
+ // Also override the background colour of the Show/Hide chevrons which set a
333
+ // background colour on hover.
330
334
  @media screen and (forced-colors: active) {
331
335
  .govuk-accordion__show-all:hover,
332
336
  .govuk-accordion__section-button:hover {
@@ -19,10 +19,10 @@
19
19
  margin-bottom: 0;
20
20
 
21
21
  &::after {
22
- // Zero-width space that will reserve vertical space when no hint is provided
23
- // as:
24
- // - setting a min-height is not possible without a magic number
25
- // because the line-height is set by the `govuk-font` call above
22
+ // Zero-width space that will reserve vertical space when no hint is
23
+ // provided as:
24
+ // - setting a min-height is not possible without a magic number because
25
+ // the line-height is set by the `govuk-font` call above
26
26
  // - using `:empty` is not possible as the hint macro outputs line breaks
27
27
  content: "\200B";
28
28
  }
@@ -159,7 +159,7 @@
159
159
  // to be an even number in order to be centred under the 40px checkbox or radio.
160
160
  $conditional-border-width: $govuk-border-width-narrow;
161
161
  // Calculate the amount of padding needed to keep the border centered against the checkbox.
162
- $conditional-border-padding: ($govuk-checkboxes-size / 2) - ($conditional-border-width / 2);
162
+ $conditional-border-padding: ($govuk-touch-target-size / 2) - ($conditional-border-width / 2);
163
163
  // Move the border centered with the checkbox
164
164
  $conditional-margin-left: $conditional-border-padding;
165
165
  // Move the contents of the conditional inline with the label
@@ -255,6 +255,11 @@
255
255
  padding-left: ($govuk-touch-target-size - $input-offset) - ($margin-left + $conditional-border-width);
256
256
  }
257
257
 
258
+ .govuk-checkboxes__divider {
259
+ width: $govuk-small-checkboxes-size;
260
+ margin-bottom: govuk-spacing(1);
261
+ }
262
+
258
263
  // Hover state for small checkboxes.
259
264
  //
260
265
  // We use a hover state for small checkboxes because the touch target size