@eeacms/volto-clms-theme 1.0.183 → 1.0.185

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ ### [1.0.185](https://github.com/eea/volto-clms-theme/compare/1.0.184...1.0.185) - 13 March 2023
8
+
9
+ #### :hammer_and_wrench: Others
10
+
11
+ - comment MenuList [Unai - [`b8dfeff`](https://github.com/eea/volto-clms-theme/commit/b8dfeff240130c803fd6c33dd6460cd8252f90af)]
12
+ - volto 16 array widget [Unai - [`a29aab8`](https://github.com/eea/volto-clms-theme/commit/a29aab86c035f352e32ca1c20edd926591566094)]
13
+ ### [1.0.184](https://github.com/eea/volto-clms-theme/compare/1.0.183...1.0.184) - 10 March 2023
14
+
15
+ #### :rocket: New Features
16
+
17
+ - feat: clms-1924 hide validation status when it is empty [Mikel Larreategi - [`b0326a0`](https://github.com/eea/volto-clms-theme/commit/b0326a07cc12636ad36ccc9335c4e5cb8aff670b)]
18
+
19
+ #### :hammer_and_wrench: Others
20
+
21
+ - subscribe button style fix [Unai - [`af24b06`](https://github.com/eea/volto-clms-theme/commit/af24b06869bb13350b91d7f419bdff99861fee5d)]
22
+ - change date format in Vacancy and Tenders [Mikel Larreategi - [`48ef2c0`](https://github.com/eea/volto-clms-theme/commit/48ef2c0c850c8a9d73c50abd082b9a17d59993f7)]
23
+ - breadcrumbs margin fix [Unai - [`008fbce`](https://github.com/eea/volto-clms-theme/commit/008fbcedf5f36883b73de5efb90ebd68dd3da818)]
24
+ - dateformat utils fix with null dates [Unai - [`bcd620e`](https://github.com/eea/volto-clms-theme/commit/bcd620e9621cec5ccecdd1eb4b87f76b5e620509)]
7
25
  ### [1.0.183](https://github.com/eea/volto-clms-theme/compare/1.0.182...1.0.183) - 8 March 2023
8
26
 
9
27
  #### :hammer_and_wrench: Others
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-clms-theme",
3
- "version": "1.0.183",
3
+ "version": "1.0.185",
4
4
  "description": "volto-clms-theme: Volto theme for CLMS site",
5
5
  "main": "src/index.js",
6
6
  "author": "CodeSyntax for the European Environment Agency",
@@ -60,13 +60,15 @@ const DataSetInfoContent = (props) => {
60
60
  }
61
61
  return (
62
62
  <div>
63
- {validation?.data && validation?.data !== '<p><br/></p>' && (
64
- <CclCitation
65
- title="Validation status"
66
- marginBottom={true}
67
- children={<StringToHTML string={validation.data} />}
68
- ></CclCitation>
69
- )}
63
+ {validation?.data &&
64
+ validation?.data !== '<p><br/></p>' &&
65
+ validation?.data !== '<p></p>' && (
66
+ <CclCitation
67
+ title="Validation status"
68
+ marginBottom={true}
69
+ children={<StringToHTML string={validation.data} />}
70
+ ></CclCitation>
71
+ )}
70
72
  <CclInfoContainer>
71
73
  {props?.description ? (
72
74
  <CclInfoDescription
@@ -18,7 +18,7 @@ export const cclDateTimeFormat = (date) => {
18
18
 
19
19
  export const workOpportunitiesCclDateTimeFormat = (date, lang) => {
20
20
  const internal = getInternalValue(date, lang);
21
- return internal.format('DD.MM.YYYY hh.mm A');
21
+ return internal?.format('DD.MM.YYYY HH.mm');
22
22
  };
23
23
 
24
24
  export const cclDateFormat = (date) => {
@@ -0,0 +1,424 @@
1
+ /**
2
+ * ArrayWidget component.
3
+ * @module components/manage/Widgets/ArrayWidget
4
+ */
5
+
6
+ import React, { Component } from 'react';
7
+ import { defineMessages, injectIntl } from 'react-intl';
8
+ import PropTypes from 'prop-types';
9
+ import { compose } from 'redux';
10
+ import { connect } from 'react-redux';
11
+ import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
12
+ import { find, isObject } from 'lodash';
13
+
14
+ import {
15
+ getVocabFromHint,
16
+ getVocabFromField,
17
+ getVocabFromItems,
18
+ } from '@plone/volto/helpers';
19
+ import { getVocabulary } from '@plone/volto/actions';
20
+
21
+ import {
22
+ Option,
23
+ DropdownIndicator,
24
+ ClearIndicator,
25
+ selectTheme,
26
+ customSelectStyles,
27
+ // MenuList,
28
+ SortableMultiValue,
29
+ SortableMultiValueLabel,
30
+ MultiValueContainer,
31
+ } from '@plone/volto/components/manage/Widgets/SelectStyling';
32
+
33
+ import { FormFieldWrapper } from '@plone/volto/components';
34
+
35
+ const messages = defineMessages({
36
+ select: {
37
+ id: 'Select…',
38
+ defaultMessage: 'Select…',
39
+ },
40
+ no_value: {
41
+ id: 'No value',
42
+ defaultMessage: 'No value',
43
+ },
44
+ no_options: {
45
+ id: 'No options',
46
+ defaultMessage: 'No options',
47
+ },
48
+ });
49
+
50
+ function arrayMove(array, from, to) {
51
+ const slicedArray = array.slice();
52
+ slicedArray.splice(
53
+ to < 0 ? array.length + to : to,
54
+ 0,
55
+ slicedArray.splice(from, 1)[0],
56
+ );
57
+ return slicedArray;
58
+ }
59
+
60
+ function normalizeArrayValue(choices, value) {
61
+ if (!value || !Array.isArray(value)) return [];
62
+ if (value.length === 0) return value;
63
+
64
+ if (typeof value[0] === 'string') {
65
+ // raw value like ['foo', 'bar']
66
+ return value.map((v) => {
67
+ return {
68
+ label: find(choices, (c) => c.value === v)?.label || v,
69
+ value: v,
70
+ };
71
+ });
72
+ }
73
+
74
+ if (
75
+ isObject(value[0]) &&
76
+ Object.keys(value[0]).includes('token') // Array of objects, w/ label+value
77
+ ) {
78
+ return value
79
+ .map((v) => {
80
+ const item = find(choices, (c) => c.value === v.token);
81
+ return item
82
+ ? {
83
+ label: item.label || item.title || item.token,
84
+ value: v.token,
85
+ }
86
+ : {
87
+ // avoid a crash if choices doesn't include this item
88
+ label: v.label,
89
+ value: v.token,
90
+ };
91
+ })
92
+ .filter((f) => !!f);
93
+ }
94
+
95
+ return [];
96
+ }
97
+
98
+ function normalizeChoices(choices) {
99
+ if (Array.isArray(choices) && choices.length && Array.isArray(choices[0])) {
100
+ return choices.map((option) => ({
101
+ value: option[0],
102
+ label:
103
+ // Fix "None" on the serializer, to remove when fixed in p.restapi
104
+ option[1] !== 'None' && option[1] ? option[1] : option[0],
105
+ }));
106
+ }
107
+
108
+ return choices;
109
+ }
110
+
111
+ /**
112
+ * Compare values and return true if equal.
113
+ * Consider upper and lower case.
114
+ * @method compareOption
115
+ * @param {*} inputValue
116
+ * @param {*} option
117
+ * @param {*} accessors
118
+ * @returns {boolean}
119
+ */
120
+ const compareOption = (inputValue = '', option, accessors) => {
121
+ const candidate = String(inputValue);
122
+ const optionValue = String(accessors.getOptionValue(option));
123
+ const optionLabel = String(accessors.getOptionLabel(option));
124
+ return optionValue === candidate || optionLabel === candidate;
125
+ };
126
+
127
+ /**
128
+ * ArrayWidget component class.
129
+ * @class ArrayWidget
130
+ * @extends Component
131
+ *
132
+ * A createable select array widget will be rendered if the named vocabulary is
133
+ * in the widget definition (hint) like:
134
+ *
135
+ * ```
136
+ * list_field_voc_unconstrained = schema.List(
137
+ * title=u"List field with values from vocabulary but not constrained to them.",
138
+ * description=u"zope.schema.List",
139
+ * value_type=schema.TextLine(),
140
+ * required=False,
141
+ * missing_value=[],
142
+ * )
143
+ * directives.widget(
144
+ * "list_field_voc_unconstrained",
145
+ * AjaxSelectFieldWidget,
146
+ * vocabulary="plone.app.vocabularies.PortalTypes",
147
+ * )
148
+ * ```
149
+ */
150
+ class ArrayWidget extends Component {
151
+ /**
152
+ * Property types.
153
+ * @property {Object} propTypes Property types.
154
+ * @static
155
+ */
156
+ static propTypes = {
157
+ id: PropTypes.string.isRequired,
158
+ title: PropTypes.string.isRequired,
159
+ description: PropTypes.string,
160
+ required: PropTypes.bool,
161
+ error: PropTypes.arrayOf(PropTypes.string),
162
+ getVocabulary: PropTypes.func.isRequired,
163
+ choices: PropTypes.arrayOf(
164
+ PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
165
+ ),
166
+ vocabLoading: PropTypes.bool,
167
+ vocabLoaded: PropTypes.bool,
168
+ items: PropTypes.shape({
169
+ vocabulary: PropTypes.object,
170
+ }),
171
+ widgetOptions: PropTypes.shape({
172
+ vocabulary: PropTypes.object,
173
+ }),
174
+ value: PropTypes.arrayOf(
175
+ PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
176
+ ),
177
+ placeholder: PropTypes.string,
178
+ onChange: PropTypes.func.isRequired,
179
+ wrapped: PropTypes.bool,
180
+ creatable: PropTypes.bool, //if widget has no vocab and you want to be creatable
181
+ };
182
+
183
+ /**
184
+ * Default properties
185
+ * @property {Object} defaultProps Default properties.
186
+ * @static
187
+ */
188
+ static defaultProps = {
189
+ description: null,
190
+ required: false,
191
+ items: {
192
+ vocabulary: null,
193
+ },
194
+ widgetOptions: {
195
+ vocabulary: null,
196
+ },
197
+ error: [],
198
+ choices: [],
199
+ value: null,
200
+ creatable: false,
201
+ };
202
+
203
+ /**
204
+ * Constructor
205
+ * @method constructor
206
+ * @param {Object} props Component properties
207
+ * @constructs Actions
208
+ */
209
+ constructor(props) {
210
+ super(props);
211
+
212
+ this.handleChange = this.handleChange.bind(this);
213
+ }
214
+
215
+ /**
216
+ * Component did mount
217
+ * @method componentDidMount
218
+ * @returns {undefined}
219
+ */
220
+ componentDidMount() {
221
+ if (
222
+ !this.props.items?.choices?.length &&
223
+ !this.props.choices?.length &&
224
+ this.props.vocabBaseUrl
225
+ ) {
226
+ this.props.getVocabulary({
227
+ vocabNameOrURL: this.props.vocabBaseUrl,
228
+ size: -1,
229
+ subrequest: this.props.lang,
230
+ });
231
+ }
232
+ }
233
+
234
+ componentDidUpdate() {
235
+ if (
236
+ !this.props.items?.choices?.length &&
237
+ !this.props.choices?.length &&
238
+ this.props.vocabLoading === undefined &&
239
+ !this.props.vocabLoaded &&
240
+ this.props.vocabBaseUrl
241
+ ) {
242
+ this.props.getVocabulary({
243
+ vocabNameOrURL: this.props.vocabBaseUrl,
244
+ size: -1,
245
+ subrequest: this.props.lang,
246
+ });
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Handle the field change, store it in the local state and back to simple
252
+ * array of tokens for correct serialization
253
+ * @method handleChange
254
+ * @param {array} selectedOption The selected options (already aggregated).
255
+ * @returns {undefined}
256
+ */
257
+ handleChange(selectedOption) {
258
+ this.props.onChange(
259
+ this.props.id,
260
+ selectedOption ? selectedOption.map((item) => item.value) : null,
261
+ );
262
+ }
263
+
264
+ onSortEnd = (selectedOption, { oldIndex, newIndex }) => {
265
+ const newValue = arrayMove(selectedOption, oldIndex, newIndex);
266
+
267
+ this.handleChange(newValue);
268
+ };
269
+
270
+ /**
271
+ * Render method.
272
+ * @method render
273
+ * @returns {string} Markup for the component.
274
+ */
275
+ render() {
276
+ const choices = normalizeChoices(this.props?.choices || []);
277
+ const selectedOption = normalizeArrayValue(choices, this.props.value);
278
+
279
+ const CreatableSelect = this.props.reactSelectCreateable.default;
280
+ const { SortableContainer } = this.props.reactSortableHOC;
281
+ const Select = this.props.reactSelect.default;
282
+ const SortableSelect =
283
+ // It will be only createable if the named vocabulary is in the widget definition
284
+ // (hint) like:
285
+ // list_field_voc_unconstrained = schema.List(
286
+ // title=u"List field with values from vocabulary but not constrained to them.",
287
+ // description=u"zope.schema.List",
288
+ // value_type=schema.TextLine(),
289
+ // required=False,
290
+ // missing_value=[],
291
+ // )
292
+ // directives.widget(
293
+ // "list_field_voc_unconstrained",
294
+ // AjaxSelectFieldWidget,
295
+ // vocabulary="plone.app.vocabularies.PortalTypes",
296
+ // )
297
+ this.props?.choices &&
298
+ !getVocabFromHint(this.props) &&
299
+ !this.props.creatable
300
+ ? SortableContainer(Select)
301
+ : SortableContainer(CreatableSelect);
302
+
303
+ return (
304
+ <FormFieldWrapper {...this.props}>
305
+ <SortableSelect
306
+ useDragHandle
307
+ // react-sortable-hoc props:
308
+ axis="xy"
309
+ onSortEnd={this.onSortEnd}
310
+ menuShouldScrollIntoView={false}
311
+ distance={4}
312
+ // small fix for https://github.com/clauderic/react-sortable-hoc/pull/352:
313
+ getHelperDimensions={({ node }) => node.getBoundingClientRect()}
314
+ id={`field-${this.props.id}`}
315
+ key={this.props.id}
316
+ isDisabled={this.props.disabled || this.props.isDisabled}
317
+ className="react-select-container"
318
+ classNamePrefix="react-select"
319
+ /* eslint-disable jsx-a11y/no-autofocus */
320
+ autoFocus={this.props.focus}
321
+ /* eslint-enable jsx-a11y/no-autofocus */
322
+ options={
323
+ this.props.vocabBaseUrl
324
+ ? choices
325
+ : this.props.choices
326
+ ? [
327
+ ...choices,
328
+ ...(this.props.noValueOption && !this.props.default
329
+ ? [
330
+ {
331
+ label: this.props.intl.formatMessage(
332
+ messages.no_value,
333
+ ),
334
+ value: 'no-value',
335
+ },
336
+ ]
337
+ : []),
338
+ ]
339
+ : [
340
+ {
341
+ label: this.props.intl.formatMessage(messages.no_value),
342
+ value: 'no-value',
343
+ },
344
+ ]
345
+ }
346
+ styles={customSelectStyles}
347
+ theme={selectTheme}
348
+ components={{
349
+ // ...(this.props.choices?.length > 25 && {
350
+ // MenuList,
351
+ // }),
352
+ MultiValueContainer,
353
+ MultiValue: SortableMultiValue,
354
+ MultiValueLabel: SortableMultiValueLabel,
355
+ DropdownIndicator,
356
+ ClearIndicator,
357
+ Option,
358
+ }}
359
+ value={selectedOption || []}
360
+ placeholder={
361
+ this.props.placeholder ??
362
+ this.props.intl.formatMessage(messages.select)
363
+ }
364
+ onChange={this.handleChange}
365
+ isValidNewOption={(
366
+ inputValue,
367
+ selectValue,
368
+ selectOptions,
369
+ accessors,
370
+ ) =>
371
+ !(
372
+ !inputValue ||
373
+ selectValue.some((option) =>
374
+ compareOption(inputValue, option, accessors),
375
+ ) ||
376
+ selectOptions.some((option) =>
377
+ compareOption(inputValue, option, accessors),
378
+ )
379
+ )
380
+ }
381
+ isClearable
382
+ isMulti
383
+ />
384
+ </FormFieldWrapper>
385
+ );
386
+ }
387
+ }
388
+
389
+ export const ArrayWidgetComponent = injectIntl(ArrayWidget);
390
+
391
+ export default compose(
392
+ injectIntl,
393
+ injectLazyLibs(['reactSelect', 'reactSelectCreateable', 'reactSortableHOC']),
394
+ connect(
395
+ (state, props) => {
396
+ const vocabBaseUrl =
397
+ getVocabFromHint(props) ||
398
+ getVocabFromField(props) ||
399
+ getVocabFromItems(props);
400
+
401
+ const vocabState =
402
+ state.vocabularies?.[vocabBaseUrl]?.subrequests?.[state.intl.locale];
403
+
404
+ // If the schema already has the choices in it, then do not try to get the vocab,
405
+ // even if there is one
406
+ if (props.items?.choices) {
407
+ return {
408
+ choices: props.items.choices,
409
+ lang: state.intl.locale,
410
+ };
411
+ } else if (vocabState) {
412
+ return {
413
+ choices: vocabState.items,
414
+ vocabBaseUrl,
415
+ vocabLoading: vocabState.loading,
416
+ vocabLoaded: vocabState.loaded,
417
+ lang: state.intl.locale,
418
+ };
419
+ }
420
+ return { vocabBaseUrl, lang: state.intl.locale };
421
+ },
422
+ { getVocabulary },
423
+ ),
424
+ )(ArrayWidget);
@@ -31,6 +31,7 @@
31
31
 
32
32
  .ccl-breadcrumb .ccl-breadcrumb__segment {
33
33
  display: block;
34
+ margin-left: 0 !important;
34
35
  font-size: 1rem;
35
36
  line-height: 1.25;
36
37
  }
@@ -301,7 +302,8 @@
301
302
  height: 20px;
302
303
  }
303
304
 
304
- .filters-element select:focus-visible, .filters-element select:focus {
305
+ .filters-element select:focus-visible,
306
+ .filters-element select:focus {
305
307
  outline: none;
306
308
  }
307
309
 
@@ -320,7 +322,10 @@
320
322
  font-weight: bold;
321
323
  }
322
324
 
323
- .filters-container .react-select__control .react-select__dropdown-indicator svg {
325
+ .filters-container
326
+ .react-select__control
327
+ .react-select__dropdown-indicator
328
+ svg {
324
329
  fill: #273b4b !important;
325
330
  }
326
331
 
@@ -368,14 +373,14 @@
368
373
  .block.search .filter-list-header .filter-list-title svg {
369
374
  margin-right: 0.5rem;
370
375
  transform: rotate(0deg) !important;
371
- -webkit-transition: transform .3s ease-out;
372
- transition: transform 0.3s ease-out;
376
+ -webkit-transition: transform 0.3s ease-out;
377
+ transition: transform 0.3s ease-out;
373
378
  }
374
379
 
375
380
  .block.search .active.filter-list-header .filter-list-title svg {
376
381
  transform: rotate(-180deg) !important;
377
- -webkit-transition: transform .3s ease-out;
378
- transition: transform 0.3s ease-out;
382
+ -webkit-transition: transform 0.3s ease-out;
383
+ transition: transform 0.3s ease-out;
379
384
  }
380
385
 
381
386
  .block.search .filter-listing .trash.icon {
@@ -398,7 +403,6 @@
398
403
  margin: 0.25rem !important;
399
404
  }
400
405
 
401
-
402
406
  /* Filters modal */
403
407
  .modal-filters {
404
408
  display: none;
@@ -422,7 +426,7 @@
422
426
  width: 100%;
423
427
  background: white;
424
428
  }
425
- @media (min-width: 576px) {
429
+ @media (min-width: 576px) {
426
430
  .modal-filters-container {
427
431
  width: 70%;
428
432
  }
@@ -461,7 +465,7 @@
461
465
  font-size: 0.85rem;
462
466
  padding-right: 1rem;
463
467
  margin-right: 1rem;
464
- border-right: solid 1px #273B4B;
468
+ border-right: solid 1px #273b4b;
465
469
  line-height: 1.5rem;
466
470
  cursor: pointer;
467
471
  }
@@ -513,28 +517,28 @@
513
517
  }
514
518
 
515
519
  .modal-filters-dropdown .ccl-expandable__button::after {
516
- font-family: "ccl-icons";
520
+ font-family: 'ccl-icons';
517
521
  color: #a0b128;
518
522
  margin-right: 1.5rem;
519
523
  -moz-osx-font-smoothing: grayscale;
520
524
  -webkit-font-smoothing: antialiased;
521
525
  position: absolute;
522
526
  right: 0;
523
- -webkit-transition: all .3s ease-in-out;
524
- transition: all .3s ease-in-out;
527
+ -webkit-transition: all 0.3s ease-in-out;
528
+ transition: all 0.3s ease-in-out;
525
529
  }
526
530
 
527
531
  .modal-filters-dropdown .ccl-expandable__button[aria-expanded='false']::after {
528
532
  content: '\e914';
529
533
  transform: rotate(0deg);
530
- -webkit-transition: transform .3s ease-out;
531
- transition: transform 0.3s ease-out;
534
+ -webkit-transition: transform 0.3s ease-out;
535
+ transition: transform 0.3s ease-out;
532
536
  }
533
537
 
534
538
  .modal-filters-dropdown .ccl-expandable__button[aria-expanded='true']::after {
535
539
  content: '\e914';
536
540
  transform: rotate(-180deg);
537
- -webkit-transition: transform .3s ease-out;
541
+ -webkit-transition: transform 0.3s ease-out;
538
542
  transition: transform 0.3s ease-out;
539
543
  }
540
544
 
@@ -563,7 +567,10 @@
563
567
  padding: 1rem 1.5rem;
564
568
  }
565
569
 
566
- .modal-filters-dropdown .ccl-expandable__button + .ccl-form .ccl-expandable__button {
570
+ .modal-filters-dropdown
571
+ .ccl-expandable__button
572
+ + .ccl-form
573
+ .ccl-expandable__button {
567
574
  background-color: transparent;
568
575
  margin: 0;
569
576
  padding: 0;
@@ -573,7 +580,11 @@
573
580
  margin-top: 1.66rem;
574
581
  }
575
582
 
576
- .modal-filters-dropdown .ccl-expandable__button + .ccl-form .ccl-expandable__button .ccl-form {
583
+ .modal-filters-dropdown
584
+ .ccl-expandable__button
585
+ + .ccl-form
586
+ .ccl-expandable__button
587
+ .ccl-form {
577
588
  padding: 0;
578
589
  }
579
590
 
@@ -604,10 +615,10 @@
604
615
  }
605
616
 
606
617
  .modal-filters-dropdown .filters-tag .checkbox input:checked + label {
607
- color:white;
618
+ color: white;
608
619
  background: #a0b128;
609
- -webkit-transition: all .3s ease-out;
610
- transition: all .3s ease-out;
620
+ -webkit-transition: all 0.3s ease-out;
621
+ transition: all 0.3s ease-out;
611
622
  }
612
623
 
613
624
  .modal-filters-dropdown .filters-tag .checkbox label {
@@ -617,8 +628,8 @@
617
628
  border: solid 1px #a0b128;
618
629
  cursor: pointer;
619
630
  text-align: center;
620
- -webkit-transition: all .3s ease-out;
621
- transition: all .3s ease-out;
631
+ -webkit-transition: all 0.3s ease-out;
632
+ transition: all 0.3s ease-out;
622
633
  }
623
634
 
624
635
  .modal-filters-dropdown .ui.checkbox input:focus ~ label {
@@ -626,7 +637,7 @@
626
637
  }
627
638
 
628
639
  .modal-filters-dropdown .filters-tag .checkbox label:hover {
629
- color:white;
640
+ color: white;
630
641
  background: #a0b128;
631
642
  }
632
643
 
@@ -643,7 +654,7 @@
643
654
  .modal-filters-dropdown .ui.checkbox input:checked:focus ~ label:after {
644
655
  color: #a0b128;
645
656
  }
646
- .modal-filters-dropdown .ui.checkbox input:checked ~ label:before,
657
+ .modal-filters-dropdown .ui.checkbox input:checked ~ label:before,
647
658
  .modal-filters-dropdown .ui.checkbox input:checked:focus ~ label:before {
648
659
  border: 1px solid #a0b128;
649
660
  }
@@ -1213,7 +1213,7 @@ div#page-document h1.documentFirstHeading {
1213
1213
  margin-bottom: 1.5rem;
1214
1214
  }
1215
1215
 
1216
- .title-subscribe-container > div > div {
1216
+ .title-subscribe-container > div {
1217
1217
  display: flex;
1218
1218
  align-items: flex-end;
1219
1219
  }