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.
- checksums.yaml +4 -4
- data/README.md +30 -0
- data/app/assets/builds/katalyst/govuk/formbuilder.css +30 -30
- data/app/assets/stylesheets/katalyst/govuk/components/combobox/_index.scss +100 -0
- data/app/assets/stylesheets/katalyst/govuk/components/richtextarea/_index.scss +3 -4
- data/lib/katalyst/govuk/formbuilder/builder.rb +41 -1
- data/lib/katalyst/govuk/formbuilder/elements/combobox.rb +60 -0
- data/node_modules/govuk-frontend/dist/govuk/components/_index.scss +1 -0
- data/node_modules/govuk-frontend/dist/govuk/components/accordion/_index.scss +35 -31
- data/node_modules/govuk-frontend/dist/govuk/components/character-count/_index.scss +4 -4
- data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/_index.scss +6 -1
- data/node_modules/govuk-frontend/dist/govuk/components/cookie-banner/_index.scss +16 -13
- data/node_modules/govuk-frontend/dist/govuk/components/date-input/_index.scss +1 -2
- data/node_modules/govuk-frontend/dist/govuk/components/error-summary/_index.scss +4 -0
- data/node_modules/govuk-frontend/dist/govuk/components/fieldset/_index.scss +3 -5
- data/node_modules/govuk-frontend/dist/govuk/components/file-upload/_index.scss +8 -9
- data/node_modules/govuk-frontend/dist/govuk/components/header/_index.scss +8 -0
- data/node_modules/govuk-frontend/dist/govuk/components/input/_index.scss +7 -4
- data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/_index.scss +3 -2
- data/node_modules/govuk-frontend/dist/govuk/components/pagination/_index.scss +24 -37
- data/node_modules/govuk-frontend/dist/govuk/components/panel/_index.scss +13 -9
- data/node_modules/govuk-frontend/dist/govuk/components/password-input/_index.scss +12 -9
- data/node_modules/govuk-frontend/dist/govuk/components/phase-banner/_index.scss +0 -8
- data/node_modules/govuk-frontend/dist/govuk/components/radios/_index.scss +7 -5
- data/node_modules/govuk-frontend/dist/govuk/components/select/_index.scss +5 -5
- data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_index.scss +162 -0
- data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_service-navigation.scss +4 -0
- data/node_modules/govuk-frontend/dist/govuk/components/skip-link/_index.scss +6 -4
- data/node_modules/govuk-frontend/dist/govuk/components/summary-list/_index.scss +2 -1
- data/node_modules/govuk-frontend/dist/govuk/components/tag/_index.scss +11 -8
- data/node_modules/govuk-frontend/dist/govuk/components/task-list/_index.scss +12 -10
- data/node_modules/govuk-frontend/dist/govuk/components/textarea/_index.scss +3 -3
- data/node_modules/govuk-frontend/dist/govuk/components/warning-text/_index.scss +2 -2
- data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +1 -1
- data/node_modules/govuk-frontend/dist/govuk/helpers/_colour.scss +44 -8
- data/node_modules/govuk-frontend/dist/govuk/helpers/_grid.scss +1 -1
- data/node_modules/govuk-frontend/dist/govuk/helpers/_links.scss +2 -2
- data/node_modules/govuk-frontend/dist/govuk/helpers/_shape-arrow.scss +1 -1
- data/node_modules/govuk-frontend/dist/govuk/helpers/_typography.scss +17 -0
- data/node_modules/govuk-frontend/dist/govuk/helpers/_visually-hidden.scss +30 -62
- data/node_modules/govuk-frontend/dist/govuk/overrides/_typography.scss +5 -1
- data/node_modules/govuk-frontend/dist/govuk/settings/_colours-organisations.scss +235 -9
- metadata +7 -4
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d371dc77a725f4e009f3a0a61e75d085f3080bad8cb64857299a3a7264fb95e
|
4
|
+
data.tar.gz: 392fcc8460909ba2a4190352a15cdd536a5e5e6e3d3ce896ae874a56a5aebef6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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
|
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:
|
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
|
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
|
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:
|
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
|
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:
|
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
|
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:
|
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:
|
1962
|
-
padding-left:
|
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:
|
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:
|
2596
|
-
padding-left:
|
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;
|
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)
|
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
|
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
|
@@ -102,9 +102,9 @@
|
|
102
102
|
&:hover {
|
103
103
|
color: $govuk-accordion-base-colour;
|
104
104
|
background: $govuk-accordion-hover-colour;
|
105
|
-
// The
|
106
|
-
// button. We add a grey box-shadow on hover too, to make the height of
|
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
|
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
|
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
|
194
|
-
// browser. See
|
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
|
-
//
|
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
|
261
|
-
// relates to the content below. Adjust padding to
|
262
|
-
//
|
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
|
273
|
-
//
|
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
|
-
//
|
304
|
-
//
|
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
|
314
|
-
// (regardless of the custom colours the user has set). This is
|
315
|
-
// button is not nested inside another element
|
316
|
-
//
|
317
|
-
// custom
|
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
|
320
|
-
// sets a background colour, the text colour is still black
|
321
|
-
//
|
322
|
-
//
|
323
|
-
//
|
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
|
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
|
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
|
23
|
-
// as:
|
24
|
-
// - setting a min-height is not possible without a magic number
|
25
|
-
//
|
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-
|
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
|