diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.tsx index 9e5677854d..0ad5276f90 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.tsx @@ -1,7 +1,8 @@ import { useField } from '@strapi/admin/strapi-admin'; -import { Box, Flex, Grid } from '@strapi/design-system'; +import { Box, Flex } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import { ResponsiveGridItem, ResponsiveGridRoot } from '../../FormLayout'; import { ComponentProvider, useComponent } from '../ComponentContext'; import type { ComponentInputProps } from './Input'; @@ -33,7 +34,7 @@ const NonRepeatableComponent = ({ {layout.map((row, index) => { return ( - + {row.map(({ size, ...field }) => { /** * Layouts are built from schemas so they don't understand the complete @@ -49,7 +50,7 @@ const NonRepeatableComponent = ({ }); return ( - {children({ ...field, label: translatedLabel, name: completeFieldName })} - + ); })} - + ); })} diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx index 3cef41f6c0..2f06889eec 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx @@ -9,7 +9,6 @@ import { Accordion, IconButton, useComposedRefs, - Grid, BoxComponent, } from '@strapi/design-system'; import { Plus, Drag, Trash } from '@strapi/icons'; @@ -26,6 +25,7 @@ import { getIn } from '../../../../../utils/objects'; import { getTranslation } from '../../../../../utils/translations'; import { transformDocument } from '../../../utils/data'; import { createDefaultForm } from '../../../utils/forms'; +import { ResponsiveGridItem, ResponsiveGridRoot } from '../../FormLayout'; import { ComponentProvider, useComponent } from '../ComponentContext'; import { Initializer } from './Initializer'; @@ -273,7 +273,7 @@ const RepeatableComponent = ({ > {layout.map((row, index) => { return ( - + {row.map(({ size, ...field }) => { /** * Layouts are built from schemas so they don't understand the complete @@ -289,7 +289,7 @@ const RepeatableComponent = ({ }); return ( - + ); })} - + ); })} diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx index 7b169ac098..a844f0ced9 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx @@ -5,6 +5,7 @@ import { useIntl } from 'react-intl'; import { styled } from 'styled-components'; import { ComponentIcon } from '../../../../../components/ComponentIcon'; +import { RESPONSIVE_CONTAINER_BREAKPOINTS } from '../../FormLayout'; interface ComponentCategoryProps { category: string; @@ -34,7 +35,7 @@ const ComponentCategory = ({ {formatMessage({ id: category, defaultMessage: category })} - + {components.map(({ uid, displayName, icon }) => ( ))} - + ); }; +const ResponsiveAccordionContent = styled(Accordion.Content)` + container-type: inline-size; +`; + const Grid = styled(Box)` display: grid; - grid-template-columns: repeat(auto-fit, 14rem); + grid-template-columns: repeat(auto-fill, 100%); grid-gap: ${({ theme }) => theme.spaces[1]}; + + @container (min-width: ${() => RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) { + grid-template-columns: repeat(auto-fill, 14rem); + } `; const ComponentBox = styled>(Flex)` diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx index e71c57163f..dc86386867 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx @@ -23,6 +23,7 @@ import { useDocLayout } from '../../../../../hooks/useDocumentLayout'; import { type UseDragAndDropOptions, useDragAndDrop } from '../../../../../hooks/useDragAndDrop'; import { getIn } from '../../../../../utils/objects'; import { getTranslation } from '../../../../../utils/translations'; +import { ResponsiveGridItem, ResponsiveGridRoot } from '../../FormLayout'; import { InputRenderer, type InputRendererProps } from '../../InputRenderer'; import type { ComponentPickerProps } from './ComponentPicker'; @@ -244,7 +245,7 @@ const DynamicComponent = ({ direction="column" alignItems="stretch" > - + {row.map(({ size, ...field }) => { const fieldName = `${name}.${index}.${field.name}`; @@ -257,7 +258,7 @@ const DynamicComponent = ({ }; return ( - )} - + ); })} - + ))} diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormLayout.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormLayout.tsx index 7e2cc86691..39be281484 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormLayout.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormLayout.tsx @@ -1,11 +1,28 @@ import { Box, Flex, Grid } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import { styled } from 'styled-components'; import { useDoc } from '../../../hooks/useDocument'; import { EditLayout } from '../../../hooks/useDocumentLayout'; import { InputRenderer } from './InputRenderer'; +export const RESPONSIVE_CONTAINER_BREAKPOINTS = { + sm: '27.5rem', // 440px +}; + +export const ResponsiveGridRoot = styled(Grid.Root)` + container-type: inline-size; +`; + +export const ResponsiveGridItem = styled(Grid.Item)` + grid-column: span 12; + + @container (min-width: ${RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) { + ${({ col }) => col && `grid-column: span ${col};`} + } +`; + interface FormLayoutProps extends Pick {} const FormLayout = ({ layout }: FormLayoutProps) => { @@ -50,7 +67,7 @@ const FormLayout = ({ layout }: FormLayoutProps) => { > {panel.map((row, gridRowIndex) => ( - + {row.map(({ size, ...field }) => { const fieldWithTranslatedLabel = { ...field, @@ -60,7 +77,7 @@ const FormLayout = ({ layout }: FormLayoutProps) => { }), }; return ( - { alignItems="stretch" > - + ); })} - + ))} diff --git a/tests/e2e/tests/i18n/settings.spec.ts b/tests/e2e/tests/i18n/settings.spec.ts index 55ec735d22..fa616f6f8f 100644 --- a/tests/e2e/tests/i18n/settings.spec.ts +++ b/tests/e2e/tests/i18n/settings.spec.ts @@ -110,8 +110,11 @@ test.describe('Settings', () => { * Create the missing components in the "content" dynamic zone. */ await page.getByRole('button', { name: 'There are 2 missing components' }).click(); + // Click the button in the DZ component picker await page.getByRole('button', { name: 'Product carousel' }).click(); + // Click the DZ component toggle button await page.getByRole('button', { name: 'Product carousel' }).click(); + await page .getByRole('region', { name: /Product carousel/ }) .getByRole('textbox', { name: 'title' })