diff --git a/packages/admin-ui/src/FillViewport/FillViewport.tsx b/packages/admin-ui/src/FillViewport/FillViewport.tsx new file mode 100644 index 00000000000..68952f4d2c0 --- /dev/null +++ b/packages/admin-ui/src/FillViewport/FillViewport.tsx @@ -0,0 +1,96 @@ +import React, { useEffect, useRef, useState } from "react"; +import { makeDecoratable } from "~/utils.js"; + +interface FillViewportStyle { + width?: number; + height?: number; +} + +function useFillViewportStyle(axis: "width" | "height" | "both") { + const ref = useRef(null); + const [style, setStyle] = useState(); + + useEffect(() => { + const el = ref.current; + if (!el) { + return; + } + + const measure = () => { + const rect = el.getBoundingClientRect(); + const next: FillViewportStyle = {}; + + if (axis === "width" || axis === "both") { + next.width = window.innerWidth - rect.left; + } + + if (axis === "height" || axis === "both") { + next.height = window.innerHeight - rect.top; + } + + setStyle(next); + }; + + measure(); + + const ro = new ResizeObserver(measure); + ro.observe(document.documentElement); + + return () => ro.disconnect(); + }, []); + + return { ref, style }; +} + +type FillViewportProps = React.HTMLAttributes; + +const BaseFillViewportHeight = ({ children, style: userStyle, ...rest }: FillViewportProps) => { + const { ref, style } = useFillViewportStyle("height"); + + return ( +
+ {children} +
+ ); +}; + +const BaseFillViewportWidth = ({ children, style: userStyle, ...rest }: FillViewportProps) => { + const { ref, style } = useFillViewportStyle("width"); + + return ( +
+ {children} +
+ ); +}; + +const BaseFillViewport = ({ children, style: userStyle, ...rest }: FillViewportProps) => { + const { ref, style } = useFillViewportStyle("both"); + + return ( +
+ {children} +
+ ); +}; + +const FillViewportHeight = makeDecoratable("FillViewportHeight", BaseFillViewportHeight); +const FillViewportWidth = makeDecoratable("FillViewportWidth", BaseFillViewportWidth); +const FillViewport = makeDecoratable("FillViewport", BaseFillViewport); + +export { FillViewportHeight, FillViewportWidth, FillViewport }; diff --git a/packages/admin-ui/src/FillViewport/index.ts b/packages/admin-ui/src/FillViewport/index.ts new file mode 100644 index 00000000000..7ac23772d6f --- /dev/null +++ b/packages/admin-ui/src/FillViewport/index.ts @@ -0,0 +1 @@ +export * from "./FillViewport.js"; diff --git a/packages/admin-ui/src/exports/admin/ui.ts b/packages/admin-ui/src/exports/admin/ui.ts index 662a21cb8ca..b6e2e02e9c9 100644 --- a/packages/admin-ui/src/exports/admin/ui.ts +++ b/packages/admin-ui/src/exports/admin/ui.ts @@ -77,6 +77,9 @@ export { DynamicFieldset } from "~/DynamicFieldset/index.js"; // FilePicker export { FilePicker } from "~/FilePicker/index.js"; +// FillViewport +export { FillViewportHeight, FillViewportWidth, FillViewport } from "~/FillViewport/index.js"; + // Grid export { Grid } from "~/Grid/index.js"; diff --git a/packages/admin-ui/src/index.ts b/packages/admin-ui/src/index.ts index fbef1395142..98f5dd11e3a 100644 --- a/packages/admin-ui/src/index.ts +++ b/packages/admin-ui/src/index.ts @@ -19,6 +19,7 @@ export * from "./Drawer/index.js"; export * from "./DropdownMenu/index.js"; export * from "./DynamicFieldset/index.js"; export * from "./FilePicker/index.js"; +export * from "./FillViewport/index.js"; export * from "./FormComponent/index.js"; export * from "./Grid/index.js"; export * from "./HeaderBar/index.js"; diff --git a/packages/app-website-builder/src/BaseEditor/defaultConfig/Toolbar/InsertElements/InsertElements.tsx b/packages/app-website-builder/src/BaseEditor/defaultConfig/Toolbar/InsertElements/InsertElements.tsx index 7da49f6332d..0ce75ebf8c3 100644 --- a/packages/app-website-builder/src/BaseEditor/defaultConfig/Toolbar/InsertElements/InsertElements.tsx +++ b/packages/app-website-builder/src/BaseEditor/defaultConfig/Toolbar/InsertElements/InsertElements.tsx @@ -1,5 +1,12 @@ import React, { useState } from "react"; -import { Icon, Text, ScrollArea, InputPrimitive, ToggleGroupPrimitive } from "@webiny/admin-ui"; +import { + Icon, + Text, + ScrollArea, + InputPrimitive, + ToggleGroupPrimitive, + FillViewportHeight +} from "@webiny/admin-ui"; import { ReactComponent as SearchIcon } from "@webiny/icons/search.svg"; import { ReactComponent as ListIcon } from "@webiny/icons/format_list_bulleted.svg"; import { ReactComponent as GridIcon } from "@webiny/icons/grid_view.svg"; @@ -22,8 +29,8 @@ export const InsertElements = () => { const isGrid = viewType === "grid"; return ( -
-
+
+
setSearch(value ?? "")} @@ -41,47 +48,49 @@ export const InsertElements = () => { size={"md"} />
- -
- {groups.map(group => { - const items = query - ? group.items.filter(item => - (item.label ?? item.name).toLowerCase().includes(query) - ) - : group.items; + + +
+ {groups.map(group => { + const items = query + ? group.items.filter(item => + (item.label ?? item.name).toLowerCase().includes(query) + ) + : group.items; - if (!items.length) { - return null; - } + if (!items.length) { + return null; + } - return ( -
-
- - ) : ( - - ) - } - label={group.label} - /> - - {group.label} - + return ( +
+
+ + ) : ( + + ) + } + label={group.label} + /> + + {group.label} + +
+ {isGrid ? ( + + ) : ( + + )}
- {isGrid ? ( - - ) : ( - - )} -
- ); - })} -
- + ); + })} +
+
+
); }; diff --git a/packages/webiny/package.json b/packages/webiny/package.json index 104531097b5..e78203a55d0 100644 --- a/packages/webiny/package.json +++ b/packages/webiny/package.json @@ -142,7 +142,7 @@ "./extensions": "./extensions.js", "./api/tenant-manager": "./api/tenant-manager.js" }, - "exportGenerationHash": "a0a5fceb63a2c96793e5f147a410845f94eb180a10e445ab662481de06435c90", + "exportGenerationHash": "a9e9428800c668172653eb3821a9ac0a0abab1a1f0ee06c19356f7c9b80b6818", "webiny": { "publishFrom": "dist" } diff --git a/packages/webiny/src/admin/ui.ts b/packages/webiny/src/admin/ui.ts index f4590e38b5c..947a4ba04d6 100644 --- a/packages/webiny/src/admin/ui.ts +++ b/packages/webiny/src/admin/ui.ts @@ -40,6 +40,11 @@ export { Drawer } from "@webiny/admin-ui/Drawer/index.js"; export { DropdownMenu } from "@webiny/admin-ui/DropdownMenu/index.js"; export { DynamicFieldset } from "@webiny/admin-ui/DynamicFieldset/index.js"; export { FilePicker } from "@webiny/admin-ui/FilePicker/index.js"; +export { + FillViewportHeight, + FillViewportWidth, + FillViewport +} from "@webiny/admin-ui/FillViewport/index.js"; export { Grid } from "@webiny/admin-ui/Grid/index.js"; export { HeaderBar } from "@webiny/admin-ui/HeaderBar/index.js"; export { Heading } from "@webiny/admin-ui/Heading/index.js";