katalyst-govuk-formbuilder 1.10.2 → 1.12.0

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 (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