Skip to content

Commit da28333

Browse files
authored
Ensure internal classes used for style :host(.<class>) are not overridden by className (#117)
Co-authored-by: Frédéric Collonval <[email protected]>
1 parent fc138da commit da28333

File tree

8 files changed

+55
-19
lines changed

8 files changed

+55
-19
lines changed

packages/react-components/lib/Checkbox.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,18 @@ export const Checkbox = forwardRef((props, forwardedRef) => {
3737
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
3838
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
3939

40+
// Add web component internal classes on top of `className`
41+
let allClasses = className ?? '';
42+
if (ref.current?.indeterminate) {
43+
allClasses += ' indeterminate';
44+
}
45+
4046
return React.createElement(
4147
'jp-checkbox',
4248
{
4349
ref,
4450
...filteredProps,
45-
class: props.className,
51+
class: allClasses.trim(),
4652
exportparts: props.exportparts,
4753
for: props.htmlFor,
4854
part: props.part,

packages/react-components/lib/DataGridCell.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,20 @@ export const DataGridCell = forwardRef((props, forwardedRef) => {
3232
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
3333
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
3434

35+
// Add web component internal classes on top of `className`
36+
let allClasses = className ?? '';
37+
if (ref.current?.cellType === 'columnheader') {
38+
allClasses += ' column-header';
39+
}
40+
3541
return React.createElement(
3642
'jp-data-grid-cell',
3743
{
3844
ref,
3945
...filteredProps,
4046
'cell-type': props.cellType || props['cell-type'],
4147
'grid-column': props.gridColumn || props['grid-column'],
42-
class: props.className,
48+
class: allClasses.trim(),
4349
exportparts: props.exportparts,
4450
for: props.htmlFor,
4551
part: props.part,

packages/react-components/lib/DataGridRow.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ export const DataGridRow = forwardRef((props, forwardedRef) => {
3838
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
3939
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
4040

41+
// Add web component internal classes on top of `className`
42+
let allClasses = className ?? '';
43+
if (ref.current) {
44+
if (ref.current.rowType !== 'default') {
45+
allClasses += ` ${ref.current.rowType}`;
46+
}
47+
}
48+
4149
return React.createElement(
4250
'jp-data-grid-row',
4351
{
@@ -46,7 +54,7 @@ export const DataGridRow = forwardRef((props, forwardedRef) => {
4654
'grid-template-columns':
4755
props.gridTemplateColumns || props['grid-template-columns'],
4856
'row-type': props.rowType || props['row-type'],
49-
class: props.className,
57+
class: allClasses.trim(),
5058
exportparts: props.exportparts,
5159
for: props.htmlFor,
5260
part: props.part,

packages/react-components/lib/MenuItem.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,22 @@ export const MenuItem = forwardRef((props, forwardedRef) => {
2828
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
2929
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
3030

31+
// Add web component internal classes on top of `className`
32+
let allClasses = className ?? '';
33+
if (ref.current) {
34+
allClasses += ` indent-${ref.current.startColumnCount}`;
35+
if (ref.current.expanded) {
36+
allClasses += ' expanded';
37+
}
38+
}
39+
3140
return React.createElement(
3241
'jp-menu-item',
3342
{
3443
ref,
3544
...filteredProps,
3645
role: props.role,
37-
class: props.className,
46+
class: allClasses.trim(),
3847
exportparts: props.exportparts,
3948
for: props.htmlFor,
4049
part: props.part,

packages/react-components/lib/SliderLabel.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ export const SliderLabel = forwardRef((props, forwardedRef) => {
2020
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
2121
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
2222

23+
// Add web component internal classes on top of `className`
24+
let allClasses = className ?? '';
25+
if (ref.current?.disabled) {
26+
allClasses += ' disabled';
27+
}
28+
2329
return React.createElement(
2430
'jp-slider-label',
2531
{
2632
ref,
2733
...filteredProps,
2834
position: props.position,
29-
class: props.className,
35+
class: allClasses.trim(),
3036
exportparts: props.exportparts,
3137
for: props.htmlFor,
3238
part: props.part,

packages/react-components/lib/Tab.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,18 @@ export const Tab = forwardRef((props, forwardedRef) => {
1818
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
1919
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
2020

21+
// Add web component internal classes on top of `className`
22+
let allClasses = className ?? '';
23+
if (ref.current?.classList.contains('vertical')) {
24+
allClasses += ' vertical';
25+
}
26+
2127
return React.createElement(
2228
'jp-tab',
2329
{
2430
ref,
2531
...filteredProps,
26-
class: props.className,
32+
class: allClasses.trim(),
2733
exportparts: props.exportparts,
2834
for: props.htmlFor,
2935
part: props.part,

packages/react-components/lib/TreeItem.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ import {
22
jpTreeItem,
33
provideJupyterDesignSystem
44
} from '@jupyter/web-components';
5-
import React, {
6-
forwardRef,
7-
useEffect,
8-
useImperativeHandle,
9-
useRef
10-
} from 'react';
5+
import React, { forwardRef, useImperativeHandle, useRef } from 'react';
116
import { useEventListener, useProperties } from './react-utils.js';
127
provideJupyterDesignSystem().register(jpTreeItem());
138

@@ -27,12 +22,18 @@ export const TreeItem = forwardRef((props, forwardedRef) => {
2722
/** Methods - uses `useImperativeHandle` hook to pass ref to component */
2823
useImperativeHandle(forwardedRef, () => ref.current, [ref.current]);
2924

25+
// Add web component internal classes on top of `className`
26+
let allClasses = className ?? '';
27+
if (ref.current?.nested) {
28+
allClasses += ' nested';
29+
}
30+
3031
return React.createElement(
3132
'jp-tree-item',
3233
{
3334
ref,
3435
...filteredProps,
35-
class: props.className,
36+
class: allClasses.trim(),
3637
exportparts: props.exportparts,
3738
for: props.htmlFor,
3839
part: props.part,

packages/react-components/lib/TreeView.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@ export const TreeView = forwardRef((props, forwardedRef) => {
1717
const { className, renderCollapsedNodes, currentSelected, ...filteredProps } =
1818
props;
1919

20-
useLayoutEffect(() => {
21-
// Fix using private API to force refresh of nested flag on
22-
// first level of tree items.
23-
ref.current?.setItems();
24-
}, [ref.current]);
25-
2620
/** Properties - run whenever a property has changed */
2721
useProperties(ref, 'currentSelected', props.currentSelected);
2822

0 commit comments

Comments
 (0)