diff --git a/apps/builder/app/builder/features/style-panel/shared/css-value-input/css-value-input.tsx b/apps/builder/app/builder/features/style-panel/shared/css-value-input/css-value-input.tsx index 34785afbe2..1a34223326 100644 --- a/apps/builder/app/builder/features/style-panel/shared/css-value-input/css-value-input.tsx +++ b/apps/builder/app/builder/features/style-panel/shared/css-value-input/css-value-input.tsx @@ -53,7 +53,11 @@ import { mergeRefs } from "@react-aria/utils"; import { composeEventHandlers } from "~/shared/event-utils"; import type { StyleValueSourceColor } from "~/shared/style-object-model"; import { ColorThumb } from "../color-thumb"; -import { cssButtonDisplay, ValueEditorDialog } from "./value-editor-dialog"; +import { + cssButtonDisplay, + isComplexValue, + ValueEditorDialog, +} from "./value-editor-dialog"; // We need to enable scrub on properties that can have numeric value. const canBeNumber = (property: StyleProperty, value: CssValueInputValue) => { @@ -822,20 +826,19 @@ export const CssValueInput = ({ ); const suffixRef = useRef(null); - const valueEditorButtonElement = - value.type === "unparsed" ? ( - { - onChangeComplete({ - type: "dialog-change-complete", - value, - close: false, - }); - }} - /> - ) : undefined; + const valueEditorButtonElement = isComplexValue(value) ? ( + { + onChangeComplete({ + type: "dialog-change-complete", + value, + close: false, + }); + }} + /> + ) : undefined; const invalidValueElement = value.type === "invalid" ? <> : undefined; const suffixElement = invalidValueElement ?? diff --git a/apps/builder/app/builder/features/style-panel/shared/css-value-input/value-editor-dialog.tsx b/apps/builder/app/builder/features/style-panel/shared/css-value-input/value-editor-dialog.tsx index 55c690db56..ebe5badc33 100644 --- a/apps/builder/app/builder/features/style-panel/shared/css-value-input/value-editor-dialog.tsx +++ b/apps/builder/app/builder/features/style-panel/shared/css-value-input/value-editor-dialog.tsx @@ -7,7 +7,10 @@ import { MaximizeIcon } from "@webstudio-is/icons"; import { useEffect, useRef, useState } from "react"; import { EditorDialog } from "~/builder/shared/code-editor-base"; import { CssFragmentEditorContent } from "../css-fragment"; -import type { IntermediateStyleValue } from "./css-value-input"; +import type { + CssValueInputValue, + IntermediateStyleValue, +} from "./css-value-input"; import { type InvalidValue, type StyleProperty, @@ -17,6 +20,25 @@ import { parseIntermediateOrInvalidValue } from "./parse-intermediate-or-invalid export const cssButtonDisplay = "--ws-css-value-input-maximize-button-display"; +// Hand-picking values that are considered complex and should get a maximize button for the dialog. +// Not showing the maximize everywhere because most values don't need that and it takes space. +export const isComplexValue = (value: CssValueInputValue) => { + if (value.type === "unparsed" || value.type === "function") { + return true; + } + + if (value.type === "tuple" || value.type === "layers") { + for (const nestedValue of value.value) { + const nestedValueIsComplex = isComplexValue(nestedValue); + if (nestedValueIsComplex) { + return true; + } + } + } + + return false; +}; + const width = parseFloat(rawTheme.sizes.sidebarWidth); export const ValueEditorDialog = ({