diff --git a/packages/admin-ui/src/Accordion/components/AccordionContent.tsx b/packages/admin-ui/src/Accordion/components/AccordionContent.tsx index a8ce2077c2c..6a622dbc9d6 100644 --- a/packages/admin-ui/src/Accordion/components/AccordionContent.tsx +++ b/packages/admin-ui/src/Accordion/components/AccordionContent.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"; import { cva, type VariantProps, cn } from "~/utils"; -const accordionContentVariants = cva( +const collapsiblePrimitiveVariants = cva( [ "wby-overflow-hidden wby-text-md", "wby-transition-all data-[state=closed]:wby-animate-collapsible-up data-[state=open]:wby-animate-collapsible-down" @@ -10,38 +10,72 @@ const accordionContentVariants = cva( { // Using pixel values here because of non-existing design tokens. variants: { + padding: { + expanded: "", + collapsed: "" + }, withIcon: { - true: "wby-pl-9" + true: "" }, withHandle: { - true: "wby-pl-5" + true: "" } }, compoundVariants: [ + { + withIcon: true, + padding: "expanded", + className: "wby-pl-9" + }, + { + withHandle: true, + padding: "expanded", + className: "wby-pl-5" + }, { withIcon: true, withHandle: true, + padding: "expanded", className: "wby-pl-14" - } + }, ], defaultVariants: { withIcon: false, - withHandle: false + withHandle: false, + padding: "expanded" } } ); +const contentDivVariants = cva("wby-pt-sm wby-pb-lg wby-pl-md", { + variants: { + padding: { + collapsed: "wby-pr-md", + expanded: "wby-pr-[52px]" + } + } +}); + export interface AccordionContentProps extends React.ComponentPropsWithoutRef, - VariantProps {} + VariantProps {} -const AccordionContent = ({ children, withIcon, withHandle, ...props }: AccordionContentProps) => { +const AccordionContent = ({ + children, + withIcon, + withHandle, + padding, + ...props +}: AccordionContentProps) => { return ( -
{children}
+
{children}
); }; diff --git a/packages/admin-ui/src/Accordion/components/AccordionItem.tsx b/packages/admin-ui/src/Accordion/components/AccordionItem.tsx index c0e3516c6ef..7b79262c8f9 100644 --- a/packages/admin-ui/src/Accordion/components/AccordionItem.tsx +++ b/packages/admin-ui/src/Accordion/components/AccordionItem.tsx @@ -12,6 +12,7 @@ interface AccordionItemProps extends Omit { description?: React.ReactNode; icon?: React.ReactNode; handle?: React.ReactNode; + padding?: "collapsed"; interactive?: boolean; actions?: React.ReactNode; children: React.ReactNode; @@ -30,6 +31,7 @@ const AccordionItemBase = (props: AccordionItemProps) => { // Content props. children, + padding, // Trigger props. ...triggerProps @@ -47,7 +49,12 @@ const AccordionItemBase = (props: AccordionItemProps) => { ...triggerProps, interactive }, - contentProps: { children, withIcon: !!props.icon, withHandle: !!props.handle } + contentProps: { + children, + withIcon: !!props.icon, + withHandle: !!props.handle, + padding + } }; }, [props]); diff --git a/packages/admin-ui/src/Grid/Grid.tsx b/packages/admin-ui/src/Grid/Grid.tsx index 0c85a2e3322..02611f46596 100644 --- a/packages/admin-ui/src/Grid/Grid.tsx +++ b/packages/admin-ui/src/Grid/Grid.tsx @@ -62,7 +62,8 @@ const gridVariants = cva("wby-grid", { variants: { gap: { comfortable: "wby-gap-lg", - spacious: "wby-gap-xl" + spacious: "wby-gap-xl", + "none": "wby-gap-0", } }, defaultVariants: { diff --git a/packages/admin-ui/src/HeaderBar/HeaderBar.tsx b/packages/admin-ui/src/HeaderBar/HeaderBar.tsx index 9a258887a6f..eaee8f31dc1 100644 --- a/packages/admin-ui/src/HeaderBar/HeaderBar.tsx +++ b/packages/admin-ui/src/HeaderBar/HeaderBar.tsx @@ -1,20 +1,23 @@ import React from "react"; -import { makeDecoratable } from "~/utils"; +import { cn, makeDecoratable } from "~/utils"; import { Separator } from "~/Separator"; -interface HeaderBarProps { +interface HeaderBarProps extends React.HTMLAttributes { start?: React.ReactNode; middle?: React.ReactNode; end?: React.ReactNode; } -const HeaderBarBase = ({ start, middle, end }: HeaderBarProps) => { +const HeaderBarBase = ({ start, middle, end, className, ...props }: HeaderBarProps) => { return ( -
-
+
{start} @@ -23,9 +26,9 @@ const HeaderBarBase = ({ start, middle, end }: HeaderBarProps) => {
{end}
-
+
-
+ ); }; diff --git a/packages/admin-ui/src/Icon/Icon.tsx b/packages/admin-ui/src/Icon/Icon.tsx index 9a8a0e56226..35848ad02e9 100644 --- a/packages/admin-ui/src/Icon/Icon.tsx +++ b/packages/admin-ui/src/Icon/Icon.tsx @@ -61,7 +61,7 @@ const IconBase = (props: IconProps) => { return ( {/* @ts-expect-error */} - {React.cloneElement(icon, { + {icon && React.cloneElement(icon, { ...rest, className: cn(iconVariants({ color, disabled, size }), className) })} diff --git a/packages/admin-ui/src/theme.scss b/packages/admin-ui/src/theme.scss index f05ebedfb30..7110ad0d1b6 100644 --- a/packages/admin-ui/src/theme.scss +++ b/packages/admin-ui/src/theme.scss @@ -237,6 +237,7 @@ --spacing-xxs: 2px; --spacing-sidebar-collapsed: 44px; --spacing-sidebar-expanded: 256px; + --spacing-headerbar: 45px; // Text color. --text-accent-muted: var(--color-primary-300); diff --git a/packages/admin-ui/tailwind.config.theme.js b/packages/admin-ui/tailwind.config.theme.js index 5b1360ddf27..c88924d48a3 100644 --- a/packages/admin-ui/tailwind.config.theme.js +++ b/packages/admin-ui/tailwind.config.theme.js @@ -345,6 +345,7 @@ module.exports = { spacing: { "sidebar-collapsed": "var(--spacing-sidebar-collapsed)", "sidebar-expanded": "var(--spacing-sidebar-expanded)", + "headerbar": "var(--spacing-headerbar)", "3xl": "var(--spacing-3xl)", lg: "var(--spacing-lg)", md: "var(--spacing-md)", diff --git a/packages/app-page-builder/src/blockEditor/config/TopBar/BackButton/BackButton.tsx b/packages/app-page-builder/src/blockEditor/config/TopBar/BackButton/BackButton.tsx index 1f5af0e0d67..b6e1112a8e5 100644 --- a/packages/app-page-builder/src/blockEditor/config/TopBar/BackButton/BackButton.tsx +++ b/packages/app-page-builder/src/blockEditor/config/TopBar/BackButton/BackButton.tsx @@ -1,15 +1,10 @@ import React, { useCallback } from "react"; -import { css } from "emotion"; import { useLocation, useNavigate } from "@webiny/react-router"; -import { IconButton } from "@webiny/ui/Button"; +import { IconButton } from "@webiny/admin-ui"; import { ReactComponent as BackIcon } from "./round-arrow_back-24px.svg"; import { useBlock } from "~/blockEditor/hooks/useBlock"; import { BlockEditorConfig } from "~/blockEditor/editorConfig/BlockEditorConfig"; -const backStyles = css({ - marginLeft: -10 -}); - export function BackButton() { const { key } = useLocation(); const navigate = useNavigate(); @@ -27,8 +22,8 @@ export function BackButton() { return ( <> } /> diff --git a/packages/app-page-builder/src/editor/components/ColorPicker/ColorPicker.tsx b/packages/app-page-builder/src/editor/components/ColorPicker/ColorPicker.tsx index 5c159a2a893..1c1f29369a1 100644 --- a/packages/app-page-builder/src/editor/components/ColorPicker/ColorPicker.tsx +++ b/packages/app-page-builder/src/editor/components/ColorPicker/ColorPicker.tsx @@ -1,117 +1,41 @@ -import React, { useState, useCallback } from "react"; -import classnames from "classnames"; -import styled from "@emotion/styled"; +import React, { useCallback, useState } from "react"; import { css } from "emotion"; -import classNames from "classnames"; import isEqual from "lodash/isEqual"; import { ChromePicker, ColorState, RGBColor } from "react-color"; import { Menu } from "@webiny/ui/Menu"; +import { cn, ColorPicker as AdminUiColorPickerPrimitive, SwitchPrimitive } from "@webiny/admin-ui"; import { usePageElements } from "@webiny/app-page-builder-elements/hooks/usePageElements"; +import styled from "@emotion/styled"; -// Icons -import { ReactComponent as IconPalette } from "../../assets/icons/round-color_lens-24px.svg"; -import { ReactComponent as ColorizeIcon } from "./colorize.svg"; -import { ReactComponent as NoColorSelectedIcon } from "./unselected.svg"; -import { COLORS } from "../../plugins/elementSettings/components/StyledComponents"; - -const ColorPickerStyle = styled("div")({ - display: "flex", - flexWrap: "wrap", - justifyContent: "space-between" -}); - -const CompactColorPicker = styled("div")({ - display: "flex", - justifyContent: "flex-end", - "& .mdc-menu-surface--anchor": { - /** - * This menu is being treated differently because its parent "Accordion" has property "overflow: hidden", - * which makes it impossible to show the complete content of absolute positioned element using z-index. - * To overcome this issue, we're using a trick known as "Popping Out of Hidden Overflow" - * https://css-tricks.com/popping-hidden-overflow/ - */ - position: "static", - "& .mdc-menu-surface": { - transition: "transform 0.12s cubic-bezier(0, 0, 0.2, 1)" - }, - /** - * Adjusting Menu position due to the fact it's positioned relative to "Accordion" and not to its direct parent. - */ - "& .mdc-menu-surface--open": { - transform: "translate(-42px, 64px)" - } - }, - "& .mdc-menu-surface": { - overflow: "visible" - } -}); - -const ColorList = styled("div")({ - display: "flex" -}); - -const ColorPreview = styled("div")({ - boxSizing: "border-box", - display: "flex", - justifyContent: "center", - alignItems: "center", - padding: 4, - border: `1px solid ${COLORS.gray}`, - backgroundColor: COLORS.lightGray, - - ".color": { - width: 20, - height: 20, - cursor: "pointer" - }, - - "& .not-selected": { - width: 20, - height: 20 - } -}); - -const ColorBox = styled("div")({ - cursor: "pointer", - width: 50, - height: 40, - margin: 10, - padding: 5, - borderRadius: 2, - boxSizing: "border-box", - transition: "transform 0.2s", - color: "var(--mdc-theme-text-secondary-on-background)" -}); +const ColorBox = ({ children, className, ...props }: React.HTMLProps) => { + return ( +
+ {children} +
+ ); +}; -const Color = styled("div")({ - cursor: "pointer", - width: 40, - height: 30, - border: "1px solid var(--mdc-theme-on-background)", - transition: "transform 0.2s, scale 0.2s", - display: "flex", - alignItems: "center", - "&::after": { - boxShadow: "0 0.25rem 0.125rem 0 rgba(0,0,0,0.05)", - transition: "opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1)", - content: '""', - position: "absolute", - top: 0, - left: 0, - width: "100%", - height: "100%", - zIndex: -1, - opacity: 0 - }, - "&:hover": { - transform: "scale(1.25)", - "&::after": { - opacity: 1 - } - } -}); +const Color = ({ children, className, ...props }: React.HTMLProps) => { + return ( +
+ {children} +
+ ); +}; -const transparent = css({ +const TransparentColor = styled(Color)({ backgroundSize: "10px 10px", backgroundImage: "linear-gradient( 45deg, #555 25%, transparent 25%, transparent)," + @@ -128,45 +52,22 @@ const chromePickerStyles = css({ } }); -const iconPaletteStyle = css({ - height: 20, - width: "100%", - marginTop: 1, - color: "var(--mdc-theme-secondary)" -}); - -const styles = { - selectedColor: css({ - boxShadow: "0px 0px 0px 2px var(--mdc-theme-secondary)" - }), - button: css({ - backgroundColor: COLORS.lightGray, - borderRadius: 1, - border: `1px solid ${COLORS.gray}`, - cursor: "pointer", - height: 30, - boxSizing: "border-box", - "&:hover:not(:disabled)": { borderColor: COLORS.darkGray, backgroundColor: COLORS.gray }, - "&:focus:not(:disabled)": { - borderColor: COLORS.darkGray, - outline: "none", - backgroundColor: COLORS.gray - }, - "&:disabled": { - opacity: 0.5, - cursor: "not-allowed", - borderColor: COLORS.lightGray - }, - "& svg": { - width: 16, - height: 16 - } - }), - color: css({ - width: "40px", - height: "100%", - borderRadius: "2px" - }) +const ColorPickerMenuLabel = ({ + children, + className, + ...props +}: React.HTMLProps) => { + return ( +
+ {children} +
+ ); }; interface ColorPickerProps { @@ -178,7 +79,7 @@ interface ColorPickerProps { } const ColorPicker = ({ value, onChange, onChangeComplete, compact = false }: ColorPickerProps) => { - const [showPicker, setShowPicker] = useState(false); + const [showPicker, setShowPicker] = useState(true); const getColorValue = useCallback((rgb: RGBColor) => { return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${rgb.a})`; @@ -202,13 +103,9 @@ const ColorPicker = ({ value, onChange, onChangeComplete, compact = false }: Col setShowPicker(false); }, [setShowPicker]); - const togglePicker = useCallback( - (e: React.MouseEvent) => { - e.stopPropagation(); - setShowPicker(!showPicker); - }, - [showPicker, setShowPicker] - ); + const togglePicker = useCallback(() => { + setShowPicker(prev => !prev); + }, [setShowPicker]); const pageElements = usePageElements(); @@ -226,53 +123,50 @@ const ColorPicker = ({ value, onChange, onChangeComplete, compact = false }: Col // Either a custom color or a color coming from the theme object. const actualSelectedColor = themeColors[value] || value || "#fff"; - let themeColor = false; const colorPicker = ( - - {Object.keys(themeColors).map((key, index) => { - const color = themeColors[key]; - if (color === value || value === "transparent") { - themeColor = true; - } - - return ( - - { - hidePicker(); - - // With page elements implementation, we want to store the color key and - // then the actual color will be retrieved from the theme object. - onChangeComplete(key); - }} - /> - - ); - })} +
+ Theme Colors +
+ {Object.keys(themeColors).map((key, index) => { + const color = themeColors[key]; + if (color === value || value === "transparent") { + // themeColor = true; + } - - { - hidePicker(); - onChangeComplete("transparent"); - }} + return ( + + { + hidePicker(); + + // With page elements implementation, we want to store the color key and + // then the actual color will be retrieved from the theme object. + onChangeComplete(key); + }} + /> + + ); + })} + + { + hidePicker(); + onChangeComplete("transparent"); + }} + /> + +
+ + + Custom Color + - + - - - - - {showPicker && ( e.stopPropagation()} className={chromePickerStyles}> )} - +
); if (compact) { return ( - +
- - - } + handle={} > - - {React.cloneElement(colorPicker, { style: { width: 240 } })} - +
{colorPicker}
- - {value ? ( -
); } diff --git a/packages/app-page-builder/src/editor/components/Editor/Editor.tsx b/packages/app-page-builder/src/editor/components/Editor/Editor.tsx index 4b33feb7d22..b31cf0312dd 100644 --- a/packages/app-page-builder/src/editor/components/Editor/Editor.tsx +++ b/packages/app-page-builder/src/editor/components/Editor/Editor.tsx @@ -74,6 +74,7 @@ export const Editor = () => { }, []); const classes = { + "wby-bg-neutral-dimmed": true, "pb-editor": true, "pb-editor-dragging": isDragging, "pb-editor-resizing": isResizing diff --git a/packages/app-page-builder/src/editor/config/Content/Layout.tsx b/packages/app-page-builder/src/editor/config/Content/Layout.tsx index 21d25d0725c..1a41b66e42e 100644 --- a/packages/app-page-builder/src/editor/config/Content/Layout.tsx +++ b/packages/app-page-builder/src/editor/config/Content/Layout.tsx @@ -1,26 +1,21 @@ import React from "react"; -import { css } from "emotion"; -import { Elevation } from "@webiny/ui/Elevation"; +import { cn } from "@webiny/admin-ui"; export interface LayoutProps { className?: string; children: React.ReactNode; } -const contentContainerWrapper = css` - margin: 95px 65px 50px 85px; - padding: 0; - position: absolute; - width: calc(100vw - 415px); - top: 0; - box-sizing: border-box; - z-index: 1; -`; - -export const Layout = ({ className = contentContainerWrapper, children }: LayoutProps) => { +export const Layout = ({ className, children }: LayoutProps) => { return ( - +
{children} - +
); }; diff --git a/packages/app-page-builder/src/editor/config/Sidebar/Layout.tsx b/packages/app-page-builder/src/editor/config/Sidebar/Layout.tsx index 4a1f3b68002..b8226a0dc31 100644 --- a/packages/app-page-builder/src/editor/config/Sidebar/Layout.tsx +++ b/packages/app-page-builder/src/editor/config/Sidebar/Layout.tsx @@ -1,37 +1,29 @@ import React from "react"; -import { css } from "emotion"; import { makeDecoratable } from "@webiny/app-admin"; -import { Elevation } from "@webiny/ui/Elevation"; import { Tabs } from "@webiny/ui/Tabs"; import { Sidebar } from "./Sidebar"; import { SidebarHighlight } from "./SidebarHighlight"; - -const rightSideBar = css({ - boxShadow: "1px 0px 5px 0px rgba(128,128,128,1)", - position: "fixed", - right: 0, - top: 65, - height: "100%", - width: 300, - zIndex: 1 -}); +import { cn } from "@webiny/admin-ui"; export interface LayoutProps { className?: string; } -export const Layout = makeDecoratable( - "SidebarLayout", - ({ className = rightSideBar }: LayoutProps) => { - const { activeGroup, setActiveGroup } = Sidebar.useActiveGroup(); +export const Layout = makeDecoratable("SidebarLayout", ({ className }: LayoutProps) => { + const { activeGroup, setActiveGroup } = Sidebar.useActiveGroup(); - return ( - - - - - - - ); - } -); + return ( +
+ + + + +
+ ); +}); diff --git a/packages/app-page-builder/src/editor/config/Toolbar/Layout.tsx b/packages/app-page-builder/src/editor/config/Toolbar/Layout.tsx index 2e5567d82e2..ad38ba068d9 100644 --- a/packages/app-page-builder/src/editor/config/Toolbar/Layout.tsx +++ b/packages/app-page-builder/src/editor/config/Toolbar/Layout.tsx @@ -12,18 +12,6 @@ const ToolbarDrawerContainer = styled("div")({ zIndex: 2 }); -const ToolbarContainer = styled("div")({ - position: "fixed", - display: "inline-block", - padding: "2px 1px 2px 3px", - width: 50, - top: 64, - height: "calc(100vh - 68px)", - backgroundColor: "var(--mdc-theme-surface)", - boxShadow: "1px 0px 5px 0px var(--mdc-theme-on-background)", - zIndex: 3 -}); - const ToolbarActions = styled("div")({ position: "relative", display: "flex", @@ -44,16 +32,21 @@ export const Layout = () => { ))} - +
-
+
-
+
- +
); }; diff --git a/packages/app-page-builder/src/editor/config/TopBar/Divider.tsx b/packages/app-page-builder/src/editor/config/TopBar/Divider.tsx index 9174fffa7d7..f565d974dff 100644 --- a/packages/app-page-builder/src/editor/config/TopBar/Divider.tsx +++ b/packages/app-page-builder/src/editor/config/TopBar/Divider.tsx @@ -1,15 +1,7 @@ import React from "react"; -import styled from "@emotion/styled"; import { makeDecoratable } from "@webiny/app-admin"; - -const StyledDivider = styled.div` - width: 1px; - margin: 0 5px; - height: 100%; - flex: none; - background-color: var(--mdc-theme-on-background); -`; +import { Separator } from "@webiny/admin-ui"; export const Divider = makeDecoratable("TopBarDivider", () => { - return ; + return ; }); diff --git a/packages/app-page-builder/src/editor/config/TopBar/Layout.tsx b/packages/app-page-builder/src/editor/config/TopBar/Layout.tsx index 5c9ec2e88c2..f14c8250efa 100644 --- a/packages/app-page-builder/src/editor/config/TopBar/Layout.tsx +++ b/packages/app-page-builder/src/editor/config/TopBar/Layout.tsx @@ -1,48 +1,20 @@ import React from "react"; -import { css } from "emotion"; import { makeDecoratable } from "@webiny/app-admin"; -import { TopAppBar, TopAppBarSection } from "@webiny/ui/TopAppBar"; +import {cn, HeaderBar} from "@webiny/admin-ui"; import { TopBar } from "./TopBar"; -const topBar = css` - box-shadow: 1px 0px 5px 0px rgba(128, 128, 128, 1); - height: 64px; - display: flex; - > * { - flex: 1; - } -`; - -const centerTopBar = css` - &.mdc-top-app-bar__section { - padding-top: 0; - padding-bottom: 0; - } -`; - -const oneThird = { width: "33%" }; - export interface TopBarLayoutProps { - fixed?: boolean; className?: string; } -export const Layout = makeDecoratable("TopBarLayout", (props: TopBarLayoutProps) => { +export const Layout = makeDecoratable("TopBarLayout", ({className}: TopBarLayoutProps) => { return ( - - - - - - - - - - - + start={} + middle={} + end={} + /> ); }); diff --git a/packages/app-page-builder/src/editor/defaultConfig/Content/Background/Background.tsx b/packages/app-page-builder/src/editor/defaultConfig/Content/Background/Background.tsx index 65dff05dc85..720514ab392 100644 --- a/packages/app-page-builder/src/editor/defaultConfig/Content/Background/Background.tsx +++ b/packages/app-page-builder/src/editor/defaultConfig/Content/Background/Background.tsx @@ -1,15 +1,6 @@ import React, { useCallback } from "react"; -import { css } from "emotion"; import { useActiveElement } from "~/editor/hooks/useActiveElement"; -const backgroundStyle = css` - position: fixed; - top: 0; - left: 0; - width: 100%; - min-height: 100%; -`; - export const Background = () => { const [activeElement, setActiveElement] = useActiveElement(); @@ -20,5 +11,10 @@ export const Background = () => { setActiveElement(null); }, [activeElement]); - return
; + return ( +
+ ); }; diff --git a/packages/app-page-builder/src/editor/defaultConfig/TopBar/DisplayModeSelector/DisplayModeSelector.tsx b/packages/app-page-builder/src/editor/defaultConfig/TopBar/DisplayModeSelector/DisplayModeSelector.tsx index f527179d8cf..d59cacd516c 100644 --- a/packages/app-page-builder/src/editor/defaultConfig/TopBar/DisplayModeSelector/DisplayModeSelector.tsx +++ b/packages/app-page-builder/src/editor/defaultConfig/TopBar/DisplayModeSelector/DisplayModeSelector.tsx @@ -1,85 +1,10 @@ import React, { useMemo } from "react"; -import { css } from "emotion"; import classNames from "classnames"; import { IconButton } from "@webiny/ui/Button"; -import { Tooltip } from "@webiny/ui/Tooltip"; -import { Typography } from "@webiny/ui/Typography"; +import { Heading, Tooltip, Icon } from "@webiny/admin-ui"; import { DisplayMode } from "~/types"; import { useDisplayMode } from "~/editor"; -const classes = { - wrapper: css({ - height: "100%", - display: "flex", - justifyContent: "center", - alignItems: "center", - - "& .action-wrapper": { - height: "100%", - display: "flex", - justifyContent: "center", - alignItems: "center", - borderRight: "1px solid var(--mdc-theme-background)", - "&:first-child": { - borderLeft: "1px solid var(--mdc-theme-background)" - }, - "&.active": { - backgroundColor: "var(--mdc-theme-background)", - "& .mdc-icon-button": { - color: "var(--mdc-theme-text-primary-on-background)" - } - } - } - }), - dimensionIndicator: css({ - height: "100%", - display: "flex", - alignItems: "center", - padding: "0px 16px", - borderRight: "1px solid var(--mdc-theme-background)", - - "& span": { - color: "var(--mdc-theme-text-primary-on-background)" - }, - "& .width": { - marginRight: 8, - "& span:last-child": { - marginLeft: 4 - } - }, - "& .height": { - "& span:last-child": { - marginLeft: 4 - } - } - }), - tooltip: css({ - textAlign: "left", - textTransform: "initial", - "& .tooltip__title": { - "& span": { - fontWeight: 900 - } - }, - "& .tooltip__info": { - display: "flex", - "& span": { - fontWeight: 600 - }, - "& svg": { - fill: "var(--mdc-theme-surface)", - marginRight: 4 - } - }, - "& .tooltip__body": { - marginTop: 4, - "& span": { - fontWeight: 600 - } - } - }) -}; - export const DisplayModeSelector = () => { const { displayMode, displayModes, setDisplayMode } = useDisplayMode(); @@ -88,30 +13,38 @@ export const DisplayModeSelector = () => { return ( setDisplayMode(mode as DisplayMode)} + /> + } content={ -
-
- {tooltip.title} -
-
- {tooltip.subTitleIcon} - {tooltip.subTitle} -
-
- {tooltip.body} +
+ {tooltip.title} +
+ {tooltip.subTitleIcon && ( + + )} + + {tooltip.subTitle}
+ {tooltip.body}
} - placement={"bottom"} + side={"bottom"} className={classNames("action-wrapper", { active: mode === displayMode })} - > - setDisplayMode(mode as DisplayMode)} /> - + /> ); }); }, [setDisplayMode, displayMode]); - return
{responsiveBarContent}
; + return
{responsiveBarContent}
; }; diff --git a/packages/app-page-builder/src/editor/defaultConfig/TopBar/DropdownActions/PageOptionsDropdown.tsx b/packages/app-page-builder/src/editor/defaultConfig/TopBar/DropdownActions/PageOptionsDropdown.tsx index 41c0ed1a21f..cb8beec5554 100644 --- a/packages/app-page-builder/src/editor/defaultConfig/TopBar/DropdownActions/PageOptionsDropdown.tsx +++ b/packages/app-page-builder/src/editor/defaultConfig/TopBar/DropdownActions/PageOptionsDropdown.tsx @@ -1,18 +1,10 @@ -import React, { Fragment } from "react"; -import { css } from "emotion"; +import React from "react"; import { Menu } from "@webiny/ui/Menu"; import { IconButton } from "@webiny/ui/Button"; import { ReactComponent as MoreVerticalIcon } from "@webiny/icons/more_vert.svg"; import { TopBar } from "~/editor/config/TopBar/TopBar"; import { useEditorConfig } from "~/editor/config"; -const menuStyles = css` - .disabled { - opacity: 0.5; - pointer-events: none; - } -`; - export const PageOptionsDropdown = () => { const { elements } = useEditorConfig(); const dropdownActions = elements.filter( @@ -26,11 +18,9 @@ export const PageOptionsDropdown = () => { return ( } />} > {/* We need to have more than 1 element in the children to force the Menu to render as a regular Menu. */} - ); diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/align/HorizontalAlignFlexSettings.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/align/HorizontalAlignFlexSettings.tsx index ccdfe17dde9..4fbd93ee963 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/align/HorizontalAlignFlexSettings.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/align/HorizontalAlignFlexSettings.tsx @@ -83,7 +83,7 @@ const HorizontalAlignFlexSettings = ({ defaultValue={defaultAccordionValue} icon={ - {config.icon} + } > diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/align/VerticalAlignSettings.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/align/VerticalAlignSettings.tsx index 5c5af32c43e..cae90690112 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/align/VerticalAlignSettings.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/align/VerticalAlignSettings.tsx @@ -82,7 +82,7 @@ const VerticalAlignSettings = ({ defaultValue={defaultAccordionValue} icon={ - {config.icon} + } > diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/background/BackgroundSettings.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/background/BackgroundSettings.tsx index 545521a4bbb..ecc5d6c7cf6 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/background/BackgroundSettings.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/background/BackgroundSettings.tsx @@ -6,7 +6,6 @@ import set from "lodash/set"; import merge from "lodash/merge"; import { Tooltip } from "@webiny/ui/Tooltip"; import { plugins } from "@webiny/plugins"; -import { Cell, Grid } from "@webiny/ui/Grid"; import SingleImageUpload from "@webiny/app-admin/components/SingleImageUpload"; import { FileManagerFileItem } from "@webiny/app-admin"; import { @@ -49,6 +48,7 @@ interface SettingsPropsType extends PbEditorPageElementSettingsRenderComponentPr [key: string]: any; }; } + const BackgroundSettings = ({ options, defaultAccordionValue }: SettingsPropsType) => { const { displayMode } = useDisplayMode(); const [element] = useActiveElement(); @@ -120,23 +120,21 @@ const BackgroundSettings = ({ options, defaultAccordionValue }: SettingsPropsTyp defaultValue={defaultAccordionValue} icon={ - {activeDisplayModeConfig.icon} + } > - - - - - + + + + {options.image !== false && ( - + <> - + )} diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/border/BorderSettings.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/border/BorderSettings.tsx index 23fccbcae93..a3ec9f2437f 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/border/BorderSettings.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/border/BorderSettings.tsx @@ -68,7 +68,7 @@ const BorderSettings = ({ defaultValue={defaultAccordionValue} icon={ - {config.icon} + } > diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/cell/VerticalAlignSettings.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/cell/VerticalAlignSettings.tsx index 9564b0fb84f..fbf8b97db06 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/cell/VerticalAlignSettings.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/cell/VerticalAlignSettings.tsx @@ -94,7 +94,7 @@ const VerticalAlignSettings = ({ defaultValue={defaultAccordionValue} icon={ - {config.icon} + } > diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/components/Accordion.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/components/Accordion.tsx index 4b92bae00ea..a5cf36e4eb4 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/components/Accordion.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/components/Accordion.tsx @@ -1,158 +1,41 @@ -import React, { ReactElement, useCallback, useState } from "react"; -import { css } from "emotion"; -import classNames from "classnames"; -import { COLORS } from "./StyledComponents"; -import { Typography } from "@webiny/ui/Typography"; - -const classes = { - accordionWrapper: css({ - /** - * We're using position: "relative" here for "Popping Out of Hidden Overflow" https://css-tricks.com/popping-hidden-overflow/ - * so that, we can use absolute positioned element inside without "overflow: hidden" being a problem - */ - position: "relative", - width: "100%", - borderBottom: `1px solid ${COLORS.gray}` - }), - accordionHeader: css({ - position: "relative", - color: "var(--mdc-theme-text-secondary-on-background)", - cursor: "pointer", - padding: "12px 16px", - - display: "flex", - alignItems: "center", - justifyContent: "space-between", - - "& .accordion-header--left": { - display: "flex", - alignItems: "center", - justifyContent: "space-between", - paddingLeft: "16px", - "& .accordion-title": { - span: { - marginLeft: 16 - } - } - }, - "& .accordion-header--right": { - display: "flex", - "& .action-container": { - display: "none", - marginRight: 8 - }, - "& .icon-container": { - display: "flex", - alignItems: "center", - - "& span": { - display: "flex" - }, - "& svg": { - fill: "currentColor", - width: 14, - height: 14 - } - } - }, - - "&::before": { - position: "absolute", - top: 20, - left: 16, - content: '""', - width: 0, - height: 0, - - // Arrow right. - borderTop: "5px solid transparent", - borderBottom: "5px solid transparent", - borderLeft: "5px solid currentColor" - }, - - "&.open": { - color: COLORS.black, - backgroundColor: "hsla(0,0%,97%,1)", - - "&::before": { - transform: "translateY(3px) rotate(90deg)" - }, - - "& .action-container": { - display: "block" - } - } - }), - accordionItem: css({ - overflow: "hidden", - height: "auto", - maxHeight: "9999px", - transition: "max-height 0.3s cubic-bezier(1, 0, 1, 1)", - - "&.collapsed": { - maxHeight: 0, - transition: "max-height 0.35s cubic-bezier(0, 1, 0, 1)" - }, - - "&.open": { - animation: "delay-overflow 10ms 400ms forwards" - }, - - "& .accordion-content": { - padding: "16px 12px 24px" - }, - - "@keyframes delay-overflow": { - to: { overflow: "visible" } - } - }) -}; +import React, { ReactElement } from "react"; +import { Accordion as AdminUiAccordion, IconProps } from "@webiny/admin-ui"; export interface AccordionProps { title: string; children: ReactElement; action?: ReactElement; icon?: ReactElement; - defaultValue?: boolean; className?: string; + defaultValue?: boolean; } -const Accordion = ({ - title, - children, - action, - icon, - defaultValue = false, - className -}: AccordionProps) => { - const [isOpen, setOpen] = useState(defaultValue); - const toggleOpen = useCallback(() => setOpen(!isOpen), [isOpen]); - - return ( -
-
-
-
- - {title} - -
-
-
-
{action}
-
{icon}
-
-
-
-
{children}
-
-
- ); +const AccordionBase = React.memo( + ({ title, children, action, icon, className, defaultValue }: AccordionProps) => { + return ( + + + {children} + + + ); + } +); + +AccordionBase.displayName = "Accordion"; + +const AccordionIcon = (props: IconProps) => { + return ; }; -export default React.memo(Accordion); +const Accordion = Object.assign(AccordionBase, { + Icon: AccordionIcon +}); + +export default Accordion; diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/components/ColorPicker.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/components/ColorPicker.tsx index 91af9100f3b..61b275d5e18 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/components/ColorPicker.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/components/ColorPicker.tsx @@ -23,7 +23,7 @@ const extrapolateActiveElementValue = ( }; interface ColorPickerProps { - label: string; + label?: string; value?: string; valueKey?: string; defaultValue?: string; @@ -63,6 +63,7 @@ const ColorPicker = ({ export default React.memo(ColorPicker); type BaseColorPickerComponent = Omit; + export const BaseColorPickerComponent = ({ value, valueKey, diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/components/InputField.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/components/InputField.tsx index d5b78f56415..884b67d5ae2 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/components/InputField.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/components/InputField.tsx @@ -1,55 +1,9 @@ import React, { useState, useEffect, useCallback } from "react"; -import { css } from "emotion"; -import classNames from "classnames"; import omit from "lodash/omit"; -import { Typography } from "@webiny/ui/Typography"; -import { FormElementMessage } from "@webiny/ui/FormElementMessage"; -import { COLORS } from "./StyledComponents"; import { Validation } from "@webiny/form"; import debounce from "lodash/debounce"; import { useIsMounted } from "@webiny/app-admin"; - -const inputStyle = css({ - boxSizing: "border-box", - border: "1px solid var(--mdc-theme-on-background)", - width: "100%", - padding: "4px 8px", - textAlign: "left", - minHeight: 32, - backgroundColor: COLORS.lightGray, - "&:focus:not(:disabled)": { - backgroundColor: COLORS.gray - }, - "&:hover:not(:disabled)": { - backgroundColor: COLORS.gray - }, - "&:disabled": { - opacity: 0.5, - cursor: "not-allowed" - }, - - "&.text-center": { - textAlign: "center", - padding: 4 - }, - - "&::-webkit-inner-spin-button": { - WebkitAppearance: "none", - margin: 0 - }, - "&::-webkit-outer-spin-button": { - WebkitAppearance: "none", - margin: 0 - } -}); - -const labelStyle = css({ - marginBottom: 8, - padding: "0px 8px", - "& span": { - color: "var(--mdc-theme-text-primary-on-background)" - } -}); +import { Input as AdminUiInput } from "@webiny/admin-ui"; interface GetValueCallableParams { value: string | number; @@ -82,7 +36,6 @@ interface InputBoxProps { } const InputField = ({ - className, value, onChange, label, @@ -123,35 +76,23 @@ const InputField = ({ }, [localValue, value]); return ( - - {label && ( -
- {label} -
- )} - { - if (!onChange) { - return; - } - onChange(value); - setLocalValue(value); - }} - {...omit(props, "validate")} - /> - {validation.isValid === false && ( - {validation.message} - )} - {validation.isValid !== false && description && ( - {description} - )} -
+ { + if (!onChange) { + return; + } + onChange(value); + setLocalValue(value); + }} + {...omit(props, "validate")} + /> ); }; diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/components/MarginPaddingSettings.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/components/MarginPaddingSettings.tsx index cd04e59927a..3253623b71e 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/components/MarginPaddingSettings.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/components/MarginPaddingSettings.tsx @@ -279,7 +279,7 @@ const MarginPaddingSettings = ({ } icon={ - {activeEditorModeConfig.icon} + } > diff --git a/packages/app-page-builder/src/editor/plugins/elementSettings/components/SelectField.tsx b/packages/app-page-builder/src/editor/plugins/elementSettings/components/SelectField.tsx index 89a91b3bd6b..3944bb6eb33 100644 --- a/packages/app-page-builder/src/editor/plugins/elementSettings/components/SelectField.tsx +++ b/packages/app-page-builder/src/editor/plugins/elementSettings/components/SelectField.tsx @@ -1,91 +1,30 @@ import React from "react"; -import { css } from "emotion"; -import classNames from "classnames"; import omit from "lodash/omit"; -import { FormElementMessage } from "@webiny/ui/FormElementMessage"; -import { COLORS } from "./StyledComponents"; +import { Select } from "@webiny/admin-ui"; -const selectStyle = css({ - display: "block", - color: COLORS.darkestGray, - padding: ".6em 1.4em .5em .8em", - width: "100%", - maxWidth: "100%", - boxSizing: "border-box", - margin: "0", - border: `1px solid ${COLORS.gray}`, - borderRadius: 1, - MozAppearance: "none", - WebkitAppearance: "none", - appearance: "none", - backgroundColor: COLORS.lightGray, - backgroundImage: `url("data:image/svg+xml;utf8,")`, - backgroundRepeat: "no-repeat, repeat", - backgroundPosition: "right .7em top 50%, 0 0", - backgroundSize: "24px auto, 100%", - - "&::-ms-expand": { display: "none" }, - "&:hover:not(:disabled)": { borderColor: COLORS.darkGray, backgroundColor: COLORS.gray }, - "&:focus:not(:disabled)": { - borderColor: COLORS.darkGray, - outline: "none", - backgroundColor: COLORS.gray - }, - "&:disabled": { - opacity: 0.5, - cursor: "not-allowed", - borderColor: COLORS.lightGray - }, - "& option": { fontWeight: "normal" } -}); - -interface SelectProps { - value?: string; - onChange?: (value: string) => void; - // One or more elements. - children?: Array | React.ReactElement<"optgroup">>; - className?: string; - [key: string]: any; -} +type SelectProps = React.ComponentProps; const SelectField = ({ value = "", onChange, - children, - className, validation = { isValid: true }, description, placeholder = "", ...props }: SelectProps) => { return ( - - - {validation.isValid === false && ( - {validation.message} - )} - - {validation.isValid !== false && description && ( - {description} - )} - + - +
) : ( - - - - {`(status: ${pageLocked ? "published" : "draft"})`} - - -
- Rename} - > - +
+ {title} - - - {`(v${pageVersion})`} -
- + + } + /> +
(v{pageVersion})
+
); }; diff --git a/packages/app-page-builder/src/templateEditor/config/Content/BlocksBrowser/AddBlock.tsx b/packages/app-page-builder/src/templateEditor/config/Content/BlocksBrowser/AddBlock.tsx index 90dadd52692..e1ca02c996c 100644 --- a/packages/app-page-builder/src/templateEditor/config/Content/BlocksBrowser/AddBlock.tsx +++ b/packages/app-page-builder/src/templateEditor/config/Content/BlocksBrowser/AddBlock.tsx @@ -1,23 +1,17 @@ import React from "react"; -import styled from "@emotion/styled"; -import { ButtonFloating } from "@webiny/ui/Button"; +import { Button } from "@webiny/admin-ui"; import { ReactComponent as AddIcon } from "@webiny/icons/add.svg"; import { useBlocksBrowser } from "./useBlocksBrowser"; -const SIDEBAR_WIDTH = 300; -const BottomRight = styled("div")({ - position: "fixed", - zIndex: 101, - bottom: 20, - right: 20 + SIDEBAR_WIDTH -}); - export const AddBlock = () => { const { openBrowser } = useBlocksBrowser(); return ( - - } /> - +