@conduction/components 2.2.9 → 2.2.11

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/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  - **Version 2.2 (breaking changes from 2.1.x)**
6
6
 
7
+ - 2.2.11: Updated Primary and Secondary topnav to NLDS.
8
+ - 2.2.10: Added z-index to tooltip.
7
9
  - 2.2.9: Added CardWrapper, CardHeader, CardHeaderTitle, CardHeaderDate to index.
8
10
  - 2.2.8:
9
11
  - Updated Pagination to show current page.
@@ -1,8 +1,4 @@
1
1
  import React from "react";
2
- interface TableWrapperProps {
3
- touchScreen?: boolean;
4
- }
5
2
  export declare const TableWrapper: React.FC<{
6
3
  children: React.ReactNode;
7
- } & TableWrapperProps>;
8
- export {};
4
+ }>;
@@ -1,10 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useState, useEffect } from "react";
3
3
  import * as styles from "./TableWrapper.module.css";
4
- import clsx from "clsx";
5
4
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
6
5
  import { faChevronLeft, faChevronRight } from "@fortawesome/free-solid-svg-icons";
7
- export const TableWrapper = ({ children, touchScreen, }) => {
6
+ export const TableWrapper = ({ children }) => {
8
7
  const [canScrollRight, setCanScrollRight] = useState(false);
9
8
  const [canScrollLeft, setCanScrollLeft] = useState(false);
10
9
  const wrapperRef = React.useRef(null);
@@ -27,5 +26,5 @@ export const TableWrapper = ({ children, touchScreen, }) => {
27
26
  setCanScrollRight(wrapperRef.current.scrollWidth > wrapperRef.current.clientWidth); // initiate scroll
28
27
  }
29
28
  }, []);
30
- return (_jsx("div", { className: styles.container, children: _jsxs("div", { onScroll: handleScroll, ref: wrapperRef, className: clsx(touchScreen ? styles.wrapperTouchscreen : styles.wrapper), children: [canScrollLeft && !touchScreen && (_jsx("div", { onClick: handleScrollLeft, className: styles.scrollLeftButton, children: _jsx("div", { className: styles.scrollButton, children: _jsx(FontAwesomeIcon, { icon: faChevronLeft }) }) })), children, canScrollRight && !touchScreen && (_jsx("div", { onClick: handleScrollRight, className: styles.scrollRightButton, children: _jsx("div", { className: styles.scrollButton, children: _jsx(FontAwesomeIcon, { icon: faChevronRight }) }) }))] }) }));
29
+ return (_jsx("div", { className: styles.container, children: _jsxs("div", { onScroll: handleScroll, ref: wrapperRef, className: styles.wrapper, children: [canScrollLeft && (_jsx("div", { onClick: handleScrollLeft, className: styles.scrollLeftButton, children: _jsx("div", { className: styles.scrollButton, children: _jsx(FontAwesomeIcon, { icon: faChevronLeft }) }) })), children, canScrollRight && (_jsx("div", { onClick: handleScrollRight, className: styles.scrollRightButton, children: _jsx("div", { className: styles.scrollButton, children: _jsx(FontAwesomeIcon, { icon: faChevronRight }) }) }))] }) }));
31
30
  };
@@ -16,9 +16,7 @@
16
16
  position: relative;
17
17
  }
18
18
 
19
- .wrapper {
20
- overflow-x: scroll;
21
- }
19
+ .wrapper,
22
20
  .wrapperTouchscreen {
23
21
  overflow-x: scroll;
24
22
  }
@@ -35,9 +33,9 @@
35
33
  padding-inline-end: var(--conduction-table-wrapper-scroll-button-padding-inline-end);
36
34
  padding-block-start: var(--conduction-table-wrapper-scroll-button-padding-block-start);
37
35
  padding-block-end: var(--conduction-table-wrapper-scroll-button-padding-block-end);
38
- border-width:var(--conduction-table-wrapper-scroll-button-border-width) ;
39
- border-style:var(--conduction-table-wrapper-scroll-button-border-style) ;
40
- border-color:var(--conduction-table-wrapper-scroll-button-border-color) ;
36
+ border-width: var(--conduction-table-wrapper-scroll-button-border-width);
37
+ border-style: var(--conduction-table-wrapper-scroll-button-border-style);
38
+ border-color: var(--conduction-table-wrapper-scroll-button-border-color);
41
39
  }
42
40
 
43
41
  .scrollLeftButton:hover,
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React, { useState, useEffect } from "react";
2
+ import * as React from "react";
3
3
  import * as styles from "./Tabs.module.css";
4
4
  import { Tabs as RTabs, TabList as RTabList, Tab as RTab, TabPanel as RTabPanel, } from "react-tabs";
5
5
  import clsx from "clsx";
@@ -10,8 +10,8 @@ export const Tabs = ({ children, ...otherProps }) => (_jsx(RTabs, { className: s
10
10
  Tabs.tabsRole = "Tabs";
11
11
  // TabList
12
12
  export const TabList = ({ children, ...otherProps }) => {
13
- const [canScrollRight, setCanScrollRight] = useState(false);
14
- const [canScrollLeft, setCanScrollLeft] = useState(false);
13
+ const [canScrollRight, setCanScrollRight] = React.useState(false);
14
+ const [canScrollLeft, setCanScrollLeft] = React.useState(false);
15
15
  const wrapperRef = React.useRef(null);
16
16
  const handleScroll = () => {
17
17
  if (wrapperRef.current) {
@@ -27,7 +27,7 @@ export const TabList = ({ children, ...otherProps }) => {
27
27
  if (wrapperRef.current)
28
28
  wrapperRef.current.scrollTo({ left: 0, behavior: "smooth" });
29
29
  };
30
- useEffect(() => {
30
+ React.useEffect(() => {
31
31
  if (wrapperRef.current) {
32
32
  setCanScrollRight(wrapperRef.current.scrollWidth > wrapperRef.current.clientWidth); // initiate scroll
33
33
  }
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
  interface ToolTipProps {
3
3
  id: string;
4
+ layoutClassName?: string;
4
5
  }
5
6
  /**
6
7
  * Implement this ToolTip only once, in a high-level wrapper.
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import * as styles from "./ToolTip.module.css";
3
3
  import { Tooltip } from "react-tooltip";
4
+ import clsx from "clsx";
4
5
  /**
5
6
  * Implement this ToolTip only once, in a high-level wrapper.
6
7
  * Use the ToolTip anywhere, in any element, by setting the following data props:
@@ -8,6 +9,6 @@ import { Tooltip } from "react-tooltip";
8
9
  * data-tooltip-id="this-is-the-id-set-in-ToolTipProps"
9
10
  * data-tooltip-content="Hello world!"
10
11
  */
11
- export const ToolTip = ({ id }) => {
12
- return _jsx(Tooltip, { className: styles.tooltip, ...{ id } });
12
+ export const ToolTip = ({ id, layoutClassName }) => {
13
+ return _jsx(Tooltip, { className: clsx(styles.tooltip, layoutClassName, layoutClassName), ...{ id } });
13
14
  };
@@ -13,6 +13,7 @@
13
13
  --conduction-tooltip-border-radius: 0px;
14
14
 
15
15
  --conduction-tooltip-opacity: 1;
16
+ --conduction-tooltip-z-index: 9999;
16
17
  }
17
18
 
18
19
  .tooltip {
@@ -30,4 +31,5 @@
30
31
  border-radius: var(--conduction-tooltip-border-radius) !important;
31
32
 
32
33
  opacity: var(--conduction-tooltip-opacity);
34
+ z-index: var(--conduction-tooltip-z-index);
33
35
  }
@@ -4,14 +4,31 @@ import * as styles from "./PrimaryTopNav.module.css";
4
4
  import clsx from "clsx";
5
5
  import { Link } from "@utrecht/component-library-react/dist/css-module";
6
6
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
7
- import { faBars } from "@fortawesome/free-solid-svg-icons";
7
+ import { faBars, faChevronRight } from "@fortawesome/free-solid-svg-icons";
8
8
  export const PrimaryTopNav = ({ items, mobileLogo, layoutClassName }) => {
9
9
  const [isOpen, setIsOpen] = React.useState(false);
10
+ const [subNavIsOpen, setSubNavIsOpen] = React.useState({});
10
11
  const handleItemClick = (handleClick) => {
11
12
  if (handleClick) {
12
13
  handleClick();
13
14
  setIsOpen(false);
14
15
  }
15
16
  };
16
- return (_jsxs("div", { className: clsx(styles.container, layoutClassName && layoutClassName), children: [_jsxs("div", { className: styles.menuToggleContainer, children: [mobileLogo, _jsx("button", { className: styles.menuToggle, onClick: () => setIsOpen((o) => !o), children: _jsx(FontAwesomeIcon, { icon: faBars }) })] }), _jsx("nav", { className: clsx(styles.primary, isOpen && styles.isOpen), children: _jsx("ul", { className: styles.ul, children: items.map(({ label, icon, current, handleClick, subItems }, idx) => (_jsxs("li", { onClick: () => handleItemClick(handleClick), className: clsx(styles.li, current && styles.current), children: [_jsxs(Link, { className: clsx(styles.link, styles.label), children: [icon, label] }), subItems && (_jsx("ul", { className: styles.dropdown, children: subItems.map(({ label, icon, current, handleClick }, idx) => (_jsx("li", { className: clsx(styles.li, current && styles.current), onClick: () => handleItemClick(handleClick), children: _jsxs(Link, { className: clsx(styles.link, styles.label), children: [icon, label] }) }, idx))) }))] }, idx))) }) })] }));
17
+ const handleSubItemMenu = (idx, value) => {
18
+ setSubNavIsOpen({
19
+ ...subNavIsOpen,
20
+ [idx]: value,
21
+ });
22
+ };
23
+ const screenWidth = window.innerWidth;
24
+ React.useEffect(() => {
25
+ if (screenWidth > 992) {
26
+ setSubNavIsOpen({});
27
+ }
28
+ }, [screenWidth]);
29
+ return (_jsxs("div", { className: clsx(styles.container, layoutClassName && layoutClassName), children: [_jsxs("div", { className: styles.menuToggleContainer, children: [mobileLogo, _jsx("button", { className: styles.menuToggle, onClick: () => setIsOpen((o) => !o), children: _jsx(FontAwesomeIcon, { icon: faBars }) })] }), _jsx("nav", { className: clsx(styles.primary, isOpen && styles.isOpen), children: _jsx("ul", { className: styles.ul, children: items.map(({ label, icon, current, handleClick, subItems }, idx) => (_jsxs("li", { onClick: () => !subItems
30
+ ? handleItemClick(handleClick)
31
+ : screenWidth > 992
32
+ ? handleItemClick(handleClick)
33
+ : handleSubItemMenu(idx, !subNavIsOpen[idx] ?? true), className: clsx(styles.li, current && styles.current), children: [_jsxs(Link, { className: clsx(styles.link, styles.label, subItems && styles.mobileLink, current && styles.currentLink), children: [icon, label, " ", subItems && screenWidth < 992 && (_jsx(FontAwesomeIcon, { className: clsx(styles.toggleIcon, subNavIsOpen[idx] && styles.isOpen), icon: faChevronRight }))] }), subItems && (_jsx("ul", { className: clsx(styles.dropdown, subNavIsOpen[idx] && styles.isOpen), children: subItems.map(({ label, icon, current, handleClick }, idx) => (_jsx("li", { className: clsx(styles.li, current && styles.current), onClick: () => handleItemClick(handleClick), children: _jsxs(Link, { className: clsx(styles.link, styles.label, current && styles.currentLink), children: [icon, label] }) }, idx))) }))] }, idx))) }) })] }));
17
34
  };
@@ -1,16 +1,31 @@
1
1
  :root {
2
- --conduction-primary-top-nav-item-padding: var(--skeleton-size-md);
3
- --conduction-primary-top-nav-color: var(--skeleton-color-white);
4
- --conduction-primary-top-nav-background-color: var(--skeleton-color-secondary-3);
5
- --conduction-primary-top-nav-background-color-hover: rgba(255, 255, 255, 0.2);
6
- --conduction-primary-top-nav-dropdown-border-radius: var(--skeleton-border-radius-md);
7
- --conduction-primary-top-nav-background-color-active: rgba(255, 255, 255, 0.2);
8
- --conduction-primary-top-nav-box-shadow-active: inset 0 -4px black;
2
+ --conduction-primary-top-nav-color: #4a4a4a;
3
+ --conduction-primary-top-nav-background-color: #ffffff;
9
4
  --conduction-primary-top-nav-toggle-icon-size: 24px;
10
5
  --conduction-primary-top-nav-mobile-logo-padding: 18px;
6
+
7
+ --conduction-primary-top-nav-item-padding: var(--skeleton-size-md);
11
8
  --conduction-primary-top-nav-item-icon-margin: var(--skeleton-size-2x);
12
- --conduction-primary-top-nav-dropdown-background-color: var(--skeleton-color-white);
13
- --conduction-primary-top-nav-dropdown-background-color-hover: var(--skeleton-color-grey-1);
9
+
10
+ /* --conduction-primary-top-nav- */
11
+
12
+ /* --conduction-primary-top-nav-current-background-color: #ffffff; */
13
+ /* --conduction-primary-top-nav-current-color: #4376fc; */
14
+ /* --conduction-primary-top-nav-current-box-shadow: inset 0 -4px black; */
15
+ /* --conduction-primary-top-nav-current-mobile-box-shadow: inset 4px 0 black; */
16
+
17
+ /* --conduction-primary-top-nav-hover-color: #4376fc; */
18
+ /* --conduction-primary-top-nav-hover-background-color: #ffffff; */
19
+ /* --conduction-primary-top-nav-hover-box-shadow: inset 0 -4px black; */
20
+
21
+ /* --conduction-primary-top-nav-dropdown-color: #4a4a4a; */
22
+ /* --conduction-primary-top-nav-dropdown-background-color: var(--skeleton-color-white); */
23
+ /* --conduction-primary-top-nav-dropdown-border-width: 1px; */
24
+ /* --conduction-primary-top-nav-dropdown-border-style: solid; */
25
+ /* --conduction-primary-top-nav-dropdown-border-color: #4376fc; */
26
+ /* --conduction-primary-top-nav-dropdown-hover-color: #4376fc; */
27
+ /* --conduction-primary-top-nav-dropdown-hover-background-color: #ffffff; */
28
+ /* --conduction-primary-top-nav-dropdown-hover-box-shadow: inset 0 -4px black; */
14
29
  }
15
30
 
16
31
  .container {
@@ -28,6 +43,7 @@
28
43
  all: unset;
29
44
  font-size: var(--conduction-primary-top-nav-toggle-icon-size);
30
45
  padding: var(--conduction-primary-top-nav-mobile-logo-padding);
46
+ color: var(--conduction-primary-top-nav-color);
31
47
  }
32
48
 
33
49
  .menuToggleContainer > .menuToggle:hover {
@@ -75,59 +91,89 @@
75
91
  }
76
92
 
77
93
  .li:hover {
78
- background-color: var(--conduction-primary-top-nav-background-color-hover);
94
+ background-color: var(--conduction-primary-top-nav-hover-background-color);
95
+ box-shadow: var(--conduction-primary-top-nav-hover-box-shadow, inherit);
79
96
  }
80
97
 
81
98
  .current {
82
- background-color: var(--conduction-primary-top-nav-background-color-active);
83
- box-shadow: var(--conduction-primary-top-nav-box-shadow-active);
99
+ background-color: var(--conduction-primary-top-nav-current-background-color);
100
+ box-shadow: var(--conduction-primary-top-nav-current-box-shadow);
101
+ }
102
+
103
+ .current:hover {
104
+ box-shadow: var(--conduction-primary-top-nav-current-box-shadow);
105
+ }
106
+ .current:hover > .currentLink {
107
+ color: var(--conduction-primary-top-nav-hover-color) !important;
108
+ }
109
+
110
+ .currentLink {
111
+ color: var(--conduction-primary-top-nav-current-color) !important;
84
112
  }
85
113
 
114
+ .mobileLink {
115
+ margin-block-end: var(--skeleton-size-md);
116
+ }
86
117
  .primary .link {
87
- display: block;
88
118
  text-decoration: none;
119
+ }
120
+
121
+ .primary .link:not(.currentLink) {
122
+ display: block;
89
123
  color: var(--conduction-primary-top-nav-color);
90
124
  }
91
125
 
92
126
  .primary .li:hover .link {
93
- color: var(--conduction-primary-top-nav-color-hover);
127
+ color: var(--conduction-primary-top-nav-hover-color);
94
128
  }
95
129
 
96
130
  .link > * {
97
131
  margin-inline-end: 8px;
98
132
  }
99
133
 
100
- .primary .li:hover .dropdown {
101
- display: block;
102
- z-index: 1;
103
- }
104
-
105
134
  .dropdown {
106
135
  left: 0;
107
136
  top: 100%;
108
137
  padding: 0;
109
138
  width: 100%;
110
- display: block;
139
+ display: none;
111
140
  list-style-type: none;
112
- background-color: var(--conduction-primary-top-nav-dropdown-background-color);
113
- border-bottom-right-radius: var(--conduction-primary-top-nav-dropdown-border-radius);
114
- border-bottom-left-radius: var(--conduction-primary-top-nav-dropdown-border-radius);
141
+ background-color: var(--conduction-primary-top-nav-dropdown-background-color, var(--conduction-primary-top-nav-background-color));
142
+ }
143
+
144
+ .dropdown.isOpen {
145
+ display: block;
146
+ }
147
+
148
+ .li.current {
149
+ box-shadow: var(--conduction-primary-top-nav-current-mobile-box-shadow);
115
150
  }
116
151
 
117
152
  .primary .dropdown .li .link {
118
- color: var(--conduction-primary-top-nav-dropdown-color);
153
+ color: var(--conduction-primary-top-nav-dropdown-color, var(--conduction-primary-top-nav-color));
119
154
  }
120
155
 
121
156
  .primary .dropdown .li:hover .link {
122
- color: var(--conduction-primary-top-nav-dropdown-color-hover);
157
+ color: var(--conduction-primary-top-nav-dropdown-hover-color, var(--conduction-primary-top-nav-hover-color));
123
158
  }
124
159
 
125
160
  .dropdown .li:hover {
126
- background: var(--conduction-primary-top-nav-dropdown-background-color-hover);
161
+ background: var(--conduction-primary-top-nav-dropdown-hover-background-color, var(--conduction-primary-top-nav-hover-background-color));
162
+ box-shadow: var(--conduction-primary-top-nav-dropdown-hover-box-shadow, var(--conduction-primary-top-nav-hover-box-shadow));
127
163
  }
128
164
 
129
165
  .dropdown > li {
130
- padding-inline-start: var(--web-app-size-md);
166
+ padding-inline-start: var(--skeleton-size-md);
167
+ }
168
+
169
+ .toggleIcon {
170
+ margin-inline-start: var(--skeleton-size-xs);
171
+ transition: transform 100ms ease-in-out;
172
+ }
173
+
174
+ .toggleIcon.isOpen {
175
+ transform: rotate(90deg);
176
+ transition: transform 100ms ease-in-out;
131
177
  }
132
178
 
133
179
  .label {
@@ -159,9 +205,26 @@
159
205
  .dropdown {
160
206
  position: absolute;
161
207
  display: none;
208
+ border-width: var(--conduction-primary-top-nav-dropdown-border-width);
209
+ border-style: var(--conduction-primary-top-nav-dropdown-border-style);
210
+ border-color: var(--conduction-primary-top-nav-dropdown-border-color);
211
+ border-top: none;
162
212
  }
163
213
 
164
214
  .menuToggleContainer {
165
215
  display: none;
166
216
  }
217
+
218
+ .primary .li:hover .dropdown {
219
+ display: block;
220
+ z-index: 1;
221
+ }
222
+
223
+ .mobileLink {
224
+ margin-block-end: unset;
225
+ }
226
+
227
+ .li.current {
228
+ box-shadow: var(--conduction-primary-top-nav-current-box-shadow);
229
+ }
167
230
  }
@@ -1,13 +1,18 @@
1
1
  :root {
2
- --conduction-secondary-top-nav-item-padding: var(--skeleton-size-md);
3
- --conduction-secondary-top-nav-font-size: var(--skeleton-font-size-md);
4
2
  --conduction-secondary-top-nav-color: var(--skeleton-color-white);
5
- --conduction-secondary-top-nav-background-color: var(--skeleton-color-secondary-5);
6
- --conduction-secondary-top-nav-background-color-hover: rgba(0, 0, 0, 0.1);
3
+ --conduction-secondary-top-nav-background-color: #ffffff;
4
+ --conduction-secondary-top-nav-font-size: var(--skeleton-font-size-md);
7
5
  --conduction-secondary-top-nav-font-weight: var(--skeleton-font-weight-light);
8
- --conduction-secondary-top-nav-color-active: rgba(0, 0, 0, 0.1);
9
- --conduction-secondary-top-nav-box-shadow-active: inset 0 -4px black;
6
+
7
+ --conduction-secondary-top-nav-item-padding: var(--skeleton-size-md);
10
8
  --conduction-secondary-top-nav-item-icon-margin: var(--skeleton-size-2x);
9
+
10
+ /* --conduction-secondary-top-nav-curent-color: rgba(0, 0, 0, 0.1);
11
+ --conduction-secondary-top-nav-current-background-color: #ffffff;
12
+ --conduction-secondary-top-nav-current-box-shadow: inset 0 -4px black;
13
+
14
+ --conduction-secondary-top-nav-hover-color: #4376fc;
15
+ --conduction-secondary-top-nav-hover-background-color: rgba(0, 0, 0, 0.1); */
11
16
  }
12
17
 
13
18
  .secondary:hover {
@@ -31,12 +36,16 @@
31
36
  }
32
37
 
33
38
  .li:hover {
34
- background-color: var(--conduction-secondary-top-nav-background-color-hover);
39
+ background-color: var(--conduction-secondary-top-nav-hover-background-color);
35
40
  }
36
41
 
37
42
  .current {
38
- background-color: var(--conduction-secondary-top-nav-color-active);
39
- box-shadow: var(--conduction-secondary-top-nav-box-shadow-active);
43
+ background-color: var(--conduction-secondary-top-nav-current-background-color);
44
+ box-shadow: var(--conduction-secondary-top-nav-current-box-shadow);
45
+ }
46
+
47
+ .currentLink {
48
+ color: var(--conduction-primary-top-nav-current-color) !important;
40
49
  }
41
50
 
42
51
  .secondary {
@@ -46,6 +55,10 @@
46
55
  background-color: var(--conduction-secondary-top-nav-background-color);
47
56
  }
48
57
 
58
+ .secondary .li:hover .link {
59
+ color: var(--conduction-secondary-top-nav-hover-color);
60
+ display: block;
61
+ }
49
62
  .secondary .link {
50
63
  color: var(--conduction-secondary-top-nav-color);
51
64
  display: block;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/components",
3
- "version": "2.2.9",
3
+ "version": "2.2.11",
4
4
  "description": "React (Gatsby) components used within the Conduction Skeleton Application (and its implementations)",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -16,9 +16,7 @@
16
16
  position: relative;
17
17
  }
18
18
 
19
- .wrapper {
20
- overflow-x: scroll;
21
- }
19
+ .wrapper,
22
20
  .wrapperTouchscreen {
23
21
  overflow-x: scroll;
24
22
  }
@@ -35,9 +33,9 @@
35
33
  padding-inline-end: var(--conduction-table-wrapper-scroll-button-padding-inline-end);
36
34
  padding-block-start: var(--conduction-table-wrapper-scroll-button-padding-block-start);
37
35
  padding-block-end: var(--conduction-table-wrapper-scroll-button-padding-block-end);
38
- border-width:var(--conduction-table-wrapper-scroll-button-border-width) ;
39
- border-style:var(--conduction-table-wrapper-scroll-button-border-style) ;
40
- border-color:var(--conduction-table-wrapper-scroll-button-border-color) ;
36
+ border-width: var(--conduction-table-wrapper-scroll-button-border-width);
37
+ border-style: var(--conduction-table-wrapper-scroll-button-border-style);
38
+ border-color: var(--conduction-table-wrapper-scroll-button-border-color);
41
39
  }
42
40
 
43
41
  .scrollLeftButton:hover,
@@ -1,17 +1,9 @@
1
1
  import React, { useState, useEffect } from "react";
2
2
  import * as styles from "./TableWrapper.module.css";
3
- import clsx from "clsx";
4
3
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
5
4
  import { faChevronLeft, faChevronRight } from "@fortawesome/free-solid-svg-icons";
6
5
 
7
- interface TableWrapperProps {
8
- touchScreen?: boolean;
9
- }
10
-
11
- export const TableWrapper: React.FC<{ children: React.ReactNode } & TableWrapperProps> = ({
12
- children,
13
- touchScreen,
14
- }) => {
6
+ export const TableWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => {
15
7
  const [canScrollRight, setCanScrollRight] = useState(false);
16
8
  const [canScrollLeft, setCanScrollLeft] = useState(false);
17
9
 
@@ -42,12 +34,8 @@ export const TableWrapper: React.FC<{ children: React.ReactNode } & TableWrapper
42
34
 
43
35
  return (
44
36
  <div className={styles.container}>
45
- <div
46
- onScroll={handleScroll}
47
- ref={wrapperRef}
48
- className={clsx(touchScreen ? styles.wrapperTouchscreen : styles.wrapper)}
49
- >
50
- {canScrollLeft && !touchScreen && (
37
+ <div onScroll={handleScroll} ref={wrapperRef} className={styles.wrapper}>
38
+ {canScrollLeft && (
51
39
  <div onClick={handleScrollLeft} className={styles.scrollLeftButton}>
52
40
  <div className={styles.scrollButton}>
53
41
  <FontAwesomeIcon icon={faChevronLeft} />
@@ -55,7 +43,7 @@ export const TableWrapper: React.FC<{ children: React.ReactNode } & TableWrapper
55
43
  </div>
56
44
  )}
57
45
  {children}
58
- {canScrollRight && !touchScreen && (
46
+ {canScrollRight && (
59
47
  <div onClick={handleScrollRight} className={styles.scrollRightButton}>
60
48
  <div className={styles.scrollButton}>
61
49
  <FontAwesomeIcon icon={faChevronRight} />
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect } from "react";
1
+ import * as React from "react";
2
2
  import * as styles from "./Tabs.module.css";
3
3
  import {
4
4
  Tabs as RTabs,
@@ -26,8 +26,8 @@ Tabs.tabsRole = "Tabs";
26
26
 
27
27
  // TabList
28
28
  export const TabList: ReactTabsFunctionComponent<TabListProps> = ({ children, ...otherProps }) => {
29
- const [canScrollRight, setCanScrollRight] = useState(false);
30
- const [canScrollLeft, setCanScrollLeft] = useState(false);
29
+ const [canScrollRight, setCanScrollRight] = React.useState(false);
30
+ const [canScrollLeft, setCanScrollLeft] = React.useState(false);
31
31
 
32
32
  const wrapperRef = React.useRef<HTMLDivElement | null>(null);
33
33
 
@@ -48,7 +48,7 @@ export const TabList: ReactTabsFunctionComponent<TabListProps> = ({ children, ..
48
48
  if (wrapperRef.current) wrapperRef.current.scrollTo({ left: 0, behavior: "smooth" });
49
49
  };
50
50
 
51
- useEffect(() => {
51
+ React.useEffect(() => {
52
52
  if (wrapperRef.current) {
53
53
  setCanScrollRight(wrapperRef.current.scrollWidth > wrapperRef.current.clientWidth); // initiate scroll
54
54
  }
@@ -13,6 +13,7 @@
13
13
  --conduction-tooltip-border-radius: 0px;
14
14
 
15
15
  --conduction-tooltip-opacity: 1;
16
+ --conduction-tooltip-z-index: 9999;
16
17
  }
17
18
 
18
19
  .tooltip {
@@ -30,4 +31,5 @@
30
31
  border-radius: var(--conduction-tooltip-border-radius) !important;
31
32
 
32
33
  opacity: var(--conduction-tooltip-opacity);
34
+ z-index: var(--conduction-tooltip-z-index);
33
35
  }
@@ -1,9 +1,11 @@
1
1
  import * as React from "react";
2
2
  import * as styles from "./ToolTip.module.css";
3
3
  import { Tooltip } from "react-tooltip";
4
+ import clsx from "clsx";
4
5
 
5
6
  interface ToolTipProps {
6
7
  id: string;
8
+ layoutClassName?: string;
7
9
  }
8
10
 
9
11
  /**
@@ -14,6 +16,6 @@ interface ToolTipProps {
14
16
  * data-tooltip-content="Hello world!"
15
17
  */
16
18
 
17
- export const ToolTip: React.FC<ToolTipProps> = ({ id }) => {
18
- return <Tooltip className={styles.tooltip} {...{ id }} />;
19
+ export const ToolTip: React.FC<ToolTipProps> = ({ id, layoutClassName }) => {
20
+ return <Tooltip className={clsx(styles.tooltip, layoutClassName, layoutClassName)} {...{ id }} />;
19
21
  };
@@ -1,16 +1,31 @@
1
1
  :root {
2
- --conduction-primary-top-nav-item-padding: var(--skeleton-size-md);
3
- --conduction-primary-top-nav-color: var(--skeleton-color-white);
4
- --conduction-primary-top-nav-background-color: var(--skeleton-color-secondary-3);
5
- --conduction-primary-top-nav-background-color-hover: rgba(255, 255, 255, 0.2);
6
- --conduction-primary-top-nav-dropdown-border-radius: var(--skeleton-border-radius-md);
7
- --conduction-primary-top-nav-background-color-active: rgba(255, 255, 255, 0.2);
8
- --conduction-primary-top-nav-box-shadow-active: inset 0 -4px black;
2
+ --conduction-primary-top-nav-color: #4a4a4a;
3
+ --conduction-primary-top-nav-background-color: #ffffff;
9
4
  --conduction-primary-top-nav-toggle-icon-size: 24px;
10
5
  --conduction-primary-top-nav-mobile-logo-padding: 18px;
6
+
7
+ --conduction-primary-top-nav-item-padding: var(--skeleton-size-md);
11
8
  --conduction-primary-top-nav-item-icon-margin: var(--skeleton-size-2x);
12
- --conduction-primary-top-nav-dropdown-background-color: var(--skeleton-color-white);
13
- --conduction-primary-top-nav-dropdown-background-color-hover: var(--skeleton-color-grey-1);
9
+
10
+ /* --conduction-primary-top-nav- */
11
+
12
+ /* --conduction-primary-top-nav-current-background-color: #ffffff; */
13
+ /* --conduction-primary-top-nav-current-color: #4376fc; */
14
+ /* --conduction-primary-top-nav-current-box-shadow: inset 0 -4px black; */
15
+ /* --conduction-primary-top-nav-current-mobile-box-shadow: inset 4px 0 black; */
16
+
17
+ /* --conduction-primary-top-nav-hover-color: #4376fc; */
18
+ /* --conduction-primary-top-nav-hover-background-color: #ffffff; */
19
+ /* --conduction-primary-top-nav-hover-box-shadow: inset 0 -4px black; */
20
+
21
+ /* --conduction-primary-top-nav-dropdown-color: #4a4a4a; */
22
+ /* --conduction-primary-top-nav-dropdown-background-color: var(--skeleton-color-white); */
23
+ /* --conduction-primary-top-nav-dropdown-border-width: 1px; */
24
+ /* --conduction-primary-top-nav-dropdown-border-style: solid; */
25
+ /* --conduction-primary-top-nav-dropdown-border-color: #4376fc; */
26
+ /* --conduction-primary-top-nav-dropdown-hover-color: #4376fc; */
27
+ /* --conduction-primary-top-nav-dropdown-hover-background-color: #ffffff; */
28
+ /* --conduction-primary-top-nav-dropdown-hover-box-shadow: inset 0 -4px black; */
14
29
  }
15
30
 
16
31
  .container {
@@ -28,6 +43,7 @@
28
43
  all: unset;
29
44
  font-size: var(--conduction-primary-top-nav-toggle-icon-size);
30
45
  padding: var(--conduction-primary-top-nav-mobile-logo-padding);
46
+ color: var(--conduction-primary-top-nav-color);
31
47
  }
32
48
 
33
49
  .menuToggleContainer > .menuToggle:hover {
@@ -75,59 +91,89 @@
75
91
  }
76
92
 
77
93
  .li:hover {
78
- background-color: var(--conduction-primary-top-nav-background-color-hover);
94
+ background-color: var(--conduction-primary-top-nav-hover-background-color);
95
+ box-shadow: var(--conduction-primary-top-nav-hover-box-shadow, inherit);
79
96
  }
80
97
 
81
98
  .current {
82
- background-color: var(--conduction-primary-top-nav-background-color-active);
83
- box-shadow: var(--conduction-primary-top-nav-box-shadow-active);
99
+ background-color: var(--conduction-primary-top-nav-current-background-color);
100
+ box-shadow: var(--conduction-primary-top-nav-current-box-shadow);
101
+ }
102
+
103
+ .current:hover {
104
+ box-shadow: var(--conduction-primary-top-nav-current-box-shadow);
105
+ }
106
+ .current:hover > .currentLink {
107
+ color: var(--conduction-primary-top-nav-hover-color) !important;
108
+ }
109
+
110
+ .currentLink {
111
+ color: var(--conduction-primary-top-nav-current-color) !important;
84
112
  }
85
113
 
114
+ .mobileLink {
115
+ margin-block-end: var(--skeleton-size-md);
116
+ }
86
117
  .primary .link {
87
- display: block;
88
118
  text-decoration: none;
119
+ }
120
+
121
+ .primary .link:not(.currentLink) {
122
+ display: block;
89
123
  color: var(--conduction-primary-top-nav-color);
90
124
  }
91
125
 
92
126
  .primary .li:hover .link {
93
- color: var(--conduction-primary-top-nav-color-hover);
127
+ color: var(--conduction-primary-top-nav-hover-color);
94
128
  }
95
129
 
96
130
  .link > * {
97
131
  margin-inline-end: 8px;
98
132
  }
99
133
 
100
- .primary .li:hover .dropdown {
101
- display: block;
102
- z-index: 1;
103
- }
104
-
105
134
  .dropdown {
106
135
  left: 0;
107
136
  top: 100%;
108
137
  padding: 0;
109
138
  width: 100%;
110
- display: block;
139
+ display: none;
111
140
  list-style-type: none;
112
- background-color: var(--conduction-primary-top-nav-dropdown-background-color);
113
- border-bottom-right-radius: var(--conduction-primary-top-nav-dropdown-border-radius);
114
- border-bottom-left-radius: var(--conduction-primary-top-nav-dropdown-border-radius);
141
+ background-color: var(--conduction-primary-top-nav-dropdown-background-color, var(--conduction-primary-top-nav-background-color));
142
+ }
143
+
144
+ .dropdown.isOpen {
145
+ display: block;
146
+ }
147
+
148
+ .li.current {
149
+ box-shadow: var(--conduction-primary-top-nav-current-mobile-box-shadow);
115
150
  }
116
151
 
117
152
  .primary .dropdown .li .link {
118
- color: var(--conduction-primary-top-nav-dropdown-color);
153
+ color: var(--conduction-primary-top-nav-dropdown-color, var(--conduction-primary-top-nav-color));
119
154
  }
120
155
 
121
156
  .primary .dropdown .li:hover .link {
122
- color: var(--conduction-primary-top-nav-dropdown-color-hover);
157
+ color: var(--conduction-primary-top-nav-dropdown-hover-color, var(--conduction-primary-top-nav-hover-color));
123
158
  }
124
159
 
125
160
  .dropdown .li:hover {
126
- background: var(--conduction-primary-top-nav-dropdown-background-color-hover);
161
+ background: var(--conduction-primary-top-nav-dropdown-hover-background-color, var(--conduction-primary-top-nav-hover-background-color));
162
+ box-shadow: var(--conduction-primary-top-nav-dropdown-hover-box-shadow, var(--conduction-primary-top-nav-hover-box-shadow));
127
163
  }
128
164
 
129
165
  .dropdown > li {
130
- padding-inline-start: var(--web-app-size-md);
166
+ padding-inline-start: var(--skeleton-size-md);
167
+ }
168
+
169
+ .toggleIcon {
170
+ margin-inline-start: var(--skeleton-size-xs);
171
+ transition: transform 100ms ease-in-out;
172
+ }
173
+
174
+ .toggleIcon.isOpen {
175
+ transform: rotate(90deg);
176
+ transition: transform 100ms ease-in-out;
131
177
  }
132
178
 
133
179
  .label {
@@ -159,9 +205,26 @@
159
205
  .dropdown {
160
206
  position: absolute;
161
207
  display: none;
208
+ border-width: var(--conduction-primary-top-nav-dropdown-border-width);
209
+ border-style: var(--conduction-primary-top-nav-dropdown-border-style);
210
+ border-color: var(--conduction-primary-top-nav-dropdown-border-color);
211
+ border-top: none;
162
212
  }
163
213
 
164
214
  .menuToggleContainer {
165
215
  display: none;
166
216
  }
217
+
218
+ .primary .li:hover .dropdown {
219
+ display: block;
220
+ z-index: 1;
221
+ }
222
+
223
+ .mobileLink {
224
+ margin-block-end: unset;
225
+ }
226
+
227
+ .li.current {
228
+ box-shadow: var(--conduction-primary-top-nav-current-box-shadow);
229
+ }
167
230
  }
@@ -3,7 +3,7 @@ import * as styles from "./PrimaryTopNav.module.css";
3
3
  import clsx from "clsx";
4
4
  import { Link } from "@utrecht/component-library-react/dist/css-module";
5
5
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
6
- import { faBars } from "@fortawesome/free-solid-svg-icons";
6
+ import { faBars, faChevronRight } from "@fortawesome/free-solid-svg-icons";
7
7
 
8
8
  interface ITopNavItem {
9
9
  label: string;
@@ -26,6 +26,7 @@ export interface TopNavProps {
26
26
 
27
27
  export const PrimaryTopNav = ({ items, mobileLogo, layoutClassName }: TopNavProps): JSX.Element => {
28
28
  const [isOpen, setIsOpen] = React.useState<boolean>(false);
29
+ const [subNavIsOpen, setSubNavIsOpen] = React.useState({});
29
30
 
30
31
  const handleItemClick = (handleClick?: () => any) => {
31
32
  if (handleClick) {
@@ -35,6 +36,20 @@ export const PrimaryTopNav = ({ items, mobileLogo, layoutClassName }: TopNavProp
35
36
  }
36
37
  };
37
38
 
39
+ const handleSubItemMenu = (idx: number, value: boolean) => {
40
+ setSubNavIsOpen({
41
+ ...subNavIsOpen,
42
+ [idx as keyof typeof subNavIsOpen]: value,
43
+ });
44
+ };
45
+
46
+ const screenWidth = window.innerWidth;
47
+
48
+ React.useEffect(() => {
49
+ if (screenWidth > 992) {
50
+ setSubNavIsOpen({});
51
+ }
52
+ }, [screenWidth]);
38
53
  return (
39
54
  <div className={clsx(styles.container, layoutClassName && layoutClassName)}>
40
55
  <div className={styles.menuToggleContainer}>
@@ -49,24 +64,43 @@ export const PrimaryTopNav = ({ items, mobileLogo, layoutClassName }: TopNavProp
49
64
  <ul className={styles.ul}>
50
65
  {items.map(({ label, icon, current, handleClick, subItems }, idx) => (
51
66
  <li
52
- onClick={() => handleItemClick(handleClick)}
67
+ onClick={() =>
68
+ !subItems
69
+ ? handleItemClick(handleClick)
70
+ : screenWidth > 992
71
+ ? handleItemClick(handleClick)
72
+ : handleSubItemMenu(idx, !subNavIsOpen[idx as keyof typeof subNavIsOpen] ?? true)
73
+ }
53
74
  className={clsx(styles.li, current && styles.current)}
54
75
  key={idx}
55
76
  >
56
- <Link className={clsx(styles.link, styles.label)}>
77
+ <Link
78
+ className={clsx(
79
+ styles.link,
80
+ styles.label,
81
+ subItems && styles.mobileLink,
82
+ current && styles.currentLink,
83
+ )}
84
+ >
57
85
  {icon}
58
- {label}
86
+ {label}{" "}
87
+ {subItems && screenWidth < 992 && (
88
+ <FontAwesomeIcon
89
+ className={clsx(styles.toggleIcon, subNavIsOpen[idx as keyof typeof subNavIsOpen] && styles.isOpen)}
90
+ icon={faChevronRight}
91
+ />
92
+ )}
59
93
  </Link>
60
94
 
61
95
  {subItems && (
62
- <ul className={styles.dropdown}>
96
+ <ul className={clsx(styles.dropdown, subNavIsOpen[idx as keyof typeof subNavIsOpen] && styles.isOpen)}>
63
97
  {subItems.map(({ label, icon, current, handleClick }, idx) => (
64
98
  <li
65
99
  key={idx}
66
100
  className={clsx(styles.li, current && styles.current)}
67
101
  onClick={() => handleItemClick(handleClick)}
68
102
  >
69
- <Link className={clsx(styles.link, styles.label)}>
103
+ <Link className={clsx(styles.link, styles.label, current && styles.currentLink)}>
70
104
  {icon}
71
105
  {label}
72
106
  </Link>
@@ -1,13 +1,18 @@
1
1
  :root {
2
- --conduction-secondary-top-nav-item-padding: var(--skeleton-size-md);
3
- --conduction-secondary-top-nav-font-size: var(--skeleton-font-size-md);
4
2
  --conduction-secondary-top-nav-color: var(--skeleton-color-white);
5
- --conduction-secondary-top-nav-background-color: var(--skeleton-color-secondary-5);
6
- --conduction-secondary-top-nav-background-color-hover: rgba(0, 0, 0, 0.1);
3
+ --conduction-secondary-top-nav-background-color: #ffffff;
4
+ --conduction-secondary-top-nav-font-size: var(--skeleton-font-size-md);
7
5
  --conduction-secondary-top-nav-font-weight: var(--skeleton-font-weight-light);
8
- --conduction-secondary-top-nav-color-active: rgba(0, 0, 0, 0.1);
9
- --conduction-secondary-top-nav-box-shadow-active: inset 0 -4px black;
6
+
7
+ --conduction-secondary-top-nav-item-padding: var(--skeleton-size-md);
10
8
  --conduction-secondary-top-nav-item-icon-margin: var(--skeleton-size-2x);
9
+
10
+ /* --conduction-secondary-top-nav-curent-color: rgba(0, 0, 0, 0.1);
11
+ --conduction-secondary-top-nav-current-background-color: #ffffff;
12
+ --conduction-secondary-top-nav-current-box-shadow: inset 0 -4px black;
13
+
14
+ --conduction-secondary-top-nav-hover-color: #4376fc;
15
+ --conduction-secondary-top-nav-hover-background-color: rgba(0, 0, 0, 0.1); */
11
16
  }
12
17
 
13
18
  .secondary:hover {
@@ -31,12 +36,16 @@
31
36
  }
32
37
 
33
38
  .li:hover {
34
- background-color: var(--conduction-secondary-top-nav-background-color-hover);
39
+ background-color: var(--conduction-secondary-top-nav-hover-background-color);
35
40
  }
36
41
 
37
42
  .current {
38
- background-color: var(--conduction-secondary-top-nav-color-active);
39
- box-shadow: var(--conduction-secondary-top-nav-box-shadow-active);
43
+ background-color: var(--conduction-secondary-top-nav-current-background-color);
44
+ box-shadow: var(--conduction-secondary-top-nav-current-box-shadow);
45
+ }
46
+
47
+ .currentLink {
48
+ color: var(--conduction-primary-top-nav-current-color) !important;
40
49
  }
41
50
 
42
51
  .secondary {
@@ -46,6 +55,10 @@
46
55
  background-color: var(--conduction-secondary-top-nav-background-color);
47
56
  }
48
57
 
58
+ .secondary .li:hover .link {
59
+ color: var(--conduction-secondary-top-nav-hover-color);
60
+ display: block;
61
+ }
49
62
  .secondary .link {
50
63
  color: var(--conduction-secondary-top-nav-color);
51
64
  display: block;