@atlaskit/renderer 130.5.0 → 130.5.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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @atlaskit/renderer
2
2
 
3
+ ## 130.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`3a69722c61c6a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3a69722c61c6a) -
8
+ Add rounded corners to table node in editor. This works by hiding the actual table border and
9
+ adding a pseudo element with rounded corners.
10
+ - Updated dependencies
11
+
3
12
  ## 130.5.0
4
13
 
5
14
  ### Minor Changes
@@ -17,6 +17,7 @@ var _analytics = require("@atlaskit/editor-common/analytics");
17
17
  var _consts = require("../../consts");
18
18
  var _reactIntl = require("react-intl");
19
19
  var _messages = require("../../messages");
20
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
20
21
  var IgnoreSorting = ['LABEL', 'INPUT'];
21
22
  var nextStatusOrder = function nextStatusOrder(currentSortOrder) {
22
23
  switch (currentSortOrder) {
@@ -44,16 +45,26 @@ var getSortOrderLabel = function getSortOrderLabel(intl, currentSortOrder) {
44
45
  return intl.formatMessage(noneSortingLabel);
45
46
  }
46
47
  };
47
-
48
- // Ignored via go/ees005
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
- var getDataAttributes = function getDataAttributes(colwidth, background) {
51
- // Ignored via go/ees005
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ var getDataAttributes = function getDataAttributes(colwidth, background, cellEdgeProps) {
53
49
  var attrs = {};
54
50
  if (colwidth) {
55
51
  attrs['data-colwidth'] = colwidth.join(',');
56
52
  }
53
+ if ((0, _expValEquals.expValEquals)('platform_editor_table_q4_loveability', 'isEnabled', true)) {
54
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesTop) {
55
+ attrs['data-reaches-top'] = true;
56
+ }
57
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesBottom) {
58
+ attrs['data-reaches-bottom'] = true;
59
+ }
60
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesLeft) {
61
+ attrs['data-reaches-left'] = true;
62
+ }
63
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesRight) {
64
+ attrs['data-reaches-right'] = true;
65
+ }
66
+ }
67
+
57
68
  /**
58
69
  * Storing hex code in data-cell-background because
59
70
  * we want to have DST token (css variable) or
@@ -147,7 +158,11 @@ var getWithCellProps = function getWithCellProps(WrapperComponent) {
147
158
  colspan = props.colspan,
148
159
  background = props.background,
149
160
  offsetTop = props.offsetTop,
150
- ariaSort = props.ariaSort;
161
+ ariaSort = props.ariaSort,
162
+ reachesTop = props.reachesTop,
163
+ reachesBottom = props.reachesBottom,
164
+ reachesLeft = props.reachesLeft,
165
+ reachesRight = props.reachesRight;
151
166
 
152
167
  // This is used to set the background color of the cell
153
168
  // to a dark mode color in mobile dark mode
@@ -174,7 +189,12 @@ var getWithCellProps = function getWithCellProps(WrapperComponent) {
174
189
  className: className
175
190
  // Ignored via go/ees005
176
191
  // eslint-disable-next-line react/jsx-props-no-spreading
177
- }, getDataAttributes(colwidth, background), {
192
+ }, getDataAttributes(colwidth, background, {
193
+ reachesTop: reachesTop,
194
+ reachesBottom: reachesBottom,
195
+ reachesLeft: reachesLeft,
196
+ reachesRight: reachesRight
197
+ }), {
178
198
  "aria-sort": ariaSort
179
199
  }), children);
180
200
  };
@@ -325,6 +325,7 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
325
325
  key: "componentDidMount",
326
326
  value:
327
327
  /**
328
+ * Starts observing table dimensions and wires sticky header/scrollbar behavior after mount.
328
329
  *
329
330
  * @example
330
331
  */
@@ -349,6 +350,7 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
349
350
  }
350
351
 
351
352
  /**
353
+ * Updates sticky header wiring and scroll synchronization after prop or state changes.
352
354
  *
353
355
  * @param prevProps
354
356
  * @param prevState
@@ -382,7 +384,7 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
382
384
  key: "pinTop",
383
385
  get:
384
386
  /**
385
- *
387
+ * Calculates the top offset used when the sticky header is pinned to the table bottom.
386
388
  */
387
389
  function get() {
388
390
  if (!this.tableRef.current || !this.stickyHeaderRef.current) {
@@ -392,7 +394,7 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
392
394
  }
393
395
 
394
396
  /**
395
- *
397
+ * Determines whether sticky header positioning should include the default scroll root offset.
396
398
  */
397
399
  }, {
398
400
  key: "shouldAddOverflowParentOffsetTop_DO_NOT_USE",
@@ -405,7 +407,7 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
405
407
  }
406
408
 
407
409
  /**
408
- *
410
+ * Resolves the top position for the sticky header based on the current sticky mode.
409
411
  */
410
412
  }, {
411
413
  key: "stickyTop",
@@ -427,6 +429,7 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
427
429
  }
428
430
 
429
431
  /**
432
+ * Renders the table container, sticky header, table content, sticky scrollbar, and synced block borders.
430
433
  *
431
434
  * @example
432
435
  */
@@ -617,14 +620,91 @@ var TableContainer = exports.TableContainer = /*#__PURE__*/function (_React$Comp
617
620
  }
618
621
  }]);
619
622
  }(_react.default.Component);
623
+ var getCellEdgePropsByCellOffset = function getCellEdgePropsByCellOffset(tableNode) {
624
+ var cellEdgePropsByCellOffset = new Map();
625
+ var cellRightByCellOffset = new Map();
626
+ var occupiedGrid = [];
627
+ var tableWidth = 0;
628
+ var cellOffset = 0;
629
+ tableNode.forEach(function (rowNode, _rowOffset, rowIndex) {
630
+ var _occupiedGrid$rowInde;
631
+ occupiedGrid[rowIndex] = (_occupiedGrid$rowInde = occupiedGrid[rowIndex]) !== null && _occupiedGrid$rowInde !== void 0 ? _occupiedGrid$rowInde : [];
632
+ var columnIndex = 0;
633
+ cellOffset += 1;
634
+ rowNode.forEach(function (cellNode) {
635
+ while (occupiedGrid[rowIndex][columnIndex]) {
636
+ columnIndex += 1;
637
+ }
638
+ var colspan = cellNode.attrs.colspan || 1;
639
+ var rowspan = cellNode.attrs.rowspan || 1;
640
+ var cellLeft = columnIndex;
641
+ var cellRight = cellLeft + colspan;
642
+ var cellTop = rowIndex;
643
+ var cellBottom = cellTop + rowspan;
644
+ for (var row = cellTop; row < cellBottom; row += 1) {
645
+ var _occupiedGrid$row;
646
+ occupiedGrid[row] = (_occupiedGrid$row = occupiedGrid[row]) !== null && _occupiedGrid$row !== void 0 ? _occupiedGrid$row : [];
647
+ for (var column = cellLeft; column < cellRight; column += 1) {
648
+ occupiedGrid[row][column] = true;
649
+ }
650
+ }
651
+ tableWidth = Math.max(tableWidth, cellRight);
652
+ cellRightByCellOffset.set(cellOffset, cellRight);
653
+ cellEdgePropsByCellOffset.set(cellOffset, {
654
+ reachesBottom: cellBottom >= tableNode.childCount,
655
+ reachesLeft: cellLeft === 0,
656
+ reachesRight: false,
657
+ reachesTop: cellTop === 0
658
+ });
659
+ columnIndex = cellRight;
660
+ cellOffset += cellNode.nodeSize;
661
+ });
662
+ cellOffset += 1;
663
+ });
664
+ cellRightByCellOffset.forEach(function (cellRight, currentCellOffset) {
665
+ var edgeProps = cellEdgePropsByCellOffset.get(currentCellOffset);
666
+ if (edgeProps) {
667
+ edgeProps.reachesRight = cellRight >= tableWidth;
668
+ }
669
+ });
670
+ return cellEdgePropsByCellOffset;
671
+ };
672
+ var addTableCellEdgeProps = function addTableCellEdgeProps(rows, tableNode) {
673
+ try {
674
+ if (!tableNode) {
675
+ return rows;
676
+ }
677
+ var cellEdgePropsByCellOffset = getCellEdgePropsByCellOffset(tableNode);
678
+ var cellOffset = 0;
679
+ return _react.default.Children.map(rows, function (row, rowIndex) {
680
+ var rowNode = tableNode.child(rowIndex);
681
+ cellOffset += 1;
682
+ var cellIndex = 0;
683
+ var rowChildren = _react.default.Children.map(row.props.children, function (child) {
684
+ if (! /*#__PURE__*/_react.default.isValidElement(child)) {
685
+ return child;
686
+ }
687
+ var cellNode = rowNode.child(cellIndex);
688
+ var edgeProps = cellEdgePropsByCellOffset.get(cellOffset);
689
+ cellIndex += 1;
690
+ cellOffset += cellNode.nodeSize;
691
+ return edgeProps ? /*#__PURE__*/_react.default.cloneElement(child, edgeProps) : child;
692
+ });
693
+ cellOffset += 1;
694
+ return /*#__PURE__*/_react.default.cloneElement(row, undefined, rowChildren);
695
+ });
696
+ } catch (_unused) {
697
+ // Renderer can receive malformed historical ADF. If the table shape cannot
698
+ // be described safely, keep rendering without rounded edge metadata.
699
+ return rows;
700
+ }
701
+ };
702
+
620
703
  /**
621
- *
704
+ * Processes table children before passing them to the styled table container.
622
705
  */
623
706
  // Ignored via go/ees005
624
707
  // eslint-disable-next-line @repo/internal/react/no-class-components
625
- /**
626
- *
627
- */
628
708
  var TableProcessorWithContainerStyles = exports.TableProcessorWithContainerStyles = /*#__PURE__*/function (_React$Component2) {
629
709
  function TableProcessorWithContainerStyles() {
630
710
  var _this2;
@@ -675,22 +755,63 @@ var TableProcessorWithContainerStyles = exports.TableProcessorWithContainerStyle
675
755
  key: "render",
676
756
  value:
677
757
  /**
758
+ * Renders processed table children inside the table container.
678
759
  *
679
760
  * @example
680
761
  */
681
762
  function render() {
682
- var children = this.props.children;
763
+ var _this$props2 = this.props,
764
+ allowColumnSorting = _this$props2.allowColumnSorting,
765
+ allowFixedColumnWidthOption = _this$props2.allowFixedColumnWidthOption,
766
+ allowTableAlignment = _this$props2.allowTableAlignment,
767
+ allowTableResizing = _this$props2.allowTableResizing,
768
+ children = _this$props2.children,
769
+ columnWidths = _this$props2.columnWidths,
770
+ disableTableOverflowShadow = _this$props2.disableTableOverflowShadow,
771
+ handleRef = _this$props2.handleRef,
772
+ isinsideMultiBodiedExtension = _this$props2.isinsideMultiBodiedExtension,
773
+ isInsideOfBlockNode = _this$props2.isInsideOfBlockNode,
774
+ isInsideOfTable = _this$props2.isInsideOfTable,
775
+ isNumberColumnEnabled = _this$props2.isNumberColumnEnabled,
776
+ isPresentational = _this$props2.isPresentational,
777
+ layout = _this$props2.layout,
778
+ rendererAppearance = _this$props2.rendererAppearance,
779
+ renderWidth = _this$props2.renderWidth,
780
+ shadowClassNames = _this$props2.shadowClassNames,
781
+ smartCardStorage = _this$props2.smartCardStorage,
782
+ stickyHeaders = _this$props2.stickyHeaders,
783
+ tabIndex = _this$props2.tabIndex,
784
+ tableNode = _this$props2.tableNode;
683
785
  if (!children) {
684
786
  return null;
685
787
  }
686
788
  var childrenArray = _react.default.Children.toArray(children);
789
+ var childrenWithTableEdgeProps = (0, _expValEquals.expValEquals)('platform_editor_table_q4_loveability', 'isEnabled', true) ? addTableCellEdgeProps(childrenArray, tableNode) : childrenArray;
687
790
  var orderedChildren = (0, _utils.compose)(this.addNumberColumnIndexes, this.addSortableColumn
688
791
  // @ts-expect-error TS2345: Argument of type '(ReactChild | ReactFragment | ReactPortal)[]' is not assignable to parameter of type 'ReactElement<any, string | JSXElementConstructor<any>>[]'
689
- )(childrenArray);
690
-
691
- // Ignored via go/ees005
692
- // eslint-disable-next-line react/jsx-props-no-spreading
693
- return /*#__PURE__*/_react.default.createElement(TableContainer, this.props, orderedChildren);
792
+ )(childrenWithTableEdgeProps);
793
+ return /*#__PURE__*/_react.default.createElement(TableContainer, {
794
+ allowColumnSorting: allowColumnSorting,
795
+ allowFixedColumnWidthOption: allowFixedColumnWidthOption,
796
+ allowTableAlignment: allowTableAlignment,
797
+ allowTableResizing: allowTableResizing,
798
+ columnWidths: columnWidths,
799
+ disableTableOverflowShadow: disableTableOverflowShadow,
800
+ handleRef: handleRef,
801
+ isinsideMultiBodiedExtension: isinsideMultiBodiedExtension,
802
+ isInsideOfBlockNode: isInsideOfBlockNode,
803
+ isInsideOfTable: isInsideOfTable,
804
+ isNumberColumnEnabled: isNumberColumnEnabled,
805
+ isPresentational: isPresentational,
806
+ layout: layout,
807
+ rendererAppearance: rendererAppearance,
808
+ renderWidth: renderWidth,
809
+ shadowClassNames: shadowClassNames,
810
+ smartCardStorage: smartCardStorage,
811
+ stickyHeaders: stickyHeaders,
812
+ tabIndex: tabIndex,
813
+ tableNode: tableNode
814
+ }, orderedChildren);
694
815
  }
695
816
  }]);
696
817
  }(_react.default.Component);
@@ -147,7 +147,10 @@ var headingAnchorStylesDuplicateAnchor = (0, _react.css)({
147
147
  '> button': {
148
148
  opacity: 0,
149
149
  transform: 'translate(-8px, 0px)',
150
- transition: 'opacity 0.2s ease 0s, transform 0.2s ease 0s'
150
+ transitionProperty: 'opacity, transform',
151
+ transitionDuration: "var(--ds-duration-medium, 0.2s)".concat(", ", "var(--ds-duration-medium, 0.2s)"),
152
+ transitionTimingFunction: "var(--ds-easing-out-practical, ease)".concat(", ", "var(--ds-easing-out-practical, ease)"),
153
+ transitionDelay: '0s, 0s'
151
154
  }
152
155
  }), '&:hover', (0, _defineProperty2.default)({}, ".".concat(_headingAnchor.HeadingAnchorWrapperClassName, " > button"), {
153
156
  opacity: 1,
@@ -1505,6 +1508,43 @@ var tableSharedStyle = (0, _react.css)((0, _defineProperty2.default)((0, _define
1505
1508
  }))
1506
1509
  }
1507
1510
  }));
1511
+ var roundedTableOuterBorderOverlayStyles = (0, _react.css)((0, _defineProperty2.default)({}, ".".concat(_styles.TableSharedCssClassName.TABLE_CONTAINER, " > table,\n\t.").concat(_styles.TableSharedCssClassName.TABLE_NODE_WRAPPER, " > table,\n\t.").concat(_styles.TableSharedCssClassName.TABLE_STICKY_WRAPPER, " > table"), {
1512
+ borderColor: 'transparent',
1513
+ position: 'relative',
1514
+ '&::after': {
1515
+ content: "''",
1516
+ position: 'absolute',
1517
+ inset: 0,
1518
+ border: "".concat(_styles.tableCellBorderWidth, "px solid ", "var(--ds-background-accent-gray-subtler, #DDDEE1)"),
1519
+ borderRadius: "var(--ds-radius-medium, 6px)",
1520
+ pointerEvents: 'none',
1521
+ zIndex: 1
1522
+ },
1523
+ '> tbody > tr:first-of-type > th, > tbody > tr:first-of-type > td, > tbody > tr > th[data-reaches-top], > tbody > tr > td[data-reaches-top]': {
1524
+ borderTopColor: 'transparent'
1525
+ },
1526
+ '> tbody > tr > th:first-child, > tbody > tr > td:first-child, > tbody > tr > th[data-reaches-left], > tbody > tr > td[data-reaches-left]': {
1527
+ borderLeftColor: 'transparent'
1528
+ },
1529
+ '> tbody > tr > th[data-reaches-right], > tbody > tr > td[data-reaches-right]': {
1530
+ borderRightColor: 'transparent'
1531
+ },
1532
+ '> tbody > tr > th[data-reaches-bottom], > tbody > tr > td[data-reaches-bottom]': {
1533
+ borderBottomColor: 'transparent'
1534
+ },
1535
+ '> tbody > tr > th[data-reaches-top][data-reaches-left], > tbody > tr > td[data-reaches-top][data-reaches-left]': {
1536
+ borderTopLeftRadius: "var(--ds-radius-medium, 6px)"
1537
+ },
1538
+ '> tbody > tr > th[data-reaches-top][data-reaches-right], > tbody > tr > td[data-reaches-top][data-reaches-right]': {
1539
+ borderTopRightRadius: "var(--ds-radius-medium, 6px)"
1540
+ },
1541
+ '> tbody > tr > th[data-reaches-bottom][data-reaches-left], > tbody > tr > td[data-reaches-bottom][data-reaches-left]': {
1542
+ borderBottomLeftRadius: "var(--ds-radius-medium, 6px)"
1543
+ },
1544
+ '> tbody > tr > th[data-reaches-bottom][data-reaches-right], > tbody > tr > td[data-reaches-bottom][data-reaches-right]': {
1545
+ borderBottomRightRadius: "var(--ds-radius-medium, 6px)"
1546
+ }
1547
+ }));
1508
1548
  var tableContentModeStyles = (0, _react.css)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, ".".concat(_consts.RendererCssClassName.DOCUMENT, " .").concat(_styles.TableSharedCssClassName.TABLE_CONTAINER, ":has(table[data-initial-width-mode=\"content\"])"), {
1509
1549
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-important-styles
1510
1550
  width: 'max-content !important',
@@ -2110,6 +2150,9 @@ var tableFakeBorderStyles = (0, _react.css)((0, _defineProperty2.default)((0, _d
2110
2150
  borderLeftColor: 'transparent',
2111
2151
  borderRightColor: 'transparent'
2112
2152
  }));
2153
+ var roundedTableFakeBorderOverlayStyles = (0, _react.css)((0, _defineProperty2.default)({}, ".".concat(_styles.TableSharedCssClassName.TABLE_CONTAINER), (0, _defineProperty2.default)({}, ".".concat(_styles.TableSharedCssClassName.TABLE_RIGHT_BORDER, ",\n\t\t.").concat(_styles.TableSharedCssClassName.TABLE_LEFT_BORDER), {
2154
+ display: 'none'
2155
+ })));
2113
2156
  var syncBlockStyles = (0, _react.css)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, ".".concat(_syncBlock.SyncBlockSharedCssClassName.renderer, ", .").concat(_syncBlock.BodiedSyncBlockSharedCssClassName.renderer, ", .").concat(_syncBlock.SyncBlockSharedCssClassName.error, ", .").concat(_syncBlock.SyncBlockSharedCssClassName.loading), {
2114
2157
  borderRadius: "var(--ds-radius-small, 3px)",
2115
2158
  marginTop: "var(--ds-space-075, 6px)",
@@ -2177,7 +2220,7 @@ var RendererStyleContainer = exports.RendererStyleContainer = function RendererS
2177
2220
  // this should be placed after baseOtherStyles
2178
2221
  (0, _expValEquals.expValEquals)('platform_editor_render_bodied_extension_as_inline', 'isEnabled', true) && ((0, _expValEquals.expValEquals)('platform_editor_remove_important_in_render_ext', 'isEnabled', true) ? extensionAsInlineStyle : oldExtensionAsInlineStyle), inlineExtensionRendererMarginFix, allowNestedHeaderLinks && ((0, _expValEquals.expValEquals)('platform_editor_copy_link_a11y_inconsistency_fix', 'isEnabled', true) ? alignedHeadingAnchorStyle : alignedHeadingAnchorStyleDuplicateAnchor), mediaSingleSharedStyle,
2179
2222
  // merge firstWrappedMediaStyles with mediaSingleSharedStyle when clean up platform_editor_fix_media_in_renderer
2180
- (0, _platformFeatureFlags.fg)('platform_editor_fix_media_in_renderer') && firstWrappedMediaStyles, tableSharedStyle, (0, _expValEquals.expValEquals)('platform_editor_table_fit_to_content_auto_convert', 'isEnabled', true) && tableContentModeStyles, tableRendererHeaderStylesForTableCellOnly, (0, _platformFeatureFlags.fg)('platform_editor_bordered_panel_nested_in_table') && tableRendererNestedPanelStyles, isBackgroundClipBrowserFixNeeded() && tableStylesBackGroundClipForGeckoForTableCellOnly, (0, _platformFeatureFlags.fg)('platform_editor_nested_dnd_styles_changes') ? firstNodeWithNotMarginTopWithNestedDnD : firstNodeWithNotMarginTop, rendererTableStyles, (0, _table.isStickyScrollbarEnabled)(appearance) && stickyScrollbarStyles, rendererTableHeaderEqualHeightStylesForTableCellOnly, allowColumnSorting && rendererTableSortableColumnStyles, allowColumnSorting && allowNestedHeaderLinks && ((0, _expValEquals.expValEquals)('platform_editor_copy_link_a11y_inconsistency_fix', 'isEnabled', true) ? rendererTableHeaderEqualHeightStylesAllowNestedHeaderLinks : rendererTableHeaderEqualHeightStylesAllowNestedHeaderLinksDuplicateAnchor), rendererTableColumnStyles, stickyHeaderStyles, codeBlockAndLayoutStyles, columnLayoutSharedStyle, isAdvancedLayoutsOn && columnLayoutResponsiveSharedStyle, isAdvancedLayoutsOn && columnLayoutResponsiveRendererStyles, isAdvancedLayoutsOn && layoutSectionForAdvancedLayoutsStyles, !useBlockRenderForCodeBlock && gridRenderForCodeBlockStyles, browser.safari && codeBlockInListSafariFixStyles, appearance === 'full-page' && !isPreviewPanelResponsivenessOn && responsiveBreakoutWidth, appearance === 'full-page' && isPreviewPanelResponsivenessOn && responsiveBreakoutWidthWithReducedPadding, (appearance === 'full-width' || appearance === 'max' && ((0, _expValEquals.expValEquals)('editor_tinymce_full_width_mode', 'isEnabled', true) || (0, _expValEquals.expValEquals)('confluence_max_width_content_appearance', 'isEnabled', true))) && responsiveBreakoutWidthFullWidth, (0, _expValEquals.expValEquals)('platform_editor_lovability_emoji_scaling', 'isEnabled', true) ? (0, _expValEquals.expValEquals)('platform_editor_emojis_in_renderer_smart_links', 'isEnabled', true) ? isCompactModeEnabled ? scaledDenseEmojiStylesNew : scaledEmojiStylesNew : isCompactModeEnabled ? scaledDenseEmojiStyles : scaledEmojiStyles : isCompactModeEnabled ? denseStyles : undefined, (0, _experiments.editorExperiment)('platform_synced_block', true) && syncBlockStyles, centerWrapperStyles, (0, _experiments.editorExperiment)('platform_synced_block', true) && isInsideSyncBlock && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_9') ? syncBlockRendererStyles : null, isInsideSyncBlock && (0, _experiments.editorExperiment)('platform_synced_block', true) && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_9') && tableFakeBorderStyles, (0, _expValEquals.expValEquals)('platform_editor_hide_extension_renderer_support', 'isEnabled', true) && hideExtensionStyles],
2223
+ (0, _platformFeatureFlags.fg)('platform_editor_fix_media_in_renderer') && firstWrappedMediaStyles, tableSharedStyle, (0, _expValEquals.expValEquals)('platform_editor_table_q4_loveability', 'isEnabled', true) && roundedTableOuterBorderOverlayStyles, (0, _expValEquals.expValEquals)('platform_editor_table_fit_to_content_auto_convert', 'isEnabled', true) && tableContentModeStyles, tableRendererHeaderStylesForTableCellOnly, (0, _platformFeatureFlags.fg)('platform_editor_bordered_panel_nested_in_table') && tableRendererNestedPanelStyles, isBackgroundClipBrowserFixNeeded() && tableStylesBackGroundClipForGeckoForTableCellOnly, (0, _platformFeatureFlags.fg)('platform_editor_nested_dnd_styles_changes') ? firstNodeWithNotMarginTopWithNestedDnD : firstNodeWithNotMarginTop, rendererTableStyles, (0, _table.isStickyScrollbarEnabled)(appearance) && stickyScrollbarStyles, rendererTableHeaderEqualHeightStylesForTableCellOnly, allowColumnSorting && rendererTableSortableColumnStyles, allowColumnSorting && allowNestedHeaderLinks && ((0, _expValEquals.expValEquals)('platform_editor_copy_link_a11y_inconsistency_fix', 'isEnabled', true) ? rendererTableHeaderEqualHeightStylesAllowNestedHeaderLinks : rendererTableHeaderEqualHeightStylesAllowNestedHeaderLinksDuplicateAnchor), rendererTableColumnStyles, stickyHeaderStyles, codeBlockAndLayoutStyles, columnLayoutSharedStyle, isAdvancedLayoutsOn && columnLayoutResponsiveSharedStyle, isAdvancedLayoutsOn && columnLayoutResponsiveRendererStyles, isAdvancedLayoutsOn && layoutSectionForAdvancedLayoutsStyles, !useBlockRenderForCodeBlock && gridRenderForCodeBlockStyles, browser.safari && codeBlockInListSafariFixStyles, appearance === 'full-page' && !isPreviewPanelResponsivenessOn && responsiveBreakoutWidth, appearance === 'full-page' && isPreviewPanelResponsivenessOn && responsiveBreakoutWidthWithReducedPadding, (appearance === 'full-width' || appearance === 'max' && ((0, _expValEquals.expValEquals)('editor_tinymce_full_width_mode', 'isEnabled', true) || (0, _expValEquals.expValEquals)('confluence_max_width_content_appearance', 'isEnabled', true))) && responsiveBreakoutWidthFullWidth, (0, _expValEquals.expValEquals)('platform_editor_lovability_emoji_scaling', 'isEnabled', true) ? (0, _expValEquals.expValEquals)('platform_editor_emojis_in_renderer_smart_links', 'isEnabled', true) ? isCompactModeEnabled ? scaledDenseEmojiStylesNew : scaledEmojiStylesNew : isCompactModeEnabled ? scaledDenseEmojiStyles : scaledEmojiStyles : isCompactModeEnabled ? denseStyles : undefined, (0, _experiments.editorExperiment)('platform_synced_block', true) && syncBlockStyles, centerWrapperStyles, (0, _experiments.editorExperiment)('platform_synced_block', true) && isInsideSyncBlock && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_9') ? syncBlockRendererStyles : null, isInsideSyncBlock && (0, _experiments.editorExperiment)('platform_synced_block', true) && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_9') && tableFakeBorderStyles, isInsideSyncBlock && (0, _experiments.editorExperiment)('platform_synced_block', true) && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_9') ? (0, _expValEquals.expValEquals)('platform_editor_table_q4_loveability', 'isEnabled', true) ? roundedTableFakeBorderOverlayStyles : null : null, (0, _expValEquals.expValEquals)('platform_editor_hide_extension_renderer_support', 'isEnabled', true) && hideExtensionStyles],
2181
2224
  "data-testid": testId
2182
2225
  }, children);
2183
2226
  };
@@ -71,7 +71,7 @@ var DEGRADED_SEVERITY_THRESHOLD = exports.DEGRADED_SEVERITY_THRESHOLD = 3000;
71
71
  var TABLE_INFO_TIMEOUT = 10000;
72
72
  var RENDER_EVENT_SAMPLE_RATE = 0.2;
73
73
  var packageName = "@atlaskit/renderer";
74
- var packageVersion = "130.4.2";
74
+ var packageVersion = "0.0.0-development";
75
75
  var setAsQueryContainerStyles = (0, _react2.css)({
76
76
  containerName: 'ak-renderer-wrapper',
77
77
  containerType: 'inline-size'
@@ -10,6 +10,7 @@ import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/anal
10
10
  import { RendererCssClassName } from '../../consts';
11
11
  import { useIntl } from 'react-intl';
12
12
  import { tableCellMessages } from '../../messages';
13
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
13
14
  const IgnoreSorting = ['LABEL', 'INPUT'];
14
15
  const nextStatusOrder = currentSortOrder => {
15
16
  switch (currentSortOrder) {
@@ -39,16 +40,26 @@ const getSortOrderLabel = (intl, currentSortOrder) => {
39
40
  return intl.formatMessage(noneSortingLabel);
40
41
  }
41
42
  };
42
-
43
- // Ignored via go/ees005
44
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
- const getDataAttributes = (colwidth, background) => {
46
- // Ignored via go/ees005
47
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ const getDataAttributes = (colwidth, background, cellEdgeProps) => {
48
44
  const attrs = {};
49
45
  if (colwidth) {
50
46
  attrs['data-colwidth'] = colwidth.join(',');
51
47
  }
48
+ if (expValEquals('platform_editor_table_q4_loveability', 'isEnabled', true)) {
49
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesTop) {
50
+ attrs['data-reaches-top'] = true;
51
+ }
52
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesBottom) {
53
+ attrs['data-reaches-bottom'] = true;
54
+ }
55
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesLeft) {
56
+ attrs['data-reaches-left'] = true;
57
+ }
58
+ if (cellEdgeProps !== null && cellEdgeProps !== void 0 && cellEdgeProps.reachesRight) {
59
+ attrs['data-reaches-right'] = true;
60
+ }
61
+ }
62
+
52
63
  /**
53
64
  * Storing hex code in data-cell-background because
54
65
  * we want to have DST token (css variable) or
@@ -145,7 +156,11 @@ const getWithCellProps = WrapperComponent => {
145
156
  colspan,
146
157
  background,
147
158
  offsetTop,
148
- ariaSort
159
+ ariaSort,
160
+ reachesTop,
161
+ reachesBottom,
162
+ reachesLeft,
163
+ reachesRight
149
164
  } = props;
150
165
 
151
166
  // This is used to set the background color of the cell
@@ -173,7 +188,12 @@ const getWithCellProps = WrapperComponent => {
173
188
  className: className
174
189
  // Ignored via go/ees005
175
190
  // eslint-disable-next-line react/jsx-props-no-spreading
176
- }, getDataAttributes(colwidth, background), {
191
+ }, getDataAttributes(colwidth, background, {
192
+ reachesTop,
193
+ reachesBottom,
194
+ reachesLeft,
195
+ reachesRight
196
+ }), {
177
197
  "aria-sort": ariaSort
178
198
  }), children);
179
199
  };
@@ -278,6 +278,7 @@ export class TableContainer extends React.Component {
278
278
  });
279
279
  }
280
280
  /**
281
+ * Starts observing table dimensions and wires sticky header/scrollbar behavior after mount.
281
282
  *
282
283
  * @example
283
284
  */
@@ -302,6 +303,7 @@ export class TableContainer extends React.Component {
302
303
  }
303
304
 
304
305
  /**
306
+ * Updates sticky header wiring and scroll synchronization after prop or state changes.
305
307
  *
306
308
  * @param prevProps
307
309
  * @param prevState
@@ -330,7 +332,7 @@ export class TableContainer extends React.Component {
330
332
  }
331
333
  }
332
334
  /**
333
- *
335
+ * Calculates the top offset used when the sticky header is pinned to the table bottom.
334
336
  */
335
337
  get pinTop() {
336
338
  if (!this.tableRef.current || !this.stickyHeaderRef.current) {
@@ -340,7 +342,7 @@ export class TableContainer extends React.Component {
340
342
  }
341
343
 
342
344
  /**
343
- *
345
+ * Determines whether sticky header positioning should include the default scroll root offset.
344
346
  */
345
347
  get shouldAddOverflowParentOffsetTop_DO_NOT_USE() {
346
348
  // IF the StickyHeaderConfig specifies that the default scroll root offsetTop should be added
@@ -351,7 +353,7 @@ export class TableContainer extends React.Component {
351
353
  }
352
354
 
353
355
  /**
354
- *
356
+ * Resolves the top position for the sticky header based on the current sticky mode.
355
357
  */
356
358
  get stickyTop() {
357
359
  switch (this.state.stickyMode) {
@@ -371,6 +373,7 @@ export class TableContainer extends React.Component {
371
373
  }
372
374
 
373
375
  /**
376
+ * Renders the table container, sticky header, table content, sticky scrollbar, and synced block borders.
374
377
  *
375
378
  * @example
376
379
  */
@@ -565,14 +568,91 @@ export class TableContainer extends React.Component {
565
568
  })));
566
569
  }
567
570
  }
571
+ const getCellEdgePropsByCellOffset = tableNode => {
572
+ const cellEdgePropsByCellOffset = new Map();
573
+ const cellRightByCellOffset = new Map();
574
+ const occupiedGrid = [];
575
+ let tableWidth = 0;
576
+ let cellOffset = 0;
577
+ tableNode.forEach((rowNode, _rowOffset, rowIndex) => {
578
+ var _occupiedGrid$rowInde;
579
+ occupiedGrid[rowIndex] = (_occupiedGrid$rowInde = occupiedGrid[rowIndex]) !== null && _occupiedGrid$rowInde !== void 0 ? _occupiedGrid$rowInde : [];
580
+ let columnIndex = 0;
581
+ cellOffset += 1;
582
+ rowNode.forEach(cellNode => {
583
+ while (occupiedGrid[rowIndex][columnIndex]) {
584
+ columnIndex += 1;
585
+ }
586
+ const colspan = cellNode.attrs.colspan || 1;
587
+ const rowspan = cellNode.attrs.rowspan || 1;
588
+ const cellLeft = columnIndex;
589
+ const cellRight = cellLeft + colspan;
590
+ const cellTop = rowIndex;
591
+ const cellBottom = cellTop + rowspan;
592
+ for (let row = cellTop; row < cellBottom; row += 1) {
593
+ var _occupiedGrid$row;
594
+ occupiedGrid[row] = (_occupiedGrid$row = occupiedGrid[row]) !== null && _occupiedGrid$row !== void 0 ? _occupiedGrid$row : [];
595
+ for (let column = cellLeft; column < cellRight; column += 1) {
596
+ occupiedGrid[row][column] = true;
597
+ }
598
+ }
599
+ tableWidth = Math.max(tableWidth, cellRight);
600
+ cellRightByCellOffset.set(cellOffset, cellRight);
601
+ cellEdgePropsByCellOffset.set(cellOffset, {
602
+ reachesBottom: cellBottom >= tableNode.childCount,
603
+ reachesLeft: cellLeft === 0,
604
+ reachesRight: false,
605
+ reachesTop: cellTop === 0
606
+ });
607
+ columnIndex = cellRight;
608
+ cellOffset += cellNode.nodeSize;
609
+ });
610
+ cellOffset += 1;
611
+ });
612
+ cellRightByCellOffset.forEach((cellRight, currentCellOffset) => {
613
+ const edgeProps = cellEdgePropsByCellOffset.get(currentCellOffset);
614
+ if (edgeProps) {
615
+ edgeProps.reachesRight = cellRight >= tableWidth;
616
+ }
617
+ });
618
+ return cellEdgePropsByCellOffset;
619
+ };
620
+ const addTableCellEdgeProps = (rows, tableNode) => {
621
+ try {
622
+ if (!tableNode) {
623
+ return rows;
624
+ }
625
+ const cellEdgePropsByCellOffset = getCellEdgePropsByCellOffset(tableNode);
626
+ let cellOffset = 0;
627
+ return React.Children.map(rows, (row, rowIndex) => {
628
+ const rowNode = tableNode.child(rowIndex);
629
+ cellOffset += 1;
630
+ let cellIndex = 0;
631
+ const rowChildren = React.Children.map(row.props.children, child => {
632
+ if (! /*#__PURE__*/React.isValidElement(child)) {
633
+ return child;
634
+ }
635
+ const cellNode = rowNode.child(cellIndex);
636
+ const edgeProps = cellEdgePropsByCellOffset.get(cellOffset);
637
+ cellIndex += 1;
638
+ cellOffset += cellNode.nodeSize;
639
+ return edgeProps ? /*#__PURE__*/React.cloneElement(child, edgeProps) : child;
640
+ });
641
+ cellOffset += 1;
642
+ return /*#__PURE__*/React.cloneElement(row, undefined, rowChildren);
643
+ });
644
+ } catch {
645
+ // Renderer can receive malformed historical ADF. If the table shape cannot
646
+ // be described safely, keep rendering without rounded edge metadata.
647
+ return rows;
648
+ }
649
+ };
650
+
568
651
  /**
569
- *
652
+ * Processes table children before passing them to the styled table container.
570
653
  */
571
654
  // Ignored via go/ees005
572
655
  // eslint-disable-next-line @repo/internal/react/no-class-components
573
- /**
574
- *
575
- */
576
656
  export class TableProcessorWithContainerStyles extends React.Component {
577
657
  constructor(...args) {
578
658
  super(...args);
@@ -618,23 +698,63 @@ export class TableProcessorWithContainerStyles extends React.Component {
618
698
  });
619
699
  }
620
700
  /**
701
+ * Renders processed table children inside the table container.
621
702
  *
622
703
  * @example
623
704
  */
624
705
  render() {
625
706
  const {
626
- children
707
+ allowColumnSorting,
708
+ allowFixedColumnWidthOption,
709
+ allowTableAlignment,
710
+ allowTableResizing,
711
+ children,
712
+ columnWidths,
713
+ disableTableOverflowShadow,
714
+ handleRef,
715
+ isinsideMultiBodiedExtension,
716
+ isInsideOfBlockNode,
717
+ isInsideOfTable,
718
+ isNumberColumnEnabled,
719
+ isPresentational,
720
+ layout,
721
+ rendererAppearance,
722
+ renderWidth,
723
+ shadowClassNames,
724
+ smartCardStorage,
725
+ stickyHeaders,
726
+ tabIndex,
727
+ tableNode
627
728
  } = this.props;
628
729
  if (!children) {
629
730
  return null;
630
731
  }
631
732
  const childrenArray = React.Children.toArray(children);
733
+ const childrenWithTableEdgeProps = expValEquals('platform_editor_table_q4_loveability', 'isEnabled', true) ? addTableCellEdgeProps(childrenArray, tableNode) : childrenArray;
632
734
  const orderedChildren = compose(this.addNumberColumnIndexes, this.addSortableColumn
633
735
  // @ts-expect-error TS2345: Argument of type '(ReactChild | ReactFragment | ReactPortal)[]' is not assignable to parameter of type 'ReactElement<any, string | JSXElementConstructor<any>>[]'
634
- )(childrenArray);
635
-
636
- // Ignored via go/ees005
637
- // eslint-disable-next-line react/jsx-props-no-spreading
638
- return /*#__PURE__*/React.createElement(TableContainer, this.props, orderedChildren);
736
+ )(childrenWithTableEdgeProps);
737
+ return /*#__PURE__*/React.createElement(TableContainer, {
738
+ allowColumnSorting: allowColumnSorting,
739
+ allowFixedColumnWidthOption: allowFixedColumnWidthOption,
740
+ allowTableAlignment: allowTableAlignment,
741
+ allowTableResizing: allowTableResizing,
742
+ columnWidths: columnWidths,
743
+ disableTableOverflowShadow: disableTableOverflowShadow,
744
+ handleRef: handleRef,
745
+ isinsideMultiBodiedExtension: isinsideMultiBodiedExtension,
746
+ isInsideOfBlockNode: isInsideOfBlockNode,
747
+ isInsideOfTable: isInsideOfTable,
748
+ isNumberColumnEnabled: isNumberColumnEnabled,
749
+ isPresentational: isPresentational,
750
+ layout: layout,
751
+ rendererAppearance: rendererAppearance,
752
+ renderWidth: renderWidth,
753
+ shadowClassNames: shadowClassNames,
754
+ smartCardStorage: smartCardStorage,
755
+ stickyHeaders: stickyHeaders,
756
+ tabIndex: tabIndex,
757
+ tableNode: tableNode
758
+ }, orderedChildren);
639
759
  }
640
760
  }