This is an automated email from the ASF dual-hosted git repository. porcelli pushed a commit to branch KOGITO-8015-feature-preview in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git
commit 888e11c9f61769d6b8b7089da9f9c4fa5b336382 Author: Fabrizio Antonangeli <[email protected]> AuthorDate: Thu Feb 9 10:27:50 2023 +0100 KOGITO-8149: Refactor Home (now Overview) according to UX redesign (#1449) * Add top banner * Add sidebar title * manage Buttons responsiveness * Fix "New Dashboard" button overlap when sidebar is open on breakpoint lg * Refactored import card * Video section * FIX: Overview: visualization issues with sidebar and quickstarts open * Add kie-docs button * Empty commit * -resize logo -add ExternalLinkAltIcon to "document" button -replaced placeholder with real video -fix typo -add reference in application-services.css comment * Uptaded YT video * Removed "/Documentation" route --- .../src/homepage/overView/ImportFromUrlCard.tsx | 3 +- .../src/homepage/overView/NewModelCard.tsx | 40 +-- .../homepage/overView/NewServerlessModelCard.tsx | 51 +-- .../src/homepage/overView/Overview.tsx | 206 ++++++++---- .../src/homepage/overView/UploadCard.tsx | 2 +- .../src/homepage/pageTemplate/OnlineEditorPage.tsx | 14 +- .../src/homepage/routes/HomePageRoutes.tsx | 11 +- .../src/homepage/uiNav/HomePageNav.tsx | 44 ++- packages/serverless-logic-web-tools/src/index.tsx | 1 + .../src/navigation/RoutesSwitch.tsx | 11 +- .../static/images/overview-banner-bg.png | Bin 0 -> 52155 bytes .../static/resources/application-services.css | 350 +++++++++++++++++++++ .../static/resources/style.css | 3 + 13 files changed, 597 insertions(+), 139 deletions(-) diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx index f644bea22f..6379023cda 100644 --- a/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ -import { SupportedFileExtensions } from "../../extension"; import * as React from "react"; import { useRoutes } from "../../navigation/Hooks"; import { useHistory } from "react-router"; @@ -54,7 +53,7 @@ export function ImportFromUrlCard() { }, [importableUrl]); return ( - <Card isFullHeight={true} isLarge={true} isPlain={true} isSelected={url.length > 0}> + <Card isFullHeight={true} isPlain={true} isSelected={url.length > 0} isCompact> <CardTitle> <TextContent> <Text component={TextVariants.h2}> diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx index ab39d58ade..81fd7da2c3 100644 --- a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx @@ -14,38 +14,38 @@ * limitations under the License. */ -import { SupportedFileExtensions } from "../../extension"; -import * as React from "react"; -import { useRoutes } from "../../navigation/Hooks"; +import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button"; import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card"; -import { FileLabel } from "../../workspace/components/FileLabel"; import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text"; -import { Grid } from "@patternfly/react-core/dist/js/layouts/Grid"; +import { GridItem } from "@patternfly/react-core/dist/js/layouts/Grid"; +import * as React from "react"; import { Link } from "react-router-dom"; -import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button"; +import { SupportedFileExtensions } from "../../extension"; +import { useRoutes } from "../../navigation/Hooks"; +import { FileLabel } from "../../workspace/components/FileLabel"; export function NewModelCard(props: { title: string; extension: SupportedFileExtensions; description: string }) { const routes = useRoutes(); return ( - <Card isFullHeight={true} isPlain={true} isLarge={true}> - <CardTitle> - <FileLabel style={{ fontSize: "0.6em" }} extension={props.extension} /> - </CardTitle> - <CardBody> - <TextContent> - <Text component={TextVariants.p}>{props.description}</Text> - </TextContent> - </CardBody> - <CardFooter> - <Grid> + <GridItem sm={12} md={4}> + <Card isFullHeight={true} isPlain={true} isCompact> + <CardTitle> + <FileLabel style={{ fontSize: "0.6em" }} extension={props.extension} /> + </CardTitle> + <CardBody> + <TextContent> + <Text component={TextVariants.p}>{props.description}</Text> + </TextContent> + </CardBody> + <CardFooter> <Link to={{ pathname: routes.newModel.path({ extension: props.extension }) }}> <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.extension}-button`}> New {props.title} </Button> </Link> - </Grid> - </CardFooter> - </Card> + </CardFooter> + </Card> + </GridItem> ); } diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx index 406c3825fe..a7141523cf 100644 --- a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx @@ -14,15 +14,16 @@ * limitations under the License. */ +import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button"; +import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card"; +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text"; +import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex"; +import { GridItem } from "@patternfly/react-core/dist/js/layouts/Grid"; import * as React from "react"; +import { Link } from "react-router-dom"; import { SupportedFileExtensions } from "../../extension"; import { useRoutes } from "../../navigation/Hooks"; -import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card"; import { FileLabel } from "../../workspace/components/FileLabel"; -import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text"; -import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid"; -import { Link } from "react-router-dom"; -import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button"; export function NewServerlessModelCard(props: { title: string; @@ -33,34 +34,36 @@ export function NewServerlessModelCard(props: { const routes = useRoutes(); return ( - <Card isFullHeight={true} isPlain={true} isLarge={true}> - <CardTitle> - <FileLabel style={{ fontSize: "0.6em" }} extension={props.jsonExtension} /> - </CardTitle> - <CardBody> - <TextContent> - <Text component={TextVariants.p}>{props.description}</Text> - </TextContent> - </CardBody> - <CardFooter> - <Grid hasGutter> - <GridItem span={12}>New {props.title}</GridItem> - <GridItem span={6}> + <GridItem sm={12} md={4}> + <Card isFullHeight={true} isPlain={true} isCompact={true}> + <CardTitle> + <FileLabel style={{ fontSize: "0.6em" }} extension={props.jsonExtension} /> + </CardTitle> + <CardBody> + <TextContent> + <Text component={TextVariants.p}>{props.description}</Text> + </TextContent> + </CardBody> + <CardFooter> + <TextContent> + <Text component={TextVariants.p}> + <b>New {props.title}</b> + </Text> + </TextContent> + <Flex> <Link to={{ pathname: routes.newModel.path({ extension: props.jsonExtension }) }}> <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.jsonExtension}-button`}> JSON </Button> </Link> - </GridItem> - <GridItem span={6}> <Link to={{ pathname: routes.newModel.path({ extension: props.yamlExtension }) }}> <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.yamlExtension}-button`}> YAML </Button> </Link> - </GridItem> - </Grid> - </CardFooter> - </Card> + </Flex> + </CardFooter> + </Card> + </GridItem> ); } diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx index 2cdb5eda27..e286bc94c0 100644 --- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx @@ -20,23 +20,34 @@ import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid"; import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery"; import { PageSection } from "@patternfly/react-core/dist/js/components/Page"; import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text"; -import { Divider } from "@patternfly/react-core/dist/js/components/Divider"; import { NewServerlessModelCard } from "./NewServerlessModelCard"; -import { Card } from "@patternfly/react-core"; +import { Button, ButtonVariant, Card, CardBody } from "@patternfly/react-core/dist/js"; import { ImportFromUrlCard } from "./ImportFromUrlCard"; import { UploadCard } from "./UploadCard"; import { useRoutes } from "../../navigation/Hooks"; import { useHistory } from "react-router"; import { useQueryParam, useQueryParams } from "../../queryParams/QueryParamsContext"; import { QueryParams } from "../../navigation/Routes"; -import { useCallback } from "react"; +import { useCallback, useContext, useMemo } from "react"; import { NewModelCard } from "./NewModelCard"; +import { Title } from "@patternfly/react-core/dist/js/components/Title"; +import { Stack, StackItem } from "@patternfly/react-core/dist/js/layouts/Stack"; +import { CardHeader, CardHeaderMain, CardTitle } from "@patternfly/react-core/dist/js/components/Card"; +import { List, ListItem } from "@patternfly/react-core/dist/js/components/List"; +import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts"; +import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons"; -export function Overview() { +export function Overview(props: { isNavOpen: boolean }) { const routes = useRoutes(); const history = useHistory(); const expandedWorkspaceId = useQueryParam(QueryParams.EXPAND); const queryParams = useQueryParams(); + const qsContext = useContext<QuickStartContextValues>(QuickStartContext); + + const force12Cols = useMemo( + () => props.isNavOpen && !!qsContext.activeQuickStartID, + [props.isNavOpen, qsContext.activeQuickStartID] + ); const closeExpandedWorkspace = useCallback(() => { history.replace({ @@ -60,63 +71,140 @@ export function Overview() { }, [closeExpandedWorkspace, history, routes, expandedWorkspaceId] ); + return ( - <Grid hasGutter> - <GridItem sm={12} xl={6}> - <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}> - <Card className="Dev-ui__card-size"> + <> + <PageSection + className="appsrv-marketing--banner" + style={ + { + "--appsrv-marketing--banner--before--BackgroundImage": "url(images/overview-banner-bg.png)", + "--appsrv-marketing--banner--before--BackgroundPositionY": "-99px", + "--appsrv-marketing--banner--before--BackgroundRepeat": "no-repeat", + "--appsrv-marketing--banner--before--BackgroundSize": "478px", + } as React.CSSProperties + } + variant={"light"} + > + <Stack hasGutter> + <Title headingLevel="h1" size="2xl"> + Welcome to Serverless Logic Web Tools + </Title> + <StackItem> + <Text className="appsrv-marketing--banner__tagline pf-u-color-200"> + Add-on service to create and synchronize your Serverless Workflow, Decision files, and Dashbuilder files + </Text> + <Text component={TextVariants.p}> + The Serverless Logic Web Tools is a web application that enables you to create and synchronize your + Serverless Workflow, Decision files, and Dashbuilder files in a single interface. Also, the Serverless + Logic Web Tools application provides the integrations that are needed to deploy and test the Serverless + Workflow models in development mode. + </Text> + </StackItem> + <StackItem> + <Button + target="_blank" + iconPosition="right" + icon={<ExternalLinkAltIcon />} + href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html" + variant={ButtonVariant.secondary} + component="a" + > + Get Started with Serverless Logic Web Tools + </Button> + </StackItem> + </Stack> + </PageSection> + <PageSection className="appsrv-marketing--page-section--marketing" isWidthLimited> + <Grid hasGutter> + <GridItem xl={12} xl2={force12Cols ? 12 : 6}> + <Card className="Dev-ui__card-size" style={{ height: "100%" }}> + <CardHeader> + <CardHeaderMain> + <CardTitle> + <Title headingLevel="h2">Create</Title> + </CardTitle> + </CardHeaderMain> + </CardHeader> + <CardBody> + <Grid> + <NewServerlessModelCard + title={"Workflow"} + jsonExtension={FileTypes.SW_JSON} + yamlExtension={FileTypes.SW_YAML} + description={"Serverless Workflow files are used to define orchestration logic for services."} + /> + <NewServerlessModelCard + title={"Decision"} + jsonExtension={FileTypes.YARD_JSON} + yamlExtension={FileTypes.YARD_YAML} + description={"Serverless Decision files are used to define decision logic for services."} + /> + <NewModelCard + title={"Dashboard"} + extension={FileTypes.DASH_YAML} + description={ + "Dashboard files are used to define data visualization from data extracted from applications." + } + /> + </Grid> + </CardBody> + </Card> + </GridItem> + <GridItem xl={12} xl2={force12Cols ? 12 : 6}> + <Card className="Dev-ui__card-size" style={{ height: "100%" }}> + <CardHeader> + <CardHeaderMain> + <CardTitle> + <Title headingLevel="h2">Import</Title> + </CardTitle> + </CardHeaderMain> + </CardHeader> + <CardBody> + <Gallery + hasGutter={true} + // 16px is the "Gutter" width. + minWidths={{ sm: "calc(50% - 16px)", default: "100%" }} + style={{ height: "calc(100% - 32px)" }} + > + <ImportFromUrlCard /> + <UploadCard expandWorkspace={expandWorkspace} /> + </Gallery> + </CardBody> + </Card> + </GridItem> + </Grid> + </PageSection> + + <PageSection isWidthLimited className="appsrv-marketing--page-section--marketing" variant="light"> + <Title className="pf-u-mb-lg" size="xl" headingLevel="h3"> + Use Serverless Logic Web Tools + </Title> + <Grid hasGutter> + <GridItem md={7}> + <Card className="appsrv-marketing--video"> + <iframe + width="560" + height="315" + src="https://www.youtube.com/embed/t3ahWJjiGoU" + title="YouTube video player" + allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" + allowFullScreen + ></iframe> + </Card> + </GridItem> + <GridItem md={5}> <TextContent> - <Text component={TextVariants.h1}>Create</Text> + <Text className="pf-u-color-200 pf-u-ml-md">In this video, you'll learn how to:</Text> + <List className="app-services-ui--icon-list"> + <ListItem>Create a Serverless Workflow, a Dashboard or a Decision.</ListItem> + <ListItem>Import a project into Serveless Logic Web Tools.</ListItem> + <ListItem>Deploy and run your project into an OpenShift instance.</ListItem> + </List> </TextContent> - <br /> - <Divider inset={{ default: "insetXl" }} /> - <Gallery - hasGutter={true} - // 16px is the "Gutter" width. - minWidths={{ sm: "calc(33% - 16px)", default: "100%" }} - style={{ height: "calc(100% - 32px)" }} - > - <NewServerlessModelCard - title={"Workflow"} - jsonExtension={FileTypes.SW_JSON} - yamlExtension={FileTypes.SW_YAML} - description={"Serverless Workflow files are used to define orchestration logic for services."} - /> - <NewServerlessModelCard - title={"Decision"} - jsonExtension={FileTypes.YARD_JSON} - yamlExtension={FileTypes.YARD_YAML} - description={"Serverless Decision files are used to define decision logic for services."} - /> - <NewModelCard - title={"Dashboard"} - extension={FileTypes.DASH_YAML} - description={ - "Dashboard files are used to define data visualization from data extracted from applications." - } - /> - </Gallery> - </Card> - </PageSection> - </GridItem> - <GridItem sm={12} xl={6}> - <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}> - <TextContent> - <Text component={TextVariants.h1}>Import</Text> - </TextContent> - <br /> - <Divider inset={{ default: "insetXl" }} /> - <Gallery - hasGutter={true} - // 16px is the "Gutter" width. - minWidths={{ sm: "calc(50% - 16px)", default: "100%" }} - style={{ height: "calc(100% - 32px)" }} - > - <ImportFromUrlCard /> - <UploadCard expandWorkspace={expandWorkspace} /> - </Gallery> - </PageSection> - </GridItem> - </Grid> + </GridItem> + </Grid> + </PageSection> + </> ); } diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx index aabae9ea32..c63221d06b 100644 --- a/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx @@ -183,7 +183,7 @@ export function UploadCard(props: { expandWorkspace: (workspaceId: string) => vo </div> )} <input id={"upload-field"} {...getInputProps()} /> - <Card isFullHeight={true} isLarge={true} isPlain={true}> + <Card isFullHeight={true} isPlain={true} isCompact={true}> <CardTitle> <TextContent> <Text component={TextVariants.h2}> diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx index a6bf24d405..af763471da 100644 --- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx @@ -49,15 +49,19 @@ import { import { SettingsButton } from "../../settings/SettingsButton"; import { HomePageNav } from "../uiNav/HomePageNav"; -export type OnlineEditorPageProps = { children?: React.ReactNode; pageContainerRef: React.RefObject<HTMLDivElement> }; +export type OnlineEditorPageProps = { + children?: React.ReactNode; + pageContainerRef: React.RefObject<HTMLDivElement>; + isNavOpen: boolean; + setIsNavOpen: (value: boolean) => void; +}; export function OnlineEditorPage(props: OnlineEditorPageProps) { const history = useHistory(); const routes = useRoutes(); - const [isNavOpen, setIsNavOpen] = useState(true); const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({})); const navToggle = () => { - setIsNavOpen(!isNavOpen); + props.setIsNavOpen(!props.isNavOpen); }; const [activeQuickStartID, setActiveQuickStartID] = useState(""); const [allQuickStartStates, setAllQuickStartStates] = useState({}); @@ -124,7 +128,7 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) { variant="plain" aria-label="Global NAV" onClick={navToggle} - aria-expanded={isNavOpen} + aria-expanded={props.isNavOpen} aria-controls="" > <BarsIcon /> @@ -157,7 +161,7 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) { [location, isRouteInSettingsSection] ); - const sidebar = <PageSidebar nav={pageNav} isNavOpen={isNavOpen} theme="dark" />; + const sidebar = <PageSidebar nav={pageNav} isNavOpen={props.isNavOpen} theme="dark" />; const mainContainerId = "main-content-page-layout-tertiary-nav"; const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>; diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx index 8ddd74cdf8..2a2f17cf6e 100644 --- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx @@ -27,7 +27,7 @@ import { NewWorkspaceFromUrlPage } from "../../workspace/components/NewWorkspace import { EditorPage } from "../../editor/EditorPage"; import { NoMatchPage } from "../../navigation/NoMatchPage"; -export function HomePageRoutes() { +export function HomePageRoutes(props: { isNavOpen: boolean }) { const routes = useRoutes(); const supportedExtensions = useMemo(() => supportedFileExtensionArray.join("|"), []); return ( @@ -55,7 +55,7 @@ export function HomePageRoutes() { )} </Route> <Route path="/" exact> - <Overview /> + <Overview isNavOpen={props.isNavOpen} /> </Route> <Route path="/ServerlessModels"> <ServerlessModels /> @@ -63,13 +63,6 @@ export function HomePageRoutes() { <Route path="/SampleCatalog"> <SampleCatalog /> </Route> - <Route - path="/Documentation" - component={() => { - window.open("https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html"); - return null; - }} - /> <Route component={NoMatchPage} /> </Switch> ); diff --git a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx index b0bcf908fa..29d1ffbab9 100644 --- a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx +++ b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx @@ -17,27 +17,39 @@ import * as React from "react"; import { Nav, NavItem, NavList } from "@patternfly/react-core"; import { Link } from "react-router-dom"; +import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons"; export function HomePageNav(props: { pathname: string }) { return ( - <Nav aria-label="Global NAV" theme="dark"> - <NavList> - <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === "/"}> - <Link to="/">Overview</Link> - </NavItem> + <> + <div className="chr-c-app-title">Serverless Logic Web Tools</div> + <Nav aria-label="Global NAV" theme="dark"> + <NavList> + <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === "/"}> + <Link to="/">Overview</Link> + </NavItem> - <NavItem itemId={1} key={"Serverless-models-nav"} isActive={props.pathname === "/ServerlessModels"}> - <Link to="/ServerlessModels">Serverless Models</Link> - </NavItem> + <NavItem itemId={1} key={"Serverless-models-nav"} isActive={props.pathname === "/ServerlessModels"}> + <Link to="/ServerlessModels">Serverless Models</Link> + </NavItem> - <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === "/SampleCatalog"}> - <Link to="/SampleCatalog">Sample Catalog</Link> - </NavItem> + <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === "/SampleCatalog"}> + <Link to="/SampleCatalog">Sample Catalog</Link> + </NavItem> - <NavItem itemId={3} key={"Documentation-nav"} isActive={props.pathname === "/Documentation"}> - <Link to="/Documentation">Documentation</Link> - </NavItem> - </NavList> - </Nav> + <NavItem + itemId={3} + key={"Documentation-nav"} + className="chr-c-navigation__additional-links" + isActive={props.pathname === "/Documentation"} + > + <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html" target="_blank"> + Documentation + <ExternalLinkAltIcon /> + </a> + </NavItem> + </NavList> + </Nav> + </> ); } diff --git a/packages/serverless-logic-web-tools/src/index.tsx b/packages/serverless-logic-web-tools/src/index.tsx index d23a1dc5e6..db8f193bdd 100644 --- a/packages/serverless-logic-web-tools/src/index.tsx +++ b/packages/serverless-logic-web-tools/src/index.tsx @@ -20,6 +20,7 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; import { App } from "./App"; import "../static/resources/style.css"; +import "../static/resources/application-services.css"; import * as incompatibleBrowser from "./workspace/startupBlockers/IncompatibleBrowser"; import * as fsChanged from "./workspace/startupBlockers/FsChanged"; diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx index ad68babfe9..e4a33a202d 100644 --- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx +++ b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx @@ -15,7 +15,7 @@ */ import * as React from "react"; -import { useMemo, useRef } from "react"; +import { useMemo, useRef, useState } from "react"; import { Route, Switch, useRouteMatch } from "react-router-dom"; import { useRoutes } from "./Hooks"; import { OnlineEditorPage } from "../homepage/pageTemplate/OnlineEditorPage"; @@ -30,6 +30,7 @@ export function RoutesSwitch() { return process.env["WEBPACK_REPLACE__buildInfo"]; }, []); const pageContainerRef = useRef<HTMLDivElement>(null); + const [isNavOpen, setIsNavOpen] = useState(true); const renderPage = (routeProps: { location: { @@ -46,8 +47,12 @@ export function RoutesSwitch() { }; }) => { return ( - <OnlineEditorPage pageContainerRef={pageContainerRef}> - {!isRouteInSettingsSection ? <HomePageRoutes /> : <SettingsPageRoutes pageContainerRef={pageContainerRef} />} + <OnlineEditorPage pageContainerRef={pageContainerRef} isNavOpen={isNavOpen} setIsNavOpen={setIsNavOpen}> + {!isRouteInSettingsSection ? ( + <HomePageRoutes isNavOpen={isNavOpen} /> + ) : ( + <SettingsPageRoutes pageContainerRef={pageContainerRef} /> + )} {buildInfo && ( <div className={"kie-tools--build-info"}> <Label>{buildInfo}</Label> diff --git a/packages/serverless-logic-web-tools/static/images/overview-banner-bg.png b/packages/serverless-logic-web-tools/static/images/overview-banner-bg.png new file mode 100644 index 0000000000..9d2ffbc5de Binary files /dev/null and b/packages/serverless-logic-web-tools/static/images/overview-banner-bg.png differ diff --git a/packages/serverless-logic-web-tools/static/resources/application-services.css b/packages/serverless-logic-web-tools/static/resources/application-services.css new file mode 100644 index 0000000000..cb1afe1004 --- /dev/null +++ b/packages/serverless-logic-web-tools/static/resources/application-services.css @@ -0,0 +1,350 @@ +/* original CSS: https://console.redhat.com/beta/apps/application-services/6f315189.css */ + +main.applicationServices { + height: 100%; +} + +.pf-c-page__main-section.appsrv-marketing--banner { + --appsrv-marketing--banner--before--GridTemplateColumns: 1fr; + --appsrv-marketing--banner--ColumnGap: var(--pf-global--spacer--2xl); + --appsrv-marketing--banner__tagline--Color: var(--pf-global--Color--light-300); + --appsrv-marketing--banner--Padding: var(--pf-global--spacer--lg); + --appsrv-marketing--banner--PaddingTop: var(--appsrv-marketing--banner--Padding); + --appsrv-marketing--banner--PaddingRight: var(--appsrv-marketing--banner--Padding); + --appsrv-marketing--banner--PaddingBottom: var(--appsrv-marketing--banner--Padding); + --appsrv-marketing--banner--PaddingLeft: var(--appsrv-marketing--banner--Padding); + --appsrv-marketing--banner--before--Offset--top: calc(var(--appsrv-marketing--banner--PaddingTop) * -1); + --appsrv-marketing--banner--before--Offset--bottom: calc(var(--appsrv-marketing--banner--PaddingBottom) * -1); + --appsrv-marketing--banner--before--Offset--right: calc(var(--appsrv-marketing--banner--PaddingRight) * -1); + --appsrv-marketing--banner--before--Offset--left: calc(var(--appsrv-marketing--banner--PaddingLeft) * -1); + grid-gap: var(--appsrv-marketing--banner--ColumnGap); + display: grid; + grid-template-areas: "content"; + grid-template-columns: var(--appsrv-marketing--banner--before--GridTemplateColumns); + padding: var(--appsrv-marketing--banner--PaddingTop) var(--appsrv-marketing--banner--PaddingRight) + var(--appsrv-marketing--banner--PaddingBottom) var(--appsrv-marketing--banner--PaddingLeft); +} + +@media screen and (min-width: 768px) { + .pf-c-page__main-section.appsrv-marketing--banner { + --appsrv-marketing--banner--Padding: var(--pf-global--spacer--2xl); + --appsrv-marketing--banner--before--Opacity: 0.65; + --appsrv-marketing--banner--before--GridTemplateColumns: 2fr 1fr; + grid-template-areas: "content graphic"; + } +} + +@media screen and (min-width: 992px) { + .pf-c-page__main-section.appsrv-marketing--banner { + --appsrv-marketing--banner--before--GridTemplateColumns: 2fr 1fr; + } +} + +@media screen and (min-width: 1200px) { + .pf-c-page__main-section.appsrv-marketing--banner { + --appsrv-marketing--banner--before--Opacity: 1; + } +} + +.pf-c-page__main-section.appsrv-marketing--banner:before { + background-image: var(--appsrv-marketing--banner--before--BackgroundImage); + background-position-y: var(--appsrv-marketing--banner--before--BackgroundPositionY); + background-repeat: var(--appsrv-marketing--banner--before--BackgroundRepeat); + background-size: var(--appsrv-marketing--banner--before--BackgroundSize); + content: ""; + grid-area: graphic; + margin-bottom: var(--appsrv-marketing--banner--before--Offset--bottom); + margin-right: var(--appsrv-marketing--banner--before--Offset--right); + margin-top: var(--appsrv-marketing--banner--before--Offset--top); + opacity: var(--appsrv-marketing--banner--before--Opacity); +} + +.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section + .pf-c-button.pf-m-primary { + background-color: var(--pf-global--palette--blue-400); + color: var(--pf-global--primary-color-100); +} + +.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section + .pf-c-button.pf-m-primary:active, +.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section + .pf-c-button.pf-m-primary:focus, +.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section + .pf-c-button.pf-m-primary:hover { + background-color: var(--pf-global--palette--blue-500); + color: var(--pf-global--primary-color-100); +} + +.appsrv-marketing--banner--text-only { + font-size: var(--pf-global--FontSize--xl); + max-width: 800px; + text-align: center; +} + +.appsrv-marketing--page-section--marketing, +.appsrv-marketing--page-section--video { + --pf-c-page__main-section--PaddingTop: var(--pf-global--spacer--xl); + --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--lg); + --pf-c-page__main-section--PaddingBottom: var(--pf-global--spacer--xl); + --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--lg); +} + +.appsrv-marketing--page-section--marketing .pf-l-grid.pf-m-gutter, +.appsrv-marketing--page-section--video .pf-l-grid.pf-m-gutter { + --pf-l-grid--m-gutter--GridGap: var(--pf-global--spacer--lg); +} + +@media screen and (min-width: pf-global--breakpoint--md) { + .appsrv-marketing--page-section--marketing, + .appsrv-marketing--page-section--video { + --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--2xl); + --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--2xl); + } +} + +.appsrv-marketing--banner__tagline { + color: var(--appsrv-marketing--banner__tagline--Color); + font-size: var(--pf-global--FontSize--lg); + margin-bottom: var(--pf-global--spacer--lg); +} + +.appsrv-marketing--video { + height: 0; + padding-bottom: 56.25% !important; + position: relative; +} + +.appsrv-marketing--video iframe { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.kafka-overview--page-section--marketing { + --pf-c-page__main-section--PaddingTop: 0; + --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--lg); + --pf-c-page__main-section--PaddingBottom: var(--pf-global--spacer--xl); + --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--lg); +} + +.appserv-devpreview { + height: 100%; +} + +.appserv-devpreview__button { + --pf-c-button--m-link--Color: var(--pf-global--Color--dark-100) !important; + text-decoration: underline; +} + +.pf-c-empty-state.pf-m-xl { + --pf-c-empty-state__content--MaxWidth: 624px; +} + +tr.mas--ResponsiveTable__Tr--deleted > td { + color: var(--pf-global--Color--200); +} + +.kafka-ui-form-group--readonly .pf-c-form-control[readonly] { + --pf-c-form-control--readonly--BackgroundColor: transparent; + --pf-c-form-control--readonly--focus--PaddingBottom: 0; + border: none; + padding: 0; +} + +.kafka-ui-form-group--readonly .pf-c-form__group-label { + --pf-c-form__group-label--PaddingBottom: 0; +} + +.mas--CreateKafkaInstance__sidebar .pf-c-content dl { + display: block; +} + +.mas--CreateKafkaInstance__sidebar dt { + font-size: var(--pf-global--FontSize--sm); +} + +.mas--CreateKafkaInstance__creationTimeAlert { + margin-top: var(--pf-global--spacer--md); +} + +.mas--details__drawer--tab-content { + padding-bottom: var(--pf-global--spacer--lg); + padding-top: var(--pf-global--spacer--lg); +} + +.mas-c-status.pf-l-split.pf-m-gutter > :not(:last-child) { + --pf-l-split--m-gutter--MarginRight: var(--pf-global--spacer--sm); +} + +.mas-m-ready { + color: var(--pf-global--success-color--100); +} + +.mas-m-degraded, +.mas-m-ready { + font-size: var(--pf-global--icon--FontSize--md); +} + +.mas-m-degraded { + color: var(--pf-global--warning-color--100); +} + +.mas-m-deleting { + color: var(--pf-global--Color--200); +} + +.mas-KafkaMessageBrowser-Toolbar { + z-index: 999; +} + +.mas-KafkaMessageBrowser-Toolbar .pf-c-toolbar__content-section, +.mas-KafkaMessageBrowser-Toolbar .pf-c-toolbar__group { + align-items: flex-start; +} + +.pf-c-label.mas-m-solid { + --pf-c-label__content--before--BorderColor: transparent; + --pf-c-label--BackgroundColor: var(--pf-global--palette--black-600); + --pf-c-label__content--Color: var(--pf-global--palette--white); + align-items: center; + display: inline-flex; + font-weight: var(--pf-global--FontWeight--bold); + justify-content: center; + min-width: calc( + var(--pf-c-label--FontSize) * var(--pf-global--LineHeight--md) + var(--pf-c-label--PaddingTop) + + var(--pf-c-label--PaddingBottom) + ); +} + +.pf-c-label.mas-m-solid.pf-m-blue { + --pf-c-label--BackgroundColor: var(--pf-global--palette--blue-400); + --pf-c-label__content--Color: var(--pf-global--palette--white); + --pf-c-label__content--before--BorderColor: transparent; +} + +.pf-c-label.mas-m-solid.pf-m-green { + --pf-c-label--BackgroundColor: var(--pf-global--palette--green-500); + --pf-c-label__content--Color: var(--pf-global--palette--white); + --pf-c-label__content--before--BorderColor: transparent; +} + +.pf-c-label.mas-m-solid.pf-m-orange { + --pf-c-label--BackgroundColor: var(--pf-global--palette--orange-400); + --pf-c-label__content--Color: var(--pf-global--palette--white); + --pf-c-label__content--before--BorderColor: transparent; +} + +.appserv-metrics-filterbytopic .pf-c-select__menu-wrapper { + max-width: min(100vw, 300px); +} + +.appserv-metrics-filterbytopic .pf-c-select__menu-item { + word-wrap: normal; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; +} + +#custom-offset-input { + width: 10rem; +} + +.mas--ConsumerGroupResetOffset__formTitle { + padding-top: var(--pf-c-form--m-horizontal__group-label--md--PaddingTop); +} + +.mas--ConsumerGroupResetOffset-form-group--readonly .pf-c-form-control[readonly] { + --pf-c-form-control--readonly--BackgroundColor: transparent; + --pf-c-form-control--readonly--focus--PaddingBottom: 0; + border: none; + padding: 0; +} + +.mas--ConsumerGroupResetOffset-form-group--readonly .pf-c-form__group-label { + --pf-c-form__group-label--PaddingBottom: 0; +} + +.consumer-group-drawer__top-label { + margin-bottom: 0 !important; +} + +.consumer-group-drawer__title { + margin-top: 0 !important; +} + +.consumer-group-drawer__drawer-content-body { + display: flex; + flex-direction: column; +} + +.mas--settings__card { + max-width: 55rem; +} + +.pf-u-color-200 { + color: var(--pf-global--Color--200) !important; +} + +.pf-u-mb-lg { + margin-bottom: var(--pf-global--spacer--lg) !important; +} +.pf-u-ml-auto { + margin-left: auto !important; +} + +.pf-u-ml-0 { + margin-left: 0 !important; +} + +.pf-u-ml-xs { + margin-left: var(--pf-global--spacer--xs) !important; +} + +.pf-u-ml-sm { + margin-left: var(--pf-global--spacer--sm) !important; +} + +.pf-u-ml-md { + margin-left: var(--pf-global--spacer--md) !important; +} + +.pf-u-ml-lg { + margin-left: var(--pf-global--spacer--lg) !important; +} + +.pf-u-ml-xl { + margin-left: var(--pf-global--spacer--xl) !important; +} + +.pf-u-ml-2xl { + margin-left: var(--pf-global--spacer--2xl) !important; +} + +.pf-u-ml-3xl { + margin-left: var(--pf-global--spacer--3xl) !important; +} + +.pf-u-ml-4xl { + margin-left: var(--pf-global--spacer--4xl) !important; +} +.pf-u-color-100 { + color: var(--pf-global--Color--100) !important; +} + +.pf-u-color-200 { + color: var(--pf-global--Color--200) !important; +} + +.pf-u-color-300 { + color: var(--pf-global--Color--300) !important; +} + +.pf-u-color-400 { + color: var(--pf-global--Color--400) !important; +} +.chr-c-navigation__additional-links svg { + margin-left: var(--pf-global--spacer--sm); +} diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css index a75c5b5755..f25e834600 100644 --- a/packages/serverless-logic-web-tools/static/resources/style.css +++ b/packages/serverless-logic-web-tools/static/resources/style.css @@ -600,6 +600,9 @@ section.kie-tools--settings-tab { #editor-page-masthead-files-dropdown-toggle { padding-left: 0; } +.kogito-tools-common--brand { + height: 28.6px; +} .pf-c-expandable-section.plain .pf-c-expandable-section__toggle { color: black; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
