diff --git a/editor/src/components/inspector/add-remove-layout-system-control.tsx b/editor/src/components/inspector/add-remove-layout-system-control.tsx index 26499eb80cef..46e6e30cf679 100644 --- a/editor/src/components/inspector/add-remove-layout-system-control.tsx +++ b/editor/src/components/inspector/add-remove-layout-system-control.tsx @@ -15,10 +15,14 @@ import { executeFirstApplicableStrategy } from './inspector-strategies/inspector import { useDispatch } from '../editor/store/dispatch-context' import { NO_OP, assertNever } from '../../core/shared/utils' import type { DropdownMenuItem } from '../../uuiui/radix-components' -import { DropdownMenu, regularDropdownMenuItem } from '../../uuiui/radix-components' +import { + DropdownMenu, + regularDropdownMenuItem, + separatorDropdownMenuItem, +} from '../../uuiui/radix-components' import { stripNulls } from '../../core/shared/array-utils' import { layoutSystemSelector } from './flex-section' -import { optionalMap } from '../../core/shared/optional-utils' +import { AdvancedGridModal } from './controls/advanced-grid-modal' export const AddRemoveLayoutSystemControlTestId = (): string => 'AddRemoveLayoutSystemControlTestId' export const AddFlexLayoutOptionId = 'add-flex-layout' @@ -28,6 +32,14 @@ export const RemoveLayoutSystemOptionId = 'remove-layout-system' interface AddRemoveLayoutSystemControlProps {} export const AddRemoveLayoutSystemControl = React.memo(() => { + const [popupOpen, setPopupOpen] = React.useState(false) + const closePopup = React.useCallback(() => { + setPopupOpen(false) + }, []) + const openPopup = React.useCallback(() => { + setPopupOpen(true) + }, []) + const layoutSystem = useEditorState( Substores.metadata, layoutSystemSelector, @@ -96,32 +108,59 @@ export const AddRemoveLayoutSystemControl = React.memo - stripNulls([ - regularDropdownMenuItem({ - id: AddFlexLayoutOptionId, - label: 'Convert to Flex', - onSelect: addFlexLayoutSystem, - }), - regularDropdownMenuItem({ - id: AddGridLayoutOptionId, - label: 'Convert to Grid', - onSelect: addGridLayoutSystem, - }), - optionalMap( - () => - regularDropdownMenuItem({ - id: RemoveLayoutSystemOptionId, - label: 'Remove layout system', - onSelect: removeLayoutSystem, - danger: true, - }), - layoutSystem, - ), - ]), - [addFlexLayoutSystem, addGridLayoutSystem, layoutSystem, removeLayoutSystem], - ) + const addLayoutSystemMenuDropdownItems = React.useMemo((): DropdownMenuItem[] => { + const gridItems: DropdownMenuItem[] = [ + regularDropdownMenuItem({ + id: 'more-settings', + label: 'Advanced', + onSelect: openPopup, + }), + regularDropdownMenuItem({ + id: AddFlexLayoutOptionId, + label: 'Convert to Flex', + onSelect: addFlexLayoutSystem, + }), + separatorDropdownMenuItem('dropdown-separator'), + regularDropdownMenuItem({ + id: RemoveLayoutSystemOptionId, + label: 'Remove Grid', + onSelect: removeLayoutSystem, + danger: true, + }), + ] + + const flexItems: DropdownMenuItem[] = [ + regularDropdownMenuItem({ + id: AddGridLayoutOptionId, + label: 'Convert to Grid', + onSelect: addGridLayoutSystem, + }), + separatorDropdownMenuItem('dropdown-separator'), + regularDropdownMenuItem({ + id: RemoveLayoutSystemOptionId, + label: 'Remove Flex', + onSelect: removeLayoutSystem, + danger: true, + }), + ] + + const noLayoutItems: DropdownMenuItem[] = [ + regularDropdownMenuItem({ + id: AddFlexLayoutOptionId, + label: 'Flex', + onSelect: addFlexLayoutSystem, + }), + regularDropdownMenuItem({ + id: AddGridLayoutOptionId, + label: 'Grid', + onSelect: addGridLayoutSystem, + }), + ] + + return stripNulls( + layoutSystem === 'grid' ? gridItems : layoutSystem === 'flex' ? flexItems : noLayoutItems, + ) + }, [addFlexLayoutSystem, addGridLayoutSystem, layoutSystem, removeLayoutSystem, openPopup]) const label = () => { switch (layoutSystem) { @@ -156,6 +195,13 @@ export const AddRemoveLayoutSystemControl = React.memo {label()} +
void + closePopup?: () => void + style?: React.CSSProperties + pickerOffset?: { + x: number + y: number + } +} + +export const AdvancedGridModal = React.memo((props: AdvancedGridModalProps) => { + const pickerOffset = props.pickerOffset != null ? props.pickerOffset : { x: -280, y: -20 } + const closePopup = props.closePopup ?? (() => {}) + + const picker = ( + + + + Grid Settings + + × + + + + Items + + + Align + + + Justify + + + Entire Grid + + + Align + + + Justify + + + + ) + + return ( +
+ {props.popupOpen ? picker : null} +
+ ) +}) diff --git a/editor/src/uuiui/styles/theme/utopia-theme.ts b/editor/src/uuiui/styles/theme/utopia-theme.ts index 69b700155941..e89bafd1aad6 100644 --- a/editor/src/uuiui/styles/theme/utopia-theme.ts +++ b/editor/src/uuiui/styles/theme/utopia-theme.ts @@ -162,8 +162,7 @@ const fontStyles = { const popup: React.CSSProperties = { background: colorTheme.neutralBackground.value, boxShadow: shadowStyles.high.boxShadow, - paddingTop: 4, - paddingBottom: 4, + padding: '4px 0', borderRadius: 4, }