@eeacms/volto-eea-design-system 0.6.1 → 0.7.1
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 +81 -0
- package/package.json +1 -1
- package/src/helpers/useClickOutside.js +1 -1
- package/src/index.js +4 -1
- package/src/semantic.less +4 -0
- package/src/ui/CallToAction/CallToAction.stories.jsx +33 -91
- package/src/ui/ContextNavigation/ContextNavigation.stories.jsx +73 -0
- package/src/ui/Header/Header.jsx +30 -11
- package/src/ui/Header/HeaderMenuPopUp.js +149 -67
- package/theme/theme.config +26 -11
- package/theme/themes/eea/assets/logo/eionet.svg +11 -9
- package/theme/themes/eea/collections/menu.variables +1 -1
- package/theme/themes/eea/elements/button.overrides +45 -0
- package/theme/themes/eea/elements/container.overrides +5 -2
- package/theme/themes/eea/extras/banner.variables +1 -1
- package/theme/themes/eea/extras/contentBox.less +0 -1
- package/theme/themes/eea/extras/contextNavigation.less +80 -0
- package/theme/themes/eea/extras/contextNavigation.variables +0 -0
- package/theme/themes/eea/extras/footer.less +0 -9
- package/theme/themes/eea/extras/footer.variables +1 -6
- package/theme/themes/eea/extras/header.less +8 -3
- package/theme/themes/eea/extras/header.variables +3 -0
- package/theme/themes/eea/extras/hero.less +9 -0
- package/theme/themes/eea/extras/hero.variables +7 -5
- package/theme/themes/eea/globals/site.variables +10 -0
- package/theme/themes/eea/globals/utilities.less +5 -0
- package/theme/themes/eea/modules/accordion.overrides +41 -0
- package/theme/themes/eea/modules/accordion.variables +6 -6
- package/theme/themes/eea/views/card.overrides +4 -0
- package/theme/themes/eea/views/card.variables +2 -2
- package/theme/themes/eea/views/item.overrides +21 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { Transition } from 'semantic-ui-react';
|
|
2
3
|
import {
|
|
3
4
|
Container,
|
|
4
5
|
Divider,
|
|
@@ -11,7 +12,7 @@ import {
|
|
|
11
12
|
import { Link } from 'react-router-dom';
|
|
12
13
|
import { useClickOutside } from '@eeacms/volto-eea-design-system/helpers';
|
|
13
14
|
|
|
14
|
-
const createColumns = (item, length) => {
|
|
15
|
+
const createColumns = (item, length, renderMenuItem) => {
|
|
15
16
|
let subArrays = [];
|
|
16
17
|
let size = length;
|
|
17
18
|
for (let i = 0; i < item.items.length; i += size) {
|
|
@@ -22,9 +23,13 @@ const createColumns = (item, length) => {
|
|
|
22
23
|
<Grid.Column key={index}>
|
|
23
24
|
<List>
|
|
24
25
|
{subArray.map((arrayItem, idx) => (
|
|
25
|
-
<
|
|
26
|
-
{arrayItem
|
|
27
|
-
|
|
26
|
+
<React.Fragment key={idx}>
|
|
27
|
+
{renderMenuItem(arrayItem, {
|
|
28
|
+
className: 'item',
|
|
29
|
+
role: 'listitem',
|
|
30
|
+
key: idx,
|
|
31
|
+
})}
|
|
32
|
+
</React.Fragment>
|
|
28
33
|
))}
|
|
29
34
|
</List>
|
|
30
35
|
</Grid.Column>
|
|
@@ -33,42 +38,57 @@ const createColumns = (item, length) => {
|
|
|
33
38
|
return column;
|
|
34
39
|
};
|
|
35
40
|
|
|
36
|
-
const ItemGrid = ({ item, columns, length }) => (
|
|
41
|
+
const ItemGrid = ({ item, columns, length, renderMenuItem }) => (
|
|
37
42
|
<>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
</Link>
|
|
41
|
-
<Grid columns={columns}>{createColumns(item, length)}</Grid>
|
|
43
|
+
{renderMenuItem(item, { className: 'sub-title' })}
|
|
44
|
+
<Grid columns={columns}>{createColumns(item, length, renderMenuItem)}</Grid>
|
|
42
45
|
</>
|
|
43
46
|
);
|
|
44
47
|
|
|
45
|
-
const Item = ({ item, icon = false, iconName }) => (
|
|
48
|
+
const Item = ({ item, icon = false, iconName, renderMenuItem }) => (
|
|
46
49
|
<>
|
|
47
|
-
|
|
48
|
-
{item.title}
|
|
49
|
-
</Link>
|
|
50
|
+
{renderMenuItem(item, { className: 'sub-title' })}
|
|
50
51
|
<List className="menu-list">
|
|
51
52
|
{item.items.map((listItem, index) => (
|
|
52
|
-
<
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
<React.Fragment key={index}>
|
|
54
|
+
{renderMenuItem(
|
|
55
|
+
listItem,
|
|
56
|
+
{
|
|
57
|
+
className: 'item',
|
|
58
|
+
key: index,
|
|
59
|
+
role: 'listitem',
|
|
60
|
+
},
|
|
61
|
+
{ children: icon && <Icon className={iconName} /> },
|
|
62
|
+
)}
|
|
63
|
+
</React.Fragment>
|
|
56
64
|
))}
|
|
57
65
|
</List>
|
|
58
66
|
</>
|
|
59
67
|
);
|
|
60
68
|
|
|
61
|
-
const Topics = ({ menuItem }) => (
|
|
69
|
+
const Topics = ({ menuItem, renderMenuItem }) => (
|
|
62
70
|
<Grid>
|
|
63
71
|
{menuItem.items.map((section, index) => (
|
|
64
72
|
<React.Fragment key={index}>
|
|
65
73
|
{section.title === 'At a glance' ? (
|
|
66
74
|
<Grid.Column width={3} id="at-a-glance">
|
|
67
|
-
<Item
|
|
75
|
+
<Item
|
|
76
|
+
item={section}
|
|
77
|
+
icon={true}
|
|
78
|
+
iconName="ri-leaf-line"
|
|
79
|
+
key={index}
|
|
80
|
+
renderMenuItem={renderMenuItem}
|
|
81
|
+
/>
|
|
68
82
|
</Grid.Column>
|
|
69
83
|
) : (
|
|
70
84
|
<Grid.Column width={9} key={index}>
|
|
71
|
-
<ItemGrid
|
|
85
|
+
<ItemGrid
|
|
86
|
+
item={section}
|
|
87
|
+
columns={4}
|
|
88
|
+
length={10}
|
|
89
|
+
key={index}
|
|
90
|
+
renderMenuItem={renderMenuItem}
|
|
91
|
+
/>
|
|
72
92
|
</Grid.Column>
|
|
73
93
|
)}
|
|
74
94
|
</React.Fragment>
|
|
@@ -76,13 +96,18 @@ const Topics = ({ menuItem }) => (
|
|
|
76
96
|
</Grid>
|
|
77
97
|
);
|
|
78
98
|
|
|
79
|
-
const Countries = ({ menuItem }) => (
|
|
99
|
+
const Countries = ({ menuItem, renderMenuItem }) => (
|
|
80
100
|
<Grid>
|
|
81
101
|
<Grid.Column width={8}>
|
|
82
102
|
{menuItem.items.map((section, index) => (
|
|
83
103
|
<React.Fragment key={index}>
|
|
84
104
|
{section.title === 'EEA member countries' && (
|
|
85
|
-
<ItemGrid
|
|
105
|
+
<ItemGrid
|
|
106
|
+
item={section}
|
|
107
|
+
columns={5}
|
|
108
|
+
length={7}
|
|
109
|
+
renderMenuItem={renderMenuItem}
|
|
110
|
+
/>
|
|
86
111
|
)}
|
|
87
112
|
</React.Fragment>
|
|
88
113
|
))}
|
|
@@ -93,7 +118,12 @@ const Countries = ({ menuItem }) => (
|
|
|
93
118
|
<React.Fragment key={index}>
|
|
94
119
|
{section.title !== 'EEA member countries' && (
|
|
95
120
|
<Grid.Column>
|
|
96
|
-
<ItemGrid
|
|
121
|
+
<ItemGrid
|
|
122
|
+
item={section}
|
|
123
|
+
columns={2}
|
|
124
|
+
length={3}
|
|
125
|
+
renderMenuItem={renderMenuItem}
|
|
126
|
+
/>
|
|
97
127
|
</Grid.Column>
|
|
98
128
|
)}
|
|
99
129
|
</React.Fragment>
|
|
@@ -103,46 +133,62 @@ const Countries = ({ menuItem }) => (
|
|
|
103
133
|
</Grid>
|
|
104
134
|
);
|
|
105
135
|
|
|
106
|
-
const StandardMegaMenuGrid = ({ menuItem }) => (
|
|
136
|
+
const StandardMegaMenuGrid = ({ menuItem, renderMenuItem }) => (
|
|
107
137
|
<Grid columns={4}>
|
|
108
138
|
{menuItem.items.map((section, index) => (
|
|
109
139
|
<Grid.Column key={index}>
|
|
110
|
-
<Item item={section} />
|
|
140
|
+
<Item item={section} renderMenuItem={renderMenuItem} />
|
|
111
141
|
</Grid.Column>
|
|
112
142
|
))}
|
|
113
143
|
</Grid>
|
|
114
144
|
);
|
|
115
145
|
|
|
116
|
-
const FirstLevelContent = ({ element }) => {
|
|
146
|
+
const FirstLevelContent = ({ element, renderMenuItem, pathName }) => {
|
|
117
147
|
const topics = element.title === 'Topics' ? true : false;
|
|
148
|
+
let defaultIndex = -1;
|
|
118
149
|
|
|
119
150
|
const firstLevelPanels = [];
|
|
120
151
|
let content;
|
|
121
152
|
if (!topics) {
|
|
122
153
|
element.items.forEach((item, index) => {
|
|
123
154
|
let x = {};
|
|
124
|
-
x.key = item['@id'];
|
|
155
|
+
x.key = item['@id'] || item['url'];
|
|
156
|
+
if (pathName.indexOf(item.url) !== -1) {
|
|
157
|
+
defaultIndex = index;
|
|
158
|
+
}
|
|
125
159
|
x.title = (
|
|
126
|
-
<Accordion.Title key={`title=${index}`}>
|
|
160
|
+
<Accordion.Title key={`title=${index}`} index={index}>
|
|
127
161
|
{item.title}
|
|
128
162
|
<Icon className="ri-arrow-down-s-line" size="small" />
|
|
129
163
|
</Accordion.Title>
|
|
130
164
|
);
|
|
131
165
|
x.content = (
|
|
132
166
|
<Accordion.Content key={index}>
|
|
133
|
-
|
|
167
|
+
{renderMenuItem(item, { className: 'item title-item' })}
|
|
168
|
+
<SecondLevelContent element={item} renderMenuItem={renderMenuItem} />
|
|
134
169
|
</Accordion.Content>
|
|
135
170
|
);
|
|
136
171
|
firstLevelPanels.push(x);
|
|
137
172
|
});
|
|
138
|
-
content =
|
|
173
|
+
content = (
|
|
174
|
+
<Accordion.Accordion
|
|
175
|
+
defaultActiveIndex={defaultIndex}
|
|
176
|
+
panels={firstLevelPanels}
|
|
177
|
+
/>
|
|
178
|
+
);
|
|
139
179
|
} else {
|
|
140
|
-
content =
|
|
180
|
+
content = (
|
|
181
|
+
<SecondLevelContent
|
|
182
|
+
element={element}
|
|
183
|
+
topics={true}
|
|
184
|
+
renderMenuItem={renderMenuItem}
|
|
185
|
+
/>
|
|
186
|
+
);
|
|
141
187
|
}
|
|
142
188
|
return <>{content}</>;
|
|
143
189
|
};
|
|
144
190
|
|
|
145
|
-
const SecondLevelContent = ({ element, topics = false }) => {
|
|
191
|
+
const SecondLevelContent = ({ element, topics = false, renderMenuItem }) => {
|
|
146
192
|
let content;
|
|
147
193
|
if (topics) {
|
|
148
194
|
const atAGlance = element.items.find(
|
|
@@ -150,11 +196,16 @@ const SecondLevelContent = ({ element, topics = false }) => {
|
|
|
150
196
|
);
|
|
151
197
|
content = (
|
|
152
198
|
<List>
|
|
153
|
-
{atAGlance
|
|
154
|
-
|
|
155
|
-
{
|
|
156
|
-
|
|
157
|
-
|
|
199
|
+
{atAGlance &&
|
|
200
|
+
atAGlance.items.map((item, index) => (
|
|
201
|
+
<React.Fragment key={index}>
|
|
202
|
+
{renderMenuItem(item, {
|
|
203
|
+
key: index,
|
|
204
|
+
role: 'listitem',
|
|
205
|
+
className: 'item',
|
|
206
|
+
})}
|
|
207
|
+
</React.Fragment>
|
|
208
|
+
))}
|
|
158
209
|
<Link
|
|
159
210
|
role="listitem"
|
|
160
211
|
className="item"
|
|
@@ -169,9 +220,13 @@ const SecondLevelContent = ({ element, topics = false }) => {
|
|
|
169
220
|
content = (
|
|
170
221
|
<List>
|
|
171
222
|
{element.items.map((item, index) => (
|
|
172
|
-
<
|
|
173
|
-
{item
|
|
174
|
-
|
|
223
|
+
<React.Fragment key={index}>
|
|
224
|
+
{renderMenuItem(item, {
|
|
225
|
+
key: index,
|
|
226
|
+
role: 'listitem',
|
|
227
|
+
className: 'item',
|
|
228
|
+
})}
|
|
229
|
+
</React.Fragment>
|
|
175
230
|
))}
|
|
176
231
|
</List>
|
|
177
232
|
);
|
|
@@ -180,29 +235,47 @@ const SecondLevelContent = ({ element, topics = false }) => {
|
|
|
180
235
|
return <>{content}</>;
|
|
181
236
|
};
|
|
182
237
|
|
|
183
|
-
const NestedAccordion = ({ menuItems }) => {
|
|
238
|
+
const NestedAccordion = ({ menuItems, renderMenuItem, pathName }) => {
|
|
239
|
+
let defaultIndex = -1;
|
|
184
240
|
const rootPanels = [];
|
|
185
241
|
menuItems.forEach((element, index) => {
|
|
186
242
|
let x = {};
|
|
187
243
|
x.key = index;
|
|
244
|
+
|
|
245
|
+
if (pathName.indexOf(element.url) !== -1) {
|
|
246
|
+
defaultIndex = index;
|
|
247
|
+
}
|
|
188
248
|
x.title = (
|
|
189
|
-
<Accordion.Title key={`title-${index}`}>
|
|
249
|
+
<Accordion.Title key={`title-${index}`} index={index}>
|
|
190
250
|
{element.title}
|
|
191
251
|
<Icon className="ri-arrow-down-s-line" size="small" />
|
|
192
252
|
</Accordion.Title>
|
|
193
253
|
);
|
|
194
254
|
x.content = (
|
|
195
255
|
<Accordion.Content key={index}>
|
|
196
|
-
|
|
256
|
+
{renderMenuItem(element, { className: 'item' })}
|
|
257
|
+
<FirstLevelContent
|
|
258
|
+
element={element}
|
|
259
|
+
renderMenuItem={renderMenuItem}
|
|
260
|
+
pathName={pathName}
|
|
261
|
+
/>
|
|
197
262
|
</Accordion.Content>
|
|
198
263
|
);
|
|
199
264
|
rootPanels.push(x);
|
|
200
265
|
});
|
|
201
266
|
|
|
202
|
-
return <Accordion panels={rootPanels} />;
|
|
267
|
+
return <Accordion defaultActiveIndex={defaultIndex} panels={rootPanels} />;
|
|
203
268
|
};
|
|
204
269
|
|
|
205
|
-
function HeaderMenuPopUp({
|
|
270
|
+
function HeaderMenuPopUp({
|
|
271
|
+
menuItems,
|
|
272
|
+
renderMenuItem,
|
|
273
|
+
pathName,
|
|
274
|
+
onClose,
|
|
275
|
+
triggerRefs,
|
|
276
|
+
activeItem,
|
|
277
|
+
visible,
|
|
278
|
+
}) {
|
|
206
279
|
const nodeRef = React.useRef();
|
|
207
280
|
useClickOutside({ targetRefs: [nodeRef, ...triggerRefs], callback: onClose });
|
|
208
281
|
|
|
@@ -211,29 +284,38 @@ function HeaderMenuPopUp({ menuItems, onClose, triggerRefs, activeItem }) {
|
|
|
211
284
|
);
|
|
212
285
|
|
|
213
286
|
return (
|
|
214
|
-
<
|
|
215
|
-
<
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
<
|
|
219
|
-
<
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
287
|
+
<Transition visible={visible} animation="slide down" duration={300}>
|
|
288
|
+
<div id="mega-menu" ref={nodeRef}>
|
|
289
|
+
<Container>
|
|
290
|
+
{menuItem && (
|
|
291
|
+
<div className="menu-content tablet hidden mobile hidden">
|
|
292
|
+
<h3 className="title">{renderMenuItem(menuItem)}</h3>
|
|
293
|
+
<Divider fitted />
|
|
294
|
+
{menuItem.title === 'Topics' ? (
|
|
295
|
+
<Topics menuItem={menuItem} renderMenuItem={renderMenuItem} />
|
|
296
|
+
) : menuItem.title === 'Countries' ? (
|
|
297
|
+
<Countries
|
|
298
|
+
menuItem={menuItem}
|
|
299
|
+
renderMenuItem={renderMenuItem}
|
|
300
|
+
/>
|
|
301
|
+
) : (
|
|
302
|
+
<StandardMegaMenuGrid
|
|
303
|
+
menuItem={menuItem}
|
|
304
|
+
renderMenuItem={renderMenuItem}
|
|
305
|
+
/>
|
|
306
|
+
)}
|
|
307
|
+
</div>
|
|
308
|
+
)}
|
|
309
|
+
<div className="tablet only mobile only">
|
|
310
|
+
<NestedAccordion
|
|
311
|
+
menuItems={menuItems}
|
|
312
|
+
renderMenuItem={renderMenuItem}
|
|
313
|
+
pathName={pathName}
|
|
314
|
+
/>
|
|
229
315
|
</div>
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
<NestedAccordion menuItems={menuItems} />
|
|
234
|
-
</div>
|
|
235
|
-
</Container>
|
|
236
|
-
</div>
|
|
316
|
+
</Container>
|
|
317
|
+
</div>
|
|
318
|
+
</Transition>
|
|
237
319
|
);
|
|
238
320
|
}
|
|
239
321
|
|
package/theme/theme.config
CHANGED
|
@@ -77,23 +77,38 @@
|
|
|
77
77
|
@main : 'eea';
|
|
78
78
|
@custom : 'eea';
|
|
79
79
|
/* EEA Design system custom components */
|
|
80
|
-
@blockquote
|
|
81
|
-
@
|
|
82
|
-
@banner
|
|
83
|
-
@timeline
|
|
84
|
-
@footer
|
|
85
|
-
@header
|
|
86
|
-
@tag
|
|
80
|
+
@blockquote : 'eea';
|
|
81
|
+
@pullquote : 'eea';
|
|
82
|
+
@banner : 'eea';
|
|
83
|
+
@timeline : 'eea';
|
|
84
|
+
@footer : 'eea';
|
|
85
|
+
@header : 'eea';
|
|
86
|
+
@tag : 'eea';
|
|
87
|
+
@tags : 'eea';
|
|
88
|
+
@tagList : 'eea';
|
|
87
89
|
@inpageNavigation : 'eea';
|
|
88
|
-
@
|
|
89
|
-
@
|
|
90
|
-
@
|
|
90
|
+
@contextNavigation : 'eea';
|
|
91
|
+
@avatar : 'eea';
|
|
92
|
+
@divider : 'eea';
|
|
93
|
+
@testimonial : 'eea';
|
|
94
|
+
@avatarGrid : 'eea';
|
|
95
|
+
@keyContent : 'eea';
|
|
91
96
|
@publicationCard : 'eea';
|
|
97
|
+
@contentBox : 'eea';
|
|
98
|
+
@reverseCardGrid : 'eea';
|
|
99
|
+
@relatedContent : 'eea';
|
|
100
|
+
@share : 'eea';
|
|
101
|
+
@faqContent : 'eea';
|
|
102
|
+
@reportCard : 'eea';
|
|
103
|
+
@faqFilter : 'eea';
|
|
104
|
+
@contentAccordion : 'eea';
|
|
92
105
|
@downloadLabeledIcon :'eea';
|
|
93
106
|
@newTabLabeledIcon : 'eea';
|
|
94
107
|
@labeledIconGroup : 'eea';
|
|
95
108
|
@languageLabeledIcon : 'eea';
|
|
96
|
-
@
|
|
109
|
+
@callout : 'eea';
|
|
110
|
+
@quote : 'eea';
|
|
111
|
+
@hero : 'eea';
|
|
97
112
|
|
|
98
113
|
/*******************************
|
|
99
114
|
Folders
|