@camunda/camunda-composite-components 0.0.18 → 0.0.20
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/lib/esm/components/c3-empty-state/c3-empty-state.js +1 -1
- package/lib/esm/components/c3-empty-state/c3-empty-state.types.d.ts +3 -3
- package/lib/esm/components/c3-navigation/c3-navigation.js +64 -12
- package/lib/esm/components/c3-navigation/c3-navigation.types.d.ts +6 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ export const C3EmptyState = ({ icon, heading, description, button, link, }) => (
|
|
|
6
6
|
paddingBottom: "3rem",
|
|
7
7
|
} },
|
|
8
8
|
React.createElement(Stack, { orientation: "horizontal", gap: 6 },
|
|
9
|
-
React.createElement("img", { src: icon.path, alt: icon.altText }),
|
|
9
|
+
icon && React.createElement("img", { src: icon.path, alt: icon.altText }),
|
|
10
10
|
React.createElement(Stack, { gap: 3 },
|
|
11
11
|
React.createElement("h2", null, heading),
|
|
12
12
|
React.createElement(Stack, { gap: 6 },
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Button, FormLabel, Header, HeaderContainer, HeaderGlobalAction, HeaderGlobalBar, HeaderMenuItem, HeaderName, HeaderNavigation, HeaderPanel, HeaderSideNavItems, RadioButton, RadioButtonGroup, SideNav, SideNavItems, SideNavLink, SideNavMenu, SideNavMenuItem, SkipToContent, Stack, SwitcherDivider, Tag, Toggle, } from "@carbon/react";
|
|
1
|
+
import { Button, FormLabel, Header, HeaderContainer, HeaderGlobalAction, HeaderGlobalBar, HeaderMenuItem, HeaderName, HeaderNavigation, HeaderPanel, HeaderSideNavItems, RadioButton, RadioButtonGroup, SideNav, SideNavItems, SideNavLink, SideNavMenu, SideNavMenuItem, SkipToContent, Stack, SwitcherDivider, Tag, Toggle, ToggletipContent, Toggletip, ToggletipButton, useTheme, usePrefix, } from "@carbon/react";
|
|
2
2
|
import { Close, Enterprise, Help, Launch, UserAvatar, } from "@carbon/react/icons";
|
|
3
3
|
import React, { useEffect, useState } from "react";
|
|
4
4
|
import { C3AppMenuIcon } from "../../icons/c3-icons";
|
|
5
|
+
const BREAKPOINT_LG_WIDTH = "66rem"; // This is Carbon's breakpoint (lg) width https://github.com/carbon-design-system/carbon/blob/main/packages/layout/src/index.js#L56
|
|
5
6
|
const C3NavigationExternalLink = ({ label }) => (React.createElement(React.Fragment, null,
|
|
6
7
|
label,
|
|
7
8
|
React.createElement(Launch, { style: {
|
|
@@ -95,10 +96,11 @@ const C3NavigationSideBar = (props) => {
|
|
|
95
96
|
const refPanel = React.createRef();
|
|
96
97
|
const refIcon = React.createRef();
|
|
97
98
|
useOnClickOutside(refPanel, refIcon, () => setSideBarOpen(false));
|
|
99
|
+
const itemTabIndex = sideBarOpen ? undefined : -1;
|
|
98
100
|
return (React.createElement(React.Fragment, null,
|
|
99
101
|
React.createElement(HeaderGlobalAction, { ref: refIcon, "aria-label": sideBar.ariaLabel, onClick: () => {
|
|
100
102
|
setSideBarOpen(!sideBarOpen);
|
|
101
|
-
}, isActive: sideBarOpen, tooltipAlignment: sideBar.type ===
|
|
103
|
+
}, isActive: sideBarOpen, tooltipAlignment: sideBar.type === "user" ? "end" : "center" }, icon),
|
|
102
104
|
React.createElement(HeaderPanel, { ref: refPanel, "aria-label": sideBar.ariaLabel, expanded: sideBarOpen, style: {
|
|
103
105
|
display: "grid",
|
|
104
106
|
gridAutoFlow: "row",
|
|
@@ -123,13 +125,13 @@ const C3NavigationSideBar = (props) => {
|
|
|
123
125
|
React.createElement(RadioButtonGroup, { name: "theme-radio-group", defaultSelected: themeSelector.currentTheme, legendText: "Theme", orientation: "vertical", onChange: (newValue) => {
|
|
124
126
|
themeSelector.onChange(newValue);
|
|
125
127
|
} },
|
|
126
|
-
React.createElement(RadioButton, { id: "light", labelText: "Light", value: "light" }),
|
|
127
|
-
React.createElement(RadioButton, { id: "system", labelText: "System", value: "system" }),
|
|
128
|
-
React.createElement(RadioButton, { id: "dark", labelText: "Dark", value: "dark" }))))),
|
|
128
|
+
React.createElement(RadioButton, { id: "light", labelText: "Light", value: "light", tabIndex: itemTabIndex }),
|
|
129
|
+
React.createElement(RadioButton, { id: "system", labelText: "System", value: "system", tabIndex: itemTabIndex }),
|
|
130
|
+
React.createElement(RadioButton, { id: "dark", labelText: "Dark", value: "dark", tabIndex: itemTabIndex }))))),
|
|
129
131
|
stageToggle && (React.createElement(React.Fragment, null,
|
|
130
132
|
React.createElement(SwitcherDivider, null),
|
|
131
133
|
React.createElement("div", { style: { padding: ".5rem 1rem" } },
|
|
132
|
-
React.createElement(Toggle, { size: "sm", id: "toggle-productionfeatures", defaultToggled: stageToggle.prodFeaturesEnabled, onClick: stageToggle.toggle, labelText: "Simulate Production Features" })))),
|
|
134
|
+
React.createElement(Toggle, { size: "sm", id: "toggle-productionfeatures", defaultToggled: stageToggle.prodFeaturesEnabled, onClick: stageToggle.toggle, labelText: "Simulate Production Features", tabIndex: itemTabIndex })))),
|
|
133
135
|
activeOrganization && (React.createElement(React.Fragment, null,
|
|
134
136
|
React.createElement("div", { style: {
|
|
135
137
|
padding: "1rem",
|
|
@@ -158,7 +160,7 @@ const C3NavigationSideBar = (props) => {
|
|
|
158
160
|
if (sideBar.closeOnClick !== false) {
|
|
159
161
|
setSideBarOpen(false);
|
|
160
162
|
}
|
|
161
|
-
} }, activeOrganization.action.label)),
|
|
163
|
+
}, tabIndex: itemTabIndex }, activeOrganization.action.label)),
|
|
162
164
|
sideBar.elements && sideBar.elements.length > 0 && (React.createElement(React.Fragment, null,
|
|
163
165
|
React.createElement(SwitcherDivider, null),
|
|
164
166
|
React.createElement(FormLabel, { style: {
|
|
@@ -180,7 +182,7 @@ const C3NavigationSideBar = (props) => {
|
|
|
180
182
|
if (sideBar.closeOnClick !== false) {
|
|
181
183
|
setSideBarOpen(false);
|
|
182
184
|
}
|
|
183
|
-
} }, element.label)))),
|
|
185
|
+
}, tabIndex: itemTabIndex }, element.label)))),
|
|
184
186
|
sideBar.bottomElements &&
|
|
185
187
|
sideBar.bottomElements.map((element) => (React.createElement(Button, { kind: element.kind, key: element.key, className: "cds--switcher__item", renderIcon: element.renderIcon, onClick: () => {
|
|
186
188
|
if (element.onClick) {
|
|
@@ -189,15 +191,18 @@ const C3NavigationSideBar = (props) => {
|
|
|
189
191
|
if (sideBar.closeOnClick !== false) {
|
|
190
192
|
setSideBarOpen(false);
|
|
191
193
|
}
|
|
192
|
-
}, style: { alignSelf: "end" } }, element.label))))));
|
|
194
|
+
}, style: { alignSelf: "end" }, tabIndex: itemTabIndex }, element.label))))));
|
|
193
195
|
}
|
|
194
196
|
return null;
|
|
195
197
|
};
|
|
196
198
|
export const C3Navigation = ({ app, appBar, forwardRef, navbar, orgSideBar, infoSideBar, userSideBar, }) => {
|
|
199
|
+
const isLargeScreen = useMediaQuery(`(min-width: ${BREAKPOINT_LG_WIDTH}`);
|
|
200
|
+
const displayAppBar = (appBar.elements?.length ?? 0) > 0 || !isLargeScreen;
|
|
201
|
+
const inverseThemeClassName = useInverseThemeClassName();
|
|
197
202
|
return (React.createElement(HeaderContainer, { render: () => {
|
|
198
|
-
return (React.createElement(Header, { "aria-label":
|
|
203
|
+
return (React.createElement(Header, { "aria-label": app.ariaLabel },
|
|
199
204
|
React.createElement(SkipToContent, null),
|
|
200
|
-
React.createElement(C3NavigationAppBar, { app: app, appBar: appBar, forwardRef: forwardRef, navbar: navbar }),
|
|
205
|
+
displayAppBar && (React.createElement(C3NavigationAppBar, { app: app, appBar: appBar, forwardRef: forwardRef, navbar: navbar })),
|
|
201
206
|
React.createElement(HeaderName, { element: forwardRef, prefix: app.prefix, ...app.routeProps },
|
|
202
207
|
React.createElement("span", null, app.name)),
|
|
203
208
|
React.createElement(HeaderNavigation, { "aria-label": app.ariaLabel }, navbar.elements.map((element) => (React.createElement(HeaderMenuItem, { key: element.key, element: forwardRef, isCurrentPage: element.isCurrentPage, ...element.routeProps },
|
|
@@ -211,7 +216,29 @@ export const C3Navigation = ({ app, appBar, forwardRef, navbar, orgSideBar, info
|
|
|
211
216
|
} },
|
|
212
217
|
navbar.tags &&
|
|
213
218
|
navbar.tags.length > 0 &&
|
|
214
|
-
navbar.tags.map((tag) =>
|
|
219
|
+
navbar.tags.map((tag) => {
|
|
220
|
+
if (tag?.tooltip !== undefined) {
|
|
221
|
+
const { content, buttonLabel } = tag.tooltip;
|
|
222
|
+
return (React.createElement("div", { key: tag.key, style: {
|
|
223
|
+
height: "1.5rem",
|
|
224
|
+
marginTop: "0.50rem",
|
|
225
|
+
} },
|
|
226
|
+
React.createElement(Toggletip, null,
|
|
227
|
+
React.createElement(ToggletipButton, { label: buttonLabel },
|
|
228
|
+
React.createElement(Tag, { type: tag.color, style: {
|
|
229
|
+
padding: "0 1rem",
|
|
230
|
+
marginRight: 0,
|
|
231
|
+
marginLeft: 0,
|
|
232
|
+
cursor: "pointer",
|
|
233
|
+
} }, tag.label)),
|
|
234
|
+
React.createElement(ToggletipContent, { className: inverseThemeClassName }, content))));
|
|
235
|
+
}
|
|
236
|
+
return (React.createElement(Tag, { key: tag.key, style: {
|
|
237
|
+
height: "1.5rem",
|
|
238
|
+
marginTop: "0.75rem",
|
|
239
|
+
padding: "0 1rem",
|
|
240
|
+
}, type: tag.color }, tag.label));
|
|
241
|
+
}),
|
|
215
242
|
navbar.orgName && (React.createElement("div", { className: "bodyText", style: {
|
|
216
243
|
fontSize: "14px",
|
|
217
244
|
lineHeight: "3rem",
|
|
@@ -244,3 +271,28 @@ function useOnClickOutside(refPanel, refIcon, handler) {
|
|
|
244
271
|
};
|
|
245
272
|
}, [refPanel, handler]);
|
|
246
273
|
}
|
|
274
|
+
function executeMediaQuery(mediaQuery) {
|
|
275
|
+
return window.matchMedia(mediaQuery);
|
|
276
|
+
}
|
|
277
|
+
function useMediaQuery(mediaQuery) {
|
|
278
|
+
const [isMatched, setIsMatched] = useState(executeMediaQuery(mediaQuery).matches);
|
|
279
|
+
useEffect(() => {
|
|
280
|
+
const query = executeMediaQuery(mediaQuery);
|
|
281
|
+
const listener = (event) => {
|
|
282
|
+
setIsMatched(event.matches);
|
|
283
|
+
};
|
|
284
|
+
query.addEventListener("change", listener);
|
|
285
|
+
return () => {
|
|
286
|
+
query.removeEventListener("change", listener);
|
|
287
|
+
};
|
|
288
|
+
}, []);
|
|
289
|
+
return isMatched;
|
|
290
|
+
}
|
|
291
|
+
function useInverseThemeClassName() {
|
|
292
|
+
const { theme } = useTheme();
|
|
293
|
+
const prefix = usePrefix();
|
|
294
|
+
if (!["g10", "g100"].includes(theme)) {
|
|
295
|
+
return "";
|
|
296
|
+
}
|
|
297
|
+
return theme === "g10" ? `${prefix}--g100` : `${prefix}--g10`;
|
|
298
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import { Tag } from "@carbon/react";
|
|
2
3
|
export interface C3NavigationAppProps {
|
|
3
4
|
prefix: string;
|
|
4
5
|
name: string;
|
|
@@ -63,7 +64,11 @@ export interface C3NavigationNavBarProps {
|
|
|
63
64
|
tags?: Array<{
|
|
64
65
|
label: string;
|
|
65
66
|
key: string;
|
|
66
|
-
color?:
|
|
67
|
+
color?: React.ComponentProps<typeof Tag>["type"];
|
|
68
|
+
tooltip?: {
|
|
69
|
+
content: React.ReactNode;
|
|
70
|
+
buttonLabel: string;
|
|
71
|
+
};
|
|
67
72
|
}>;
|
|
68
73
|
orgName?: string;
|
|
69
74
|
}
|