From b1f0f7358a179191ecfb155e97e90f6b1e7f7358 Mon Sep 17 00:00:00 2001 From: nuria1110 Date: Wed, 5 Mar 2025 18:10:22 +0000 Subject: [PATCH 1/3] fix(textbox): margin not applied to character count Fixes issue where margin-bottom applied to Textbox based components would not be applied to character count. --- src/components/textbox/textbox.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/textbox/textbox.component.tsx b/src/components/textbox/textbox.component.tsx index 6e4f14290f..e0b5fe3830 100644 --- a/src/components/textbox/textbox.component.tsx +++ b/src/components/textbox/textbox.component.tsx @@ -393,8 +393,8 @@ export const Textbox = React.forwardRef( ) : ( input )} + {characterCount} - {characterCount} ); From b58a960df23facc43ab7ef0119682d3c8a835a71 Mon Sep 17 00:00:00 2001 From: nuria1110 Date: Wed, 5 Mar 2025 18:49:17 +0000 Subject: [PATCH 2/3] fix(form): replace use of context to apply field spacing The use of form spacing context to apply spacing to our inputs within Form has caused issues for consumers using it in exported components in different projects using Carbon. This fix replaces context with a pure css solution to ensure margins are applied and consistent across projects. fix #7058 --- .../fieldset/fieldset.component.tsx | 4 +- src/__internal__/fieldset/fieldset.style.ts | 1 + .../form-field/form-field.component.tsx | 4 +- .../form-field/form-field.style.ts | 1 + .../form-spacing-provider.component.tsx | 20 -- .../form-spacing.context.ts | 9 - .../form-spacing-provider/index.ts | 3 - .../checkbox-group.component.tsx | 9 +- .../checkbox/checkbox.component.tsx | 4 +- src/components/checkbox/checkbox.style.ts | 1 + src/components/date-range/date-range.style.ts | 1 + src/components/date/date.component.tsx | 8 +- src/components/date/date.style.ts | 1 + .../fieldset/fieldset.component.tsx | 13 +- src/components/fieldset/fieldset.style.ts | 5 + src/components/form/form-test.stories.tsx | 241 ++++++++++-------- src/components/form/form.component.tsx | 7 +- src/components/form/form.mdx | 11 +- src/components/form/form.stories.tsx | 4 +- src/components/form/form.style.ts | 36 ++- .../inline-inputs/inline-inputs.component.tsx | 9 +- .../inline-inputs/inline-inputs.style.ts | 1 + .../numeral-date/numeral-date.component.tsx | 1 + src/components/search/search.component.tsx | 2 +- src/components/search/search.style.ts | 1 + .../filterable-select.component.tsx | 8 +- .../multi-select/multi-select.component.tsx | 8 +- src/components/select/select.style.ts | 1 + .../simple-select/simple-select.component.tsx | 8 +- src/components/switch/switch.component.tsx | 4 +- src/components/switch/switch.style.ts | 1 + .../text-editor/text-editor.style.ts | 1 + .../textarea/textarea.component.tsx | 5 +- src/components/textarea/textarea.style.ts | 1 + src/components/time/time.component.tsx | 4 + .../add-form-spacing/add-form-spacing.test.ts | 49 ---- .../useFormSpacing/add-form-spacing/index.ts | 27 -- .../__internal__/useFormSpacing/index.ts | 19 -- .../useFormSpacing/useFormSpacing.test.tsx | 95 ------- 39 files changed, 233 insertions(+), 395 deletions(-) delete mode 100644 src/__internal__/form-spacing-provider/form-spacing-provider.component.tsx delete mode 100644 src/__internal__/form-spacing-provider/form-spacing.context.ts delete mode 100644 src/__internal__/form-spacing-provider/index.ts delete mode 100644 src/hooks/__internal__/useFormSpacing/add-form-spacing/add-form-spacing.test.ts delete mode 100644 src/hooks/__internal__/useFormSpacing/add-form-spacing/index.ts delete mode 100644 src/hooks/__internal__/useFormSpacing/index.ts delete mode 100644 src/hooks/__internal__/useFormSpacing/useFormSpacing.test.tsx diff --git a/src/__internal__/fieldset/fieldset.component.tsx b/src/__internal__/fieldset/fieldset.component.tsx index 0c42b60678..31237ed05e 100644 --- a/src/__internal__/fieldset/fieldset.component.tsx +++ b/src/__internal__/fieldset/fieldset.component.tsx @@ -11,9 +11,9 @@ import { import ValidationIcon from "../validations/validation-icon.component"; import NewValidationContext from "../../components/carbon-provider/__internal__/new-validation.context"; import { InputGroupBehaviour, InputGroupContext } from "../input-behaviour"; -import useFormSpacing from "../../hooks/__internal__/useFormSpacing"; import Help from "../../components/help"; import Typography from "../../components/typography"; +import { filterStyledSystemMarginProps } from "../../style/utils"; export interface FieldsetProps extends MarginProps { /** Role */ @@ -84,7 +84,7 @@ const Fieldset = ({ ...rest }: FieldsetProps) => { const { validationRedesignOptIn } = useContext(NewValidationContext); - const marginProps = useFormSpacing(rest); + const marginProps = filterStyledSystemMarginProps(rest); const [ref, setRef] = useState(null); const [isFocused, setFocus] = useState(false); diff --git a/src/__internal__/fieldset/fieldset.style.ts b/src/__internal__/fieldset/fieldset.style.ts index 761ff799d9..de0f481e06 100644 --- a/src/__internal__/fieldset/fieldset.style.ts +++ b/src/__internal__/fieldset/fieldset.style.ts @@ -8,6 +8,7 @@ type StyledFieldsetProps = { const StyledFieldset = styled.fieldset` margin: 0; + margin-bottom: var(--fieldSpacing); ${margin} border: none; padding: 0; diff --git a/src/__internal__/form-field/form-field.component.tsx b/src/__internal__/form-field/form-field.component.tsx index 7d25cc9234..3f5118b7d1 100644 --- a/src/__internal__/form-field/form-field.component.tsx +++ b/src/__internal__/form-field/form-field.component.tsx @@ -19,7 +19,7 @@ import TabContext, { } from "../../components/tabs/tab/__internal__/tab.context"; import useIsAboveBreakpoint from "../../hooks/__internal__/useIsAboveBreakpoint"; import { IconType } from "../../components/icon"; -import useFormSpacing from "../../hooks/__internal__/useFormSpacing"; +import { filterStyledSystemMarginProps } from "../../style/utils"; interface CommonFormFieldProps extends MarginProps, ValidationProps { /** If true, the component will be disabled */ @@ -149,7 +149,7 @@ const FormField = ({ const { setError, setWarning, setInfo } = useContext(TabContext); - const marginProps = useFormSpacing(rest); + const marginProps = filterStyledSystemMarginProps(rest); const isMounted = useRef(false); useLayoutEffect(() => { diff --git a/src/__internal__/form-field/form-field.style.ts b/src/__internal__/form-field/form-field.style.ts index b7587a5981..2b50f1f993 100644 --- a/src/__internal__/form-field/form-field.style.ts +++ b/src/__internal__/form-field/form-field.style.ts @@ -3,6 +3,7 @@ import { space } from "styled-system"; import { baseTheme } from "../../style/themes"; const FormFieldStyle = styled.div` + margin-bottom: var(--fieldSpacing); & + & { margin-top: 16px; } diff --git a/src/__internal__/form-spacing-provider/form-spacing-provider.component.tsx b/src/__internal__/form-spacing-provider/form-spacing-provider.component.tsx deleted file mode 100644 index a8438fe991..0000000000 --- a/src/__internal__/form-spacing-provider/form-spacing-provider.component.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import { - FormSpacingContext, - FormSpacingContextProps, -} from "./form-spacing.context"; - -interface FormSpacingProviderProps extends FormSpacingContextProps { - children: React.ReactNode; -} - -const FormSpacingProvider = ({ - marginBottom, - children, -}: FormSpacingProviderProps) => ( - - {children} - -); - -export default FormSpacingProvider; diff --git a/src/__internal__/form-spacing-provider/form-spacing.context.ts b/src/__internal__/form-spacing-provider/form-spacing.context.ts deleted file mode 100644 index db7e100943..0000000000 --- a/src/__internal__/form-spacing-provider/form-spacing.context.ts +++ /dev/null @@ -1,9 +0,0 @@ -import React from "react"; - -export interface FormSpacingContextProps { - marginBottom?: string; -} - -export const FormSpacingContext = React.createContext( - {}, -); diff --git a/src/__internal__/form-spacing-provider/index.ts b/src/__internal__/form-spacing-provider/index.ts deleted file mode 100644 index 6ae1902dd9..0000000000 --- a/src/__internal__/form-spacing-provider/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { FormSpacingContext } from "./form-spacing.context"; -export type { FormSpacingContextProps } from "./form-spacing.context"; -export { default } from "./form-spacing-provider.component"; diff --git a/src/components/checkbox/checkbox-group/checkbox-group.component.tsx b/src/components/checkbox/checkbox-group/checkbox-group.component.tsx index 31181598e9..2f0facd0b9 100644 --- a/src/components/checkbox/checkbox-group/checkbox-group.component.tsx +++ b/src/components/checkbox/checkbox-group/checkbox-group.component.tsx @@ -8,7 +8,6 @@ import Fieldset from "../../../__internal__/fieldset"; import { filterStyledSystemMarginProps } from "../../../style/utils"; import { TooltipProvider } from "../../../__internal__/tooltip-provider"; import { ValidationProps } from "../../../__internal__/validations"; -import FormSpacingProvider from "../../../__internal__/form-spacing-provider"; import NewValidationContext from "../../carbon-provider/__internal__/new-validation.context"; import ValidationMessage from "../../../__internal__/validation-message/validation-message.component"; import Box from "../../box"; @@ -134,9 +133,7 @@ export const CheckboxGroup = ({ warning: !!warning, }} > - - {children} - + {children} @@ -173,9 +170,7 @@ export const CheckboxGroup = ({ info: !!info, }} > - - {children} - + {children} diff --git a/src/components/checkbox/checkbox.component.tsx b/src/components/checkbox/checkbox.component.tsx index b38f3f7f1e..8311bf22fb 100644 --- a/src/components/checkbox/checkbox.component.tsx +++ b/src/components/checkbox/checkbox.component.tsx @@ -11,8 +11,8 @@ import useIsAboveBreakpoint from "../../hooks/__internal__/useIsAboveBreakpoint" import { TooltipProvider } from "../../__internal__/tooltip-provider"; import CheckboxGroupContext from "./checkbox-group/__internal__/checkbox-group.context"; import Logger from "../../__internal__/utils/logger"; -import useFormSpacing from "../../hooks/__internal__/useFormSpacing"; import NewValidationContext from "../carbon-provider/__internal__/new-validation.context"; +import { filterStyledSystemMarginProps } from "../../style/utils"; export interface CheckboxProps extends CommonCheckableInputProps, @@ -131,7 +131,7 @@ export const Checkbox = React.forwardRef( : { info: contextInfo || info }), }; - const marginProps = useFormSpacing(rest); + const marginProps = filterStyledSystemMarginProps(rest); const componentToRender = ( ` + margin-bottom: var(--fieldSpacing); ${margin} ${({ disabled, diff --git a/src/components/date-range/date-range.style.ts b/src/components/date-range/date-range.style.ts index bbc2718c1f..2299128bb2 100644 --- a/src/components/date-range/date-range.style.ts +++ b/src/components/date-range/date-range.style.ts @@ -10,6 +10,7 @@ export interface StyledDateRangeProps { labelsInline?: boolean; } const StyledDateRange = styled.div` + margin-bottom: var(--fieldSpacing); ${margin} & ${StyledDateInput} { diff --git a/src/components/date/date.component.tsx b/src/components/date/date.component.tsx index 0a2c8f4c12..93d5274efa 100644 --- a/src/components/date/date.component.tsx +++ b/src/components/date/date.component.tsx @@ -22,7 +22,10 @@ import { import useLocale from "../../hooks/__internal__/useLocale"; import Logger from "../../__internal__/utils/logger"; import Events from "../../__internal__/utils/helpers/events"; -import { filterOutStyledSystemSpacingProps } from "../../style/utils"; +import { + filterOutStyledSystemSpacingProps, + filterStyledSystemMarginProps, +} from "../../style/utils"; import getFormatData from "./__internal__/date-formats"; import StyledDateInput from "./date.style"; import Textbox, { TextboxProps } from "../textbox"; @@ -31,7 +34,6 @@ import DateRangeContext, { InputName, } from "../date-range/__internal__/date-range.context"; import useClickAwayListener from "../../hooks/__internal__/useClickAwayListener"; -import useFormSpacing from "../../hooks/__internal__/useFormSpacing"; import guid from "../../__internal__/utils/helpers/guid"; import tagComponent from "../../__internal__/utils/helpers/tags/tags"; @@ -492,7 +494,7 @@ export const DateInput = React.forwardRef( return value; }; - const marginProps = useFormSpacing(rest); + const marginProps = filterStyledSystemMarginProps(rest); return ( ` + margin-bottom: var(--fieldSpacing); ${margin} & ${StyledInputPresentation} { diff --git a/src/components/fieldset/fieldset.component.tsx b/src/components/fieldset/fieldset.component.tsx index babdbf4d14..b1456fde51 100644 --- a/src/components/fieldset/fieldset.component.tsx +++ b/src/components/fieldset/fieldset.component.tsx @@ -4,8 +4,7 @@ import tagComponent, { TagProps } from "../../__internal__/utils/helpers/tags"; import { FieldsetStyle, StyledLegend } from "./fieldset.style"; import NewValidationContext from "../carbon-provider/__internal__/new-validation.context"; -import FormSpacingProvider from "../../__internal__/form-spacing-provider"; -import useFormSpacing from "../../hooks/__internal__/useFormSpacing"; +import { filterStyledSystemMarginProps } from "../../style/utils"; export interface FieldsetProps extends MarginProps, TagProps { /** Child elements */ @@ -26,7 +25,7 @@ export const Fieldset = ({ ...rest }: FieldsetProps) => { const [ref, setRef] = useState(null); - const marginProps = useFormSpacing(rest); + const marginProps = filterStyledSystemMarginProps(rest); const { validationRedesignOptIn } = useContext(NewValidationContext); useEffect(() => { @@ -56,13 +55,7 @@ export const Fieldset = ({ {legend} )} - {validationRedesignOptIn ? ( - children - ) : ( - - {children} - - )} + {children} ); }; diff --git a/src/components/fieldset/fieldset.style.ts b/src/components/fieldset/fieldset.style.ts index 4caeadcf0e..dc01227c06 100644 --- a/src/components/fieldset/fieldset.style.ts +++ b/src/components/fieldset/fieldset.style.ts @@ -11,6 +11,7 @@ export interface StyledFieldsetProps { const FieldsetStyle = styled.fieldset` margin: 0; + margin-bottom: var(--fieldSpacing); ${margin} border: none; padding: 0; @@ -18,6 +19,10 @@ const FieldsetStyle = styled.fieldset` ${({ newValidation }) => !newValidation && css` + & * { + --fieldSpacing: 0; + } + &&&& ${FormFieldStyle} { margin-top: 0; margin-bottom: -1px; diff --git a/src/components/form/form-test.stories.tsx b/src/components/form/form-test.stories.tsx index 067f3f982a..7b3912ccf8 100644 --- a/src/components/form/form-test.stories.tsx +++ b/src/components/form/form-test.stories.tsx @@ -27,6 +27,7 @@ import Password from "../password"; import Search, { SearchProps } from "../search"; import { Time } from "../time"; import TextEditor from "../text-editor"; +import CarbonProvider from "../carbon-provider"; export default { title: "Form/Test", @@ -37,60 +38,141 @@ export default { disableSnapshot: true, }, }, + argTypes: { + fieldSpacing: { + options: ["0", "1", "2", "3", "4", "5", "6", "7"], + control: { + type: "select", + }, + }, + }, }; type StoryType = StoryObj; -export const DefaultWithStickyFooter: StoryType = ({ ...props }) => ( -
console.log("submit")} - leftSideButtons={ - - } - saveButton={ - - } - {...props} - > - - - Tab1 - - } - tabId="tab1" +export const AllInputs: StoryType = ({ ...props }) => ( + + console.log("submit")} + leftSideButtons={ + + } + saveButton={ + + } + {...props} + > + + + + - - - -