diff --git a/.changeset/sharp-bees-worry.md b/.changeset/sharp-bees-worry.md new file mode 100644 index 0000000000..472c23e2f1 --- /dev/null +++ b/.changeset/sharp-bees-worry.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/web-elements": patch +--- + +fix: incorrect top style of x-foldview-slot-ng if the toolbar is wrapped in lynx-wrapper diff --git a/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewHeaderNg.ts b/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewHeaderNg.ts index ff3200cf98..76d62de40d 100644 --- a/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewHeaderNg.ts +++ b/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewHeaderNg.ts @@ -6,6 +6,7 @@ import { Component } from '@lynx-js/web-elements-reactive'; import { CommonEventsAndMethods } from '../common/CommonEventsAndMethods.js'; import { resizeObserver, type XFoldviewNg } from './XFoldviewNg.js'; +import { getCombinedDirectParentElement } from '../common/getCombinedParentElement.js'; @Component( 'x-foldview-header-ng', @@ -14,12 +15,18 @@ import { resizeObserver, type XFoldviewNg } from './XFoldviewNg.js'; ], ) export class XFoldviewHeaderNg extends HTMLElement { + #parentResizeObserver: ResizeObserver | undefined = undefined; connectedCallback() { - (this.parentElement as XFoldviewNg | null)?.[resizeObserver]?.observe(this); + const parentElement = getCombinedDirectParentElement( + this, + 'X-FOLDVIEW-NG', + ); + this.#parentResizeObserver = parentElement?.[resizeObserver]; + this.#parentResizeObserver?.observe(this); } dispose() { - (this.parentElement as XFoldviewNg | null)?.[resizeObserver]?.unobserve( + this.#parentResizeObserver?.unobserve( this, ); } diff --git a/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewToolbarNg.ts b/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewToolbarNg.ts index ccc7ddfef3..ecb370cbcb 100644 --- a/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewToolbarNg.ts +++ b/packages/web-platform/web-elements/src/XFoldViewNg/XFoldviewToolbarNg.ts @@ -6,16 +6,24 @@ import { Component } from '@lynx-js/web-elements-reactive'; import { CommonEventsAndMethods } from '../common/CommonEventsAndMethods.js'; import { resizeObserver, type XFoldviewNg } from './XFoldviewNg.js'; +import { getCombinedDirectParentElement } from '../common/getCombinedParentElement.js'; @Component('x-foldview-toolbar-ng', [ CommonEventsAndMethods, ]) export class XFoldviewToolbarNg extends HTMLElement { + #parentResizeObserver: ResizeObserver | undefined = undefined; connectedCallback() { - (this.parentElement as XFoldviewNg | null)?.[resizeObserver]?.observe(this); + const parentElement = getCombinedDirectParentElement( + this, + 'X-FOLDVIEW-NG', + ); + this.#parentResizeObserver = parentElement?.[resizeObserver]; + this.#parentResizeObserver?.observe(this); } + dispose() { - (this.parentElement as XFoldviewNg | null)?.[resizeObserver]?.unobserve( + this.#parentResizeObserver?.unobserve( this, ); } diff --git a/packages/web-platform/web-elements/src/common/getCombinedParentElement.ts b/packages/web-platform/web-elements/src/common/getCombinedParentElement.ts new file mode 100644 index 0000000000..a3a0edc4ce --- /dev/null +++ b/packages/web-platform/web-elements/src/common/getCombinedParentElement.ts @@ -0,0 +1,13 @@ +export const getCombinedDirectParentElement = ( + element: HTMLElement, + parentTagName: string, +): T | undefined => { + let parentElement: T | null = element.parentElement as T | null; + if (parentElement?.tagName === 'LYNX-WRAPPER') { + parentElement = parentElement.parentElement as T | null; + } + if (parentElement?.tagName === parentTagName) { + return parentElement; + } + return; +}; diff --git a/packages/web-platform/web-tests/tests/web-elements.spec.ts b/packages/web-platform/web-tests/tests/web-elements.spec.ts index 207670e1d3..59256ea0f1 100644 --- a/packages/web-platform/web-tests/tests/web-elements.spec.ts +++ b/packages/web-platform/web-tests/tests/web-elements.spec.ts @@ -830,6 +830,14 @@ test.describe('web-elements test suite', () => { await gotoWebComponentPage(page, title); await diffScreenShot(page, title, '300px-inf'); }); + test('x-foldview-ng/basic-toolbar-in-lynx-wrapper', async ({ + page, + browserName, + }, { title }) => { + await gotoWebComponentPage(page, title); + await wait(500); + expect(page.locator('x-foldview-slot-ng')).toHaveCSS('top', '200px'); + }); test('x-foldview-ng/size-parent-grow-children-specific', async ({ page, browserName, diff --git a/packages/web-platform/web-tests/tests/web-elements/x-foldview-ng/basic-toolbar-in-lynx-wrapper.html b/packages/web-platform/web-tests/tests/web-elements/x-foldview-ng/basic-toolbar-in-lynx-wrapper.html new file mode 100644 index 0000000000..cb0b3c84f7 --- /dev/null +++ b/packages/web-platform/web-tests/tests/web-elements/x-foldview-ng/basic-toolbar-in-lynx-wrapper.html @@ -0,0 +1,70 @@ + + + + + + web playground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +