Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/dataviews/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### Enhancements

- Simplify field normalization and types. [#73387](https://github.com/WordPress/gutenberg/pull/73387)
- DataViews and DataViewsPicker: add padding prop to control outer padding. [#72989](https://github.com/WordPress/gutenberg/pull/72989)
- DataViews table layout: make checkboxes permanently visible when bulk actions are available. [#73245](https://github.com/WordPress/gutenberg/pull/73245)
- DataViews: Make sticky elements (table headers, footer, actions column) inherit background colors from parent container. This allows DataViews instances to seamlessly adapt to containers with custom background colors. [#73240](https://github.com/WordPress/gutenberg/pull/73240)
- DataViews table layout: only apply hover styles when bulk actions are available. [#73248](https://github.com/WordPress/gutenberg/pull/73248)
Expand Down
10 changes: 8 additions & 2 deletions packages/dataviews/src/components/dataviews-footer/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
bottom: 0;
left: 0;
background-color: inherit;
padding: $grid-unit-15 $grid-unit-60;
padding-block-start: $grid-unit-15;
padding-block-end: var(--wp-dataviews-padding-block-end, #{$grid-unit-15});
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-60});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-60});
border-top: $border-width solid $gray-100;
flex-shrink: 0;

Expand All @@ -20,7 +23,10 @@

@container (max-width: 430px) {
.dataviews-footer {
padding: $grid-unit-15 $grid-unit-30;
padding-block-start: $grid-unit-15;
padding-block-end: var(--wp-dataviews-padding-block-end, #{$grid-unit-15});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I asked the same question in the other place, resurfacing here as well:

I've noticed that we're using --wp-* in existing components, and --wpds- in other places. When do we use one, and when do we use another? I haven't found anything that clarifies that, and would like to understand which one should we use here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--wpds- tokens come from from the Theme package and are consumed by the components in the new UI package.

Eventually we'll want this variable to reference one of those tokens for the fallback instead of grid-unit-15. E.g.:

var(--wp-dataviews-padding-block-end, --wpds-dimension-padding-surface-lg)

I don't have any strong feelings about how the DataView-specific variables should be named.

padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/**
* Internal dependencies
*/
import type {
PaddingSize,
PaddingOptions,
DimensionVariant,
} from '../../types/private';

/**
* Maps padding size tokens to CSS values.
* Aligned with the Card component's spacing scale (space function with 4px base):
* - x-small: space(2) = 8px
* - small: space(4) = 16px
* - medium: space(6) = 24px
* - large: space(8) = 32px
* - x-large: space(12) = 48px
*/
const paddingValuesBySize: Record< PaddingSize, string > = {
'x-small': '8px',
small: '16px',
medium: '24px',
large: '32px',
'x-large': '48px',
none: '0',
};
Comment on lines +10 to +26
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very happy for feedback on the naming and sizing of this, maybe x-large should be 40px and there should be an xx-large with 48px? My hunch is that we'll want 48px to be in the scale as that's the current padding.


/**
* Gets the CSS value for a single padding size token.
*
* @param size The padding size token.
* @return The CSS value for the padding size.
*/
function getSinglePaddingValue( size: PaddingSize ): string {
return paddingValuesBySize[ size ];
}

/**
* Converts padding options into CSS custom property style values.
* Returns an object with the appropriate CSS custom properties set.
* When padding is undefined, returns an empty object to allow SCSS
* defaults and container queries to apply.
*
* @param padding The padding option (single size or directional variants), or undefined to use SCSS defaults
* @return An object with CSS custom property values, or empty object to use SCSS defaults
*/
export function getPaddingBySizeStyles(
padding: PaddingOptions | undefined
): Record< string, string > {
const styles: Record< string, string > = {};

// Handle string-based sizes (single value applied to all directional variants)
if ( typeof padding === 'string' ) {
const value = getSinglePaddingValue( padding );
styles[ '--wp-dataviews-padding-block-start' ] = value;
styles[ '--wp-dataviews-padding-block-end' ] = value;
styles[ '--wp-dataviews-padding-inline-start' ] = value;
styles[ '--wp-dataviews-padding-inline-end' ] = value;
return styles;
}

// If no padding specified, return empty object to use SCSS defaults
if ( ! padding ) {
return styles;
}

// Handle object with directional variants
const { block, blockStart, blockEnd, inline, inlineStart, inlineEnd } =
padding as DimensionVariant< PaddingSize >;

if ( block !== undefined ) {
const value = getSinglePaddingValue( block );
if ( blockStart === undefined ) {
styles[ '--wp-dataviews-padding-block-start' ] = value;
}
if ( blockEnd === undefined ) {
styles[ '--wp-dataviews-padding-block-end' ] = value;
}
}

if ( blockStart !== undefined ) {
styles[ '--wp-dataviews-padding-block-start' ] =
getSinglePaddingValue( blockStart );
}

if ( blockEnd !== undefined ) {
styles[ '--wp-dataviews-padding-block-end' ] =
getSinglePaddingValue( blockEnd );
}

if ( inline !== undefined ) {
const value = getSinglePaddingValue( inline );
if ( inlineStart === undefined ) {
styles[ '--wp-dataviews-padding-inline-start' ] = value;
}
if ( inlineEnd === undefined ) {
styles[ '--wp-dataviews-padding-inline-end' ] = value;
}
}

if ( inlineStart !== undefined ) {
styles[ '--wp-dataviews-padding-inline-start' ] =
getSinglePaddingValue( inlineStart );
}

if ( inlineEnd !== undefined ) {
styles[ '--wp-dataviews-padding-inline-end' ] =
getSinglePaddingValue( inlineEnd );
}

return styles;
}
20 changes: 18 additions & 2 deletions packages/dataviews/src/components/dataviews-picker/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ import DataViewsViewConfig, {
} from '../dataviews-view-config';
import normalizeFields from '../../field-types/utils/normalize-fields';
import type { ActionButton, Field, View, SupportedLayouts } from '../../types';
import type { SelectionOrUpdater } from '../../types/private';
import type { SelectionOrUpdater, PaddingOptions } from '../../types/private';
import { getPaddingBySizeStyles } from './get-padding-by-size';
type ItemWithId = { id: string };

const isItemClickable = () => false;
Expand Down Expand Up @@ -63,6 +64,11 @@ type DataViewsPickerProps< Item > = {
};
itemListLabel?: string;
empty?: ReactNode;
/**
* Determines the amount of padding within the component.
* When not provided, the default SCSS padding values are used.
*/
padding?: PaddingOptions;
} & ( Item extends ItemWithId
? { getItemId?: ( item: Item ) => string }
: { getItemId: ( item: Item ) => string } );
Expand Down Expand Up @@ -128,6 +134,7 @@ function DataViewsPicker< Item >( {
config = { perPageSizes: [ 10, 20, 50, 100 ] },
itemListLabel,
empty,
padding,
}: DataViewsPickerProps< Item > ) {
const { infiniteScrollHandler } = paginationInfo;
const containerRef = useRef< HTMLDivElement | null >( null );
Expand Down Expand Up @@ -209,6 +216,11 @@ function DataViewsPicker< Item >( {
[ defaultLayoutsProperty ]
);

const paddingStyles = useMemo(
() => getPaddingBySizeStyles( padding ),
[ padding ]
);

if ( ! defaultLayouts[ view.type ] ) {
return null;
}
Expand Down Expand Up @@ -242,7 +254,11 @@ function DataViewsPicker< Item >( {
hasInfiniteScrollHandler: !! infiniteScrollHandler,
} }
>
<div className="dataviews-picker-wrapper" ref={ containerRef }>
<div
className="dataviews-picker-wrapper"
style={ paddingStyles as React.CSSProperties }
ref={ containerRef }
>
{ children ?? (
<DefaultUI search={ search } searchLabel={ searchLabel } />
) }
Expand Down
20 changes: 18 additions & 2 deletions packages/dataviews/src/components/dataviews/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ import DataViewsViewConfig, {
} from '../dataviews-view-config';
import normalizeFields from '../../field-types/utils/normalize-fields';
import type { Action, Field, View, SupportedLayouts } from '../../types';
import type { SelectionOrUpdater } from '../../types/private';
import type { SelectionOrUpdater, PaddingOptions } from '../../types/private';
import { getPaddingBySizeStyles } from '../dataviews-picker/get-padding-by-size';
type ItemWithId = { id: string };

type DataViewsProps< Item > = {
Expand Down Expand Up @@ -66,6 +67,11 @@ type DataViewsProps< Item > = {
perPageSizes: number[];
};
empty?: ReactNode;
/**
* Determines the amount of padding within the component.
* When not provided, the default SCSS padding values are used.
*/
padding?: PaddingOptions;
} & ( Item extends ItemWithId
? { getItemId?: ( item: Item ) => string }
: { getItemId: ( item: Item ) => string } );
Expand Down Expand Up @@ -142,6 +148,7 @@ function DataViews< Item >( {
children,
config = { perPageSizes: [ 10, 20, 50, 100 ] },
empty,
padding,
}: DataViewsProps< Item > ) {
const { infiniteScrollHandler } = paginationInfo;
const containerRef = useRef< HTMLDivElement | null >( null );
Expand Down Expand Up @@ -236,6 +243,11 @@ function DataViews< Item >( {
[ defaultLayoutsProperty ]
);

const paddingStyles = useMemo(
() => getPaddingBySizeStyles( padding ),
[ padding ]
);

if ( ! defaultLayouts[ view.type ] ) {
return null;
}
Expand Down Expand Up @@ -271,7 +283,11 @@ function DataViews< Item >( {
hasInfiniteScrollHandler: !! infiniteScrollHandler,
} }
>
<div className="dataviews-wrapper" ref={ containerRef }>
<div
className="dataviews-wrapper"
style={ paddingStyles as React.CSSProperties }
ref={ containerRef }
>
{ children ?? (
<DefaultUI
header={ header }
Expand Down
22 changes: 16 additions & 6 deletions packages/dataviews/src/components/dataviews/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
.dataviews__view-actions,
.dataviews-filters__container {
box-sizing: border-box;
padding: $grid-unit-20 $grid-unit-60;
padding-block-start: var(--wp-dataviews-padding-block-start, #{$grid-unit-20});
padding-block-end: $grid-unit-20;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-60});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-60});
flex-shrink: 0;
position: sticky;
left: 0;
Expand All @@ -33,7 +36,9 @@

.dataviews-no-results,
.dataviews-loading {
padding: 0 $grid-unit-60;
padding-block: 0;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-60});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-60});
flex-grow: 1;
display: flex;
align-items: center;
Expand All @@ -51,13 +56,17 @@
@container (max-width: 430px) {
.dataviews__view-actions,
.dataviews-filters__container {
padding: $grid-unit-15 $grid-unit-30;
padding-block-start: var(--wp-dataviews-padding-block-start, #{$grid-unit-15});
padding-block-end: $grid-unit-15;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
}

.dataviews-no-results,
.dataviews-loading {
padding-left: $grid-unit-30;
padding-right: $grid-unit-30;
padding-block: 0;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
}
}

Expand Down Expand Up @@ -122,7 +131,8 @@
.dataviews-view-grid,
.dataviews-loading,
.dataviews-no-results {
padding-inline: $grid-unit-30;
padding-inline-start: $grid-unit-30;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding was that the benefit of introducing an API for styling DataViews was that we'd no longer need container specific styles. Why do we still require these styles for the card? Shouldn't they be removed?

padding-inline-end: $grid-unit-30;
}

.dataviews-view-table tr td:first-child,
Expand Down
8 changes: 5 additions & 3 deletions packages/dataviews/src/dataviews-layouts/grid/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,13 @@
font-weight: $font-weight-medium;
color: $gray-900;
margin: 0 0 $grid-unit-10 0;
padding: 0 $grid-unit-60;
padding-block: 0;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-60});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-60});
container-type: inline-size;

@container (max-width: 430px) {
padding-left: $grid-unit-30;
padding-right: $grid-unit-30;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
}
}
8 changes: 6 additions & 2 deletions packages/dataviews/src/dataviews-layouts/list/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ div.dataviews-view-list {

.dataviews-view-list__item-wrapper {
position: relative;
padding: $grid-unit-20 $grid-unit-30;
padding-block: $grid-unit-20;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
box-sizing: border-box;
}

Expand Down Expand Up @@ -206,5 +208,7 @@ div.dataviews-view-list {
font-weight: $font-weight-medium;
color: $gray-900;
margin: 0 0 $grid-unit-10 0;
padding: 0 $grid-unit-30;
padding-block: 0;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
}
Original file line number Diff line number Diff line change
Expand Up @@ -171,5 +171,7 @@
font-weight: $font-weight-medium;
color: $gray-900;
margin: 0 0 $grid-unit-10 0;
padding: 0 $grid-unit-60;
padding-block: 0;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-60});
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-60});
}
10 changes: 5 additions & 5 deletions packages/dataviews/src/dataviews-layouts/table/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,16 @@

td:first-child,
th:first-child {
padding-left: $grid-unit-60;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-60});

.dataviews-view-table-header-button {
margin-left: - #{$grid-unit-10};
margin-inline-start: - #{$grid-unit-10};
}
}

td:last-child,
th:last-child {
padding-right: $grid-unit-60;
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-60});
}

&:last-child {
Expand Down Expand Up @@ -253,12 +253,12 @@
@container (max-width: 430px) {
.dataviews-view-table tr td:first-child,
.dataviews-view-table tr th:first-child {
padding-left: $grid-unit-30;
padding-inline-start: var(--wp-dataviews-padding-inline-start, #{$grid-unit-30});
}

.dataviews-view-table tr td:last-child,
.dataviews-view-table tr th:last-child {
padding-right: $grid-unit-30;
padding-inline-end: var(--wp-dataviews-padding-inline-end, #{$grid-unit-30});
}
}

Expand Down
Loading
Loading