katalyst-govuk-formbuilder 1.11.0 → 1.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -0
- data/app/assets/builds/katalyst/govuk/formbuilder.css +10 -10
- data/app/assets/stylesheets/katalyst/govuk/components/combobox/_index.scss +106 -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
- metadata +4 -3
- 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: 3ebff84adc49430cbde51bc966776bcf31941cd924c683ad08a02e339bdb568b
|
4
|
+
data.tar.gz: 6074316978d6aec2f8607e9651c1c1e69fff509ce9f4ae46a8c00c402df5299b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b83c4d07ca815bc5c4e961daa13dda61c157fec1442b7c942d3d8941cb81037c553456c97a4ac14036766f11df5e50c3b1b81ea7652b246632f380037a78aa58
|
7
|
+
data.tar.gz: a4c35916d2aeb5dfa9bcccd33692046f05dc549e83b87ac2225af5d848fd6dd5092ac1100b0f4df82341b20294f543d506400e2c5c7b0d9709358a912a284c2b
|
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.
|
@@ -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;
|
@@ -2380,7 +2380,7 @@
|
|
2380
2380
|
color: #d4351c;
|
2381
2381
|
}
|
2382
2382
|
.govuk-error-summary__list a:hover {
|
2383
|
-
color:
|
2383
|
+
color: rgb(148.4, 37.1, 19.6);
|
2384
2384
|
}
|
2385
2385
|
.govuk-error-summary__list a:active {
|
2386
2386
|
color: #d4351c;
|
@@ -0,0 +1,106 @@
|
|
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
|
+
.hw-combobox__chip {
|
93
|
+
border: 1px solid black;
|
94
|
+
background-color: rgb(239, 239, 239);
|
95
|
+
border-radius: 3px;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
.govuk-combobox--error {
|
100
|
+
border-color: $govuk-error-colour;
|
101
|
+
|
102
|
+
.hw-combobox__main__wrapper:focus-within {
|
103
|
+
border-color: $govuk-input-border-colour;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
@@ -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
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: katalyst-govuk-formbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katalyst Interactive
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_design_system_formbuilder
|
@@ -37,13 +37,14 @@ files:
|
|
37
37
|
- app/assets/builds/katalyst/govuk/formbuilder.js
|
38
38
|
- app/assets/builds/katalyst/govuk/formbuilder.min.js
|
39
39
|
- app/assets/config/katalyst-govuk-formbuilder.js
|
40
|
+
- app/assets/stylesheets/katalyst/govuk/components/combobox/_index.scss
|
40
41
|
- app/assets/stylesheets/katalyst/govuk/components/richtextarea/_index.scss
|
41
|
-
- app/assets/stylesheets/katalyst/govuk/components/richtextarea/_richtextarea.scss
|
42
42
|
- app/assets/stylesheets/katalyst/govuk/formbuilder.scss
|
43
43
|
- config/importmap.rb
|
44
44
|
- lib/katalyst/govuk/formbuilder.rb
|
45
45
|
- lib/katalyst/govuk/formbuilder/builder.rb
|
46
46
|
- lib/katalyst/govuk/formbuilder/containers/fieldset_context.rb
|
47
|
+
- lib/katalyst/govuk/formbuilder/elements/combobox.rb
|
47
48
|
- lib/katalyst/govuk/formbuilder/elements/label.rb
|
48
49
|
- lib/katalyst/govuk/formbuilder/elements/legend.rb
|
49
50
|
- lib/katalyst/govuk/formbuilder/elements/rich_text_area.rb
|