@wordpress/components
Version:
UI components for WordPress.
175 lines (150 loc) • 3.9 kB
text/typescript
/**
* External dependencies
*/
import styled from '@emotion/styled';
import { css } from '@emotion/react';
/**
* Internal dependencies
*/
import {
StyledField as BaseControlField,
StyledHelp as BaseControlHelp,
Wrapper as BaseControlWrapper,
} from '../base-control/styles/base-control-styles';
import { LabelWrapper } from '../input-control/styles/input-control-styles';
import { COLORS, CONFIG, rtl } from '../utils';
import { space } from '../utils/space';
const toolsPanelGrid = {
columns: ( columns: number ) => css`
grid-template-columns: ${ `repeat( ${ columns }, minmax(0, 1fr) )` };
`,
spacing: css`
column-gap: ${ space( 4 ) };
row-gap: ${ space( 4 ) };
`,
item: {
fullWidth: css`
grid-column: 1 / -1;
`,
},
};
export const ToolsPanel = ( columns: number ) => css`
${ toolsPanelGrid.columns( columns ) }
${ toolsPanelGrid.spacing }
border-top: ${ CONFIG.borderWidth } solid ${ COLORS.gray[ 300 ] };
margin-top: -1px;
padding: ${ space( 4 ) };
`;
/**
* Items injected into a ToolsPanel via a virtual bubbling slot will require
* an inner dom element to be injected. The following rule allows for the
* CSS grid display to be re-established.
*/
export const ToolsPanelWithInnerWrapper = ( columns: number ) => {
return css`
> div:not( :first-of-type ) {
display: grid;
${ toolsPanelGrid.columns( columns ) }
${ toolsPanelGrid.spacing }
${ toolsPanelGrid.item.fullWidth }
}
`;
};
export const ToolsPanelHiddenInnerWrapper = css`
> div:not( :first-of-type ) {
display: none;
}
`;
export const ToolsPanelHeader = css`
${ toolsPanelGrid.item.fullWidth }
gap: ${ space( 2 ) };
/**
* The targeting of dropdown menu component classes here is a temporary
* measure only.
*
* The following styles should be replaced once the DropdownMenu has been
* refactored and can be targeted via component interpolation.
*/
.components-dropdown-menu {
margin: ${ space( -1 ) } 0;
line-height: 0;
}
&&&& .components-dropdown-menu__toggle {
padding: 0;
min-width: ${ space( 6 ) };
}
`;
export const ToolsPanelHeading = css`
font-size: inherit;
font-weight: ${ CONFIG.fontWeightMedium };
line-height: normal;
/* Required to meet specificity requirements to ensure zero margin */
&& {
margin: 0;
}
`;
export const ToolsPanelItem = css`
${ toolsPanelGrid.item.fullWidth }
/* Clear spacing in and around controls added as panel items. */
/* Remove when they can be addressed via context system. */
& > div,
& > fieldset {
padding-bottom: 0;
margin-bottom: 0;
max-width: 100%;
}
/* Remove BaseControl components margins and leave spacing to grid layout */
&& ${ BaseControlWrapper } {
margin-bottom: 0;
/**
* To maintain proper spacing within a base control, the field's bottom
* margin should only be removed when there is no help text included and
* it is therefore the last-child.
*/
${ BaseControlField }:last-child {
margin-bottom: 0;
}
}
${ BaseControlHelp } {
margin-bottom: 0;
}
/**
* Standardize InputControl and BaseControl labels with other labels when
* inside ToolsPanel.
*
* This is a temporary fix until the different control components have their
* labels normalized.
*/
&& ${ LabelWrapper } {
label {
line-height: 1.4em;
}
}
`;
export const ToolsPanelItemPlaceholder = css`
display: none;
`;
export const DropdownMenu = css`
min-width: 200px;
`;
export const ResetLabel = styled.span`
color: ${ COLORS.theme.accentDarker10 };
font-size: 11px;
font-weight: ${ CONFIG.fontWeightMedium };
line-height: 1.4;
${ rtl( { marginLeft: space( 3 ) } ) }
text-transform: uppercase;
`;
export const DefaultControlsItem = css`
color: ${ COLORS.gray[ 900 ] };
&&[aria-disabled='true'] {
color: ${ COLORS.gray[ 700 ] };
opacity: 1;
&:hover {
color: ${ COLORS.gray[ 700 ] };
}
${ ResetLabel } {
opacity: 0.3;
}
}
`;