diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f22d0556d..5c12742799 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Fixes - Fix `ChatMessage`'s focus border overlays `actionMenu` in Teams theme @mnajdova ([#1637](https://github.com/stardust-ui/react/pull/1637)) +- Update `Checkbox` files for Teams Theme to match [redlines] @bcalvery ([#1656](https://github.com/stardust-ui/react/pull/1656)) - Add `color` prop to `Segment` typings @layershifter ([#1702](https://github.com/stardust-ui/react/pull/1702)) - Remove `color` prop from `Dialog` typings @layershifter ([#1702](https://github.com/stardust-ui/react/pull/1702)) - `Loader` uses `Text` component for `label` slot instead of `Box` @layershifter ([#1701](https://github.com/stardust-ui/react/pull/1701)) diff --git a/docs/src/examples/components/Checkbox/States/CheckboxExampleDisabled.shorthand.tsx b/docs/src/examples/components/Checkbox/States/CheckboxExampleDisabled.shorthand.tsx index 34cba0c868..4a25211c04 100644 --- a/docs/src/examples/components/Checkbox/States/CheckboxExampleDisabled.shorthand.tsx +++ b/docs/src/examples/components/Checkbox/States/CheckboxExampleDisabled.shorthand.tsx @@ -5,6 +5,9 @@ const CheckboxExampleDisabled = () => ( <> +
+ + ) diff --git a/packages/react/src/components/Checkbox/Checkbox.tsx b/packages/react/src/components/Checkbox/Checkbox.tsx index 08d69974e4..f97dbbed85 100644 --- a/packages/react/src/components/Checkbox/Checkbox.tsx +++ b/packages/react/src/components/Checkbox/Checkbox.tsx @@ -19,6 +19,11 @@ import { Accessibility } from '../../lib/accessibility/types' import { checkboxBehavior } from '../../lib/accessibility' import { SupportedIntrinsicInputProps } from '../../lib/htmlPropsUtils' +export interface CheckboxSlotClassNames { + label: string + indicator: string +} + export interface CheckboxProps extends UIComponentProps, ChildrenComponentProps { /** Accessibility behavior if overridden by the user. */ accessibility?: Accessibility @@ -65,6 +70,8 @@ export interface CheckboxState { } class Checkbox extends AutoControlledComponent, CheckboxState> { + static slotClassNames: CheckboxSlotClassNames + static create: Function static displayName = 'Checkbox' @@ -141,6 +148,7 @@ class Checkbox extends AutoControlledComponent, Checkb const labelElement = Text.create(label, { defaultProps: { styles: styles.label, + className: Checkbox.slotClassNames.label, }, }) @@ -157,6 +165,9 @@ class Checkbox extends AutoControlledComponent, Checkb {labelPosition === 'start' && labelElement} {Icon.create(icon, { defaultProps: { + outline: toggle && !this.state.checked, + size: toggle ? 'medium' : 'smaller', + className: Checkbox.slotClassNames.indicator, name: toggle ? 'stardust-circle' : 'stardust-checkmark', styles: toggle ? styles.toggle : styles.checkbox, }, @@ -167,6 +178,11 @@ class Checkbox extends AutoControlledComponent, Checkb } } +Checkbox.slotClassNames = { + label: `${Checkbox.className}__label`, + indicator: `${Checkbox.className}__indicator`, +} + Checkbox.create = createShorthandFactory({ Component: Checkbox, mappedProp: 'label', diff --git a/packages/react/src/themes/base/components/Checkbox/checkboxStyles.ts b/packages/react/src/themes/base/components/Checkbox/checkboxStyles.ts index 928709d56d..9d133077ae 100644 --- a/packages/react/src/themes/base/components/Checkbox/checkboxStyles.ts +++ b/packages/react/src/themes/base/components/Checkbox/checkboxStyles.ts @@ -11,10 +11,9 @@ const checkboxStyles: ComponentSlotStylesInput ({ - checkboxBackground: 'transparent', - checkboxBorderColor: siteVars.colors.grey[300], - checkboxBorderStyle: `solid`, - checkboxBorderRadius: pxToRem(4), - checkboxBorderWidth: pxToRem(1), + background: 'transparent', + borderColor: siteVars.colors.grey[300], + borderStyle: `solid`, + borderRadius: pxToRem(4), + borderWidth: pxToRem(1), checkboxColor: 'transparent', - checkboxGap: pxToRem(12), - checkboxMargin: '0', - checkboxPadding: '0', + gap: pxToRem(12), + margin: '0', + padding: '0', toggleBackground: 'transparent', toggleBorderColor: siteVars.colors.grey[300], toggleBorderStyle: `solid`, toggleBorderRadius: pxToRem(999), toggleBorderWidth: pxToRem(1), - toggleColor: 'inherit', + toggleIndicatorColor: 'inherit', toggleMargin: '0', togglePadding: `0 ${pxToRem(20)} 0 0`, - checkedCheckboxBackground: 'transparent', - checkedCheckboxBorderColor: siteVars.colors.grey[500], - checkedCheckboxColor: siteVars.colors.grey[500], - checkedToggleBackground: 'transparent', - checkedToggleBorderColor: siteVars.colors.grey[500], - checkedToggleColor: 'inherit', - checkedTogglePadding: `0 0 0 ${pxToRem(20)}`, + checkedBackground: 'transparent', + checkedBorderColor: siteVars.colors.grey[500], + checkboxCheckedColor: siteVars.colors.grey[500], + checkboxToggleCheckedBackground: 'transparent', + checkboxToggleCheckedBorderColor: siteVars.colors.grey[500], + checkboxToggleCheckedColor: 'inherit', + toggleCheckedPadding: `0 0 0 ${pxToRem(20)}`, disabledColor: siteVars.colors.grey[300], - disabledCheckboxBackground: siteVars.colors.grey[200], - disabledCheckboxBorderColor: siteVars.colors.grey[100], + disabledBackground: siteVars.colors.grey[200], + disabledBorderColor: siteVars.colors.grey[100], disabledCheckboxColor: siteVars.colors.grey[300], disabledToggleBackground: 'transparent', disabledToggleBorderColor: siteVars.colors.grey[200], - disabledToggleColor: siteVars.colors.grey[300], - - padding: `0 ${pxToRem(4)}`, + disabledToggleIndicatorColor: siteVars.colors.grey[300], }) diff --git a/packages/react/src/themes/teams-high-contrast/componentVariables.ts b/packages/react/src/themes/teams-high-contrast/componentVariables.ts index 4af1bd9a64..99b45deb42 100644 --- a/packages/react/src/themes/teams-high-contrast/componentVariables.ts +++ b/packages/react/src/themes/teams-high-contrast/componentVariables.ts @@ -3,6 +3,7 @@ export { default as Avatar } from './components/Avatar/avatarVariables' export { default as Button } from './components/Button/buttonVariables' export { default as Chat } from './components/Chat/chatVariables' export { default as ChatMessage } from './components/Chat/chatMessageVariables' +export { default as Checkbox } from './components/Checkbox/checkboxVariables' export { default as Dialog } from './components/Dialog/dialogVariables' export { default as Divider } from './components/Divider/dividerVariables' export { default as Header } from './components/Header/headerVariables' diff --git a/packages/react/src/themes/teams-high-contrast/components/Checkbox/checkboxVariables.ts b/packages/react/src/themes/teams-high-contrast/components/Checkbox/checkboxVariables.ts new file mode 100644 index 0000000000..0a4dd135da --- /dev/null +++ b/packages/react/src/themes/teams-high-contrast/components/Checkbox/checkboxVariables.ts @@ -0,0 +1,8 @@ +import { CheckboxVariables } from '../../../teams/components/Checkbox/checkboxVariables' + +export default (siteVars: any): Partial => { + return { + borderColorHover: siteVars.accessibleYellow, + disabledToggleIndicatorColor: siteVars.accessibleGreen, + } +} diff --git a/packages/react/src/themes/teams/components/Checkbox/checkboxStyles.ts b/packages/react/src/themes/teams/components/Checkbox/checkboxStyles.ts index cd5a4205ff..8b7781f596 100644 --- a/packages/react/src/themes/teams/components/Checkbox/checkboxStyles.ts +++ b/packages/react/src/themes/teams/components/Checkbox/checkboxStyles.ts @@ -1,14 +1,112 @@ import { ComponentSlotStylesInput, ICSSInJSStyle } from '../../../types' -import { CheckboxProps, CheckboxState } from '../../../../components/Checkbox/Checkbox' +import Checkbox, { CheckboxProps, CheckboxState } from '../../../../components/Checkbox/Checkbox' import { CheckboxVariables } from './checkboxVariables' import getBorderFocusStyles from '../../getBorderFocusStyles' const checkboxStyles: ComponentSlotStylesInput = { root: ({ props: p, variables: v, theme: t }): ICSSInJSStyle => ({ + color: v.textColor, + padding: v.rootPadding, + verticalAlign: 'middle', + ...getBorderFocusStyles({ siteVariables: t.siteVariables, isFromKeyboard: p.isFromKeyboard, + borderRadius: '3px', + }), + + ':hover': { + color: v.textColorHover, + + [`& .${Checkbox.slotClassNames.indicator}`]: { + ...(p.checked && { + background: v.checkedBackgroundHover, + }), + + ...(!p.checked && { + borderColor: v.borderColorHover, + + ...(p.toggle && { + color: v.borderColorHover, + }), + }), + }, + }, + + ...(p.checked && { + color: v.checkedTextColor, + }), + + ...(p.disabled && { + pointerEvents: 'none', + color: v.disabledColor, + }), + }), + + checkbox: ({ props: p, variables: v }): ICSSInJSStyle => ({ + background: v.background, + borderColor: v.borderColor, + borderStyle: v.borderStyle, + borderRadius: v.borderRadius, + borderWidth: v.borderWidth, + color: v.indicatorColor, + margin: v.margin, + padding: v.padding, + + ...(p.checked && { + background: v.checkedBackground, + borderColor: v.checkedBorderColor, + color: v.checkedIndicatorColor, + }), + + ...(p.disabled && { + background: v.disabledBackground, + borderColor: v.disabledBorderColor, + }), + + ...(p.disabled && + p.checked && { + color: v.disabledCheckedIndicatorColor, + background: v.disabledBackgroundChecked, + borderColor: 'transparent', + }), + }), + + toggle: ({ props: p, variables: v }): ICSSInJSStyle => ({ + background: v.background, + borderColor: v.borderColor, + borderStyle: v.borderStyle, + borderRadius: v.toggleBorderRadius, + borderWidth: v.borderWidth, + color: v.borderColor, + margin: v.toggleMargin, + padding: v.togglePadding, + transition: 'padding .3s ease', + + [`& svg`]: { + width: v.toggleIndicatorSize, + height: v.toggleIndicatorSize, + }, + + ...(p.checked && { + background: v.checkedBackground, + borderColor: v.checkedBorderColor, + color: v.checkedIndicatorColor, + padding: v.toggleCheckedPadding, }), + + ...(p.disabled && { + color: v.disabledToggleIndicatorColor, + background: v.disabledBackground, + borderColor: v.disabledBorderColor, + }), + + ...(p.disabled && + p.checked && { + color: v.disabledCheckedIndicatorColor, + background: v.disabledBackgroundChecked, + borderColor: 'transparent', + }), }), } diff --git a/packages/react/src/themes/teams/components/Checkbox/checkboxVariables.ts b/packages/react/src/themes/teams/components/Checkbox/checkboxVariables.ts index c100676dc3..22d2ce7486 100644 --- a/packages/react/src/themes/teams/components/Checkbox/checkboxVariables.ts +++ b/packages/react/src/themes/teams/components/Checkbox/checkboxVariables.ts @@ -1,22 +1,73 @@ import { CheckboxVariables as BaseCheckboxVariables } from '../../../base/components/Checkbox/checkboxVariables' +import { pxToRem } from '../../../../lib' +import * as _ from 'lodash' -export type CheckboxVariables = Partial +export type CheckboxVariables = Partial & { + rootPadding: string + + textColor: string + indicatorColor: string + + textColorHover: string + borderColorHover: string + checkedBackgroundHover: string + checkedTextColor: string + checkedIndicatorColor: string + + toggleIndicatorSize: string + toggleCheckedPadding: string + + disabledBackgroundChecked: string + disabledCheckedIndicatorColor: string +} + +const toggleMovementDistance = pxToRem(20) +const padding = pxToRem(2) +const defaultValue = 'red' export default (siteVars: any): CheckboxVariables => ({ - checkboxBorderColor: siteVars.colors.grey[750], - - toggleColor: siteVars.colors.brand[600], - - checkedCheckboxBackground: siteVars.colors.brand[600], - checkedCheckboxBorderColor: siteVars.colors.brand[600], - checkedCheckboxColor: siteVars.colors.white, - checkedToggleBackground: siteVars.colors.brand[600], - checkedToggleBorderColor: siteVars.colors.brand[600], - checkedToggleColor: siteVars.colors.white, - - disabledColor: siteVars.colors.grey[250], - disabledCheckboxBackground: siteVars.colors.grey[250], - disabledCheckboxBorderColor: siteVars.colors.grey[250], - disabledToggleBackground: siteVars.colors.grey[250], - disabledToggleBorderColor: siteVars.colors.grey[250], + textColor: _.get(siteVars, 'colorScheme.default.foreground1', defaultValue), + background: _.get(siteVars, 'colorScheme.default.background', defaultValue), + borderColor: _.get(siteVars, 'colorScheme.default.foreground1', defaultValue), + borderStyle: 'solid', + borderRadius: pxToRem(3), + borderWidth: pxToRem(1), + indicatorColor: 'transparent', + gap: pxToRem(12), + margin: `${pxToRem(20)}, 0`, + padding, + rootPadding: '3px 5px', + + textColorHover: _.get(siteVars, 'colorScheme.default.foreground', defaultValue), + borderColorHover: _.get(siteVars, 'colorScheme.default.foreground', defaultValue), + checkedBackgroundHover: _.get(siteVars, 'colorScheme.brand.backgroundHover', defaultValue), + + toggleBorderRadius: pxToRem(999), + toggleIndicatorSize: pxToRem(14), + toggleMargin: `${pxToRem(20)}, 0`, + togglePadding: `${padding} ${toggleMovementDistance} ${padding} ${padding}`, + + checkedTextColor: _.get(siteVars, 'colorScheme.default.foreground', defaultValue), + checkedBackground: _.get(siteVars, 'colorScheme.brand.backgroundActive1', defaultValue), + checkedBorderColor: 'transparent', + checkedIndicatorColor: _.get(siteVars, 'colorScheme.default.background', defaultValue), + toggleCheckedPadding: `${padding} ${padding} ${padding} ${toggleMovementDistance}`, + + disabledBackground: _.get(siteVars, 'colorScheme.default.background', defaultValue), + disabledBackgroundChecked: _.get( + siteVars, + 'colorScheme.default.backgroundDisabled', + defaultValue, + ), + disabledBorderColor: _.get(siteVars, 'colorScheme.default.foregroundDisabled1', defaultValue), + disabledCheckedIndicatorColor: _.get( + siteVars, + 'colorScheme.default.foregroundDisabled', + defaultValue, + ), + disabledToggleIndicatorColor: _.get( + siteVars, + 'colorScheme.default.foregroundDisabled', + defaultValue, + ), }) diff --git a/packages/react/src/themes/teams/components/Icon/svg/icons/stardustCircle.tsx b/packages/react/src/themes/teams/components/Icon/svg/icons/stardustCircle.tsx index 650ea6ca25..820ccb33fe 100644 --- a/packages/react/src/themes/teams/components/Icon/svg/icons/stardustCircle.tsx +++ b/packages/react/src/themes/teams/components/Icon/svg/icons/stardustCircle.tsx @@ -7,7 +7,7 @@ export default { icon: ({ classes }) => ( - +