Skip to content

Commit 9e19dee

Browse files
authored
Custom resize cursors (#3535)
Custom resizer cursors and menu chevrons
1 parent 1b4d3af commit 9e19dee

File tree

9 files changed

+115
-23
lines changed

9 files changed

+115
-23
lines changed

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@
6666
"@octokit/rest": "*",
6767
"@parcel/bundler-experimental": "^2.2.1",
6868
"@parcel/optimizer-css": "^2.2.1",
69+
"@parcel/optimizer-data-url": "^2.2.1",
6970
"@parcel/packager-ts": "^2.2.1",
7071
"@parcel/resolver-glob": "^2.2.1",
7172
"@parcel/transformer-inline": "^2.2.1",
73+
"@parcel/transformer-inline-string": "^2.2.1",
7274
"@parcel/transformer-svg-react": "^2.2.1",
7375
"@parcel/transformer-typescript-types": "^2.2.1",
7476
"@spectrum-css/component-builder": "^1.0.0",
@@ -173,6 +175,8 @@
173175
"resolutions": {
174176
"@babel/core": "7.12.10",
175177
"@babel/runtime": "7.12.5",
178+
"@parcel/optimizer-data-url": "2.2.1",
179+
"@parcel/transformer-inline-string": "2.2.1",
176180
"postcss-calc": "6.0.2",
177181
"jsdom": "16.7.0",
178182
"postcss-modules": "^3.2.2",
Lines changed: 14 additions & 0 deletions
Loading
Lines changed: 5 additions & 0 deletions
Loading
Lines changed: 5 additions & 0 deletions
Loading

packages/@adobe/spectrum-css-temp/components/table/index.css

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,23 @@ governing permissions and limitations under the License.
3232
svg.spectrum-Table-sortedIcon {
3333
display: none;
3434
flex: 0 0 auto;
35-
margin-inline-start: var(--spectrum-table-header-sort-icon-gap);
35+
margin-inline-end: var(--spectrum-table-header-sort-icon-gap);
3636
min-inline-size: var(--spectrum-icon-arrow-down-small-width);
3737

3838
vertical-align: middle;
3939

4040
transition: transform var(--spectrum-global-animation-duration-100) ease-in-out;
4141
}
4242

43+
.spectrum-Table-menuChevron {
44+
display: none;
45+
flex: 0 0 auto;
46+
margin-inline-start: var(--spectrum-table-header-sort-icon-gap);
47+
min-inline-size: var(--spectrum-icon-chevron-down-medium-width);
48+
49+
vertical-align: middle;
50+
}
51+
4352
.spectrum-Table-headWrapper {
4453
border-left-width: 1px;
4554
border-left-style: solid;
@@ -104,6 +113,12 @@ svg.spectrum-Table-sortedIcon {
104113
text-overflow: ellipsis;
105114
}
106115
}
116+
.is-hovered,
117+
&.focus-ring {
118+
.spectrum-Table-menuChevron {
119+
display: inline-block;
120+
}
121+
}
107122
}
108123

109124
.spectrum-Table-columnResizer {
@@ -282,6 +297,18 @@ svg.spectrum-Table-sortedIcon {
282297
}
283298
}
284299
}
300+
.spectrum-Table-headCellButton {
301+
display: flex;
302+
align-items: center;
303+
}
304+
305+
.spectrum-Table-headerCellText {
306+
flex: 0 1 auto;
307+
min-width: 0;
308+
overflow: hidden;
309+
white-space: nowrap;
310+
text-overflow: ellipsis;
311+
}
285312

286313
.spectrum-Table-headCell,
287314
.spectrum-Table-headCellButton {
@@ -453,12 +480,15 @@ svg.spectrum-Table-sortedIcon {
453480
}
454481
}
455482

456-
.resize-ew * {
457-
cursor: col-resize !important;
483+
.resize-ew *,
484+
.spectrum-Table-columnResizer--ewresize {
485+
cursor: url('data-url:./cursors/Cur_MoveHorizontal_9_9.svg'), ew-resize !important;
458486
}
459-
.resize-e * {
460-
cursor: e-resize !important;
487+
.resize-e *,
488+
.spectrum-Table-columnResizer--eresize {
489+
cursor: url('data-url:./cursors/Cur_MoveToRight_9_9.svg'), e-resize !important;
461490
}
462-
.resize-w * {
463-
cursor: w-resize !important;
491+
.resize-w *,
492+
.spectrum-Table-columnResizer--wresize {
493+
cursor: url('data-url:./cursors/Cur_MoveToLeft_9_9.svg'), w-resize !important;
464494
}

packages/@react-spectrum/table/src/Resizer.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,24 @@ function Resizer<T>(props: ResizerProps<T>, ref: RefObject<HTMLInputElement>) {
5858
display: showResizer ? undefined : 'none',
5959
touchAction: 'none'
6060
};
61-
if (columnState.getColumnMinWidth(column.key) >= columnState.getColumnWidth(column.key)) {
62-
style.cursor = direction === 'rtl' ? 'w-resize' : 'e-resize';
63-
} else if (columnState.getColumnMaxWidth(column.key) <= columnState.getColumnWidth(column.key)) {
64-
style.cursor = direction === 'rtl' ? 'e-resize' : 'w-resize';
65-
} else {
66-
style.cursor = 'col-resize';
67-
}
61+
let isEResizable = columnState.getColumnMinWidth(column.key) >= columnState.getColumnWidth(column.key);
62+
let isWResizable = columnState.getColumnMaxWidth(column.key) <= columnState.getColumnWidth(column.key);
6863

6964
return (
7065
<>
7166
<FocusRing within focusRingClass={classNames(styles, 'focus-ring')}>
7267
<div
7368
role="presentation"
7469
style={style}
75-
className={classNames(styles, 'spectrum-Table-columnResizer')}
70+
className={classNames(
71+
styles,
72+
'spectrum-Table-columnResizer',
73+
{
74+
'spectrum-Table-columnResizer--ewresize': !(isEResizable && isWResizable),
75+
'spectrum-Table-columnResizer--eresize': direction === 'rtl' ? isWResizable : isEResizable,
76+
'spectrum-Table-columnResizer--wresize': direction === 'rtl' ? isEResizable : isWResizable
77+
}
78+
)}
7679
{...resizerProps}>
7780
<VisuallyHidden>
7881
<input

packages/@react-spectrum/table/src/TableView.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import ArrowDownSmall from '@spectrum-icons/ui/ArrowDownSmall';
1414
import {chain, mergeProps, useLayoutEffect} from '@react-aria/utils';
1515
import {Checkbox} from '@react-spectrum/checkbox';
16+
import ChevronDownMedium from '@spectrum-icons/ui/ChevronDownMedium';
1617
import {classNames, useDOMRef, useFocusableRef, useStyleProps, useUnwrapDOMRef} from '@react-spectrum/utils';
1718
import {DOMRef, FocusableRef, MoveMoveEvent} from '@react-types/shared';
1819
import {FocusRing, FocusScope, useFocusRing} from '@react-aria/focus';
@@ -569,13 +570,13 @@ function TableColumnHeader(props) {
569570
)
570571
)
571572
}>
573+
{columnProps.allowsSorting &&
574+
<ArrowDownSmall UNSAFE_className={classNames(styles, 'spectrum-Table-sortedIcon')} />
575+
}
572576
{columnProps.hideHeader ?
573577
<VisuallyHidden>{column.rendered}</VisuallyHidden> :
574578
<div className={classNames(styles, 'spectrum-Table-headCellContents')}>{column.rendered}</div>
575579
}
576-
{columnProps.allowsSorting &&
577-
<ArrowDownSmall UNSAFE_className={classNames(styles, 'spectrum-Table-sortedIcon')} />
578-
}
579580
</div>
580581
</FocusRing>
581582
);
@@ -586,8 +587,9 @@ let _TableColumnHeaderButton = (props, ref: FocusableRef<HTMLDivElement>) => {
586587
let {isEmpty} = useTableContext();
587588
let domRef = useFocusableRef(ref);
588589
let {buttonProps} = useButton({...otherProps, elementType: 'div', isDisabled: isEmpty}, domRef);
590+
let {hoverProps, isHovered} = useHover({...otherProps, isDisabled: isEmpty});
589591
return (
590-
<div className={classNames(styles, 'spectrum-Table-headCellContents')}>
592+
<div className={classNames(styles, 'spectrum-Table-headCellContents', {'is-hovered': isHovered})} {...hoverProps}>
591593
<div className={classNames(styles, 'spectrum-Table-headCellButton')} {...mergeProps(buttonProps, focusProps)} ref={domRef}>{props.children}</div>
592594
</div>
593595
);
@@ -607,9 +609,10 @@ function ResizableTableColumnHeader(props) {
607609
isVirtualized: true,
608610
hasMenu: true
609611
}, state, ref);
612+
610613
let {hoverProps, isHovered} = useHover({...props, isDisabled: isEmpty});
611614

612-
const allProps = [columnHeaderProps, hoverProps, pressProps];
615+
const allProps = [columnHeaderProps, pressProps, hoverProps];
613616

614617
let columnProps = column.props as SpectrumColumnProps<unknown>;
615618

@@ -697,12 +700,15 @@ function ResizableTableColumnHeader(props) {
697700
}>
698701
<MenuTrigger>
699702
<TableColumnHeaderButton ref={triggerRef} focusProps={focusProps}>
703+
{columnProps.allowsSorting &&
704+
<ArrowDownSmall UNSAFE_className={classNames(styles, 'spectrum-Table-sortedIcon')} />
705+
}
700706
{columnProps.hideHeader ?
701707
<VisuallyHidden>{column.rendered}</VisuallyHidden> :
702-
column.rendered
708+
<div className={classNames(styles, 'spectrum-Table-headerCellText')}>{column.rendered}</div>
703709
}
704-
{columnProps.allowsSorting &&
705-
<ArrowDownSmall UNSAFE_className={classNames(styles, 'spectrum-Table-sortedIcon')} />
710+
{
711+
columnProps.allowsResizing && columnState.currentlyResizingColumn === null && <ChevronDownMedium UNSAFE_className={classNames(styles, 'spectrum-Table-menuChevron')} />
706712
}
707713
</TableColumnHeaderButton>
708714
<Menu onAction={onMenuSelect} minWidth="size-2000" items={items}>

packages/dev/parcel-namer-docs/DocsNamer.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ module.exports = new Namer({
5454
let bundleGroup = bundleGraph.getBundleGroupsContainingBundle(bundle)[0];
5555
let bundleGroupBundles = bundleGraph.getBundlesInBundleGroup(bundleGroup);
5656
let mainBundle = bundleGroupBundles.find(b => b.getEntryAssets().some(a => a.id === bundleGroup.entryAssetId));
57+
if (!mainBundle) {
58+
return null;
59+
}
5760
let entry = mainBundle.getEntryAssets().find(a => a.id === bundleGroup.entryAssetId).filePath;
5861
return path.basename(entry, path.extname(entry)) + '.' + bundle.hashReference + '.' + bundle.type;
5962
} else {

yarn.lock

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2810,6 +2810,16 @@
28102810
cssnano "^5.0.15"
28112811
postcss "^8.4.5"
28122812

2813+
"@parcel/[email protected]", "@parcel/optimizer-data-url@^2.2.1":
2814+
version "2.2.1"
2815+
resolved "https://registry.yarnpkg.com/@parcel/optimizer-data-url/-/optimizer-data-url-2.2.1.tgz#69e2bc7bb5164a82d9044a26758464a12c76e993"
2816+
integrity sha512-e1gbnGpc2wKGUmXEMXK8FfPGBjE1Ols3CQe06FUzq5dxocctcoEBdZas/cBew+b5LmuHqzTv4rYNWMqQnr7Izw==
2817+
dependencies:
2818+
"@parcel/plugin" "^2.2.1"
2819+
"@parcel/utils" "^2.2.1"
2820+
isbinaryfile "^4.0.2"
2821+
mime "^2.4.4"
2822+
28132823
"@parcel/optimizer-htmlnano@^2.2.1":
28142824
version "2.2.1"
28152825
resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.2.1.tgz#781267e8b72033abc500e16ca032d24d56d7f2ce"
@@ -3089,6 +3099,13 @@
30893099
"@parcel/workers" "^2.2.1"
30903100
nullthrows "^1.1.1"
30913101

3102+
"@parcel/[email protected]", "@parcel/transformer-inline-string@^2.2.1":
3103+
version "2.2.1"
3104+
resolved "https://registry.yarnpkg.com/@parcel/transformer-inline-string/-/transformer-inline-string-2.2.1.tgz#a80a8a0221803b863e103340ea2e3b6546de14f3"
3105+
integrity sha512-yHhKmYEEyg3D5FfAz/yv+U4Ml6MPJvYfEgFowfeCTG2cJ9g7jVwsB66nAwOR1IP+MJh9ODmzf5OSjdR9MX6lYQ==
3106+
dependencies:
3107+
"@parcel/plugin" "^2.2.1"
3108+
30923109
"@parcel/transformer-inline@^2.2.1":
30933110
version "2.2.1"
30943111
resolved "https://registry.yarnpkg.com/@parcel/transformer-inline/-/transformer-inline-2.2.1.tgz#626cea8c83ae0b8ae9e4070f9aa9255ac1273f86"
@@ -12625,6 +12642,11 @@ isbinaryfile@^4.0.1:
1262512642
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.2.tgz#bfc45642da645681c610cca831022e30af426488"
1262612643
integrity sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==
1262712644

12645+
isbinaryfile@^4.0.2:
12646+
version "4.0.10"
12647+
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3"
12648+
integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==
12649+
1262812650
isexe@^2.0.0:
1262912651
version "2.0.0"
1263012652
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"

0 commit comments

Comments
 (0)