@eeacms/volto-eea-design-system 0.2.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.
Files changed (263) hide show
  1. package/.coverage.babel.config.js +13 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +50 -0
  4. package/.github/workflows/node.js.yml +59 -0
  5. package/.prettierignore +4 -0
  6. package/.project.eslintrc.js +45 -0
  7. package/.release-it.json +17 -0
  8. package/.storybook/manager.js +15 -0
  9. package/CHANGELOG.md +1025 -0
  10. package/DEVELOP.md +51 -0
  11. package/LICENSE.md +9 -0
  12. package/README.md +196 -0
  13. package/bootstrap +41 -0
  14. package/cypress.json +17 -0
  15. package/jest-addon.config.js +36 -0
  16. package/locales/volto.pot +0 -0
  17. package/mockups/README.md +1 -0
  18. package/package.json +49 -0
  19. package/razzle.extend.js +23 -0
  20. package/src/helpers/index.js +2 -0
  21. package/src/helpers/useClickOutside.js +30 -0
  22. package/src/helpers/usePrevious.js +9 -0
  23. package/src/i18n.js +180 -0
  24. package/src/index.js +6 -0
  25. package/src/semantic.less +262 -0
  26. package/src/ui/Avatar/Avatar.jsx +32 -0
  27. package/src/ui/Avatar/Avatar.stories.jsx +61 -0
  28. package/src/ui/AvatarGrid/AvatarGrid.jsx +49 -0
  29. package/src/ui/AvatarGrid/AvatarGrid.stories.jsx +66 -0
  30. package/src/ui/Banner/Banner.jsx +59 -0
  31. package/src/ui/Banner/Banner.stories.jsx +121 -0
  32. package/src/ui/Blockquote/Blockquote.jsx +16 -0
  33. package/src/ui/Blockquote/Blockquote.stories.jsx +48 -0
  34. package/src/ui/Breadcrumbs/Breadcrumb.stories.jsx +76 -0
  35. package/src/ui/Breadcrumbs/Breadcrumbs.jsx +67 -0
  36. package/src/ui/Breadcrumbs/Breadcrumbs.stories.jsx +30 -0
  37. package/src/ui/Button/Button.stories.jsx +169 -0
  38. package/src/ui/Divider/Divider.jsx +7 -0
  39. package/src/ui/Footer/Contact.jsx +28 -0
  40. package/src/ui/Footer/Footer.jsx +52 -0
  41. package/src/ui/Footer/FooterActions.jsx +22 -0
  42. package/src/ui/Footer/FooterHeader.jsx +10 -0
  43. package/src/ui/Footer/FooterSites.jsx +33 -0
  44. package/src/ui/Footer/Social.jsx +25 -0
  45. package/src/ui/Footer/SubFooter.jsx +9 -0
  46. package/src/ui/FormFieldWrapper/FormFieldWrapper.jsx +51 -0
  47. package/src/ui/Header/Header.jsx +224 -0
  48. package/src/ui/Header/HeaderMenuPopUp.js +79 -0
  49. package/src/ui/Header/HeaderSearchPopUp.js +33 -0
  50. package/src/ui/InpageNavigation/InpageNavigation.jsx +61 -0
  51. package/src/ui/InpageNavigation/InpageNavigation.stories.jsx +166 -0
  52. package/src/ui/KeyContent/KeyContent.jsx +22 -0
  53. package/src/ui/KeyContent/KeyContent.stories.jsx +62 -0
  54. package/src/ui/Loader/Loader.stories.jsx +45 -0
  55. package/src/ui/Logo/Logo.jsx +31 -0
  56. package/src/ui/Popup/Popup.stories.jsx +97 -0
  57. package/src/ui/PublicationCard/PublicationCard.jsx +27 -0
  58. package/src/ui/PublicationCard/PublicationCard.stories.jsx +69 -0
  59. package/src/ui/Pullquote/Pullquote.jsx +44 -0
  60. package/src/ui/Pullquote/Pullquote.stories.jsx +101 -0
  61. package/src/ui/RelatedContent/RelatedContent.jsx +90 -0
  62. package/src/ui/RelatedContent/RelatedContent.stories.jsx +80 -0
  63. package/src/ui/Segment/Segment.stories.jsx +163 -0
  64. package/src/ui/Tag/Tag.jsx +13 -0
  65. package/src/ui/Tag/Tag.stories.jsx +21 -0
  66. package/src/ui/TagList/TagList.jsx +23 -0
  67. package/src/ui/TagList/TagList.stories.jsx +63 -0
  68. package/src/ui/Testimonial/Testimonial.jsx +53 -0
  69. package/src/ui/Testimonial/Testimonial.stories.jsx +51 -0
  70. package/src/ui/Timeline/Timeline.jsx +44 -0
  71. package/src/ui/Timeline/Timeline.stories.jsx +322 -0
  72. package/src/ui/index.js +31 -0
  73. package/templates/eea.hbs +50 -0
  74. package/theme/theme.config +122 -0
  75. package/theme/theme.less +64 -0
  76. package/theme/themes/eea/assets/images/EEA_Logo_Vertical.png +0 -0
  77. package/theme/themes/eea/assets/images/Footer/EEALogo.png +0 -0
  78. package/theme/themes/eea/assets/images/Footer/EULogo.png +0 -0
  79. package/theme/themes/eea/assets/images/Footer/Extras/Logo1.png +0 -0
  80. package/theme/themes/eea/assets/images/Footer/Extras/Logo10.png +0 -0
  81. package/theme/themes/eea/assets/images/Footer/Extras/Logo2.png +0 -0
  82. package/theme/themes/eea/assets/images/Footer/Extras/Logo3.png +0 -0
  83. package/theme/themes/eea/assets/images/Footer/Extras/Logo4.png +0 -0
  84. package/theme/themes/eea/assets/images/Footer/Extras/Logo5.png +0 -0
  85. package/theme/themes/eea/assets/images/Footer/Extras/Logo6.png +0 -0
  86. package/theme/themes/eea/assets/images/Footer/Extras/Logo7.png +0 -0
  87. package/theme/themes/eea/assets/images/Footer/Extras/Logo8.png +0 -0
  88. package/theme/themes/eea/assets/images/Footer/Extras/Logo9.png +0 -0
  89. package/theme/themes/eea/assets/images/Footer/Extras/abstract-visual.svg +32 -0
  90. package/theme/themes/eea/assets/images/Footer/Extras/footervisual.svg +1755 -0
  91. package/theme/themes/eea/assets/images/Footer/Vector1.png +0 -0
  92. package/theme/themes/eea/assets/images/Footer/Vector2.png +0 -0
  93. package/theme/themes/eea/assets/images/Header/EeaLogo.png +0 -0
  94. package/theme/themes/eea/assets/images/Header/Vector.png +0 -0
  95. package/theme/themes/eea/assets/images/Header/close-line.svg +1 -0
  96. package/theme/themes/eea/assets/images/Header/close.png +0 -0
  97. package/theme/themes/eea/assets/images/Header/down-arrow.png +0 -0
  98. package/theme/themes/eea/assets/images/Header/eea-logo.svg +14 -0
  99. package/theme/themes/eea/assets/images/Header/eea.png +0 -0
  100. package/theme/themes/eea/assets/images/Header/eeaIcon.png +0 -0
  101. package/theme/themes/eea/assets/images/Header/global-line.svg +1 -0
  102. package/theme/themes/eea/assets/images/Header/globeIcon.png +0 -0
  103. package/theme/themes/eea/assets/images/Header/hamburgerMenuIcon.png +0 -0
  104. package/theme/themes/eea/assets/images/Header/menu-left-arrow.svg +3 -0
  105. package/theme/themes/eea/assets/images/Header/menu-line.svg +1 -0
  106. package/theme/themes/eea/assets/images/Header/search-line.svg +1 -0
  107. package/theme/themes/eea/assets/images/Header/search.png +0 -0
  108. package/theme/themes/eea/assets/images/Header/searchIcon.png +0 -0
  109. package/theme/themes/eea/assets/images/arrow-down.svg +10 -0
  110. package/theme/themes/eea/assets/images/avatar.png +0 -0
  111. package/theme/themes/eea/assets/images/banner.png +0 -0
  112. package/theme/themes/eea/assets/images/eea-logo.png +0 -0
  113. package/theme/themes/eea/assets/images/eea_icon.png +0 -0
  114. package/theme/themes/eea/assets/images/europe-flag.svg +4 -0
  115. package/theme/themes/eea/assets/images/home-icon.svg +3 -0
  116. package/theme/themes/eea/assets/images/loaderImage.png +0 -0
  117. package/theme/themes/eea/assets/images/mega-menu-arrow.svg +3 -0
  118. package/theme/themes/eea/assets/logo/EEA-Logo-White-2.svg +9 -0
  119. package/theme/themes/eea/assets/logo/EEA-Logo-white.svg +9 -0
  120. package/theme/themes/eea/assets/logo/EIONETLogo.png +0 -0
  121. package/theme/themes/eea/assets/logo/bise.svg +47 -0
  122. package/theme/themes/eea/assets/logo/cca.svg +20 -0
  123. package/theme/themes/eea/assets/logo/copernicus.svg +62 -0
  124. package/theme/themes/eea/assets/logo/energy.svg +77 -0
  125. package/theme/themes/eea/assets/logo/fise.svg +37 -0
  126. package/theme/themes/eea/assets/logo/freshwater.svg +48 -0
  127. package/theme/themes/eea/assets/logo/industry.svg +40 -0
  128. package/theme/themes/eea/assets/logo/insitu.svg +43 -0
  129. package/theme/themes/eea/assets/logo/ipchem.svg +23 -0
  130. package/theme/themes/eea/assets/logo/marine.svg +63 -0
  131. package/theme/themes/eea/collections/breadcrumb.overrides +44 -0
  132. package/theme/themes/eea/collections/breadcrumb.variables +49 -0
  133. package/theme/themes/eea/collections/form.overrides +56 -0
  134. package/theme/themes/eea/collections/form.variables +211 -0
  135. package/theme/themes/eea/collections/grid.overrides +17 -0
  136. package/theme/themes/eea/collections/grid.variables +103 -0
  137. package/theme/themes/eea/collections/menu.overrides +84 -0
  138. package/theme/themes/eea/collections/menu.variables +471 -0
  139. package/theme/themes/eea/collections/message.overrides +34 -0
  140. package/theme/themes/eea/collections/message.variables +142 -0
  141. package/theme/themes/eea/collections/table.overrides +30 -0
  142. package/theme/themes/eea/collections/table.variables +249 -0
  143. package/theme/themes/eea/definitions/elements/icon.less +499 -0
  144. package/theme/themes/eea/elements/button.overrides +199 -0
  145. package/theme/themes/eea/elements/button.variables +405 -0
  146. package/theme/themes/eea/elements/container.overrides +98 -0
  147. package/theme/themes/eea/elements/container.variables +66 -0
  148. package/theme/themes/eea/elements/divider.overrides +17 -0
  149. package/theme/themes/eea/elements/divider.variables +53 -0
  150. package/theme/themes/eea/elements/flag.overrides +1235 -0
  151. package/theme/themes/eea/elements/flag.variables +13 -0
  152. package/theme/themes/eea/elements/header.overrides +205 -0
  153. package/theme/themes/eea/elements/header.variables +151 -0
  154. package/theme/themes/eea/elements/icon.overrides +5589 -0
  155. package/theme/themes/eea/elements/icon.variables +95 -0
  156. package/theme/themes/eea/elements/image.overrides +3 -0
  157. package/theme/themes/eea/elements/image.variables +44 -0
  158. package/theme/themes/eea/elements/input.overrides +83 -0
  159. package/theme/themes/eea/elements/input.variables +104 -0
  160. package/theme/themes/eea/elements/label.overrides +49 -0
  161. package/theme/themes/eea/elements/label.variables +267 -0
  162. package/theme/themes/eea/elements/list.overrides +28 -0
  163. package/theme/themes/eea/elements/list.variables +233 -0
  164. package/theme/themes/eea/elements/loader.overrides +3 -0
  165. package/theme/themes/eea/elements/loader.variables +73 -0
  166. package/theme/themes/eea/elements/placeholder.overrides +3 -0
  167. package/theme/themes/eea/elements/placeholder.variables +55 -0
  168. package/theme/themes/eea/elements/rail.overrides +3 -0
  169. package/theme/themes/eea/elements/rail.variables +34 -0
  170. package/theme/themes/eea/elements/reveal.overrides +3 -0
  171. package/theme/themes/eea/elements/reveal.variables +18 -0
  172. package/theme/themes/eea/elements/segment.overrides +8 -0
  173. package/theme/themes/eea/elements/segment.variables +154 -0
  174. package/theme/themes/eea/elements/step.overrides +18 -0
  175. package/theme/themes/eea/elements/step.variables +130 -0
  176. package/theme/themes/eea/extras/avatar.less +97 -0
  177. package/theme/themes/eea/extras/avatar.variables +34 -0
  178. package/theme/themes/eea/extras/avatarGrid.less +43 -0
  179. package/theme/themes/eea/extras/avatarGrid.variables +20 -0
  180. package/theme/themes/eea/extras/banner.less +213 -0
  181. package/theme/themes/eea/extras/banner.variables +77 -0
  182. package/theme/themes/eea/extras/blockquote.less +89 -0
  183. package/theme/themes/eea/extras/blockquote.variables +35 -0
  184. package/theme/themes/eea/extras/custom.overrides +0 -0
  185. package/theme/themes/eea/extras/custom.variables +0 -0
  186. package/theme/themes/eea/extras/divider.less +14 -0
  187. package/theme/themes/eea/extras/divider.variables +9 -0
  188. package/theme/themes/eea/extras/footer.less +273 -0
  189. package/theme/themes/eea/extras/footer.variables +109 -0
  190. package/theme/themes/eea/extras/header.less +691 -0
  191. package/theme/themes/eea/extras/header.variables +149 -0
  192. package/theme/themes/eea/extras/inpageNavigation.less +57 -0
  193. package/theme/themes/eea/extras/inpageNavigation.variables +30 -0
  194. package/theme/themes/eea/extras/keyContent.less +36 -0
  195. package/theme/themes/eea/extras/keyContent.variables +18 -0
  196. package/theme/themes/eea/extras/main.overrides +31 -0
  197. package/theme/themes/eea/extras/main.variables +33 -0
  198. package/theme/themes/eea/extras/publicationCard.less +62 -0
  199. package/theme/themes/eea/extras/publicationCard.variables +24 -0
  200. package/theme/themes/eea/extras/pullquote.less +76 -0
  201. package/theme/themes/eea/extras/pullquote.variables +34 -0
  202. package/theme/themes/eea/extras/select.overrides +0 -0
  203. package/theme/themes/eea/extras/select.variables +0 -0
  204. package/theme/themes/eea/extras/tag.less +37 -0
  205. package/theme/themes/eea/extras/tag.variables +22 -0
  206. package/theme/themes/eea/extras/tagList.less +50 -0
  207. package/theme/themes/eea/extras/tagList.variables +13 -0
  208. package/theme/themes/eea/extras/testimonial.less +28 -0
  209. package/theme/themes/eea/extras/testimonial.variables +13 -0
  210. package/theme/themes/eea/extras/timeline.less +114 -0
  211. package/theme/themes/eea/extras/timeline.variables +40 -0
  212. package/theme/themes/eea/globals/reset.overrides +454 -0
  213. package/theme/themes/eea/globals/reset.variables +6 -0
  214. package/theme/themes/eea/globals/site.overrides +27 -0
  215. package/theme/themes/eea/globals/site.variables +1135 -0
  216. package/theme/themes/eea/modules/accordion.overrides +83 -0
  217. package/theme/themes/eea/modules/accordion.variables +114 -0
  218. package/theme/themes/eea/modules/chatroom.overrides +3 -0
  219. package/theme/themes/eea/modules/chatroom.variables +3 -0
  220. package/theme/themes/eea/modules/checkbox.overrides +67 -0
  221. package/theme/themes/eea/modules/checkbox.variables +194 -0
  222. package/theme/themes/eea/modules/dimmer.overrides +3 -0
  223. package/theme/themes/eea/modules/dimmer.variables +58 -0
  224. package/theme/themes/eea/modules/dropdown.overrides +53 -0
  225. package/theme/themes/eea/modules/dropdown.variables +390 -0
  226. package/theme/themes/eea/modules/embed.overrides +3 -0
  227. package/theme/themes/eea/modules/embed.variables +53 -0
  228. package/theme/themes/eea/modules/modal.overrides +3 -0
  229. package/theme/themes/eea/modules/modal.variables +193 -0
  230. package/theme/themes/eea/modules/nag.overrides +3 -0
  231. package/theme/themes/eea/modules/nag.variables +74 -0
  232. package/theme/themes/eea/modules/popup.overrides +83 -0
  233. package/theme/themes/eea/modules/popup.variables +153 -0
  234. package/theme/themes/eea/modules/progress.overrides +3 -0
  235. package/theme/themes/eea/modules/progress.variables +113 -0
  236. package/theme/themes/eea/modules/rating.overrides +74 -0
  237. package/theme/themes/eea/modules/rating.variables +103 -0
  238. package/theme/themes/eea/modules/search.overrides +3 -0
  239. package/theme/themes/eea/modules/search.variables +163 -0
  240. package/theme/themes/eea/modules/shape.overrides +3 -0
  241. package/theme/themes/eea/modules/shape.variables +40 -0
  242. package/theme/themes/eea/modules/sidebar.overrides +3 -0
  243. package/theme/themes/eea/modules/sidebar.variables +45 -0
  244. package/theme/themes/eea/modules/sticky.overrides +3 -0
  245. package/theme/themes/eea/modules/sticky.variables +7 -0
  246. package/theme/themes/eea/modules/tab.overrides +13 -0
  247. package/theme/themes/eea/modules/tab.variables +17 -0
  248. package/theme/themes/eea/modules/transition.overrides +1087 -0
  249. package/theme/themes/eea/modules/transition.variables +10 -0
  250. package/theme/themes/eea/modules/video.overrides +3 -0
  251. package/theme/themes/eea/modules/video.variables +16 -0
  252. package/theme/themes/eea/views/ad.overrides +3 -0
  253. package/theme/themes/eea/views/ad.variables +13 -0
  254. package/theme/themes/eea/views/card.overrides +73 -0
  255. package/theme/themes/eea/views/card.variables +237 -0
  256. package/theme/themes/eea/views/comment.overrides +3 -0
  257. package/theme/themes/eea/views/comment.variables +98 -0
  258. package/theme/themes/eea/views/feed.overrides +3 -0
  259. package/theme/themes/eea/views/feed.variables +141 -0
  260. package/theme/themes/eea/views/item.overrides +8 -0
  261. package/theme/themes/eea/views/item.variables +157 -0
  262. package/theme/themes/eea/views/statistic.overrides +19 -0
  263. package/theme/themes/eea/views/statistic.variables +105 -0
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Header component.
3
+ * @module components/theme/Header/Header
4
+ */
5
+
6
+ import React from 'react'; // , { Component }
7
+ import cx from 'classnames';
8
+ import { Container, Image, Menu, Grid, Dropdown } from 'semantic-ui-react'; // Dropdown,
9
+
10
+ import closeIcon from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/close-line.svg';
11
+ import searchIcon from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/search-line.svg';
12
+ import burgerIcon from '@eeacms/volto-eea-design-system/../theme/themes/eea/assets/images/Header/menu-line.svg';
13
+
14
+ import HeaderSearchPopUp from './HeaderSearchPopUp';
15
+ import HeaderMenuPopUp from './HeaderMenuPopUp';
16
+
17
+ function Header({ children }) {
18
+ return <div className="eea header">{children}</div>;
19
+ }
20
+
21
+ const TopHeader = ({ children }) => (
22
+ <div className="top bar">
23
+ <Container>{children}</Container>
24
+ </div>
25
+ );
26
+
27
+ const TopItem = ({ children, className, id }) => (
28
+ <div className={cx('item', 'header-top-item', className)} id={id}>
29
+ {children}
30
+ </div>
31
+ );
32
+
33
+ const TopDropdownMenu = ({
34
+ children,
35
+ className,
36
+ icon,
37
+ id,
38
+ mobileText,
39
+ text,
40
+ viewportWidth,
41
+ }) => {
42
+ const isMobile = viewportWidth < 480;
43
+
44
+ const Component = ({ mobileText }) => (
45
+ <Dropdown
46
+ id={id}
47
+ className={className}
48
+ text={mobileText || text}
49
+ icon={icon || 'chevron down'}
50
+ aria-label="dropdown"
51
+ >
52
+ <Dropdown.Menu role="group">{children}</Dropdown.Menu>
53
+ </Dropdown>
54
+ );
55
+ return (
56
+ <>{isMobile ? <Component mobileText={mobileText} /> : <Component />}</>
57
+ );
58
+ };
59
+
60
+ const Main = ({
61
+ logo,
62
+ menuItems,
63
+ renderMenuItem,
64
+ renderGlobalMenuItem,
65
+ pathname,
66
+ }) => {
67
+ const [activeItem, setActiveItem] = React.useState('');
68
+ const [menuIsActive, setMenuIsActive] = React.useState(false);
69
+ const [searchIsActive, setSearchIsActive] = React.useState(false);
70
+ const [burger, setBurger] = React.useState('');
71
+
72
+ React.useEffect(() => {
73
+ setMenuIsActive(false);
74
+ setSearchIsActive(false);
75
+ setBurger('');
76
+ }, [pathname]);
77
+
78
+ const searchOnClick = (e, x) => {
79
+ if (menuIsActive === true) {
80
+ setBurger('');
81
+ setMenuIsActive(false);
82
+ }
83
+ setSearchIsActive(!searchIsActive);
84
+ setActiveItem('');
85
+ };
86
+
87
+ const mobileBurgerOnClick = () => {
88
+ if (searchIsActive === true) {
89
+ setSearchIsActive(false);
90
+ }
91
+
92
+ if (burger === '') {
93
+ setBurger('open');
94
+ setMenuIsActive(true);
95
+ } else {
96
+ setBurger('');
97
+ setMenuIsActive(false);
98
+ }
99
+ };
100
+
101
+ const desktopBurgerOnClick = () => {
102
+ setMenuIsActive(false);
103
+ setActiveItem('');
104
+ };
105
+
106
+ const menuOnClick = (e, item) => {
107
+ if (searchIsActive) setSearchIsActive(false);
108
+ setActiveItem(item['@id'] || item.url);
109
+ setMenuIsActive(true);
110
+ };
111
+
112
+ React.useEffect(() => {
113
+ if (searchIsActive || burger === 'open' || menuIsActive) {
114
+ document.body.style.overflow = 'hidden';
115
+ } else {
116
+ document.body.style.overflow = 'unset';
117
+ }
118
+ }, [searchIsActive, burger, menuIsActive]);
119
+
120
+ const node = React.useRef();
121
+ const searchButtonRef = React.useRef();
122
+ const desktopMenuBurgerRef = React.useRef();
123
+ const mobileMenuBurgerRef = React.useRef();
124
+
125
+ return (
126
+ <div className="main bar" ref={node}>
127
+ <Container>
128
+ <Grid>
129
+ <Grid.Column mobile={8} tablet={8} computer={4}>
130
+ {logo}
131
+ </Grid.Column>
132
+ <Grid.Column mobile={4} tablet={4} computer={8}>
133
+ <div className="main-menu">
134
+ {!menuIsActive && menuItems && (
135
+ <Menu className="eea-main-menu tablet or lower hidden" text>
136
+ {menuItems.map((item) => (
137
+ <Menu.Item
138
+ name={item['@id'] || item.url}
139
+ active={activeItem === item.key}
140
+ key={item['@id'] || item.url}
141
+ >
142
+ {renderGlobalMenuItem(item, {
143
+ onClick: menuOnClick,
144
+ })}
145
+ </Menu.Item>
146
+ ))}
147
+ </Menu>
148
+ )}
149
+ {menuIsActive && (
150
+ <Header.BurgerAction
151
+ className="desktop"
152
+ onClick={desktopBurgerOnClick}
153
+ ref={desktopMenuBurgerRef}
154
+ >
155
+ {/* <Icon name="close" /> */}
156
+ <Image src={closeIcon} alt="menu close icon" />
157
+ </Header.BurgerAction>
158
+ )}
159
+ <div
160
+ className="search-action"
161
+ onClick={searchOnClick}
162
+ role="none"
163
+ ref={searchButtonRef}
164
+ >
165
+ {/* <Icon name={!state.activeSearch ? 'search' : 'close'} /> */}
166
+ <Image
167
+ src={!searchIsActive ? `${searchIcon}` : `${closeIcon}`}
168
+ alt="search button open/close"
169
+ />
170
+ </div>
171
+ <Header.BurgerAction
172
+ className={`mobile ${burger}`}
173
+ onClick={mobileBurgerOnClick}
174
+ ref={mobileMenuBurgerRef}
175
+ >
176
+ {/* <Icon
177
+ name={this.state.burger === 'open' ? 'close' : 'bars'}
178
+ ></Icon> */}
179
+ <Image
180
+ src={burger === 'open' ? `${closeIcon}` : `${burgerIcon}`}
181
+ alt="menu icon open/close"
182
+ />
183
+ </Header.BurgerAction>
184
+ </div>
185
+ </Grid.Column>
186
+ </Grid>
187
+ </Container>
188
+ {searchIsActive && (
189
+ <HeaderSearchPopUp
190
+ onClose={searchOnClick}
191
+ triggerRefs={[searchButtonRef]}
192
+ />
193
+ )}
194
+ {menuIsActive && (
195
+ <HeaderMenuPopUp
196
+ renderMenuItem={renderMenuItem}
197
+ activeItem={activeItem}
198
+ menuItems={menuItems}
199
+ onClose={mobileBurgerOnClick}
200
+ triggerRefs={[mobileMenuBurgerRef, desktopMenuBurgerRef]}
201
+ />
202
+ )}
203
+ </div>
204
+ );
205
+ };
206
+
207
+ const BurgerAction = React.forwardRef((props, ref) => (
208
+ <div
209
+ ref={ref}
210
+ className={`burger-action ${props.className}`}
211
+ role="none"
212
+ onClick={props.onClick}
213
+ >
214
+ {props.children}
215
+ </div>
216
+ ));
217
+
218
+ Header.BurgerAction = BurgerAction;
219
+ Header.Main = Main;
220
+ Header.TopDropdownMenu = TopDropdownMenu;
221
+ Header.TopHeader = TopHeader;
222
+ Header.TopItem = TopItem;
223
+
224
+ export default Header;
@@ -0,0 +1,79 @@
1
+ import React from 'react';
2
+ import { Container } from 'semantic-ui-react';
3
+ import cx from 'classnames';
4
+
5
+ import { useClickOutside } from '@eeacms/volto-eea-design-system/helpers';
6
+
7
+ const levels = ['first', 'second', 'third'];
8
+
9
+ const Item = ({ item, renderMenuItem }) => (
10
+ <>
11
+ {item.items.length > 0 && (
12
+ <label htmlFor={`drop-${item['@id'] || item.url}`} className="toggle">
13
+ {item.title}
14
+ </label>
15
+ )}
16
+ {renderMenuItem(item)}
17
+ {item.items.length > 0 && (
18
+ <input type="checkbox" id={`drop-${item['@id'] || item.url}`} />
19
+ )}
20
+ </>
21
+ );
22
+
23
+ const ItemsList = ({ items, renderMenuItem, level = 0, activeItem }) => (
24
+ <ul
25
+ className={cx(
26
+ level === 0 ? 'menu' : 'sub',
27
+ levels[level],
28
+ `level-${level}`,
29
+ )}
30
+ >
31
+ {items.map((item) => (
32
+ <li
33
+ key={item['@id'] || item.url}
34
+ className={cx({
35
+ hasSubMenu: item.items?.length > 0,
36
+ active: (item['@id'] || item.url) === activeItem,
37
+ })}
38
+ >
39
+ <Item item={item} renderMenuItem={renderMenuItem} />
40
+
41
+ {item.items.length > 0 && (
42
+ <ItemsList
43
+ items={item.items}
44
+ level={level + 1}
45
+ renderMenuItem={renderMenuItem}
46
+ activeItem={activeItem}
47
+ />
48
+ )}
49
+ </li>
50
+ ))}
51
+ </ul>
52
+ );
53
+
54
+ function HeaderMenuPopUp({
55
+ menuItems,
56
+ onClose,
57
+ triggerRefs,
58
+ renderMenuItem,
59
+ activeItem,
60
+ }) {
61
+ const nodeRef = React.useRef();
62
+ useClickOutside({ targetRefs: [nodeRef, ...triggerRefs], callback: onClose });
63
+
64
+ return (
65
+ <div id="mega-menu" ref={nodeRef}>
66
+ <Container>
67
+ <nav>
68
+ <ItemsList
69
+ items={menuItems}
70
+ renderMenuItem={renderMenuItem}
71
+ activeItem={activeItem}
72
+ />
73
+ </nav>
74
+ </Container>
75
+ </div>
76
+ );
77
+ }
78
+
79
+ export default HeaderMenuPopUp;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { Container, Input, Button, Icon } from 'semantic-ui-react';
3
+
4
+ import { useClickOutside } from '@eeacms/volto-eea-design-system/helpers';
5
+
6
+ function HeaderSearchPopUp({ onClose, triggerRefs = [] }) {
7
+ const nodeRef = React.useRef();
8
+
9
+ useClickOutside({ targetRefs: [nodeRef, ...triggerRefs], callback: onClose });
10
+
11
+ return (
12
+ <div id="search-box" ref={nodeRef}>
13
+ <Container>
14
+ <div className="wrapper">
15
+ <Input
16
+ className="search"
17
+ icon="search"
18
+ placeholder="Search..."
19
+ fluid
20
+ />
21
+ <div className="action">
22
+ <Button icon labelPosition="left" className="search">
23
+ <Icon name="search" />
24
+ Advanced Search
25
+ </Button>
26
+ </div>
27
+ </div>
28
+ </Container>
29
+ </div>
30
+ );
31
+ }
32
+
33
+ export default HeaderSearchPopUp;
@@ -0,0 +1,61 @@
1
+ import React, { Component } from 'react';
2
+ import { Container, Icon } from 'semantic-ui-react';
3
+
4
+ class InpageNavigation extends Component {
5
+ constructor(props) {
6
+ super(props);
7
+ this.state = {
8
+ scrollPosition: 0,
9
+ removeClass: 'hidden',
10
+ };
11
+ }
12
+
13
+ handleInpageNavigationVisibility = () => {
14
+ const position = window.scrollY;
15
+ this.setState({ scrollPosition: position });
16
+
17
+ if (this.state.scrollPosition > 50) {
18
+ return this.setState({ removeClass: '' });
19
+ } else {
20
+ return this.setState({ removeClass: 'hidden' });
21
+ }
22
+ };
23
+
24
+ componentDidMount() {
25
+ window.addEventListener('scroll', this.handleInpageNavigationVisibility);
26
+ }
27
+
28
+ componentWillUnmount() {
29
+ window.removeEventListener('scroll', this.handleInpageNavigationVisibility);
30
+ }
31
+
32
+ onInpageNavigationClick = () => {
33
+ window.scrollTo({
34
+ top: 0,
35
+ behavior: 'smooth',
36
+ });
37
+ };
38
+
39
+ render() {
40
+ return (
41
+ <Container>
42
+ <div
43
+ id="inpage-navigation"
44
+ onClick={this.onInpageNavigationClick}
45
+ role="none"
46
+ className={this.state.removeClass}
47
+ >
48
+ <div className="mobile tablet only">
49
+ <Icon className="ri-arrow-up-s-line" />
50
+ </div>
51
+ <div className="tablet or lower hidden">
52
+ <Icon className="ri-arrow-up-s-line" />
53
+ <div className="text">top</div>
54
+ </div>
55
+ </div>
56
+ </Container>
57
+ );
58
+ }
59
+ }
60
+
61
+ export default InpageNavigation;
@@ -0,0 +1,166 @@
1
+ import React from 'react';
2
+ import InpageNavigation from './InpageNavigation';
3
+ import { Container } from 'semantic-ui-react';
4
+
5
+ export default {
6
+ title: 'Components/Inpage Navigation',
7
+ component: InpageNavigation,
8
+ argTypes: {},
9
+ };
10
+
11
+ function InpageNavigationExample() {
12
+ return (
13
+ <div id="anchor">
14
+ <Container>
15
+ <p>
16
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
17
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
18
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
19
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
20
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
21
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
22
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
23
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
24
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
25
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
26
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
27
+ aliquet.
28
+ </p>
29
+ <p>
30
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
31
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
32
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
33
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
34
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
35
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
36
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
37
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
38
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
39
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
40
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
41
+ aliquet.
42
+ </p>
43
+ <p>
44
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
45
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
46
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
47
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
48
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
49
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
50
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
51
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
52
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
53
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
54
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
55
+ aliquet.
56
+ </p>
57
+ <p>
58
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
59
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
60
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
61
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
62
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
63
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
64
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
65
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
66
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
67
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
68
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
69
+ aliquet.
70
+ </p>
71
+ <p>
72
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
73
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
74
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
75
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
76
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
77
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
78
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
79
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
80
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
81
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
82
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
83
+ aliquet.
84
+ </p>
85
+ <p>
86
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
87
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
88
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
89
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
90
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
91
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
92
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
93
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
94
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
95
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
96
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
97
+ aliquet.
98
+ </p>
99
+ <p>
100
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
101
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
102
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
103
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
104
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
105
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
106
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
107
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
108
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
109
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
110
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
111
+ aliquet.
112
+ </p>
113
+ <p>
114
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
115
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
116
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
117
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
118
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
119
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
120
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
121
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
122
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
123
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
124
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
125
+ aliquet.
126
+ </p>
127
+ <p>
128
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
129
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
130
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
131
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
132
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
133
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
134
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
135
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
136
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
137
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
138
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
139
+ aliquet.
140
+ </p>
141
+ <p>
142
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mattis
143
+ arcu egestas ultrices mollis. In facilisis, velit vel varius
144
+ fermentum, libero nisi mollis eros, non blandit nisi orci vel urna.
145
+ Maecenas efficitur rhoncus lorem, vitae volutpat nisi varius ut.
146
+ Aenean mattis maximus odio in rutrum. Nullam semper non purus a
147
+ eleifend. Aenean placerat in ligula sed efficitur. Phasellus viverra
148
+ vitae libero sed vestibulum. Nulla mattis tortor at odio suscipit, sed
149
+ finibus nulla interdum. Nullam semper augue nulla, eget volutpat purus
150
+ tempor blandit. Curabitur iaculis risus ac ipsum semper egestas. Sed
151
+ in condimentum lacus. Donec ac efficitur sapien. Integer sit amet
152
+ bibendum urna, eget rhoncus elit. Nam a diam sed dui consectetur
153
+ aliquet.
154
+ </p>
155
+ </Container>
156
+ <InpageNavigation linkId={'anchor'} />
157
+ </div>
158
+ );
159
+ }
160
+
161
+ const Template = (args) => (
162
+ <InpageNavigationExample {...args}></InpageNavigationExample>
163
+ );
164
+
165
+ export const Default = Template.bind({});
166
+ Default.args = {};
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { List } from 'semantic-ui-react';
4
+
5
+ KeyContent.propTypes = {
6
+ title: PropTypes.string,
7
+ };
8
+
9
+ function KeyContent({ children, ...rest }) {
10
+ return (
11
+ <div className={`eea key-content ${rest.variant}`} {...rest}>
12
+ {children}
13
+ </div>
14
+ );
15
+ }
16
+
17
+ KeyContent.Title = ({ children }) => <p className="title">{children}</p>;
18
+ KeyContent.List = ({ children, ...rest }) => (
19
+ <List bulleted horizontal={false} items={rest.items}></List>
20
+ );
21
+
22
+ export default KeyContent;
@@ -0,0 +1,62 @@
1
+ import React from 'react';
2
+ import KeyContent from './KeyContent';
3
+ // eslint-disable-next-line import/no-unresolved
4
+
5
+ export default {
6
+ title: 'Components/Key Content',
7
+ component: KeyContent,
8
+ argTypes: {
9
+ title: {
10
+ description: 'Key Content title',
11
+ table: {
12
+ defaultValue: { summary: '""' },
13
+ type: { summary: 'string' },
14
+ },
15
+ },
16
+ items: {
17
+ description: 'array of list content',
18
+ table: {
19
+ type: { summary: 'object' },
20
+ defaultValue: { summary: ' "" ' },
21
+ },
22
+ },
23
+ },
24
+ };
25
+
26
+ const DefaultTemplate = (args) => (
27
+ <KeyContent variant="colored" {...args}>
28
+ <KeyContent.Title>{args.title}</KeyContent.Title>
29
+ <KeyContent.List {...args}></KeyContent.List>
30
+ </KeyContent>
31
+ );
32
+
33
+ export const Default = DefaultTemplate.bind({});
34
+ Default.args = {
35
+ title: 'Lorem ipsum',
36
+ items: [
37
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Massa volutpat, feugiat lacus libero morbi dui. Ipsum vestibulum, faucibus aliquam pharetra ullamcorper accumsan. Mauris et blandit magna velit aliquam mattis tristique cursus. Gravida quis porta dictum sed nisl gravida. Dictum sapien purus ultrices leo felis quis.',
38
+ 'Turpis feugiat felis id imperdiet imperdiet suspendisse. Sed pulvinar nisi, convallis sed non non eu, erat. ',
39
+ 'Felis malesuada in elementum turpis. Enim, eu adipiscing sit fames ornare amet, suscipit. Neque, faucibus facilisi egestas vitae viverra tristique cum viverra elit. Nunc fermentum bibendum fames ultricies turpis habitant. ',
40
+ ],
41
+ };
42
+
43
+ const SecondaryTemplate = (args) => (
44
+ <KeyContent {...args}>
45
+ <KeyContent.Title>{args.title}</KeyContent.Title>
46
+ <KeyContent.List {...args}></KeyContent.List>
47
+ </KeyContent>
48
+ );
49
+
50
+ export const Secondary = SecondaryTemplate.bind({});
51
+ Secondary.args = {
52
+ title: 'Lorem ipsum',
53
+ items: [
54
+ 'Sed pulvinar nisi, convallis sed non non eu, erat.',
55
+ 'Consectetur adipiscing elit ut aliquam, purus sit amet luctus venenatis',
56
+ 'Lorem ipsum dolor sit amet, consectetur',
57
+ 'Purus sit amet luctus venenatis, lectus',
58
+ 'Sed placerat sit erat sed massa in leo sit in ac vivamus tincidunt tincidunt tristique mi molestie dictum faucibus mauris',
59
+ 'Luctus malesuada non in adipiscing convallis consectetur egestas sed',
60
+ 'Vulputate gravida amet amet convallis quis',
61
+ ],
62
+ };
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { Loader } from 'semantic-ui-react';
3
+
4
+ export default {
5
+ title: 'Components/Loader',
6
+ component: Loader,
7
+ argTypes: {
8
+ content: {
9
+ description: 'loader primary content',
10
+ table: {
11
+ type: {
12
+ summary: 'custom',
13
+ },
14
+ defaultValue: {
15
+ summary: '',
16
+ },
17
+ },
18
+ },
19
+ },
20
+ };
21
+
22
+ const Template = (args) => <Loader {...args} inline="centered" />;
23
+
24
+ export const Default = Template.bind({});
25
+ Default.args = {
26
+ active: true,
27
+ content: '',
28
+ size: 'medium',
29
+ };
30
+
31
+ Default.argTypes = {
32
+ size: {
33
+ options: [
34
+ 'mini',
35
+ 'tiny',
36
+ 'small',
37
+ 'medium',
38
+ 'large',
39
+ 'big',
40
+ 'huge',
41
+ 'massive',
42
+ ],
43
+ control: { type: 'select' },
44
+ },
45
+ };