diff --git a/.changeset/curly-jeans-talk.md b/.changeset/curly-jeans-talk.md new file mode 100644 index 0000000000..573af45dda --- /dev/null +++ b/.changeset/curly-jeans-talk.md @@ -0,0 +1,17 @@ +--- +"@twilio-paste/base-radio-checkbox": patch +"@twilio-paste/button": patch +"@twilio-paste/checkbox": patch +"@twilio-paste/combobox": patch +"@twilio-paste/file-picker": patch +"@twilio-paste/file-uploader": patch +"@twilio-paste/input": patch +"@twilio-paste/input-box": patch +"@twilio-paste/menu": patch +"@twilio-paste/select": patch +"@twilio-paste/textarea": patch +"@twilio-paste/visual-picker": patch +"@twilio-paste/core": patch +--- + +[Base Radio Checkbox, Button, Combobox, File Picker, File Uploader, Input, Input Box, Menu, Select, Textarea, Visual Picker] Update styles of form related components diff --git a/.changeset/lazy-icons-prove.md b/.changeset/lazy-icons-prove.md new file mode 100644 index 0000000000..dd46fd73ae --- /dev/null +++ b/.changeset/lazy-icons-prove.md @@ -0,0 +1,6 @@ +--- +"@twilio-paste/design-tokens": patch +"@twilio-paste/core": patch +--- + +[Design Tokens] Update palette and new elevation token diff --git a/.changeset/selfish-birds-pump.md b/.changeset/selfish-birds-pump.md new file mode 100644 index 0000000000..7b7a2da3ee --- /dev/null +++ b/.changeset/selfish-birds-pump.md @@ -0,0 +1,6 @@ +--- +"@twilio-paste/label": minor +"@twilio-paste/core": minor +--- + +[Label] Update font weight, expose new prop for optional variant and fix require dot causing scrolling issue diff --git a/cypress/integration/token-list/index.spec.ts b/cypress/integration/token-list/index.spec.ts index 1bba292404..e293f0b12b 100644 --- a/cypress/integration/token-list/index.spec.ts +++ b/cypress/integration/token-list/index.spec.ts @@ -47,7 +47,7 @@ describe("Token list filter format control and theme control", function () { cy.get('[data-cy="theme-control"]').select("dark").should("have.value", "dark"); cy.get('[data-cy="tokens-table-container"] li:first dd [data-paste-element="TEXT"]:first').should( "include.text", - "rgb(18, 28, 45)", + "rgb(24, 37, 60)", ); cy.get('[data-cy="theme-control"]').select("default").should("have.value", "default"); cy.get('[data-cy="tokens-table-container"] li:first dd [data-paste-element="TEXT"]:first').should( diff --git a/packages/paste-core/components/account-switcher/__tests__/AccountSwitcher.spec.tsx b/packages/paste-core/components/account-switcher/__tests__/AccountSwitcher.spec.tsx index 1a713117f3..85313e1663 100644 --- a/packages/paste-core/components/account-switcher/__tests__/AccountSwitcher.spec.tsx +++ b/packages/paste-core/components/account-switcher/__tests__/AccountSwitcher.spec.tsx @@ -42,7 +42,7 @@ describe("AccountSwitcher", () => { }); expect(screen.getByRole("button", { name: "Switch accounts" })).toHaveStyleRule( "background-color", - "rgb(214, 31, 31)", + "rgb(219, 19, 42)", ); expect(screen.getByRole("menu")).toHaveStyleRule("border-color", "rgb(117, 12, 12)"); expect(screen.getByRole("menuitem", { name: "Account settings" })).toHaveStyleRule( @@ -59,7 +59,7 @@ describe("AccountSwitcher", () => { }); expect(screen.getByRole("button", { name: "Switch accounts" })).toHaveStyleRule( "background-color", - "rgb(214, 31, 31)", + "rgb(219, 19, 42)", ); expect(screen.getByRole("menu")).toHaveStyleRule("border-color", "rgb(117, 12, 12)"); expect(screen.getByRole("menuitem", { name: "Account settings" })).toHaveStyleRule( diff --git a/packages/paste-core/components/alert-dialog/__tests__/customization.spec.tsx b/packages/paste-core/components/alert-dialog/__tests__/customization.spec.tsx index ea368ae21a..5ee38c3087 100644 --- a/packages/paste-core/components/alert-dialog/__tests__/customization.spec.tsx +++ b/packages/paste-core/components/alert-dialog/__tests__/customization.spec.tsx @@ -83,7 +83,7 @@ describe("Alert Dialog customization", () => { }); it("should apply styles to Alert Dialog with custom element prop", () => { const { container } = render(); - expect(screen.getByTestId("destructive_alert_dialog")).toHaveStyleRule("background-color", "rgb(214, 31, 31)"); + expect(screen.getByTestId("destructive_alert_dialog")).toHaveStyleRule("background-color", "rgb(219, 19, 42)"); expect(container.querySelector('[data-paste-element="FOO_HEADER_WRAPPER"]')).toHaveStyleRule("border", "inherit"); expect(screen.getByText("Alert Dialog")).toHaveStyleRule("background-color", "rgb(235, 244, 255)"); expect( diff --git a/packages/paste-core/components/alert-dialog/__tests__/index.spec.tsx b/packages/paste-core/components/alert-dialog/__tests__/index.spec.tsx index 2c707229b7..a7cecbd93c 100644 --- a/packages/paste-core/components/alert-dialog/__tests__/index.spec.tsx +++ b/packages/paste-core/components/alert-dialog/__tests__/index.spec.tsx @@ -30,7 +30,7 @@ describe("Alert Dialog", () => { it("Should have a destructive button style when the destructive prop is included", () => { render(, { wrapper: ThemeWrapper }); const button = screen.getByRole("button", { name: "Delete" }); - expect(button).toHaveStyleRule("background-color", "rgb(214, 31, 31)"); + expect(button).toHaveStyleRule("background-color", "rgb(219, 19, 42)"); }); it("Should have a disabled destructive button style when the onConfirmDisabled prop is included", () => { diff --git a/packages/paste-core/components/base-radio-checkbox/src/BaseRadioCheckbox.tsx b/packages/paste-core/components/base-radio-checkbox/src/BaseRadioCheckbox.tsx index 9a8d0ee4cf..ea6e7ce402 100644 --- a/packages/paste-core/components/base-radio-checkbox/src/BaseRadioCheckbox.tsx +++ b/packages/paste-core/components/base-radio-checkbox/src/BaseRadioCheckbox.tsx @@ -55,8 +55,8 @@ const BaseRadioCheckboxControl = React.forwardRef + merge(SizeStyles[size], { + borderRadius: "borderRadius20", + }); + const ButtonStyleMapping = { default: defaultStyles, loading: loadingStyles, @@ -45,7 +50,7 @@ const DestructiveLinkButton = React.forwardRef ); }, diff --git a/packages/paste-core/components/button/src/DestructiveSecondaryButton.tsx b/packages/paste-core/components/button/src/DestructiveSecondaryButton.tsx index 6a50ab28d8..8387c903ea 100644 --- a/packages/paste-core/components/button/src/DestructiveSecondaryButton.tsx +++ b/packages/paste-core/components/button/src/DestructiveSecondaryButton.tsx @@ -30,9 +30,9 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const baseLoadingStyles: BoxStyleProps = { - color: "colorTextDestructive", + color: "colorTextWeaker", backgroundColor: "colorBackgroundBody", - boxShadow: "shadowBorderWeak", + boxShadow: "shadowBorderWeaker", }; const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { diff --git a/packages/paste-core/components/button/src/InverseButton.tsx b/packages/paste-core/components/button/src/InverseButton.tsx index 4c33592ecd..6b8be46e1b 100644 --- a/packages/paste-core/components/button/src/InverseButton.tsx +++ b/packages/paste-core/components/button/src/InverseButton.tsx @@ -30,9 +30,9 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { - color: "colorTextInverse", + color: "colorTextInverseWeakest", backgroundColor: "colorBackgroundInverseStrong", - boxShadow: "shadowBorderInverseWeaker", + boxShadow: "shadowBorderInverseWeakest", }); const disabledStyles = merge(BaseStyles.disabled, { diff --git a/packages/paste-core/components/button/src/InverseLinkButton.tsx b/packages/paste-core/components/button/src/InverseLinkButton.tsx index d17ab0a93c..7813ef99e0 100644 --- a/packages/paste-core/components/button/src/InverseLinkButton.tsx +++ b/packages/paste-core/components/button/src/InverseLinkButton.tsx @@ -16,7 +16,7 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { - color: "colorTextInverse", + color: "colorTextInverseWeakest", textAlign: "left", }); @@ -25,6 +25,11 @@ const disabledStyles: BoxStyleProps = merge(BaseStyles.disabled, { textAlign: "left", }); +const linkSizeStyles = (size: keyof typeof SizeStyles): BoxStyleProps => + merge(SizeStyles[size], { + borderRadius: "borderRadius20", + }); + const ButtonStyleMapping = { default: defaultStyles, loading: loadingStyles, @@ -40,7 +45,7 @@ const InverseLinkButton = React.forwardRef width={fullWidth ? "100%" : "auto"} {...safelySpreadBoxProps({ as, ...props })} {...ButtonStyleMapping[buttonState]} - {...SizeStyles[size]} + {...linkSizeStyles(size)} /> ); }, diff --git a/packages/paste-core/components/button/src/LinkButton.tsx b/packages/paste-core/components/button/src/LinkButton.tsx index 73b2ba6b28..cd96c68bdb 100644 --- a/packages/paste-core/components/button/src/LinkButton.tsx +++ b/packages/paste-core/components/button/src/LinkButton.tsx @@ -15,7 +15,7 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { - color: "colorTextPrimary", + color: "colorTextWeaker", textAlign: "left", }); @@ -24,6 +24,11 @@ const disabledStyles: BoxStyleProps = merge(BaseStyles.disabled, { textAlign: "left", }); +const linkSizeStyles = (size: keyof typeof SizeStyles): BoxStyleProps => + merge(SizeStyles[size], { + borderRadius: "borderRadius20", + }); + const ButtonStyleMapping = { default: defaultStyles, loading: loadingStyles, @@ -39,7 +44,7 @@ const LinkButton = React.forwardRef( width={fullWidth ? "100%" : "auto"} {...safelySpreadBoxProps({ as, ...props })} {...ButtonStyleMapping[buttonState]} - {...SizeStyles[size]} + {...linkSizeStyles(size)} /> ); }, diff --git a/packages/paste-core/components/button/src/PrimaryButton.tsx b/packages/paste-core/components/button/src/PrimaryButton.tsx index b4a09b3e0c..ac0233dc2c 100644 --- a/packages/paste-core/components/button/src/PrimaryButton.tsx +++ b/packages/paste-core/components/button/src/PrimaryButton.tsx @@ -30,9 +30,9 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { - color: "colorTextPrimary", + color: "colorTextWeaker", backgroundColor: "colorBackgroundBody", - boxShadow: "shadowBorderWeak", + boxShadow: "shadowBorderWeaker", }); const disabledStyles = merge(BaseStyles.disabled, { diff --git a/packages/paste-core/components/button/src/PrimaryIconButton.tsx b/packages/paste-core/components/button/src/PrimaryIconButton.tsx index 5b32015e20..08d423ea47 100644 --- a/packages/paste-core/components/button/src/PrimaryIconButton.tsx +++ b/packages/paste-core/components/button/src/PrimaryIconButton.tsx @@ -21,7 +21,7 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { - color: "colorTextPrimary", + color: "colorTextWeaker", }); const disabledStyles = merge(BaseStyles.disabled, { diff --git a/packages/paste-core/components/button/src/SecondaryButton.tsx b/packages/paste-core/components/button/src/SecondaryButton.tsx index 8012a4903c..b2818522cb 100644 --- a/packages/paste-core/components/button/src/SecondaryButton.tsx +++ b/packages/paste-core/components/button/src/SecondaryButton.tsx @@ -30,9 +30,9 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const baseLoadingStyles: BoxStyleProps = { - color: "colorTextPrimary", + color: "colorTextWeaker", backgroundColor: "colorBackgroundBody", - boxShadow: "shadowBorderWeak", + boxShadow: "shadowBorderWeaker", }; const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { diff --git a/packages/paste-core/components/button/src/SecondaryIconButton.tsx b/packages/paste-core/components/button/src/SecondaryIconButton.tsx index 56c92f2c36..536fdbc836 100644 --- a/packages/paste-core/components/button/src/SecondaryIconButton.tsx +++ b/packages/paste-core/components/button/src/SecondaryIconButton.tsx @@ -21,7 +21,7 @@ const defaultStyles: BoxStyleProps = merge(BaseStyles.default, { }); const loadingStyles: BoxStyleProps = merge(BaseStyles.loading, { - color: "colorTextPrimary", + color: "colorTextWeaker", }); const disabledStyles = merge(BaseStyles.disabled, { diff --git a/packages/paste-core/components/button/src/styles.ts b/packages/paste-core/components/button/src/styles.ts index ed8a628e65..2e1669aab0 100644 --- a/packages/paste-core/components/button/src/styles.ts +++ b/packages/paste-core/components/button/src/styles.ts @@ -44,7 +44,7 @@ export const SizeStyles: { [key in ButtonSizes]: BoxStyleProps } = { paddingBottom: "space30", paddingLeft: "space40", paddingRight: "space40", - borderRadius: "borderRadius20", + borderRadius: "borderRadius30", fontSize: "fontSize30", lineHeight: "lineHeight20", }, @@ -53,17 +53,17 @@ export const SizeStyles: { [key in ButtonSizes]: BoxStyleProps } = { paddingBottom: "space20", paddingLeft: "space30", paddingRight: "space30", - borderRadius: "borderRadius10", + borderRadius: "borderRadius30", fontSize: "fontSize30", lineHeight: "lineHeight20", }, icon: { padding: "space30", - borderRadius: "borderRadius20", + borderRadius: "borderRadius30", }, icon_small: { padding: "space20", - borderRadius: "borderRadius20", + borderRadius: "borderRadius30", }, reset: { paddingTop: "space0", diff --git a/packages/paste-core/components/card/__test__/card.test.tsx b/packages/paste-core/components/card/__test__/card.test.tsx index 8f1ae4bf83..ee9176e182 100644 --- a/packages/paste-core/components/card/__test__/card.test.tsx +++ b/packages/paste-core/components/card/__test__/card.test.tsx @@ -78,7 +78,7 @@ describe("Customization", () => { ); const renderedCard = screen.getByTestId("customizable-card"); expect(renderedCard).toHaveStyleRule("background-color", "rgb(244, 244, 246)"); - expect(renderedCard).toHaveStyleRule("border-color", "rgb(214, 31, 31)"); + expect(renderedCard).toHaveStyleRule("border-color", "rgb(219, 19, 42)"); }); it("should add custom styles to Card with a custom element data attribute", (): void => { @@ -94,6 +94,6 @@ describe("Customization", () => { ); const renderedCard = screen.getByTestId("customizable-card"); expect(renderedCard).toHaveStyleRule("background-color", "rgb(244, 244, 246)"); - expect(renderedCard).toHaveStyleRule("border-color", "rgb(214, 31, 31)"); + expect(renderedCard).toHaveStyleRule("border-color", "rgb(219, 19, 42)"); }); }); diff --git a/packages/paste-core/components/checkbox/src/Checkbox.tsx b/packages/paste-core/components/checkbox/src/Checkbox.tsx index 69eb55a8c5..e3b6cdad41 100644 --- a/packages/paste-core/components/checkbox/src/Checkbox.tsx +++ b/packages/paste-core/components/checkbox/src/Checkbox.tsx @@ -21,7 +21,7 @@ const selectAllStyleProps = { paddingRight: "space30", paddingBottom: "space20", paddingLeft: "space30", - borderRadius: "borderRadius10", + borderRadius: "borderRadius20", backgroundColor: "colorBackground", }; diff --git a/packages/paste-core/components/combobox/src/styles/ComboboxListboxOption.tsx b/packages/paste-core/components/combobox/src/styles/ComboboxListboxOption.tsx index 4995a412a7..67f9fa7b3e 100644 --- a/packages/paste-core/components/combobox/src/styles/ComboboxListboxOption.tsx +++ b/packages/paste-core/components/combobox/src/styles/ComboboxListboxOption.tsx @@ -1,7 +1,7 @@ import { Box, safelySpreadBoxProps } from "@twilio-paste/box"; import type { BoxProps, BoxStyleProps } from "@twilio-paste/box"; import { SelectedIcon } from "@twilio-paste/icons/esm/SelectedIcon"; -import type { PositionOptions } from "@twilio-paste/style-props"; +import type { BackgroundColor, PositionOptions } from "@twilio-paste/style-props"; import { Text } from "@twilio-paste/text"; import type { HTMLPasteProps } from "@twilio-paste/types"; import * as React from "react"; @@ -66,10 +66,20 @@ const getVirtualStyles = (startHeight: number): Record => ({ position: "absolute" as PositionOptions, top: 0, left: 0, - width: "100%", + width: "fill-available", transform: `translateY(${startHeight}px)`, }); +function getBackgroundColor(highlightedProp?: boolean, selectedProp?: boolean): BackgroundColor { + if (highlightedProp && selectedProp) { + return "colorBackgroundWeak"; + } + if (highlightedProp || selectedProp) { + return "colorBackgroundBodyElevationPrimary"; + } + return "colorBackgroundWeaker"; +} + const ComboboxListboxOption = React.forwardRef( ( { @@ -99,49 +109,35 @@ const ComboboxListboxOption = React.forwardRef - - - {children} - - - ); diff --git a/packages/paste-core/components/combobox/stories/Combobox.stories.tsx b/packages/paste-core/components/combobox/stories/Combobox.stories.tsx index 7338ec5e78..c89637c891 100644 --- a/packages/paste-core/components/combobox/stories/Combobox.stories.tsx +++ b/packages/paste-core/components/combobox/stories/Combobox.stories.tsx @@ -484,7 +484,7 @@ export const ComboboxDisabledInsertBeforeAndAfterInverse: StoryFn = () => { + $10.99 } diff --git a/packages/paste-core/components/file-picker/src/FilePicker.tsx b/packages/paste-core/components/file-picker/src/FilePicker.tsx index 09edb2818d..052c6b6f3e 100644 --- a/packages/paste-core/components/file-picker/src/FilePicker.tsx +++ b/packages/paste-core/components/file-picker/src/FilePicker.tsx @@ -127,12 +127,12 @@ const FilePicker = React.forwardRef( justifyContent="start" as="span" type="file" - borderRadius="borderRadius30" + borderRadius="borderRadius40" padding="space20" boxShadow="shadowBorder" backgroundColor="colorBackgroundBody" _focusSibling={{ - borderRadius: "borderRadius30", + borderRadius: "borderRadius40", padding: "space20", boxShadow: "shadowFocus", backgroundColor: "colorBackgroundBody", diff --git a/packages/paste-core/components/file-uploader/src/FileUploaderDropzone.tsx b/packages/paste-core/components/file-uploader/src/FileUploaderDropzone.tsx index 8aa61e14bb..42d9e6ad84 100644 --- a/packages/paste-core/components/file-uploader/src/FileUploaderDropzone.tsx +++ b/packages/paste-core/components/file-uploader/src/FileUploaderDropzone.tsx @@ -87,7 +87,7 @@ const baseStyles: BoxStyleProps = { }; const disabledStyles: BoxStyleProps = { - backgroundColor: "colorBackgroundStrong", + backgroundColor: "colorBackground", borderStyle: "solid", borderColor: "colorBorderWeaker", cursor: "not-allowed", diff --git a/packages/paste-core/components/input-box/src/FauxInput/DefaultFauxInput.tsx b/packages/paste-core/components/input-box/src/FauxInput/DefaultFauxInput.tsx index e859af0bee..0c11c618ec 100644 --- a/packages/paste-core/components/input-box/src/FauxInput/DefaultFauxInput.tsx +++ b/packages/paste-core/components/input-box/src/FauxInput/DefaultFauxInput.tsx @@ -36,7 +36,7 @@ const DefaultFauxInput = React.forwardRef( width="100%" backgroundColor={backgroundColor} boxShadow={boxShadow} - borderRadius="borderRadius20" + borderRadius="borderRadius30" color="colorTextInverse" transition="box-shadow 100ms ease-in" cursor={disabled ? "not-allowed" : "text"} diff --git a/packages/paste-core/components/input-box/src/Prefix.tsx b/packages/paste-core/components/input-box/src/Prefix.tsx index dc6cea6e9e..653fbf80aa 100644 --- a/packages/paste-core/components/input-box/src/Prefix.tsx +++ b/packages/paste-core/components/input-box/src/Prefix.tsx @@ -33,8 +33,8 @@ const Prefix = React.forwardRef( ( { expect(renderedInputPrefix).toHaveStyleRule("background-color", "rgb(0, 20, 137)"); expect(renderedInputSuffix).toHaveStyleRule("background-color", "rgb(0, 20, 137)"); expect(renderedIncrement).toHaveStyleRule("background-color", "rgb(245, 240, 252)"); - expect(renderedDecrement).toHaveStyleRule("background-color", "rgb(214, 31, 31)"); + expect(renderedDecrement).toHaveStyleRule("background-color", "rgb(219, 19, 42)"); }); it("should add custom styles to Input with a custom element data attribute", (): void => { @@ -388,7 +388,7 @@ describe("Customization", () => { expect(renderedInputPrefix).toHaveStyleRule("background-color", "rgb(244, 244, 246)"); expect(renderedInputSuffix).toHaveStyleRule("background-color", "rgb(244, 244, 246)"); expect(renderedIncrement).toHaveStyleRule("background-color", "rgb(245, 240, 252)"); - expect(renderedDecrement).toHaveStyleRule("background-color", "rgb(214, 31, 31)"); + expect(renderedDecrement).toHaveStyleRule("background-color", "rgb(219, 19, 42)"); }); it("should add custom styles to a Input variant with a custom element data attribute", (): void => { diff --git a/packages/paste-core/components/input/stories/input.stories.tsx b/packages/paste-core/components/input/stories/input.stories.tsx index cbe1bcbe89..db04a4ea22 100644 --- a/packages/paste-core/components/input/stories/input.stories.tsx +++ b/packages/paste-core/components/input/stories/input.stories.tsx @@ -587,7 +587,7 @@ export const InputDisabledInsertBeforeAndAfterInverse = (): React.ReactNode => { onBlur={action("handleBlur")} variant="inverse" insertBefore={ - + $10.99 } diff --git a/packages/paste-core/components/label/package.json b/packages/paste-core/components/label/package.json index 42f6a478d2..cafcd6a351 100644 --- a/packages/paste-core/components/label/package.json +++ b/packages/paste-core/components/label/package.json @@ -35,6 +35,7 @@ "@twilio-paste/screen-reader-only": "^14.0.0", "@twilio-paste/style-props": "^10.0.0", "@twilio-paste/styling-library": "^4.0.0", + "@twilio-paste/text": "^11.0.1", "@twilio-paste/theme": "^12.0.0", "@twilio-paste/types": "^7.0.0", "@twilio-paste/uid-library": "^3.0.0", @@ -54,6 +55,7 @@ "@twilio-paste/screen-reader-only": "^14.0.1", "@twilio-paste/style-props": "^10.0.1", "@twilio-paste/styling-library": "^4.0.1", + "@twilio-paste/text": "^11.0.1", "@twilio-paste/theme": "^12.0.1", "@twilio-paste/types": "^7.0.1", "@twilio-paste/uid-library": "^3.0.1", diff --git a/packages/paste-core/components/label/src/Label.tsx b/packages/paste-core/components/label/src/Label.tsx index 08dc46676c..42299005af 100644 --- a/packages/paste-core/components/label/src/Label.tsx +++ b/packages/paste-core/components/label/src/Label.tsx @@ -2,6 +2,7 @@ import { Box, safelySpreadBoxProps } from "@twilio-paste/box"; import type { BoxProps } from "@twilio-paste/box"; import { MediaBody, MediaFigure, MediaObject } from "@twilio-paste/media-object"; import type { TextColor } from "@twilio-paste/style-props"; +import { Text } from "@twilio-paste/text"; import type { HTMLPasteProps } from "@twilio-paste/types"; import * as React from "react"; @@ -31,6 +32,13 @@ type LabelBaseProps = { * @memberof LabelBaseProps */ required?: boolean; + /** + * Shows the input is optional. + * + * @type {boolean} + * @memberof LabelBaseProps + */ + optional?: boolean; /** * * @type {LabelVariants} @@ -44,6 +52,13 @@ type LabelBaseProps = { * @memberof LabelBaseProps */ i18nRequiredLabel?: string; + /** + * Label text for the optional label. + * + * @type {string} + * @memberof LabelBaseProps + */ + i18nOptionalLabel?: string; /** * Overrides the default element name to apply unique styles with the Customization Provider * @@ -83,11 +98,13 @@ const Label = React.forwardRef( as = "label", marginBottom, required, + optional, disabled, children, variant, element = "LABEL", i18nRequiredLabel = "", + i18nOptionalLabel = "(optional)", ...props }, ref, @@ -124,7 +141,7 @@ const Label = React.forwardRef( textTransform="none" element={element} fontSize="fontSize30" - fontWeight="fontWeightSemibold" + fontWeight="fontWeightMedium" lineHeight="lineHeight30" color={textColor} cursor={cursor} @@ -136,7 +153,20 @@ const Label = React.forwardRef( )} - {children} + + {children} + {optional && ( + + {i18nOptionalLabel} + + )} + ); diff --git a/packages/paste-core/components/label/src/RequiredDot.tsx b/packages/paste-core/components/label/src/RequiredDot.tsx index acb467e725..0b3b8f3793 100644 --- a/packages/paste-core/components/label/src/RequiredDot.tsx +++ b/packages/paste-core/components/label/src/RequiredDot.tsx @@ -40,6 +40,7 @@ export const RequiredDot: React.FC> = display="block" height="4px" width="4px" + position="relative" element={element} > {i18nLabel} diff --git a/packages/paste-core/components/label/stories/label.stories.tsx b/packages/paste-core/components/label/stories/label.stories.tsx index 3c8d577f8e..9f3ac06b32 100644 --- a/packages/paste-core/components/label/stories/label.stories.tsx +++ b/packages/paste-core/components/label/stories/label.stories.tsx @@ -22,6 +22,9 @@ export const Default = (): React.ReactNode => { + ); }; @@ -35,6 +38,9 @@ export const Disabled = (): React.ReactNode => { + ); }; @@ -48,6 +54,9 @@ export const Inverse = (): React.ReactNode => { + ); }; @@ -78,6 +87,9 @@ export const Customized: Story = () => { + @@ -100,6 +112,9 @@ export const Customized: Story = () => { + @@ -114,6 +129,7 @@ export const Customized: Story = () => { FOO_REQUIRED_DOT: { backgroundColor: "colorBackgroundDestructiveStrong" }, BAR: { backgroundColor: "colorBackgroundDestructiveStrong" }, BAR_WRAPPER: { cursor: "help" }, + TAR_OPTIONAL_TEXT: { fontStyle: "normal", color: "colorTextWarningStrong" }, }} >