@zendeskgarden/react-grid 8.51.0 → 8.53.1

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/dist/index.esm.js CHANGED
@@ -10,8 +10,11 @@ import PropTypes from 'prop-types';
10
10
  import styled, { css, ThemeContext } from 'styled-components';
11
11
  import { math, rgba } from 'polished';
12
12
  import { retrieveComponentStyles, DEFAULT_THEME, getColor } from '@zendeskgarden/react-theming';
13
+ import { ChevronButton } from '@zendeskgarden/react-buttons';
14
+ import { useId, composeEventHandlers } from '@zendeskgarden/container-utilities';
13
15
  import mergeRefs from 'react-merge-refs';
14
16
  import { SplitterPosition, SplitterOrientation, useSplitter, SplitterType } from '@zendeskgarden/container-splitter';
17
+ import { Tooltip } from '@zendeskgarden/react-tooltips';
15
18
 
16
19
  function ownKeys(object, enumerableOnly) {
17
20
  var keys = Object.keys(object);
@@ -176,7 +179,7 @@ var SPACE = [false, 'xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
176
179
  var WRAP = ['nowrap', 'wrap', 'wrap-reverse'];
177
180
  var ORIENTATION = ['top', 'bottom', 'start', 'end'];
178
181
 
179
- var COMPONENT_ID$5 = 'grid.col';
182
+ var COMPONENT_ID$6 = 'grid.col';
180
183
  var colorStyles$3 = function colorStyles(props) {
181
184
  var backgroundColor = getColor('primaryHue', 600, props.theme, 0.1);
182
185
  return css(["background-clip:content-box;background-color:", ";"], backgroundColor);
@@ -222,20 +225,20 @@ var flexStyles$1 = function flexStyles(size, alignSelf, textAlign, offset, order
222
225
  var mediaStyles$1 = function mediaStyles(minWidth, size, alignSelf, textAlign, offset, order, props) {
223
226
  return css(["@media (min-width:", "){", ";}"], minWidth, flexStyles$1(size, alignSelf, textAlign, offset, order, props));
224
227
  };
225
- var sizeStyles$3 = function sizeStyles(props) {
228
+ var sizeStyles$4 = function sizeStyles(props) {
226
229
  var padding = props.gutters ? math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
227
230
  return css(["padding-right:", ";padding-left:", ";"], padding, padding);
228
231
  };
229
232
  var StyledCol = styled.div.attrs({
230
- 'data-garden-id': COMPONENT_ID$5,
231
- 'data-garden-version': '8.51.0'
233
+ 'data-garden-id': COMPONENT_ID$6,
234
+ 'data-garden-version': '8.53.1'
232
235
  }).withConfig({
233
236
  displayName: "StyledCol",
234
237
  componentId: "sc-inuw62-0"
235
238
  })(["box-sizing:border-box;width:100%;", ";", ";", ";", ";", ";", ";", ";", ";", ";"], function (props) {
236
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);
237
240
  }, function (props) {
238
- return sizeStyles$3(props);
241
+ return sizeStyles$4(props);
239
242
  }, function (props) {
240
243
  return props.debug && colorStyles$3(props);
241
244
  }, function (props) {
@@ -249,44 +252,44 @@ var StyledCol = styled.div.attrs({
249
252
  }, function (props) {
250
253
  return mediaStyles$1(props.theme.breakpoints.xl, props.xl, props.alignSelfXl, props.textAlignXl, props.offsetXl, props.orderXl, props);
251
254
  }, function (props) {
252
- return retrieveComponentStyles(COMPONENT_ID$5, props);
255
+ return retrieveComponentStyles(COMPONENT_ID$6, props);
253
256
  });
254
257
  StyledCol.defaultProps = {
255
258
  columns: 12,
256
259
  theme: DEFAULT_THEME
257
260
  };
258
261
 
259
- var COMPONENT_ID$4 = 'grid.grid';
262
+ var COMPONENT_ID$5 = 'grid.grid';
260
263
  var colorStyles$2 = function colorStyles(props) {
261
264
  var borderColor = getColor(props.theme.palette.crimson, 400, props.theme, 0.5);
262
265
  var borderWidth = math("".concat(props.theme.borderWidths.sm, " * 2"));
263
266
  return css(["box-shadow:-", " 0 0 0 ", ",", " 0 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
264
267
  };
265
- var sizeStyles$2 = function sizeStyles(props) {
268
+ var sizeStyles$3 = function sizeStyles(props) {
266
269
  var padding = props.gutters ? math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
267
270
  return css(["padding-right:", ";padding-left:", ";"], padding, padding);
268
271
  };
269
272
  var StyledGrid = styled.div.attrs({
270
- 'data-garden-id': COMPONENT_ID$4,
271
- 'data-garden-version': '8.51.0'
273
+ 'data-garden-id': COMPONENT_ID$5,
274
+ 'data-garden-version': '8.53.1'
272
275
  }).withConfig({
273
276
  displayName: "StyledGrid",
274
277
  componentId: "sc-oxgg5i-0"
275
278
  })(["direction:", ";margin-right:auto;margin-left:auto;width:100%;box-sizing:border-box;", ";", ";", ";"], function (props) {
276
279
  return props.theme.rtl && 'rtl';
277
280
  }, function (props) {
278
- return sizeStyles$2(props);
281
+ return sizeStyles$3(props);
279
282
  }, function (props) {
280
283
  return props.debug && colorStyles$2(props);
281
284
  }, function (props) {
282
- return retrieveComponentStyles(COMPONENT_ID$4, props);
285
+ return retrieveComponentStyles(COMPONENT_ID$5, props);
283
286
  });
284
287
  StyledGrid.defaultProps = {
285
288
  gutters: 'md',
286
289
  theme: DEFAULT_THEME
287
290
  };
288
291
 
289
- var COMPONENT_ID$3 = 'grid.row';
292
+ var COMPONENT_ID$4 = 'grid.row';
290
293
  var colorStyles$1 = function colorStyles(props) {
291
294
  var borderColor = getColor(props.theme.palette.mint, 600, props.theme, 0.5);
292
295
  var borderWidth = props.theme.borderWidths.sm;
@@ -312,20 +315,20 @@ var flexStyles = function flexStyles(alignItems, justifyContent, wrap) {
312
315
  var mediaStyles = function mediaStyles(minWidth, alignItems, justifyContent, wrap) {
313
316
  return css(["@media (min-width:", "){", ";}"], minWidth, flexStyles(alignItems, justifyContent, wrap));
314
317
  };
315
- var sizeStyles$1 = function sizeStyles(props) {
318
+ var sizeStyles$2 = function sizeStyles(props) {
316
319
  var margin = props.gutters ? math("".concat(props.theme.space[props.gutters], " / 2")) : 0;
317
320
  return css(["margin-right:-", ";margin-left:-", ";"], margin, margin);
318
321
  };
319
322
  var StyledRow = styled.div.attrs({
320
- 'data-garden-id': COMPONENT_ID$3,
321
- 'data-garden-version': '8.51.0'
323
+ 'data-garden-id': COMPONENT_ID$4,
324
+ 'data-garden-version': '8.53.1'
322
325
  }).withConfig({
323
326
  displayName: "StyledRow",
324
327
  componentId: "sc-xjsdg1-0"
325
328
  })(["display:flex;box-sizing:border-box;", " ", ";", ";", ";", ";", ";", ";", ";", ";"], function (props) {
326
329
  return flexStyles(props.alignItems, props.justifyContent, props.wrapAll);
327
330
  }, function (props) {
328
- return sizeStyles$1(props);
331
+ return sizeStyles$2(props);
329
332
  }, function (props) {
330
333
  return props.debug && colorStyles$1(props);
331
334
  }, function (props) {
@@ -339,42 +342,42 @@ var StyledRow = styled.div.attrs({
339
342
  }, function (props) {
340
343
  return mediaStyles(props.theme.breakpoints.xl, props.alignItemsXl, props.justifyContentXl, props.wrapXl);
341
344
  }, function (props) {
342
- return retrieveComponentStyles(COMPONENT_ID$3, props);
345
+ return retrieveComponentStyles(COMPONENT_ID$4, props);
343
346
  });
344
347
  StyledRow.defaultProps = {
345
348
  wrapAll: 'wrap',
346
349
  theme: DEFAULT_THEME
347
350
  };
348
351
 
349
- var COMPONENT_ID$2 = 'pane';
352
+ var COMPONENT_ID$3 = 'pane';
350
353
  var StyledPane = styled.div.attrs({
351
- 'data-garden-id': COMPONENT_ID$2,
352
- 'data-garden-version': '8.51.0'
354
+ 'data-garden-id': COMPONENT_ID$3,
355
+ 'data-garden-version': '8.53.1'
353
356
  }).withConfig({
354
357
  displayName: "StyledPane",
355
358
  componentId: "sc-1ltjst7-0"
356
359
  })(["position:relative;min-width:0;min-height:0;", ";"], function (props) {
357
- return retrieveComponentStyles(COMPONENT_ID$2, props);
360
+ return retrieveComponentStyles(COMPONENT_ID$3, props);
358
361
  });
359
362
  StyledPane.defaultProps = {
360
363
  theme: DEFAULT_THEME
361
364
  };
362
365
 
363
- var COMPONENT_ID$1 = 'pane.content';
366
+ var COMPONENT_ID$2 = 'pane.content';
364
367
  var StyledPaneContent = styled.div.attrs({
365
- 'data-garden-id': COMPONENT_ID$1,
366
- 'data-garden-version': '8.51.0'
368
+ 'data-garden-id': COMPONENT_ID$2,
369
+ 'data-garden-version': '8.53.1'
367
370
  }).withConfig({
368
371
  displayName: "StyledPaneContent",
369
372
  componentId: "sc-1b38mbh-0"
370
373
  })(["height:100%;overflow:auto;", ";"], function (props) {
371
- return retrieveComponentStyles(COMPONENT_ID$1, props);
374
+ return retrieveComponentStyles(COMPONENT_ID$2, props);
372
375
  });
373
376
  StyledPaneContent.defaultProps = {
374
377
  theme: DEFAULT_THEME
375
378
  };
376
379
 
377
- var COMPONENT_ID = 'pane.splitter';
380
+ var COMPONENT_ID$1 = 'pane.splitter';
378
381
  var colorStyles = function colorStyles(props) {
379
382
  var color = getColor('neutralHue', 300, props.theme);
380
383
  var hoverColor = getColor('primaryHue', 600, props.theme);
@@ -382,7 +385,7 @@ var colorStyles = function colorStyles(props) {
382
385
  var boxShadow = props.theme.shadows.md(rgba(hoverColor, 0.35));
383
386
  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);
384
387
  };
385
- var sizeStyles = function sizeStyles(props) {
388
+ var sizeStyles$1 = function sizeStyles(props) {
386
389
  var size = math("".concat(props.theme.shadowWidths.md, " * 2"));
387
390
  var offset = math("-".concat(size, " / 2"));
388
391
  var cursor;
@@ -438,21 +441,80 @@ var sizeStyles = function sizeStyles(props) {
438
441
  }
439
442
  break;
440
443
  }
441
- 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);
444
+ 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, width === '100%' ? 'height' : 'width', math("".concat(props.theme.borderWidths.sm, " * 2")), props.theme.borderRadii.md);
442
445
  };
443
446
  var StyledPaneSplitter = styled.div.attrs({
444
- 'data-garden-id': COMPONENT_ID,
445
- 'data-garden-version': '8.51.0'
447
+ 'data-garden-id': COMPONENT_ID$1,
448
+ 'data-garden-version': '8.53.1'
446
449
  }).withConfig({
447
450
  displayName: "StyledPaneSplitter",
448
451
  componentId: "sc-jylemn-0"
449
- })(["position:absolute;z-index:1;", ";&:hover,&[data-garden-focus-visible]{z-index:2;}&:focus{outline:none;}&::before{display:block;content:'';}", ";", ";"], sizeStyles, colorStyles, function (props) {
450
- return retrieveComponentStyles(COMPONENT_ID, props);
452
+ })(["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, function (props) {
453
+ return retrieveComponentStyles(COMPONENT_ID$1, props);
451
454
  });
452
455
  StyledPaneSplitter.defaultProps = {
453
456
  theme: DEFAULT_THEME
454
457
  };
455
458
 
459
+ var COMPONENT_ID = 'pane.splitter_button';
460
+ var transformStyles = function transformStyles(props) {
461
+ var degrees = 0;
462
+ if (props.isRotated) {
463
+ degrees = props.theme.rtl ? -180 : 180;
464
+ }
465
+ if (props.orientation === 'end') {
466
+ degrees += props.theme.rtl ? -90 : 90;
467
+ } else if (props.orientation === 'start') {
468
+ degrees += props.theme.rtl ? 90 : -90;
469
+ } else if (props.orientation === 'bottom') {
470
+ degrees += 180;
471
+ }
472
+ return css(["& > svg{transform:rotate(", "deg);}"], degrees);
473
+ };
474
+ var sizeStyles = function sizeStyles(props) {
475
+ var size = "".concat(props.theme.space.base * 6, "px");
476
+ var isVertical = props.orientation === 'start' || props.orientation === 'end';
477
+ var top;
478
+ var left;
479
+ var right;
480
+ var bottom;
481
+ if (props.placement === 'start') {
482
+ if (isVertical) {
483
+ top = size;
484
+ } else if (props.theme.rtl) {
485
+ right = size;
486
+ } else {
487
+ left = size;
488
+ }
489
+ } else if (props.placement === 'end') {
490
+ if (isVertical) {
491
+ bottom = size;
492
+ } else if (props.theme.rtl) {
493
+ left = size;
494
+ } else {
495
+ right = size;
496
+ }
497
+ }
498
+ return css(["top:", ";right:", ";bottom:", ";left:", ";width:", ";min-width:", ";height:", ";"], top, right, bottom, left, size, size, size);
499
+ };
500
+ var StyledPaneSplitterButton = styled(ChevronButton).attrs({
501
+ 'data-garden-id': COMPONENT_ID,
502
+ 'data-garden-version': '8.53.1',
503
+ isBasic: true,
504
+ isPill: true,
505
+ size: 'small'
506
+ }).withConfig({
507
+ displayName: "StyledPaneSplitterButton",
508
+ componentId: "sc-zh032e-0"
509
+ })(["position:absolute;transition:box-shadow 0.1s ease-in-out,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, function (props) {
510
+ return props.theme.colors.background;
511
+ }, function (props) {
512
+ return retrieveComponentStyles(COMPONENT_ID, props);
513
+ });
514
+ StyledPaneSplitterButton.defaultProps = {
515
+ theme: DEFAULT_THEME
516
+ };
517
+
456
518
  var GridContext = createContext({
457
519
  gutters: 'md'
458
520
  });
@@ -576,30 +638,14 @@ Row.propTypes = {
576
638
  wrapXl: PropTypes.oneOf(WRAP)
577
639
  };
578
640
 
579
- var SplitterContext = createContext({
580
- setRowValue: function setRowValue() {
581
- return undefined;
582
- },
583
- setColumnValue: function setColumnValue() {
584
- return undefined;
585
- },
586
- getColumnValue: function getColumnValue() {
587
- return 0;
588
- },
589
- getRowValue: function getRowValue() {
590
- return 0;
591
- },
592
- rowState: {},
593
- columnState: {},
594
- totalPanesHeight: 1,
595
- totalPanesWidth: 1,
596
- pixelsPerFr: {
597
- rows: 0,
598
- columns: 0
599
- }
600
- });
601
- var useSplitterContext = function useSplitterContext() {
602
- return useContext(SplitterContext);
641
+ var PaneProviderContext = createContext({});
642
+ var usePaneProviderContextData = function usePaneProviderContextData(providerId) {
643
+ var context = useContext(PaneProviderContext);
644
+ var id = providerId || context.providerId;
645
+ return id && context.contextData ? context.contextData[id] : undefined;
646
+ };
647
+ var usePaneProviderContext = function usePaneProviderContext() {
648
+ return useContext(PaneProviderContext);
603
649
  };
604
650
 
605
651
  var getPixelsPerFr = function getPixelsPerFr(totalFrs, totalDimension) {
@@ -615,7 +661,8 @@ var convertToPixels = function convertToPixels(values, pixelsPerFr) {
615
661
  }, {});
616
662
  };
617
663
  var PaneProvider = function PaneProvider(_ref3) {
618
- var totalPanesWidth = _ref3.totalPanesWidth,
664
+ var id = _ref3.id,
665
+ totalPanesWidth = _ref3.totalPanesWidth,
619
666
  totalPanesHeight = _ref3.totalPanesHeight,
620
667
  defaultRowValues = _ref3.defaultRowValues,
621
668
  defaultColumnValues = _ref3.defaultColumnValues,
@@ -635,17 +682,17 @@ var PaneProvider = function PaneProvider(_ref3) {
635
682
  var rowsTrack = isControlled ? rowValues : rowState;
636
683
  var columnsTrack = isControlled ? columnValues : columnState;
637
684
  var setRowsTrack = useCallback(function (values) {
638
- if (onChange) {
685
+ if (isControlled && onChange) {
639
686
  return onChange(values(rowsTrack), columnsTrack);
640
687
  }
641
688
  return setRowState(values);
642
- }, [onChange, setRowState, columnsTrack, rowsTrack]);
689
+ }, [isControlled, onChange, setRowState, columnsTrack, rowsTrack]);
643
690
  var setColumnsTrack = useCallback(function (values) {
644
- if (onChange) {
691
+ if (isControlled && onChange) {
645
692
  return onChange(rowsTrack, values(columnsTrack));
646
693
  }
647
694
  return setColumnState(values);
648
- }, [onChange, setColumnState, rowsTrack, columnsTrack]);
695
+ }, [isControlled, onChange, setColumnState, rowsTrack, columnsTrack]);
649
696
  var totalFractions = useMemo(function () {
650
697
  return {
651
698
  rows: Object.values(rowsTrack).reduce(function (prev, value) {
@@ -686,15 +733,15 @@ var PaneProvider = function PaneProvider(_ref3) {
686
733
  columnArray: columnArray
687
734
  };
688
735
  }, [rowsTrack, columnsTrack]);
689
- var setRowValue = useCallback(function (isTop, id, value) {
736
+ var setRowValue = useCallback(function (isTop, splitterId, value) {
690
737
  var rows = layoutIndices.rows,
691
738
  rowArray = layoutIndices.rowArray;
692
739
  var stealFromTraversal = isTop ? -1 : 1;
693
740
  var addToTraversal = 0;
694
741
  setRowsTrack(function (state) {
695
- var oldValue = rowsTrack[id];
696
- var stealFromIndex = rows[id] + stealFromTraversal;
697
- var addToIndex = rows[id] + addToTraversal;
742
+ var oldValue = rowsTrack[splitterId];
743
+ var stealFromIndex = rows[splitterId] + stealFromTraversal;
744
+ var addToIndex = rows[splitterId] + addToTraversal;
698
745
  var stealFromKey = rowArray[stealFromIndex];
699
746
  var addToKey = rowArray[addToIndex];
700
747
  var difference = oldValue - value;
@@ -704,15 +751,15 @@ var PaneProvider = function PaneProvider(_ref3) {
704
751
  return nextState;
705
752
  });
706
753
  }, [layoutIndices, rowsTrack, setRowsTrack]);
707
- var setColumnValue = useCallback(function (isStart, id, value) {
754
+ var setColumnValue = useCallback(function (isStart, splitterId, value) {
708
755
  var columns = layoutIndices.columns,
709
756
  columnArray = layoutIndices.columnArray;
710
- var stealFromTraversal = isStart ? 0 : 1;
711
- var addToTraversal = isStart ? -1 : 0;
757
+ var stealFromTraversal = isStart ? -1 : 1;
758
+ var addToTraversal = 0;
712
759
  setColumnsTrack(function (state) {
713
- var stealFromIndex = columns[id] + stealFromTraversal;
714
- var addToIndex = columns[id] + addToTraversal;
715
- var oldValue = columnsTrack[id];
760
+ var stealFromIndex = columns[splitterId] + stealFromTraversal;
761
+ var addToIndex = columns[splitterId] + addToTraversal;
762
+ var oldValue = columnsTrack[splitterId];
716
763
  var stealFromKey = columnArray[stealFromIndex];
717
764
  var addToKey = columnArray[addToIndex];
718
765
  var difference = oldValue - value;
@@ -756,22 +803,28 @@ var PaneProvider = function PaneProvider(_ref3) {
756
803
  return "".concat(rowsTrack[row], "fr");
757
804
  }).join(' ');
758
805
  }, [layoutIndices, rowsTrack, layoutStateInPixels]);
759
- var splitterContext = useMemo(function () {
760
- return {
761
- columnState: columnState,
762
- rowState: rowState,
763
- setRowValue: setRowValue,
764
- setColumnValue: setColumnValue,
765
- getRowValue: getRowValue,
766
- getColumnValue: getColumnValue,
767
- totalPanesHeight: totalPanesHeight,
768
- totalPanesWidth: totalPanesWidth,
769
- pixelsPerFr: pixelsPerFr
770
- };
771
- }, [rowState, columnState, setRowValue, setColumnValue, getRowValue, getColumnValue, totalPanesHeight, totalPanesWidth, pixelsPerFr]);
772
- return React.createElement(SplitterContext.Provider, {
773
- value: splitterContext
806
+ var providerId = useId(id);
807
+ var parentPaneProviderContext = usePaneProviderContext();
808
+ var paneProviderContext = useMemo(function () {
809
+ return providerId ? {
810
+ providerId: providerId,
811
+ contextData: _objectSpread2(_objectSpread2({}, parentPaneProviderContext.contextData), {}, _defineProperty({}, providerId, {
812
+ columnState: columnState,
813
+ rowState: rowState,
814
+ setRowValue: setRowValue,
815
+ setColumnValue: setColumnValue,
816
+ getRowValue: getRowValue,
817
+ getColumnValue: getColumnValue,
818
+ totalPanesHeight: totalPanesHeight,
819
+ totalPanesWidth: totalPanesWidth,
820
+ pixelsPerFr: pixelsPerFr
821
+ }))
822
+ } : {};
823
+ }, [providerId, parentPaneProviderContext, rowState, columnState, setRowValue, setColumnValue, getRowValue, getColumnValue, totalPanesHeight, totalPanesWidth, pixelsPerFr]);
824
+ return React.createElement(PaneProviderContext.Provider, {
825
+ value: paneProviderContext
774
826
  }, children === null || children === void 0 ? void 0 : children({
827
+ id: providerId,
775
828
  getRowValue: getRowValue,
776
829
  getColumnValue: getColumnValue,
777
830
  getGridTemplateColumns: getGridTemplateColumns,
@@ -780,6 +833,7 @@ var PaneProvider = function PaneProvider(_ref3) {
780
833
  };
781
834
  PaneProvider.displayName = 'PaneProvider';
782
835
  PaneProvider.propTypes = {
836
+ id: PropTypes.string,
783
837
  totalPanesWidth: PropTypes.number.isRequired,
784
838
  totalPanesHeight: PropTypes.number.isRequired,
785
839
  defaultRowValues: PropTypes.object,
@@ -799,9 +853,21 @@ var usePaneContext = function usePaneContext() {
799
853
  return useContext(PaneContext);
800
854
  };
801
855
 
802
- var _excluded$1 = ["layoutKey", "min", "max", "orientation"];
856
+ var PaneSplitterContext = createContext({
857
+ orientation: 'start',
858
+ min: 0,
859
+ max: 0,
860
+ layoutKey: '',
861
+ valueNow: 0,
862
+ isRow: false
863
+ });
864
+ var usePaneSplitterContext = function usePaneSplitterContext() {
865
+ return useContext(PaneSplitterContext);
866
+ };
867
+
868
+ var _excluded$1 = ["providerId", "layoutKey", "min", "max", "orientation"];
803
869
  var orientationToPosition = {
804
- start: SplitterPosition.TRAILS,
870
+ start: SplitterPosition.LEADS,
805
871
  end: SplitterPosition.TRAILS,
806
872
  top: SplitterPosition.LEADS,
807
873
  bottom: SplitterPosition.TRAILS
@@ -819,18 +885,21 @@ var orientationToDimension = {
819
885
  bottom: 'rows'
820
886
  };
821
887
  var SplitterComponent = forwardRef(function (_ref, ref) {
822
- var layoutKey = _ref.layoutKey,
888
+ var providerId = _ref.providerId,
889
+ layoutKey = _ref.layoutKey,
823
890
  min = _ref.min,
824
891
  max = _ref.max,
825
892
  orientation = _ref.orientation,
826
893
  props = _objectWithoutProperties(_ref, _excluded$1);
827
- var splitterContext = useSplitterContext();
894
+ var paneProviderContext = usePaneProviderContextData(providerId);
828
895
  var paneContext = usePaneContext();
829
896
  var themeContext = useContext(ThemeContext);
830
897
  var position = orientationToPosition[orientation];
831
898
  var isRow = orientationToDimension[orientation] === 'rows';
832
899
  var splitterOrientation = paneToSplitterOrientation[orientation];
833
- var pixelsPerFr = splitterContext.pixelsPerFr[orientationToDimension[orientation]];
900
+ var pixelsPerFr = paneProviderContext ? paneProviderContext.pixelsPerFr[orientationToDimension[orientation]] : 0;
901
+ 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);
902
+ var valueInFr = isRow ? paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getRowValue(layoutKey) : paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.getColumnValue(layoutKey);
834
903
  var _useSplitter = useSplitter({
835
904
  type: SplitterType.VARIABLE,
836
905
  orientation: splitterOrientation,
@@ -841,11 +910,11 @@ var SplitterComponent = forwardRef(function (_ref, ref) {
841
910
  environment: window,
842
911
  onChange: function onChange(valueNow) {
843
912
  if (isRow) {
844
- return splitterContext.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
913
+ return paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
845
914
  }
846
- return splitterContext.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
915
+ return paneProviderContext === null || paneProviderContext === void 0 ? void 0 : paneProviderContext.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
847
916
  },
848
- valueNow: isRow ? splitterContext.getRowValue(layoutKey, true) : splitterContext.getColumnValue(layoutKey, true)
917
+ valueNow: value
849
918
  }),
850
919
  getSeparatorProps = _useSplitter.getSeparatorProps,
851
920
  getPrimaryPaneProps = _useSplitter.getPrimaryPaneProps;
@@ -857,11 +926,22 @@ var SplitterComponent = forwardRef(function (_ref, ref) {
857
926
  var separatorProps = getSeparatorProps({
858
927
  'aria-controls': paneContext.id
859
928
  });
860
- return React.createElement(StyledPaneSplitter, _extends({
929
+ return React.createElement(PaneSplitterContext.Provider, {
930
+ value: useMemo(function () {
931
+ return {
932
+ orientation: orientation,
933
+ layoutKey: layoutKey,
934
+ min: min,
935
+ max: max,
936
+ valueNow: valueInFr,
937
+ isRow: isRow
938
+ };
939
+ }, [orientation, layoutKey, min, max, valueInFr, isRow])
940
+ }, React.createElement(StyledPaneSplitter, _extends({
861
941
  orientation: orientation
862
942
  }, separatorProps, props, {
863
943
  ref: mergeRefs([separatorProps.ref, ref])
864
- }));
944
+ })));
865
945
  });
866
946
  SplitterComponent.displayName = 'Pane.Splitter';
867
947
  SplitterComponent.propTypes = {
@@ -883,6 +963,63 @@ var ContentComponent = forwardRef(function (props, ref) {
883
963
  ContentComponent.displayName = 'Pane.Content';
884
964
  var Content = ContentComponent;
885
965
 
966
+ var SplitterButtonComponent = forwardRef(function (props, ref) {
967
+ var label = props.label,
968
+ defaultPlacement = props.placement;
969
+ var _usePaneSplitterConte = usePaneSplitterContext(),
970
+ orientation = _usePaneSplitterConte.orientation,
971
+ layoutKey = _usePaneSplitterConte.layoutKey,
972
+ min = _usePaneSplitterConte.min,
973
+ max = _usePaneSplitterConte.max,
974
+ isRow = _usePaneSplitterConte.isRow,
975
+ valueNow = _usePaneSplitterConte.valueNow,
976
+ providerId = _usePaneSplitterConte.providerId;
977
+ var paneProviderContext = usePaneProviderContextData(providerId);
978
+ var isTop = orientation === 'top';
979
+ var isStart = orientation === 'start';
980
+ var isMin = valueNow === min;
981
+ var placement = defaultPlacement;
982
+ if (!defaultPlacement) {
983
+ if (isRow) {
984
+ placement = 'center';
985
+ } else {
986
+ placement = 'start';
987
+ }
988
+ }
989
+ var setValue = useCallback(function (value) {
990
+ if (isRow) {
991
+ paneProviderContext.setRowValue(isTop, layoutKey, value);
992
+ return;
993
+ }
994
+ paneProviderContext.setColumnValue(isStart, layoutKey, value);
995
+ }, [isRow, isTop, isStart, layoutKey, paneProviderContext]);
996
+ var onClick = composeEventHandlers(props.onClick, function () {
997
+ if (isMin) {
998
+ setValue(max);
999
+ } else {
1000
+ setValue(min);
1001
+ }
1002
+ });
1003
+ var onKeyDown = composeEventHandlers(props.onKeyDown, function (event) {
1004
+ return event.stopPropagation();
1005
+ }
1006
+ );
1007
+ return React.createElement(Tooltip, {
1008
+ content: label
1009
+ }, React.createElement(StyledPaneSplitterButton, _extends({
1010
+ "aria-label": label
1011
+ }, props, {
1012
+ placement: placement,
1013
+ orientation: orientation,
1014
+ isRotated: isMin,
1015
+ ref: ref,
1016
+ onClick: onClick,
1017
+ onKeyDown: onKeyDown
1018
+ })));
1019
+ });
1020
+ SplitterButtonComponent.displayName = 'Pane.SplitterButton';
1021
+ var SplitterButton = SplitterButtonComponent;
1022
+
886
1023
  var _excluded = ["children"];
887
1024
  var PaneComponent = forwardRef(function (_ref, ref) {
888
1025
  var children = _ref.children,
@@ -910,5 +1047,6 @@ PaneComponent.displayName = 'Pane';
910
1047
  var Pane = PaneComponent;
911
1048
  Pane.Content = Content;
912
1049
  Pane.Splitter = Splitter;
1050
+ Pane.SplitterButton = SplitterButton;
913
1051
 
914
1052
  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
  };
@@ -7,9 +7,10 @@
7
7
  import PropTypes from 'prop-types';
8
8
  import { IPaneProviderProps } from '../../types';
9
9
  export declare const PaneProvider: {
10
- ({ totalPanesWidth, totalPanesHeight, defaultRowValues, defaultColumnValues, rowValues, columnValues, onChange, children }: IPaneProviderProps): JSX.Element;
10
+ ({ id, totalPanesWidth, totalPanesHeight, defaultRowValues, defaultColumnValues, rowValues, columnValues, onChange, children }: IPaneProviderProps): JSX.Element;
11
11
  displayName: string;
12
12
  propTypes: {
13
+ id: PropTypes.Requireable<string>;
13
14
  totalPanesWidth: PropTypes.Validator<number>;
14
15
  totalPanesHeight: PropTypes.Validator<number>;
15
16
  defaultRowValues: PropTypes.Requireable<object>;
@@ -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';
@@ -9,6 +9,10 @@ import { Orientation } from '../../types';
9
9
  interface IStyledPaneSplitterProps {
10
10
  orientation: Orientation;
11
11
  }
12
+ /**
13
+ * 1. Elevated initial context to pickup full-width hover
14
+ * 2. Stack below splitter button.
15
+ */
12
16
  export declare const StyledPaneSplitter: import("styled-components").StyledComponent<"div", DefaultTheme, {
13
17
  'data-garden-id': string;
14
18
  'data-garden-version': string;