@semcore/data-table 2.1.0 → 2.2.0

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/lib/es6/Body.js CHANGED
@@ -1,11 +1,13 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
1
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import _typeof from "@babel/runtime/helpers/typeof";
4
4
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
5
5
  import _createClass from "@babel/runtime/helpers/createClass";
6
+ import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
6
7
  import _inherits from "@babel/runtime/helpers/inherits";
7
8
  import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
8
9
  import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
10
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
9
11
  import { sstyled as _sstyled } from "@semcore/core";
10
12
  import { assignProps as _assignProps } from "@semcore/core";
11
13
  var _excluded = ["childrenPropsGetter"],
@@ -30,7 +32,8 @@ import { Component, sstyled, Root } from '@semcore/core';
30
32
  import { Box, Flex } from '@semcore/flex-box';
31
33
  import ScrollArea from '@semcore/scroll-area';
32
34
  import { getFixedStyle, getScrollOffsetValue } from './utils';
33
- import assignProps from '@semcore/utils/lib/assignProps';
35
+ import assignProps, { callAllEventHandlers } from '@semcore/utils/lib/assignProps';
36
+ import ResizeObserver from 'resize-observer-polyfill';
34
37
 
35
38
  /*__reshadow-styles__:"./style/scroll-area.shadow.css"*/
36
39
  var scrollStyles = (
@@ -46,6 +49,7 @@ _sstyled.insert(
46
49
  "--left": "--left_1jfuf14",
47
50
  "--right": "--right_1jfuf14"
48
51
  });
52
+ import trottle from '@semcore/utils/lib/rafTrottle';
49
53
  var testEnv = process.env.NODE_ENV === 'test';
50
54
 
51
55
  var getCellsByColumn = function getCellsByColumn(cells) {
@@ -61,77 +65,99 @@ var Body = /*#__PURE__*/function (_Component) {
61
65
  var _super = _createSuper(Body);
62
66
 
63
67
  function Body() {
68
+ var _this;
69
+
64
70
  _classCallCheck(this, Body);
65
71
 
66
- return _super.apply(this, arguments);
67
- }
72
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
73
+ args[_key] = arguments[_key];
74
+ }
68
75
 
69
- _createClass(Body, [{
70
- key: "renderRow",
71
- value: function renderRow(cells, index) {
72
- var _ref2;
76
+ _this = _super.call.apply(_super, [this].concat(args));
73
77
 
74
- var SRow = Box;
75
- var _this$asProps = this.asProps,
76
- styles = _this$asProps.styles,
77
- rowPropsLayers = _this$asProps.rowPropsLayers;
78
- var cellsByColumn = cells.flatRowData || getCellsByColumn(cells);
79
- var props = {
80
- children: this.renderCells(cells, cellsByColumn, index),
81
- theme: undefined,
82
- active: undefined
83
- };
78
+ _defineProperty(_assertThisInitialized(_this), "state", {
79
+ rowHeight: undefined,
80
+ scrollAreaHeight: undefined,
81
+ scrollOffset: 0
82
+ });
84
83
 
85
- var _iterator = _createForOfIteratorHelper(rowPropsLayers),
86
- _step;
84
+ _defineProperty(_assertThisInitialized(_this), "firstRowRef", React.createRef());
87
85
 
88
- try {
89
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
90
- var rowPropsLayer = _step.value;
86
+ _defineProperty(_assertThisInitialized(_this), "firstRowResizeObserver", null);
91
87
 
92
- var _rowPropsLayer$childr = rowPropsLayer.childrenPropsGetter,
93
- childrenPropsGetter = _rowPropsLayer$childr === void 0 ? function (p) {
94
- return p;
95
- } : _rowPropsLayer$childr,
96
- other = _objectWithoutProperties(rowPropsLayer, _excluded);
88
+ _defineProperty(_assertThisInitialized(_this), "getRowHeight", function () {
89
+ var virtualScroll = _this.asProps.virtualScroll;
90
+ var rowHeightFromProps = _typeof(virtualScroll) === 'object' && virtualScroll?.rowHeight;
91
+ return rowHeightFromProps || _this.state.rowHeight;
92
+ });
97
93
 
98
- var propsRow = assignProps(other, props);
99
- props = assignProps(childrenPropsGetter(propsRow, cellsByColumn, index), propsRow);
100
- }
101
- } catch (err) {
102
- _iterator.e(err);
103
- } finally {
104
- _iterator.f();
94
+ _defineProperty(_assertThisInitialized(_this), "handleFirstRowResize", trottle(function (entries) {
95
+ var contentRect = entries[0].contentRect;
96
+ var height = contentRect.height;
97
+
98
+ _this.setState(function (oldState) {
99
+ if (oldState.rowHeight === height) return oldState;
100
+ return {
101
+ rowHeight: height
102
+ };
103
+ });
104
+ }));
105
+
106
+ _defineProperty(_assertThisInitialized(_this), "handleScrollAreaResize", trottle(function (entries) {
107
+ var virtualScroll = _this.asProps.virtualScroll;
108
+ if (!virtualScroll) return;
109
+ var contentRect = entries[0].contentRect;
110
+ var height = contentRect.height;
111
+
112
+ _this.setState(function (oldState) {
113
+ if (oldState.scrollAreaHeight === height) return oldState;
114
+ return {
115
+ scrollAreaHeight: height
116
+ };
117
+ });
118
+ }));
119
+
120
+ _defineProperty(_assertThisInitialized(_this), "handleScrollAreaScroll", function (event) {
121
+ var _ref5 = event.target,
122
+ scrollTop = _ref5.scrollTop;
123
+ var virtualScroll = _this.asProps.virtualScroll;
124
+
125
+ if (virtualScroll) {
126
+ _this.setState(function (oldState) {
127
+ if (oldState.scrollOffset === scrollTop) return oldState;
128
+ return {
129
+ scrollOffset: scrollTop
130
+ };
131
+ });
105
132
  }
133
+ });
106
134
 
107
- return _ref2 = sstyled(styles), /*#__PURE__*/React.createElement(SRow, _ref2.cn("SRow", _objectSpread({
108
- "key": index
109
- }, props)));
110
- }
111
- }, {
112
- key: "renderRows",
113
- value: function renderRows(rows) {
114
- var _this = this;
135
+ _defineProperty(_assertThisInitialized(_this), "setupRowSizeObserver", function () {
136
+ if (!_this.firstRowRef.current) return;
137
+ if (!_this.asProps.virtualScroll) return;
138
+ _this.firstRowResizeObserver = new ResizeObserver(_this.handleFirstRowResize);
115
139
 
116
- return rows.map(function (cells, index) {
117
- return _this.renderRow(cells, index);
118
- });
119
- }
120
- }, {
140
+ _this.firstRowResizeObserver.observe(_this.firstRowRef.current);
141
+ });
142
+
143
+ return _this;
144
+ }
145
+
146
+ _createClass(Body, [{
121
147
  key: "renderCells",
122
- value: function renderCells(cells, cellsByColumn, index) {
148
+ value: function renderCells(cells, rowData, index) {
123
149
  var _this2 = this;
124
150
 
125
151
  var SCell = Flex;
126
- var _this$asProps2 = this.asProps,
127
- styles = _this$asProps2.styles,
128
- columns = _this$asProps2.columns,
129
- use = _this$asProps2.use;
152
+ var _this$asProps = this.asProps,
153
+ styles = _this$asProps.styles,
154
+ columns = _this$asProps.columns,
155
+ use = _this$asProps.use;
130
156
  return cells.map(function (cell) {
131
157
  if (Array.isArray(cell)) {
132
158
  return /*#__PURE__*/React.createElement("div", null, _this2.renderRows(cell));
133
159
  } else {
134
- var _ref3, _column$props, _props;
160
+ var _ref2;
135
161
 
136
162
  var column = columns.find(function (c) {
137
163
  return c.name === cell.name;
@@ -145,40 +171,42 @@ var Body = /*#__PURE__*/function (_Component) {
145
171
  var vars = (Array.isArray(cell.cssVar) ? cell.cssVar : [cell.cssVar]).map(function (name) {
146
172
  return "var(".concat(name, ")");
147
173
  });
148
- var props = (_props = {
174
+ var props = {
149
175
  name: cell.name,
150
- children: /*#__PURE__*/React.createElement(React.Fragment, null, cell.data)
151
- }, _defineProperty(_props, 'data-data', JSON.stringify(cell.data)), _defineProperty(_props, "justifyContent", column === null || column === void 0 ? void 0 : (_column$props = column.props) === null || _column$props === void 0 ? void 0 : _column$props.justifyContent), _defineProperty(_props, "style", {
152
- width: vars.length === 1 ? vars[0] : "calc(".concat(vars.join(' + '), ")")
153
- }), _props);
176
+ children: /*#__PURE__*/React.createElement(React.Fragment, null, cell.data),
177
+ justifyContent: column?.props?.justifyContent,
178
+ style: {
179
+ width: vars.length === 1 ? vars[0] : "calc(".concat(vars.join(' + '), ")")
180
+ }
181
+ };
154
182
 
155
183
  if (name !== undefined && value !== undefined) {
156
184
  props.style[name] = value;
157
185
  }
158
186
 
159
- var _iterator2 = _createForOfIteratorHelper(cell.cellPropsLayers || []),
160
- _step2;
187
+ var _iterator = _createForOfIteratorHelper(cell.cellPropsLayers || []),
188
+ _step;
161
189
 
162
190
  try {
163
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
164
- var cellPropLayer = _step2.value;
191
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
192
+ var cellPropLayer = _step.value;
165
193
 
166
194
  var _cellPropLayer$childr = cellPropLayer.childrenPropsGetter,
167
195
  childrenPropsGetter = _cellPropLayer$childr === void 0 ? function (p) {
168
196
  return p;
169
197
  } : _cellPropLayer$childr,
170
- other = _objectWithoutProperties(cellPropLayer, _excluded2);
198
+ other = _objectWithoutProperties(cellPropLayer, _excluded);
171
199
 
172
200
  var propsCell = assignProps(other, props);
173
- props = assignProps(childrenPropsGetter(propsCell, cellsByColumn, index), propsCell);
201
+ props = assignProps(childrenPropsGetter(propsCell, rowData, index), propsCell);
174
202
  }
175
203
  } catch (err) {
176
- _iterator2.e(err);
204
+ _iterator.e(err);
177
205
  } finally {
178
- _iterator2.f();
206
+ _iterator.f();
179
207
  }
180
208
 
181
- return _ref3 = sstyled(styles), /*#__PURE__*/React.createElement(SCell, _ref3.cn("SCell", _objectSpread(_objectSpread({
209
+ return _ref2 = sstyled(styles), /*#__PURE__*/React.createElement(SCell, _ref2.cn("SCell", _objectSpread(_objectSpread({
182
210
  "key": cell.name
183
211
  }, props), {}, {
184
212
  "fixed": cell.fixed,
@@ -188,24 +216,141 @@ var Body = /*#__PURE__*/function (_Component) {
188
216
  }
189
217
  }, []);
190
218
  }
219
+ }, {
220
+ key: "renderRow",
221
+ value: function renderRow(cells, _ref6) {
222
+ var _ref3;
223
+
224
+ var dataIndex = _ref6.dataIndex,
225
+ topOffset = _ref6.topOffset,
226
+ nested = _ref6.nested;
227
+ var SRow = Box;
228
+ var _this$asProps2 = this.asProps,
229
+ styles = _this$asProps2.styles,
230
+ rowPropsLayers = _this$asProps2.rowPropsLayers,
231
+ uniqueKey = _this$asProps2.uniqueKey,
232
+ virtualScroll = _this$asProps2.virtualScroll;
233
+ var rowHeightFromProps = _typeof(virtualScroll) === 'object' && virtualScroll?.rowHeight;
234
+ var rowData = cells.flatRowData || getCellsByColumn(cells);
235
+ var key = rowData[uniqueKey] ? String(rowData[uniqueKey]) : "row_".concat(dataIndex);
236
+ var needToMeasureHeight = dataIndex === 0 && !nested && !rowHeightFromProps;
237
+ var props = {
238
+ children: this.renderCells(cells, rowData, dataIndex),
239
+ theme: undefined,
240
+ active: undefined,
241
+ positioned: topOffset !== undefined,
242
+ top: topOffset,
243
+ ref: needToMeasureHeight ? this.firstRowRef : undefined,
244
+ key: key
245
+ };
246
+
247
+ var _iterator2 = _createForOfIteratorHelper(rowPropsLayers),
248
+ _step2;
249
+
250
+ try {
251
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
252
+ var rowPropsLayer = _step2.value;
253
+
254
+ var _rowPropsLayer$childr = rowPropsLayer.childrenPropsGetter,
255
+ childrenPropsGetter = _rowPropsLayer$childr === void 0 ? function (p) {
256
+ return p;
257
+ } : _rowPropsLayer$childr,
258
+ other = _objectWithoutProperties(rowPropsLayer, _excluded2);
259
+
260
+ var propsRow = assignProps(other, props);
261
+ props = assignProps(childrenPropsGetter(propsRow, rowData, dataIndex), propsRow);
262
+ }
263
+ } catch (err) {
264
+ _iterator2.e(err);
265
+ } finally {
266
+ _iterator2.f();
267
+ }
268
+
269
+ return _ref3 = sstyled(styles), /*#__PURE__*/React.createElement(SRow, _ref3.cn("SRow", _objectSpread({}, props)));
270
+ }
271
+ }, {
272
+ key: "renderRows",
273
+ value: function renderRows(rows) {
274
+ var _this3 = this;
275
+
276
+ return rows.map(function (cells, dataIndex) {
277
+ return _this3.renderRow(cells, {
278
+ dataIndex: dataIndex,
279
+ nested: false
280
+ });
281
+ });
282
+ }
283
+ }, {
284
+ key: "renderVirtualizedRows",
285
+ value: function renderVirtualizedRows(rows) {
286
+ var _this4 = this;
287
+
288
+ if (rows.length === 0) return [];
289
+ var virtualScroll = this.asProps.virtualScroll;
290
+ var _this$state = this.state,
291
+ scrollOffset = _this$state.scrollOffset,
292
+ scrollAreaHeight = _this$state.scrollAreaHeight;
293
+ var rowHeight = this.getRowHeight();
294
+ var tollerance = (_typeof(virtualScroll) === 'object' ? virtualScroll?.tollerance : 2) ?? 2;
295
+ var startIndex = Math.max(Math.floor(scrollOffset / rowHeight) - tollerance, 0);
296
+ var lastIndex = Math.min(Math.ceil((scrollOffset + scrollAreaHeight) / rowHeight) + tollerance, rows.length);
297
+ var rowHeightFromProps = _typeof(virtualScroll) === 'object' && virtualScroll?.rowHeight;
298
+ var needToMeasureFirstRowHeight = !rowHeightFromProps;
299
+ var firstRow = {
300
+ cells: rows[0],
301
+ dataIndex: 0,
302
+ topOffset: 0
303
+ };
304
+ var visibleRows = rowHeight !== undefined ? rows.slice(startIndex, lastIndex) : [];
305
+ var processedVisibleRows = visibleRows.map(function (cells, index) {
306
+ return {
307
+ cells: cells,
308
+ dataIndex: startIndex + index,
309
+ topOffset: rowHeight * (startIndex + index)
310
+ };
311
+ });
312
+
313
+ if (needToMeasureFirstRowHeight && startIndex !== 0) {
314
+ processedVisibleRows.unshift(firstRow);
315
+ }
316
+
317
+ return processedVisibleRows.map(function (_ref7) {
318
+ var cells = _ref7.cells,
319
+ dataIndex = _ref7.dataIndex,
320
+ topOffset = _ref7.topOffset;
321
+ return _this4.renderRow(cells, {
322
+ dataIndex: dataIndex,
323
+ topOffset: topOffset,
324
+ nested: false
325
+ });
326
+ });
327
+ }
328
+ }, {
329
+ key: "componentWillUnmount",
330
+ value: function componentWillUnmount() {
331
+ this.firstRowResizeObserver?.disconnect();
332
+ }
191
333
  }, {
192
334
  key: "render",
193
335
  value: function render() {
194
336
  var _ref = this.asProps,
195
- _ref4;
337
+ _ref4,
338
+ _this5 = this;
196
339
 
197
340
  var SBody = Box;
198
341
  var SBodyWrapper = Box;
199
342
  var SScrollAreaBar = ScrollArea.Bar;
343
+ var SHeightHold = Box;
200
344
  var _this$asProps3 = this.asProps,
201
345
  Children = _this$asProps3.Children,
202
346
  styles = _this$asProps3.styles,
203
347
  rows = _this$asProps3.rows,
204
348
  columns = _this$asProps3.columns,
205
- onResize = _this$asProps3.onResize,
206
- $scrollRef = _this$asProps3.$scrollRef;
207
- var columnsInitialized = columns.reduce(function (sum, _ref5) {
208
- var width = _ref5.width;
349
+ $scrollRef = _this$asProps3.$scrollRef,
350
+ virtualScroll = _this$asProps3.virtualScroll,
351
+ onResize = _this$asProps3.onResize;
352
+ var columnsInitialized = columns.reduce(function (sum, _ref8) {
353
+ var width = _ref8.width;
209
354
  return sum + width;
210
355
  }, 0) > 0 || testEnv;
211
356
 
@@ -215,15 +360,28 @@ var Body = /*#__PURE__*/function (_Component) {
215
360
  offsetRightSum = _getScrollOffsetValue2[1];
216
361
 
217
362
  var offsetSum = offsetLeftSum + offsetRightSum;
363
+ var rowHeight = this.getRowHeight();
364
+ var holdHeight = rowHeight !== undefined && virtualScroll ? rowHeight * rows.length : undefined;
365
+
366
+ if (virtualScroll && columnsInitialized && !rowHeight) {
367
+ new Promise(function () {
368
+ return _this5.setupRowSizeObserver();
369
+ });
370
+ }
371
+
218
372
  return _ref4 = sstyled(styles), /*#__PURE__*/React.createElement(SBodyWrapper, _ref4.cn("SBodyWrapper", {}), /*#__PURE__*/React.createElement(ScrollArea, _ref4.cn("ScrollArea", {
219
373
  "shadow": true,
220
374
  "styles": scrollStyles,
221
375
  "use:left": "".concat(offsetLeftSum, "px"),
222
376
  "use:right": "".concat(offsetRightSum, "px"),
223
- "onResize": onResize
377
+ "onResize": callAllEventHandlers(onResize, this.handleScrollAreaResize),
378
+ "onScroll": this.handleScrollAreaScroll
224
379
  }), /*#__PURE__*/React.createElement(ScrollArea.Container, {
225
380
  ref: $scrollRef
226
- }, /*#__PURE__*/React.createElement(SBody, _ref4.cn("SBody", _objectSpread({}, _assignProps({}, _ref))), columnsInitialized ? this.renderRows(rows) : null)), /*#__PURE__*/React.createElement(SScrollAreaBar, _ref4.cn("SScrollAreaBar", {
381
+ }, /*#__PURE__*/React.createElement(SBody, _ref4.cn("SBody", _objectSpread({}, _assignProps({}, _ref))), holdHeight && /*#__PURE__*/React.createElement(SHeightHold, _ref4.cn("SHeightHold", {
382
+ "hMin": holdHeight,
383
+ "aria-hidden": true
384
+ })), columnsInitialized && !virtualScroll ? this.renderRows(rows) : null, columnsInitialized && virtualScroll ? this.renderVirtualizedRows(rows) : null)), /*#__PURE__*/React.createElement(SScrollAreaBar, _ref4.cn("SScrollAreaBar", {
227
385
  "orientation": "horizontal",
228
386
  "left": "".concat(offsetLeftSum, "px"),
229
387
  "right": "".concat(offsetRightSum, "px"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Body.tsx"],"names":["React","Component","sstyled","Root","Box","Flex","ScrollArea","getFixedStyle","getScrollOffsetValue","assignProps","testEnv","process","env","NODE_ENV","getCellsByColumn","cells","flattenCells","flat","Object","fromEntries","map","cell","name","data","Body","index","SRow","asProps","styles","rowPropsLayers","cellsByColumn","flatRowData","props","children","renderCells","theme","undefined","active","rowPropsLayer","childrenPropsGetter","p","other","propsRow","rows","renderRow","SCell","columns","use","Array","isArray","renderRows","column","find","c","value","vars","cssVar","JSON","stringify","justifyContent","width","length","join","style","cellPropsLayers","cellPropLayer","propsCell","fixed","SBody","SBodyWrapper","SScrollAreaBar","Bar","Children","onResize","$scrollRef","columnsInitialized","reduce","sum","offsetLeftSum","offsetRightSum","offsetSum","scrollStyles","origin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,SAAT,EAAoBC,OAApB,EAA6BC,IAA7B,QAAyC,eAAzC;AACA,SAASC,GAAT,EAAcC,IAAd,QAAqC,mBAArC;AACA,OAAOC,UAAP,MAAuB,sBAAvB;AACA,SAASC,aAAT,EAAwBC,oBAAxB,QAAoD,SAApD;AAEA,OAAOC,WAAP,MAAwB,gCAAxB;;;;;;;;;;;;;;;;AAMA,IAAMC,OAAO,GAAGC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,MAAzC;;AAEA,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACC,KAAD,EAAiC;AACxD,MAAMC,YAAY,GAAGD,KAAK,CAACE,IAAN,CAAW,EAAX,CAArB;AACA,SAAOC,MAAM,CAACC,WAAP,CAAmBH,YAAY,CAACI,GAAb,CAAiB,UAACC,IAAD;AAAA,WAAU,CAACA,IAAI,CAACC,IAAN,EAAYD,IAAI,CAACE,IAAjB,CAAV;AAAA,GAAjB,CAAnB,CAAP;AACD,CAHD;;IAcMC,I;;;;;;;;;;;;;WACJ,mBAAUT,KAAV,EAA8BU,KAA9B,EAA6C;AAAA;;AAC3C,UAAMC,IAAI,GAAGtB,GAAb;AACA,0BAAmC,KAAKuB,OAAxC;AAAA,UAAQC,MAAR,iBAAQA,MAAR;AAAA,UAAgBC,cAAhB,iBAAgBA,cAAhB;AAEA,UAAMC,aAAa,GAAGf,KAAK,CAACgB,WAAN,IAAqBjB,gBAAgB,CAACC,KAAD,CAA3D;AAEA,UAAIiB,KAAK,GAAG;AACVC,QAAAA,QAAQ,EAAE,KAAKC,WAAL,CAAiBnB,KAAjB,EAAwBe,aAAxB,EAAuCL,KAAvC,CADA;AAEVU,QAAAA,KAAK,EAAEC,SAFG;AAGVC,QAAAA,MAAM,EAAED;AAHE,OAAZ;;AAN2C,iDAYfP,cAZe;AAAA;;AAAA;AAY3C,4DAA4C;AAAA,cAAjCS,aAAiC;;AAC1C,sCAAqDA,aAArD,CAAQC,mBAAR;AAAA,cAAQA,mBAAR,sCAA8B,UAACC,CAAD;AAAA,mBAAOA,CAAP;AAAA,WAA9B;AAAA,cAA2CC,KAA3C,4BAAqDH,aAArD;;AACA,cAAMI,QAAQ,GAAGjC,WAAW,CAACgC,KAAD,EAAQT,KAAR,CAA5B;AACAA,UAAAA,KAAK,GAAGvB,WAAW,CAAC8B,mBAAmB,CAACG,QAAD,EAAWZ,aAAX,EAA0BL,KAA1B,CAApB,EAAsDiB,QAAtD,CAAnB;AACD;AAhB0C;AAAA;AAAA;AAAA;AAAA;;AAkB3C,qBAAOxC,OAAO,CAAC0B,MAAD,CAAd,eAAuB,oBAAC,IAAD;AAAA,eAAWH;AAAX,SAAsBO,KAAtB,GAAvB;AACD;;;WAED,oBAAWW,IAAX,EAAgC;AAAA;;AAC9B,aAAOA,IAAI,CAACvB,GAAL,CAAS,UAACL,KAAD,EAAQU,KAAR;AAAA,eAAkB,KAAI,CAACmB,SAAL,CAAe7B,KAAf,EAAsBU,KAAtB,CAAlB;AAAA,OAAT,CAAP;AACD;;;WAED,qBAAYV,KAAZ,EAAgCe,aAAhC,EAAwDL,KAAxD,EAAuE;AAAA;;AACrE,UAAMoB,KAAK,GAAGxC,IAAd;AACA,2BAAiC,KAAKsB,OAAtC;AAAA,UAAQC,MAAR,kBAAQA,MAAR;AAAA,UAAgBkB,OAAhB,kBAAgBA,OAAhB;AAAA,UAAyBC,GAAzB,kBAAyBA,GAAzB;AACA,aAAOhC,KAAK,CAACK,GAAN,CAAU,UAACC,IAAD,EAAU;AACzB,YAAI2B,KAAK,CAACC,OAAN,CAAc5B,IAAd,CAAJ,EAAyB;AACvB,8BAAO,iCAAM,MAAI,CAAC6B,UAAL,CAAgB7B,IAAhB,CAAN,CAAP;AACD,SAFD,MAEO;AAAA;;AACL,cAAM8B,MAAM,GAAGL,OAAO,CAACM,IAAR,CAAa,UAACC,CAAD;AAAA,mBAAOA,CAAC,CAAC/B,IAAF,KAAWD,IAAI,CAACC,IAAvB;AAAA,WAAb,CAAf;;AACA,+BAAsBf,aAAa,CAACc,IAAD,EAAOyB,OAAP,CAAnC;AAAA;AAAA,cAAOxB,IAAP;AAAA,cAAagC,KAAb;;AACA,cAAMC,IAAI,GAAG,CAACP,KAAK,CAACC,OAAN,CAAc5B,IAAI,CAACmC,MAAnB,IAA6BnC,IAAI,CAACmC,MAAlC,GAA2C,CAACnC,IAAI,CAACmC,MAAN,CAA5C,EAA2DpC,GAA3D,CACX,UAACE,IAAD;AAAA,iCAAiBA,IAAjB;AAAA,WADW,CAAb;AASA,cAAIU,KAAgB;AAClBV,YAAAA,IAAI,EAAED,IAAI,CAACC,IADO;AAElBW,YAAAA,QAAQ,eAAE,0CAAGZ,IAAI,CAACE,IAAR;AAFQ,qCAGjB,WAHiB,EAGHkC,IAAI,CAACC,SAAL,CAAerC,IAAI,CAACE,IAApB,CAHG,6CAIF4B,MAJE,aAIFA,MAJE,wCAIFA,MAAM,CAAEnB,KAJN,kDAIF,cAAe2B,cAJb,oCAKX;AACLC,YAAAA,KAAK,EAAEL,IAAI,CAACM,MAAL,KAAgB,CAAhB,GAAoBN,IAAI,CAAC,CAAD,CAAxB,kBAAsCA,IAAI,CAACO,IAAL,CAAU,KAAV,CAAtC;AADF,WALW,UAApB;;AASA,cAAIxC,IAAI,KAAKc,SAAT,IAAsBkB,KAAK,KAAKlB,SAApC,EAA+C;AAC7CJ,YAAAA,KAAK,CAAC+B,KAAN,CAAYzC,IAAZ,IAAoBgC,KAApB;AACD;;AAvBI,sDAyBuBjC,IAAI,CAAC2C,eAAL,IAAwB,EAzB/C;AAAA;;AAAA;AAyBL,mEAAwD;AAAA,kBAA7CC,aAA6C;;AACtD,0CAAqDA,aAArD,CAAQ1B,mBAAR;AAAA,kBAAQA,mBAAR,sCAA8B,UAACC,CAAD;AAAA,uBAAOA,CAAP;AAAA,eAA9B;AAAA,kBAA2CC,KAA3C,4BAAqDwB,aAArD;;AACA,kBAAMC,SAAS,GAAGzD,WAAW,CAACgC,KAAD,EAAQT,KAAR,CAA7B;AACAA,cAAAA,KAAK,GAAGvB,WAAW,CAAC8B,mBAAmB,CAAC2B,SAAD,EAAYpC,aAAZ,EAA2BL,KAA3B,CAApB,EAAuDyC,SAAvD,CAAnB;AACD;AA7BI;AAAA;AAAA;AAAA;AAAA;;AA+BL,yBAAOhE,OAAO,CAAC0B,MAAD,CAAd,eACE,oBAAC,KAAD;AAAA,mBAAYP,IAAI,CAACC;AAAjB,aAA2BU,KAA3B;AAAA,qBAAyCX,IAAI,CAAC8C,KAA9C;AAAA,qBAA4DnC,KAAK,CAACG,KAAlE;AAAA,mBAA8EY;AAA9E,cADF;AAGD;AACF,OAtCM,EAsCJ,EAtCI,CAAP;AAuCD;;;WAED,kBAAS;AAAA;AAAA;;AACP,UAAMqB,KAAK,GAoBYhE,GApBvB;AACA,UAAMiE,YAAY,GAAGjE,GAArB;AACA,UAAMkE,cAAc,GAAGhE,UAAU,CAACiE,GAAlC;AACA,2BAAkE,KAAK5C,OAAvE;AAAA,UAAQ6C,QAAR,kBAAQA,QAAR;AAAA,UAAkB5C,MAAlB,kBAAkBA,MAAlB;AAAA,UAA0Be,IAA1B,kBAA0BA,IAA1B;AAAA,UAAgCG,OAAhC,kBAAgCA,OAAhC;AAAA,UAAyC2B,QAAzC,kBAAyCA,QAAzC;AAAA,UAAmDC,UAAnD,kBAAmDA,UAAnD;AAEA,UAAMC,kBAAkB,GAAG7B,OAAO,CAAC8B,MAAR,CAAe,UAACC,GAAD;AAAA,YAAQjB,KAAR,SAAQA,KAAR;AAAA,eAAoBiB,GAAG,GAAGjB,KAA1B;AAAA,OAAf,EAAgD,CAAhD,IAAqD,CAArD,IAA0DlD,OAArF;;AAEA,kCAAwCF,oBAAoB,CAACsC,OAAD,CAA5D;AAAA;AAAA,UAAOgC,aAAP;AAAA,UAAsBC,cAAtB;;AACA,UAAMC,SAAS,GAAGF,aAAa,GAAGC,cAAlC;AAEA,qBAAO7E,OAAO,CAAC0B,MAAD,CAAd,eACE,oBAAC,YAAD,6CACE,oBAAC,UAAD;AAAA;AAAA,kBAEUqD,YAFV;AAAA,8BAGeH,aAHf;AAAA,+BAIgBC,cAJhB;AAAA,oBAKYN;AALZ,uBAOE,oBAAC,UAAD,CAAY,SAAZ;AAAsB,QAAA,GAAG,EAAEC;AAA3B,sBACE,oBAAC,KAAD,gEAAqBC,kBAAkB,GAAG,KAAKzB,UAAL,CAAgBP,IAAhB,CAAH,GAA2B,IAAlE,CADF,CAPF,eAUE,oBAAC,cAAD;AAAA,uBACc,YADd;AAAA,0BAEWmC,aAFX;AAAA,2BAGYC,cAHZ;AAAA,+BAIgBC,SAJhB;AAAA,SAVF,eAgBE,oBAAC,cAAD;AAAA,uBAA4B;AAA5B,SAhBF,CADF,EAmBGR,QAAQ,CAACU,MAnBZ,CADF;AAuBD;;;;EAxGgBjF,S;;AA2GnB,eAAeuB,IAAf","sourcesContent":["import React from 'react';\nimport { Component, sstyled, Root } from '@semcore/core';\nimport { Box, Flex, IBoxProps } from '@semcore/flex-box';\nimport ScrollArea from '@semcore/scroll-area';\nimport { getFixedStyle, getScrollOffsetValue } from './utils';\nimport { RowData, Column, NestedCells, PropsLayer, Cell } from './types';\nimport assignProps from '@semcore/utils/lib/assignProps';\nimport type ResizeObserverCallback from 'resize-observer-polyfill';\n\nimport scrollStyles from './style/scroll-area.shadow.css';\nimport syncScroll from '@semcore/utils/lib/syncScroll';\n\nconst testEnv = process.env.NODE_ENV === 'test';\n\nconst getCellsByColumn = (cells: NestedCells): RowData => {\n const flattenCells = cells.flat(20) as Cell[];\n return Object.fromEntries(flattenCells.map((cell) => [cell.name, cell.data]));\n};\n\ntype AsProps = {\n rows: NestedCells[];\n columns: Column[];\n $scrollRef: ReturnType<ReturnType<typeof syncScroll>>;\n onResize: ResizeObserverCallback;\n rowPropsLayers: PropsLayer[];\n use: 'primary' | 'secondary';\n};\n\nclass Body extends Component<AsProps> {\n renderRow(cells: NestedCells, index: number) {\n const SRow = Box;\n const { styles, rowPropsLayers } = this.asProps;\n\n const cellsByColumn = cells.flatRowData || getCellsByColumn(cells);\n\n let props = {\n children: this.renderCells(cells, cellsByColumn, index),\n theme: undefined,\n active: undefined,\n };\n\n for (const rowPropsLayer of rowPropsLayers) {\n const { childrenPropsGetter = (p) => p, ...other } = rowPropsLayer;\n const propsRow = assignProps(other, props);\n props = assignProps(childrenPropsGetter(propsRow, cellsByColumn, index), propsRow);\n }\n\n return sstyled(styles)(<SRow key={index} {...props} />);\n }\n\n renderRows(rows: NestedCells[]) {\n return rows.map((cells, index) => this.renderRow(cells, index));\n }\n\n renderCells(cells: NestedCells, cellsByColumn: RowData, index: number) {\n const SCell = Flex;\n const { styles, columns, use } = this.asProps;\n return cells.map((cell) => {\n if (Array.isArray(cell)) {\n return <div>{this.renderRows(cell as NestedCells[])}</div>;\n } else {\n const column = columns.find((c) => c.name === cell.name);\n const [name, value] = getFixedStyle(cell, columns);\n const vars = (Array.isArray(cell.cssVar) ? cell.cssVar : [cell.cssVar]).map(\n (name) => `var(${name})`,\n );\n type CellProps = IBoxProps & {\n name: string;\n children: React.ReactNode;\n style: React.CSSProperties;\n };\n\n let props: CellProps = {\n name: cell.name,\n children: <>{cell.data}</>,\n ['data-data']: JSON.stringify(cell.data),\n justifyContent: column?.props?.justifyContent,\n style: {\n width: vars.length === 1 ? vars[0] : `calc(${vars.join(' + ')})`,\n },\n };\n if (name !== undefined && value !== undefined) {\n props.style[name] = value;\n }\n\n for (const cellPropLayer of cell.cellPropsLayers || []) {\n const { childrenPropsGetter = (p) => p, ...other } = cellPropLayer;\n const propsCell = assignProps(other, props);\n props = assignProps(childrenPropsGetter(propsCell, cellsByColumn, index), propsCell);\n }\n\n return sstyled(styles)(\n <SCell key={cell.name} {...props} fixed={cell.fixed} theme={props.theme} use={use} />,\n ) as React.ReactElement;\n }\n }, [] as React.ReactElement[]);\n }\n\n render() {\n const SBody = Root;\n const SBodyWrapper = Box;\n const SScrollAreaBar = ScrollArea.Bar;\n const { Children, styles, rows, columns, onResize, $scrollRef } = this.asProps;\n\n const columnsInitialized = columns.reduce((sum, { width }) => sum + width, 0) > 0 || testEnv;\n\n const [offsetLeftSum, offsetRightSum] = getScrollOffsetValue(columns);\n const offsetSum = offsetLeftSum + offsetRightSum;\n\n return sstyled(styles)(\n <SBodyWrapper>\n <ScrollArea\n shadow\n styles={scrollStyles}\n use:left={`${offsetLeftSum}px`}\n use:right={`${offsetRightSum}px`}\n onResize={onResize}\n >\n <ScrollArea.Container ref={$scrollRef}>\n <SBody render={Box}>{columnsInitialized ? this.renderRows(rows) : null}</SBody>\n </ScrollArea.Container>\n <SScrollAreaBar\n orientation=\"horizontal\"\n left={`${offsetLeftSum}px`}\n right={`${offsetRightSum}px`}\n offsetSum={`${offsetSum}px`}\n />\n <SScrollAreaBar orientation=\"vertical\" />\n </ScrollArea>\n {Children.origin}\n </SBodyWrapper>,\n );\n }\n}\n\nexport default Body;\n"],"file":"Body.js"}
1
+ {"version":3,"sources":["../../src/Body.tsx"],"names":["React","Component","sstyled","Root","Box","Flex","ScrollArea","getFixedStyle","getScrollOffsetValue","assignProps","callAllEventHandlers","ResizeObserver","trottle","testEnv","process","env","NODE_ENV","getCellsByColumn","cells","flattenCells","flat","Object","fromEntries","map","cell","name","data","Body","rowHeight","undefined","scrollAreaHeight","scrollOffset","createRef","virtualScroll","asProps","rowHeightFromProps","state","entries","contentRect","height","setState","oldState","event","target","scrollTop","firstRowRef","current","firstRowResizeObserver","handleFirstRowResize","observe","rowData","index","SCell","styles","columns","use","Array","isArray","renderRows","column","find","c","value","vars","cssVar","props","children","justifyContent","style","width","length","join","cellPropsLayers","cellPropLayer","childrenPropsGetter","p","other","propsCell","fixed","theme","dataIndex","topOffset","nested","SRow","rowPropsLayers","uniqueKey","flatRowData","key","String","needToMeasureHeight","renderCells","active","positioned","top","ref","rowPropsLayer","propsRow","rows","renderRow","getRowHeight","tollerance","startIndex","Math","max","floor","lastIndex","min","ceil","needToMeasureFirstRowHeight","firstRow","visibleRows","slice","processedVisibleRows","unshift","disconnect","SBody","SBodyWrapper","SScrollAreaBar","Bar","SHeightHold","Children","$scrollRef","onResize","columnsInitialized","reduce","sum","offsetLeftSum","offsetRightSum","offsetSum","holdHeight","Promise","setupRowSizeObserver","scrollStyles","handleScrollAreaResize","handleScrollAreaScroll","renderVirtualizedRows","origin"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Component, sstyled, Root } from '@semcore/core';\nimport { Box, Flex, IBoxProps } from '@semcore/flex-box';\nimport ScrollArea from '@semcore/scroll-area';\nimport { getFixedStyle, getScrollOffsetValue } from './utils';\nimport { RowData, Column, NestedCells, PropsLayer, Cell } from './types';\nimport assignProps, { callAllEventHandlers } from '@semcore/utils/lib/assignProps';\nimport ResizeObserver from 'resize-observer-polyfill';\nimport scrollStyles from './style/scroll-area.shadow.css';\nimport syncScroll from '@semcore/utils/lib/syncScroll';\nimport trottle from '@semcore/utils/lib/rafTrottle';\n\nconst testEnv = process.env.NODE_ENV === 'test';\n\nconst getCellsByColumn = (cells: NestedCells): RowData => {\n const flattenCells = cells.flat(20) as Cell[];\n return Object.fromEntries(flattenCells.map((cell) => [cell.name, cell.data]));\n};\n\ntype AsProps = {\n rows: NestedCells[];\n columns: Column[];\n $scrollRef: ReturnType<ReturnType<typeof syncScroll>>;\n onResize: ResizeObserverCallback;\n rowPropsLayers: PropsLayer[];\n use: 'primary' | 'secondary';\n uniqueKey: string;\n virtualScroll?: boolean | { tollerance?: number; rowHeight?: number };\n};\n\ntype State = {\n rowHeight: number | undefined;\n scrollAreaHeight: undefined | number;\n scrollOffset: number;\n};\n\nclass Body extends Component<AsProps, State> {\n state: State = {\n rowHeight: undefined,\n scrollAreaHeight: undefined,\n scrollOffset: 0,\n };\n\n firstRowRef = React.createRef<HTMLElement>();\n firstRowResizeObserver: ResizeObserver | null = null;\n\n getRowHeight = () => {\n const { virtualScroll } = this.asProps;\n const rowHeightFromProps = typeof virtualScroll === 'object' && virtualScroll?.rowHeight;\n return rowHeightFromProps || this.state.rowHeight;\n };\n\n renderCells(cells: NestedCells, rowData: RowData, index: number) {\n const SCell = Flex;\n const { styles, columns, use } = this.asProps;\n return cells.map((cell) => {\n if (Array.isArray(cell)) {\n return <div>{this.renderRows(cell as NestedCells[])}</div>;\n } else {\n const column = columns.find((c) => c.name === cell.name);\n const [name, value] = getFixedStyle(cell, columns);\n const vars = (Array.isArray(cell.cssVar) ? cell.cssVar : [cell.cssVar]).map(\n (name) => `var(${name})`,\n );\n type CellProps = IBoxProps & {\n name: string;\n children: React.ReactNode;\n style: React.CSSProperties;\n };\n\n let props: CellProps = {\n name: cell.name,\n children: <>{cell.data}</>,\n justifyContent: column?.props?.justifyContent,\n style: {\n width: vars.length === 1 ? vars[0] : `calc(${vars.join(' + ')})`,\n },\n };\n if (name !== undefined && value !== undefined) {\n props.style[name] = value;\n }\n\n for (const cellPropLayer of cell.cellPropsLayers || []) {\n const { childrenPropsGetter = (p) => p, ...other } = cellPropLayer;\n const propsCell = assignProps(other, props);\n props = assignProps(childrenPropsGetter(propsCell, rowData, index), propsCell);\n }\n\n return sstyled(styles)(\n <SCell key={cell.name} {...props} fixed={cell.fixed} theme={props.theme} use={use} />,\n ) as React.ReactElement;\n }\n }, [] as React.ReactElement[]);\n }\n\n renderRow(\n cells: NestedCells,\n { dataIndex, topOffset, nested }: { dataIndex: number; topOffset?: number; nested: boolean },\n ) {\n const SRow = Box;\n const { styles, rowPropsLayers, uniqueKey, virtualScroll } = this.asProps;\n const rowHeightFromProps = typeof virtualScroll === 'object' && virtualScroll?.rowHeight;\n\n const rowData = cells.flatRowData || getCellsByColumn(cells);\n const key = rowData[uniqueKey] ? String(rowData[uniqueKey]) : `row_${dataIndex}`;\n const needToMeasureHeight = dataIndex === 0 && !nested && !rowHeightFromProps;\n\n let props = {\n children: this.renderCells(cells, rowData, dataIndex),\n theme: undefined,\n active: undefined,\n positioned: topOffset !== undefined,\n top: topOffset,\n ref: needToMeasureHeight ? this.firstRowRef : undefined,\n key,\n };\n\n for (const rowPropsLayer of rowPropsLayers) {\n const { childrenPropsGetter = (p) => p, ...other } = rowPropsLayer;\n const propsRow = assignProps(other, props);\n props = assignProps(childrenPropsGetter(propsRow, rowData, dataIndex), propsRow);\n }\n\n return sstyled(styles)(<SRow {...props} />);\n }\n\n renderRows(rows: NestedCells[]) {\n return rows.map((cells, dataIndex) => this.renderRow(cells, { dataIndex, nested: false }));\n }\n\n renderVirtualizedRows(rows: NestedCells[]) {\n if (rows.length === 0) return [];\n\n const { virtualScroll } = this.asProps;\n const { scrollOffset, scrollAreaHeight } = this.state;\n const rowHeight = this.getRowHeight();\n\n const tollerance = (typeof virtualScroll === 'object' ? virtualScroll?.tollerance : 2) ?? 2;\n const startIndex = Math.max(Math.floor(scrollOffset / rowHeight!) - tollerance, 0);\n const lastIndex = Math.min(\n Math.ceil((scrollOffset + scrollAreaHeight!) / rowHeight!) + tollerance,\n rows.length,\n );\n\n const rowHeightFromProps = typeof virtualScroll === 'object' && virtualScroll?.rowHeight;\n const needToMeasureFirstRowHeight = !rowHeightFromProps;\n\n const firstRow = { cells: rows[0], dataIndex: 0, topOffset: 0 };\n const visibleRows = rowHeight !== undefined ? rows.slice(startIndex, lastIndex) : [];\n const processedVisibleRows = visibleRows.map((cells, index) => ({\n cells,\n dataIndex: startIndex + index,\n topOffset: rowHeight! * (startIndex + index),\n }));\n if (needToMeasureFirstRowHeight && startIndex !== 0) {\n processedVisibleRows.unshift(firstRow);\n }\n\n return processedVisibleRows.map(({ cells, dataIndex, topOffset }) =>\n this.renderRow(cells, { dataIndex, topOffset, nested: false }),\n );\n }\n\n handleFirstRowResize = trottle((entries: ResizeObserverEntry[]) => {\n const { contentRect } = entries[0];\n const { height } = contentRect;\n this.setState((oldState: State) => {\n if (oldState.rowHeight === height) return oldState;\n return { rowHeight: height };\n });\n });\n\n handleScrollAreaResize = trottle((entries: ResizeObserverEntry[]) => {\n const { virtualScroll } = this.asProps;\n if (!virtualScroll) return;\n const { contentRect } = entries[0];\n const { height } = contentRect;\n this.setState((oldState: State) => {\n if (oldState.scrollAreaHeight === height) return oldState;\n return { scrollAreaHeight: height };\n });\n });\n\n handleScrollAreaScroll = (event: React.SyntheticEvent<HTMLElement>) => {\n const { scrollTop } = event.target as HTMLElement;\n const { virtualScroll } = this.asProps;\n if (virtualScroll) {\n this.setState((oldState: State) => {\n if (oldState.scrollOffset === scrollTop) return oldState;\n return { scrollOffset: scrollTop };\n });\n }\n };\n\n setupRowSizeObserver = () => {\n if (!this.firstRowRef.current) return;\n if (!this.asProps.virtualScroll) return;\n this.firstRowResizeObserver = new ResizeObserver(this.handleFirstRowResize);\n this.firstRowResizeObserver.observe(this.firstRowRef.current);\n };\n\n componentWillUnmount() {\n this.firstRowResizeObserver?.disconnect();\n }\n\n render() {\n const SBody = Root;\n const SBodyWrapper = Box;\n const SScrollAreaBar = ScrollArea.Bar;\n const SHeightHold = Box;\n const { Children, styles, rows, columns, $scrollRef, virtualScroll, onResize } = this.asProps;\n\n const columnsInitialized = columns.reduce((sum, { width }) => sum + width, 0) > 0 || testEnv;\n\n const [offsetLeftSum, offsetRightSum] = getScrollOffsetValue(columns);\n const offsetSum = offsetLeftSum + offsetRightSum;\n\n const rowHeight = this.getRowHeight();\n const holdHeight =\n rowHeight !== undefined && virtualScroll ? rowHeight * rows.length : undefined;\n\n if (virtualScroll && columnsInitialized && !rowHeight) {\n new Promise(() => this.setupRowSizeObserver());\n }\n\n return sstyled(styles)(\n <SBodyWrapper>\n <ScrollArea\n shadow\n styles={scrollStyles}\n use:left={`${offsetLeftSum}px`}\n use:right={`${offsetRightSum}px`}\n onResize={callAllEventHandlers(onResize, this.handleScrollAreaResize)}\n onScroll={this.handleScrollAreaScroll}\n >\n <ScrollArea.Container ref={$scrollRef}>\n <SBody render={Box}>\n {holdHeight && <SHeightHold hMin={holdHeight} aria-hidden={true} />}\n {columnsInitialized && !virtualScroll ? this.renderRows(rows) : null}\n {columnsInitialized && virtualScroll ? this.renderVirtualizedRows(rows) : null}\n </SBody>\n </ScrollArea.Container>\n <SScrollAreaBar\n orientation=\"horizontal\"\n left={`${offsetLeftSum}px`}\n right={`${offsetRightSum}px`}\n offsetSum={`${offsetSum}px`}\n />\n <SScrollAreaBar orientation=\"vertical\" />\n </ScrollArea>\n {Children.origin}\n </SBodyWrapper>,\n );\n }\n}\n\nexport default Body;\n"],"file":"Body.js"}