@eeacms/volto-eea-design-system 1.0.7 → 1.11.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 (31) hide show
  1. package/CHANGELOG.md +60 -1
  2. package/package.json +1 -1
  3. package/src/semantic.less +0 -4
  4. package/src/ui/Accordion/Accordion.stories.js +52 -123
  5. package/src/ui/Card/Card.stories.jsx +153 -11
  6. package/src/ui/Footer/Contact.jsx +31 -6
  7. package/src/ui/Footer/Footer.stories.js +76 -25
  8. package/src/ui/Header/Header.jsx +9 -3
  9. package/src/ui/Header/HeaderMenuPopUp.js +22 -8
  10. package/src/ui/Header/HeaderSearchPopUp.js +2 -1
  11. package/src/ui/Video/Video.jsx +44 -0
  12. package/src/ui/Video/Video.stories.jsx +53 -0
  13. package/src/ui/index.js +2 -2
  14. package/theme/theme.config +0 -3
  15. package/theme/themes/eea/assets/video/demo-track-el.vtt +11 -0
  16. package/theme/themes/eea/assets/video/demo-track-en.vtt +11 -0
  17. package/theme/themes/eea/assets/video/demo-track-ro.vtt +11 -0
  18. package/theme/themes/eea/collections/table.variables +1 -1
  19. package/theme/themes/eea/elements/image.overrides +6 -0
  20. package/theme/themes/eea/elements/image.variables +1 -0
  21. package/theme/themes/eea/extras/header.less +0 -2
  22. package/theme/themes/eea/globals/mixins.less +8 -0
  23. package/theme/themes/eea/globals/utilities.less +47 -0
  24. package/theme/themes/eea/modules/accordion.overrides +7 -0
  25. package/theme/themes/eea/views/card.overrides +14 -11
  26. package/src/ui/Card/AvatarGrid/AvatarGrid.jsx +0 -61
  27. package/src/ui/Card/AvatarGrid/AvatarGrid.stories.jsx +0 -89
  28. package/src/ui/Card/RoundedCard.stories.jsx +0 -122
  29. package/theme/themes/eea/extras/avatar.variables +0 -28
  30. package/theme/themes/eea/extras/avatarGrid.less +0 -43
  31. package/theme/themes/eea/extras/avatarGrid.variables +0 -16
@@ -33,29 +33,60 @@ Default.args = {
33
33
  header: 'Environmental information systems',
34
34
  description: '',
35
35
  actions: [
36
- { link: '/#', title: 'Privacy' },
37
- { link: '/#', title: 'Sitemap' },
38
- { link: '/#', title: 'CMS Login' },
36
+ { link: '/privacy', title: 'Privacy' },
37
+ { link: '/sitemap', title: 'Sitemap' },
38
+ { link: 'https://www.eea.europa.eu/en/login', title: 'CMS Login' },
39
39
  ],
40
40
  copyright: [
41
41
  { link: 'https://status.eea.europa.eu/', title: 'System status' },
42
- { link: '/#', title: '© Copyright 2023 EEA' },
42
+ {
43
+ link: '/copyright',
44
+ title: '© Copyright 2023 EEA',
45
+ },
43
46
  ],
44
47
  sites: [
45
- { link: '/#', src: Marine, alt: 'WISE marine' },
46
- { link: '/#', src: Freshwater, alt: 'WISE freshwater' },
47
- { link: '/#', src: Bise, alt: 'Biodiversity' },
48
- { link: '/#', src: Fise, alt: 'Forest information system for europe' },
48
+ { link: 'https://water.europa.eu/marine', src: Marine, alt: 'WISE marine' },
49
+ {
50
+ link: 'https://water.europa.eu/freshwater',
51
+ src: Freshwater,
52
+ alt: 'WISE freshwater',
53
+ },
54
+ { link: 'https://biodiversity.europa.eu/', src: Bise, alt: 'Biodiversity' },
49
55
  {
50
- link: '/#',
56
+ link: 'https://forest.eea.europa.eu/',
57
+ src: Fise,
58
+ alt: 'Forest information system for europe',
59
+ },
60
+ {
61
+ link: 'https://climate-adapt.eea.europa.eu/observatory',
51
62
  src: ClimateHealth,
52
63
  alt: 'Information platform for chemical monitoring',
53
64
  },
54
- { link: '/#', src: Cca, alt: 'Climate adapt' },
55
- { link: '/#', src: Industry, alt: 'European industrial emissions portal' },
56
- { link: '/#', src: Energy, alt: 'Climate and energy in the EU' },
57
- { link: '/#', src: Copernicus, alt: 'Copernicus land monitoring service' },
58
- { link: '/#', src: Insitu, alt: 'Copernicus in situ' },
65
+ {
66
+ link: 'https://climate-adapt.eea.europa.eu/',
67
+ src: Cca,
68
+ alt: 'Climate adapt',
69
+ },
70
+ {
71
+ link: 'https://industry.eea.europa.eu/',
72
+ src: Industry,
73
+ alt: 'European industrial emissions portal',
74
+ },
75
+ {
76
+ link: 'https://climate-energy.eea.europa.eu/',
77
+ src: Energy,
78
+ alt: 'Climate and energy in the EU',
79
+ },
80
+ {
81
+ link: 'https://land.copernicus.eu/',
82
+ src: Copernicus,
83
+ alt: 'Copernicus land monitoring service',
84
+ },
85
+ {
86
+ link: 'https://insitu.copernicus.eu/',
87
+ src: Insitu,
88
+ alt: 'Copernicus in situ',
89
+ },
59
90
  ],
60
91
  managedBy: [
61
92
  {
@@ -82,23 +113,43 @@ Default.args = {
82
113
  },
83
114
  ],
84
115
  social: [
85
- { name: 'twitter', icon: 'ri-twitter-fill', link: '/#' },
86
- { name: 'facebook', icon: 'ri-facebook-box-fill', link: '/#' },
87
- { name: 'linkedin', icon: 'ri-linkedin-fill', link: '/#' },
88
- { name: 'youtube', icon: 'ri-youtube-fill', link: '/#' },
89
- { name: 'instagram', icon: 'ri-instagram-fill', link: '/#' },
90
- { name: 'rss', icon: 'ri-rss-fill', link: '/#' },
116
+ {
117
+ name: 'twitter',
118
+ icon: 'ri-twitter-fill',
119
+ link: 'https://twitter.com/euenvironment',
120
+ },
121
+ {
122
+ name: 'facebook',
123
+ icon: 'ri-facebook-box-fill',
124
+ link: 'https://www.facebook.com/European.Environment.Agency',
125
+ },
126
+ {
127
+ name: 'linkedin',
128
+ icon: 'ri-linkedin-fill',
129
+ link: 'https://www.linkedin.com/company/european-environment-agency',
130
+ },
131
+ {
132
+ name: 'youtube',
133
+ icon: 'ri-youtube-fill',
134
+ link: 'https://www.youtube.com/user/EEAvideos',
135
+ },
136
+ {
137
+ name: 'instagram',
138
+ icon: 'ri-instagram-fill',
139
+ link: 'https://www.instagram.com/ourplanet_eu',
140
+ },
141
+ { name: 'rss', icon: 'ri-rss-fill', link: '/subscription/news-feeds' },
91
142
  ],
92
143
  contacts: [
93
144
  {
94
145
  text: 'About us',
95
- link: '/#',
146
+ link: '/about',
96
147
  children: [
97
- { text: 'FAQs', link: '/#' },
98
- { text: 'Careers', link: '/#' },
148
+ { text: 'FAQs', link: 'http://external.site' },
149
+ { text: 'Careers', link: '/careers' },
99
150
  ],
100
151
  },
101
- { text: 'Contact us', link: '/#' },
102
- { text: 'Sign up to our newsletter', link: '/#' },
152
+ { text: 'Contact us', link: '/contact-us' },
153
+ { text: 'Sign up to our newsletter', link: '/newsletter' },
103
154
  ],
104
155
  };
@@ -138,6 +138,7 @@ const Main = ({
138
138
  transparency,
139
139
  inverted,
140
140
  hideSearch,
141
+ isMultilingual,
141
142
  }) => {
142
143
  const history = useHistory();
143
144
  const [activeItem, setActiveItem] = React.useState(pathname);
@@ -154,10 +155,15 @@ const Main = ({
154
155
  setSearchIsActive(false);
155
156
  setBurger('');
156
157
  // remove active menu when we have no pathname which means we hit logo to go home
157
- if (!pathname) {
158
+ //remove the lang route in order to check if empty
159
+ //setActiveItem as pathname when pathname changed
160
+ if (
161
+ !pathname ||
162
+ (isMultilingual === true && !pathname?.split('/')?.slice(2)?.join('/'))
163
+ ) {
158
164
  setActiveItem('');
159
- }
160
- }, [pathname]);
165
+ } else setActiveItem(pathname);
166
+ }, [isMultilingual, pathname]);
161
167
 
162
168
  React.useEffect(() => {
163
169
  if (searchIsActive) {
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useState, useEffect } from 'react';
2
2
  import { Transition } from 'semantic-ui-react';
3
3
  import { Container, Grid, List, Icon, Accordion } from 'semantic-ui-react';
4
4
 
@@ -244,17 +244,31 @@ const SecondLevelContent = ({ element, topics = false, renderMenuItem }) => {
244
244
  };
245
245
 
246
246
  const NestedAccordion = ({ menuItems, renderMenuItem, pathName }) => {
247
- let defaultIndex = -1;
247
+ const [activeIndex, setActiveIndex] = useState(-1);
248
+
249
+ useEffect(() => {
250
+ let index = 0;
251
+ menuItems.forEach((menuItem) => {
252
+ if (pathName.includes(menuItem.url)) setActiveIndex(index);
253
+ ++index;
254
+ });
255
+ }, [menuItems, pathName]);
256
+
248
257
  const rootPanels = [];
249
258
  menuItems.forEach((element, index) => {
250
259
  let x = {};
251
260
  x.key = index;
252
-
253
- if (pathName.indexOf(element.url) !== -1) {
254
- defaultIndex = index;
255
- }
256
261
  x.title = (
257
- <Accordion.Title key={`title-${index}`} index={index} as="button">
262
+ <Accordion.Title
263
+ key={`title-${index}`}
264
+ index={index}
265
+ as="button"
266
+ onClick={() => {
267
+ if (activeIndex === index) {
268
+ setActiveIndex(-1);
269
+ } else setActiveIndex(index);
270
+ }}
271
+ >
258
272
  {element.title}
259
273
  <Icon className="ri-arrow-down-s-line" size="small" />
260
274
  </Accordion.Title>
@@ -289,7 +303,7 @@ const NestedAccordion = ({ menuItems, renderMenuItem, pathName }) => {
289
303
  rootPanels.push(x);
290
304
  });
291
305
 
292
- return <Accordion defaultActiveIndex={defaultIndex} panels={rootPanels} />;
306
+ return <Accordion activeIndex={activeIndex} panels={rootPanels} />;
293
307
  };
294
308
 
295
309
  function HeaderMenuPopUp({
@@ -30,6 +30,7 @@ function HeaderSearchPopUp({
30
30
  const {
31
31
  path = '',
32
32
  buttonTitle,
33
+ buttonUrl,
33
34
  description,
34
35
  placeholder = 'Search',
35
36
  searchSuggestions,
@@ -115,7 +116,7 @@ function HeaderSearchPopUp({
115
116
  <Container>
116
117
  <div>{description}</div>
117
118
  <a
118
- href={defaultView[0].path}
119
+ href={buttonUrl || defaultView[0].path}
119
120
  className="ui button white inverted"
120
121
  title="Advanced search"
121
122
  >
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+
4
+ function Video({ children, align }) {
5
+ return <div className={cx('block video align', align)}>{children}</div>;
6
+ }
7
+
8
+ Video.Body = ({ children, align }) => (
9
+ <div className={cx('video-inner', { 'full-width': align === 'full' })}>
10
+ {children}
11
+ </div>
12
+ );
13
+
14
+ Video.Embed = ({
15
+ children,
16
+ url,
17
+ loop,
18
+ autoPlay,
19
+ align,
20
+ placeholder_image,
21
+ required_caption,
22
+ }) => {
23
+ return (
24
+ <video
25
+ src={url}
26
+ controls={!autoPlay}
27
+ autoPlay={autoPlay}
28
+ muted={autoPlay}
29
+ loop={loop}
30
+ poster={placeholder_image}
31
+ type="video/mp4"
32
+ >
33
+ <track kind="captions" {...required_caption} />
34
+ {children}
35
+ </video>
36
+ );
37
+ };
38
+
39
+ Video.Track = ({ tracks }) =>
40
+ tracks.map((track, index) => {
41
+ return <track {...track} />;
42
+ });
43
+
44
+ export default Video;
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import { Container } from 'semantic-ui-react';
3
+ import Video from './Video';
4
+ import englishTrack from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/video/demo-track-en.vtt';
5
+ import romanianTrack from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/video/demo-track-ro.vtt';
6
+ import greekTrack from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/video/demo-track-el.vtt';
7
+
8
+ export default {
9
+ title: 'Components/Video',
10
+ component: Video,
11
+ argTypes: {
12
+ align: {
13
+ options: ['center', 'right', 'left'],
14
+ control: {
15
+ type: 'select',
16
+ labels: {
17
+ '': 'default',
18
+ },
19
+ },
20
+ defaultValue: 'center',
21
+ table: {
22
+ defaultValue: { summary: 'center' },
23
+ type: { summary: 'string' },
24
+ },
25
+ },
26
+ },
27
+ };
28
+
29
+ const Template = (args) => (
30
+ <Container>
31
+ <Video align={args.align}>
32
+ <Video.Body align={args.align}>
33
+ <Video.Embed {...args}>
34
+ <Video.Track tracks={args.tracks} />
35
+ </Video.Embed>
36
+ </Video.Body>
37
+ </Video>
38
+ </Container>
39
+ );
40
+
41
+ export const Default = Template.bind({});
42
+ Default.args = {
43
+ url: 'https://cmshare.eea.europa.eu/s/Xw7kH2TJGCibHJf/download',
44
+ autoPlay: false,
45
+ loop: false,
46
+ align: 'center',
47
+ placeholder_image: '',
48
+ required_caption: { src: englishTrack, srclang: 'en', label: 'English' },
49
+ tracks: [
50
+ { src: romanianTrack, kind: 'captions', srclang: 'ro', label: 'Română' },
51
+ { src: greekTrack, kind: 'captions', srclang: 'el', label: 'Ελλήνικά' },
52
+ ],
53
+ };
package/src/ui/index.js CHANGED
@@ -22,8 +22,6 @@ export Timeline from './Timeline/Timeline';
22
22
 
23
23
  export Testimonial from './Quote/Testimonial/Testimonial';
24
24
 
25
- export AvatarGrid from './Card/AvatarGrid/AvatarGrid';
26
-
27
25
  export KeyContent from './KeyContent/KeyContent';
28
26
 
29
27
  export DownloadLabeledIcon from './DownloadLabeledIcon/DownloadLabeledIcon';
@@ -39,3 +37,5 @@ export RelatedContent from './Card/RelatedContent/RelatedContent';
39
37
  export Hero from './Hero/Hero';
40
38
 
41
39
  export Copyright from './Copyright/Copyright';
40
+
41
+ export Video from './Video/Video';
@@ -88,10 +88,8 @@
88
88
  @tagList : 'eea';
89
89
  @inpageNavigation : 'eea';
90
90
  @contextNavigation : 'eea';
91
- @avatar : 'eea';
92
91
  @divider : 'eea';
93
92
  @testimonial : 'eea';
94
- @avatarGrid : 'eea';
95
93
  @keyContent : 'eea';
96
94
  @publicationCard : 'eea';
97
95
  @contentBox : 'eea';
@@ -135,5 +133,4 @@
135
133
  @import (optional) "@{siteFolder}/@{addon}/@{addontype}s/@{addonelement}.overrides";
136
134
  }
137
135
 
138
-
139
136
  /* End Config */
@@ -0,0 +1,11 @@
1
+ WEBVTT
2
+
3
+ 00:00:00.000 --> 00:00:11.999 line:80%
4
+ [ΜΟΥΣΙΚΗ]
5
+
6
+ 00:00:12.000 --> 00:01:35.999 line:80%
7
+ Αυτά τα components χρησιμοποιούνται ως παράδειγμα χρήσης.
8
+ Αυτοί οι υπότιτλοι έχουν σκοπό την επίδειξη της λειτουργικότητας.
9
+
10
+ 00:01:36.000 --> 00:01:47.999 line:80%
11
+ [ΜΟΥΣΙΚΗ]
@@ -0,0 +1,11 @@
1
+ WEBVTT
2
+
3
+ 00:00:00.000 --> 00:00:11.999 line:80%
4
+ [MUSIC]
5
+
6
+ 00:00:12.000 --> 00:01:35.999 line:80%
7
+ These components are used for demo purposes.
8
+ This track is an example to demonstrate the functionality.
9
+
10
+ 00:01:36.000 --> 00:01:47.999 line:80%
11
+ [MUSIC]
@@ -0,0 +1,11 @@
1
+ WEBVTT
2
+
3
+ 00:00:00.000 --> 00:00:11.999 line:80%
4
+ [MUZICĂ]
5
+
6
+ 00:00:12.000 --> 00:01:35.999 line:80%
7
+ Aceste componente sunt utilizate în scopuri demonstrative.
8
+ Această piesă este un exemplu pentru a demonstra funcționalitatea.
9
+
10
+ 00:01:36.000 --> 00:01:47.999 line:80%
11
+ [MUZICĂ]
@@ -35,7 +35,7 @@
35
35
  @cellVerticalPadding: @relativeMini;
36
36
  @cellHorizontalPadding: @relativeMini;
37
37
  @cellVerticalAlign: inherit;
38
- @cellTextAlign: center;
38
+ @cellTextAlign: inherit;
39
39
  @cellBorder: 1px solid @secondaryColor;
40
40
 
41
41
  /* Table Header */
@@ -88,6 +88,12 @@
88
88
  position: relative;
89
89
  }
90
90
 
91
+ // https://www.eea.europa.eu/en/newsroom/photo-competitions
92
+ // ensure link focus goes over the image
93
+ .image-block-container > a {
94
+ display: @imageBlockContainerLinkDisplay;
95
+ }
96
+
91
97
  /* if the image is smaller than the content area the copyright
92
98
  isn't as big as the image unless the image is inline-block
93
99
  */
@@ -20,6 +20,7 @@
20
20
  @imageAlignLargeMaxWidth: 50%;
21
21
  @imageAlignMediumMaxWidth: 25%;
22
22
  @imageAlignSmallMaxWidth: 15%;
23
+ @imageBlockContainerLinkDisplay: block;
23
24
 
24
25
  /*-------------------
25
26
  Types
@@ -825,8 +825,6 @@
825
825
  padding: @megaMenuAccordionTitlePadding;
826
826
  border-bottom: @megaMenuAccordionTitleBorderBottom;
827
827
  color: @megaMenuTextColor;
828
- color: @megaMenuTextColor;
829
- font-size: @megaMenuAccordionTitleFontSize;
830
828
  font-size: @megaMenuAccordionTitleFontSize;
831
829
  font-weight: @megaMenuAccordionTitleFontWeight;
832
830
 
@@ -14,3 +14,11 @@
14
14
  .image-overlay-gradient() {
15
15
  .gradientMix(linear; rgba(46, 62, 76, 0.65) 38.6%, rgba(46, 62, 76, 0.169) 59.52%, rgba(69, 95, 106, 0) 79.64%; 13.39deg)
16
16
  }
17
+
18
+ .useTitleMaxLines(@value: 2) {
19
+ display: -webkit-box !important;
20
+ overflow: hidden;
21
+
22
+ -webkit-box-orient: vertical;
23
+ -webkit-line-clamp: var(--title-max-lines, @value);
24
+ }
@@ -37,15 +37,19 @@ h1, h2, h3, h4, h5, h6, p, span, .header {
37
37
  .text-left,
38
38
  .has--text--left,
39
39
  .has--textAlign--left { text-align: left !important; }
40
+
40
41
  .text-center,
41
42
  .has--text--center,
42
43
  .has--textAlign--center { text-align: center !important;}
44
+
43
45
  .text-right,
44
46
  .has--text--right,
45
47
  .has--textAlign--right { text-align: right !important; }
48
+
46
49
  .text-justify,
47
50
  .has--text--justify,
48
51
  .has--textAlign--justify { text-align: justify !important; }
52
+
49
53
  .bold { font-weight: bold !important; }
50
54
 
51
55
  .has--text--left {
@@ -57,6 +61,49 @@ h1, h2, h3, h4, h5, h6, p, span, .header {
57
61
  --justify-content: space-evenly;
58
62
  }
59
63
 
64
+ /*******************************
65
+ Image properties utilities
66
+ *******************************/
67
+
68
+ // image object fit
69
+ .has--object-fit--contain {
70
+ --image-object-fit: contain;
71
+ }
72
+
73
+ .has--object-fit--cover {
74
+ --image-object-fit: cover;
75
+ }
76
+
77
+ .has--object-fit--fill {
78
+ --image-object-fit: fill;
79
+ }
80
+
81
+ .has--object-fit--scale-down {
82
+ --image-object-fit: scale-down;
83
+ }
84
+
85
+ // image object position
86
+ .has--object-position--top {
87
+ --image-object-position: top;
88
+ }
89
+
90
+ .has--object-position--bottom {
91
+ --image-object-position: bottom;
92
+ }
93
+
94
+ .has--object-position--left {
95
+ --image-object-position: left;
96
+ }
97
+
98
+ .has--object-position--right {
99
+ --image-object-position: right;
100
+ }
101
+
102
+ .has--object-position--center {
103
+ --image-object-position: center;
104
+ }
105
+
106
+
60
107
  // background position utilities
61
108
  .has--bg--top {
62
109
  background-position: top !important;
@@ -158,3 +158,10 @@
158
158
  .ui.accordion.tertiary .title:not(.active):focus-visible i {
159
159
  color: @tertiaryColorCSSVar;
160
160
  }
161
+
162
+ @media only screen and (max-width: @largestMobileScreen) {
163
+ .accordion-block h1 * { font-size: @mobileH1; }
164
+ .accordion-block h2 * { font-size: @mobileH2; }
165
+ .accordion-block h3 * { font-size: @mobileH3; }
166
+ .accordion-block h4 * { font-size: @mobileH4; }
167
+ }
@@ -32,11 +32,14 @@
32
32
  img {
33
33
  width: var(--card-image-width, @imageWidth);
34
34
  height: var(--card-image-width, @imageHeight);
35
- object-fit: @imageObjectFit;
36
- object-position: @imageObjectPosition;
37
35
  }
38
36
  }
39
37
 
38
+ .ui.card img, img.ui.image {
39
+ object-fit: var(--image-object-fit, @imageObjectFit);
40
+ object-position: var(--image-object-position, @imageObjectPosition);
41
+ }
42
+
40
43
 
41
44
  .ui.cards > .card > .content > *:not(:last-child),
42
45
  .ui.card > .content > *:not(:last-child) {
@@ -150,6 +153,8 @@
150
153
  width: @roundedImageWidth;
151
154
  height: @roundedImageHeight;
152
155
  border-radius: @roundedImageBorderRadius !important;
156
+ object-fit: var(--image-object-fit, @imageObjectFit);
157
+ object-position: var(--image-object-position, @imageObjectPosition);
153
158
  }
154
159
 
155
160
  .content {
@@ -434,24 +439,22 @@
434
439
  padding-left: @tabletTeaserCardPaddingInline;
435
440
  padding-right: @tabletTeaserCardPaddingInline;
436
441
  }
442
+
437
443
  .grid-block-teaser .ui.card {
438
444
  min-width: @tabletTeaserCardMinWidth;
439
445
  }
440
446
  }
441
447
 
442
- // Added from listing-cards.less
443
- .grid-block-teaser .ui.card.u-card .header {
444
- display: -webkit-box !important;
445
- overflow: hidden;
446
- -webkit-box-orient: vertical;
447
- -webkit-line-clamp: var(--title-max-lines, 3);
448
- }
449
-
450
448
  // Spacing adjustment to display outline with overflow hidden
451
449
  .ui.card .header {
452
450
  padding: @headerPadding;
453
451
  }
452
+
454
453
  .ui.card .header > a {
455
- display: @headerLinkDisplay;
454
+ .useTitleMaxLines();
456
455
  }
457
456
 
457
+ // Meta align fix
458
+ .ui.card.u-card .meta:after {
459
+ content: none;
460
+ }
@@ -1,61 +0,0 @@
1
- import React from 'react';
2
- import { Grid, Card, Image } from 'semantic-ui-react';
3
-
4
- function AvatarGrid({ children, ...rest }) {
5
- return (
6
- <div className="eea avatar-grid" {...rest}>
7
- <div className="wrapper">{children}</div>
8
- </div>
9
- );
10
- }
11
-
12
- AvatarGrid.Content = ({ children }) => {
13
- return <div className="content">{children}</div>;
14
- };
15
-
16
- AvatarGrid.Group = ({ children, ...rest }) => {
17
- let avatars = rest.avatars;
18
-
19
- return (
20
- <div className="avatar group">
21
- <Grid>
22
- {avatars.map((avatar, index) => (
23
- <Grid.Column key={index} mobile={12} tablet={4} computer={4}>
24
- <div className="avatar-wrapper">
25
- <Card
26
- className={`eea rounded ${
27
- rest.variant === 'default' ? '' : rest.variant
28
- } ${rest.inverted ? 'inverted' : ''}`}
29
- fluid={rest.fluid}
30
- >
31
- {rest.hasLink ? (
32
- <Image
33
- as="a"
34
- href={rest.href}
35
- src={avatar.src}
36
- wrapped
37
- ui={false}
38
- alt="card image"
39
- />
40
- ) : (
41
- <Image src={avatar.src} wrapped ui={false} alt="card image" />
42
- )}
43
- <Card.Content>
44
- {rest.hasLink ? (
45
- <Card.Header>
46
- <a href={rest.href}>{avatar.title}</a>
47
- </Card.Header>
48
- ) : (
49
- <Card.Header>{avatar.title}</Card.Header>
50
- )}
51
- <Card.Description>{avatar.description}</Card.Description>
52
- </Card.Content>
53
- </Card>
54
- </div>
55
- </Grid.Column>
56
- ))}
57
- </Grid>
58
- </div>
59
- );
60
- };
61
- export default AvatarGrid;