62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
'use client';
|
|
import { makeResetStyles, makeStyles, mergeClasses } from '@griffel/react';
|
|
import { tokens } from '@fluentui/react-theme';
|
|
import { createCustomFocusIndicatorStyle } from '@fluentui/react-tabster';
|
|
import { treeItemLevelToken } from '../../utils/tokens';
|
|
import { treeItemLayoutClassNames } from '../TreeItemLayout/useTreeItemLayoutStyles.styles';
|
|
import { treeItemPersonaLayoutClassNames } from '../TreeItemPersonaLayout/useTreeItemPersonaLayoutStyles.styles';
|
|
export const treeItemClassNames = {
|
|
root: 'fui-TreeItem'
|
|
};
|
|
const useBaseStyles = makeResetStyles({
|
|
position: 'relative',
|
|
cursor: 'pointer',
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
boxSizing: 'border-box',
|
|
backgroundColor: tokens.colorSubtleBackground,
|
|
color: tokens.colorNeutralForeground2,
|
|
paddingRight: tokens.spacingHorizontalNone,
|
|
// if using createCustomFocusIndicatorStyle then we need to remove default outline styles provided by the browser
|
|
':focus': {
|
|
outlineStyle: 'none'
|
|
},
|
|
':focus-visible': {
|
|
outlineStyle: 'none'
|
|
},
|
|
// This adds the focus outline for the TreeItemLayout element
|
|
...createCustomFocusIndicatorStyle({
|
|
borderRadius: tokens.borderRadiusMedium,
|
|
outlineColor: tokens.colorStrokeFocus2,
|
|
outlineRadius: tokens.borderRadiusMedium,
|
|
// FIXME: tokens.strokeWidthThick causes some weird bugs
|
|
outlineWidth: '2px',
|
|
outlineStyle: 'solid'
|
|
}, {
|
|
customizeSelector: (selector)=>`${selector} > .${treeItemLayoutClassNames.root}, ${selector} > .${treeItemPersonaLayoutClassNames.root}`
|
|
})
|
|
});
|
|
const useStyles = makeStyles({
|
|
...Object.fromEntries(Array.from({
|
|
length: 10
|
|
}, (_, index)=>[
|
|
`level${index + 1}`,
|
|
{
|
|
[treeItemLevelToken]: index + 1
|
|
}
|
|
]))
|
|
});
|
|
/**
|
|
* Apply styling to the TreeItem slots based on the state
|
|
*/ export const useTreeItemStyles_unstable = (state)=>{
|
|
'use no memo';
|
|
const baseStyles = useBaseStyles();
|
|
const styles = useStyles();
|
|
const { level } = state;
|
|
state.root.className = mergeClasses(treeItemClassNames.root, baseStyles, isStaticallyDefinedLevel(level) && styles[`level${level}`], state.root.className);
|
|
return state;
|
|
};
|
|
function isStaticallyDefinedLevel(level) {
|
|
return level >= 1 && level <= 10;
|
|
}
|