From a09e21adc748fdecf4183618c06ccf0b0afce0d5 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Wed, 13 May 2026 20:23:10 +0300 Subject: [PATCH 01/12] chore: update diplodoc/transform and fix unit tests --- .../extensions/yfm/YfmTabs/YfmTabs.test.ts | 28 ++-- pnpm-lock.yaml | 158 ++++++------------ pnpm-workspace.yaml | 2 +- 3 files changed, 62 insertions(+), 126 deletions(-) diff --git a/packages/editor/src/extensions/yfm/YfmTabs/YfmTabs.test.ts b/packages/editor/src/extensions/yfm/YfmTabs/YfmTabs.test.ts index d7a3e5d15..661c5da01 100644 --- a/packages/editor/src/extensions/yfm/YfmTabs/YfmTabs.test.ts +++ b/packages/editor/src/extensions/yfm/YfmTabs/YfmTabs.test.ts @@ -90,7 +90,7 @@ describe('YfmTabs extension', () => { id: 'unknown', class: 'yfm-tab yfm-tab-group active', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `regular-${generatedId}`, 'aria-selected': 'true', tabindex: '0', 'data-diplodoc-is-active': 'true', @@ -104,7 +104,7 @@ describe('YfmTabs extension', () => { id: 'unknown', class: 'yfm-tab yfm-tab-group', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `regular-${generatedId}`, 'aria-selected': 'false', tabindex: '-1', 'data-diplodoc-is-active': 'false', @@ -116,7 +116,7 @@ describe('YfmTabs extension', () => { ), tabPanel( { - id: generatedId, + id: `regular-${generatedId}`, class: 'yfm-tab-panel active', role: 'tabpanel', 'data-title': 'panel title 1', @@ -126,7 +126,7 @@ describe('YfmTabs extension', () => { ), tabPanel( { - id: generatedId, + id: `regular-${generatedId}`, class: 'yfm-tab-panel', role: 'tabpanel', 'data-title': 'panel title 2', @@ -168,7 +168,7 @@ describe('YfmTabs extension', () => { id: 'unknown', class: 'yfm-tab yfm-tab-group active', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `regular-${generatedId}`, 'aria-selected': 'true', tabindex: '0', 'data-diplodoc-is-active': 'true', @@ -180,7 +180,7 @@ describe('YfmTabs extension', () => { ), tabPanel( { - id: generatedId, + id: `regular-${generatedId}`, class: 'yfm-tab-panel active', role: 'tabpanel', 'data-title': 'Tab', @@ -236,7 +236,7 @@ ${' '} id: null, class: 'yfm-tab yfm-tab-group yfm-vertical-tab', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `radio-${generatedId}`, 'aria-selected': 'false', tabindex: '0', 'data-diplodoc-is-active': 'false', @@ -252,7 +252,7 @@ ${' '} ), tabPanel( { - id: generatedId, + id: `radio-${generatedId}`, class: 'yfm-tab-panel', role: 'tabpanel', 'data-title': 'Radio button 1', @@ -270,7 +270,7 @@ ${' '} id: null, class: 'yfm-tab yfm-tab-group yfm-vertical-tab', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `radio-${generatedId}`, 'aria-selected': 'false', tabindex: '0', 'data-diplodoc-is-active': 'false', @@ -286,7 +286,7 @@ ${' '} ), tabPanel( { - id: generatedId, + id: `radio-${generatedId}`, class: 'yfm-tab-panel', role: 'tabpanel', 'data-title': 'Nested radio button 1', @@ -299,7 +299,7 @@ ${' '} id: null, class: 'yfm-tab yfm-tab-group yfm-vertical-tab', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `radio-${generatedId}`, 'aria-selected': 'false', tabindex: '-1', 'data-diplodoc-is-active': 'false', @@ -315,7 +315,7 @@ ${' '} ), tabPanel( { - id: generatedId, + id: `radio-${generatedId}`, class: 'yfm-tab-panel', role: 'tabpanel', 'data-title': 'Nested radio button 2', @@ -330,7 +330,7 @@ ${' '} id: null, class: 'yfm-tab yfm-tab-group yfm-vertical-tab', role: 'tab', - 'aria-controls': generatedId, + 'aria-controls': `radio-${generatedId}`, 'aria-selected': 'false', tabindex: '-1', 'data-diplodoc-is-active': 'false', @@ -346,7 +346,7 @@ ${' '} ), tabPanel( { - id: generatedId, + id: `radio-${generatedId}`, class: 'yfm-tab-panel', role: 'tabpanel', 'data-title': 'Radio button 2', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3be70448f..b1ab2cb88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,16 +52,16 @@ catalogs: version: 2.0.0 '@diplodoc/page-constructor-extension': specifier: ^0.13.3 - version: 0.13.2 + version: 0.13.3 '@diplodoc/quote-link-extension': specifier: 0.1.3 version: 0.1.3 '@diplodoc/tabs-extension': specifier: ^3.7.5 - version: 3.8.0 + version: 3.10.0 '@diplodoc/transform': - specifier: 4.69.0 - version: 4.69.0 + specifier: 4.75.1 + version: 4.75.1 peer-gravity: '@gravity-ui/components': specifier: 4.10.0 @@ -154,7 +154,7 @@ importers: version: 0.1.2 '@diplodoc/html-extension': specifier: catalog:peer-diplodoc - version: 2.9.6(@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0) + version: 2.9.6(@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0) '@diplodoc/latex-extension': specifier: catalog:peer-diplodoc version: 1.4.1(katex@0.16.27)(markdown-it@13.0.2)(react@18.2.0) @@ -163,16 +163,16 @@ importers: version: 2.0.0(markdown-it@13.0.2)(react@18.2.0) '@diplodoc/page-constructor-extension': specifier: catalog:peer-diplodoc - version: 0.13.2(@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/markdown-it@13.0.9)(@types/react@18.0.28)(markdown-it@13.0.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) + version: 0.13.3(@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/markdown-it@13.0.9)(@types/react@18.0.28)(markdown-it@13.0.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) '@diplodoc/quote-link-extension': specifier: catalog:peer-diplodoc version: 0.1.3(react@18.2.0) '@diplodoc/tabs-extension': specifier: catalog:peer-diplodoc - version: 3.8.0(react@18.2.0) + version: 3.10.0(react@18.2.0) '@diplodoc/transform': specifier: catalog:peer-diplodoc - version: 4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) + version: 4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) '@gravity-ui/components': specifier: catalog:peer-gravity version: 4.10.0(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -187,7 +187,7 @@ importers: version: link:../packages/page-constructor-extension '@gravity-ui/page-constructor': specifier: catalog:peer-gravity - version: 7.25.0(@diplodoc/transform@4.69.0(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) + version: 7.25.0(@diplodoc/transform@4.75.1(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) '@gravity-ui/uikit': specifier: catalog:peer-gravity version: 7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -412,7 +412,7 @@ importers: version: 0.1.1 '@diplodoc/utils': specifier: ^2.1.0 - version: 2.1.0(react@18.2.0) + version: 2.2.2(react@18.2.0) '@floating-ui/react': specifier: ^0.27.16 version: 0.27.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -536,7 +536,7 @@ importers: version: 0.1.2 '@diplodoc/html-extension': specifier: catalog:peer-diplodoc - version: 2.9.6(@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0) + version: 2.9.6(@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0) '@diplodoc/latex-extension': specifier: catalog:peer-diplodoc version: 1.4.1(katex@0.16.27)(markdown-it@13.0.2)(react@18.2.0) @@ -548,13 +548,13 @@ importers: version: 0.1.3(react@18.2.0) '@diplodoc/tabs-extension': specifier: catalog:peer-diplodoc - version: 3.8.0(react@18.2.0) + version: 3.10.0(react@18.2.0) '@diplodoc/themes': specifier: ^1.0.0 version: 1.2.0 '@diplodoc/transform': specifier: catalog:peer-diplodoc - version: 4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) + version: 4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) '@gravity-ui/components': specifier: catalog:peer-gravity version: 4.10.0(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -724,13 +724,13 @@ importers: devDependencies: '@diplodoc/page-constructor-extension': specifier: catalog:peer-diplodoc - version: 0.13.2(@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/markdown-it@13.0.9)(@types/react@18.0.28)(markdown-it@13.0.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) + version: 0.13.3(@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/markdown-it@13.0.9)(@types/react@18.0.28)(markdown-it@13.0.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) '@gravity-ui/markdown-editor': specifier: workspace:* version: link:../editor '@gravity-ui/page-constructor': specifier: catalog:peer-gravity - version: 7.25.0(@diplodoc/transform@4.69.0(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) + version: 7.25.0(@diplodoc/transform@4.75.1(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) '@gravity-ui/uikit': specifier: catalog:peer-gravity version: 7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1683,8 +1683,8 @@ packages: react: optional: true - '@diplodoc/page-constructor-extension@0.13.2': - resolution: {integrity: sha512-D18FjFwY+pxEAiNBUkW0B2p1OK2IRPh2ZiBm4qiWT7hswmPbenFDyKfG+Lwj2Gb7ecBcdZAXwjoNeolKb2FJIQ==} + '@diplodoc/page-constructor-extension@0.13.3': + resolution: {integrity: sha512-ND0B4soYIkK0TboewloqphtVukYjCDQ/DvjVJ6uJsWmw2slji0s9JgNmK3r2TJGZaT1id5bt7r4ZcdRx09xfsg==} engines: {node: '>=18', npm: '>=11.5.1'} peerDependencies: '@diplodoc/transform': ^4.62.0 @@ -1695,8 +1695,8 @@ packages: '@diplodoc/quote-link-extension@0.1.3': resolution: {integrity: sha512-1Q/pNkg7tOFuxhDny2iRxL6dSyXOarKFBzx0RyTjMipKhVFOeonFMT3XoeO34Wns7loi88CTO+jJCsqc3K4BUw==} - '@diplodoc/tabs-extension@3.8.0': - resolution: {integrity: sha512-Ar6YGC+VWFX1dRCZ5wYVlKcOf1lqzknsAVnyW5Bian4s6Vp0llLmGtY7n4bbN7IQdIT5X5OU0mBnbDwA9X+9nA==} + '@diplodoc/tabs-extension@3.10.0': + resolution: {integrity: sha512-3Ky6FiGpoQgc5A/6R82y6kuTY0dMMImrFNW0ktPxAfs9CSWqpaPMWR2ZD2dy6Q0ks8mThLNJ4GjQn6vkwMuF9w==} engines: {node: '>=22', npm: '>=11.5.1'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1707,8 +1707,8 @@ packages: '@diplodoc/themes@1.2.0': resolution: {integrity: sha512-fb1iPz9TN0PjLXaKT4fudJxoBPdyR6AxYG9yp40a+A833vGtIKXBLrrKhNWk/eGdAheTgROtGk5N6o2vYnnltg==} - '@diplodoc/transform@4.69.0': - resolution: {integrity: sha512-CVGh0Yirp/pY04+4JDjwr2TT75JSzi9JcncqdbZdrDI+IgxEI/sf93geawtUdu6ahxf/frKovJ/i5kwG7enKgw==} + '@diplodoc/transform@4.75.1': + resolution: {integrity: sha512-/GTGBtgd3UGnCHVmVFZaV8B+W3aBJp9ELQOO9kb6QlBz/fgw1IH/0/8crEW65lKj7vK1SXYyMZ0YN+cxU3zbpw==} engines: {npm: '>=11.5.1'} peerDependencies: highlight.js: ^10.0.3 || ^11 @@ -1716,8 +1716,9 @@ packages: highlight.js: optional: true - '@diplodoc/utils@2.1.0': - resolution: {integrity: sha512-1XfZSb0gPLqSRGwxlLHcXo4c59bcFomcEaDM5v2S/aFDhgNRfZgDGxWEbHwkIijfBB2rvFWuVgKzON0VDp2uqQ==} + '@diplodoc/utils@2.2.2': + resolution: {integrity: sha512-j6AgDFuxo7CVbs3EteJSqxGDwjCGuMfOGFSFbx+0rc90tj1qvgYMkmGQQdcUkL/aCFU/0JokCrD+4nSjIcAKKw==} + engines: {npm: '>=11.5.1'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -3596,9 +3597,6 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -6316,9 +6314,6 @@ packages: lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -7132,9 +7127,6 @@ packages: raf-schd@4.0.3: resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -7480,9 +7472,6 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -7563,9 +7552,6 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7937,22 +7923,6 @@ packages: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} engines: {node: '>=6.0.0'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser-webpack-plugin@5.4.0: resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} engines: {node: '>= 10.13.0'} @@ -8272,6 +8242,7 @@ packages: uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-to-istanbul@9.3.0: @@ -9689,7 +9660,7 @@ snapshots: '@diplodoc/cut-extension@1.1.1(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0)': dependencies: '@diplodoc/directive': 0.3.3(@types/markdown-it@13.0.9)(markdown-it@13.0.2) - '@diplodoc/utils': 2.1.0(react@18.2.0) + '@diplodoc/utils': 2.2.2(react@18.2.0) transitivePeerDependencies: - '@types/markdown-it' - markdown-it @@ -9711,13 +9682,13 @@ snapshots: '@diplodoc/folding-headings-extension@0.1.2': {} - '@diplodoc/html-extension@2.9.6(@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0)': + '@diplodoc/html-extension@2.9.6(@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0)': dependencies: '@diplodoc/directive': 0.3.3(@types/markdown-it@13.0.9)(markdown-it@13.0.2) markdown-it: 13.0.2 parse5: 8.0.1 optionalDependencies: - '@diplodoc/transform': 4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) + '@diplodoc/transform': 4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) react: 18.2.0 transitivePeerDependencies: - '@types/markdown-it' @@ -9739,12 +9710,12 @@ snapshots: optionalDependencies: react: 18.2.0 - '@diplodoc/page-constructor-extension@0.13.2(@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/markdown-it@13.0.9)(@types/react@18.0.28)(markdown-it@13.0.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)': + '@diplodoc/page-constructor-extension@0.13.3(@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/markdown-it@13.0.9)(@types/react@18.0.28)(markdown-it@13.0.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)': dependencies: '@diplodoc/directive': 0.3.3(@types/markdown-it@13.0.9)(markdown-it@13.0.2) - '@diplodoc/transform': 4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) - '@diplodoc/utils': 2.1.0(react@18.2.0) - '@gravity-ui/page-constructor': 7.25.0(@diplodoc/transform@4.69.0(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) + '@diplodoc/transform': 4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) + '@diplodoc/utils': 2.2.2(react@18.2.0) + '@gravity-ui/page-constructor': 7.25.0(@diplodoc/transform@4.75.1(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) cheerio: 1.0.0 js-yaml: 4.1.1 lodash: 4.17.23 @@ -9760,22 +9731,22 @@ snapshots: '@diplodoc/quote-link-extension@0.1.3(react@18.2.0)': dependencies: - '@diplodoc/utils': 2.1.0(react@18.2.0) + '@diplodoc/utils': 2.2.2(react@18.2.0) transitivePeerDependencies: - react - '@diplodoc/tabs-extension@3.8.0(react@18.2.0)': + '@diplodoc/tabs-extension@3.10.0(react@18.2.0)': optionalDependencies: react: 18.2.0 '@diplodoc/themes@1.2.0': {} - '@diplodoc/transform@4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0)': + '@diplodoc/transform@4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0)': dependencies: '@diplodoc/cut-extension': 1.1.1(@types/markdown-it@13.0.9)(markdown-it@13.0.2)(react@18.2.0) '@diplodoc/file-extension': 0.2.2(@types/markdown-it@13.0.9)(markdown-it@13.0.2) - '@diplodoc/tabs-extension': 3.8.0(react@18.2.0) - '@diplodoc/utils': 2.1.0(react@18.2.0) + '@diplodoc/tabs-extension': 3.10.0(react@18.2.0) + '@diplodoc/utils': 2.2.2(react@18.2.0) chalk: 4.1.2 cheerio: 1.0.0 css: 3.0.0 @@ -9783,7 +9754,7 @@ snapshots: get-root-node-polyfill: 1.0.0 github-slugger: 1.5.0 js-yaml: 4.1.1 - lodash: 4.17.21 + lodash: 4.17.23 markdown-it: 13.0.2 markdown-it-attrs: 4.2.0(markdown-it@13.0.2) markdown-it-deflist: 2.1.0 @@ -9801,7 +9772,7 @@ snapshots: - '@types/markdown-it' - react - '@diplodoc/utils@2.1.0(react@18.2.0)': + '@diplodoc/utils@2.2.2(react@18.2.0)': optionalDependencies: react: 18.2.0 @@ -10215,10 +10186,10 @@ snapshots: optionalDependencies: react: 18.2.0 - '@gravity-ui/page-constructor@7.25.0(@diplodoc/transform@4.69.0(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)': + '@gravity-ui/page-constructor@7.25.0(@diplodoc/transform@4.75.1(highlight.js@11.8.0)(react@18.2.0))(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(js-yaml@4.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)': dependencies: '@bem-react/classname': 1.6.0 - '@diplodoc/transform': 4.69.0(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) + '@diplodoc/transform': 4.75.1(@types/markdown-it@13.0.9)(highlight.js@11.8.0)(react@18.2.0) '@gravity-ui/components': 4.10.0(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@gravity-ui/dynamic-forms': 5.13.2(@gravity-ui/uikit@7.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.0.28)(final-form@4.20.10)(react-dom@18.2.0(react@18.2.0))(react-final-form@6.5.9(final-form@4.20.10)(react@18.2.0))(react-is@18.3.1)(react@18.2.0) '@gravity-ui/i18n': 1.8.0 @@ -10907,7 +10878,7 @@ snapshots: magic-string: 0.30.21 storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.7.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) style-loader: 4.0.0(webpack@5.106.2(esbuild@0.27.3)) - terser-webpack-plugin: 5.3.16(esbuild@0.27.3)(webpack@5.106.2(esbuild@0.27.3)) + terser-webpack-plugin: 5.4.0(esbuild@0.27.3)(webpack@5.106.2(esbuild@0.27.3)) ts-dedent: 2.2.0 webpack: 5.106.2(esbuild@0.27.3) webpack-dev-middleware: 6.1.3(webpack@5.106.2(esbuild@0.27.3)) @@ -11784,19 +11755,14 @@ snapshots: transitivePeerDependencies: - supports-color - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.18.0 ajv-keywords@3.5.2(ajv@6.14.0): dependencies: ajv: 6.14.0 - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - ajv-keywords@5.1.0(ajv@8.18.0): dependencies: ajv: 8.18.0 @@ -11809,13 +11775,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -15144,8 +15103,6 @@ snapshots: lodash.upperfirst@4.3.1: {} - lodash@4.17.21: {} - lodash@4.17.23: {} log-symbols@4.1.0: @@ -16037,10 +15994,6 @@ snapshots: raf-schd@4.0.3: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - range-parser@1.2.1: {} rc-slider@11.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0): @@ -16470,8 +16423,6 @@ snapshots: safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -16539,9 +16490,9 @@ snapshots: schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.18.0 + ajv-formats: 2.1.1(ajv@8.18.0) + ajv-keywords: 5.1.0(ajv@8.18.0) screenfull@5.2.0: {} @@ -16555,10 +16506,6 @@ snapshots: semver@7.7.4: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -17048,17 +16995,6 @@ snapshots: dependencies: rimraf: 2.6.3 - terser-webpack-plugin@5.3.16(esbuild@0.27.3)(webpack@5.106.2(esbuild@0.27.3)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 - webpack: 5.106.2(esbuild@0.27.3) - optionalDependencies: - esbuild: 0.27.3 - terser-webpack-plugin@5.4.0(esbuild@0.27.3)(webpack@5.106.2(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d8da4ff23..16d295a50 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -26,7 +26,7 @@ catalogs: '@diplodoc/page-constructor-extension': ^0.13.3 '@diplodoc/quote-link-extension': 0.1.3 '@diplodoc/tabs-extension': ^3.7.5 - '@diplodoc/transform': 4.69.0 + '@diplodoc/transform': 4.75.1 peer-gravity: '@gravity-ui/components': 4.10.0 From 70811e534940b557a936152d0a831143f00ad8a9 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Thu, 14 May 2026 18:56:23 +0300 Subject: [PATCH 02/12] chore: add test:e2e:ui package script --- demo/package.json | 1 + demo/scripts/playwright-docker.sh | 3 ++- package.json | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/demo/package.json b/demo/package.json index 70b8f30b8..73e98c815 100644 --- a/demo/package.json +++ b/demo/package.json @@ -15,6 +15,7 @@ "playwright:clear": "rm -rf ./tests/playwright/.cache", "playwright:report": "playwright show-report playwright-report", "playwright:docker": "./scripts/playwright-docker.sh test", + "playwright:docker:ui": "./scripts/playwright-docker.sh test --ui-port 8082 --ui-host 0.0.0.0", "playwright:docker:update": "./scripts/playwright-docker.sh update", "playwright:docker:clear": "./scripts/playwright-docker.sh clear", "playwright:docker:report": "playwright show-report playwright-report-docker" diff --git a/demo/scripts/playwright-docker.sh b/demo/scripts/playwright-docker.sh index e0be198ad..992ec5b19 100755 --- a/demo/scripts/playwright-docker.sh +++ b/demo/scripts/playwright-docker.sh @@ -20,7 +20,7 @@ command_exists() { } run_command() { - $CONTAINER_TOOL run --rm --network host -it -w /work \ + $CONTAINER_TOOL run --rm -it -w /work \ --platform linux/arm64 \ --ipc=host \ -v $(pwd):/work \ @@ -28,6 +28,7 @@ run_command() { -v "$PNPM_STORE_CACHE_DIR:/root/.local/share/pnpm/store" \ -e IS_DOCKER=1 \ -e NODE_OPTIONS="--max-old-space-size=8192" \ + -p 8082:8082 \ "$IMAGE_NAME:$IMAGE_TAG" \ /bin/bash -c "$*" } diff --git a/package.json b/package.json index 23bdd9c01..ab239fce9 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "typecheck": "nx run-many -t typecheck", "test": "nx run-many -t test,test:esbuild,test:circular-deps", "test:e2e": "nx playwright:docker @markdown-editor/demo", + "test:e2e:ui": "nx playwright:docker:ui @markdown-editor/demo", "test:e2e:report": "nx playwright:docker:report @markdown-editor/demo", "lint": "run-p -cs lint:*", "lint:js": "eslint './**/*.{js,jsx,mjs,ts,tsx}'", From dc697587bb5c4f54d22063b9a57075895ae0efff Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Thu, 14 May 2026 19:03:32 +0300 Subject: [PATCH 03/12] chore(demo): add no-stripe-table yfm mode to yfm-table-dnd story --- demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx index 6c05865ca..0347a7299 100644 --- a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx +++ b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx @@ -21,6 +21,9 @@ export const YfmTableDnDDemo = memo(function YfmTableDnDDe }, wysiwygConfig: { extensionOptions: { + yfmConfigs: { + mods: {'no-stripe-table': true}, + }, yfmTable: { dnd, }, From cfbfe132536f4789a760d51e023eec3d6a5504dc Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Tue, 12 May 2026 21:03:56 +0300 Subject: [PATCH 04/12] feat(YfmTable): support header rows in yfm-table --- demo/src/components/Playground.tsx | 1 + .../yfm-table-dnd/YfmTableDnD.stories.tsx | 1 + .../examples/yfm-table-dnd/YfmTableDnD.tsx | 8 +- demo/tests/playwright/core/editor.ts | 8 +- .../FoldingHeading/plugins/Folding.ts | 39 +---- .../extensions/yfm/YfmTable/YfmTable.test.ts | 93 ++++++++++++ .../yfm/YfmTable/YfmTableSpecs/const.ts | 1 + .../yfm/YfmTable/YfmTableSpecs/parser.ts | 10 +- .../yfm/YfmTable/YfmTableSpecs/schema.ts | 22 ++- .../yfm/YfmTable/YfmTableSpecs/serializer.ts | 7 + .../src/extensions/yfm/YfmTable/index.ts | 15 +- .../commands/insert-empty-row.ts | 8 + .../commands/remove-row-range.ts | 17 +++ .../commands/toggle-header-rows.test.ts | 120 +++++++++++++++ .../commands/toggle-header-rows.ts | 41 ++++++ .../FloatingMenuControl.tsx | 138 +++++++++++------- .../plugins/YfmTableControls/dnd/dnd.scss | 8 +- .../plugins/YfmTableControls/dnd/dnd.ts | 30 ++++ .../plugins/YfmTableControls/index.ts | 16 +- .../nodeviews/yfm-table-cell-view.tsx | 79 +++++++++- .../YfmTableControls/plugins/focus-plugin.ts | 6 +- .../plugins/header-rows-plugin.ts | 45 ++++++ packages/editor/src/i18n/yfm-table/en.json | 2 + packages/editor/src/i18n/yfm-table/ru.json | 2 + packages/editor/src/table-utils/table-desc.ts | 10 +- packages/editor/src/utils/transaction.ts | 52 ++++++- 26 files changed, 667 insertions(+), 112 deletions(-) create mode 100644 packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.test.ts create mode 100644 packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.ts create mode 100644 packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/header-rows-plugin.ts diff --git a/demo/src/components/Playground.tsx b/demo/src/components/Playground.tsx index 3bfa7b486..ffb1a20bb 100644 --- a/demo/src/components/Playground.tsx +++ b/demo/src/components/Playground.tsx @@ -255,6 +255,7 @@ export const Playground = memo((props) => { lineWrapping: {enabled: true}, }, yfmTable: { + headerRows: true, table_ignoreSplittersInBlockCode: true, table_ignoreSplittersInBlockMath: true, table_ignoreSplittersInInlineCode: true, diff --git a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.stories.tsx b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.stories.tsx index 17339425c..7efabb63d 100644 --- a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.stories.tsx +++ b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.stories.tsx @@ -6,6 +6,7 @@ export const Story: StoryObj = { args: { mobile: false, dnd: true, + headerRows: true, }, }; Story.storyName = "YFM Table D'n'D"; diff --git a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx index 0347a7299..3e1557392 100644 --- a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx +++ b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx @@ -9,9 +9,14 @@ import {markup} from './markup'; export type YfmTableDnDDemoProps = { mobile: boolean; dnd: boolean; + headerRows: boolean; }; -export const YfmTableDnDDemo = memo(function YfmTableDnDDemo({mobile, dnd}) { +export const YfmTableDnDDemo = memo(function YfmTableDnDDemo({ + mobile, + dnd, + headerRows, +}) { const editor = useMarkdownEditor( { mobile, @@ -26,6 +31,7 @@ export const YfmTableDnDDemo = memo(function YfmTableDnDDe }, yfmTable: { dnd, + headerRows, }, }, }, diff --git a/demo/tests/playwright/core/editor.ts b/demo/tests/playwright/core/editor.ts index 4d0c0360a..b68ab59b7 100644 --- a/demo/tests/playwright/core/editor.ts +++ b/demo/tests/playwright/core/editor.ts @@ -10,7 +10,8 @@ type YfmTableActionKind = | 'add-column-before' | 'add-column-after' | 'add-row-before' - | 'add-row-after'; + | 'add-row-after' + | 'header-toggle'; type MarkdownEditorToolbarsLocators = Record< 'main' | 'additional' | 'selection' | 'commandMenu', @@ -167,6 +168,7 @@ class YfmTable { 'remove-column': page.getByTestId('g-md-yfm-table-action-remove-column'), 'remove-row': page.getByTestId('g-md-yfm-table-action-remove-row'), 'remove-table': page.getByTestId('g-md-yfm-table-action-remove-table'), + 'header-toggle': page.getByTestId('g-md-yfm-table-action-header-toggle'), }; } @@ -174,6 +176,10 @@ class YfmTable { return this.cellMenus[type]; } + getCellActionLocator(menuType: YfmTableCellMenuType, kind: YfmTableActionKind) { + return this.cellMenus[menuType].locator(this.cellMenuActions[kind]); + } + async getTable(locator?: Locator) { return locator?.locator(this.tableLocator) ?? this.tableLocator; } diff --git a/packages/editor/src/extensions/additional/FoldingHeading/plugins/Folding.ts b/packages/editor/src/extensions/additional/FoldingHeading/plugins/Folding.ts index a46709941..877196030 100644 --- a/packages/editor/src/extensions/additional/FoldingHeading/plugins/Folding.ts +++ b/packages/editor/src/extensions/additional/FoldingHeading/plugins/Folding.ts @@ -1,17 +1,11 @@ import type {Node} from 'prosemirror-model'; -import {Plugin, type Transaction} from 'prosemirror-state'; -import { - AddMarkStep, - AddNodeMarkStep, - DocAttrStep, - RemoveMarkStep, - RemoveNodeMarkStep, - ReplaceStep, -} from 'prosemirror-transform'; +import {Plugin} from 'prosemirror-state'; // @ts-ignore // TODO: fix cjs build import {findChildren} from 'prosemirror-utils'; import {Decoration, type DecorationAttrs, DecorationSet} from 'prosemirror-view'; +import {isNonStructuralTr} from 'src/utils/transaction'; + import {YfmHeadingAttr} from '../const'; import { isFoldedHeading, @@ -37,7 +31,7 @@ export const foldingPlugin = () => { if ( !tr.docChanged || // Optimization: ignoring trs, that don't change position of blocks in doc - canSafelyIgnoreTr(tr) + isNonStructuralTr(tr) ) { return prev.map(tr.mapping, tr.doc); } @@ -75,31 +69,6 @@ function isLeftPaddingClick(event: MouseEvent): boolean { return event.offsetX < leftPadding; } -const safeSteps = [AddMarkStep, AddNodeMarkStep, DocAttrStep, RemoveMarkStep, RemoveNodeMarkStep]; -function canSafelyIgnoreTr(tr: Transaction): boolean { - if (isInputTr(tr) || isTextBackspaceTr(tr)) return true; - if (tr.steps.every((step) => safeSteps.some((SafeStep) => step instanceof SafeStep))) - return true; - return false; -} - -function isInputTr(tr: Transaction): boolean { - if (tr.steps.length !== 1) return false; - const [step] = tr.steps; - return ( - step instanceof ReplaceStep && - step.from === step.to && - step.slice.content.childCount === 1 && - step.slice.content.child(0).type.name === 'text' - ); -} - -function isTextBackspaceTr(tr: Transaction): boolean { - if (tr.steps.length !== 1) return false; - const [step] = tr.steps; - return step instanceof ReplaceStep && step.to - step.from === 1 && step.slice.size === 0; -} - // eslint-disable-next-line complexity function buildDecosSet(doc: Node): DecorationSet { const contentDecos: Record = {}; diff --git a/packages/editor/src/extensions/yfm/YfmTable/YfmTable.test.ts b/packages/editor/src/extensions/yfm/YfmTable/YfmTable.test.ts index 82afa32da..5274c0c6f 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/YfmTable.test.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/YfmTable.test.ts @@ -1,6 +1,7 @@ import {EditorState} from 'prosemirror-state'; import {builders} from 'prosemirror-test-builder'; import {EditorView} from 'prosemirror-view'; +import dd from 'ts-dedent'; import {dispatchPasteEvent} from '../../../../tests/dispatch-event'; import {parseDOM} from '../../../../tests/parse-dom'; @@ -519,6 +520,98 @@ nested table ); }); + it('should parse table with header-rows attribute', () => { + const markup = dd` + #| + |:{header-rows="1"} + || + + Header 1 + + | + + Header 2 + + || + || + + Cell 1 + + | + + Cell 2 + + || + |# + + + `; + + same( + markup, + doc( + table( + {[YfmTableAttr.HeaderRows]: 1}, + tbody( + tr(td(p('Header 1')), td(p('Header 2'))), + tr(td(p('Cell 1')), td(p('Cell 2'))), + ), + ), + ), + ); + }); + + it('should parse table with header-rows="2"', () => { + const markup = dd` + #| + |:{header-rows="2"} + || + + H1 + + | + + H2 + + || + || + + H3 + + | + + H4 + + || + || + + Cell 1 + + | + + Cell 2 + + || + |# + + + `; + + same( + markup, + doc( + table( + {[YfmTableAttr.HeaderRows]: 2}, + tbody( + tr(td(p('H1')), td(p('H2'))), + tr(td(p('H3')), td(p('H4'))), + tr(td(p('Cell 1')), td(p('Cell 2'))), + ), + ), + ), + ); + }); + it('should preserve cell-align', () => { const markup = ` #| diff --git a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/const.ts b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/const.ts index 9c47a488c..d6f0819a0 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/const.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/const.ts @@ -9,4 +9,5 @@ export enum YfmTableAttr { Colspan = 'colspan', Rowspan = 'rowspan', CellAlign = 'data-cell-align', + HeaderRows = 'data-header-rows', } diff --git a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/parser.ts b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/parser.ts index 5c9177bb3..e1fa64412 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/parser.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/parser.ts @@ -3,7 +3,15 @@ import type {ParserToken} from '../../../../core'; import {YfmTableAttr, YfmTableNode} from './const'; export const parserTokens: Record = { - [YfmTableNode.Table]: {name: YfmTableNode.Table, type: 'block'}, + [YfmTableNode.Table]: { + name: YfmTableNode.Table, + type: 'block', + getAttrs: (token) => { + return { + [YfmTableAttr.HeaderRows]: token.meta?.headerRows || 0, + }; + }, + }, [YfmTableNode.Body]: {name: YfmTableNode.Body, type: 'block'}, diff --git a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/schema.ts b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/schema.ts index 7866428d6..13269b8c2 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/schema.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/schema.ts @@ -23,9 +23,25 @@ export const getSchemaSpecs = ( content: `${YfmTableNode.Body}`, isolating: true, definingAsContext: true, - parseDOM: [{tag: 'table', priority: 200}], - toDOM() { - return ['table', 0]; + attrs: { + [YfmTableAttr.HeaderRows]: {default: 0}, + }, + parseDOM: [ + { + tag: 'table', + priority: 200, + getAttrs(dom) { + const attr = dom.getAttribute(YfmTableAttr.HeaderRows); + const fromDataAttr = attr ? Math.max(0, parseInt(attr, 10) || 0) : 0; + const theadRows = dom.querySelectorAll('thead > tr').length; + return {[YfmTableAttr.HeaderRows]: fromDataAttr || theadRows}; + }, + }, + ], + toDOM(node) { + const headerRows = node.attrs[YfmTableAttr.HeaderRows]; + const attrs = headerRows ? node.attrs : {}; + return ['table', attrs, 0]; }, selectable: true, allowSelection: true, diff --git a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/serializer.ts b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/serializer.ts index 9d2bb0e7b..b95f4a884 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/serializer.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/YfmTableSpecs/serializer.ts @@ -9,6 +9,13 @@ export const serializerTokens: Record = { state.ensureNewLine(); state.write('#|'); state.ensureNewLine(); + + const headerRows = Number(node.attrs[YfmTableAttr.HeaderRows]) || 0; + if (headerRows > 0) { + state.write(`|:{header-rows="${headerRows}"}`); + state.ensureNewLine(); + } + state.renderContent(node); state.write('|#'); state.ensureNewLine(); diff --git a/packages/editor/src/extensions/yfm/YfmTable/index.ts b/packages/editor/src/extensions/yfm/YfmTable/index.ts index 7d3051935..6a35b1ea2 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/index.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/index.ts @@ -31,6 +31,14 @@ export type YfmTableOptions = YfmTableSpecsOptions & { * @default true */ dnd?: boolean; + /** + * Enables header rows functionality in table (toggle row as header, visual decoration). + * The `controls` property must also be `true`. + * + * Available with @diplodoc/transform v4.75.0 or higher. + * @default false + */ + headerRows?: boolean; }; export const YfmTable: ExtensionWithOptions = (builder, options) => { @@ -47,7 +55,12 @@ export const YfmTable: ExtensionWithOptions = (builder, options builder.addPlugin(yfmTableTransformPastedPlugin); if (options.controls !== false) { - builder.addPlugin(yfmTableControlsPlugins({dndEnabled: options.dnd !== false})); + builder.addPlugin( + yfmTableControlsPlugins({ + dndEnabled: options.dnd !== false, + headerRowsEnabled: options.headerRows === true, + }), + ); } }; diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/insert-empty-row.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/insert-empty-row.ts index beba3bac6..851abbd8d 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/insert-empty-row.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/insert-empty-row.ts @@ -4,6 +4,7 @@ import {isEqual, range, uniqWith} from 'src/lodash'; import {type RealCellPos, type TableCellRealDesc, TableDesc} from 'src/table-utils/table-desc'; import {yfmTableCellType, yfmTableRowType} from '../../../YfmTableSpecs'; +import {YfmTableAttr} from '../../../YfmTableSpecs/const'; export type InsertEmptyRowParams = { tablePos: number; @@ -48,6 +49,13 @@ export const insertEmptyRow = (params: InsertEmptyRowParams): Command => { } tr.insert(posToInsert, createSimpleRow(state.schema, newCellsCount)); tr.setSelection(TextSelection.near(tr.doc.resolve(posToInsert), 1)); + + // If the new row is inserted inside the header-rows block, shrink the block + // so the new row and everything below it stop being header rows. + if (tableDesc.base.isHeaderRow(rowIdx)) { + tr.setNodeAttribute(params.tablePos, YfmTableAttr.HeaderRows, rowIdx); + } + dispatch(tr.scrollIntoView()); } diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/remove-row-range.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/remove-row-range.ts index 7e3b32be3..dbbc998f5 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/remove-row-range.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/remove-row-range.ts @@ -8,6 +8,7 @@ import { type VirtualCellPos, } from 'src/table-utils/table-desc'; +import {YfmTableAttr} from '../../../YfmTableSpecs/const'; import {yfmTableCellType} from '../../../YfmTableSpecs/utils'; export type RemoveRowRangeParams = { @@ -76,6 +77,22 @@ export const removeRowRange = (params: RemoveRowRangeParams): Command => { updateRowspan(tr, tableDesc, diffRowspan); + // Decrease header-rows count by the number of header rows removed by this range. + const prevHeaderRows = tableDesc.base.headerRows; + if (prevHeaderRows > 0) { + const removedHeaderRows = Math.max( + 0, + Math.min(range.endIdx, prevHeaderRows - 1) - range.startIdx + 1, + ); + if (removedHeaderRows > 0) { + tr.setNodeAttribute( + params.tablePos, + YfmTableAttr.HeaderRows, + prevHeaderRows - removedHeaderRows, + ); + } + } + dispatch(tr); } diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.test.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.test.ts new file mode 100644 index 000000000..fa608dcd5 --- /dev/null +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.test.ts @@ -0,0 +1,120 @@ +import {EditorState} from 'prosemirror-state'; +import {builders} from 'prosemirror-test-builder'; + +import {ExtensionsManager} from 'src/core'; +import {BaseNode, BaseSchemaSpecs} from 'src/extensions/base/specs'; +import {TableDesc} from 'src/table-utils/table-desc'; + +import {YfmTableNode, YfmTableSpecs} from '../../../YfmTableSpecs'; +import {YfmTableAttr} from '../../../const'; + +import {canMakeRowHeader, toggleHeaderRows} from './toggle-header-rows'; + +const {schema} = new ExtensionsManager({ + extensions: (builder) => builder.use(BaseSchemaSpecs, {}).use(YfmTableSpecs, {}), +}).build(); + +const {doc, p, table, tbody, tr, td} = builders<'doc' | 'p' | 'table' | 'tbody' | 'tr' | 'td'>( + schema, + { + doc: {nodeType: BaseNode.Doc}, + p: {nodeType: BaseNode.Paragraph}, + table: {nodeType: YfmTableNode.Table}, + tbody: {nodeType: YfmTableNode.Body}, + tr: {nodeType: YfmTableNode.Row}, + td: {nodeType: YfmTableNode.Cell}, + }, +); + +describe('toggleHeaderRows command', () => { + it('should set header-rows to 1', () => { + const editorState = EditorState.create({ + doc: doc(table(tbody(tr(td(p('A')), td(p('B'))), tr(td(p('C')), td(p('D')))))), + schema, + }); + + let dispatched: any = null; + const ok = toggleHeaderRows({tablePos: 0, value: 1})(editorState, (tr) => { + dispatched = tr; + }); + expect(ok).toBe(true); + expect(dispatched.doc.nodeAt(0)?.attrs[YfmTableAttr.HeaderRows]).toBe(1); + }); + + it('should clamp value to table row count', () => { + const editorState = EditorState.create({ + doc: doc(table(tbody(tr(td(p('A'))), tr(td(p('B')))))), + schema, + }); + + let dispatched: any = null; + toggleHeaderRows({tablePos: 0, value: 999})(editorState, (tr) => { + dispatched = tr; + }); + expect(dispatched.doc.nodeAt(0)?.attrs[YfmTableAttr.HeaderRows]).toBe(2); + }); + + it('should set header-rows to 0 (unset)', () => { + const editorState = EditorState.create({ + doc: doc(table({[YfmTableAttr.HeaderRows]: 1}, tbody(tr(td(p('A'))), tr(td(p('B')))))), + schema, + }); + + let dispatched: any = null; + toggleHeaderRows({tablePos: 0, value: 0})(editorState, (tr) => { + dispatched = tr; + }); + expect(dispatched.doc.nodeAt(0)?.attrs[YfmTableAttr.HeaderRows]).toBe(0); + }); + + it('should return false when value does not change', () => { + const editorState = EditorState.create({ + doc: doc(table({[YfmTableAttr.HeaderRows]: 1}, tbody(tr(td(p('A'))), tr(td(p('B')))))), + schema, + }); + + const result = toggleHeaderRows({tablePos: 0, value: 1})(editorState, () => {}); + expect(result).toBe(false); + }); +}); + +describe('canMakeRowHeader helper', () => { + it('should allow making row 0 header when headerRows=0', () => { + const tableNode = table(tbody(tr(td(p('A'))), tr(td(p('B'))))); + const desc = TableDesc.create(tableNode)!; + expect(canMakeRowHeader(desc, 0)).toBe(true); + }); + + it('should NOT allow making row 0 header when already headerRows=1', () => { + const tableNode = table( + {[YfmTableAttr.HeaderRows]: 1}, + tbody(tr(td(p('A'))), tr(td(p('B')))), + ); + const desc = TableDesc.create(tableNode)!; + expect(canMakeRowHeader(desc, 0)).toBe(false); + }); + + it('should NOT allow making row 1 header when headerRows=0 and no rowspan from row 0', () => { + const tableNode = table(tbody(tr(td(p('A'))), tr(td(p('B'))))); + const desc = TableDesc.create(tableNode)!; + expect(canMakeRowHeader(desc, 1)).toBe(false); + }); + + it('should allow making row 1 header when row 0 has rowspan covering row 1 (headerRows=1)', () => { + const tableNode = table( + {[YfmTableAttr.HeaderRows]: 1}, + tbody(tr(td({rowspan: '2'}, p('A')), td(p('B'))), tr(td(p('C')))), + ); + const desc = TableDesc.create(tableNode)!; + expect(canMakeRowHeader(desc, 1)).toBe(true); + }); + + it('should allow making row 2 header when row 0 has rowspan=3 covering rows 1 and 2 (headerRows=2)', () => { + const tableNode = table( + {[YfmTableAttr.HeaderRows]: 2}, + tbody(tr(td({rowspan: '3'}, p('A')), td(p('B'))), tr(td(p('C'))), tr(td(p('D')))), + ); + const desc = TableDesc.create(tableNode)!; + expect(canMakeRowHeader(desc, 2)).toBe(true); + }); +}); diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.ts new file mode 100644 index 000000000..9cca349a1 --- /dev/null +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/commands/toggle-header-rows.ts @@ -0,0 +1,41 @@ +import type {Command} from '#pm/state'; +import {TableDesc} from 'src/table-utils/table-desc'; + +import {YfmTableAttr} from '../../../YfmTableSpecs/const'; + +export type ToggleHeaderRowsParams = { + tablePos: number; + value: number; +}; + +export const toggleHeaderRows = + (params: ToggleHeaderRowsParams): Command => + (state, dispatch) => { + const table = state.doc.nodeAt(params.tablePos); + const tableDesc = table && TableDesc.create(table); + if (!tableDesc) return false; + const next = Math.max(0, Math.min(params.value, tableDesc.rows)); + if (next === tableDesc.headerRows) return false; + if (dispatch) { + dispatch(state.tr.setNodeAttribute(params.tablePos, YfmTableAttr.HeaderRows, next)); + } + return true; + }; + +/** + * Returns true if the row at `rowIdx` can be made a header row. + * Row 0 is always eligible (to set headerRows from 0 to 1). + * A subsequent row is eligible only if it's "visually glued" to the current header + * block — i.e. it contains a virtual cell produced by a real cell that starts within + * the existing header rows (rowspan crosses the header/body boundary). + */ +export function canMakeRowHeader(tableDesc: TableDesc, rowIdx: number): boolean { + const {headerRows} = tableDesc; + if (rowIdx === 0) return headerRows < 1; + if (rowIdx !== headerRows) return false; + const row = tableDesc.rowsDesc[rowIdx]; + if (!row) return false; + return row.cells.some( + (c) => c.type === 'virtual' && c.rowspan !== undefined && c.rowspan[0] < headerRows, + ); +} diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx index b549f4c94..e0cbf742b 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx @@ -7,10 +7,11 @@ import { ArrowRight, ArrowUp, BroomMotion as ClearCells, + LayoutHeader as HeaderRow, TrashBin, Xmark, } from '@gravity-ui/icons'; -import {Icon} from '@gravity-ui/uikit'; +import {type DropdownMenuItem, Flex, Icon, Switch} from '@gravity-ui/uikit'; import {i18n} from 'src/i18n/yfm-table'; @@ -31,6 +32,10 @@ export type FloatingMenuControlProps = { onInsertAfterClick: () => void; onRemoveRangeClick: () => void; onRemoveTableClick: () => void; + canMakeRowHeader: boolean; + canUnsetRowHeader: boolean; + onMakeRowHeader: () => void; + onUnsetRowHeader: () => void; }; export const FloatingMenuControl: React.FC = @@ -46,58 +51,89 @@ export const FloatingMenuControl: React.FC = onInsertAfterClick, onRemoveRangeClick, onRemoveTableClick, + canMakeRowHeader, + canUnsetRowHeader, + onMakeRowHeader, + onUnsetRowHeader, }) { - const dropdownItems = useMemo( - () => + const dropdownItems = useMemo(() => { + const headerItems: DropdownMenuItem[] = []; + { + const isRowHeader = Boolean(canUnsetRowHeader); + const hiddenRowHeaderOption = !canMakeRowHeader && !canUnsetRowHeader; + if (!hiddenRowHeaderOption) { + headerItems.push({ + text: ( + + {i18n(`row.header${multiple ? '.multiple' : ''}`)} + + + ), + iconStart: , + qa: 'g-md-yfm-table-row-header-toggle', + action: isRowHeader ? onUnsetRowHeader : onMakeRowHeader, + hidden: hiddenRowHeaderOption, + }); + } + } + + return [ + ...headerItems, [ - [ - { - text: i18n(`${type}.add.before`), - qa: `g-md-yfm-table-action-add-${type}-before`, - action: onInsertBeforeClick, - iconStart: , - }, - { - text: i18n(`${type}.add.after`), - qa: `g-md-yfm-table-action-add-${type}-after`, - action: onInsertAfterClick, - iconStart: , - }, - ], - [ - { - text: i18n('cells.clear'), - qa: `g-md-yfm-table-${type}-clear-cells`, - action: onClearCellsClick, - iconStart: , - }, - ], - [ - { - text: i18n(`${type}.remove${multiple ? '.multiple' : ''}`), - qa: `g-md-yfm-table-action-remove-${type}`, - action: onRemoveRangeClick, - iconStart: , - }, - { - theme: 'danger', - text: i18n('table.remove'), - qa: 'g-md-yfm-table-action-remove-table', - action: onRemoveTableClick, - iconStart: , - }, - ], - ] satisfies FloatingMenuProps['dropdownItems'], - [ - type, - multiple, - onClearCellsClick, - onInsertAfterClick, - onInsertBeforeClick, - onRemoveRangeClick, - onRemoveTableClick, - ], - ); + { + text: i18n(`${type}.add.before`), + qa: `g-md-yfm-table-action-add-${type}-before`, + action: onInsertBeforeClick, + iconStart: , + }, + { + text: i18n(`${type}.add.after`), + qa: `g-md-yfm-table-action-add-${type}-after`, + action: onInsertAfterClick, + iconStart: , + }, + ], + [ + { + text: i18n('cells.clear'), + qa: `g-md-yfm-table-${type}-clear-cells`, + action: onClearCellsClick, + iconStart: , + }, + ], + [ + { + text: i18n(`${type}.remove${multiple ? '.multiple' : ''}`), + qa: `g-md-yfm-table-action-remove-${type}`, + action: onRemoveRangeClick, + iconStart: , + }, + { + theme: 'danger', + text: i18n('table.remove'), + qa: 'g-md-yfm-table-action-remove-table', + action: onRemoveTableClick, + iconStart: , + }, + ], + ] satisfies FloatingMenuProps['dropdownItems']; + }, [ + type, + multiple, + canMakeRowHeader, + canUnsetRowHeader, + onMakeRowHeader, + onUnsetRowHeader, + onClearCellsClick, + onInsertAfterClick, + onInsertBeforeClick, + onRemoveRangeClick, + onRemoveTableClick, + ]); const anchor = useMemo( () => getVirtualAnchor(type, tableElement, cellElement), diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.scss b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.scss index 86a546da9..3f90f56ef 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.scss +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.scss @@ -26,8 +26,11 @@ border-color: var(--g-color-line-brand); box-shadow: 0 8px 20px 1px var(--g-color-sfx-shadow); - & > tbody > tr > td { - border-color: var(--g-color-line-brand); + & > tbody > tr { + & > th, + & > td { + border-color: var(--g-color-line-brand); + } } } } @@ -42,6 +45,7 @@ } .yfm.ProseMirror table { + th, td { $selectedCell: 'g-md-yfm-table-selected-cell'; diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.ts index 81106408e..b41805309 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.ts @@ -15,6 +15,7 @@ import { } from 'src/table-utils/table-desc'; import {YfmTableNode} from '../../../YfmTableSpecs'; +import {YfmTableAttr} from '../../../YfmTableSpecs/const'; import {clearAllSelections, selectDraggedColumn, selectDraggedRow} from '../plugins/dnd-plugin'; import {hideHoverDecos} from '../plugins/focus-plugin-key'; import {getSelectedCellsForColumns, getSelectedCellsForRows} from '../utils'; @@ -201,6 +202,7 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler { canDrag(): boolean { const res = this._getTableDescAndCellInfo(); if (!res) return false; + if (res.tableDesc.base.isHeaderRow(res.cellInfo.row)) return false; const rowRange = res.tableDesc.base.getRowRangeByRowIdx(res.cellInfo.row); return rowRange.safeTopBoundary && rowRange.safeBottomBoundary; } @@ -210,6 +212,8 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler { if (!info) return; const {tableDesc, cellInfo} = info; + if (tableDesc.base.isHeaderRow(cellInfo.row)) return; + const rowRanges = tableDesc.base.getRowRanges(); const currRowRange = tableDesc.base.getRowRangeByRowIdx(cellInfo.row); if (!currRowRange.safeTopBoundary || !currRowRange.safeBottomBoundary) return; @@ -379,7 +383,33 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler { return; } + const insertIdx = ((): number => { + const total = info.tableDesc.base.rows; + for (let i = 0; i < total; i++) { + const {from, to} = info.tableDesc.getPosForRow(i); + if (point === from) return i; + if (point === to) return i + 1; + } + return -1; + })(); + + const tablePos = info.tableDesc.pos; + const prevHeaderRows = info.tableDesc.base.headerRows; + const nextHeaderRows = ((): number => { + if (prevHeaderRows <= 0 || insertIdx < 0) return prevHeaderRows; + const from = draggedRange.startIdx; + const to = draggedRange.endIdx + 1; + // dragged downwards + if (insertIdx > to && from < prevHeaderRows) return from; + // dragged upwards into (or above) the header block + if (insertIdx < from && insertIdx < prevHeaderRows) return insertIdx; + return prevHeaderRows; + })(); + const {tr} = this._editorView.state; + if (nextHeaderRows !== prevHeaderRows) { + tr.setNodeAttribute(tablePos, YfmTableAttr.HeaderRows, nextHeaderRows); + } const fragment = tr.doc.slice(rangeFrom, rangeTo, false).content; if (point > rangeFrom) { tr.insert(point, fragment); diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/index.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/index.ts index b9738f3f8..e43a688b8 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/index.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/index.ts @@ -2,8 +2,16 @@ import type {ExtensionDeps} from '#core'; import {yfmTableDndPlugin} from './plugins/dnd-plugin'; import {yfmTableFocusPlugin} from './plugins/focus-plugin'; +import {yfmTableHeaderRowsPlugin} from './plugins/header-rows-plugin'; -export const yfmTableControlsPlugins = (opts: {dndEnabled: boolean}) => (_deps: ExtensionDeps) => [ - yfmTableFocusPlugin(opts), - yfmTableDndPlugin(), -]; +export type YfmTableControlsPluginsOpts = { + dndEnabled: boolean; + headerRowsEnabled: boolean; +}; + +export const yfmTableControlsPlugins = + (opts: YfmTableControlsPluginsOpts) => (_deps: ExtensionDeps) => [ + yfmTableFocusPlugin(opts), + yfmTableDndPlugin(), + ...(opts.headerRowsEnabled ? [yfmTableHeaderRowsPlugin()] : []), + ]; diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx index c8f97fa25..075993c37 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx @@ -21,6 +21,7 @@ import {insertEmptyColumn} from '../commands/insert-empty-column'; import {insertEmptyRow} from '../commands/insert-empty-row'; import {removeColumnRange} from '../commands/remove-column-range'; import {removeRowRange} from '../commands/remove-row-range'; +import {canMakeRowHeader, toggleHeaderRows} from '../commands/toggle-header-rows'; import {FloatingMenuControl} from '../components/FloatingMenuControl'; import { YfmTableDecorationType as DecoType, @@ -44,6 +45,7 @@ const dropCursorParams: DropCursorParams = { type GetPos = () => number | undefined; type YfmTableCellViewOptions = { dndEnabled: boolean; + headerRowsEnabled: boolean; }; export const yfmTableCellView = @@ -62,7 +64,9 @@ class YfmTableCellView implements NodeView { private readonly _renderer; private readonly _logger: Logger2.ILogger; private readonly _dndEnabled: boolean; + private readonly _headerRowsEnabled: boolean; + private _isHeader: boolean; private _decoRowUniqKey: number | null = null; private _decoColumnUniqKey: number | null = null; private _cellInfo: null | { @@ -73,6 +77,8 @@ class YfmTableCellView implements NodeView { columnRange: Readonly; showRowControl: boolean; showColumnControl: boolean; + canMakeRowHeader: boolean; + canUnsetRowHeader: boolean; }; private _dndHandler: YfmTableDnDHandler | null; @@ -91,8 +97,11 @@ class YfmTableCellView implements NodeView { node: 'yfm-table', }); this._dndEnabled = opts.dndEnabled; + this._headerRowsEnabled = opts.headerRowsEnabled; - this.dom = document.createElement('td'); + this._isHeader = this._computeIsHeader(node); + this.dom = document.createElement(this._isHeader ? 'th' : 'td'); + if (this._isHeader) this.dom.setAttribute('scope', 'col'); this._updateDom(); this.contentDOM = this.dom; @@ -124,6 +133,10 @@ class YfmTableCellView implements NodeView { onInsertAfterClick={this._onRowInsertAfterClick} onRemoveRangeClick={this._onRowRemoveRangeClick} onRemoveTableClick={this._onRemoveTableClick} + canMakeRowHeader={this._cellInfo.canMakeRowHeader} + canUnsetRowHeader={this._cellInfo.canUnsetRowHeader} + onMakeRowHeader={this._onRowMakeHeaderClick} + onUnsetRowHeader={this._onRowUnsetHeaderClick} /> )} {showColumnControl && ( @@ -139,6 +152,10 @@ class YfmTableCellView implements NodeView { onInsertAfterClick={this._onColumnInsertAfterClick} onRemoveRangeClick={this._onColumnRemoveRangeClick} onRemoveTableClick={this._onRemoveTableClick} + canMakeRowHeader={false} + canUnsetRowHeader={false} + onMakeRowHeader={this._onColumnMakeHeaderClick} + onUnsetRowHeader={this._onColumnUnsetHeaderClick} /> )} @@ -150,6 +167,8 @@ class YfmTableCellView implements NodeView { } update(node: Node, decorations: readonly Decoration[]): boolean { + if (this._computeIsHeader(node) !== this._isHeader) return false; + { const prev = this._node; this._node = node; @@ -159,16 +178,18 @@ class YfmTableCellView implements NodeView { const cellInfo = this._getCellInfo(); if (cellInfo && (cellInfo.cell.row === 0 || cellInfo.cell.column === 0)) { - const info = (this._cellInfo = { + const desc = cellInfo.tableDesc.base; + const info: YfmTableCellView['_cellInfo'] = (this._cellInfo = { tablePos: cellInfo.table.pos, rowIndex: cellInfo.cell.row, columnIndex: cellInfo.cell.column, showRowControl: false as boolean, showColumnControl: false as boolean, - rowRange: cellInfo.tableDesc.base.getRowRangeByRowIdx(cellInfo.cell.row), - columnRange: cellInfo.tableDesc.base.getColumnRangeByColumnIdx( - cellInfo.cell.column, - ), + rowRange: desc.getRowRangeByRowIdx(cellInfo.cell.row), + columnRange: desc.getColumnRangeByColumnIdx(cellInfo.cell.column), + canMakeRowHeader: + this._headerRowsEnabled && canMakeRowHeader(desc, cellInfo.cell.row), + canUnsetRowHeader: desc.isHeaderRow(cellInfo.cell.row), }); for (const deco of decorations) { @@ -404,6 +425,41 @@ class YfmTableCellView implements NodeView { this._view.focus(); }; + private _toggleHeaderRows( + event: 'row-set-header' | 'row-unset-header', + source: 'row-menu' | 'column-menu', + getValue: (rowRange: Readonly) => number, + ) { + this._logger.event({event, source}); + + const info = this._getCellInfo(); + if (info) { + const rowRange = info.tableDesc.base.getRowRangeByRowIdx(info.cell.row); + toggleHeaderRows({ + tablePos: info.table.pos, + value: getValue(rowRange), + })(this._view.state, this._view.dispatch); + } + + this._view.focus(); + } + + private _onRowMakeHeaderClick = () => { + this._toggleHeaderRows('row-set-header', 'row-menu', (range) => range.endIdx + 1); + }; + + private _onRowUnsetHeaderClick = () => { + this._toggleHeaderRows('row-unset-header', 'row-menu', (range) => range.startIdx); + }; + + private _onColumnMakeHeaderClick = () => { + this._toggleHeaderRows('row-set-header', 'column-menu', (range) => range.endIdx + 1); + }; + + private _onColumnUnsetHeaderClick = () => { + this._toggleHeaderRows('row-unset-header', 'column-menu', (range) => range.startIdx); + }; + private _onRemoveTableClick = () => { this._logger.event({event: 'table-remove'}); @@ -418,10 +474,17 @@ class YfmTableCellView implements NodeView { this._view.focus(); }; - private _getCellInfo() { + private _computeIsHeader(node: Node): boolean { + if (!this._headerRowsEnabled) return false; + const info = this._getCellInfo(node); + if (!info) return false; + return info.tableDesc.base.isHeaderRow(info.cell.row); + } + + private _getCellInfo(node: Node = this._node) { const table = this._getParentTable(); const tableDesc = table ? TableDesc.create(table.node)?.bind(table.pos) : undefined; - const cellInfo = tableDesc?.base.getCellInfo(this._node); + const cellInfo = tableDesc?.base.getCellInfo(node); return cellInfo ? {pos: this._getPos()!, table: table!, tableDesc: tableDesc!, cell: cellInfo} : undefined; diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/focus-plugin.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/focus-plugin.ts index c921f6774..faec0d5bb 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/focus-plugin.ts +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/focus-plugin.ts @@ -31,7 +31,7 @@ function shouldUpdateState(prev: HoverState, curr: HoverState): boolean { return true; } -export const yfmTableFocusPlugin = (opts: {dndEnabled: boolean}) => { +export const yfmTableFocusPlugin = (opts: {dndEnabled: boolean; headerRowsEnabled: boolean}) => { return new Plugin({ key: pluginKey, state: { @@ -109,12 +109,12 @@ export const yfmTableFocusPlugin = (opts: {dndEnabled: boolean}) => { if ( e.target instanceof Element && - e.target.closest('td') && + e.target.closest('td,th') && e.target.closest(`.${FOCUSED_CLASSNAME}`) ) { const $pos = (() => { - const td = e.target.closest('td'); + const td = e.target.closest('td,th'); const domPos = td && view.posAtDOM(td, 0); return domPos === null ? null : view.state.doc.resolve(domPos); })() ?? diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/header-rows-plugin.ts b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/header-rows-plugin.ts new file mode 100644 index 000000000..46e1a4c0b --- /dev/null +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/header-rows-plugin.ts @@ -0,0 +1,45 @@ +import type {Node} from '#pm/model'; +import {Plugin} from '#pm/state'; +import {Decoration, DecorationSet} from '#pm/view'; +import {isTableNode} from 'src/table-utils'; +import {TableDesc} from 'src/table-utils/table-desc'; +import {isNonStructuralTr} from 'src/utils/transaction'; + +function buildHeaderDecorations(doc: Node): Decoration[] { + const out: Decoration[] = []; + doc.descendants((node, pos) => { + if (node.isTextblock) return false; + + if (isTableNode(node)) { + const tableDesc = TableDesc.create(node); + if (tableDesc?.headerRows) { + const bound = tableDesc.bind(pos); + for (let i = 0; i < tableDesc.headerRows; i++) { + const {from, to} = bound.getPosForRow(i); + out.push(Decoration.node(from, to, {'data-header': 'true'})); + } + } + } + + return true; + }); + return out; +} + +export const yfmTableHeaderRowsPlugin = () => + new Plugin({ + state: { + init(_config, state) { + return DecorationSet.create(state.doc, buildHeaderDecorations(state.doc)); + }, + apply(tr, set) { + if (!tr.docChanged || isNonStructuralTr(tr)) return set.map(tr.mapping, tr.doc); + return DecorationSet.create(tr.doc, buildHeaderDecorations(tr.doc)); + }, + }, + props: { + decorations(state) { + return this.getState(state); + }, + }, + }); diff --git a/packages/editor/src/i18n/yfm-table/en.json b/packages/editor/src/i18n/yfm-table/en.json index 74457d6d4..1276cd2e5 100644 --- a/packages/editor/src/i18n/yfm-table/en.json +++ b/packages/editor/src/i18n/yfm-table/en.json @@ -3,6 +3,8 @@ "column.add.after": "Add column after", "column.remove": "Remove column", "column.remove.multiple": "Remove columns", + "row.header": "Header row", + "row.header.multiple": "Header rows", "row.add.before": "Add row before", "row.add.after": "Add row after", "row.remove": "Remove row", diff --git a/packages/editor/src/i18n/yfm-table/ru.json b/packages/editor/src/i18n/yfm-table/ru.json index 48c60b680..3b456d0a0 100644 --- a/packages/editor/src/i18n/yfm-table/ru.json +++ b/packages/editor/src/i18n/yfm-table/ru.json @@ -3,6 +3,8 @@ "column.add.after": "Добавить столбец после", "column.remove": "Удалить столбец", "column.remove.multiple": "Удалить столбцы", + "row.header": "Строка-заголовок", + "row.header.multiple": "Строки-заголовки", "row.add.before": "Добавить строку до", "row.add.after": "Добавить строку после", "row.remove": "Удалить строку", diff --git a/packages/editor/src/table-utils/table-desc.ts b/packages/editor/src/table-utils/table-desc.ts index 9c178edfe..56f3c2f35 100644 --- a/packages/editor/src/table-utils/table-desc.ts +++ b/packages/editor/src/table-utils/table-desc.ts @@ -132,7 +132,10 @@ export class TableDesc { } // <--- validation - const desc = new this(rows.length, rows[0].cells.length, rows, baseOffset); + const rawHeaderRows = Number(table.attrs['data-header-rows']) || 0; + const headerRows = Math.max(0, Math.min(rawHeaderRows, rows.length)); + + const desc = new this(rows.length, rows[0].cells.length, rows, baseOffset, headerRows); this.__cache.set(table, desc); return desc; } @@ -146,6 +149,7 @@ export class TableDesc { readonly cols: number, readonly rowsDesc: readonly TableRowDesc[], readonly baseOffset: number, + readonly headerRows: number, /* eslint-enable @typescript-eslint/parameter-properties */ ) {} @@ -153,6 +157,10 @@ export class TableDesc { return new TableDescBinded(pos, this); } + isHeaderRow(rowIdx: number): boolean { + return this.headerRows > 0 && rowIdx >= 0 && rowIdx < this.headerRows; + } + rowHasVirtualCells(rowIndex: number): boolean { return this.rowsDesc[rowIndex]?.cells.some((cell) => cell.type === 'virtual'); } diff --git a/packages/editor/src/utils/transaction.ts b/packages/editor/src/utils/transaction.ts index 200655f27..05f4620a3 100644 --- a/packages/editor/src/utils/transaction.ts +++ b/packages/editor/src/utils/transaction.ts @@ -1,6 +1,56 @@ import type {Node} from '#pm/model'; import type {Transaction} from '#pm/state'; -import {AttrStep} from '#pm/transform'; +import { + AddMarkStep, + AddNodeMarkStep, + AttrStep, + DocAttrStep, + RemoveMarkStep, + RemoveNodeMarkStep, + ReplaceStep, +} from '#pm/transform'; + +/** + * Returns true if the transaction is a single text-insertion step + * (e.g. typing one character). + */ +export function isTextInsertTr(tr: Transaction): boolean { + if (tr.steps.length !== 1) return false; + const [step] = tr.steps; + return ( + step instanceof ReplaceStep && + step.from === step.to && + step.slice.content.childCount === 1 && + step.slice.content.child(0).type.name === 'text' + ); +} + +/** + * Returns true if the transaction is a single-character deletion + * (deletion of exactly one position, no replacement content). + */ +export function isSingleCharDeleteTr(tr: Transaction): boolean { + if (tr.steps.length !== 1) return false; + const [step] = tr.steps; + return step instanceof ReplaceStep && step.to - step.from === 1 && step.slice.size === 0; +} + +const safeSteps = [AddMarkStep, AddNodeMarkStep, DocAttrStep, RemoveMarkStep, RemoveNodeMarkStep]; + +/** + * Returns true if the transaction does not change the structural shape + * of the document — i.e. the relative order/nesting of blocks and node + * attrs (outside of marks/doc-attrs) stay the same. Absolute positions + * may still shift due to text being inserted or removed within textblocks. + * Such transactions only insert/delete text within a textblock or toggle + * marks/doc-attrs. + */ +export function isNonStructuralTr(tr: Transaction): boolean { + if (isTextInsertTr(tr) || isSingleCharDeleteTr(tr)) return true; + if (tr.steps.every((step) => safeSteps.some((SafeStep) => step instanceof SafeStep))) + return true; + return false; +} /** @internal */ export function getChangedRanges(tr: Transaction): {from: number; to: number}[] { From 68315f0e0e0528d50640bff4d63c9c95789dbb38 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Thu, 14 May 2026 00:53:49 +0300 Subject: [PATCH 05/12] test(demo): add visual tests for header rows in yfm-table --- demo/src/components/Playground.tsx | 6 + demo/tests/playwright/core/editor.ts | 6 +- .../playground/YfmTable.visual.test.tsx | 338 ++++++++++++++++++ 3 files changed, 348 insertions(+), 2 deletions(-) diff --git a/demo/src/components/Playground.tsx b/demo/src/components/Playground.tsx index ffb1a20bb..9fec366ed 100644 --- a/demo/src/components/Playground.tsx +++ b/demo/src/components/Playground.tsx @@ -16,6 +16,7 @@ import { type ToolbarsPreset, type UseMarkdownEditorProps, type WysiwygPlaceholderOptions, + type YfmMods, logger, useMarkdownEditor, wysiwygToolbarConfigs, @@ -92,6 +93,7 @@ export type PlaygroundProps = { markupParseHtmlOnPaste?: boolean; style?: React.CSSProperties; storyAdditionalControls?: Record; + yfmMods?: YfmMods; } & Pick & Pick< MarkdownEditorViewProps, @@ -149,6 +151,7 @@ export const Playground = memo((props) => { markupParseHtmlOnPaste, style, storyAdditionalControls, + yfmMods, } = props; const [editorMode, setEditorMode] = useState(initialEditor ?? 'wysiwyg'); const [mdRaw, setMdRaw] = useState(initial || ''); @@ -246,6 +249,9 @@ export const Playground = memo((props) => { if (wysiwygConfig?.extensions) builder.use(wysiwygConfig.extensions); }, extensionOptions: { + yfmConfigs: { + mods: yfmMods, + }, checkbox: {multiline: true}, commandMenu: {actions: wysiwygCommandMenuConfig ?? wCommandMenuConfig}, imgSize: { diff --git a/demo/tests/playwright/core/editor.ts b/demo/tests/playwright/core/editor.ts index b68ab59b7..ce1fad677 100644 --- a/demo/tests/playwright/core/editor.ts +++ b/demo/tests/playwright/core/editor.ts @@ -168,7 +168,7 @@ class YfmTable { 'remove-column': page.getByTestId('g-md-yfm-table-action-remove-column'), 'remove-row': page.getByTestId('g-md-yfm-table-action-remove-row'), 'remove-table': page.getByTestId('g-md-yfm-table-action-remove-table'), - 'header-toggle': page.getByTestId('g-md-yfm-table-action-header-toggle'), + 'header-toggle': page.getByTestId('g-md-yfm-table-row-header-toggle'), }; } @@ -189,7 +189,9 @@ class YfmTable { } async getCells(table?: Locator) { - return (table || (await this.getTable())).first().locator('> tbody > tr > td'); + return (table || (await this.getTable())) + .first() + .locator('> tbody > tr > th, > tbody > tr > td'); } async getRowButtons(_table?: Locator) { diff --git a/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx b/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx index 48a12ecde..227780381 100644 --- a/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx +++ b/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx @@ -1,3 +1,4 @@ +import type {YfmMods} from '@gravity-ui/markdown-editor'; import dd from 'ts-dedent'; import {expect, test} from 'playwright/core'; @@ -507,4 +508,341 @@ test.describe('YfmTable', () => { return texts.map((str) => str.trimEnd()); } }); + + test.describe('header rows @wysiwyg', () => { + const yfmMods: YfmMods = {'no-stripe-table': true}; + + test('should set header on the first row', async ({ + page, + wait, + mount, + editor, + expectScreenshot, + }) => { + const initial = dd` + #| + || one | two || + || three | four || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const firstCell = cellsLocator.first(); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + + await editor.yfmTable.focusFirstCell(tableLocator); + await firstCell.hover(); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'header-toggle'); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + + await editor.focus(); + await page.keyboard.press('Escape'); + await editor.blur(); + + await page.mouse.move(-50, -50); + await wait.timeout(500); + await expectScreenshot(); + }); + + test('should unset header on the first row', async ({ + page, + wait, + mount, + editor, + expectScreenshot, + }) => { + const initial = dd` + #| + |:{header-rows="1"} + || one | two || + || three | four || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const firstCell = cellsLocator.first(); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + + await editor.yfmTable.focusFirstCell(tableLocator); + await firstCell.hover(); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'header-toggle'); + + await expect(rowsLocator.nth(0)).not.toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + + await editor.focus(); + await page.keyboard.press('Escape'); + await editor.blur(); + + await page.mouse.move(-50, -50); + await wait.timeout(500); + await expectScreenshot(); + }); + + test('should set header on the first row via column menu', async ({mount, editor}) => { + const initial = dd` + #| + || one | two || + || three | four || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const firstCell = cellsLocator.first(); + const columnButton = (await editor.yfmTable.getColumnButtons(tableLocator)).first(); + + await editor.yfmTable.focusFirstCell(tableLocator); + await firstCell.hover(); + await columnButton.click(); + await editor.yfmTable.doCellAction('column', 'header-toggle'); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + }); + + test('should make 2nd row a header when rowspan from row 0 covers row 1', async ({ + wait, + mount, + editor, + }) => { + const initial = dd` + #| + |:{header-rows="1"} + || one | two || + || three | ^ || + || five | six || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + + await editor.yfmTable.focusFirstCell(tableLocator); + + // hover the first cell of row 1 (column 0) + await cellsLocator.nth(2).hover(); + await wait.timeout(200); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'header-toggle'); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).not.toHaveAttribute('data-header', 'true'); + }); + + test('should make all rows header when first cell rowspan covers entire table', async ({ + page, + wait, + mount, + editor, + expectScreenshot, + }) => { + const initial = dd` + #| + || one | two || + || ^ | four || + || ^ | six || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const firstCell = cellsLocator.first(); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + + await editor.yfmTable.focusFirstCell(tableLocator); + await firstCell.hover(); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'header-toggle'); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).toHaveAttribute('data-header', 'true'); + + await editor.focus(); + await page.keyboard.press('Escape'); + await editor.blur(); + + await page.mouse.move(-50, -50); + await wait.timeout(500); + await expectScreenshot(); + }); + + test('should unset header for current and all subsequent header rows', async ({ + wait, + mount, + editor, + }) => { + const initial = dd` + #| + |:{header-rows="3"} + || one | two || + || three | four || + || five | six || + || seven | eight || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + const rowMenu = editor.yfmTable.getMenuLocator('row'); + const headerToggle = editor.yfmTable.getCellActionLocator('row', 'header-toggle'); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(3)).not.toHaveAttribute('data-header', 'true'); + + await editor.yfmTable.focusFirstCell(tableLocator); + + // open row menu of row 1 (first cell of row 1 is the 3rd cell overall) + await cellsLocator.nth(2).hover(); + await wait.timeout(200); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'header-toggle'); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).not.toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(3)).not.toHaveAttribute('data-header', 'true'); + + // re-open row menu of row 1 — header toggle should be hidden now + await cellsLocator.nth(2).hover(); + await wait.timeout(200); + await rowButton.click(); + await rowMenu.waitFor({state: 'visible'}); + await expect(headerToggle).toBeHidden(); + }); + + test('should shrink header-rows block when inserting a row inside it', async ({ + wait, + mount, + editor, + }) => { + const initial = dd` + #| + |:{header-rows="3"} + || one | two || + || three | four || + || five | six || + || seven | eight || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(3)).not.toHaveAttribute('data-header', 'true'); + + await editor.yfmTable.focusFirstCell(tableLocator); + + // open row menu of row 1 (first cell of row 1 is the 3rd cell overall) + await cellsLocator.nth(2).hover(); + await wait.timeout(200); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'add-row-before'); + + await expect(rowsLocator).toHaveCount(5); + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).not.toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(3)).not.toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(4)).not.toHaveAttribute('data-header', 'true'); + }); + + test('should decrease header-rows count by the number of removed header rows', async ({ + wait, + mount, + editor, + }) => { + const initial = dd` + #| + |:{header-rows="3"} + || one | two || + || three | four || + || ^ | six || + || seven | eight || + |# + `; + + await mount(); + + const tableLocator = ( + await editor.yfmTable.getTable(editor.locators.contenteditable) + ).first(); + const rowsLocator = await editor.yfmTable.getRows(tableLocator); + const cellsLocator = await editor.yfmTable.getCells(tableLocator); + const rowButton = (await editor.yfmTable.getRowButtons(tableLocator)).first(); + + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(2)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(3)).not.toHaveAttribute('data-header', 'true'); + + await editor.yfmTable.focusFirstCell(tableLocator); + + // Open row menu of row 2 (first cell of row 2 is the 3rd cell overall) + await cellsLocator.nth(2).hover(); + await wait.timeout(200); + await rowButton.click(); + await editor.yfmTable.doCellAction('row', 'remove-row'); + + await expect(rowsLocator).toHaveCount(2); + await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); + await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); + }); + }); }); From e499eece3fda207de3c34e4fb6071477a1645dcc Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Thu, 14 May 2026 19:05:39 +0300 Subject: [PATCH 06/12] test: update screenshots --- ...u-wysiwyg-row-menu-dark-chromium-linux.png | Bin 20337 -> 24934 bytes ...-wysiwyg-row-menu-light-chromium-linux.png | Bin 20136 -> 24591 bytes ...overs-entire-table-dark-chromium-linux.png | Bin 0 -> 32098 bytes ...vers-entire-table-light-chromium-linux.png | Bin 0 -> 30758 bytes ...r-on-the-first-row-dark-chromium-linux.png | Bin 0 -> 29851 bytes ...-on-the-first-row-light-chromium-linux.png | Bin 0 -> 28664 bytes ...r-on-the-first-row-dark-chromium-linux.png | Bin 0 -> 25049 bytes ...-on-the-first-row-light-chromium-linux.png | Bin 0 -> 23960 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-make-all-rows-header-when-first-cell-rowspan-covers-entire-table-dark-chromium-linux.png create mode 100644 demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-make-all-rows-header-when-first-cell-rowspan-covers-entire-table-light-chromium-linux.png create mode 100644 demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-set-header-on-the-first-row-dark-chromium-linux.png create mode 100644 demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-set-header-on-the-first-row-light-chromium-linux.png create mode 100644 demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-unset-header-on-the-first-row-dark-chromium-linux.png create mode 100644 demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-unset-header-on-the-first-row-light-chromium-linux.png diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-cell-menu-wysiwyg-row-menu-dark-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-cell-menu-wysiwyg-row-menu-dark-chromium-linux.png index cae0d4dd04b02199d024dcdad8745351b9875870..37d0594f1b76e614dc3a80b5d406eb4930e77217 100644 GIT binary patch literal 24934 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
-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 diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-cell-menu-wysiwyg-row-menu-light-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-cell-menu-wysiwyg-row-menu-light-chromium-linux.png index bfb8c2fb64db77a8ac2a688f26434fc7827d252d..9ef3582d5c19e306f98e1eef5338ea5661f6a413 100644 GIT binary patch literal 24591 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 literal 20136 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 diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-make-all-rows-header-when-first-cell-rowspan-covers-entire-table-dark-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-make-all-rows-header-when-first-cell-rowspan-covers-entire-table-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9cf6343ae47f470c82294e03e6b01501939ae1 GIT binary patch literal 32098 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 literal 0 HcmV?d00001 diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-make-all-rows-header-when-first-cell-rowspan-covers-entire-table-light-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-make-all-rows-header-when-first-cell-rowspan-covers-entire-table-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb8b84d5c3c79966fb973158246fe2421de1b16 GIT binary patch literal 30758 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 SBj@Exip8#r@_rfc+y4OawFTe+ literal 0 HcmV?d00001 diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-set-header-on-the-first-row-dark-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-set-header-on-the-first-row-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..0504a61eb595cf81b1d21229ab0b4c3c05b52758 GIT binary patch literal 29851 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

k=4<|RxW+G zHF`=YldzOAN%{In1?krgGHM;=LWyi^Ex-b%YjaOeVbofDldiYBqDM1?W@iq zqluc7U!GA2W=YenU0Uy~Jrfvsq9puSs4;c_JMVA$D(ZAs+$t@=;gtaOc?OWCBjM6f zj1(NnI_8RVYyDv&poG!YQ)5w>HZ5(m?Yo(ZoSMzsAVc0eqT}nLE4yZajB@{nr^jEk zGyYQN!o2OW8?UM=$7QAo0#?QGy8Z+3iKCAo{a;&w=>IR<5WfiUG)_VroGst0SS}ZY zipqWbL$g;S-tOL0lRZLjEwYz)C(Q=A^wjpB**(82 zNco4ipaGIFevH0snGJP2G#U-~>0i-kG-KYe!$h=P%L-Q%C1df6ZeKm5<3I6h(9`4q9B}fy4Mig~Ccm>3SvGLwxw$ zaqMbwi`DG?b+$>wkum@23Tc5EXR%Qo+XqG&>bkrRN@p<}}b?6H;EK7+6B?#C}aheVCTjKe1ORqm{I82b_Kk;j(qrE=95$=^YfLQHIdtQm zGp|gs6~oW84eg#XPoC{s@Afbof-zN*Ci1TI3vooD(Gma%Q7^mPH69TK1Yivno!$wv z$#d`DKmGj0yHF<}Z}?Tg4UK^79L0VSUYb2@kDI4sv;3HGU`$6 z$DpZNIZFDYQ4|Ae0JN#feiyeSlAr-^E4d)8*eG*P^#&cwMrM$$v&n9BLOmw~<;g;z z>U|>)pM4MM|3H(O^Xzji7@ghSi;xZ~CP}f+27l5%5;h8CH>UBQ1JQPbYa4=_n%r)K ze9P-_F#?p}7yv5_}1Qu9PBU`x%Yh5VtKw=t zcXl9y(~V-B*V3Nm#r+T8--Yhi-#TTchFv$HbEe(X~xU#cn- z)5A~8?}U=Q>S`Y~Gx-uQpIG4xB<$AMSPmA-Fler@5W2V4M)S=Ti+uiV8RQK@a4(=x zxe^bVV$`l|IY*<@%y&Lq)&I$>4i|L?RSho*#fX%dYl`e6gP8>dn5nCRwIn7$p}SGpq?W1T1nJx?61II}EUgtrskd;5Du1k+uW=jFuy{Z~nv$bL z16yVH7~IU^=@^?N95_nFtr$-b8~O2OX}cn7L1NYhO%CK8u&n8%H@P>2(a@sk zt;=~EvDzbx?1WN+oy38|>Ujp}s-u6ew{UZWdJ9>UOtZ*hs1%7xua=4zE?|g##!wCq z4!;G!OBi1SB2Af8EhK`L%Ai%~LuV?+L}T@$G0G1e^j&PK=7&?fg`gy!cQ{gzs!_3E zxj`vQU*VuRW<&=eA0Mo(6(-prugDrzWS=$QpTGQ`cJ)8a6TgkR|9Z^-ji0biBta1Y z5wun1T<=AFs`7naYZ_KEQm&7?l@gA_Nxy6e+gjFn8rh46{W9Bot)A#Jy&`k z9?R45Tgha{fY(_a+0YKghN6 zynCRnJivK#^l;}2eYj8#0;*oj>`Oh}#Tevi&_qd&yMaduh^$?C?u1}#0QHs85)GKc zLo2pU5L-|7@S#Qu6@FSCSmYx?W*!VLjxT8C6%?qT;-sC(%^-;QzF(FO3q&h&fXMSh zJxG5TFUv(#MU*PlQB=nOU^o#+GNeQ6oI`t_paeHVh%2*oxB${NM(0t{s~c;y;t)`W zVaqH75%>bd9(+R3)F(Mh76Zs$vC)~rFeeK>91cb=jV=eOHRaU&H)n3vIxrWxh*fCB?yu#b`LKpWzfp@90SK7iJYCl}PxP%60nq|z>Laxm}x0W@&dlNF{ z#CDQgr#h6JaZhV6Vg5*G<;ivK)_04f%2TW2Ebl_VK6%oP)HK>+d9D?{F3@);GII#x zkA{n+@R(A|0z-3I4uz;pHuZd6W3nplYtsC_a$5UtXKX~ncPWv=B7hm1^k{tR}ZuzB3~Rla-d+}*BAZ` D)&4@M literal 0 HcmV?d00001 diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-set-header-on-the-first-row-light-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-set-header-on-the-first-row-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d512a43a64a08ac74cf113bd22a2411f03fe5695 GIT binary patch literal 28664 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 Uy$i2rK#iE917K>A{r~^~ literal 0 HcmV?d00001 diff --git a/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-unset-header-on-the-first-row-light-chromium-linux.png b/demo/tests/visual-tests/__snapshots__/YfmTable.visual.test.tsx-snapshots/YfmTable-header-rows-wysiwyg-should-unset-header-on-the-first-row-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..39f250be8d8205b98aba13959b80cbc6a75df4fc GIT binary patch literal 23960 zcmeIaXINF+mMuDsU_#W5C{c8aN>mV#tf-)5K|r#BC{dzhR0MM(Nfr{z5P+3uC$5w`|1VQY$ zc;TE1L97oYh>h0N>+zEkk3A>wpLMn>GEziR1=9dQ93U>9J9GJV=y0o(j-Oih+S=FS z=Igf}&3YLhm(||IlVobD8I@s@8)VuVpnfw*>)l9zda$NZye5w+IVt;1_T%7VU3cTM zcn>Un+;Mzrsk^0ph+k4r(>thh-g&jNyDO(c$M*Xjr%K@l;XWI_kaFC`Wp@!54cx^Q zsz@5b^B}c7LHu?mZUga#T8fz<&eIMO#L>ITRK)3BULpkX=s@i{LV4rA{b+tZCqZ~F zsweB^TX+6p+gA}J&(7wh7;9D=SDlbtu-I{Lr`CjKXqH?^cb5A~4sDcTn8<7rHSsxE zJxOPw&1H1JkPZq~h@Yq3=dc zJ~_$2Z}ejuZ{F1@=aq<}$Mn29S>r|Y`dk+UWYvBN+Su6Cf6z>Io*DE#qGV)f=;Y+I zY2(I|=D)0~-kiyIp0T-g>yzWA`?S}~g9Rj)$G50)Sj2wN zdk14^SXeCHlXb^w#`-j_9J_&6uU{X{Tv=Y`%G}9x>T1J#w!)T{mJ>I=W6`3kqQCm= z^ymw7Ok<5ziYPE|Op%hC9jNIGu`0Ob;J{f9i+-!sm7Iiyubhc`=LY8 zvi=-vt4qoD+nPV8n>9#3Ww0M@$(DM)dE-X;&{GpHWmrBr<*$0suu3csr&ivSe72vz zH@!iR^W8F5kKb`rXQX%squ@!)maMx&S9ogPDJ&rXrUY7bbah!hmM7-gJ=!hnq^`Ly zPZaYO%tuw7y>sV|S^bBJ+1dKp-`Uw|m`)w%;Yq5R9Lt-k81MWlr+p{Iu~0wThTLcz z;s0>7uP+nNUKZZ3^@3!^h(}wR8>=iS`REwKQO1n0xpsV?QDykb@>FGDHg8+ews2?_SGkNxf}({Xh2s>E;ANYl==6rZV8J%2bS@8~J_<@p%7z@`kng_WsF$pFcU z5FsVKLati8xx%GUQIdGB!^r!RrdCY@gPxL?heYlAkK6Q=)Wj;$a~-#6O1nq3Q_G<( zZ~TvKR5VNns+kqEw3>EGE+5Fmx4*J&jk8C_#w6|ftLQk@udwGlslb1?Gn|amO228N zWMX1+<;v@pa7hn$XJ=>AA?5D@i~gJ%;jWXV&6!rDo7}oNY1h7b8=iW8gKyvVrP&dF zhNpbJx%NZqF|u@wV#!an2fuvz(&SM5j9JuS_-LlBtt~Hp#ki7%Br)=E&yj-puE!bi zR~ikBj2wo4T`DkhnH}CjP5sgF>8i|<$Fpb8GAuhE&0@J^&YdgSl8#4l?|OKILC7-H z*VlI7XH0*8zac50bnJdoQW9R%maSV;G{mRU^9+58AJK7cf%t0^KDHnN?><)M_-8|N%U1!DL1Z?Dk|D? z9h2{+g>oq3!HbtAtqK-;8}vQ$aV?jzd=1XyR&8QF79Zr0k^CRFrJ1T0Uz{%E6ckjK zn`U*N@AOrY*s^8I#N_1U%#20NyQk(3CCLYn!z#nY9X`DG_4RG(Z_UkYSw*z2&38Y) zdsrh;>+qh|($aXxv9<*kOZo(j9l_G6vC1(+4S~5dU|?% zSe)akUaecVE)n5T_g<|z!$Q=4@N(0U_sY2AhYuf?{`sY;saZrHklmJQtYoGj9QWH` zec}?*eE#%Lxyj@N&OY@-DJT~^?^guV(oLNCpG5o|0?-uvfg}(g!e6k7q z63^%KYhO2KSEm@t3ClWme}5WqcB8W9aC@O7H@AXd&9>F^--?TsLQmalFK}xLA3+%7 zAFVm|xS-}!1_7>Zl%%NdzCf-^&`?!X<<-l(^8N&CjAeYXZf^agi{Xi`uC716exHg}&u9wf_ol79rR#%pg!)&K|%SG99X5-8nlGI#BnB)@F6S+L>yl6V3UY8qL zWDU5@wHl8N#+_ce$KC6!j87|tiKM%)EMid`Ki({I>V7J;ys~niHaRp`zS50>(8wUs6L$YD>Xn%FIkX2inW1aHN?CfltZiFayf1ufyo9yzh zuLku8i@VIqzdp{^?(|L}ggv)CEHreIyu$1+Qv3CfKgy0D;1Ltc!zv&d@s4ar9BN88 z!)DFGCN^d5A05@pv}}D8e>tYJgmbHmv^4wS!=;-0778A}F<)L@?(sh45#*cJE}z;s zJTM@PSXk)Ju^;N8+vsF(gvGa^4+nZ56%oefz?uX;cS~)rDB~+er7MK;FRS=Msx? z$;npn?=KCG&Ut!z>LX+aVj}_~A`zEMBL)UH~UU4)2&5DYOJCN}%MSDMgt`r$Ih-F7^tomMNKk$>BH0TmIx#OEfV@k}* zpbeE)yGw+G+px>S%llh%9UIuai;9ZWqONUqL-K3O&&~TG=``6>9wHPX|L&OTyOL;p z$fM&9)v#{yTJ;|;pFP)2>Mw*WBXU;f3fIydN0dd7y0Blv1fs1zQZf84)Ygh0YFiW`>sp@@{(+Zxb&g>JIE0a(!Vt(`;dz1>iK;`zsW zae1zj?`wYkLaLk|NAZjLqoTvk<6y&Ska-MF^_f4E;B8*C04Yz>obaKKHROl z*dP78rM1;irXS!3IgYV0a%6OLwOWR?G1p! zEh)*ucTe{7r>&j{5q6q<%k*WmtLtZ?cINfq*3I{>0UBmRR2u2~&@eCdhFJAvg#L6G z?>N)A|B%A#<6o`?20VWJ*jM)(-V?HAx}*K%)ZAPks|pea&+6psjLr9l{Zb!)`}Pef zHNYas0Py9`2CADYvksTB??2rrrX(ku6EE`e#Io1Qh1%^xNo!5yk^;A-GNs>zgfg-3 zOLtXc^I6q@2+AM2vNZzL6-&@Fi;YNbic=TX%6={X?#B=L>_pvtljGwrx`jti`RV2! zk9hg=nqUa2YV67^W6nt|L}Q9!3aiA46BF17Z6B|ly%eE|+J$W6ctk0j%j-&k>%!ZM zzUJ9EZ%Yj*h_1yFzj5MWxWB()P=91(q~qBrk}|M>@`+7M3wIYYESh_y`zpei$3tXN zjmiz;B7|+GV!_SUMgif*0v z>6vWb=iE~=s%g^Z)JWng=t(YIdaqr>T!nmQF5;r`z3fQYcL+u}g% zv(%;uyg`JV7cFvGLp`(awnwE!MF5tUmgk1cit6gpf5>pYq+oV!(u%)^-pdA0FIpvu zg|{v9*fsTu+JP@#(9+Xq8kGm*S&!?llawqp4tJ8aT$?2EVrMu2ZMA79m+3^DG^NDq z;@p_NYbRdGXj{HE^{vqsVGF-EJ4_+E|WWUQSPgs!T zH?C;Ob+npjZ$meMN`2&rn%uQ(*JcLmY|}`rlnpppdW3ws3-|jyQrh{Z+Zd|<<~gs$=Bn6SwKQi+-xFE<1Se;C0kEo27-mh)kWksY($N;?C2*@?9JOEwruj z{m1U?6dOMcbd%0n{G8S5_&)cw6-VKF-K9q&%+Vo~CS1F}6fb1{Ydo{vo%3Spn>Ppc z588-d4yk63Za)z#E+#gbJ0=mP7~9G`#>1xJ$CkdyHrXm}2 z)r-GQ=JY5lWfy$nj?l>E(R)=i;Xgo~^2l|ltW@;6aBU(-dV!-1%iL<$V_wT&AK64i zL?k5K=f^wossI?SVs|}}zH#|-ErKn*?%=(9_ej?I?798*iOouqE7L#tD|>o-StMNN z|G2-6CQBzRAz>(YtiWtctB0P2MekK*l%Jm;%9p6on(CR=)l~$=hX>LA=h2iR=clHm z@aPvT1J#nXFQXz*iVZ4BbB?{4fx%naD1{I~z|%s9rM+@kGrxzU0|S~(Z44paIf6Ia zzekItGj_av_pWKusjdpYLShBZGAYdIF%}HrJRdhSv)Gtw{G3^IcDOM$MJ};QAcAuD z4pfFNrbq@r1!V2n1Z;|)q*TC|0&uBVZolbh zx4ClVO5`!iW4yddjLWsg0uh6V+B8r82Iv#OqpO0dUxbyF;u*d zA3t_av}{PgsJ z06<>%?*ptX0XI^5X{1sVDk&)`=h{bmz5W^0p_)w1-g^ ztC%eVxL+^d`F=n=KucbsoP)zG;)`l0i}}>eD6YKxe3_>Vhl>MI3#6MP{QRbY#H7!i zTSlJ}pg&}5W8=LOEzbD0g&THuY2^1mlJh2I_t*1hoR5n*bxVp-xdt#yL(i#bvr@1U z@ME%mq2=*?Po%p61_6Dvn>N{xDWbgyaC|>IGh-iTPiAuE(~b;Aj(mG@k4r-rjfh?U z0U=7Cj_n?0>0#6LZHvXhgnM&-r)Uz#^5-pot=q7J1vxE$4*Y=nN&VgHq+ngJ|b zk6+}ICr541Wj9A9NmW^oxlQ5-~nHT#9m;jj(eACZ1$tIqB$T@Xe} zeEi@+e|w?Fg$oz1UVSsHE3c?X0o#H4?#GV2a~y4H4Dh|onH(C*B)p-fv2g)d=GZ#} zpcQOhRbl>vLP8C810i;Iu^{(H~2 zhkMXh7^N;CQ3S}Eby zx?Z2SF>K=&yYGH|_CA_Pj(74wHj_OUg>R54>zzhs6ELajAn_KaS&VRS;wfZUoD8tN zqotp6xQn*}(_Ns85PV7JaboU~PO)j{z$y>q7Y{ zw9kTa-=DLN0o%o^#!e>7UnSqMq0kN|t3@40flzxzpDiYs00AHab4+*XtEl{Jb=cYc z=FOYk0ks2mz>u|3=O4?8($oxsdDNE|Vc5Qz)XXgMple9y#l5_(9v*9`_3aZ@8E6|2 zDIdo+*;`n2sBrJr$&m4HN60HiNN|sptL1^^3X^bKOs$lVla~*b^e7?roNH|nr$Ns8F zi{^}HH3EH|ox2zqf&&5qke*+>uwI(A$Ugbh$EUbe@TV~{5U!#zVVIYfceDNj3K%I$ zdivLuLiZKa)VZj7QCoZaav`DGUBBt~-DT=iyY1xUHc>>+3wj96H>Fp?3v!Cxs-e-q zt`H0We*?Xfpq_1%G7{T7>LjIiY+avlkj0RG6Mc^)HkomRTkk2(k?v;*^-ocwD$%Xo zzc@mf7NnUS8MCXx&n7l({yfU!+|TBe_z`3crS!ZyENAc?1zlM?@Hd(Y13qq@ENei$ zKwkZTdq3<%bg}V~$6Rp7+7l0{?Wv^VHXJ?5!7&JS3n{eLvYnoe&K`x1hFRoP?cG`H zjb1q$*g#E_ujSH_3F7qqs2B>HZ4&=C64`$P=ly^Fs8?GXo#zY)r6cU@3{R!myg=_o zL`1~K#^!U{&vlIuSNRoryJvHRD>9wZoc=Wu~9Q4)?UO+PxE+? ze9F!P+}!1Lb^fy=#OHPKwhH3lXsA)Z1$OS-ImDhrD-~Pgbo(~?DEzcKY#l-PDKu&i zBL4>k1>q*xeNoXX-=}lrZnZd@o0C&Unr%qdPtGzvL+^eLmt`I_N)_hj<`x%kJ;D1uq}=Gpks~e*>m7HcHiicN`Guzn3K{^}H83zRGEzRq zMl^Hk#(_CVOFOy04~_Wf=qOfRB&?#bG5e33S5$y~u`Eb>UBR-_(U%Iw!M|u!sa|4J~LEL?je)? z!@|N|y}Ax0WcenPiLff-KfA8t&o3Sx9{ehv8V_*j&>;bVI+K%&i;F)EsIKxK4*nT{ z_W&s*BxDF2RbO8p^~j`D%-gqbV`DY?RWC;!vq-BQIf^(#XMN;|Omf50!otAJpgjM& zj*?NPLHt<>2??wxa1i?OFColW;m!BhL`9o(Zp?ugY;9>lTH&aU<&U(~$0{B>c8rr# zF1ev0?$Xz4=M3WLK*cV9Tt6_d4@)#OWai7^{}{_ZG4aWfo9M)f_VooKY2n?yetjic zdWTB`wddk!mGkj^+ohwci;7}Yei!L5admao(b4HCyFgKDX6Wb#ZAzY-Tc5g}EZXrp zG&Hn_z6&qHx71*4kWkjS6&W5Jd{Zza;c|S}$3xvjacskoxVU(^QEI68I)W~?L|G`L zeE`^*u9DuXT`SXpr2Z=WlQp|KiK#sFX>xmX_4%Il|#qRluZUpRM zj|YwB1@0@(1_lP|>gpHEj13H!B;A)0x?qOLamQ9G!CaV+b78MhP>;u|tD@qw9pN+t zlP~gHRw~-7${_x}>46$kQ&Sry)a=dM_Z@egw}uKwdSwieW4cD^KJ6ZMd6Vj>B9QUW zJ;IyM$-|^)hJ&(={7a+)`=>dM=YV>&_d9rn2 zp;o|^m6J&P`?gCx0E=bWoS{H{;_7El=qKCQpjFj_Ky!T#S?mdyBsw}tNlDUKv?;-Y z7QwXFzdhImdbcK=43Zmtp#~b|mhRqO%I^RZ`FMH#8cbjB8Ep+g^ghd9^-00xpKB+A z74=MOAucYin8ih&`h>^o@}47#Kf**a zJA`B9gC?O{Xpe#}n0~P9kO9?cRJf3nrZ(u30OP6IAUR0_XMMRx)!akY3UX`zGCe(w z{(f)E8q_>WhkfzlMJ2I`Z!)ZI22TAT2hrd7HiJcVAOAwd{T%I=j`!kdYc7P3W9_4v zZO(G;I}<=5fA!u$>CSX>u+xrt-9~vwSDoA-TGgN~Gas`4jiAq{dwZT!syyXtpi^xD z2q|dRS8i2`&wcy;9SWM5goGaF*zhoy5M)|m;86{IH+$f-OP4MIMWSVRubvnz z|9E=ZZiG$9vSpvZ&C5W-;L!JSU9kpUp}Z+TYTPwNa$|T3Ju*XqD&@MExOjAQw8zqj z&_egpSRpI(pI>|T)`JmX`zE=z>^sJWe&RQ&jhi=bWqZaX{A#Q}@~n>+Eojxihn9Rn zKqkNM!Lknc>||XX$!xDr(q-JW>je6Iwr_x_2tJF1z-A0Eb{^^ZIgi9(`=O z57(8C2Y7fCsV9Je=K8C@mX=-|wF0r_*zSguqrhGR+TVOWr;eV1fx|1yy7TVvt?Clx zo!hqUkvezo+!YqSAbA@lwEE=mr;I{iz168tI8XNe?z z3$_2p3$W0;{V?Ony^(7hZ)~s8HkfSLXS-^LPDBCvx%%QQdh%pmic7>))D_$?O zS(0e_3!=}QIRm6+R}iKpvx0I&mbSD^$}4bbcbhXcjf~eXTz$cI){7RTb?WfW)54}} zbtx0vWHNcAy-=U}gh9!R_i72a%X+@&U~9OOpO>f?&|b%*Lh9N(e3o#~V^ z^~+oXX&DUtY5z#5$vD*dTPl-o1;7$K=nhu^#19=jXuzAZcN{6jmtGb0SdXX*(6v;hevGU?n!C0fd$}S1 zb)LC*=)P|rvJ(N2IdUZS+qZM~zFbXI&J2Bf+2jsb_mZb5gswhmkB5qCf``G>a15f#oReM`=vnV&W1$O1V z%{%xQo~CdXfC8Nyf!aHW-NlQP0uu)m(^AcwO$-}QIBlZiwgfSlxfN~nl>KtYXri~9 zOg=31v!-TSzU6zj6w*ay!#BFll)Yb|SskYgn1WZbGL&41eamN3_2$6?>geiyOiVhc z_lBb+^M#{(%(v2&Rs|NzpQ(gR?5~t`6^b8BGp*x zQ4RL0@5QAa+_6V$lXSJ8y{LL;+H>P1 zgH>xzkt{DUDyU9v?^{aAguLc1E-u>9>QdBfR2R0fDTbc9WU|hwn^#GxQp%^u{~UBs zvN!nw_b=~Zx#v%xQo;_U{L3IYz(sNvFM`wKX4ooXro{NDbGt80xa+ z`#TAaLvEKW!uZB#XL+W`BX@HgMh1t5Lj3&FTo)$s%)Pm%oIykgCkk_MedriY-;Eyo zcF#*0LGxc9Arj&p2tX3nzXNTZM=LE3G8jk_HVtFaX&1Atv%bh1xgfrfz);;$c8w>~ zYqc}X0Z*A38KJhcky%JH^`N<6UD5RjyBn}kqHT$8frv~8g{6o zgF})^jO^*to^&AtHVs=Ha1CdcSZQcyh${q^|EfjTj`;HxG&~wBX7#MP_JEgLpJju{`@(!U3 zkt$P6%i8{czJ9x~Z7&42gU5~y(obha1cd?Fa^1|P*G6@ zTJK^k?m0Df6-|Y_{1YbG{Y*^e{>j$^Qc_X?E6a^+!$j;sl#|51M@0!&h^{}a=FeVx zNh|N(GjGR@r_bBAXeX~HJXI*I_y6t+`4J{ioTkHGTUt`W~voEf`ftk?=rysqwha5({WQ-SF=^2xJ}Q4$B#)6 zh^~(1bW}WJ5ocgwaYv>?^#C7PxX>Fio3x9Fi&ybpgdJ#ZtbMGr^V-;>jtU+?YUlz+ zMn+|@{-Ccgw0F{POa|1QTkeHDAvP2e(+?kD%xV(djWp;<5vcxbo;D1zOPQMb0zoz_Yj=3LxuAZI-7yZ1va84a z#@QShVL)q7LyP(A*RQy^qa#0E&L3S>pdvP%GU+x&3xSN6jlxHJ@bF|QMRwUE1tGXZ=o5@-`mPiA)y<(zBO{18j)qp7__@GZ zcM=3LFn^zDk z)1SX*Be#uw{`?tsK}sS7tBSg_f@BI|g_{&o-V4e!Nhe!H@GPUiO^^^2;D#54FEm-a zS3bT$`&_^JJpQDOt!=uaaslsTF$hDFIG`SSo))MzlrCEQ)Tv)JHB)#SyZ-zF%MK10 ziy@H4Z&J8>vRPZA>Cy=4%*8f4Lix!(??o?E82Q)ZWt_>wE!j1Yk;dBcH<3;W3+J!Q zHbZoRZNm`MXh=viDjz*SIIs!Ua~Z7_MA{tnUqwadsc!+8qQywNS;xV}CI9Y$SPld` zXu^Q;SO@q=Mw-8()j`|v8$G=cym5d!X5{;{(D~Bkr|~ktdsd@xIUIrp>9V@KKp`Jt zF(`yO@@OsDM!BG%z~+GtG$cDaJ6sEJ@}}lhED&Ectdo;)HUVgst)L@X1pcOYR*ZhU zh7U9_mZqq1fOx|~wPWTL{4@bzY2oMT1cI7NvuJkc{SicQ=E%uGsP#0ABUOw;Zu9Z> zcAqL2n(Wp?Lki99WRN^A53yhyHFXt@`1t1yo9}goIksh^?1M*LU20z|TLFE)49(w* z7WC+HkFQeNw(me%|5vOB0VwsX*MK`BhR zWwA=S>tr0$cOE!QIu}UUYY=4EzG01HMzDGA4R2(Tba(y2c6CxKh4wm{V0Gun_l*T^ zE+AlBskW_BdEdWZx^55F+{Gz8=Cu$r;deRvEX9km$+0YaytcOXt`E8ciucc|4+>b1 zG|Y)#eERJ~8k;0+d*!cRk0PH11=(>=FuaFRJxI4D8%uG*1 z)s4wJs<+z5F->_iwXRV|NDtU%^ew#F?(Dwt9c&hU0f+Y=mwJFsZ54~RX`4==yRK!Z zsH5WMJl6-X0-*9fiob?n(9>(vmDpaOY%>WVX~*N>L5c?&A&S1{-P^Ym|A$zmT7L)) zA^ZMYq@H(?{8n8ay^yD~=+gGCStrg!yn1y|=4yGkc<$>-cHdIuL4IF9yVYeU;r{%% z^-ZE`tIB;W>xfYn|5LT3H&qUif}=U8;6=$VqjrQk*xK%qx}2z`HoKcXx{78)iD56$ z3A0?;+Ti5TRq;)Pe~WIUUL0~x$y2znWwkTk-bQjmtbEYU90jYvk>zlc(!+nbifw-M zy{C>=1#Al)RYg*tLXQ)d7w_1pN8SgN&GXs`-b40$y__M%KCwnsX5SC%B(KazZH_cI z{Ye40b*Ha+Ew0^nMyngoa{c%|pa;&Bn`N&8x%v3{VQy0!Hv#7sYH&1F|0mDW*q9hH zrXW+{y_12Gvd@A>C@w_bC*2= z6d;fx=m}TsL^{n0*$=R;*>uBE#dCWa1_9q_dL+!`kq>GK0WHXsr5f%CY9Q9QlEw9> z$sJXZJjvF8psXTxab4j>U%%e?!)r^5(0pQMTS{n$M$@A~Xu zWY>5L)cuTXl7;k+0@4jz1+J2*lfx8%PO=6@N49V1{v;Or4`tInWzv|hQIbT-l%uW& z`bTGfMdF+#EEh*Xm^K#zMFY*JTedd!@~$VCo}Jz4X9k<6j_PoBU$|LY-U4zRNZ9nf zA#_N-RzF^!fYH&I(fx9SFO{t57T0)!YcHr&;`5a!LB(&9r09fs<;+0KC%0UvQ)Q{w2+ zICTA;ot?;oOO+n0H4t7M9p~`q$Vby-?S$CXg%sn_rkYe*D?vwAihWhpoQeNC{|y+KkojAuDgGlcIZ6u&qfuR8-R18Q zy9vgle6`RE?$aWDWX!Cq{e8{vue5Y*&8|VubjmY(s1wR(9xXq(b?eqHDToct^;F8L zKuWX5n+UqMCCZMDj`UI>S{pMYJcD~8UitX=d&F}!^l=kE7&4oW1RHrF12`-qBgp9Z?d|)M<}_8`ejhi#T(2=Q!y-n zE_GxlsC30!kxZ!q7@w@X@6<R6tH3e`+=sOpgHXU5T&2Ezpv;&LERS%RDb@G{d+CSoYTr zN8u8Lv4n+A3g(XJ7BxIq(J_rU$Y8Fh*EZXi0Zl1}!ka!UuH#?O8x;a6)W`i!5Lx`3 zI;w@Yx~0KWBRQstQ(ord$2Yiz3BtT|Yoz<)v?-ex`E?eaa0?qHtx$f-!pz+I=FA49 zPm9Wdn%Hb%MuHGD3JY)su$mhAH2jnb-z&G#k-cbbdw-N>8l$ZuOLAlEkj|`43Ge3D zu79hT#=>DBDzSoAZTFr%&FN-$cB`mp&vr(BQ(#?tHZa?tc&I^wA~`eT*x5 zB{WZ**A}1&c;Fif*0U7A8f+U#bP+*O*t175gd-Paut*hiihv+k;?M&R-|s2#4+0H8ywsOR0#$`Z0ZL;{%(r; z$~q!$I8;SdmE;isw;ZO;Fl5?TQ{R}HGu)d%-+cj?s^$Fr{BL4f0D+{AOh2oWI*~}Ne~uK$1#oGCsl8+f z3o$56y~P|j+59HGok2CODZb_Hxy+ZH&KHBOg)EJm+Lkdaa9;xX$uVT|`!zuF9%&<^ zcY%Q#1<{bL0t{tIb#-;+<=mp8xmZKY519xjY$ZIK%0!hF8DFv>nT_{@KE6*o*XCjs zRLRR*CnF;h82yYOTIjHBXtXG-3GH>f*9DrGn3&Q9Q{WTssRdL)F0Wq&Zn@^u+9I$& zz`+dr6v@>FHTC*^r$N+zI;ju3xq^IrD$S;XArzazj~_qK#L|V1sM{cB0KjEsWfw66 zq`>Z*v4(~YZ)_Hf60ot_C`Qvgw|+SOZ5Sc{?7@Ry=wq>O^u!zlLjEC!#$WFpD z*Vo>%KdKbde{jfPK7!Lkd=@XPEzhZ@ygU(I{^6hj8sc;7=bJ)yfLXJK>5MtJxXkJQ zWLIcgm^Mlf%p#O?0sfxR{Qq`I`HFBYfSUwnDdC~joJ*qspXqw>uxb+k$4{fefWQ~4 za74i0dse}JVL_aS!jnLpB3Tuny|ahmkr*wZ6yG*L4uae@GNLdiN)UtpQNjMdw37Z2 z9O(}5hTW$%;RX2FLn&^F_DLu%BBG*{0Z*+X8wuhte4!TQ0Xbi;f}HzQ-v}sds>xjo z!pS006>S3FN2$3b_?FQP_`=={As1xPUT&=`EX*(&T)6OnwhPqsU&;;~_^7(vgXS0w zSi)e&y}NgzCcGJe*$B1y`I9GNF0JZ$eu6+wz#o>kkV?wIskec7W;!sd%b93P{q8cw6gLG7??1EVXoo`iXcqkZ2p;h zn*+EheF5dpk^CSz+bF?v2@1zBZmcC+mAV=?3POma3MbFZK#dIbCzm-(?E<_zrT}s6 zL9mW6Gr@)gg$JLIdhjR19uc7rmB%0m)ZiAjyZ7#G3s=}&$c23|OgqSzeV-PJOx=JT zj^((hpa3g*9BmhzT9bd|alHr$ae+X~b}llS420rE3yZ9dI{LNxNWDULH*oVP7;s4g zTELuC2)7``2DdJmod3gJH~_F=3)}Rfl=J}bS;-Dgo<~6aWWyR|jArqDq?|Q?e2zZ= zpIITE9B-mE(@OtKbK3nrAS(} zb+XSpnnHH#_`L4kmp9y-8!#s2;o%X~0x=(wzSaV4fwkr3BhcEgCh208*cIeoIT-D` zGV~|3(!3UQB_1LXru9Mlq3-XXrhd^GhQWasFFra=8701M;kC+5;uegp834(j1L)&g zZpZcwUWcU$(J^_9Im2Ip3O`&Gd5^XW-6HIEd!_OwzB58U%dD5f9#=`#io-YvmSPTv z76>~GUx9U3M<-NgEFVi9Pz03#Lvp~L;C^pre|Et`Z`}bi6Q;SL08zH=pQ=$seqJ8t zQ718y=H>0Jm9Pr<;Gmu*r%gEr0r021v~*%_jI3dP%|)^Kc|-zjlKMm zGhSN~ioWO5Qsvlu*wFvZV{HBlrQ!eOaGZbVuXe1NjalAE;2NWPrhocOq}^oP!2`$3 z-h7ogp7rtNz-H~Lh2!1*b`zVLYdyDax$*E?PDOU7(T^6s%wxY>T0V>aVR&fUt4`wD zv4Eq|cTWr7XJAR$ns!fRlkEMq$5To*es`F~Mg3VLD!18WjV3f?E4I7Zj@q`zZe$xI zXuaSAppBv-&O8ty{vkhj*&U|=t8_p>MG${%*c7R(Ojb^gL?YSd?jTN4(e*fFgAbKw zuUTD4Pfrh$fA{IriOgog)AmKp*gxTJ{`!czF!tDFwNQqvNu+Jtwjp`9gfGA;8=stv zkXwfP(IyLb82cL?9a&RJC)053dS zEL@#Qh8qN8*$sFIoZN2`4-yafn5k)K;7k`g*x6!(Y+){Y^yty>Jtp)@FGz77eWL9H zm|2AsYLmrIR4EFJuC)F7^}5u+CY^y8Z!goVg+cLELJZ-_|KeWF7<6x~R3imlU0qpI z^o_WfiQ6=#NP`Pl`?`nzHyjEiN*SeMMD4{)vYzWi5&8!7ud_&a%|GxhJ%#cI(I|=o zgwW)`Yuy6r+3e;`#H%xoX+VTRy~{6u4m-pYug3xjojm3)ZK}`HyDfLKVn(uyJF~^+ zec(s5pE#+<9BLt;#(t=JXpC^#?-=289H!quIQieBlyiQU5$)OET}j;^e*XNqHm?e^ zh&!}YoY5f&cmiFHV$nvxV0TuEP01rcYgLM^El+WBa8M}4VrECzwWW57ZHN?!C|+5b z%M5n~W`L2w701iKSw7a7+K1xch%O2)8rU9^wKJ2@n_)&Su@AqyhDk&{he}+88%HN4 zCA9$)!MK2V0JjERNBiYDgyGA3aTG5+rj|QU6V`kqmJRSCNAi?MA07!m%FXSDBQ&;d z-3rgZr}K@hHdotCN986hmLD zEEY?yRvYym4%B(2;yji==RWaRAMDEEB`e%N9E5h|0u2Vf5p}h-(;@B4>@ju}KHPPx zyfG@)4^Z|v?#J&ZTw06_3|hS!YHIliwPP{p)r}vAtH7VSglKpruCay(7vwG6PL$kH ze7vYpFzGKC+bAb1t0H^E<5>A7dYu<;<6u%KN812a+EiNQ&(!0!qwFsh@w$I1kF0c` zO$97Fg_r0&x0Ho_WCDL)ll61&9qy>Mf~bSegWU#MsSf&wEc z3ABsa6BT>I_RjEEfzqi_!tOXH8;{ora#^%4wBEQWbt*Zl>yeVjVohwY$3RSA_<;Mm z1IZQd;v#x$ra!<5Wmvhc1qWn|XkrBWc+5#S-yJHbJfEj1dpO%;a^zS{Q&W?mP;!KO z!Pp-g4tR&27k9DM>RTO2r;K=FIOJFiCGi|#)x|D_1draejc+nu$&DlCGENWD)NC}G z1T}<%i&8L_u(p!4?tqZZ-kIUR&y-woq}?Q3==}NfnXL}mvI9Fk=D%W*v{|(S0E5GN{OV_)3P~J+fjp)ni#%MRw{It5d_O8GYVBg}I!`f@w0JGI z1!2vz$DW{;s$F-0`Vy7rfpg5nUE2TtKX||-lMfqjTACeN#BANY#JuvRY~7^z_+!4M zJq`-Q8}U&0f9BI3Eg7+)@Mu6rTwFg!Qi#t!gFmaPsv4nviM)-AD;aPk9-RH}z330_ zw(!g$t-`S6iUNUNfUtY)Dt>`Sds=ifs~a{LCZtyMO=@atG!g5GQ~o;AF!$&y9c#5A zaksC|W~Ls(X^WInYBT>E@j1R{QYsr2HpVY0Z?cRjX$z62DkG_yjFLE@Qyo zd^~3UFQI!j6Q_8q9NV0XLs)fk>`cK+!yY*cCR|5H37T8t_^4Zf6wyFyk>aI0#n;pt`CoAPEbe9czh(78J?y zOtQxcES47HPDoXBbaeQD#6mo#T>w$wEUj}!=C%eLgW%Pe=VXh5Gg`Q|3X518Q(}C4 zsosm7#Dv|+!3G`Ma{R^A=Y`|A*kpW%r!$T(14 zF%~(ChExYf!ND&zToQmIMJY)fWeqa%hwN<1$)#Z^IRIV&aB!pzTZj;s$nz32JJT^3 zi1D{~ewcfY447-z&9Mvm%dwi!X!5Rpxl1GM2Fvxa7|E3ZCB#kPGMQIfqMKFJ!JJ2L z9pQS8yu?UWPt@{PfvMy&$e)n2m~QApqDJAyREp^2Z7?4u~l z%m{B^ODYT$J0)&}sdox4`YTousfP2QX+FeQ# zb_fyF?ifEng}U&V;E)g{+cYx`4^J9TTe$*~5W?N>C+eA!M6Jy|m!YMmREt$WJjL+# zFGB;wf!D4wEBp})^0KCg$Ri%s1>hh2ej-?!7MBcC#+nckDOO$D27E!NG_E5IM8$fb zd>mgT{bb)u6=xg+sTCoaoRp-8xeQrTnD7!SLyfI?B*8(`fQS<}B*!r?YEM59tT9mDH371HjCu^Lrbl&%HPeB--ns|$bD zp8+UGM!^Yl-0k~pIRpd*5Gsv(CL87Y*Li*z);AsMK@Z1_9xf#N|E}uw*GgP+s}>bR zPEHQP2Q?K77+rzjAO(;x8c z*s()chtfLXUJzp-y)7%3p_A1%Gynp+BXopYaEGb@GB&LC#DTSxOOA{GX=HJ*_)_wR z4_w^bVf@C5mVuiHiOXj!1CeCP4EVBj_Yfw}E5ugZ(SfYY7fV`-LAYRXW%_+WLaahay|V$p zq(!fROt|~v05s$tTPwmkgJf2_G&3Xwso3u)TqN||T6S=??_?1><#JTi28X`UU>q~X zuJmwVkL?YD_H;osMYD_b!vyjtcq-A!>)2JFZ#>)hl5&C*EWQgZy9uvq;fQ!Ej6b0< z;67jZY&#hH>UAAY>=kR_#c1iRPX{vzoi0OFa079oXJ&c{r_1Q*qjzz}QlKB&%cJwl zCT^yLGGJY!AVmK2(t6Q)YHB#VFA0T7;N(f1gJX`A)Hs25*W240^wn?)4ken*<|H1l zC0~j_H!Ew3))&k?EL&$9lGZ#X*FdqOwZ#I&Qd-K&72@>oVdFv0YHD?u4AFiRuF?eh z_Tt5dQ5#On*h$r*%@#qStv`gB7EExIt|<}+ULhf(lt9Wb3mYFUIU>1GDmJ!}xQmpH zk2k?Txfr$xCm6n3D>oC&ehu5mDzX~7_G+Z_W13LA&G^?7p?4IQI4y|NmJk0Wzb9Ov zYzh2~-Gf;D3mBvjWFjs*iPJt{z=R>F-TGIA%KtaC%|HDr-`3WB^Zvl3Kfa<3DT26o MUh!O#)YZHH1H#D?=Kufz literal 0 HcmV?d00001 From 1439cf4b1b6c8ed40501ccf79316afaa360658c0 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Thu, 14 May 2026 19:07:25 +0300 Subject: [PATCH 07/12] test(demo): remove header row in col menu test --- .../playground/YfmTable.visual.test.tsx | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx b/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx index 227780381..b40c36a24 100644 --- a/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx +++ b/demo/tests/visual-tests/playground/YfmTable.visual.test.tsx @@ -597,33 +597,6 @@ test.describe('YfmTable', () => { await expectScreenshot(); }); - test('should set header on the first row via column menu', async ({mount, editor}) => { - const initial = dd` - #| - || one | two || - || three | four || - |# - `; - - await mount(); - - const tableLocator = ( - await editor.yfmTable.getTable(editor.locators.contenteditable) - ).first(); - const rowsLocator = await editor.yfmTable.getRows(tableLocator); - const cellsLocator = await editor.yfmTable.getCells(tableLocator); - const firstCell = cellsLocator.first(); - const columnButton = (await editor.yfmTable.getColumnButtons(tableLocator)).first(); - - await editor.yfmTable.focusFirstCell(tableLocator); - await firstCell.hover(); - await columnButton.click(); - await editor.yfmTable.doCellAction('column', 'header-toggle'); - - await expect(rowsLocator.nth(0)).toHaveAttribute('data-header', 'true'); - await expect(rowsLocator.nth(1)).not.toHaveAttribute('data-header', 'true'); - }); - test('should make 2nd row a header when rowspan from row 0 covers row 1', async ({ wait, mount, From 14c3b1281eccbaa890c457bf890bae6b3fb68802 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Mon, 18 May 2026 12:49:36 +0300 Subject: [PATCH 08/12] fix(YfmTable): reduce header rows props --- .../examples/yfm-table-dnd/YfmTableDnD.tsx | 2 +- .../FloatingMenuControl.tsx | 51 +++++++------------ .../nodeviews/yfm-table-cell-view.tsx | 46 +++++++---------- 3 files changed, 38 insertions(+), 61 deletions(-) diff --git a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx index 3e1557392..1df7cbbd8 100644 --- a/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx +++ b/demo/src/stories/examples/yfm-table-dnd/YfmTableDnD.tsx @@ -36,7 +36,7 @@ export const YfmTableDnDDemo = memo(function YfmTableDnDDe }, }, }, - [mobile, dnd], + [mobile, dnd, headerRows], ); return ( diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx index e0cbf742b..673308a05 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx @@ -32,10 +32,8 @@ export type FloatingMenuControlProps = { onInsertAfterClick: () => void; onRemoveRangeClick: () => void; onRemoveTableClick: () => void; - canMakeRowHeader: boolean; - canUnsetRowHeader: boolean; - onMakeRowHeader: () => void; - onUnsetRowHeader: () => void; + isRowHeader?: boolean; + onRowHeaderChange?: (value: boolean) => void; }; export const FloatingMenuControl: React.FC = @@ -51,34 +49,23 @@ export const FloatingMenuControl: React.FC = onInsertAfterClick, onRemoveRangeClick, onRemoveTableClick, - canMakeRowHeader, - canUnsetRowHeader, - onMakeRowHeader, - onUnsetRowHeader, + isRowHeader = false, + onRowHeaderChange, }) { const dropdownItems = useMemo(() => { const headerItems: DropdownMenuItem[] = []; - { - const isRowHeader = Boolean(canUnsetRowHeader); - const hiddenRowHeaderOption = !canMakeRowHeader && !canUnsetRowHeader; - if (!hiddenRowHeaderOption) { - headerItems.push({ - text: ( - - {i18n(`row.header${multiple ? '.multiple' : ''}`)} - - - ), - iconStart: , - qa: 'g-md-yfm-table-row-header-toggle', - action: isRowHeader ? onUnsetRowHeader : onMakeRowHeader, - hidden: hiddenRowHeaderOption, - }); - } + if (onRowHeaderChange) { + headerItems.push({ + text: ( + + {i18n(`row.header${multiple ? '.multiple' : ''}`)} + + + ), + iconStart: , + qa: 'g-md-yfm-table-row-header-toggle', + action: () => onRowHeaderChange(!isRowHeader), + }); } return [ @@ -124,10 +111,8 @@ export const FloatingMenuControl: React.FC = }, [ type, multiple, - canMakeRowHeader, - canUnsetRowHeader, - onMakeRowHeader, - onUnsetRowHeader, + isRowHeader, + onRowHeaderChange, onClearCellsClick, onInsertAfterClick, onInsertBeforeClick, diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx index 075993c37..0bff0d70d 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx @@ -77,8 +77,8 @@ class YfmTableCellView implements NodeView { columnRange: Readonly; showRowControl: boolean; showColumnControl: boolean; - canMakeRowHeader: boolean; - canUnsetRowHeader: boolean; + isRowHeader: boolean; + canToggleRowHeader: boolean; }; private _dndHandler: YfmTableDnDHandler | null; @@ -133,10 +133,12 @@ class YfmTableCellView implements NodeView { onInsertAfterClick={this._onRowInsertAfterClick} onRemoveRangeClick={this._onRowRemoveRangeClick} onRemoveTableClick={this._onRemoveTableClick} - canMakeRowHeader={this._cellInfo.canMakeRowHeader} - canUnsetRowHeader={this._cellInfo.canUnsetRowHeader} - onMakeRowHeader={this._onRowMakeHeaderClick} - onUnsetRowHeader={this._onRowUnsetHeaderClick} + isRowHeader={this._cellInfo.isRowHeader} + onRowHeaderChange={ + this._cellInfo.canToggleRowHeader + ? this._onRowHeaderChange + : undefined + } /> )} {showColumnControl && ( @@ -152,10 +154,6 @@ class YfmTableCellView implements NodeView { onInsertAfterClick={this._onColumnInsertAfterClick} onRemoveRangeClick={this._onColumnRemoveRangeClick} onRemoveTableClick={this._onRemoveTableClick} - canMakeRowHeader={false} - canUnsetRowHeader={false} - onMakeRowHeader={this._onColumnMakeHeaderClick} - onUnsetRowHeader={this._onColumnUnsetHeaderClick} /> )} @@ -179,6 +177,7 @@ class YfmTableCellView implements NodeView { if (cellInfo && (cellInfo.cell.row === 0 || cellInfo.cell.column === 0)) { const desc = cellInfo.tableDesc.base; + const isRowHeader = desc.isHeaderRow(cellInfo.cell.row); const info: YfmTableCellView['_cellInfo'] = (this._cellInfo = { tablePos: cellInfo.table.pos, rowIndex: cellInfo.cell.row, @@ -187,9 +186,10 @@ class YfmTableCellView implements NodeView { showColumnControl: false as boolean, rowRange: desc.getRowRangeByRowIdx(cellInfo.cell.row), columnRange: desc.getColumnRangeByColumnIdx(cellInfo.cell.column), - canMakeRowHeader: - this._headerRowsEnabled && canMakeRowHeader(desc, cellInfo.cell.row), - canUnsetRowHeader: desc.isHeaderRow(cellInfo.cell.row), + isRowHeader, + canToggleRowHeader: + this._headerRowsEnabled && + (isRowHeader || canMakeRowHeader(desc, cellInfo.cell.row)), }); for (const deco of decorations) { @@ -444,20 +444,12 @@ class YfmTableCellView implements NodeView { this._view.focus(); } - private _onRowMakeHeaderClick = () => { - this._toggleHeaderRows('row-set-header', 'row-menu', (range) => range.endIdx + 1); - }; - - private _onRowUnsetHeaderClick = () => { - this._toggleHeaderRows('row-unset-header', 'row-menu', (range) => range.startIdx); - }; - - private _onColumnMakeHeaderClick = () => { - this._toggleHeaderRows('row-set-header', 'column-menu', (range) => range.endIdx + 1); - }; - - private _onColumnUnsetHeaderClick = () => { - this._toggleHeaderRows('row-unset-header', 'column-menu', (range) => range.startIdx); + private _onRowHeaderChange = (value: boolean) => { + this._toggleHeaderRows( + value ? 'row-set-header' : 'row-unset-header', + 'row-menu', + (range) => (value ? range.endIdx + 1 : range.startIdx), + ); }; private _onRemoveTableClick = () => { From c7a36ef3bbdc1bff285dc7319d4e518012f4e093 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Mon, 18 May 2026 13:08:26 +0300 Subject: [PATCH 09/12] fix(YfmTable): update ru translations --- packages/editor/src/i18n/yfm-table/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/editor/src/i18n/yfm-table/ru.json b/packages/editor/src/i18n/yfm-table/ru.json index 3b456d0a0..43e4542b1 100644 --- a/packages/editor/src/i18n/yfm-table/ru.json +++ b/packages/editor/src/i18n/yfm-table/ru.json @@ -3,8 +3,8 @@ "column.add.after": "Добавить столбец после", "column.remove": "Удалить столбец", "column.remove.multiple": "Удалить столбцы", - "row.header": "Строка-заголовок", - "row.header.multiple": "Строки-заголовки", + "row.header": "Заглавная строка", + "row.header.multiple": "Заглавные строки", "row.add.before": "Добавить строку до", "row.add.after": "Добавить строку после", "row.remove": "Удалить строку", From 97a20f60f4e371943871037fe873356d845e880a Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Mon, 18 May 2026 14:05:04 +0300 Subject: [PATCH 10/12] feat(YfmTable): render header cells as with role=columnheader --- .../FloatingMenuControl.tsx | 8 +++++++- .../nodeviews/yfm-table-cell-view.tsx | 19 ++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx index 673308a05..983a65ae6 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx @@ -59,7 +59,13 @@ export const FloatingMenuControl: React.FC = text: ( {i18n(`row.header${multiple ? '.multiple' : ''}`)} - + , which would trigger action twice + style={{pointerEvents: 'none'}} + /> ), iconStart: , diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx index 0bff0d70d..1cb94ad89 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx @@ -99,9 +99,8 @@ class YfmTableCellView implements NodeView { this._dndEnabled = opts.dndEnabled; this._headerRowsEnabled = opts.headerRowsEnabled; - this._isHeader = this._computeIsHeader(node); - this.dom = document.createElement(this._isHeader ? 'th' : 'td'); - if (this._isHeader) this.dom.setAttribute('scope', 'col'); + this._isHeader = this._computeIsHeader(); + this.dom = document.createElement('td'); this._updateDom(); this.contentDOM = this.dom; @@ -165,11 +164,10 @@ class YfmTableCellView implements NodeView { } update(node: Node, decorations: readonly Decoration[]): boolean { - if (this._computeIsHeader(node) !== this._isHeader) return false; - { const prev = this._node; this._node = node; + this._isHeader = this._computeIsHeader(); this._updateDom(prev); } @@ -231,6 +229,13 @@ class YfmTableCellView implements NodeView { } private _updateDom(prev?: Node) { + if (this._isHeader) { + if (this.dom.getAttribute('role') !== 'columnheader') + this.dom.setAttribute('role', 'columnheader'); + } else if (this.dom.hasAttribute('role')) { + this.dom.removeAttribute('role'); + } + if (prev?.attrs[YfmTableAttr.CellAlign]) { this.dom.classList.remove(prev.attrs[YfmTableAttr.CellAlign]); } @@ -466,9 +471,9 @@ class YfmTableCellView implements NodeView { this._view.focus(); }; - private _computeIsHeader(node: Node): boolean { + private _computeIsHeader(): boolean { if (!this._headerRowsEnabled) return false; - const info = this._getCellInfo(node); + const info = this._getCellInfo(); if (!info) return false; return info.tableDesc.base.isHeaderRow(info.cell.row); } From f75f0e27fac188d75837fb2915214689c0651590 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Mon, 18 May 2026 14:21:44 +0300 Subject: [PATCH 11/12] fix(YfmTable): fix vertical align in row header cells --- .../YfmTableControls/nodeviews/yfm-table-cell-view.scss | 5 +++++ .../YfmTableControls/nodeviews/yfm-table-cell-view.tsx | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.scss diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.scss b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.scss new file mode 100644 index 000000000..72f7fd9ce --- /dev/null +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.scss @@ -0,0 +1,5 @@ +.yfm.ProseMirror { + table td[role='columnheader'] { + vertical-align: inherit; + } +} diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx index 1cb94ad89..512d0ba70 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx @@ -37,6 +37,8 @@ import { } from '../plugins/dnd-plugin'; import {getSelectedCellsForColumns, getSelectedCellsForRows} from '../utils'; +import './yfm-table-cell-view.scss'; + const dropCursorParams: DropCursorParams = { color: 'var(--g-color-line-brand)', width: 2, From 7521092eb77458311e1ff4f948e72561e61a9697 Mon Sep 17 00:00:00 2001 From: Yuriy Demidov Date: Mon, 18 May 2026 16:10:25 +0300 Subject: [PATCH 12/12] fix(YfmTable): upd after review --- .../nodeviews/yfm-table-cell-view.tsx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx index 512d0ba70..229da4779 100644 --- a/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx +++ b/packages/editor/src/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.tsx @@ -101,7 +101,7 @@ class YfmTableCellView implements NodeView { this._dndEnabled = opts.dndEnabled; this._headerRowsEnabled = opts.headerRowsEnabled; - this._isHeader = this._computeIsHeader(); + this._isHeader = this._computeIsHeader(undefined); this.dom = document.createElement('td'); this._updateDom(); @@ -166,14 +166,12 @@ class YfmTableCellView implements NodeView { } update(node: Node, decorations: readonly Decoration[]): boolean { - { - const prev = this._node; - this._node = node; - this._isHeader = this._computeIsHeader(); - this._updateDom(prev); - } + const prev = this._node; + this._node = node; const cellInfo = this._getCellInfo(); + this._isHeader = this._computeIsHeader(cellInfo); + this._updateDom(prev); if (cellInfo && (cellInfo.cell.row === 0 || cellInfo.cell.column === 0)) { const desc = cellInfo.tableDesc.base; @@ -473,11 +471,10 @@ class YfmTableCellView implements NodeView { this._view.focus(); }; - private _computeIsHeader(): boolean { + private _computeIsHeader(cellInfo: ReturnType): boolean { if (!this._headerRowsEnabled) return false; - const info = this._getCellInfo(); - if (!info) return false; - return info.tableDesc.base.isHeaderRow(info.cell.row); + if (!cellInfo) return false; + return cellInfo.tableDesc.base.isHeaderRow(cellInfo.cell.row); } private _getCellInfo(node: Node = this._node) {