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}
-
-
-
-
+ {/* extra box to add proper margin since li is based on absolute positioning */}
+
+
+
+ {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" },
}}
>