@camunda/camunda-composite-components 0.0.18 → 0.0.19

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.
@@ -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,10 +1,10 @@
1
1
  export interface C3EmptyStateProps {
2
- icon: {
2
+ heading: string;
3
+ description: any;
4
+ icon?: {
3
5
  path: string;
4
6
  altText: string;
5
7
  };
6
- heading: string;
7
- description: any;
8
8
  button?: {
9
9
  onClick: () => void;
10
10
  disabled?: boolean;
@@ -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 === 'user' ? 'end' : 'center' }, icon),
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": "Camunda Console" },
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) => (React.createElement(Tag, { key: tag.key, className: "headerTag", type: tag.color }, tag.label))),
219
+ navbar.tags.map((tag) => {
220
+ if (tag?.tooltip !== undefined) {
221
+ const { content, buttonLabel } = tag.tooltip;
222
+ return (React.createElement("div", { style: {
223
+ height: "1.5rem",
224
+ marginTop: "0.50rem",
225
+ } },
226
+ React.createElement(Toggletip, { key: tag.key },
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?: "red" | "green" | "purple" | "teal";
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/camunda-composite-components",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "scripts": {
5
5
  "build": "tsc",
6
6
  "storybook": "start-storybook -p 6006",