Skip to content
Merged
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
2 changes: 0 additions & 2 deletions packages/base/src/styling/CssSizeVariables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ export enum CssSizeVariablesNames {
ui5WcrMessageViewListItemHeightSingle = '--_ui5wcr-MessageViewListItemHeightSingle',
ui5WcrMessageViewListItemHeightByLine = '--_ui5wcr-MessageViewListItemHeightByLine',
ui5WcrMessageItemTitleFontSize = '--_ui5wcr-MessageItemTitleFontSize',
ui5WcrSplitterSize = '--_ui5wcr-SplitterSize',
ui5WcrDialogHeaderHeight = '--_ui5wcr-DialogHeaderHeight',
ui5WcrDialogSubHeaderHeight = '--_ui5wcr-DialogSubHeaderHeight',
ui5WcrElementHeight = '--_ui5wcr-ElementHeight'
Expand Down Expand Up @@ -55,7 +54,6 @@ export const CozySizes = {
[CssSizeVariablesNames.ui5WcrMessageViewListItemHeightSingle]: `2.75rem`,
[CssSizeVariablesNames.ui5WcrMessageViewListItemHeightByLine]: `3.325rem`,
[CssSizeVariablesNames.ui5WcrMessageItemTitleFontSize]: ThemingParameters.sapFontHeader5Size,
[CssSizeVariablesNames.ui5WcrSplitterSize]: `1rem`,
[CssSizeVariablesNames.ui5WcrDialogHeaderHeight]: '2.75rem',
[CssSizeVariablesNames.ui5WcrDialogSubHeaderHeight]: '3rem',
[CssSizeVariablesNames.ui5WcrElementHeight]: ThemingParameters.sapElement_Height
Expand Down
110 changes: 110 additions & 0 deletions packages/main/src/components/Splitter/Splitter.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
.splitter {
touch-action: none;
position: relative;
display: flex;
will-change: flex;
background-color: var(--sapShell_Background);
align-items: center;
justify-content: center;
box-sizing: border-box;

&[data-splitter-vertical] {
cursor: col-resize;
&:focus {
outline-offset: -0.2rem;
outline: var(--_ui5wcr_Splitter_BarOutline);
}
.icon {
z-index: 1;
}
}

&[data-splitter-vertical='horizontal'] {
border-inline: var(--_ui5wcr_Splitter_BarBorderStyle);
min-width: var(--_ui5wcr-SplitterSize);
width: var(--_ui5wcr-SplitterSize);
height: 100%;
flex-direction: column;
&:focus {
border-block: var(--_ui5wcr_Splitter_BarBorderHighContrastFix);
border-inline: var(--_ui5wcr_Splitter_BarBorderFocus);
}
.lineBefore,
.lineAfter {
background-size: 0.0625rem 100%;
width: var(--_ui5wcr-SplitterSize);
height: 4rem;
}
.lineBefore {
background-image: linear-gradient(to top, var(--_ui5wcr_Splitter_ContentBorderColor), transparent);
}
.icon {
padding: 0.5rem 0;
}
.lineAfter {
background-image: linear-gradient(to bottom, var(--_ui5wcr_Splitter_ContentBorderColor), transparent);
}
}

&[data-splitter-vertical='vertical'] {
border-block: var(--_ui5wcr_Splitter_BarBorderStyle);
min-height: var(--_ui5wcr-SplitterSize);
height: var(--_ui5wcr-SplitterSize);
width: 100%;
flex-direction: row;
&:focus {
border-block: var(--_ui5wcr_Splitter_BarBorderFocus);
border-inline: var(--_ui5wcr_Splitter_BarBorderHighContrastFix);
}
.lineBefore,
.lineAfter {
background-size: 100% 0.0625rem;
width: 5rem;
height: var(--_ui5wcr-SplitterSize);
}
.lineBefore {
background-image: linear-gradient(to left, var(--_ui5wcr_Splitter_ContentBorderColor), transparent);
&:dir(rtl) {
background-image: linear-gradient(to right, var(--_ui5wcr_Splitter_ContentBorderColor), transparent);
}
}
.icon {
padding: 0 0.5rem;
}
.lineAfter {
background-image: linear-gradient(to right, var(--_ui5wcr_Splitter_ContentBorderColor), transparent);
&:dir(rtl) {
background-image: linear-gradient(to left, var(--_ui5wcr_Splitter_ContentBorderColor), transparent);
}
}
}

&:hover {
.lineBefore,
.lineAfter {
flex-grow: 1;
transition: all 0.1s ease-in;
}
}
}

.gripButton {
min-width: 1.5rem !important;
height: 1.625rem;
z-index: 1;

&:active {
z-index: 2;
}
}

.icon {
box-sizing: initial;
color: var(--_ui5wcr_Splitter_IconColor);
}

.lineBefore,
.lineAfter {
background-position: center;
background-repeat: no-repeat;
}
158 changes: 10 additions & 148 deletions packages/main/src/components/Splitter/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,152 +2,13 @@

import horizontalGripIcon from '@ui5/webcomponents-icons/dist/horizontal-grip.js';
import verticalGripIcon from '@ui5/webcomponents-icons/dist/vertical-grip.js';
import {
CssSizeVariables,
ThemingParameters,
useCurrentTheme,
useI18nBundle,
useIsRTL,
useSyncRef
} from '@ui5/webcomponents-react-base';
import { useCurrentTheme, useI18nBundle, useIsRTL, useSyncRef, useStylesheet } from '@ui5/webcomponents-react-base';
import React, { forwardRef, useEffect, useRef, useState } from 'react';
import { createUseStyles } from 'react-jss';
import { ButtonDesign } from '../../enums/index.js';
import { PRESS_ARROW_KEYS_TO_MOVE } from '../../i18n/i18n-defaults.js';
import { CustomThemingParameters } from '../../themes/CustomVariables.js';
import type { CommonProps } from '../../types/index.js';
import { Button, Icon } from '../../webComponents/index.js';

const useStyles = createUseStyles(
{
splitter: {
touchAction: 'none',
position: 'relative',
display: 'flex',
willChange: 'flex',
backgroundColor: ThemingParameters.sapShell_Background,
alignItems: 'center',
justifyContent: 'center',
boxSizing: 'border-box',
'&[data-splitter-vertical=horizontal]': {
cursor: 'col-resize',
borderLeft: CustomThemingParameters.SplitterBarBorderStyle,
borderRight: CustomThemingParameters.SplitterBarBorderStyle,
minWidth: CssSizeVariables.ui5WcrSplitterSize,
width: CssSizeVariables.ui5WcrSplitterSize,
height: '100%',
flexDirection: 'column',
'&:focus': {
borderTop: CustomThemingParameters.SplitterBarBorderFix,
borderRight: CustomThemingParameters.SplitterBarBorderFocus,
borderBottom: CustomThemingParameters.SplitterBarBorderFix,
borderLeft: CustomThemingParameters.SplitterBarBorderFocus,
outlineOffset: '-0.20rem',
outline: CustomThemingParameters.SplitterBarOutline
},

'& $lineBefore, & $lineAfter': {
backgroundSize: '0.0625rem 100%',
width: CssSizeVariables.ui5WcrSplitterSize,
height: '4rem'
},
'& $lineBefore': {
backgroundImage: `linear-gradient(to top, ${CustomThemingParameters.SplitterContentBorderColor}, transparent)`
},
'& $icon': {
padding: '0.5rem 0',
zIndex: 1
},
'& $lineAfter': {
backgroundImage: `linear-gradient(to bottom, ${CustomThemingParameters.SplitterContentBorderColor}, transparent)`
}
},
'&[data-splitter-vertical=vertical]': {
borderTop: CustomThemingParameters.SplitterBarBorderStyle,
borderBottom: CustomThemingParameters.SplitterBarBorderStyle,
cursor: 'row-resize',
minHeight: CssSizeVariables.ui5WcrSplitterSize,
height: CssSizeVariables.ui5WcrSplitterSize,
width: '100%',
flexDirection: 'row',
'&:focus': {
borderTop: CustomThemingParameters.SplitterBarBorderFocus,
borderRight: CustomThemingParameters.SplitterBarBorderFix,
borderBottom: CustomThemingParameters.SplitterBarBorderFocus,
borderLeft: CustomThemingParameters.SplitterBarBorderFix,
outlineOffset: '-0.20rem',
outline: CustomThemingParameters.SplitterBarOutline
},

'& $lineBefore, & $lineAfter': {
backgroundSize: '100% 0.0625rem ',
width: '5rem',
height: CssSizeVariables.ui5WcrSplitterSize
},
'& $lineBefore': {
backgroundImage: `linear-gradient(to left, ${CustomThemingParameters.SplitterContentBorderColor}, transparent)`
},
'& $icon': {
padding: '0 0.5rem',
zIndex: 1
},
'& $lineAfter': {
backgroundImage: `linear-gradient(to right, ${CustomThemingParameters.SplitterContentBorderColor}, transparent)`
}
},
'&[data-splitter-vertical=verticalRtl]': {
cursor: 'row-resize',
minHeight: CssSizeVariables.ui5WcrSplitterSize,
height: CssSizeVariables.ui5WcrSplitterSize,
width: '100%',
flexDirection: 'row',

'& $lineBefore, & $lineAfter': {
backgroundSize: '100% 0.0625rem ',
width: '5rem',
height: CssSizeVariables.ui5WcrSplitterSize
},
'& $lineBefore': {
backgroundImage: `linear-gradient(to right, ${CustomThemingParameters.SplitterContentBorderColor}, transparent)`
},
'& $icon': {
padding: '0 0.5rem',
zIndex: 1
},
'& $lineAfter': {
backgroundImage: `linear-gradient(to left, ${CustomThemingParameters.SplitterContentBorderColor}, transparent)`
}
},
'&:hover': {
'& $lineBefore, & $lineAfter': {
flexGrow: 1,
transition: 'all 0.1s ease-in'
}
}
},
gripButton: {
minWidth: '1.5rem !important',
height: '1.625rem',
zIndex: '1',
'&:active': {
zIndex: '2'
}
},
icon: {
boxSizing: 'initial',
color: CustomThemingParameters.SplitterIconColor
},
lineBefore: {
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat'
},
lineAfter: {
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat'
}
},
{ name: 'Splitter' }
);
import { classNames, styleData } from './Splitter.module.css.js';

export interface SplitterPropTypes extends CommonProps {
height: string | number;
Expand Down Expand Up @@ -181,7 +42,8 @@ const Splitter = forwardRef<HTMLDivElement, SplitterPropTypes>((props, ref) => {
const [componentRef, localRef] = useSyncRef<HTMLDivElement>(ref);
const isRtl = useIsRTL(localRef);
const start = useRef(null);
const classes = useStyles();

useStylesheet(styleData, Splitter.displayName);

const previousSiblingSize = useRef<number>(null);
const nextSiblingSize = useRef<number>(null);
Expand Down Expand Up @@ -381,31 +243,31 @@ const Splitter = forwardRef<HTMLDivElement, SplitterPropTypes>((props, ref) => {

return (
<div
className={classes.splitter}
className={classNames.splitter}
tabIndex={0}
onClick={handleSplitterClick}
onKeyDown={onHandleKeyDown}
onPointerDown={handleMoveSplitterStart}
onMouseDown={handleMoveSplitterStart}
ref={componentRef}
role="separator"
data-splitter-vertical={isRtl && vertical ? 'verticalRtl' : vertical ? 'vertical' : 'horizontal'}
data-splitter-vertical={vertical ? 'vertical' : 'horizontal'}
title={i18nBundle.getText(PRESS_ARROW_KEYS_TO_MOVE)}
aria-orientation={vertical ? 'vertical' : 'horizontal'}
aria-label={i18nBundle.getText(PRESS_ARROW_KEYS_TO_MOVE)}
>
<div className={classes.lineBefore} />
<div className={classNames.lineBefore} />
{isHighContrast ? (
<Button
className={classes.gripButton}
className={classNames.gripButton}
tabIndex={-1}
icon={vertical ? horizontalGripIcon : verticalGripIcon}
design={ButtonDesign.Transparent}
/>
) : (
<Icon className={classes.icon} name={vertical ? horizontalGripIcon : verticalGripIcon} />
<Icon className={classNames.icon} name={vertical ? horizontalGripIcon : verticalGripIcon} />
)}
<div className={classes.lineAfter} />
<div className={classNames.lineAfter} />
</div>
);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.splitterElement {
display: flex;
overflow: hidden;
position: relative;
will-change: flex-basis;
min-width: 0px;
min-height: 0px;
}
23 changes: 5 additions & 18 deletions packages/main/src/components/SplitterElement/index.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,12 @@
'use client';

import { Device, useIsomorphicLayoutEffect, useSyncRef } from '@ui5/webcomponents-react-base';
import { Device, useIsomorphicLayoutEffect, useSyncRef, useStylesheet } from '@ui5/webcomponents-react-base';
import { clsx } from 'clsx';
import type { CSSProperties, ReactNode } from 'react';
import React, { forwardRef, useContext, useEffect, useState } from 'react';
import { createUseStyles } from 'react-jss';
import { SplitterLayoutContext } from '../../internal/SplitterLayoutContext.js';
import type { CommonProps } from '../../types/index.js';

const useStyles = createUseStyles(
{
splitterElement: {
display: 'flex',
overflow: 'hidden',
position: 'relative',
willChange: 'flex-basis',
minWidth: '0px',
minHeight: '0px'
}
},
{ name: 'SplitterElement' }
);
import { classNames, styleData } from './SplitterElement.module.css.js';

export interface SplitterElementPropTypes extends CommonProps {
/**
Expand Down Expand Up @@ -60,7 +46,8 @@ const SplitterElement = forwardRef<HTMLDivElement, SplitterElementPropTypes>((pr
const defaultFlexStyles = size !== 'auto' ? { flex: `0 1 ${size}` } : { flex: '1 0 min-content', ...safariStyles };
const [flexStyles, setFlexStyles] = useState(defaultFlexStyles);
const [flexBasisApplied, setFlexBasisApplied] = useState(false);
const classes = useStyles();

useStylesheet(styleData, SplitterElement.displayName);

useEffect(() => {
const elementObserver = new ResizeObserver(([element]) => {
Expand Down Expand Up @@ -101,7 +88,7 @@ const SplitterElement = forwardRef<HTMLDivElement, SplitterElementPropTypes>((pr
return (
<div
ref={componentRef}
className={clsx(classes.splitterElement, classes[vertical ? 'vertical' : 'horizontal'], className)}
className={clsx(classNames.splitterElement, className)}
style={{
minHeight: vertical && minSize ? `${minSize}px` : undefined,
minWidth: !vertical && minSize ? `${minSize}px` : undefined,
Expand Down
Loading