@zendeskgarden/react-grid 9.0.0-next.2 → 9.0.0-next.20

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.
Files changed (34) hide show
  1. package/README.md +10 -10
  2. package/dist/esm/elements/Col.js +72 -0
  3. package/dist/esm/elements/Grid.js +54 -0
  4. package/dist/esm/elements/Row.js +58 -0
  5. package/dist/esm/elements/pane/Pane.js +55 -0
  6. package/dist/esm/elements/pane/PaneProvider.js +197 -0
  7. package/dist/esm/elements/pane/components/Content.js +30 -0
  8. package/dist/esm/elements/pane/components/Splitter.js +128 -0
  9. package/dist/esm/elements/pane/components/SplitterButton.js +91 -0
  10. package/dist/esm/index.js +12 -0
  11. package/dist/esm/styled/StyledCol.js +89 -0
  12. package/dist/esm/styled/StyledGrid.js +49 -0
  13. package/dist/esm/styled/StyledRow.js +65 -0
  14. package/dist/esm/styled/pane/StyledPane.js +22 -0
  15. package/dist/esm/styled/pane/StyledPaneContent.js +22 -0
  16. package/dist/esm/styled/pane/StyledPaneSplitter.js +119 -0
  17. package/dist/esm/styled/pane/StyledPaneSplitterButton.js +46 -0
  18. package/dist/esm/styled/pane/StyledPaneSplitterButtonContainer.js +128 -0
  19. package/dist/esm/types/index.js +16 -0
  20. package/dist/esm/utils/useGridContext.js +16 -0
  21. package/dist/esm/utils/usePaneContext.js +16 -0
  22. package/dist/esm/utils/usePaneProviderContext.js +17 -0
  23. package/dist/esm/utils/usePaneSplitterContext.js +22 -0
  24. package/dist/index.cjs.js +290 -155
  25. package/dist/typings/elements/Col.d.ts +2 -0
  26. package/dist/typings/elements/Grid.d.ts +7 -1
  27. package/dist/typings/elements/Row.d.ts +2 -0
  28. package/dist/typings/index.d.ts +1 -1
  29. package/dist/typings/styled/index.d.ts +1 -0
  30. package/dist/typings/styled/pane/StyledPaneSplitter.d.ts +0 -1
  31. package/dist/typings/styled/pane/StyledPaneSplitterButton.d.ts +3 -7
  32. package/dist/typings/styled/pane/StyledPaneSplitterButtonContainer.d.ts +18 -0
  33. package/package.json +10 -10
  34. package/dist/index.esm.js +0 -903
package/dist/index.esm.js DELETED
@@ -1,903 +0,0 @@
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
-
8
- import React, { createContext, useContext, useMemo, useState, useCallback, forwardRef, useRef, useEffect } from 'react';
9
- import PropTypes from 'prop-types';
10
- import styled, { css, ThemeContext } from 'styled-components';
11
- import { math, stripUnit } from 'polished';
12
- import { retrieveComponentStyles, DEFAULT_THEME, getColor, SELECTOR_FOCUS_VISIBLE, focusStyles, useDocument, useText } from '@zendeskgarden/react-theming';
13
- import { ChevronButton } from '@zendeskgarden/react-buttons';
14
- import { useId, composeEventHandlers } from '@zendeskgarden/container-utilities';
15
- import useResizeObserver from 'use-resize-observer';
16
- import { mergeRefs } from 'react-merge-refs';
17
- import { useSplitter } from '@zendeskgarden/container-splitter';
18
- import { Tooltip } from '@zendeskgarden/react-tooltips';
19
-
20
- function _extends() {
21
- _extends = Object.assign ? Object.assign.bind() : function (target) {
22
- for (var i = 1; i < arguments.length; i++) {
23
- var source = arguments[i];
24
- for (var key in source) {
25
- if (Object.prototype.hasOwnProperty.call(source, key)) {
26
- target[key] = source[key];
27
- }
28
- }
29
- }
30
- return target;
31
- };
32
- return _extends.apply(this, arguments);
33
- }
34
-
35
- const ALIGN_ITEMS = ['start', 'end', 'center', 'baseline', 'stretch'];
36
- const ALIGN_SELF = ['auto', ...ALIGN_ITEMS];
37
- const DIRECTION = ['row', 'row-reverse', 'column', 'column-reverse'];
38
- const JUSTIFY_CONTENT = ['start', 'end', 'center', 'between', 'around'];
39
- const TEXT_ALIGN = ['start', 'end', 'center', 'justify'];
40
- const SPACE = [false, 'xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
41
- const WRAP = ['nowrap', 'wrap', 'wrap-reverse'];
42
- const ORIENTATION = ['top', 'bottom', 'start', 'end'];
43
-
44
- const COMPONENT_ID$6 = 'grid.col';
45
- const colorStyles$4 = props => {
46
- const backgroundColor = getColor('primaryHue', 600, props.theme, 0.1);
47
- return css(["background-clip:content-box;background-color:", ";"], backgroundColor);
48
- };
49
- const flexStyles$1 = (size, alignSelf, textAlign, offset, order, props) => {
50
- const margin = offset && `${math(`${offset} / ${props.columns} * 100`)}%`;
51
- let flexBasis;
52
- let flexGrow;
53
- let maxWidth;
54
- let width;
55
- if (typeof size === 'boolean') {
56
- flexBasis = 0;
57
- flexGrow = 1;
58
- maxWidth = '100%';
59
- } else if (size === 'auto') {
60
- flexBasis = 'auto';
61
- flexGrow = 0;
62
- maxWidth = '100%';
63
- width = 'auto';
64
- } else if (size !== undefined) {
65
- flexBasis = `${math(`${size} / ${props.columns} * 100`)}%`;
66
- flexGrow = 0;
67
- maxWidth = flexBasis;
68
- }
69
- let horizontalAlign;
70
- if (textAlign === 'start') {
71
- horizontalAlign = props.theme.rtl ? 'right' : 'left';
72
- } else if (textAlign === 'end') {
73
- horizontalAlign = props.theme.rtl ? 'left' : 'right';
74
- } else {
75
- horizontalAlign = textAlign;
76
- }
77
- let flexOrder;
78
- if (order === 'first') {
79
- flexOrder = -1;
80
- } else if (order === 'last') {
81
- flexOrder = math(`${props.columns} + 1`);
82
- } else {
83
- flexOrder = order;
84
- }
85
- return css(["flex-basis:", ";flex-grow:", ";flex-shrink:", ";align-self:", ";order:", ";margin-", ":", ";width:", ";max-width:", ";text-align:", ";"], flexBasis, flexGrow, size && 0, alignSelf === 'start' || alignSelf === 'end' ? `flex-${alignSelf}` : alignSelf, flexOrder, props.theme.rtl ? 'right' : 'left', margin, width, maxWidth, horizontalAlign);
86
- };
87
- const mediaStyles$1 = (minWidth, size, alignSelf, textAlign, offset, order, props) => {
88
- return css(["@media (min-width:", "){", ";}"], minWidth, flexStyles$1(size, alignSelf, textAlign, offset, order, props));
89
- };
90
- const sizeStyles$4 = props => {
91
- const padding = props.gutters ? math(`${props.theme.space[props.gutters]} / 2`) : 0;
92
- return css(["padding-right:", ";padding-left:", ";"], padding, padding);
93
- };
94
- const StyledCol = styled.div.attrs({
95
- 'data-garden-id': COMPONENT_ID$6,
96
- 'data-garden-version': '9.0.0-next.2'
97
- }).withConfig({
98
- displayName: "StyledCol",
99
- componentId: "sc-inuw62-0"
100
- })(["box-sizing:border-box;width:100%;", ";", ";", ";", ";", ";", ";", ";", ";", ";"], props => 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), props => sizeStyles$4(props), props => props.debug && colorStyles$4(props), props => mediaStyles$1(props.theme.breakpoints.xs, props.xs, props.alignSelfXs, props.textAlignXs, props.offsetXs, props.orderXs, props), props => mediaStyles$1(props.theme.breakpoints.sm, props.sm, props.alignSelfSm, props.textAlignSm, props.offsetSm, props.orderSm, props), props => mediaStyles$1(props.theme.breakpoints.md, props.md, props.alignSelfMd, props.textAlignMd, props.offsetMd, props.orderMd, props), props => mediaStyles$1(props.theme.breakpoints.lg, props.lg, props.alignSelfLg, props.textAlignLg, props.offsetLg, props.orderLg, props), props => mediaStyles$1(props.theme.breakpoints.xl, props.xl, props.alignSelfXl, props.textAlignXl, props.offsetXl, props.orderXl, props), props => retrieveComponentStyles(COMPONENT_ID$6, props));
101
- StyledCol.defaultProps = {
102
- columns: 12,
103
- theme: DEFAULT_THEME
104
- };
105
-
106
- const COMPONENT_ID$5 = 'grid.grid';
107
- const colorStyles$3 = props => {
108
- const borderColor = getColor(props.theme.palette.crimson, 400, props.theme, 0.5);
109
- const borderWidth = math(`${props.theme.borderWidths.sm} * 2`);
110
- return css(["box-shadow:-", " 0 0 0 ", ",", " 0 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
111
- };
112
- const sizeStyles$3 = props => {
113
- const padding = props.gutters ? math(`${props.theme.space[props.gutters]} / 2`) : 0;
114
- return css(["padding-right:", ";padding-left:", ";"], padding, padding);
115
- };
116
- const StyledGrid = styled.div.attrs({
117
- 'data-garden-id': COMPONENT_ID$5,
118
- 'data-garden-version': '9.0.0-next.2'
119
- }).withConfig({
120
- displayName: "StyledGrid",
121
- componentId: "sc-oxgg5i-0"
122
- })(["direction:", ";margin-right:auto;margin-left:auto;width:100%;box-sizing:border-box;", ";", ";", ";"], props => props.theme.rtl && 'rtl', props => sizeStyles$3(props), props => props.debug && colorStyles$3(props), props => retrieveComponentStyles(COMPONENT_ID$5, props));
123
- StyledGrid.defaultProps = {
124
- gutters: 'md',
125
- theme: DEFAULT_THEME
126
- };
127
-
128
- const COMPONENT_ID$4 = 'grid.row';
129
- const colorStyles$2 = props => {
130
- const borderColor = getColor(props.theme.palette.mint, 600, props.theme, 0.5);
131
- const borderWidth = props.theme.borderWidths.sm;
132
- return css(["box-shadow:inset 0 ", " 0 0 ", ",inset 0 -", " 0 0 ", ";"], borderWidth, borderColor, borderWidth, borderColor);
133
- };
134
- const flexStyles = (alignItems, justifyContent, wrap) => {
135
- let flexAlignItems;
136
- let flexJustifyContent;
137
- if (alignItems === 'start' || alignItems === 'end') {
138
- flexAlignItems = `flex-${alignItems}`;
139
- } else {
140
- flexAlignItems = alignItems;
141
- }
142
- if (justifyContent === 'start' || justifyContent === 'end') {
143
- flexJustifyContent = `flex-${justifyContent}`;
144
- } else if (justifyContent === 'between' || justifyContent === 'around') {
145
- flexJustifyContent = `space-${justifyContent}`;
146
- } else {
147
- flexJustifyContent = justifyContent;
148
- }
149
- return css(["flex-wrap:", ";align-items:", ";justify-content:", ";"], wrap, flexAlignItems, flexJustifyContent);
150
- };
151
- const mediaStyles = (minWidth, alignItems, justifyContent, wrap) => {
152
- return css(["@media (min-width:", "){", ";}"], minWidth, flexStyles(alignItems, justifyContent, wrap));
153
- };
154
- const sizeStyles$2 = props => {
155
- const margin = props.gutters ? math(`${props.theme.space[props.gutters]} / 2`) : 0;
156
- return css(["margin-right:-", ";margin-left:-", ";"], margin, margin);
157
- };
158
- const StyledRow = styled.div.attrs({
159
- 'data-garden-id': COMPONENT_ID$4,
160
- 'data-garden-version': '9.0.0-next.2'
161
- }).withConfig({
162
- displayName: "StyledRow",
163
- componentId: "sc-xjsdg1-0"
164
- })(["display:flex;box-sizing:border-box;", " ", ";", ";", ";", ";", ";", ";", ";", ";"], props => flexStyles(props.alignItems, props.justifyContent, props.wrapAll), props => sizeStyles$2(props), props => props.debug && colorStyles$2(props), props => mediaStyles(props.theme.breakpoints.xs, props.alignItemsXs, props.justifyContentXs, props.wrapXs), props => mediaStyles(props.theme.breakpoints.sm, props.alignItemsSm, props.justifyContentSm, props.wrapSm), props => mediaStyles(props.theme.breakpoints.md, props.alignItemsMd, props.justifyContentMd, props.wrapMd), props => mediaStyles(props.theme.breakpoints.lg, props.alignItemsLg, props.justifyContentLg, props.wrapLg), props => mediaStyles(props.theme.breakpoints.xl, props.alignItemsXl, props.justifyContentXl, props.wrapXl), props => retrieveComponentStyles(COMPONENT_ID$4, props));
165
- StyledRow.defaultProps = {
166
- wrapAll: 'wrap',
167
- theme: DEFAULT_THEME
168
- };
169
-
170
- const COMPONENT_ID$3 = 'pane';
171
- const StyledPane = styled.div.attrs({
172
- 'data-garden-id': COMPONENT_ID$3,
173
- 'data-garden-version': '9.0.0-next.2'
174
- }).withConfig({
175
- displayName: "StyledPane",
176
- componentId: "sc-1ltjst7-0"
177
- })(["position:relative;min-width:0;min-height:0;", ";"], props => retrieveComponentStyles(COMPONENT_ID$3, props));
178
- StyledPane.defaultProps = {
179
- theme: DEFAULT_THEME
180
- };
181
-
182
- const COMPONENT_ID$2 = 'pane.content';
183
- const StyledPaneContent = styled.div.attrs({
184
- 'data-garden-id': COMPONENT_ID$2,
185
- 'data-garden-version': '9.0.0-next.2'
186
- }).withConfig({
187
- displayName: "StyledPaneContent",
188
- componentId: "sc-1b38mbh-0"
189
- })(["height:100%;overflow:auto;&[hidden]{display:none;}", ";"], props => retrieveComponentStyles(COMPONENT_ID$2, props));
190
- StyledPaneContent.defaultProps = {
191
- theme: DEFAULT_THEME
192
- };
193
-
194
- const COMPONENT_ID$1 = 'pane.splitter';
195
- const colorStyles$1 = props => {
196
- const color = getColor('neutralHue', 300, props.theme);
197
- const hoverColor = getColor('primaryHue', 600, props.theme);
198
- const activeColor = getColor('primaryHue', 800, props.theme);
199
- return css(["&::before{background-color:", ";}&:hover::before{background-color:", ";}", " &:active::before{background-color:", ";}"], color, props.isHovered && hoverColor, focusStyles({
200
- theme: props.theme,
201
- hue: hoverColor,
202
- styles: {
203
- backgroundColor: hoverColor
204
- },
205
- selector: '&:focus-visible::before, &[data-garden-focus-visible="true"]::before'
206
- }), props.isHovered && activeColor);
207
- };
208
- const sizeStyles$1 = props => {
209
- const size = math(`${props.theme.shadowWidths.md} * 2`);
210
- const separatorSize = math(`${props.theme.borderWidths.sm} * 2`);
211
- const offset = math(`-${size} / 2`);
212
- let cursor;
213
- let top;
214
- let right;
215
- let left;
216
- let bottom;
217
- let width;
218
- let height;
219
- let separatorWidth;
220
- let separatorHeight;
221
- switch (props.orientation) {
222
- case 'top':
223
- cursor = 'row-resize';
224
- top = offset;
225
- width = '100%';
226
- height = size;
227
- separatorWidth = width;
228
- separatorHeight = props.theme.borderWidths.sm;
229
- break;
230
- case 'bottom':
231
- cursor = 'row-resize';
232
- bottom = offset;
233
- width = '100%';
234
- height = size;
235
- separatorWidth = width;
236
- separatorHeight = props.theme.borderWidths.sm;
237
- break;
238
- case 'start':
239
- cursor = 'col-resize';
240
- top = 0;
241
- width = size;
242
- height = '100%';
243
- separatorWidth = props.theme.borderWidths.sm;
244
- separatorHeight = height;
245
- if (props.theme.rtl) {
246
- right = offset;
247
- } else {
248
- left = offset;
249
- }
250
- break;
251
- case 'end':
252
- default:
253
- cursor = 'col-resize';
254
- top = 0;
255
- width = size;
256
- height = '100%';
257
- separatorWidth = props.theme.borderWidths.sm;
258
- separatorHeight = height;
259
- if (props.theme.rtl) {
260
- left = offset;
261
- } else {
262
- right = offset;
263
- }
264
- break;
265
- }
266
- const dimensionProperty = width === '100%' ? 'height' : 'width';
267
- return css(["top:", ";right:", ";bottom:", ";left:", ";cursor:", ";width:", ";height:", ";&::before{width:", ";height:", ";}&:hover::before{", ":", ";}&:focus::before,&:focus-visible::before,&[data-garden-focus-visible]::before{", ":", ";}&:focus-visible::before,&[data-garden-focus-visible]::before{border-radius:", ";}"], top, right, bottom, left, props.isFixed ? 'pointer' : cursor, width, height, separatorWidth, separatorHeight, dimensionProperty, props.isHovered && separatorSize, dimensionProperty, separatorSize, props.theme.borderRadii.md);
268
- };
269
- const StyledPaneSplitter = styled.div.attrs({
270
- 'data-garden-id': COMPONENT_ID$1,
271
- 'data-garden-version': '9.0.0-next.2'
272
- }).withConfig({
273
- displayName: "StyledPaneSplitter",
274
- componentId: "sc-jylemn-0"
275
- })(["display:flex;position:absolute;align-items:center;justify-content:center;z-index:1;user-select:none;", ";", "{z-index:2;}&::before{position:absolute;transition:box-shadow 0.1s ease-in-out,background-color 0.25s ease-in-out;z-index:-1;content:'';}", ";", ";"], sizeStyles$1, SELECTOR_FOCUS_VISIBLE, colorStyles$1, props => retrieveComponentStyles(COMPONENT_ID$1, props));
276
- StyledPaneSplitter.defaultProps = {
277
- theme: DEFAULT_THEME
278
- };
279
-
280
- const COMPONENT_ID = 'pane.splitter_button';
281
- const transformStyles = props => {
282
- let degrees = 0;
283
- if (props.isRotated) {
284
- degrees = props.theme.rtl ? -180 : 180;
285
- }
286
- if (props.orientation === 'end') {
287
- degrees += props.theme.rtl ? -90 : 90;
288
- } else if (props.orientation === 'start') {
289
- degrees += props.theme.rtl ? 90 : -90;
290
- } else if (props.orientation === 'bottom') {
291
- degrees += 180;
292
- }
293
- return css(["& > svg{transform:rotate(", "deg);}"], degrees);
294
- };
295
- const colorStyles = _ref => {
296
- let {
297
- theme
298
- } = _ref;
299
- const boxShadow = theme.shadows.lg(`${theme.space.base}px`, `${theme.space.base * 2}px`, getColor('chromeHue', 600, theme, 0.15));
300
- return css(["box-shadow:", ";", ""], boxShadow, focusStyles({
301
- theme,
302
- boxShadow
303
- }));
304
- };
305
- const sizeStyles = props => {
306
- const size = `${props.theme.space.base * 6}px`;
307
- const display = props.splitterSize <= stripUnit(math(`${props.theme.shadowWidths.md} * 2 + ${size}`)) && 'none';
308
- const isVertical = props.orientation === 'start' || props.orientation === 'end';
309
- let top;
310
- let left;
311
- let right;
312
- let bottom;
313
- if (props.splitterSize >= stripUnit(math(`${size} * 3`))) {
314
- if (props.placement === 'start') {
315
- if (isVertical) {
316
- top = size;
317
- } else if (props.theme.rtl) {
318
- right = size;
319
- } else {
320
- left = size;
321
- }
322
- } else if (props.placement === 'end') {
323
- if (isVertical) {
324
- bottom = size;
325
- } else if (props.theme.rtl) {
326
- left = size;
327
- } else {
328
- right = size;
329
- }
330
- }
331
- }
332
- return css(["display:", ";top:", ";right:", ";bottom:", ";left:", ";width:", ";min-width:", ";height:", ";"], display, top, right, bottom, left, size, size, size);
333
- };
334
- const StyledPaneSplitterButton = styled(ChevronButton).attrs({
335
- 'data-garden-id': COMPONENT_ID,
336
- 'data-garden-version': '9.0.0-next.2',
337
- isBasic: true,
338
- isPill: true,
339
- size: 'small'
340
- }).withConfig({
341
- displayName: "StyledPaneSplitterButton",
342
- componentId: "sc-zh032e-0"
343
- })(["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;", ";", ";&::before{position:absolute;z-index:-1;background-color:", ";width:100%;height:100%;content:'';}", ";", ":hover &,", ":focus-visible &,", "[data-garden-focus-visible] &,", "{opacity:1;}", ";"], sizeStyles, transformStyles, props => props.theme.colors.background, colorStyles, StyledPaneSplitter, StyledPaneSplitter, StyledPaneSplitter, SELECTOR_FOCUS_VISIBLE, props => retrieveComponentStyles(COMPONENT_ID, props));
344
- StyledPaneSplitterButton.defaultProps = {
345
- theme: DEFAULT_THEME
346
- };
347
-
348
- const GridContext = createContext({
349
- gutters: 'md'
350
- });
351
- const useGridContext = () => {
352
- return useContext(GridContext);
353
- };
354
-
355
- const Col = React.forwardRef((_ref, ref) => {
356
- let {
357
- size,
358
- ...props
359
- } = _ref;
360
- const {
361
- columns,
362
- gutters,
363
- debug
364
- } = useGridContext();
365
- return React.createElement(StyledCol, _extends({
366
- sizeAll: size,
367
- columns: columns,
368
- gutters: gutters,
369
- debug: debug,
370
- ref: ref
371
- }, props));
372
- });
373
- Col.displayName = 'Col';
374
- Col.propTypes = {
375
- size: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
376
- xs: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
377
- sm: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
378
- md: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
379
- lg: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
380
- xl: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.bool]),
381
- alignSelf: PropTypes.oneOf(ALIGN_SELF),
382
- alignSelfXs: PropTypes.oneOf(ALIGN_SELF),
383
- alignSelfSm: PropTypes.oneOf(ALIGN_SELF),
384
- alignSelfMd: PropTypes.oneOf(ALIGN_SELF),
385
- alignSelfLg: PropTypes.oneOf(ALIGN_SELF),
386
- alignSelfXl: PropTypes.oneOf(ALIGN_SELF),
387
- textAlign: PropTypes.oneOf(TEXT_ALIGN),
388
- textAlignXs: PropTypes.oneOf(TEXT_ALIGN),
389
- textAlignSm: PropTypes.oneOf(TEXT_ALIGN),
390
- textAlignMd: PropTypes.oneOf(TEXT_ALIGN),
391
- textAlignLg: PropTypes.oneOf(TEXT_ALIGN),
392
- textAlignXl: PropTypes.oneOf(TEXT_ALIGN),
393
- offset: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
394
- offsetXs: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
395
- offsetSm: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
396
- offsetMd: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
397
- offsetLg: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
398
- offsetXl: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
399
- order: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
400
- orderXs: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
401
- orderSm: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
402
- orderMd: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
403
- orderLg: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
404
- orderXl: PropTypes.oneOfType([PropTypes.number, PropTypes.string])
405
- };
406
-
407
- const Grid = React.forwardRef((_ref, ref) => {
408
- let {
409
- columns,
410
- debug,
411
- ...props
412
- } = _ref;
413
- const value = useMemo(() => ({
414
- columns,
415
- gutters: props.gutters,
416
- debug
417
- }), [columns, props.gutters, debug]);
418
- return React.createElement(GridContext.Provider, {
419
- value: value
420
- }, React.createElement(StyledGrid, _extends({
421
- debug: debug,
422
- ref: ref
423
- }, props)));
424
- });
425
- Grid.displayName = 'Grid';
426
- Grid.propTypes = {
427
- columns: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
428
- gutters: PropTypes.oneOf(SPACE),
429
- debug: PropTypes.bool
430
- };
431
- Grid.defaultProps = {
432
- columns: 12,
433
- gutters: 'md'
434
- };
435
-
436
- const Row = React.forwardRef((_ref, ref) => {
437
- let {
438
- wrap,
439
- ...props
440
- } = _ref;
441
- const {
442
- gutters,
443
- debug
444
- } = useGridContext();
445
- return React.createElement(StyledRow, _extends({
446
- gutters: gutters,
447
- debug: debug,
448
- wrapAll: wrap,
449
- ref: ref
450
- }, props));
451
- });
452
- Row.displayName = 'Row';
453
- Row.propTypes = {
454
- alignItems: PropTypes.oneOf(ALIGN_ITEMS),
455
- alignItemsXs: PropTypes.oneOf(ALIGN_ITEMS),
456
- alignItemsSm: PropTypes.oneOf(ALIGN_ITEMS),
457
- alignItemsMd: PropTypes.oneOf(ALIGN_ITEMS),
458
- alignItemsLg: PropTypes.oneOf(ALIGN_ITEMS),
459
- alignItemsXl: PropTypes.oneOf(ALIGN_ITEMS),
460
- justifyContent: PropTypes.oneOf(JUSTIFY_CONTENT),
461
- justifyContentXs: PropTypes.oneOf(JUSTIFY_CONTENT),
462
- justifyContentSm: PropTypes.oneOf(JUSTIFY_CONTENT),
463
- justifyContentMd: PropTypes.oneOf(JUSTIFY_CONTENT),
464
- justifyContentLg: PropTypes.oneOf(JUSTIFY_CONTENT),
465
- justifyContentXl: PropTypes.oneOf(JUSTIFY_CONTENT),
466
- wrap: PropTypes.oneOf(WRAP),
467
- wrapXs: PropTypes.oneOf(WRAP),
468
- wrapSm: PropTypes.oneOf(WRAP),
469
- wrapMd: PropTypes.oneOf(WRAP),
470
- wrapLg: PropTypes.oneOf(WRAP),
471
- wrapXl: PropTypes.oneOf(WRAP)
472
- };
473
-
474
- const PaneProviderContext = createContext({});
475
- const usePaneProviderContextData = providerId => {
476
- const context = useContext(PaneProviderContext);
477
- const id = providerId || context.providerId;
478
- return id && context.contextData ? context.contextData[id] : undefined;
479
- };
480
- const usePaneProviderContext = () => useContext(PaneProviderContext);
481
-
482
- const getPixelsPerFr = (totalFrs, totalDimension) => {
483
- return totalDimension / totalFrs;
484
- };
485
- const convertToPixels = (values, pixelsPerFr) => {
486
- return Object.entries(values).reduce((prev, _ref) => {
487
- let [key, value] = _ref;
488
- prev[key] = value * pixelsPerFr;
489
- return prev;
490
- }, {});
491
- };
492
- const PaneProvider = _ref2 => {
493
- let {
494
- id,
495
- totalPanesWidth,
496
- totalPanesHeight,
497
- defaultRowValues,
498
- defaultColumnValues,
499
- rowValues,
500
- columnValues,
501
- onChange,
502
- children
503
- } = _ref2;
504
- const isControlled = rowValues !== undefined && rowValues !== null && columnValues !== undefined && columnValues !== null;
505
- const [rowState, setRowState] = useState(defaultRowValues || {});
506
- const [columnState, setColumnState] = useState(defaultColumnValues || {});
507
- const rowsTrack = isControlled ? rowValues : rowState;
508
- const columnsTrack = isControlled ? columnValues : columnState;
509
- const setRowsTrack = useCallback(values => {
510
- if (isControlled && onChange) {
511
- return onChange(values(rowsTrack), columnsTrack);
512
- }
513
- return setRowState(values);
514
- }, [isControlled, onChange, setRowState, columnsTrack, rowsTrack]);
515
- const setColumnsTrack = useCallback(values => {
516
- if (isControlled && onChange) {
517
- return onChange(rowsTrack, values(columnsTrack));
518
- }
519
- return setColumnState(values);
520
- }, [isControlled, onChange, setColumnState, rowsTrack, columnsTrack]);
521
- const totalFractions = useMemo(() => ({
522
- rows: Object.values(rowsTrack).reduce((prev, value) => value + prev, 0),
523
- columns: Object.values(columnsTrack).reduce((prev, value) => value + prev, 0)
524
- }), [rowsTrack, columnsTrack]);
525
- const pixelsPerFr = useMemo(() => ({
526
- rows: getPixelsPerFr(totalFractions.rows, totalPanesHeight),
527
- columns: getPixelsPerFr(totalFractions.columns, totalPanesWidth)
528
- }), [totalFractions, totalPanesHeight, totalPanesWidth]);
529
- const layoutStateInPixels = useMemo(() => ({
530
- rows: convertToPixels(rowsTrack, pixelsPerFr.rows),
531
- columns: convertToPixels(columnsTrack, pixelsPerFr.columns)
532
- }), [rowsTrack, columnsTrack, pixelsPerFr]);
533
- const layoutIndices = useMemo(() => {
534
- const rowArray = Object.keys(rowsTrack);
535
- const columnArray = Object.keys(columnsTrack);
536
- const rows = rowArray.reduce((prev, key, index) => {
537
- prev[key] = index;
538
- return prev;
539
- }, {});
540
- const columns = columnArray.reduce((prev, key, index) => {
541
- prev[key] = index;
542
- return prev;
543
- }, {});
544
- return {
545
- rows,
546
- columns,
547
- rowArray,
548
- columnArray
549
- };
550
- }, [rowsTrack, columnsTrack]);
551
- const setRowValue = useCallback((isTop, splitterId, value) => {
552
- const {
553
- rows,
554
- rowArray
555
- } = layoutIndices;
556
- const stealFromTraversal = isTop ? -1 : 1;
557
- const addToTraversal = 0;
558
- setRowsTrack(state => {
559
- const oldValue = rowsTrack[splitterId];
560
- const stealFromIndex = rows[splitterId] + stealFromTraversal;
561
- const addToIndex = rows[splitterId] + addToTraversal;
562
- const stealFromKey = rowArray[stealFromIndex];
563
- const addToKey = rowArray[addToIndex];
564
- const difference = oldValue - value;
565
- const nextState = {
566
- ...state
567
- };
568
- nextState[addToKey] = rowsTrack[addToKey] - difference;
569
- nextState[stealFromKey] = rowsTrack[stealFromKey] + difference;
570
- return nextState;
571
- });
572
- }, [layoutIndices, rowsTrack, setRowsTrack]);
573
- const setColumnValue = useCallback((isStart, splitterId, value) => {
574
- const {
575
- columns,
576
- columnArray
577
- } = layoutIndices;
578
- const stealFromTraversal = isStart ? -1 : 1;
579
- const addToTraversal = 0;
580
- setColumnsTrack(state => {
581
- const stealFromIndex = columns[splitterId] + stealFromTraversal;
582
- const addToIndex = columns[splitterId] + addToTraversal;
583
- const oldValue = columnsTrack[splitterId];
584
- const stealFromKey = columnArray[stealFromIndex];
585
- const addToKey = columnArray[addToIndex];
586
- const difference = oldValue - value;
587
- const nextState = {
588
- ...state
589
- };
590
- nextState[addToKey] = columnsTrack[addToKey] - difference;
591
- nextState[stealFromKey] = columnsTrack[stealFromKey] + difference;
592
- return nextState;
593
- });
594
- }, [layoutIndices, columnsTrack, setColumnsTrack]);
595
- const getColumnValue = useCallback((splitterKey, isPixels) => {
596
- if (isPixels) {
597
- return layoutStateInPixels.columns[splitterKey];
598
- }
599
- return columnsTrack[splitterKey];
600
- }, [columnsTrack, layoutStateInPixels]);
601
- const getRowValue = useCallback((splitterKey, isPixels) => {
602
- if (isPixels) {
603
- return layoutStateInPixels.rows[splitterKey];
604
- }
605
- return rowsTrack[splitterKey];
606
- }, [rowsTrack, layoutStateInPixels]);
607
- const getGridTemplateColumns = useCallback(isPixels => {
608
- const {
609
- columnArray
610
- } = layoutIndices;
611
- if (isPixels) {
612
- return columnArray.map(col => `${layoutStateInPixels.columns[col]}px`).join(' ');
613
- }
614
- return columnArray.map(col => `${columnsTrack[col]}fr`).join(' ');
615
- }, [layoutIndices, columnsTrack, layoutStateInPixels]);
616
- const getGridTemplateRows = useCallback(isPixels => {
617
- const {
618
- rowArray
619
- } = layoutIndices;
620
- if (isPixels) {
621
- return rowArray.map(row => `${layoutStateInPixels.rows[row]}px`).join(' ');
622
- }
623
- return rowArray.map(row => `${rowsTrack[row]}fr`).join(' ');
624
- }, [layoutIndices, rowsTrack, layoutStateInPixels]);
625
- const providerId = useId(id);
626
- const parentPaneProviderContext = usePaneProviderContext();
627
- const paneProviderContext = useMemo(() => providerId ? {
628
- providerId,
629
- contextData: {
630
- ...parentPaneProviderContext.contextData,
631
- [providerId]: {
632
- columnState,
633
- rowState,
634
- setRowValue,
635
- setColumnValue,
636
- getRowValue,
637
- getColumnValue,
638
- totalPanesHeight,
639
- totalPanesWidth,
640
- pixelsPerFr
641
- }
642
- }
643
- } : {}, [providerId, parentPaneProviderContext, rowState, columnState, setRowValue, setColumnValue, getRowValue, getColumnValue, totalPanesHeight, totalPanesWidth, pixelsPerFr]);
644
- return React.createElement(PaneProviderContext.Provider, {
645
- value: paneProviderContext
646
- }, children?.({
647
- id: providerId,
648
- getRowValue,
649
- getColumnValue,
650
- getGridTemplateColumns,
651
- getGridTemplateRows
652
- }));
653
- };
654
- PaneProvider.displayName = 'PaneProvider';
655
- PaneProvider.propTypes = {
656
- id: PropTypes.string,
657
- totalPanesWidth: PropTypes.number.isRequired,
658
- totalPanesHeight: PropTypes.number.isRequired,
659
- defaultRowValues: PropTypes.object,
660
- defaultColumnValues: PropTypes.object,
661
- rowValues: PropTypes.object,
662
- columnValues: PropTypes.object,
663
- onChange: PropTypes.func,
664
- children: PropTypes.func
665
- };
666
-
667
- const PaneContext = createContext({
668
- setId: () => undefined
669
- });
670
- const usePaneContext = () => {
671
- return useContext(PaneContext);
672
- };
673
-
674
- const PaneSplitterContext = createContext({
675
- orientation: 'start',
676
- min: 0,
677
- max: 0,
678
- layoutKey: '',
679
- valueNow: 0,
680
- size: 0,
681
- isRow: false
682
- });
683
- const usePaneSplitterContext = () => {
684
- return useContext(PaneSplitterContext);
685
- };
686
-
687
- const paneToSplitterOrientation = {
688
- start: 'vertical',
689
- end: 'vertical',
690
- top: 'horizontal',
691
- bottom: 'horizontal'
692
- };
693
- const orientationToDimension = {
694
- start: 'columns',
695
- end: 'columns',
696
- top: 'rows',
697
- bottom: 'rows'
698
- };
699
- const SplitterComponent = forwardRef((_ref, ref) => {
700
- let {
701
- providerId,
702
- layoutKey,
703
- min,
704
- max,
705
- orientation,
706
- isFixed,
707
- onMouseDown,
708
- onTouchStart,
709
- onKeyDown,
710
- onClick,
711
- ...props
712
- } = _ref;
713
- const paneProviderContext = usePaneProviderContextData(providerId);
714
- const paneContext = usePaneContext();
715
- const themeContext = useContext(ThemeContext);
716
- const environment = useDocument(themeContext);
717
- const [isHovered, setIsHovered] = useState(false);
718
- const isRow = orientationToDimension[orientation] === 'rows';
719
- const separatorRef = useRef(null);
720
- const splitterOrientation = paneToSplitterOrientation[orientation || 'end'];
721
- const pixelsPerFr = paneProviderContext ? paneProviderContext.pixelsPerFr[orientationToDimension[orientation]] : 0;
722
- const value = isRow ? paneProviderContext?.getRowValue(layoutKey, true) : paneProviderContext?.getColumnValue(layoutKey, true);
723
- const valueInFr = isRow ? paneProviderContext?.getRowValue(layoutKey) : paneProviderContext?.getColumnValue(layoutKey);
724
- const {
725
- getSeparatorProps,
726
- getPrimaryPaneProps
727
- } = useSplitter({
728
- orientation: splitterOrientation,
729
- isLeading: orientation === 'start' || orientation === 'top',
730
- min: min * pixelsPerFr,
731
- max: max * pixelsPerFr,
732
- rtl: themeContext.rtl,
733
- isFixed,
734
- environment,
735
- onChange: valueNow => {
736
- if (isRow) {
737
- return paneProviderContext?.setRowValue(orientation === 'top', layoutKey, valueNow / pixelsPerFr);
738
- }
739
- return paneProviderContext?.setColumnValue(orientation === 'start', layoutKey, valueNow / pixelsPerFr);
740
- },
741
- valueNow: value,
742
- separatorRef
743
- });
744
- useEffect(() => {
745
- if (!paneContext.id) {
746
- paneContext.setId(getPrimaryPaneProps().id);
747
- }
748
- }, [paneContext, getPrimaryPaneProps]);
749
- const ariaLabel = useText(SplitterComponent, props, 'aria-label', `${splitterOrientation} splitter`);
750
- const separatorProps = getSeparatorProps({
751
- 'aria-controls': paneContext.id,
752
- 'aria-label': ariaLabel,
753
- onMouseDown,
754
- onTouchStart,
755
- onKeyDown,
756
- onClick
757
- });
758
- const size = isRow ? separatorRef.current?.clientWidth : separatorRef.current?.clientHeight;
759
- const onMouseOver = useMemo(() => composeEventHandlers(props.onMouseOver, event => setIsHovered(event.target === separatorRef.current)), [props.onMouseOver, separatorRef]);
760
- return React.createElement(PaneSplitterContext.Provider, {
761
- value: useMemo(() => ({
762
- orientation,
763
- layoutKey,
764
- min,
765
- max,
766
- valueNow: valueInFr,
767
- size,
768
- isRow
769
- }), [orientation, layoutKey, min, max, valueInFr, size, isRow])
770
- }, React.createElement(StyledPaneSplitter, _extends({
771
- isHovered: isHovered,
772
- isFixed: isFixed,
773
- orientation: orientation
774
- }, separatorProps, props, {
775
- onMouseOver: onMouseOver,
776
- ref: mergeRefs([separatorRef, ref])
777
- })));
778
- });
779
- SplitterComponent.displayName = 'Pane.Splitter';
780
- SplitterComponent.propTypes = {
781
- layoutKey: PropTypes.string.isRequired,
782
- min: PropTypes.number.isRequired,
783
- max: PropTypes.number.isRequired,
784
- orientation: PropTypes.oneOf(ORIENTATION),
785
- isFixed: PropTypes.bool
786
- };
787
- SplitterComponent.defaultProps = {
788
- orientation: 'end'
789
- };
790
- const Splitter = SplitterComponent;
791
-
792
- const ContentComponent = forwardRef((props, ref) => {
793
- const {
794
- isVisible
795
- } = usePaneContext();
796
- return React.createElement(StyledPaneContent, _extends({
797
- hidden: !isVisible,
798
- ref: ref
799
- }, props));
800
- });
801
- ContentComponent.displayName = 'Pane.Content';
802
- const Content = ContentComponent;
803
-
804
- const SplitterButtonComponent = forwardRef((props, ref) => {
805
- const {
806
- label,
807
- placement: defaultPlacement
808
- } = props;
809
- const {
810
- orientation,
811
- layoutKey,
812
- min,
813
- max,
814
- isRow,
815
- valueNow,
816
- size,
817
- providerId
818
- } = usePaneSplitterContext();
819
- const paneProviderContext = usePaneProviderContextData(providerId);
820
- const isTop = orientation === 'top';
821
- const isStart = orientation === 'start';
822
- const isMin = valueNow === min;
823
- let placement = defaultPlacement;
824
- if (!defaultPlacement) {
825
- if (isRow) {
826
- placement = 'center';
827
- } else {
828
- placement = 'start';
829
- }
830
- }
831
- const setValue = useCallback(value => {
832
- if (isRow) {
833
- paneProviderContext.setRowValue(isTop, layoutKey, value);
834
- } else {
835
- paneProviderContext.setColumnValue(isStart, layoutKey, value);
836
- }
837
- }, [isRow, isTop, isStart, layoutKey, paneProviderContext]);
838
- const onClick = composeEventHandlers(props.onClick, () => {
839
- if (isMin) {
840
- setValue(max);
841
- } else {
842
- setValue(min);
843
- }
844
- });
845
- const onKeyDown = composeEventHandlers(props.onKeyDown, event => event.stopPropagation()
846
- );
847
- const onMouseDown = composeEventHandlers(props.onMouseDown, event => event.stopPropagation()
848
- );
849
- return React.createElement(Tooltip, {
850
- content: label,
851
- style: {
852
- cursor: 'default'
853
- },
854
- onMouseDown: e => e.stopPropagation()
855
- }, React.createElement(StyledPaneSplitterButton, _extends({
856
- "aria-label": label
857
- }, props, {
858
- placement: placement,
859
- orientation: orientation,
860
- isRotated: isMin,
861
- splitterSize: size || 0,
862
- ref: ref,
863
- onClick: onClick,
864
- onKeyDown: onKeyDown,
865
- onMouseDown: onMouseDown
866
- })));
867
- });
868
- SplitterButtonComponent.displayName = 'Pane.SplitterButton';
869
- const SplitterButton = SplitterButtonComponent;
870
-
871
- const PaneComponent = forwardRef((_ref, ref) => {
872
- let {
873
- children,
874
- ...props
875
- } = _ref;
876
- const [paneId, setPaneId] = useState();
877
- const observerRef = useRef(null);
878
- const {
879
- width = 0,
880
- height = 0
881
- } = useResizeObserver({
882
- ref: observerRef
883
- });
884
- const isVisible = useMemo(() => observerRef.current ? width > 0 && height > 0 : true, [width, height]);
885
- const paneContext = useMemo(() => ({
886
- isVisible,
887
- id: paneId,
888
- setId: id => setPaneId(id)
889
- }), [paneId, isVisible]);
890
- return React.createElement(PaneContext.Provider, {
891
- value: paneContext
892
- }, React.createElement(StyledPane, _extends({
893
- id: paneId,
894
- ref: mergeRefs([ref, observerRef])
895
- }, props), children));
896
- });
897
- PaneComponent.displayName = 'Pane';
898
- const Pane = PaneComponent;
899
- Pane.Content = Content;
900
- Pane.Splitter = Splitter;
901
- Pane.SplitterButton = SplitterButton;
902
-
903
- 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 };