@eeacms/volto-eea-design-system 1.14.0 → 1.15.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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,32 @@ 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.15.0](https://github.com/eea/volto-eea-design-system/compare/1.14.0...1.15.0) - 26 July 2023
8
+
9
+ #### :rocket: New Features
10
+
11
+ - feat(carousel): added story example on how to customize the dots to contain accessibility labels [David Ichim - [`fe5eb46`](https://github.com/eea/volto-eea-design-system/commit/fe5eb46dc94abfeaaa2c79022e507b452b4bb36a)]
12
+
13
+ #### :bug: Bug Fixes
14
+
15
+ - fix(storybook): controls that broke after the Hero stories [David Ichim - [`f8e995d`](https://github.com/eea/volto-eea-design-system/commit/f8e995d30e971163677a198846b1314222dbe408)]
16
+ - fix: hover and focused border for block child - refs #255840 [Claudia Ifrim - [`fdd7783`](https://github.com/eea/volto-eea-design-system/commit/fdd7783b0658711674d251cce498900d9add52af)]
17
+ - fix(storybook): popup story react import [David Ichim - [`18888f9`](https://github.com/eea/volto-eea-design-system/commit/18888f95888f1e3c89d9d1814462e1f27e85ea87)]
18
+ - fix(accessibility): of carousel arrows, dots and role of carousel as a carousel region [David Ichim - [`00257fc`](https://github.com/eea/volto-eea-design-system/commit/00257fcfd0cd3b9959f2f3c68f0b2725c2d96f09)]
19
+
20
+ #### :nail_care: Enhancements
21
+
22
+ - change(carousel): set aria current to current dot button to indicate which slide we are on [David Ichim - [`e711ec8`](https://github.com/eea/volto-eea-design-system/commit/e711ec806be8b45b122a56b84717a0c45057cbbe)]
23
+ - refactor: Use EEA countup instead of react-countup - refs #254634 [dobri1408 - [`146d8c2`](https://github.com/eea/volto-eea-design-system/commit/146d8c2d9d7d55530b39261bfabf7cebd9c8ac0b)]
24
+ - change(search): added search icon as button for proper accessibility support [ACCESSIBILITY 2.1.1.1] #360 from eea/refactor-search-input-icon [ichim-david - [`8f932ff`](https://github.com/eea/volto-eea-design-system/commit/8f932ffba42a96f7d6665c593ff3ad22c3b362fc)]
25
+ - change(search): style icon class instead of i.icon [David Ichim - [`f96a590`](https://github.com/eea/volto-eea-design-system/commit/f96a590beb15ca6b577a169773b740b171b5e3c0)]
26
+ - change(header): use a real button for search submit [David Ichim - [`37e491b`](https://github.com/eea/volto-eea-design-system/commit/37e491ba4af37f16a40bf6377d220d984be17656)]
27
+ - change(header): move handling of key press that checks for enter key to a generic function [David Ichim - [`8df5c8a`](https://github.com/eea/volto-eea-design-system/commit/8df5c8a03f0fb0ad462605df283e622f5b6daf3f)]
28
+ - refactor(SearchBox): add key down handler for search icon [Antonis Tarantilis - [`4f46ba5`](https://github.com/eea/volto-eea-design-system/commit/4f46ba5d3c2457a24e705bf7f34e1cfde2e2f79d)]
29
+
30
+ #### :hammer_and_wrench: Others
31
+
32
+ - Release 1.15.0 [Alin Voinea - [`30152fc`](https://github.com/eea/volto-eea-design-system/commit/30152fcdfffa4ec2262ebf78c1c8a885e222e73c)]
7
33
  ### [1.14.0](https://github.com/eea/volto-eea-design-system/compare/1.13.2...1.14.0) - 24 July 2023
8
34
 
9
35
  #### :rocket: New Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-eea-design-system",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "description": "@eeacms/volto-eea-design-system: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -20,9 +20,9 @@
20
20
  "@eeacms/volto-corsproxy"
21
21
  ],
22
22
  "dependencies": {
23
+ "@eeacms/countup": "*",
23
24
  "@eeacms/volto-corsproxy": "*",
24
25
  "@fontsource/roboto": "4.5.8",
25
- "react-countup": "^6.3.0",
26
26
  "react-lazy-load-image-component": "1.5.6",
27
27
  "react-slick": "^0.28.1",
28
28
  "remixicon": "2.5.0",
@@ -0,0 +1,6 @@
1
+ export default function handleEnterKeyPress(event, callback) {
2
+ if (event.key === 'Enter') {
3
+ event.preventDefault();
4
+ callback(event);
5
+ }
6
+ }
@@ -1,3 +1,4 @@
1
1
  export useClickOutside from './useClickOutside';
2
2
  export usePrevious from './usePrevious';
3
3
  export useFirstVisited from './useFirstVisited';
4
+ export handleEnterKeyPress from './eventHandlers';
@@ -394,50 +394,70 @@ FluidGrid.args = {
394
394
  fluid: true,
395
395
  cards: [...cardModels],
396
396
  };
397
+ const PrevArrow = (props) => {
398
+ const { onClick } = props;
397
399
 
398
- const Arrows = (props) => {
399
- const { slider = {} } = props;
400
+ return (
401
+ <Button
402
+ aria-label="Previous slide"
403
+ className="slider-arrow prev-arrow tablet or lower hidden"
404
+ icon
405
+ onClick={onClick}
406
+ >
407
+ <Icon className="ri-arrow-left-s-line" />
408
+ </Button>
409
+ );
410
+ };
411
+
412
+ const NextArrow = (props) => {
413
+ const { onClick } = props;
400
414
 
401
415
  return (
402
- <>
403
- <Button
404
- aria-label="Previous slide"
405
- className="slider-arrow prev-arrow tablet or lower hidden"
406
- icon
407
- onClick={() => {
408
- if (slider.current) {
409
- slider.current.slickPrev();
410
- }
411
- }}
412
- >
413
- <Icon className="ri-arrow-left-s-line" />
414
- </Button>
415
- <Button
416
- aria-label="Next slide"
417
- className="slider-arrow next-arrow tablet or lower hidden"
418
- icon
419
- onClick={() => {
420
- if (slider.current) {
421
- slider.current.slickNext();
422
- }
423
- }}
424
- >
425
- <Icon className="ri-arrow-right-s-line" />
426
- </Button>
427
- </>
416
+ <Button
417
+ aria-label="Next slide"
418
+ className="slider-arrow next-arrow tablet or lower hidden"
419
+ icon
420
+ onClick={onClick}
421
+ >
422
+ <Icon className="ri-arrow-right-s-line" />
423
+ </Button>
428
424
  );
429
425
  };
430
426
 
431
427
  function CarouselCardsContent(args) {
432
428
  const slider = React.useRef(null);
429
+ const dots_parent = React.useRef(null);
430
+ const settings = {
431
+ ...args.settings,
432
+ customPaging: (i) => (
433
+ <button className={'slider-dots-button'} aria-current={i === 0}>
434
+ <span className="slick-dot-icon" aria-hidden="true" />
435
+ <span className="slick-sr-only">Go to slide {i + 1}</span>
436
+ </button>
437
+ ),
438
+ appendDots: (dots) => (
439
+ <ul ref={dots_parent} className={'slick-dots'}>
440
+ {dots}
441
+ </ul>
442
+ ),
443
+ afterChange: (currentSlide) => {
444
+ const dots = dots_parent.current;
445
+ if (dots) {
446
+ dots
447
+ .querySelectorAll('.slider-dots-button')
448
+ .forEach(function (el, idx) {
449
+ el.setAttribute('aria-current', idx === currentSlide);
450
+ });
451
+ }
452
+ },
453
+ };
433
454
  return (
434
- <div className="cards-carousel">
435
- <Slider {...args.settings} ref={slider}>
455
+ <div className="cards-carousel" role={'region'} aria-label={'carousel'}>
456
+ <Slider {...settings} ref={slider}>
436
457
  {args.cards.slice(0, args.numberOfCards).map((card, index) => (
437
458
  <CardTemplate {...args} card={card} key={index} />
438
459
  ))}
439
460
  </Slider>
440
- <Arrows slider={slider} />
441
461
  </div>
442
462
  );
443
463
  }
@@ -464,7 +484,9 @@ CarouselCards.args = {
464
484
  infinite: true,
465
485
  slidesToShow: 4,
466
486
  slidesToScroll: 1,
467
- arrows: false,
487
+ arrows: true,
488
+ nextArrow: <NextArrow />,
489
+ prevArrow: <PrevArrow />,
468
490
  responsive: [
469
491
  {
470
492
  breakpoint: tabletBreakpoint,
@@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
2
2
  import { Container, Input, List } from 'semantic-ui-react';
3
3
  import { withRouter, Link } from 'react-router-dom';
4
4
  import { useClickOutside } from '@eeacms/volto-eea-design-system/helpers';
5
+ import { handleEnterKeyPress } from '@eeacms/volto-eea-design-system/helpers';
5
6
 
6
7
  const getRandomItems = (arr, max) => {
7
8
  return (
@@ -37,7 +38,6 @@ function HeaderSearchPopUp({
37
38
  } = activeView || {};
38
39
  const { suggestionsTitle, suggestions, maxToShow } = searchSuggestions || {};
39
40
 
40
- const [text, setText] = React.useState('');
41
41
  const [visibleSuggestions, setVisibileSuggestions] = React.useState(
42
42
  getRandomItems(suggestions, maxToShow),
43
43
  );
@@ -48,12 +48,8 @@ function HeaderSearchPopUp({
48
48
 
49
49
  useClickOutside({ targetRefs: [nodeRef, ...triggerRefs], callback: onClose });
50
50
 
51
- const onChangeText = (event, { value }) => {
52
- setText(value);
53
- event.preventDefault();
54
- };
55
-
56
51
  const onSubmit = (event) => {
52
+ const text = searchInputRef?.current?.inputRef?.current?.value;
57
53
  history.push(`${path}?q=${text}`);
58
54
 
59
55
  if (window?.searchContext?.resetSearch) {
@@ -79,12 +75,14 @@ function HeaderSearchPopUp({
79
75
  <form method="get" onSubmit={onSubmit}>
80
76
  <Input
81
77
  ref={searchInputRef}
82
- className="search"
83
- onChange={onChangeText}
84
- icon={{
85
- className: 'ri-search-line',
86
- link: true,
78
+ className="icon search"
79
+ action={{
80
+ className: 'icon ri-search-line',
81
+ 'aria-label': 'Submit search',
87
82
  onClick: onSubmit,
83
+ onKeyDown: (event) => {
84
+ handleEnterKeyPress(event, onSubmit);
85
+ },
88
86
  }}
89
87
  placeholder={placeholder}
90
88
  fluid
@@ -1,4 +1,4 @@
1
- import { React } from 'react';
1
+ import React from 'react';
2
2
  import { Button, Segment, Image, Icon } from 'semantic-ui-react';
3
3
 
4
4
  import Popup from './Popup';
@@ -1,10 +1,19 @@
1
1
  import React from 'react';
2
2
  import { Statistic, Container, Button } from 'semantic-ui-react';
3
- import CountUp, { useCountUp } from 'react-countup';
3
+ import { CountUp, useCountUp } from '@eeacms/countup';
4
4
 
5
5
  export default {
6
6
  title: 'Components/Statistic',
7
7
  component: Statistic,
8
+ args: {
9
+ label: 'Statistic Label',
10
+ value: 'Value',
11
+ size: 'small',
12
+ horizontal: false,
13
+ linked: false,
14
+ inverted: false,
15
+ backgroundVariant: 'primary',
16
+ },
8
17
  argTypes: {
9
18
  size: {
10
19
  control: {
@@ -43,39 +52,65 @@ export default {
43
52
  type: { summary: 'string' },
44
53
  },
45
54
  },
55
+
56
+ label: {
57
+ description: 'label content of the Statistic',
58
+ },
59
+ value: {
60
+ description: 'value content of the statistic',
61
+ },
62
+ inverted: {
63
+ description: 'Is the theme inverted',
64
+ table: {
65
+ type: {
66
+ summary: 'boolean',
67
+ },
68
+ },
69
+ },
70
+ linked: {
71
+ description: 'Add link to statistic',
72
+ table: {
73
+ type: {
74
+ summary: 'boolean',
75
+ },
76
+ },
77
+ },
46
78
  },
47
79
  };
48
80
 
49
- const Template = (args) => (
50
- <div
51
- className={`full-width color-bg-${
52
- args.inverted ? args.backgroundVariant : ''
53
- }`}
54
- >
55
- <Container>
56
- <Statistic.Group {...args}>
57
- {args.elements &&
58
- args.elements.map((element, index) => (
59
- <Statistic
60
- as="a"
61
- href={element.href}
62
- key={index}
63
- {...element}
64
- ></Statistic>
65
- ))}
66
- {!args.elements && (
67
- <>
68
- {args.linked ? (
69
- <Statistic as="a" href="/#" {...args}></Statistic>
70
- ) : (
71
- <Statistic {...args}></Statistic>
72
- )}{' '}
73
- </>
74
- )}
75
- </Statistic.Group>
76
- </Container>
77
- </div>
78
- );
81
+ const Template = (args) => {
82
+ const { backgroundVariant, elements, linked, ...sematicProps } = args;
83
+ return (
84
+ <div
85
+ className={`full-width color-bg-${
86
+ sematicProps.inverted ? backgroundVariant : ''
87
+ }`}
88
+ >
89
+ <Container>
90
+ <Statistic.Group {...sematicProps}>
91
+ {elements &&
92
+ elements.map((element, index) => (
93
+ <Statistic
94
+ as="a"
95
+ href={element.href}
96
+ key={index}
97
+ {...element}
98
+ ></Statistic>
99
+ ))}
100
+ {!elements && (
101
+ <>
102
+ {linked ? (
103
+ <Statistic as="a" href="/#" {...sematicProps}></Statistic>
104
+ ) : (
105
+ <Statistic {...sematicProps}></Statistic>
106
+ )}{' '}
107
+ </>
108
+ )}
109
+ </Statistic.Group>
110
+ </Container>
111
+ </div>
112
+ );
113
+ };
79
114
 
80
115
  export const Default = Template.bind({});
81
116
  Default.args = {
@@ -192,7 +227,7 @@ const CustomTemplate = (args) => (
192
227
  <Container>
193
228
  <Statistic.Group {...args}>
194
229
  {args.elements &&
195
- args.elements.map((element, index) => (
230
+ args.elements.map((element) => (
196
231
  <a href={element.href} className="ui small statistic">
197
232
  <div className={`value ${args.valueVariation}`}>
198
233
  {element.value}
@@ -300,34 +335,62 @@ Custom.argTypes = {
300
335
  ////////////////////////////////// Animation Stories
301
336
 
302
337
  const AnimationTemplate = (args) => {
303
- const { start, reset, pauseResume } = useCountUp({
304
- ref: 'counter',
338
+ const [run, setRun] = React.useState(true);
339
+ const { reset, value } = useCountUp({
305
340
  start: args.start,
306
341
  end: args.end,
307
- delay: args.delay,
308
342
  duration: args.duration,
309
- decimals: args.decimals,
310
- decimal: args.decimal,
311
- prefix: args.prefix,
312
- suffix: args.suffix,
343
+ decimalPlaces: args.decimals,
344
+ decimalSeparator: args.decimal,
345
+ formatter: (value) => {
346
+ let prefix = args.prefix || '';
347
+ let suffix = args.suffix || '';
348
+ let valueFixed = value.toFixed(args.decimals);
349
+
350
+ if (args.decimal === ',')
351
+ return (
352
+ prefix + new Intl.NumberFormat('ro-RO').format(valueFixed) + suffix
353
+ );
354
+ else return prefix + valueFixed + suffix;
355
+ },
356
+ isCounting: run,
357
+ useIntersection: false,
313
358
  });
314
359
 
315
360
  return (
316
361
  <Container>
317
362
  <Statistic.Group {...args}>
318
363
  <a href="/#" className="ui small statistic">
319
- <div className="value secondary" id="counter"></div>
364
+ <div className="value secondary">{value}</div>
320
365
  <div className="label tertiary">Count up label</div>
321
366
  </a>
322
367
  </Statistic.Group>
323
368
  <br />
324
- <Button secondary onClick={start}>
369
+ <Button
370
+ secondary
371
+ onClick={() => {
372
+ reset();
373
+ setRun(true);
374
+ }}
375
+ >
325
376
  Start
326
377
  </Button>
327
- <Button primary onClick={reset}>
378
+ <Button
379
+ primary
380
+ onClick={() => {
381
+ reset();
382
+ setRun(false);
383
+ }}
384
+ >
328
385
  Reset
329
386
  </Button>
330
- <Button primary inverted onClick={pauseResume}>
387
+ <Button
388
+ primary
389
+ inverted
390
+ onClick={() => {
391
+ setRun(!run);
392
+ }}
393
+ >
331
394
  Pause/Resume
332
395
  </Button>
333
396
  </Container>
@@ -335,10 +398,10 @@ const AnimationTemplate = (args) => {
335
398
  };
336
399
 
337
400
  export const Animation = AnimationTemplate.bind({});
401
+
338
402
  Animation.args = {
339
403
  start: 0,
340
404
  end: 5000,
341
- delay: 0,
342
405
  duration: 5,
343
406
  decimals: 0,
344
407
  prefix: '',
@@ -347,9 +410,17 @@ Animation.args = {
347
410
  size: 'small',
348
411
  horizontal: false,
349
412
  };
413
+ Animation.argTypes = {
414
+ decimal: {
415
+ name: 'decimal',
416
+ defaultValue: '.',
417
+ options: ['.', ','],
418
+ control: { type: 'select' },
419
+ },
420
+ };
350
421
  Animation.parameters = { controls: { exclude: ['Background when inverted'] } };
351
422
 
352
- const CountupStatistics = (args) => (
423
+ const CountUpStatistics = (args) => (
353
424
  <div
354
425
  className={`full-width color-bg-${
355
426
  args.inverted ? args.backgroundVariant : ''
@@ -358,10 +429,10 @@ const CountupStatistics = (args) => (
358
429
  <Container>
359
430
  <Statistic.Group id="counter" {...args}>
360
431
  {args.elements &&
361
- args.elements.map((element, index) => (
432
+ args.elements.map((element) => (
362
433
  <a href={element.href} className="ui small statistic">
363
434
  <div className={`value ${args.valueVariation}`}>
364
- <CountUp end={element.value} />
435
+ <CountUp end={element.value} isCounting={true} />
365
436
  </div>
366
437
  <div className={`label ${args.labelVariation}`}>
367
438
  {element.label}
@@ -375,27 +446,27 @@ const CountupStatistics = (args) => (
375
446
  </Container>
376
447
  </div>
377
448
  );
378
- export const AnimationGroup = CountupStatistics.bind({});
449
+ export const AnimationGroup = CountUpStatistics.bind({});
379
450
  AnimationGroup.args = {
380
451
  elements: [
381
452
  {
382
453
  ...Default.args,
383
454
  label: 'label 1',
384
- value: '50',
455
+ value: 50,
385
456
  slate: 'Text from slate',
386
457
  href: '/#',
387
458
  },
388
459
  {
389
460
  ...Default.args,
390
461
  label: 'label 2',
391
- value: '500',
462
+ value: 500,
392
463
  slate: 'Text from slate',
393
464
  href: '/#',
394
465
  },
395
466
  {
396
467
  ...Default.args,
397
468
  label: 'label 3',
398
- value: '5000',
469
+ value: 5000,
399
470
  slate: 'Text from slate',
400
471
  href: '/#',
401
472
  },
@@ -409,56 +480,3 @@ AnimationGroup.args = {
409
480
  inverted: false,
410
481
  backgroundVariant: 'primary',
411
482
  };
412
- AnimationGroup.argTypes = {
413
- widths: {
414
- control: {
415
- type: 'select',
416
- options: ['one', 'two', 'three', 'four', 'five'],
417
- },
418
- description: 'statistic column size',
419
- table: {
420
- type: {
421
- summary: 'string',
422
- },
423
- defaultValue: {
424
- summary: ' "" ',
425
- },
426
- },
427
- },
428
- valueVariation: {
429
- name: 'Value variation',
430
- defaultValue: 'tertiary',
431
- options: ['primary', 'secondary', 'tertiary'],
432
- control: { type: 'select' },
433
- description: 'Text color variation',
434
- table: {
435
- category: 'Color variations',
436
- defaultValue: { summary: 'tertiary' },
437
- type: { summary: 'string' },
438
- },
439
- },
440
- labelVariation: {
441
- name: 'Value variation',
442
- defaultValue: 'tertiary',
443
- options: ['primary', 'secondary', 'tertiary'],
444
- control: { type: 'select' },
445
- description: 'Text color variation',
446
- table: {
447
- category: 'Color variations',
448
- defaultValue: { summary: 'tertiary' },
449
- type: { summary: 'string' },
450
- },
451
- },
452
- extraVariation: {
453
- name: 'Extra info variation',
454
- defaultValue: 'tertiary',
455
- options: ['primary', 'secondary', 'tertiary'],
456
- control: { type: 'select' },
457
- description: 'Text color variation',
458
- table: {
459
- category: 'Color variations',
460
- defaultValue: { summary: 'tertiary' },
461
- type: { summary: 'string' },
462
- },
463
- },
464
- };
@@ -81,6 +81,7 @@
81
81
  .accordion-title:not(.active) .ui.input input {
82
82
  color: @textColorCSSVar;
83
83
  }
84
+
84
85
  .ui.input input {
85
86
  border: @border;
86
87
 
@@ -121,7 +122,19 @@ textarea.fluid {
121
122
  font-weight: @bold;
122
123
  }
123
124
 
124
- i.icon {
125
+ .icon {
126
+ position: absolute;
127
+ top: 0;
128
+ right: 0;
129
+ height: 100%;
130
+ margin: 0;
131
+ background-color: transparent !important;
132
+ box-shadow: none !important;
133
+ line-height: 1;
134
+ text-align: center;
135
+ }
136
+
137
+ .icon:before {
125
138
  color: @white;
126
139
  font-size: 16px;
127
140
  opacity: 1;
@@ -129,18 +142,18 @@ textarea.fluid {
129
142
  }
130
143
 
131
144
  .ui.fluid.icon.input.search > input::-webkit-input-placeholder {
132
- opacity: 0.9;
133
145
  color: rgb(255, 255, 255);
146
+ opacity: 0.9;
134
147
  }
135
148
 
136
149
  .ui.fluid.icon.input.search > input::-moz-placeholder {
137
- opacity: 0.9;
138
150
  color: rgb(255, 255, 255);
151
+ opacity: 0.9;
139
152
  }
140
153
 
141
154
  .ui.fluid.icon.input.search > input::-ms-input-placeholder {
142
- opacity: 0.9;
143
155
  color: rgb(255, 255, 255);
156
+ opacity: 0.9;
144
157
  }
145
158
 
146
159
  @media only screen and (min-width: @tabletBreakpoint) {
@@ -150,7 +163,7 @@ textarea.fluid {
150
163
  font-size: 18px;
151
164
  }
152
165
 
153
- i.icon {
166
+ .icon:before {
154
167
  font-size: 18px;
155
168
  }
156
169
  }
@@ -164,7 +177,7 @@ textarea.fluid {
164
177
  font-size: 40px;
165
178
  }
166
179
 
167
- i.icon {
180
+ .icon:before {
168
181
  font-size: 38px;
169
182
  }
170
183
  }
@@ -38,3 +38,9 @@
38
38
  #main main {
39
39
  overflow: inherit;
40
40
  }
41
+
42
+ // with z-index: -1 you don't get the hover and focused border for block child section
43
+ // TODO: to be removed if https://github.com/plone/volto/pull/5029 merged
44
+ .block .block:not(.inner)::before {
45
+ z-index: auto;
46
+ }
@@ -377,6 +377,9 @@
377
377
  }
378
378
 
379
379
  .cards-carousel .slick-dots li button:before {
380
+ content: none;
381
+ }
382
+ .cards-carousel .slick-dots li .slick-dot-icon:before {
380
383
  background-color: @carouselDotsBackgroundColor;
381
384
  color: transparent;
382
385
  border: @carouselDotsBorder;
@@ -384,9 +387,16 @@
384
387
  opacity: @carouselDotsOpacity;
385
388
  width: @mobileCarouselDotsWidth;
386
389
  height: @mobileCarouselDotsHeight;
390
+ position: absolute;
391
+ top: 0;
392
+ left: 0;
393
+ content: '•';
394
+ text-align: center;
395
+ -webkit-font-smoothing: antialiased;
396
+ -moz-osx-font-smoothing: grayscale;
387
397
  }
388
398
 
389
- .cards-carousel .slick-dots li.slick-active button:before {
399
+ .cards-carousel .slick-dots li.slick-active .slick-dot-icon:before {
390
400
  background-color: @carouselDotsActiveBackgroundColor;
391
401
  color: transparent;
392
402
  }
File without changes