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' })