@zendeskgarden/react-grid 8.52.0 → 8.53.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -84,11 +84,15 @@ import { PaneProvider, Pane } from '@zendeskgarden/react-grid';
84
84
  </Pane>
85
85
  <Pane>
86
86
  <Pane.Content>Pane 2</Pane.Content>
87
- <Pane.Splitter layoutKey="row-1" min={0} max={2} orientation="bottom" />
87
+ <Pane.Splitter layoutKey="row-1" min={0} max={2} orientation="bottom">
88
+ <Pane.SplitterButton label="toggle row-1" />
89
+ </Pane.Splitter>
88
90
  </Pane>
89
91
  <Pane>
90
92
  <Pane.Content>Pane 3</Pane.Content>
91
- <Pane.Splitter layoutKey="row-2" min={0} max={2} orientation="top" />
93
+ <Pane.Splitter layoutKey="row-2" min={0} max={2} orientation="top">
94
+ <Pane.SplitterButton label="toggle row-2" placement="end" />
95
+ </Pane.Splitter>
92
96
  </Pane>
93
97
  <Pane>
94
98
  <Pane.Content>Pane 4</Pane.Content>
package/dist/index.cjs.js CHANGED
@@ -14,9 +14,11 @@ var PropTypes = require('prop-types');
14
14
  var styled = require('styled-components');
15
15
  var polished = require('polished');
16
16
  var reactTheming = require('@zendeskgarden/react-theming');
17
+ var reactButtons = require('@zendeskgarden/react-buttons');
17
18
  var containerUtilities = require('@zendeskgarden/container-utilities');
18
19
  var mergeRefs = require('react-merge-refs');
19
20
  var containerSplitter = require('@zendeskgarden/container-splitter');
21
+ var reactTooltips = require('@zendeskgarden/react-tooltips');
20
22
 
21
23
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
22
24
 
@@ -188,8 +190,8 @@ var SPACE = [false, 'xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
188
190
  var WRAP = ['nowrap', 'wrap', 'wrap-reverse'];
189
191
  var ORIENTATION = ['top', 'bottom', 'start', 'end'];
190
192
 
191
- var COMPONENT_ID$5 = 'grid.col';
192
- var colorStyles$3 = function colorStyles(props) {
193
+ var COMPONENT_ID$6 = 'grid.col';
194
+ var colorStyles$4 = function colorStyles(props) {
193
195
  var backgroundColor = reactTheming.getColor('primaryHue', 600, props.theme, 0.1);
194
196
  return styled.css(["background-clip:content-box;background-color:", ";"], backgroundColor);
195
197
  };
@@ -234,22 +236,22 @@ var flexStyles$1 = function flexStyles(size, alignSelf, textAlign, offset, order
234
236
  var mediaStyles$1 = function mediaStyles(minWidth, size, alignSelf, textAlign, offset, order, props) {
235
237
  return styled.css(["@media (min-width:", "){", ";}"], minWidth, flexStyles$1(size, alignSelf, textAlign, offset, order, props));
236
238
  };
237
- var sizeStyles$3 = function sizeStyles(props) {
239
+ var sizeStyles$4 = function sizeStyles(props) {
238
240
  var padding = props.gutters ? polished.math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
239
241
  return styled.css(["padding-right:", ";padding-left:", ";"], padding, padding);
240
242
  };
241
243
  var StyledCol = styled__default["default"].div.attrs({
242
- 'data-garden-id': COMPONENT_ID$5,
243
- 'data-garden-version': '8.52.0'
244
+ 'data-garden-id': COMPONENT_ID$6,
245
+ 'data-garden-version': '8.53.2'
244
246
  }).withConfig({
245
247
  displayName: "StyledCol",
246
248
  componentId: "sc-inuw62-0"
247
249
  })(["box-sizing:border-box;width:100%;", ";", ";", ";", ";", ";", ";", ";", ";", ";"], function (props) {
248
250
  return flexStyles$1(!props.sizeAll && (props.xs || props.sm || props.md || props.lg || props.xl) ? undefined : props.sizeAll || false, props.alignSelf, props.textAlign, props.offset, props.order, props);
249
251
  }, function (props) {
250
- return sizeStyles$3(props);
252
+ return sizeStyles$4(props);
251
253
  }, function (props) {
252
- return props.debug && colorStyles$3(props);
254
+ return props.debug && colorStyles$4(props);
253
255
  }, function (props) {
254
256
  return mediaStyles$1(props.theme.breakpoints.xs, props.xs, props.alignSelfXs, props.textAlignXs, props.offsetXs, props.orderXs, props);
255
257
  }, function (props) {
@@ -261,45 +263,45 @@ var StyledCol = styled__default["default"].div.attrs({
261
263
  }, function (props) {
262
264
  return mediaStyles$1(props.theme.breakpoints.xl, props.xl, props.alignSelfXl, props.textAlignXl, props.offsetXl, props.orderXl, props);
263
265
  }, function (props) {
264
- return reactTheming.retrieveComponentStyles(COMPONENT_ID$5, props);
266
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID$6, props);
265
267
  });
266
268
  StyledCol.defaultProps = {
267
269
  columns: 12,
268
270
  theme: reactTheming.DEFAULT_THEME
269
271
  };
270
272
 
271
- var COMPONENT_ID$4 = 'grid.grid';
272
- var colorStyles$2 = function colorStyles(props) {
273
+ var COMPONENT_ID$5 = 'grid.grid';
274
+ var colorStyles$3 = function colorStyles(props) {
273
275
  var borderColor = reactTheming.getColor(props.theme.palette.crimson, 400, props.theme, 0.5);
274
276
  var borderWidth = polished.math("".concat(props.theme.borderWidths.sm, " * 2"));
275
277
  return styled.css(["box-shadow:-", " 0 0 0 ", ",", " 0 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
276
278
  };
277
- var sizeStyles$2 = function sizeStyles(props) {
279
+ var sizeStyles$3 = function sizeStyles(props) {
278
280
  var padding = props.gutters ? polished.math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
279
281
  return styled.css(["padding-right:", ";padding-left:", ";"], padding, padding);
280
282
  };
281
283
  var StyledGrid = styled__default["default"].div.attrs({
282
- 'data-garden-id': COMPONENT_ID$4,
283
- 'data-garden-version': '8.52.0'
284
+ 'data-garden-id': COMPONENT_ID$5,
285
+ 'data-garden-version': '8.53.2'
284
286
  }).withConfig({
285
287
  displayName: "StyledGrid",
286
288
  componentId: "sc-oxgg5i-0"
287
289
  })(["direction:", ";margin-right:auto;margin-left:auto;width:100%;box-sizing:border-box;", ";", ";", ";"], function (props) {
288
290
  return props.theme.rtl && 'rtl';
289
291
  }, function (props) {
290
- return sizeStyles$2(props);
292
+ return sizeStyles$3(props);
291
293
  }, function (props) {
292
- return props.debug && colorStyles$2(props);
294
+ return props.debug && colorStyles$3(props);
293
295
  }, function (props) {
294
- return reactTheming.retrieveComponentStyles(COMPONENT_ID$4, props);
296
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID$5, props);
295
297
  });
296
298
  StyledGrid.defaultProps = {
297
299
  gutters: 'md',
298
300
  theme: reactTheming.DEFAULT_THEME
299
301
  };
300
302
 
301
- var COMPONENT_ID$3 = 'grid.row';
302
- var colorStyles$1 = function colorStyles(props) {
303
+ var COMPONENT_ID$4 = 'grid.row';
304
+ var colorStyles$2 = function colorStyles(props) {
303
305
  var borderColor = reactTheming.getColor(props.theme.palette.mint, 600, props.theme, 0.5);
304
306
  var borderWidth = props.theme.borderWidths.sm;
305
307
  return styled.css(["box-shadow:inset 0 ", " 0 0 ", ",inset 0 -", " 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
@@ -324,22 +326,22 @@ var flexStyles = function flexStyles(alignItems, justifyContent, wrap) {
324
326
  var mediaStyles = function mediaStyles(minWidth, alignItems, justifyContent, wrap) {
325
327
  return styled.css(["@media (min-width:", "){", ";}"], minWidth, flexStyles(alignItems, justifyContent, wrap));
326
328
  };
327
- var sizeStyles$1 = function sizeStyles(props) {
329
+ var sizeStyles$2 = function sizeStyles(props) {
328
330
  var margin = props.gutters ? polished.math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
329
331
  return styled.css(["margin-right:-", ";margin-left:-", ";"], margin, margin);
330
332
  };
331
333
  var StyledRow = styled__default["default"].div.attrs({
332
- 'data-garden-id': COMPONENT_ID$3,
333
- 'data-garden-version': '8.52.0'
334
+ 'data-garden-id': COMPONENT_ID$4,
335
+ 'data-garden-version': '8.53.2'
334
336
  }).withConfig({
335
337
  displayName: "StyledRow",
336
338
  componentId: "sc-xjsdg1-0"
337
339
  })(["display:flex;box-sizing:border-box;", " ", ";", ";", ";", ";", ";", ";", ";", ";"], function (props) {
338
340
  return flexStyles(props.alignItems, props.justifyContent, props.wrapAll);
339
341
  }, function (props) {
340
- return sizeStyles$1(props);
342
+ return sizeStyles$2(props);
341
343
  }, function (props) {
342
- return props.debug && colorStyles$1(props);
344
+ return props.debug && colorStyles$2(props);
343
345
  }, function (props) {
344
346
  return mediaStyles(props.theme.breakpoints.xs, props.alignItemsXs, props.justifyContentXs, props.wrapXs);
345
347
  }, function (props) {
@@ -351,51 +353,52 @@ var StyledRow = styled__default["default"].div.attrs({
351
353
  }, function (props) {
352
354
  return mediaStyles(props.theme.breakpoints.xl, props.alignItemsXl, props.justifyContentXl, props.wrapXl);
353
355
  }, function (props) {
354
- return reactTheming.retrieveComponentStyles(COMPONENT_ID$3, props);
356
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID$4, props);
355
357
  });
356
358
  StyledRow.defaultProps = {
357
359
  wrapAll: 'wrap',
358
360
  theme: reactTheming.DEFAULT_THEME
359
361
  };
360
362
 
361
- var COMPONENT_ID$2 = 'pane';
363
+ var COMPONENT_ID$3 = 'pane';
362
364
  var StyledPane = styled__default["default"].div.attrs({
363
- 'data-garden-id': COMPONENT_ID$2,
364
- 'data-garden-version': '8.52.0'
365
+ 'data-garden-id': COMPONENT_ID$3,
366
+ 'data-garden-version': '8.53.2'
365
367
  }).withConfig({
366
368
  displayName: "StyledPane",
367
369
  componentId: "sc-1ltjst7-0"
368
370
  })(["position:relative;min-width:0;min-height:0;", ";"], function (props) {
369
- return reactTheming.retrieveComponentStyles(COMPONENT_ID$2, props);
371
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID$3, props);
370
372
  });
371
373
  StyledPane.defaultProps = {
372
374
  theme: reactTheming.DEFAULT_THEME
373
375
  };
374
376
 
375
- var COMPONENT_ID$1 = 'pane.content';
377
+ var COMPONENT_ID$2 = 'pane.content';
376
378
  var StyledPaneContent = styled__default["default"].div.attrs({
377
- 'data-garden-id': COMPONENT_ID$1,
378
- 'data-garden-version': '8.52.0'
379
+ 'data-garden-id': COMPONENT_ID$2,
380
+ 'data-garden-version': '8.53.2'
379
381
  }).withConfig({
380
382
  displayName: "StyledPaneContent",
381
383
  componentId: "sc-1b38mbh-0"
382
384
  })(["height:100%;overflow:auto;", ";"], function (props) {
383
- return reactTheming.retrieveComponentStyles(COMPONENT_ID$1, props);
385
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID$2, props);
384
386
  });
385
387
  StyledPaneContent.defaultProps = {
386
388
  theme: reactTheming.DEFAULT_THEME
387
389
  };
388
390
 
389
- var COMPONENT_ID = 'pane.splitter';
390
- var colorStyles = function colorStyles(props) {
391
+ var COMPONENT_ID$1 = 'pane.splitter';
392
+ var colorStyles$1 = function colorStyles(props) {
391
393
  var color = reactTheming.getColor('neutralHue', 300, props.theme);
392
394
  var hoverColor = reactTheming.getColor('primaryHue', 600, props.theme);
393
395
  var activeColor = reactTheming.getColor('primaryHue', 800, props.theme);
394
396
  var boxShadow = props.theme.shadows.md(polished.rgba(hoverColor, 0.35));
395
- return styled.css(["&::before{background-color:", ";}&:hover::before,&[data-garden-focus-visible]::before{background-color:", ";}&[data-garden-focus-visible]::before{box-shadow:", ";}&:active::before{background-color:", ";}"], color, hoverColor, boxShadow, activeColor);
397
+ return styled.css(["&::before{background-color:", ";}&:hover::before{background-color:", ";}&[data-garden-focus-visible]::before{box-shadow:", ";background-color:", ";}&:active::before{background-color:", ";}"], color, props.isHovered && hoverColor, boxShadow, hoverColor, props.isHovered && activeColor);
396
398
  };
397
- var sizeStyles = function sizeStyles(props) {
399
+ var sizeStyles$1 = function sizeStyles(props) {
398
400
  var size = polished.math("".concat(props.theme.shadowWidths.md, " * 2"));
401
+ var separatorSize = polished.math("".concat(props.theme.borderWidths.sm, " * 2"));
399
402
  var offset = polished.math("-".concat(size, " / 2"));
400
403
  var cursor;
401
404
  var top;
@@ -450,21 +453,90 @@ var sizeStyles = function sizeStyles(props) {
450
453
  }
451
454
  break;
452
455
  }
453
- return styled.css(["display:flex;top:", ";right:", ";bottom:", ";left:", ";cursor:", ";width:", ";height:", ";&::before{transition:box-shadow 0.1s ease-in-out,background-color 0.25s ease-in-out,width 0.25s ease-in-out,height 0.25s ease-in-out;margin:auto;width:", ";height:", ";}&:hover::before,&[data-garden-focus-visible]::before,&:focus::before{", ":", ";}&[data-garden-focus-visible]::before{border-radius:", ";}"], top, right, bottom, left, cursor, width, height, separatorWidth, separatorHeight, width === '100%' ? 'height' : 'width', polished.math("".concat(props.theme.borderWidths.sm, " * 2")), props.theme.borderRadii.md);
456
+ var dimensionProperty = width === '100%' ? 'height' : 'width';
457
+ return styled.css(["top:", ";right:", ";bottom:", ";left:", ";cursor:", ";width:", ";height:", ";&::before{width:", ";height:", ";}&:hover::before{", ":", ";}&[data-garden-focus-visible]::before,&:focus::before{", ":", ";}&[data-garden-focus-visible]::before{border-radius:", ";}"], top, right, bottom, left, cursor, width, height, separatorWidth, separatorHeight, dimensionProperty, props.isHovered && separatorSize, dimensionProperty, separatorSize, props.theme.borderRadii.md);
454
458
  };
455
459
  var StyledPaneSplitter = styled__default["default"].div.attrs({
456
- 'data-garden-id': COMPONENT_ID,
457
- 'data-garden-version': '8.52.0'
460
+ 'data-garden-id': COMPONENT_ID$1,
461
+ 'data-garden-version': '8.53.2'
458
462
  }).withConfig({
459
463
  displayName: "StyledPaneSplitter",
460
464
  componentId: "sc-jylemn-0"
461
- })(["position:absolute;z-index:1;user-select:none;", ";&:hover,&[data-garden-focus-visible]{z-index:2;}&:focus{outline:none;}&::before{display:block;content:'';}", ";", ";"], sizeStyles, colorStyles, function (props) {
462
- return reactTheming.retrieveComponentStyles(COMPONENT_ID, props);
465
+ })(["display:flex;position:absolute;align-items:center;justify-content:center;z-index:1;user-select:none;", ";&:focus{outline:none;}&::before{position:absolute;transition:box-shadow 0.1s ease-in-out,background-color 0.25s ease-in-out;z-index:-1;content:'';}", ";", ";"], sizeStyles$1, colorStyles$1, function (props) {
466
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID$1, props);
463
467
  });
464
468
  StyledPaneSplitter.defaultProps = {
465
469
  theme: reactTheming.DEFAULT_THEME
466
470
  };
467
471
 
472
+ var COMPONENT_ID = 'pane.splitter_button';
473
+ var transformStyles = function transformStyles(props) {
474
+ var degrees = 0;
475
+ if (props.isRotated) {
476
+ degrees = props.theme.rtl ? -180 : 180;
477
+ }
478
+ if (props.orientation === 'end') {
479
+ degrees += props.theme.rtl ? -90 : 90;
480
+ } else if (props.orientation === 'start') {
481
+ degrees += props.theme.rtl ? 90 : -90;
482
+ } else if (props.orientation === 'bottom') {
483
+ degrees += 180;
484
+ }
485
+ return styled.css(["& > svg{transform:rotate(", "deg);}"], degrees);
486
+ };
487
+ var colorStyles = function colorStyles(_ref) {
488
+ var theme = _ref.theme;
489
+ var boxShadow = theme.shadows.lg("".concat(theme.space.base, "px"), "".concat(theme.space.base * 2, "px"), reactTheming.getColor('chromeHue', 600, theme, 0.15));
490
+ var focusBoxShadow = theme.shadows.md(reactTheming.getColor('primaryHue', 600, theme, 0.35));
491
+ return styled.css(["box-shadow:", ";&[data-garden-focus-visible]{box-shadow:", ",", ";}"], boxShadow, focusBoxShadow, boxShadow);
492
+ };
493
+ var sizeStyles = function sizeStyles(props) {
494
+ var size = "".concat(props.theme.space.base * 6, "px");
495
+ var display = props.splitterSize <= polished.stripUnit(polished.math("".concat(props.theme.shadowWidths.md, " * 2 + ").concat(size))) && 'none';
496
+ var isVertical = props.orientation === 'start' || props.orientation === 'end';
497
+ var top;
498
+ var left;
499
+ var right;
500
+ var bottom;
501
+ if (props.splitterSize >= polished.stripUnit(polished.math("".concat(size, " * 3")))) {
502
+ if (props.placement === 'start') {
503
+ if (isVertical) {
504
+ top = size;
505
+ } else if (props.theme.rtl) {
506
+ right = size;
507
+ } else {
508
+ left = size;
509
+ }
510
+ } else if (props.placement === 'end') {
511
+ if (isVertical) {
512
+ bottom = size;
513
+ } else if (props.theme.rtl) {
514
+ left = size;
515
+ } else {
516
+ right = size;
517
+ }
518
+ }
519
+ }
520
+ return styled.css(["display:", ";top:", ";right:", ";bottom:", ";left:", ";width:", ";min-width:", ";height:", ";"], display, top, right, bottom, left, size, size, size);
521
+ };
522
+ var StyledPaneSplitterButton = styled__default["default"](reactButtons.ChevronButton).attrs({
523
+ 'data-garden-id': COMPONENT_ID,
524
+ 'data-garden-version': '8.53.2',
525
+ isBasic: true,
526
+ isPill: true,
527
+ size: 'small'
528
+ }).withConfig({
529
+ displayName: "StyledPaneSplitterButton",
530
+ componentId: "sc-zh032e-0"
531
+ })(["position:absolute;transition:background-color 0.25s ease-in-out,opacity 0.25s ease-in-out 0.1s;opacity:0;&[data-garden-focus-visible],", ":hover &,", "[data-garden-focus-visible] &{opacity:1;}", ";", ";", ";&::before{position:absolute;z-index:-1;background-color:", ";width:100%;height:100%;content:'';}", ";"], StyledPaneSplitter, StyledPaneSplitter, sizeStyles, transformStyles, colorStyles, function (props) {
532
+ return props.theme.colors.background;
533
+ }, function (props) {
534
+ return reactTheming.retrieveComponentStyles(COMPONENT_ID, props);
535
+ });
536
+ StyledPaneSplitterButton.defaultProps = {
537
+ theme: reactTheming.DEFAULT_THEME
538
+ };
539
+
468
540
  var GridContext = React.createContext({
469
541
  gutters: 'md'
470
542
  });
@@ -704,8 +776,8 @@ var PaneProvider = function PaneProvider(_ref3) {
704
776
  var setColumnValue = React.useCallback(function (isStart, splitterId, value) {
705
777
  var columns = layoutIndices.columns,
706
778
  columnArray = layoutIndices.columnArray;
707
- var stealFromTraversal = isStart ? 0 : 1;
708
- var addToTraversal = isStart ? -1 : 0;
779
+ var stealFromTraversal = isStart ? -1 : 1;
780
+ var addToTraversal = 0;
709
781
  setColumnsTrack(function (state) {
710
782
  var stealFromIndex = columns[splitterId] + stealFromTraversal;
711
783
  var addToIndex = columns[splitterId] + addToTraversal;
@@ -803,9 +875,22 @@ var usePaneContext = function usePaneContext() {
803
875
  return React.useContext(PaneContext);
804
876
  };
805
877
 
878
+ var PaneSplitterContext = React.createContext({
879
+ orientation: 'start',
880
+ min: 0,
881
+ max: 0,
882
+ layoutKey: '',
883
+ valueNow: 0,
884
+ size: 0,
885
+ isRow: false
886
+ });
887
+ var usePaneSplitterContext = function usePaneSplitterContext() {
888
+ return React.useContext(PaneSplitterContext);
889
+ };
890
+
806
891
  var _excluded$1 = ["providerId", "layoutKey", "min", "max", "orientation"];
807
892
  var orientationToPosition = {
808
- start: containerSplitter.SplitterPosition.TRAILS,
893
+ start: containerSplitter.SplitterPosition.LEADS,
809
894
  end: containerSplitter.SplitterPosition.TRAILS,
810
895
  top: containerSplitter.SplitterPosition.LEADS,
811
896
  bottom: containerSplitter.SplitterPosition.TRAILS
@@ -823,6 +908,7 @@ var orientationToDimension = {
823
908
  bottom: 'rows'
824
909
  };
825
910
  var SplitterComponent = React.forwardRef(function (_ref, ref) {
911
+ var _separatorProps$ref$c, _separatorProps$ref$c2;
826
912
  var providerId = _ref.providerId,
827
913
  layoutKey = _ref.layoutKey,
828
914
  min = _ref.min,
@@ -832,10 +918,16 @@ var SplitterComponent = React.forwardRef(function (_ref, ref) {
832
918
  var paneProviderContext = usePaneProviderContextData(providerId);
833
919
  var paneContext = usePaneContext();
834
920
  var themeContext = React.useContext(styled.ThemeContext);
921
+ var _useState = React.useState(false),
922
+ _useState2 = _slicedToArray(_useState, 2),
923
+ isHovered = _useState2[0],
924
+ setIsHovered = _useState2[1];
835
925
  var position = orientationToPosition[orientation];
836
926
  var isRow = orientationToDimension[orientation] === 'rows';
837
927
  var splitterOrientation = paneToSplitterOrientation[orientation];
838
928
  var pixelsPerFr = paneProviderContext ? paneProviderContext.pixelsPerFr[orientationToDimension[orientation]] : 0;
929
+ var value = isRow ? paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getRowValue(layoutKey, true) : paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getColumnValue(layoutKey, true);
930
+ var valueInFr = isRow ? paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getRowValue(layoutKey) : paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getColumnValue(layoutKey);
839
931
  var _useSplitter = containerSplitter.useSplitter({
840
932
  type: containerSplitter.SplitterType.VARIABLE,
841
933
  orientation: splitterOrientation,
@@ -846,11 +938,11 @@ var SplitterComponent = React.forwardRef(function (_ref, ref) {
846
938
  environment: window,
847
939
  onChange: function onChange(valueNow) {
848
940
  if (isRow) {
849
- return paneProviderContext && paneProviderContext.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
941
+ return paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
850
942
  }
851
- return paneProviderContext && paneProviderContext.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
943
+ return paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
852
944
  },
853
- valueNow: isRow ? paneProviderContext && paneProviderContext.getRowValue(layoutKey, true) : paneProviderContext && paneProviderContext.getColumnValue(layoutKey, true)
945
+ valueNow: value
854
946
  }),
855
947
  getSeparatorProps = _useSplitter.getSeparatorProps,
856
948
  getPrimaryPaneProps = _useSplitter.getPrimaryPaneProps;
@@ -862,11 +954,31 @@ var SplitterComponent = React.forwardRef(function (_ref, ref) {
862
954
  var separatorProps = getSeparatorProps({
863
955
  'aria-controls': paneContext.id
864
956
  });
865
- return React__default["default"].createElement(StyledPaneSplitter, _extends({
957
+ var size = isRow ? (_separatorProps$ref$c = separatorProps.ref.current) === null || _separatorProps$ref$c === void 0 ? void 0 : _separatorProps$ref$c.clientWidth : (_separatorProps$ref$c2 = separatorProps.ref.current) === null || _separatorProps$ref$c2 === void 0 ? void 0 : _separatorProps$ref$c2.clientHeight;
958
+ var onMouseOver = React.useMemo(function () {
959
+ return containerUtilities.composeEventHandlers(props.onMouseOver, function (event) {
960
+ return setIsHovered(event.target === separatorProps.ref.current);
961
+ });
962
+ }, [props.onMouseOver, separatorProps.ref]);
963
+ return React__default["default"].createElement(PaneSplitterContext.Provider, {
964
+ value: React.useMemo(function () {
965
+ return {
966
+ orientation: orientation,
967
+ layoutKey: layoutKey,
968
+ min: min,
969
+ max: max,
970
+ valueNow: valueInFr,
971
+ size: size,
972
+ isRow: isRow
973
+ };
974
+ }, [orientation, layoutKey, min, max, valueInFr, size, isRow])
975
+ }, React__default["default"].createElement(StyledPaneSplitter, _extends({
976
+ isHovered: isHovered,
866
977
  orientation: orientation
867
978
  }, separatorProps, props, {
979
+ onMouseOver: onMouseOver,
868
980
  ref: mergeRefs__default["default"]([separatorProps.ref, ref])
869
- }));
981
+ })));
870
982
  });
871
983
  SplitterComponent.displayName = 'Pane.Splitter';
872
984
  SplitterComponent.propTypes = {
@@ -888,6 +1000,76 @@ var ContentComponent = React.forwardRef(function (props, ref) {
888
1000
  ContentComponent.displayName = 'Pane.Content';
889
1001
  var Content = ContentComponent;
890
1002
 
1003
+ var SplitterButtonComponent = React.forwardRef(function (props, ref) {
1004
+ var label = props.label,
1005
+ defaultPlacement = props.placement;
1006
+ var _usePaneSplitterConte = usePaneSplitterContext(),
1007
+ orientation = _usePaneSplitterConte.orientation,
1008
+ layoutKey = _usePaneSplitterConte.layoutKey,
1009
+ min = _usePaneSplitterConte.min,
1010
+ max = _usePaneSplitterConte.max,
1011
+ isRow = _usePaneSplitterConte.isRow,
1012
+ valueNow = _usePaneSplitterConte.valueNow,
1013
+ size = _usePaneSplitterConte.size,
1014
+ providerId = _usePaneSplitterConte.providerId;
1015
+ var paneProviderContext = usePaneProviderContextData(providerId);
1016
+ var isTop = orientation === 'top';
1017
+ var isStart = orientation === 'start';
1018
+ var isMin = valueNow === min;
1019
+ var placement = defaultPlacement;
1020
+ if (!defaultPlacement) {
1021
+ if (isRow) {
1022
+ placement = 'center';
1023
+ } else {
1024
+ placement = 'start';
1025
+ }
1026
+ }
1027
+ var setValue = React.useCallback(function (value) {
1028
+ if (isRow) {
1029
+ paneProviderContext.setRowValue(isTop, layoutKey, value);
1030
+ } else {
1031
+ paneProviderContext.setColumnValue(isStart, layoutKey, value);
1032
+ }
1033
+ }, [isRow, isTop, isStart, layoutKey, paneProviderContext]);
1034
+ var onClick = containerUtilities.composeEventHandlers(props.onClick, function () {
1035
+ if (isMin) {
1036
+ setValue(max);
1037
+ } else {
1038
+ setValue(min);
1039
+ }
1040
+ });
1041
+ var onKeyDown = containerUtilities.composeEventHandlers(props.onKeyDown, function (event) {
1042
+ return event.stopPropagation();
1043
+ }
1044
+ );
1045
+ var onMouseDown = containerUtilities.composeEventHandlers(props.onMouseDown, function (event) {
1046
+ return event.stopPropagation();
1047
+ }
1048
+ );
1049
+ return React__default["default"].createElement(reactTooltips.Tooltip, {
1050
+ content: label,
1051
+ style: {
1052
+ cursor: 'default'
1053
+ },
1054
+ onMouseDown: function onMouseDown(e) {
1055
+ return e.stopPropagation();
1056
+ }
1057
+ }, React__default["default"].createElement(StyledPaneSplitterButton, _extends({
1058
+ "aria-label": label
1059
+ }, props, {
1060
+ placement: placement,
1061
+ orientation: orientation,
1062
+ isRotated: isMin,
1063
+ splitterSize: size || 0,
1064
+ ref: ref,
1065
+ onClick: onClick,
1066
+ onKeyDown: onKeyDown,
1067
+ onMouseDown: onMouseDown
1068
+ })));
1069
+ });
1070
+ SplitterButtonComponent.displayName = 'Pane.SplitterButton';
1071
+ var SplitterButton = SplitterButtonComponent;
1072
+
891
1073
  var _excluded = ["children"];
892
1074
  var PaneComponent = React.forwardRef(function (_ref, ref) {
893
1075
  var children = _ref.children,
@@ -915,6 +1097,7 @@ PaneComponent.displayName = 'Pane';
915
1097
  var Pane = PaneComponent;
916
1098
  Pane.Content = Content;
917
1099
  Pane.Splitter = Splitter;
1100
+ Pane.SplitterButton = SplitterButton;
918
1101
 
919
1102
  exports.ARRAY_ALIGN_ITEMS = ALIGN_ITEMS;
920
1103
  exports.ARRAY_ALIGN_SELF = ALIGN_SELF;
package/dist/index.esm.js CHANGED
@@ -8,11 +8,13 @@
8
8
  import React, { createContext, useContext, useMemo, useState, useCallback, forwardRef, useEffect } from 'react';
9
9
  import PropTypes from 'prop-types';
10
10
  import styled, { css, ThemeContext } from 'styled-components';
11
- import { math, rgba } from 'polished';
11
+ import { math, rgba, stripUnit } from 'polished';
12
12
  import { retrieveComponentStyles, DEFAULT_THEME, getColor } from '@zendeskgarden/react-theming';
13
- import { useId } from '@zendeskgarden/container-utilities';
13
+ import { ChevronButton } from '@zendeskgarden/react-buttons';
14
+ import { useId, composeEventHandlers } from '@zendeskgarden/container-utilities';
14
15
  import mergeRefs from 'react-merge-refs';
15
16
  import { SplitterPosition, SplitterOrientation, useSplitter, SplitterType } from '@zendeskgarden/container-splitter';
17
+ import { Tooltip } from '@zendeskgarden/react-tooltips';
16
18
 
17
19
  function ownKeys(object, enumerableOnly) {
18
20
  var keys = Object.keys(object);
@@ -177,8 +179,8 @@ var SPACE = [false, 'xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
177
179
  var WRAP = ['nowrap', 'wrap', 'wrap-reverse'];
178
180
  var ORIENTATION = ['top', 'bottom', 'start', 'end'];
179
181
 
180
- var COMPONENT_ID$5 = 'grid.col';
181
- var colorStyles$3 = function colorStyles(props) {
182
+ var COMPONENT_ID$6 = 'grid.col';
183
+ var colorStyles$4 = function colorStyles(props) {
182
184
  var backgroundColor = getColor('primaryHue', 600, props.theme, 0.1);
183
185
  return css(["background-clip:content-box;background-color:", ";"], backgroundColor);
184
186
  };
@@ -223,22 +225,22 @@ var flexStyles$1 = function flexStyles(size, alignSelf, textAlign, offset, order
223
225
  var mediaStyles$1 = function mediaStyles(minWidth, size, alignSelf, textAlign, offset, order, props) {
224
226
  return css(["@media (min-width:", "){", ";}"], minWidth, flexStyles$1(size, alignSelf, textAlign, offset, order, props));
225
227
  };
226
- var sizeStyles$3 = function sizeStyles(props) {
228
+ var sizeStyles$4 = function sizeStyles(props) {
227
229
  var padding = props.gutters ? math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
228
230
  return css(["padding-right:", ";padding-left:", ";"], padding, padding);
229
231
  };
230
232
  var StyledCol = styled.div.attrs({
231
- 'data-garden-id': COMPONENT_ID$5,
232
- 'data-garden-version': '8.52.0'
233
+ 'data-garden-id': COMPONENT_ID$6,
234
+ 'data-garden-version': '8.53.2'
233
235
  }).withConfig({
234
236
  displayName: "StyledCol",
235
237
  componentId: "sc-inuw62-0"
236
238
  })(["box-sizing:border-box;width:100%;", ";", ";", ";", ";", ";", ";", ";", ";", ";"], function (props) {
237
239
  return flexStyles$1(!props.sizeAll && (props.xs || props.sm || props.md || props.lg || props.xl) ? undefined : props.sizeAll || false, props.alignSelf, props.textAlign, props.offset, props.order, props);
238
240
  }, function (props) {
239
- return sizeStyles$3(props);
241
+ return sizeStyles$4(props);
240
242
  }, function (props) {
241
- return props.debug && colorStyles$3(props);
243
+ return props.debug && colorStyles$4(props);
242
244
  }, function (props) {
243
245
  return mediaStyles$1(props.theme.breakpoints.xs, props.xs, props.alignSelfXs, props.textAlignXs, props.offsetXs, props.orderXs, props);
244
246
  }, function (props) {
@@ -250,45 +252,45 @@ var StyledCol = styled.div.attrs({
250
252
  }, function (props) {
251
253
  return mediaStyles$1(props.theme.breakpoints.xl, props.xl, props.alignSelfXl, props.textAlignXl, props.offsetXl, props.orderXl, props);
252
254
  }, function (props) {
253
- return retrieveComponentStyles(COMPONENT_ID$5, props);
255
+ return retrieveComponentStyles(COMPONENT_ID$6, props);
254
256
  });
255
257
  StyledCol.defaultProps = {
256
258
  columns: 12,
257
259
  theme: DEFAULT_THEME
258
260
  };
259
261
 
260
- var COMPONENT_ID$4 = 'grid.grid';
261
- var colorStyles$2 = function colorStyles(props) {
262
+ var COMPONENT_ID$5 = 'grid.grid';
263
+ var colorStyles$3 = function colorStyles(props) {
262
264
  var borderColor = getColor(props.theme.palette.crimson, 400, props.theme, 0.5);
263
265
  var borderWidth = math("".concat(props.theme.borderWidths.sm, " * 2"));
264
266
  return css(["box-shadow:-", " 0 0 0 ", ",", " 0 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
265
267
  };
266
- var sizeStyles$2 = function sizeStyles(props) {
268
+ var sizeStyles$3 = function sizeStyles(props) {
267
269
  var padding = props.gutters ? math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
268
270
  return css(["padding-right:", ";padding-left:", ";"], padding, padding);
269
271
  };
270
272
  var StyledGrid = styled.div.attrs({
271
- 'data-garden-id': COMPONENT_ID$4,
272
- 'data-garden-version': '8.52.0'
273
+ 'data-garden-id': COMPONENT_ID$5,
274
+ 'data-garden-version': '8.53.2'
273
275
  }).withConfig({
274
276
  displayName: "StyledGrid",
275
277
  componentId: "sc-oxgg5i-0"
276
278
  })(["direction:", ";margin-right:auto;margin-left:auto;width:100%;box-sizing:border-box;", ";", ";", ";"], function (props) {
277
279
  return props.theme.rtl && 'rtl';
278
280
  }, function (props) {
279
- return sizeStyles$2(props);
281
+ return sizeStyles$3(props);
280
282
  }, function (props) {
281
- return props.debug && colorStyles$2(props);
283
+ return props.debug && colorStyles$3(props);
282
284
  }, function (props) {
283
- return retrieveComponentStyles(COMPONENT_ID$4, props);
285
+ return retrieveComponentStyles(COMPONENT_ID$5, props);
284
286
  });
285
287
  StyledGrid.defaultProps = {
286
288
  gutters: 'md',
287
289
  theme: DEFAULT_THEME
288
290
  };
289
291
 
290
- var COMPONENT_ID$3 = 'grid.row';
291
- var colorStyles$1 = function colorStyles(props) {
292
+ var COMPONENT_ID$4 = 'grid.row';
293
+ var colorStyles$2 = function colorStyles(props) {
292
294
  var borderColor = getColor(props.theme.palette.mint, 600, props.theme, 0.5);
293
295
  var borderWidth = props.theme.borderWidths.sm;
294
296
  return css(["box-shadow:inset 0 ", " 0 0 ", ",inset 0 -", " 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
@@ -313,22 +315,22 @@ var flexStyles = function flexStyles(alignItems, justifyContent, wrap) {
313
315
  var mediaStyles = function mediaStyles(minWidth, alignItems, justifyContent, wrap) {
314
316
  return css(["@media (min-width:", "){", ";}"], minWidth, flexStyles(alignItems, justifyContent, wrap));
315
317
  };
316
- var sizeStyles$1 = function sizeStyles(props) {
318
+ var sizeStyles$2 = function sizeStyles(props) {
317
319
  var margin = props.gutters ? math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
318
320
  return css(["margin-right:-", ";margin-left:-", ";"], margin, margin);
319
321
  };
320
322
  var StyledRow = styled.div.attrs({
321
- 'data-garden-id': COMPONENT_ID$3,
322
- 'data-garden-version': '8.52.0'
323
+ 'data-garden-id': COMPONENT_ID$4,
324
+ 'data-garden-version': '8.53.2'
323
325
  }).withConfig({
324
326
  displayName: "StyledRow",
325
327
  componentId: "sc-xjsdg1-0"
326
328
  })(["display:flex;box-sizing:border-box;", " ", ";", ";", ";", ";", ";", ";", ";", ";"], function (props) {
327
329
  return flexStyles(props.alignItems, props.justifyContent, props.wrapAll);
328
330
  }, function (props) {
329
- return sizeStyles$1(props);
331
+ return sizeStyles$2(props);
330
332
  }, function (props) {
331
- return props.debug && colorStyles$1(props);
333
+ return props.debug && colorStyles$2(props);
332
334
  }, function (props) {
333
335
  return mediaStyles(props.theme.breakpoints.xs, props.alignItemsXs, props.justifyContentXs, props.wrapXs);
334
336
  }, function (props) {
@@ -340,51 +342,52 @@ var StyledRow = styled.div.attrs({
340
342
  }, function (props) {
341
343
  return mediaStyles(props.theme.breakpoints.xl, props.alignItemsXl, props.justifyContentXl, props.wrapXl);
342
344
  }, function (props) {
343
- return retrieveComponentStyles(COMPONENT_ID$3, props);
345
+ return retrieveComponentStyles(COMPONENT_ID$4, props);
344
346
  });
345
347
  StyledRow.defaultProps = {
346
348
  wrapAll: 'wrap',
347
349
  theme: DEFAULT_THEME
348
350
  };
349
351
 
350
- var COMPONENT_ID$2 = 'pane';
352
+ var COMPONENT_ID$3 = 'pane';
351
353
  var StyledPane = styled.div.attrs({
352
- 'data-garden-id': COMPONENT_ID$2,
353
- 'data-garden-version': '8.52.0'
354
+ 'data-garden-id': COMPONENT_ID$3,
355
+ 'data-garden-version': '8.53.2'
354
356
  }).withConfig({
355
357
  displayName: "StyledPane",
356
358
  componentId: "sc-1ltjst7-0"
357
359
  })(["position:relative;min-width:0;min-height:0;", ";"], function (props) {
358
- return retrieveComponentStyles(COMPONENT_ID$2, props);
360
+ return retrieveComponentStyles(COMPONENT_ID$3, props);
359
361
  });
360
362
  StyledPane.defaultProps = {
361
363
  theme: DEFAULT_THEME
362
364
  };
363
365
 
364
- var COMPONENT_ID$1 = 'pane.content';
366
+ var COMPONENT_ID$2 = 'pane.content';
365
367
  var StyledPaneContent = styled.div.attrs({
366
- 'data-garden-id': COMPONENT_ID$1,
367
- 'data-garden-version': '8.52.0'
368
+ 'data-garden-id': COMPONENT_ID$2,
369
+ 'data-garden-version': '8.53.2'
368
370
  }).withConfig({
369
371
  displayName: "StyledPaneContent",
370
372
  componentId: "sc-1b38mbh-0"
371
373
  })(["height:100%;overflow:auto;", ";"], function (props) {
372
- return retrieveComponentStyles(COMPONENT_ID$1, props);
374
+ return retrieveComponentStyles(COMPONENT_ID$2, props);
373
375
  });
374
376
  StyledPaneContent.defaultProps = {
375
377
  theme: DEFAULT_THEME
376
378
  };
377
379
 
378
- var COMPONENT_ID = 'pane.splitter';
379
- var colorStyles = function colorStyles(props) {
380
+ var COMPONENT_ID$1 = 'pane.splitter';
381
+ var colorStyles$1 = function colorStyles(props) {
380
382
  var color = getColor('neutralHue', 300, props.theme);
381
383
  var hoverColor = getColor('primaryHue', 600, props.theme);
382
384
  var activeColor = getColor('primaryHue', 800, props.theme);
383
385
  var boxShadow = props.theme.shadows.md(rgba(hoverColor, 0.35));
384
- return css(["&::before{background-color:", ";}&:hover::before,&[data-garden-focus-visible]::before{background-color:", ";}&[data-garden-focus-visible]::before{box-shadow:", ";}&:active::before{background-color:", ";}"], color, hoverColor, boxShadow, activeColor);
386
+ return css(["&::before{background-color:", ";}&:hover::before{background-color:", ";}&[data-garden-focus-visible]::before{box-shadow:", ";background-color:", ";}&:active::before{background-color:", ";}"], color, props.isHovered && hoverColor, boxShadow, hoverColor, props.isHovered && activeColor);
385
387
  };
386
- var sizeStyles = function sizeStyles(props) {
388
+ var sizeStyles$1 = function sizeStyles(props) {
387
389
  var size = math("".concat(props.theme.shadowWidths.md, " * 2"));
390
+ var separatorSize = math("".concat(props.theme.borderWidths.sm, " * 2"));
388
391
  var offset = math("-".concat(size, " / 2"));
389
392
  var cursor;
390
393
  var top;
@@ -439,21 +442,90 @@ var sizeStyles = function sizeStyles(props) {
439
442
  }
440
443
  break;
441
444
  }
442
- return css(["display:flex;top:", ";right:", ";bottom:", ";left:", ";cursor:", ";width:", ";height:", ";&::before{transition:box-shadow 0.1s ease-in-out,background-color 0.25s ease-in-out,width 0.25s ease-in-out,height 0.25s ease-in-out;margin:auto;width:", ";height:", ";}&:hover::before,&[data-garden-focus-visible]::before,&:focus::before{", ":", ";}&[data-garden-focus-visible]::before{border-radius:", ";}"], top, right, bottom, left, cursor, width, height, separatorWidth, separatorHeight, width === '100%' ? 'height' : 'width', math("".concat(props.theme.borderWidths.sm, " * 2")), props.theme.borderRadii.md);
445
+ var dimensionProperty = width === '100%' ? 'height' : 'width';
446
+ return css(["top:", ";right:", ";bottom:", ";left:", ";cursor:", ";width:", ";height:", ";&::before{width:", ";height:", ";}&:hover::before{", ":", ";}&[data-garden-focus-visible]::before,&:focus::before{", ":", ";}&[data-garden-focus-visible]::before{border-radius:", ";}"], top, right, bottom, left, cursor, width, height, separatorWidth, separatorHeight, dimensionProperty, props.isHovered && separatorSize, dimensionProperty, separatorSize, props.theme.borderRadii.md);
443
447
  };
444
448
  var StyledPaneSplitter = styled.div.attrs({
445
- 'data-garden-id': COMPONENT_ID,
446
- 'data-garden-version': '8.52.0'
449
+ 'data-garden-id': COMPONENT_ID$1,
450
+ 'data-garden-version': '8.53.2'
447
451
  }).withConfig({
448
452
  displayName: "StyledPaneSplitter",
449
453
  componentId: "sc-jylemn-0"
450
- })(["position:absolute;z-index:1;user-select:none;", ";&:hover,&[data-garden-focus-visible]{z-index:2;}&:focus{outline:none;}&::before{display:block;content:'';}", ";", ";"], sizeStyles, colorStyles, function (props) {
451
- return retrieveComponentStyles(COMPONENT_ID, props);
454
+ })(["display:flex;position:absolute;align-items:center;justify-content:center;z-index:1;user-select:none;", ";&:focus{outline:none;}&::before{position:absolute;transition:box-shadow 0.1s ease-in-out,background-color 0.25s ease-in-out;z-index:-1;content:'';}", ";", ";"], sizeStyles$1, colorStyles$1, function (props) {
455
+ return retrieveComponentStyles(COMPONENT_ID$1, props);
452
456
  });
453
457
  StyledPaneSplitter.defaultProps = {
454
458
  theme: DEFAULT_THEME
455
459
  };
456
460
 
461
+ var COMPONENT_ID = 'pane.splitter_button';
462
+ var transformStyles = function transformStyles(props) {
463
+ var degrees = 0;
464
+ if (props.isRotated) {
465
+ degrees = props.theme.rtl ? -180 : 180;
466
+ }
467
+ if (props.orientation === 'end') {
468
+ degrees += props.theme.rtl ? -90 : 90;
469
+ } else if (props.orientation === 'start') {
470
+ degrees += props.theme.rtl ? 90 : -90;
471
+ } else if (props.orientation === 'bottom') {
472
+ degrees += 180;
473
+ }
474
+ return css(["& > svg{transform:rotate(", "deg);}"], degrees);
475
+ };
476
+ var colorStyles = function colorStyles(_ref) {
477
+ var theme = _ref.theme;
478
+ var boxShadow = theme.shadows.lg("".concat(theme.space.base, "px"), "".concat(theme.space.base * 2, "px"), getColor('chromeHue', 600, theme, 0.15));
479
+ var focusBoxShadow = theme.shadows.md(getColor('primaryHue', 600, theme, 0.35));
480
+ return css(["box-shadow:", ";&[data-garden-focus-visible]{box-shadow:", ",", ";}"], boxShadow, focusBoxShadow, boxShadow);
481
+ };
482
+ var sizeStyles = function sizeStyles(props) {
483
+ var size = "".concat(props.theme.space.base * 6, "px");
484
+ var display = props.splitterSize <= stripUnit(math("".concat(props.theme.shadowWidths.md, " * 2 + ").concat(size))) && 'none';
485
+ var isVertical = props.orientation === 'start' || props.orientation === 'end';
486
+ var top;
487
+ var left;
488
+ var right;
489
+ var bottom;
490
+ if (props.splitterSize >= stripUnit(math("".concat(size, " * 3")))) {
491
+ if (props.placement === 'start') {
492
+ if (isVertical) {
493
+ top = size;
494
+ } else if (props.theme.rtl) {
495
+ right = size;
496
+ } else {
497
+ left = size;
498
+ }
499
+ } else if (props.placement === 'end') {
500
+ if (isVertical) {
501
+ bottom = size;
502
+ } else if (props.theme.rtl) {
503
+ left = size;
504
+ } else {
505
+ right = size;
506
+ }
507
+ }
508
+ }
509
+ return css(["display:", ";top:", ";right:", ";bottom:", ";left:", ";width:", ";min-width:", ";height:", ";"], display, top, right, bottom, left, size, size, size);
510
+ };
511
+ var StyledPaneSplitterButton = styled(ChevronButton).attrs({
512
+ 'data-garden-id': COMPONENT_ID,
513
+ 'data-garden-version': '8.53.2',
514
+ isBasic: true,
515
+ isPill: true,
516
+ size: 'small'
517
+ }).withConfig({
518
+ displayName: "StyledPaneSplitterButton",
519
+ componentId: "sc-zh032e-0"
520
+ })(["position:absolute;transition:background-color 0.25s ease-in-out,opacity 0.25s ease-in-out 0.1s;opacity:0;&[data-garden-focus-visible],", ":hover &,", "[data-garden-focus-visible] &{opacity:1;}", ";", ";", ";&::before{position:absolute;z-index:-1;background-color:", ";width:100%;height:100%;content:'';}", ";"], StyledPaneSplitter, StyledPaneSplitter, sizeStyles, transformStyles, colorStyles, function (props) {
521
+ return props.theme.colors.background;
522
+ }, function (props) {
523
+ return retrieveComponentStyles(COMPONENT_ID, props);
524
+ });
525
+ StyledPaneSplitterButton.defaultProps = {
526
+ theme: DEFAULT_THEME
527
+ };
528
+
457
529
  var GridContext = createContext({
458
530
  gutters: 'md'
459
531
  });
@@ -693,8 +765,8 @@ var PaneProvider = function PaneProvider(_ref3) {
693
765
  var setColumnValue = useCallback(function (isStart, splitterId, value) {
694
766
  var columns = layoutIndices.columns,
695
767
  columnArray = layoutIndices.columnArray;
696
- var stealFromTraversal = isStart ? 0 : 1;
697
- var addToTraversal = isStart ? -1 : 0;
768
+ var stealFromTraversal = isStart ? -1 : 1;
769
+ var addToTraversal = 0;
698
770
  setColumnsTrack(function (state) {
699
771
  var stealFromIndex = columns[splitterId] + stealFromTraversal;
700
772
  var addToIndex = columns[splitterId] + addToTraversal;
@@ -792,9 +864,22 @@ var usePaneContext = function usePaneContext() {
792
864
  return useContext(PaneContext);
793
865
  };
794
866
 
867
+ var PaneSplitterContext = createContext({
868
+ orientation: 'start',
869
+ min: 0,
870
+ max: 0,
871
+ layoutKey: '',
872
+ valueNow: 0,
873
+ size: 0,
874
+ isRow: false
875
+ });
876
+ var usePaneSplitterContext = function usePaneSplitterContext() {
877
+ return useContext(PaneSplitterContext);
878
+ };
879
+
795
880
  var _excluded$1 = ["providerId", "layoutKey", "min", "max", "orientation"];
796
881
  var orientationToPosition = {
797
- start: SplitterPosition.TRAILS,
882
+ start: SplitterPosition.LEADS,
798
883
  end: SplitterPosition.TRAILS,
799
884
  top: SplitterPosition.LEADS,
800
885
  bottom: SplitterPosition.TRAILS
@@ -812,6 +897,7 @@ var orientationToDimension = {
812
897
  bottom: 'rows'
813
898
  };
814
899
  var SplitterComponent = forwardRef(function (_ref, ref) {
900
+ var _separatorProps$ref$c, _separatorProps$ref$c2;
815
901
  var providerId = _ref.providerId,
816
902
  layoutKey = _ref.layoutKey,
817
903
  min = _ref.min,
@@ -821,10 +907,16 @@ var SplitterComponent = forwardRef(function (_ref, ref) {
821
907
  var paneProviderContext = usePaneProviderContextData(providerId);
822
908
  var paneContext = usePaneContext();
823
909
  var themeContext = useContext(ThemeContext);
910
+ var _useState = useState(false),
911
+ _useState2 = _slicedToArray(_useState, 2),
912
+ isHovered = _useState2[0],
913
+ setIsHovered = _useState2[1];
824
914
  var position = orientationToPosition[orientation];
825
915
  var isRow = orientationToDimension[orientation] === 'rows';
826
916
  var splitterOrientation = paneToSplitterOrientation[orientation];
827
917
  var pixelsPerFr = paneProviderContext ? paneProviderContext.pixelsPerFr[orientationToDimension[orientation]] : 0;
918
+ var value = isRow ? paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getRowValue(layoutKey, true) : paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getColumnValue(layoutKey, true);
919
+ var valueInFr = isRow ? paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getRowValue(layoutKey) : paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getColumnValue(layoutKey);
828
920
  var _useSplitter = useSplitter({
829
921
  type: SplitterType.VARIABLE,
830
922
  orientation: splitterOrientation,
@@ -835,11 +927,11 @@ var SplitterComponent = forwardRef(function (_ref, ref) {
835
927
  environment: window,
836
928
  onChange: function onChange(valueNow) {
837
929
  if (isRow) {
838
- return paneProviderContext && paneProviderContext.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
930
+ return paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
839
931
  }
840
- return paneProviderContext && paneProviderContext.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
932
+ return paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
841
933
  },
842
- valueNow: isRow ? paneProviderContext && paneProviderContext.getRowValue(layoutKey, true) : paneProviderContext && paneProviderContext.getColumnValue(layoutKey, true)
934
+ valueNow: value
843
935
  }),
844
936
  getSeparatorProps = _useSplitter.getSeparatorProps,
845
937
  getPrimaryPaneProps = _useSplitter.getPrimaryPaneProps;
@@ -851,11 +943,31 @@ var SplitterComponent = forwardRef(function (_ref, ref) {
851
943
  var separatorProps = getSeparatorProps({
852
944
  'aria-controls': paneContext.id
853
945
  });
854
- return React.createElement(StyledPaneSplitter, _extends({
946
+ var size = isRow ? (_separatorProps$ref$c = separatorProps.ref.current) === null || _separatorProps$ref$c === void 0 ? void 0 : _separatorProps$ref$c.clientWidth : (_separatorProps$ref$c2 = separatorProps.ref.current) === null || _separatorProps$ref$c2 === void 0 ? void 0 : _separatorProps$ref$c2.clientHeight;
947
+ var onMouseOver = useMemo(function () {
948
+ return composeEventHandlers(props.onMouseOver, function (event) {
949
+ return setIsHovered(event.target === separatorProps.ref.current);
950
+ });
951
+ }, [props.onMouseOver, separatorProps.ref]);
952
+ return React.createElement(PaneSplitterContext.Provider, {
953
+ value: useMemo(function () {
954
+ return {
955
+ orientation: orientation,
956
+ layoutKey: layoutKey,
957
+ min: min,
958
+ max: max,
959
+ valueNow: valueInFr,
960
+ size: size,
961
+ isRow: isRow
962
+ };
963
+ }, [orientation, layoutKey, min, max, valueInFr, size, isRow])
964
+ }, React.createElement(StyledPaneSplitter, _extends({
965
+ isHovered: isHovered,
855
966
  orientation: orientation
856
967
  }, separatorProps, props, {
968
+ onMouseOver: onMouseOver,
857
969
  ref: mergeRefs([separatorProps.ref, ref])
858
- }));
970
+ })));
859
971
  });
860
972
  SplitterComponent.displayName = 'Pane.Splitter';
861
973
  SplitterComponent.propTypes = {
@@ -877,6 +989,76 @@ var ContentComponent = forwardRef(function (props, ref) {
877
989
  ContentComponent.displayName = 'Pane.Content';
878
990
  var Content = ContentComponent;
879
991
 
992
+ var SplitterButtonComponent = forwardRef(function (props, ref) {
993
+ var label = props.label,
994
+ defaultPlacement = props.placement;
995
+ var _usePaneSplitterConte = usePaneSplitterContext(),
996
+ orientation = _usePaneSplitterConte.orientation,
997
+ layoutKey = _usePaneSplitterConte.layoutKey,
998
+ min = _usePaneSplitterConte.min,
999
+ max = _usePaneSplitterConte.max,
1000
+ isRow = _usePaneSplitterConte.isRow,
1001
+ valueNow = _usePaneSplitterConte.valueNow,
1002
+ size = _usePaneSplitterConte.size,
1003
+ providerId = _usePaneSplitterConte.providerId;
1004
+ var paneProviderContext = usePaneProviderContextData(providerId);
1005
+ var isTop = orientation === 'top';
1006
+ var isStart = orientation === 'start';
1007
+ var isMin = valueNow === min;
1008
+ var placement = defaultPlacement;
1009
+ if (!defaultPlacement) {
1010
+ if (isRow) {
1011
+ placement = 'center';
1012
+ } else {
1013
+ placement = 'start';
1014
+ }
1015
+ }
1016
+ var setValue = useCallback(function (value) {
1017
+ if (isRow) {
1018
+ paneProviderContext.setRowValue(isTop, layoutKey, value);
1019
+ } else {
1020
+ paneProviderContext.setColumnValue(isStart, layoutKey, value);
1021
+ }
1022
+ }, [isRow, isTop, isStart, layoutKey, paneProviderContext]);
1023
+ var onClick = composeEventHandlers(props.onClick, function () {
1024
+ if (isMin) {
1025
+ setValue(max);
1026
+ } else {
1027
+ setValue(min);
1028
+ }
1029
+ });
1030
+ var onKeyDown = composeEventHandlers(props.onKeyDown, function (event) {
1031
+ return event.stopPropagation();
1032
+ }
1033
+ );
1034
+ var onMouseDown = composeEventHandlers(props.onMouseDown, function (event) {
1035
+ return event.stopPropagation();
1036
+ }
1037
+ );
1038
+ return React.createElement(Tooltip, {
1039
+ content: label,
1040
+ style: {
1041
+ cursor: 'default'
1042
+ },
1043
+ onMouseDown: function onMouseDown(e) {
1044
+ return e.stopPropagation();
1045
+ }
1046
+ }, React.createElement(StyledPaneSplitterButton, _extends({
1047
+ "aria-label": label
1048
+ }, props, {
1049
+ placement: placement,
1050
+ orientation: orientation,
1051
+ isRotated: isMin,
1052
+ splitterSize: size || 0,
1053
+ ref: ref,
1054
+ onClick: onClick,
1055
+ onKeyDown: onKeyDown,
1056
+ onMouseDown: onMouseDown
1057
+ })));
1058
+ });
1059
+ SplitterButtonComponent.displayName = 'Pane.SplitterButton';
1060
+ var SplitterButton = SplitterButtonComponent;
1061
+
880
1062
  var _excluded = ["children"];
881
1063
  var PaneComponent = forwardRef(function (_ref, ref) {
882
1064
  var children = _ref.children,
@@ -904,5 +1086,6 @@ PaneComponent.displayName = 'Pane';
904
1086
  var Pane = PaneComponent;
905
1087
  Pane.Content = Content;
906
1088
  Pane.Splitter = Splitter;
1089
+ Pane.SplitterButton = SplitterButton;
907
1090
 
908
1091
  export { ALIGN_ITEMS as ARRAY_ALIGN_ITEMS, ALIGN_SELF as ARRAY_ALIGN_SELF, DIRECTION as ARRAY_DIRECTION, JUSTIFY_CONTENT as ARRAY_JUSTIFY_CONTENT, SPACE as ARRAY_SPACE, TEXT_ALIGN as ARRAY_TEXT_ALIGN, WRAP as ARRAY_WRAP, Col, Grid, Pane, PaneProvider, Row };
@@ -7,10 +7,12 @@
7
7
  import React from 'react';
8
8
  import { Splitter } from './components/Splitter';
9
9
  import { Content } from './components/Content';
10
+ import { SplitterButton } from './components/SplitterButton';
10
11
  /**
11
12
  * @extends HTMLAttributes<HTMLDivElement>
12
13
  */
13
14
  export declare const Pane: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>> & {
14
15
  Content: typeof Content;
15
16
  Splitter: typeof Splitter;
17
+ SplitterButton: typeof SplitterButton;
16
18
  };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ import React from 'react';
8
+ import { ISplitterButtonProps } from '../../../types';
9
+ /**
10
+ * @extends ButtonHTMLAttributes<HTMLButtonElement>
11
+ */
12
+ export declare const SplitterButton: React.ForwardRefExoticComponent<ISplitterButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -10,4 +10,4 @@ export { Row } from './elements/Row';
10
10
  export { PaneProvider } from './elements/pane/PaneProvider';
11
11
  export { Pane } from './elements/pane/Pane';
12
12
  export { ALIGN_ITEMS as ARRAY_ALIGN_ITEMS, ALIGN_SELF as ARRAY_ALIGN_SELF, DIRECTION as ARRAY_DIRECTION, JUSTIFY_CONTENT as ARRAY_JUSTIFY_CONTENT, TEXT_ALIGN as ARRAY_TEXT_ALIGN, SPACE as ARRAY_SPACE, WRAP as ARRAY_WRAP } from './types';
13
- export type { IPaneProviderProps, ISplitterProps, IColProps, IGridProps, IRowProps, AlignItems as ALIGN_ITEMS, AlignSelf as ALIGN_SELF, Direction as DIRECTION, JustifyContent as JUSTIFY_CONTENT, TextAlign as TEXT_ALIGN, GridNumber as GRID_NUMBER, Breakpoint as BREAKPOINT, Space as SPACE, Wrap as WRAP } from './types';
13
+ export type { IPaneProviderProps, ISplitterProps, ISplitterButtonProps, IColProps, IGridProps, IRowProps, AlignItems as ALIGN_ITEMS, AlignSelf as ALIGN_SELF, Direction as DIRECTION, JustifyContent as JUSTIFY_CONTENT, TextAlign as TEXT_ALIGN, GridNumber as GRID_NUMBER, Breakpoint as BREAKPOINT, Space as SPACE, Wrap as WRAP } from './types';
@@ -10,3 +10,4 @@ export * from './StyledRow';
10
10
  export * from './pane/StyledPane';
11
11
  export * from './pane/StyledPaneContent';
12
12
  export * from './pane/StyledPaneSplitter';
13
+ export * from './pane/StyledPaneSplitterButton';
@@ -7,8 +7,13 @@
7
7
  import { DefaultTheme } from 'styled-components';
8
8
  import { Orientation } from '../../types';
9
9
  interface IStyledPaneSplitterProps {
10
+ isHovered: boolean;
10
11
  orientation: Orientation;
11
12
  }
13
+ /**
14
+ * 1. Elevated initial context to pickup full-width hover
15
+ * 2. Stack below splitter button.
16
+ */
12
17
  export declare const StyledPaneSplitter: import("styled-components").StyledComponent<"div", DefaultTheme, {
13
18
  'data-garden-id': string;
14
19
  'data-garden-version': string;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ /// <reference types="react" />
8
+ import { DefaultTheme } from 'styled-components';
9
+ import { ISplitterButtonProps, Orientation, PLACEMENT } from '../../types';
10
+ interface IStyledSplitterButtonProps extends ISplitterButtonProps {
11
+ orientation: Orientation;
12
+ placement: typeof PLACEMENT[number];
13
+ isRotated: boolean;
14
+ splitterSize: number;
15
+ }
16
+ /**
17
+ * 1. Opaque "dish" behind transparent button
18
+ */
19
+ export declare const StyledPaneSplitterButton: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("@zendeskgarden/react-buttons").IIconButtonProps & import("react").RefAttributes<HTMLButtonElement>>, DefaultTheme, IStyledSplitterButtonProps, never>;
20
+ export {};
@@ -4,7 +4,7 @@
4
4
  * Use of this source code is governed under the Apache License, Version 2.0
5
5
  * found at http://www.apache.org/licenses/LICENSE-2.0.
6
6
  */
7
- import { ReactNode, HTMLAttributes } from 'react';
7
+ import { ReactNode, HTMLAttributes, ButtonHTMLAttributes } from 'react';
8
8
  export declare const ALIGN_ITEMS: readonly ["start", "end", "center", "baseline", "stretch"];
9
9
  export declare const ALIGN_SELF: readonly ["auto", "start", "end", "center", "baseline", "stretch"];
10
10
  export declare const DIRECTION: readonly ["row", "row-reverse", "column", "column-reverse"];
@@ -12,6 +12,7 @@ export declare const JUSTIFY_CONTENT: readonly ["start", "end", "center", "betwe
12
12
  export declare const TEXT_ALIGN: readonly ["start", "end", "center", "justify"];
13
13
  export declare const SPACE: readonly [false, "xxs", "xs", "sm", "md", "lg", "xl", "xxl"];
14
14
  export declare const WRAP: readonly ["nowrap", "wrap", "wrap-reverse"];
15
+ export declare const PLACEMENT: readonly ["end", "start", "center"];
15
16
  export declare type AlignItems = typeof ALIGN_ITEMS[number];
16
17
  export declare type AlignSelf = typeof ALIGN_SELF[number];
17
18
  export declare type Direction = typeof DIRECTION[number];
@@ -205,3 +206,9 @@ export interface ISplitterProps extends HTMLAttributes<HTMLDivElement> {
205
206
  /** Determines splitter orientation within a pane */
206
207
  orientation?: Orientation;
207
208
  }
209
+ export interface ISplitterButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
210
+ /** Adjusts the placement of the splitter button. Assumes start when vertical and center when horizontal, by default. */
211
+ placement?: typeof PLACEMENT[number];
212
+ /** Renders the provided label text inside a tooltip */
213
+ label: string;
214
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Copyright Zendesk, Inc.
3
+ *
4
+ * Use of this source code is governed under the Apache License, Version 2.0
5
+ * found at http://www.apache.org/licenses/LICENSE-2.0.
6
+ */
7
+ /// <reference types="react" />
8
+ import { ISplitterProps, Orientation } from '../types';
9
+ interface IPaneSplitterContext {
10
+ orientation?: Orientation;
11
+ min: ISplitterProps['min'];
12
+ max: ISplitterProps['max'];
13
+ layoutKey: ISplitterProps['layoutKey'];
14
+ valueNow?: number;
15
+ size?: number;
16
+ isRow: boolean;
17
+ providerId?: ISplitterProps['providerId'];
18
+ }
19
+ export declare const PaneSplitterContext: import("react").Context<IPaneSplitterContext>;
20
+ /**
21
+ * Retrieve Pane Splitter component context
22
+ */
23
+ declare const usePaneSplitterContext: () => IPaneSplitterContext;
24
+ export default usePaneSplitterContext;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zendeskgarden/react-grid",
3
- "version": "8.52.0",
3
+ "version": "8.53.2",
4
4
  "description": "Components relating to layout grids in the Garden Design System",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Zendesk Garden <garden@zendesk.com>",
@@ -23,6 +23,8 @@
23
23
  "dependencies": {
24
24
  "@zendeskgarden/container-splitter": "^0.2.3",
25
25
  "@zendeskgarden/container-utilities": "^0.7.1",
26
+ "@zendeskgarden/react-buttons": "^8.53.2",
27
+ "@zendeskgarden/react-tooltips": "^8.53.2",
26
28
  "polished": "^4.0.0",
27
29
  "prop-types": "^15.5.7",
28
30
  "react-merge-refs": "^1.1.0"
@@ -34,8 +36,8 @@
34
36
  "styled-components": "^4.2.0 || ^5.0.0"
35
37
  },
36
38
  "devDependencies": {
37
- "@zendeskgarden/react-theming": "^8.52.0",
38
- "use-resize-observer": "^9.0.0"
39
+ "@zendeskgarden/react-theming": "^8.53.2",
40
+ "use-resize-observer": "9.0.0"
39
41
  },
40
42
  "keywords": [
41
43
  "components",
@@ -47,5 +49,5 @@
47
49
  "access": "public"
48
50
  },
49
51
  "zendeskgarden:src": "src/index.ts",
50
- "gitHead": "1bc3c4a001a73769a5e33b7431e8b5f895b7caec"
52
+ "gitHead": "b4ef84eb8f6606659aee9e689b8b44cb1feb0b87"
51
53
  }