@gravity-ui/dashkit 10.4.3 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +3 -1
  2. package/build/cjs/components/ActionPanel/ActionPanel.css +53 -24
  3. package/build/cjs/components/ActionPanel/ActionPanel.js +27 -1
  4. package/build/cjs/components/ActionPanel/ActionPanel.js.map +1 -1
  5. package/build/cjs/components/DashKitDnDWrapper/DashKitDnDWrapper.js +4 -2
  6. package/build/cjs/components/DashKitDnDWrapper/DashKitDnDWrapper.js.map +1 -1
  7. package/build/cjs/components/GridItem/GridItem.css +4 -2
  8. package/build/cjs/components/GridLayout/ReactGridLayout.d.ts +2 -1
  9. package/build/cjs/components/GridLayout/ReactGridLayout.js +19 -15
  10. package/build/cjs/components/GridLayout/ReactGridLayout.js.map +1 -1
  11. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js +14 -25
  12. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js.map +1 -1
  13. package/build/cjs/context/DashKitDnDContext.d.ts +1 -1
  14. package/build/cjs/context/DashKitDnDContext.js.map +1 -1
  15. package/build/cjs/hooks/__tests__/useDnDItemProps.test.d.ts +2 -0
  16. package/build/cjs/hooks/__tests__/useDnDItemProps.test.js +45 -0
  17. package/build/cjs/hooks/__tests__/useDnDItemProps.test.js.map +1 -0
  18. package/build/cjs/hooks/useDnDItemProps.js +1 -1
  19. package/build/cjs/hooks/useDnDItemProps.js.map +1 -1
  20. package/build/cjs/package.json +1 -1
  21. package/build/docs/INDEX.md +3 -1
  22. package/build/esm/components/ActionPanel/ActionPanel.css +53 -24
  23. package/build/esm/components/ActionPanel/ActionPanel.js +27 -1
  24. package/build/esm/components/ActionPanel/ActionPanel.js.map +1 -1
  25. package/build/esm/components/DashKitDnDWrapper/DashKitDnDWrapper.js +4 -2
  26. package/build/esm/components/DashKitDnDWrapper/DashKitDnDWrapper.js.map +1 -1
  27. package/build/esm/components/GridItem/GridItem.css +4 -2
  28. package/build/esm/components/GridLayout/ReactGridLayout.d.ts +2 -1
  29. package/build/esm/components/GridLayout/ReactGridLayout.js +19 -15
  30. package/build/esm/components/GridLayout/ReactGridLayout.js.map +1 -1
  31. package/build/esm/components/GridLayout/__tests__/passive-resize.test.js +14 -25
  32. package/build/esm/components/GridLayout/__tests__/passive-resize.test.js.map +1 -1
  33. package/build/esm/context/DashKitDnDContext.d.ts +1 -1
  34. package/build/esm/context/DashKitDnDContext.js.map +1 -1
  35. package/build/esm/hooks/__tests__/useDnDItemProps.test.d.ts +2 -0
  36. package/build/esm/hooks/__tests__/useDnDItemProps.test.js +42 -0
  37. package/build/esm/hooks/__tests__/useDnDItemProps.test.js.map +1 -0
  38. package/build/esm/hooks/useDnDItemProps.js +1 -1
  39. package/build/esm/hooks/useDnDItemProps.js.map +1 -1
  40. package/build/esm/package.json +1 -1
  41. package/package.json +1 -1
@@ -13,8 +13,6 @@ jest.mock('../../Item/Item', () => ({
13
13
  }));
14
14
  const resizeObservers = [];
15
15
  const mockPolyfillObservers = [];
16
- const animationFrameCallbacks = new Map();
17
- let animationFrameId = 0;
18
16
  jest.mock('resize-observer-polyfill', () => ({
19
17
  __esModule: true,
20
18
  default: class {
@@ -67,27 +65,15 @@ const emitPolyfillResizeFor = (element, width) => {
67
65
  observer.callback([{ contentRect: { width }, target: element }]);
68
66
  });
69
67
  };
70
- const runAnimationFrame = () => {
71
- const callbacks = Array.from(animationFrameCallbacks.values());
72
- animationFrameCallbacks.clear();
73
- callbacks.forEach((callback) => callback(0));
74
- };
75
68
  const gridItem = (react_1.default.createElement(GridItem_1.default, { adjustWidgetLayout: jest.fn(), id: "item", item: { data: {} }, key: "item", layout: [] }));
76
69
  describe('Layout passive resize', () => {
77
70
  beforeEach(() => {
78
71
  resizeObservers.length = 0;
79
72
  mockPolyfillObservers.length = 0;
80
- animationFrameCallbacks.clear();
81
- animationFrameId = 0;
82
73
  global.ResizeObserver = TestResizeObserver;
83
- window.requestAnimationFrame = jest.fn((callback) => {
84
- animationFrameId += 1;
85
- animationFrameCallbacks.set(animationFrameId, callback);
86
- return animationFrameId;
87
- });
88
- window.cancelAnimationFrame = jest.fn((frame) => {
89
- animationFrameCallbacks.delete(frame);
90
- });
74
+ });
75
+ afterEach(() => {
76
+ jest.useRealTimers();
91
77
  });
92
78
  test('does not render ReactGridLayout for passive container resize', () => {
93
79
  const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
@@ -114,42 +100,45 @@ describe('Layout passive resize', () => {
114
100
  expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
115
101
  expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
116
102
  });
117
- test('commits only latest width after delivery between two quiet frames', () => {
103
+ test('commits only latest width after resize settles', () => {
104
+ jest.useFakeTimers();
118
105
  const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
119
106
  (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
120
107
  react_1.default.createElement("div", { key: "item" })));
121
108
  const rendersBeforeResize = renderSpy.mock.calls.length;
122
109
  (0, react_2.act)(() => {
123
110
  emitResize(900);
124
- runAnimationFrame();
111
+ jest.advanceTimersByTime(100);
125
112
  emitResize(1000);
126
113
  });
127
114
  expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
128
115
  (0, react_2.act)(() => {
129
- runAnimationFrame();
116
+ jest.advanceTimersByTime(149);
130
117
  });
131
118
  expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
132
119
  (0, react_2.act)(() => {
133
- runAnimationFrame();
120
+ jest.advanceTimersByTime(1);
134
121
  });
135
122
  expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize + 1);
136
123
  expect(renderSpy.mock.instances.at(-1).props.width).toBe(1000);
137
124
  renderSpy.mockRestore();
138
125
  });
139
- test('cancels second quiet frame on unmount', () => {
126
+ test('cancels settled width commit on unmount', () => {
127
+ jest.useFakeTimers();
140
128
  const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
141
129
  const { unmount } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
142
130
  react_1.default.createElement("div", { key: "item" })));
143
131
  const rendersBeforeResize = renderSpy.mock.calls.length;
144
132
  (0, react_2.act)(() => {
145
133
  emitResize(900);
146
- runAnimationFrame();
134
+ jest.advanceTimersByTime(100);
147
135
  });
148
136
  expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
137
+ expect(jest.getTimerCount()).toBe(1);
149
138
  unmount();
150
- expect(window.cancelAnimationFrame).toHaveBeenLastCalledWith(2);
139
+ expect(jest.getTimerCount()).toBe(0);
151
140
  (0, react_2.act)(() => {
152
- runAnimationFrame();
141
+ jest.advanceTimersByTime(150);
153
142
  });
154
143
  expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
155
144
  renderSpy.mockRestore();
@@ -1 +1 @@
1
- {"version":3,"file":"passive-resize.test.js","sourceRoot":"../../../../../src","sources":["components/GridLayout/__tests__/passive-resize.test.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jest-environment jsdom */\n\nimport React from 'react';\n\nimport {act, fireEvent, render} from '@testing-library/react';\nimport ReactGridLayout from 'react-grid-layout';\n\nimport type {ConfigItem} from '../../../shared';\nimport GridItem, {GridItem as GridItemComponent} from '../../GridItem/GridItem';\nimport {Layout} from '../ReactGridLayout';\n\njest.mock('../../Item/Item', () => ({\n __esModule: true,\n default: () => null,\n}));\n\ntype ResizeObserverCallback = (entries: ResizeObserverEntry[]) => void;\n\nconst resizeObservers: TestResizeObserver[] = [];\nconst mockPolyfillObservers: TestResizeObserver[] = [];\nconst animationFrameCallbacks = new Map<number, FrameRequestCallback>();\nlet animationFrameId = 0;\n\njest.mock('resize-observer-polyfill', () => ({\n __esModule: true,\n default: class {\n readonly callback: ResizeObserverCallback;\n disconnect = jest.fn();\n elements = new Set<Element>();\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n mockPolyfillObservers.push(this as unknown as TestResizeObserver);\n }\n\n observe = (element: Element) => {\n this.elements.add(element);\n };\n\n unobserve = (element: Element) => {\n this.elements.delete(element);\n };\n },\n}));\n\nclass TestResizeObserver {\n readonly callback: ResizeObserverCallback;\n disconnect = jest.fn();\n elements = new Set<Element>();\n\n unobserve = jest.fn((element: Element) => {\n this.elements.delete(element);\n });\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n resizeObservers.push(this);\n }\n\n observe(element: Element) {\n this.elements.add(element);\n }\n}\n\nconst emitResize = (width: number) => {\n resizeObservers.forEach((observer) => {\n observer.elements.forEach((element) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n });\n};\n\nconst emitResizeFor = (element: Element, width: number) => {\n resizeObservers\n .filter((observer) => observer.elements.has(element))\n .forEach((observer) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n};\n\nconst emitPolyfillResizeFor = (element: Element, width: number) => {\n mockPolyfillObservers\n .filter((observer) => observer.elements.has(element))\n .forEach((observer) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n};\n\nconst runAnimationFrame = () => {\n const callbacks = Array.from(animationFrameCallbacks.values());\n animationFrameCallbacks.clear();\n callbacks.forEach((callback) => callback(0));\n};\n\nconst gridItem = (\n <GridItem\n adjustWidgetLayout={jest.fn()}\n id=\"item\"\n item={{data: {}} as ConfigItem}\n key=\"item\"\n layout={[]}\n />\n);\n\ndescribe('Layout passive resize', () => {\n beforeEach(() => {\n resizeObservers.length = 0;\n mockPolyfillObservers.length = 0;\n animationFrameCallbacks.clear();\n animationFrameId = 0;\n global.ResizeObserver = TestResizeObserver as unknown as typeof ResizeObserver;\n window.requestAnimationFrame = jest.fn((callback) => {\n animationFrameId += 1;\n animationFrameCallbacks.set(animationFrameId, callback);\n return animationFrameId;\n });\n window.cancelAnimationFrame = jest.fn((frame) => {\n animationFrameCallbacks.delete(frame);\n });\n });\n\n test('does not render ReactGridLayout for passive container resize', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n\n const {container} = render(\n <Layout cols={12} layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]} rowHeight={100}>\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n fireEvent.pointerDown(container.firstElementChild as HTMLElement);\n });\n\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n renderSpy.mockRestore();\n });\n\n test.each([undefined, null] as const)(\n 'uses polyfill when native ResizeObserver is %p',\n (resizeObserver) => {\n global.ResizeObserver = resizeObserver as unknown as typeof ResizeObserver;\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n expect(mockPolyfillObservers[0].elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n emitPolyfillResizeFor(layout as HTMLElement, 900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n },\n );\n\n test('commits only latest width after delivery between two quiet frames', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n runAnimationFrame();\n emitResize(1000);\n });\n\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n act(() => {\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n act(() => {\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize + 1);\n expect((renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout).props.width).toBe(\n 1000,\n );\n renderSpy.mockRestore();\n });\n\n test('cancels second quiet frame on unmount', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {unmount} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n\n unmount();\n expect(window.cancelAnimationFrame).toHaveBeenLastCalledWith(2);\n act(() => {\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n renderSpy.mockRestore();\n });\n\n test('keeps distinct view item geometry after passive resize', () => {\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 3, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n <div key=\"first\" />\n <div key=\"second\" />\n </Layout>,\n );\n\n act(() => {\n emitResize(1000);\n });\n\n const first = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"0\"]',\n );\n const second = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"2\"]',\n );\n expect(first?.style.transform).toBe('translate(10px,10px)');\n expect(first?.style.width).toBe('73px');\n expect(second?.style.transform).toBe('translate(175px,10px)');\n expect(second?.style.width).toBe('238px');\n });\n\n test('forwards transform mode through GridItem and uses transforms by default', () => {\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n {gridItem}\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n act(() => {\n emitResize(900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.dataset.dashkitGridUseCssTransforms).toBe('true');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n expect(item?.style.left).toBe('');\n expect(item?.style.top).toBe('');\n });\n\n test('switches to top and left without stale transform when CSS transforms are disabled', () => {\n const {container, rerender} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n {gridItem}\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n act(() => {\n emitResize(900);\n });\n rerender(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n useCSSTransforms={false}\n >\n {gridItem}\n </Layout>,\n );\n act(() => {\n emitResize(1000);\n });\n\n expect(item?.dataset.dashkitGridUseCssTransforms).toBe('false');\n expect(item?.style.width).toBe('238px');\n expect(item?.style.left).toBe('175px');\n expect(item?.style.top).toBe('10px');\n expect(item?.style.transform).toBe('');\n });\n\n test('resizes only direct grid items when layouts are nested', () => {\n const {container, getByTestId} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'outer', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div data-testid=\"outer-item\" key=\"outer\">\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'inner', w: 2, x: 1, y: 0}]}\n rowHeight={100}\n >\n <div data-testid=\"inner-item\" key=\"inner\" />\n </Layout>\n </div>\n </Layout>,\n );\n const layouts = container.querySelectorAll('.react-grid-layout');\n const outerItem = getByTestId('outer-item');\n const innerItem = getByTestId('inner-item');\n\n act(() => {\n emitResizeFor(layouts[1], 500);\n });\n const innerWidth = innerItem.style.width;\n const innerTransform = innerItem.style.transform;\n expect(innerWidth).toBe('72px');\n expect(innerTransform).toBe('translate(51px,10px)');\n\n act(() => {\n emitResizeFor(layouts[0], 1000);\n });\n\n expect(outerItem.style.width).toBe('238px');\n expect(innerItem.style.width).toBe(innerWidth);\n expect(innerItem.style.transform).toBe(innerTransform);\n });\n\n test('updates editable idle geometry and refreshes RGL width before interaction', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-cols]',\n );\n\n act(() => {\n emitResize(900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n\n item?.classList.add('react-draggable-dragging');\n act(() => {\n emitResize(1000);\n });\n expect(item?.style.width).toBe('213px');\n item?.classList.remove('react-draggable-dragging');\n\n act(() => {\n fireEvent.pointerDown(item as HTMLElement);\n });\n\n const lastRenderInstance = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n expect(lastRenderInstance.props.width).toBe(1000);\n renderSpy.mockRestore();\n });\n\n test('syncs RGL width before native and shared drag-over after passive resize', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const dragStateRef = {current: {isDragging: true, sourceGroup: 'source'}};\n const widths = [900, 1000];\n const onDropDragOver = jest.fn(() => {\n const instance = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n\n expect(instance.props.width).toBe(widths[onDropDragOver.mock.calls.length - 1]);\n return {};\n });\n const {container} = render(\n <Layout\n cols={12}\n dragStateRef={dragStateRef}\n group=\"target\"\n isDroppable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n onDropDragOver={onDropDragOver}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 900);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n\n act(() => {\n fireEvent.dragOver(layout as HTMLElement, {clientX: 100, clientY: 100});\n });\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 1000);\n });\n const rendersBeforeSharedDragOver = renderSpy.mock.calls.length;\n\n act(() => {\n fireEvent.mouseEnter(layout as HTMLElement);\n fireEvent.mouseMove(layout as HTMLElement, {clientX: 100, clientY: 100});\n });\n\n expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforeSharedDragOver);\n expect(onDropDragOver).toHaveBeenCalledTimes(2);\n renderSpy.mockRestore();\n });\n\n test('refreshes the outer-item cache when the layout children change', () => {\n const {container, rerender} = render(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[{h: 1, i: 'first', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"first\" />\n </Layout>,\n );\n\n act(() => {\n emitResize(900);\n });\n rerender(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 2, x: 1, y: 0},\n ]}\n rowHeight={100}\n >\n <div key=\"first\" />\n <div key=\"second\" />\n </Layout>,\n );\n\n const second = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"1\"]',\n );\n expect(second?.style.width).toBe('138px');\n expect(second?.style.transform).toBe('translate(84px,10px)');\n });\n\n test('measures after mount, accepts a visible width after zero and disconnects observer', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container, unmount} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n\n const initialRender = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n expect(initialRender.props.width).toBe(0);\n act(() => {\n emitResize(900);\n });\n expect(\n container.querySelector<HTMLElement>('.react-grid-item[data-dashkit-grid-cols]')?.style\n .width,\n ).toBe('64px');\n\n unmount();\n expect(resizeObservers[0].disconnect).toHaveBeenCalledTimes(1);\n renderSpy.mockRestore();\n });\n\n test('keeps WidthProvider placeholder class names', () => {\n render(\n <Layout\n className=\"custom-layout\"\n cols={12}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n\n expect(resizeObservers[0].unobserve.mock.calls[0][0].className).toBe(\n 'custom-layout react-grid-layout',\n );\n });\n\n test('moves observer and pointer listener from measurement placeholder to grid root', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const placeholder = resizeObservers[0].unobserve.mock.calls[0][0] as HTMLElement;\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n const rendersBeforeSync = renderSpy.mock.calls.length;\n const widthBeforeOldTargetDelivery = item?.style.width;\n\n expect(resizeObservers[0].elements.has(placeholder)).toBe(false);\n expect(resizeObservers[0].elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n resizeObservers[0].callback([\n {contentRect: {width: 700}, target: placeholder} as unknown as ResizeObserverEntry,\n ]);\n });\n expect(item?.style.width).toBe(widthBeforeOldTargetDelivery);\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 900);\n });\n expect(item?.style.width).toBe('213px');\n\n fireEvent.pointerDown(placeholder);\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync);\n fireEvent.pointerDown(layout as HTMLElement);\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync + 1);\n renderSpy.mockRestore();\n });\n\n test('installs and removes drag-over listeners on grid root', () => {\n const addEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener');\n const removeEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener');\n const {container, unmount} = render(\n <Layout cols={12} layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]} rowHeight={100}>\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const dragEventNames = ['mouseup', 'mouseenter', 'mouseleave', 'mousemove'];\n const callsOnLayout = (spy: jest.SpyInstance) =>\n spy.mock.calls.filter(\n ([eventName], index) =>\n spy.mock.contexts[index] === layout && dragEventNames.includes(eventName),\n );\n\n expect(callsOnLayout(addEventListenerSpy)).toHaveLength(dragEventNames.length);\n\n unmount();\n\n expect(callsOnLayout(removeEventListenerSpy)).toHaveLength(dragEventNames.length);\n addEventListenerSpy.mockRestore();\n removeEventListenerSpy.mockRestore();\n });\n\n test('re-observes grid root and restores pointerdown after StrictMode remount', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <React.StrictMode>\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>\n </React.StrictMode>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const currentObserver = resizeObservers.at(-1) as TestResizeObserver;\n\n expect(resizeObservers).toHaveLength(2);\n expect(currentObserver.elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n currentObserver.callback([\n {contentRect: {width: 900}, target: layout} as unknown as ResizeObserverEntry,\n ]);\n });\n const rendersBeforePointerDown = renderSpy.mock.calls.length;\n\n fireEvent.pointerDown(layout as HTMLElement);\n\n expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforePointerDown);\n renderSpy.mockRestore();\n });\n\n test('keeps unchanged GridItem child clone during another item layout update', () => {\n const renderSpy = jest.spyOn(GridItemComponent.prototype, 'render');\n const first = <GridItem {...gridItem.props} id=\"first\" key=\"first\" />;\n const second = <GridItem {...gridItem.props} id=\"second\" key=\"second\" />;\n const {container, rerender} = render(\n <Layout\n cols={12}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 1, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n {first}\n {second}\n </Layout>,\n );\n const secondRenders = renderSpy.mock.instances.filter(\n (instance) => instance.props.id === 'second',\n ).length;\n\n rerender(\n <Layout\n cols={12}\n layout={[\n {h: 1, i: 'first', w: 1, x: 1, y: 0},\n {h: 1, i: 'second', w: 1, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n {first}\n {second}\n </Layout>,\n );\n\n expect(\n renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length,\n ).toBe(secondRenders);\n expect(\n container.querySelector<HTMLElement>('.react-grid-item[data-dashkit-grid-x=\"1\"]'),\n ).not.toBeNull();\n renderSpy.mockRestore();\n });\n});\n"]}
1
+ {"version":3,"file":"passive-resize.test.js","sourceRoot":"../../../../../src","sources":["components/GridLayout/__tests__/passive-resize.test.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jest-environment jsdom */\n\nimport React from 'react';\n\nimport {act, fireEvent, render} from '@testing-library/react';\nimport ReactGridLayout from 'react-grid-layout';\n\nimport type {ConfigItem} from '../../../shared';\nimport GridItem, {GridItem as GridItemComponent} from '../../GridItem/GridItem';\nimport {Layout} from '../ReactGridLayout';\n\njest.mock('../../Item/Item', () => ({\n __esModule: true,\n default: () => null,\n}));\n\ntype ResizeObserverCallback = (entries: ResizeObserverEntry[]) => void;\n\nconst resizeObservers: TestResizeObserver[] = [];\nconst mockPolyfillObservers: TestResizeObserver[] = [];\n\njest.mock('resize-observer-polyfill', () => ({\n __esModule: true,\n default: class {\n readonly callback: ResizeObserverCallback;\n disconnect = jest.fn();\n elements = new Set<Element>();\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n mockPolyfillObservers.push(this as unknown as TestResizeObserver);\n }\n\n observe = (element: Element) => {\n this.elements.add(element);\n };\n\n unobserve = (element: Element) => {\n this.elements.delete(element);\n };\n },\n}));\n\nclass TestResizeObserver {\n readonly callback: ResizeObserverCallback;\n disconnect = jest.fn();\n elements = new Set<Element>();\n\n unobserve = jest.fn((element: Element) => {\n this.elements.delete(element);\n });\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n resizeObservers.push(this);\n }\n\n observe(element: Element) {\n this.elements.add(element);\n }\n}\n\nconst emitResize = (width: number) => {\n resizeObservers.forEach((observer) => {\n observer.elements.forEach((element) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n });\n};\n\nconst emitResizeFor = (element: Element, width: number) => {\n resizeObservers\n .filter((observer) => observer.elements.has(element))\n .forEach((observer) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n};\n\nconst emitPolyfillResizeFor = (element: Element, width: number) => {\n mockPolyfillObservers\n .filter((observer) => observer.elements.has(element))\n .forEach((observer) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n};\n\nconst gridItem = (\n <GridItem\n adjustWidgetLayout={jest.fn()}\n id=\"item\"\n item={{data: {}} as ConfigItem}\n key=\"item\"\n layout={[]}\n />\n);\n\ndescribe('Layout passive resize', () => {\n beforeEach(() => {\n resizeObservers.length = 0;\n mockPolyfillObservers.length = 0;\n global.ResizeObserver = TestResizeObserver as unknown as typeof ResizeObserver;\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n test('does not render ReactGridLayout for passive container resize', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n\n const {container} = render(\n <Layout cols={12} layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]} rowHeight={100}>\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n fireEvent.pointerDown(container.firstElementChild as HTMLElement);\n });\n\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n renderSpy.mockRestore();\n });\n\n test.each([undefined, null] as const)(\n 'uses polyfill when native ResizeObserver is %p',\n (resizeObserver) => {\n global.ResizeObserver = resizeObserver as unknown as typeof ResizeObserver;\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n expect(mockPolyfillObservers[0].elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n emitPolyfillResizeFor(layout as HTMLElement, 900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n },\n );\n\n test('commits only latest width after resize settles', () => {\n jest.useFakeTimers();\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n jest.advanceTimersByTime(100);\n emitResize(1000);\n });\n\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n act(() => {\n jest.advanceTimersByTime(149);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n act(() => {\n jest.advanceTimersByTime(1);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize + 1);\n expect((renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout).props.width).toBe(\n 1000,\n );\n renderSpy.mockRestore();\n });\n\n test('cancels settled width commit on unmount', () => {\n jest.useFakeTimers();\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {unmount} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n jest.advanceTimersByTime(100);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n expect(jest.getTimerCount()).toBe(1);\n\n unmount();\n expect(jest.getTimerCount()).toBe(0);\n act(() => {\n jest.advanceTimersByTime(150);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n renderSpy.mockRestore();\n });\n\n test('keeps distinct view item geometry after passive resize', () => {\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 3, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n <div key=\"first\" />\n <div key=\"second\" />\n </Layout>,\n );\n\n act(() => {\n emitResize(1000);\n });\n\n const first = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"0\"]',\n );\n const second = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"2\"]',\n );\n expect(first?.style.transform).toBe('translate(10px,10px)');\n expect(first?.style.width).toBe('73px');\n expect(second?.style.transform).toBe('translate(175px,10px)');\n expect(second?.style.width).toBe('238px');\n });\n\n test('forwards transform mode through GridItem and uses transforms by default', () => {\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n {gridItem}\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n act(() => {\n emitResize(900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.dataset.dashkitGridUseCssTransforms).toBe('true');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n expect(item?.style.left).toBe('');\n expect(item?.style.top).toBe('');\n });\n\n test('switches to top and left without stale transform when CSS transforms are disabled', () => {\n const {container, rerender} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n {gridItem}\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n act(() => {\n emitResize(900);\n });\n rerender(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n useCSSTransforms={false}\n >\n {gridItem}\n </Layout>,\n );\n act(() => {\n emitResize(1000);\n });\n\n expect(item?.dataset.dashkitGridUseCssTransforms).toBe('false');\n expect(item?.style.width).toBe('238px');\n expect(item?.style.left).toBe('175px');\n expect(item?.style.top).toBe('10px');\n expect(item?.style.transform).toBe('');\n });\n\n test('resizes only direct grid items when layouts are nested', () => {\n const {container, getByTestId} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'outer', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div data-testid=\"outer-item\" key=\"outer\">\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'inner', w: 2, x: 1, y: 0}]}\n rowHeight={100}\n >\n <div data-testid=\"inner-item\" key=\"inner\" />\n </Layout>\n </div>\n </Layout>,\n );\n const layouts = container.querySelectorAll('.react-grid-layout');\n const outerItem = getByTestId('outer-item');\n const innerItem = getByTestId('inner-item');\n\n act(() => {\n emitResizeFor(layouts[1], 500);\n });\n const innerWidth = innerItem.style.width;\n const innerTransform = innerItem.style.transform;\n expect(innerWidth).toBe('72px');\n expect(innerTransform).toBe('translate(51px,10px)');\n\n act(() => {\n emitResizeFor(layouts[0], 1000);\n });\n\n expect(outerItem.style.width).toBe('238px');\n expect(innerItem.style.width).toBe(innerWidth);\n expect(innerItem.style.transform).toBe(innerTransform);\n });\n\n test('updates editable idle geometry and refreshes RGL width before interaction', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-cols]',\n );\n\n act(() => {\n emitResize(900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n\n item?.classList.add('react-draggable-dragging');\n act(() => {\n emitResize(1000);\n });\n expect(item?.style.width).toBe('213px');\n item?.classList.remove('react-draggable-dragging');\n\n act(() => {\n fireEvent.pointerDown(item as HTMLElement);\n });\n\n const lastRenderInstance = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n expect(lastRenderInstance.props.width).toBe(1000);\n renderSpy.mockRestore();\n });\n\n test('syncs RGL width before native and shared drag-over after passive resize', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const dragStateRef = {current: {isDragging: true, sourceGroup: 'source'}};\n const widths = [900, 1000];\n const onDropDragOver = jest.fn(() => {\n const instance = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n\n expect(instance.props.width).toBe(widths[onDropDragOver.mock.calls.length - 1]);\n return {};\n });\n const {container} = render(\n <Layout\n cols={12}\n dragStateRef={dragStateRef}\n group=\"target\"\n isDroppable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n onDropDragOver={onDropDragOver}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 900);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n\n act(() => {\n fireEvent.dragOver(layout as HTMLElement, {clientX: 100, clientY: 100});\n });\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 1000);\n });\n const rendersBeforeSharedDragOver = renderSpy.mock.calls.length;\n\n act(() => {\n fireEvent.mouseEnter(layout as HTMLElement);\n fireEvent.mouseMove(layout as HTMLElement, {clientX: 100, clientY: 100});\n });\n\n expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforeSharedDragOver);\n expect(onDropDragOver).toHaveBeenCalledTimes(2);\n renderSpy.mockRestore();\n });\n\n test('refreshes the outer-item cache when the layout children change', () => {\n const {container, rerender} = render(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[{h: 1, i: 'first', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"first\" />\n </Layout>,\n );\n\n act(() => {\n emitResize(900);\n });\n rerender(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 2, x: 1, y: 0},\n ]}\n rowHeight={100}\n >\n <div key=\"first\" />\n <div key=\"second\" />\n </Layout>,\n );\n\n const second = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"1\"]',\n );\n expect(second?.style.width).toBe('138px');\n expect(second?.style.transform).toBe('translate(84px,10px)');\n });\n\n test('measures after mount, accepts a visible width after zero and disconnects observer', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container, unmount} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n\n const initialRender = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n expect(initialRender.props.width).toBe(0);\n act(() => {\n emitResize(900);\n });\n expect(\n container.querySelector<HTMLElement>('.react-grid-item[data-dashkit-grid-cols]')?.style\n .width,\n ).toBe('64px');\n\n unmount();\n expect(resizeObservers[0].disconnect).toHaveBeenCalledTimes(1);\n renderSpy.mockRestore();\n });\n\n test('keeps WidthProvider placeholder class names', () => {\n render(\n <Layout\n className=\"custom-layout\"\n cols={12}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n\n expect(resizeObservers[0].unobserve.mock.calls[0][0].className).toBe(\n 'custom-layout react-grid-layout',\n );\n });\n\n test('moves observer and pointer listener from measurement placeholder to grid root', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const placeholder = resizeObservers[0].unobserve.mock.calls[0][0] as HTMLElement;\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n const rendersBeforeSync = renderSpy.mock.calls.length;\n const widthBeforeOldTargetDelivery = item?.style.width;\n\n expect(resizeObservers[0].elements.has(placeholder)).toBe(false);\n expect(resizeObservers[0].elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n resizeObservers[0].callback([\n {contentRect: {width: 700}, target: placeholder} as unknown as ResizeObserverEntry,\n ]);\n });\n expect(item?.style.width).toBe(widthBeforeOldTargetDelivery);\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 900);\n });\n expect(item?.style.width).toBe('213px');\n\n fireEvent.pointerDown(placeholder);\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync);\n fireEvent.pointerDown(layout as HTMLElement);\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync + 1);\n renderSpy.mockRestore();\n });\n\n test('installs and removes drag-over listeners on grid root', () => {\n const addEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener');\n const removeEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener');\n const {container, unmount} = render(\n <Layout cols={12} layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]} rowHeight={100}>\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const dragEventNames = ['mouseup', 'mouseenter', 'mouseleave', 'mousemove'];\n const callsOnLayout = (spy: jest.SpyInstance) =>\n spy.mock.calls.filter(\n ([eventName], index) =>\n spy.mock.contexts[index] === layout && dragEventNames.includes(eventName),\n );\n\n expect(callsOnLayout(addEventListenerSpy)).toHaveLength(dragEventNames.length);\n\n unmount();\n\n expect(callsOnLayout(removeEventListenerSpy)).toHaveLength(dragEventNames.length);\n addEventListenerSpy.mockRestore();\n removeEventListenerSpy.mockRestore();\n });\n\n test('re-observes grid root and restores pointerdown after StrictMode remount', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <React.StrictMode>\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>\n </React.StrictMode>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const currentObserver = resizeObservers.at(-1) as TestResizeObserver;\n\n expect(resizeObservers).toHaveLength(2);\n expect(currentObserver.elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n currentObserver.callback([\n {contentRect: {width: 900}, target: layout} as unknown as ResizeObserverEntry,\n ]);\n });\n const rendersBeforePointerDown = renderSpy.mock.calls.length;\n\n fireEvent.pointerDown(layout as HTMLElement);\n\n expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforePointerDown);\n renderSpy.mockRestore();\n });\n\n test('keeps unchanged GridItem child clone during another item layout update', () => {\n const renderSpy = jest.spyOn(GridItemComponent.prototype, 'render');\n const first = <GridItem {...gridItem.props} id=\"first\" key=\"first\" />;\n const second = <GridItem {...gridItem.props} id=\"second\" key=\"second\" />;\n const {container, rerender} = render(\n <Layout\n cols={12}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 1, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n {first}\n {second}\n </Layout>,\n );\n const secondRenders = renderSpy.mock.instances.filter(\n (instance) => instance.props.id === 'second',\n ).length;\n\n rerender(\n <Layout\n cols={12}\n layout={[\n {h: 1, i: 'first', w: 1, x: 1, y: 0},\n {h: 1, i: 'second', w: 1, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n {first}\n {second}\n </Layout>,\n );\n\n expect(\n renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length,\n ).toBe(secondRenders);\n expect(\n container.querySelector<HTMLElement>('.react-grid-item[data-dashkit-grid-x=\"1\"]'),\n ).not.toBeNull();\n renderSpy.mockRestore();\n });\n});\n"]}
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import type { DraggedOverItem, ItemDragProps } from "../shared/types/index.js";
3
3
  export type DashKitDnDCtxShape = {
4
4
  dragProps: ItemDragProps | null;
5
- dragImagePreview: HTMLImageElement;
5
+ dragImagePreview: HTMLImageElement | null;
6
6
  onDragStart: (e: React.DragEvent<Element>, itemDragProps: ItemDragProps) => void;
7
7
  onDragEnd: (e: React.DragEvent<Element>) => void;
8
8
  onDropDragOver?: (draggedItem: DraggedOverItem, sharedItem: DraggedOverItem | null) => void | boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"DashKitDnDContext.js","sourceRoot":"../../../src","sources":["context/DashKitDnDContext.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAeb,QAAA,iBAAiB,GAAG,eAAK,CAAC,aAAa,CAA4B,SAAS,CAAC,CAAC","sourcesContent":["import React from 'react';\n\nimport type {DraggedOverItem, ItemDragProps} from '../shared/types';\n\nexport type DashKitDnDCtxShape = {\n dragProps: ItemDragProps | null;\n dragImagePreview: HTMLImageElement;\n onDragStart: (e: React.DragEvent<Element>, itemDragProps: ItemDragProps) => void;\n onDragEnd: (e: React.DragEvent<Element>) => void;\n onDropDragOver?: (\n draggedItem: DraggedOverItem,\n sharedItem: DraggedOverItem | null,\n ) => void | boolean;\n};\n\nexport const DashKitDnDContext = React.createContext<DashKitDnDCtxShape | void>(undefined);\n"]}
1
+ {"version":3,"file":"DashKitDnDContext.js","sourceRoot":"../../../src","sources":["context/DashKitDnDContext.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAeb,QAAA,iBAAiB,GAAG,eAAK,CAAC,aAAa,CAA4B,SAAS,CAAC,CAAC","sourcesContent":["import React from 'react';\n\nimport type {DraggedOverItem, ItemDragProps} from '../shared/types';\n\nexport type DashKitDnDCtxShape = {\n dragProps: ItemDragProps | null;\n dragImagePreview: HTMLImageElement | null;\n onDragStart: (e: React.DragEvent<Element>, itemDragProps: ItemDragProps) => void;\n onDragEnd: (e: React.DragEvent<Element>) => void;\n onDropDragOver?: (\n draggedItem: DraggedOverItem,\n sharedItem: DraggedOverItem | null,\n ) => void | boolean;\n};\n\nexport const DashKitDnDContext = React.createContext<DashKitDnDCtxShape | void>(undefined);\n"]}
@@ -0,0 +1,2 @@
1
+ /** @jest-environment jsdom */
2
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /** @jest-environment jsdom */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const react_2 = require("@testing-library/react");
7
+ const ActionPanel_1 = require("../../components/ActionPanel/ActionPanel.js");
8
+ const DashKitDnDWrapper_1 = require("../../components/DashKitDnDWrapper/DashKitDnDWrapper.js");
9
+ const item = { id: 'chart', title: 'Chart', icon: 'icon', dragProps: { type: 'chart' } };
10
+ describe('ActionPanel drag preview', () => {
11
+ it('captures the solid item before disabling the panel source and restores it on drag end', () => {
12
+ jest.useFakeTimers();
13
+ const onDragStart = jest.fn();
14
+ const onDragEnd = jest.fn();
15
+ const setDragImage = jest.fn();
16
+ (0, react_2.render)(react_1.default.createElement(DashKitDnDWrapper_1.DashKitDnDWrapper, { onDragStart: onDragStart, onDragEnd: onDragEnd },
17
+ react_1.default.createElement(ActionPanel_1.ActionPanel, { items: [item] })));
18
+ const source = react_2.screen.getByRole('button', { name: /Chart/ });
19
+ const disabledSourceClassName = 'dashkit-action-panel__item_dragging-source-disabled';
20
+ setDragImage.mockImplementation(() => {
21
+ expect(source.classList.contains('dashkit-action-panel__item_dragging')).toBe(true);
22
+ expect(source.classList.contains(disabledSourceClassName)).toBe(false);
23
+ });
24
+ react_2.fireEvent.dragStart(source, { dataTransfer: { setDragImage } });
25
+ expect(setDragImage).toHaveBeenCalledWith(source, 0, 0);
26
+ expect(onDragStart).toHaveBeenCalledWith(item.dragProps);
27
+ (0, react_2.act)(() => jest.runOnlyPendingTimers());
28
+ expect(source.classList.contains(disabledSourceClassName)).toBe(true);
29
+ react_2.fireEvent.dragEnd(source);
30
+ expect(source.classList.contains('dashkit-action-panel__item_dragging')).toBe(false);
31
+ expect(source.classList.contains(disabledSourceClassName)).toBe(false);
32
+ expect(onDragEnd).toHaveBeenCalledTimes(1);
33
+ jest.useRealTimers();
34
+ });
35
+ it('respects a custom drag image', () => {
36
+ const setDragImage = jest.fn();
37
+ (0, react_2.render)(react_1.default.createElement(DashKitDnDWrapper_1.DashKitDnDWrapper, { dragImageSrc: "data:image/png;base64,AAAA" },
38
+ react_1.default.createElement(ActionPanel_1.ActionPanel, { items: [item] })));
39
+ react_2.fireEvent.dragStart(react_2.screen.getByRole('button', { name: /Chart/ }), {
40
+ dataTransfer: { setDragImage },
41
+ });
42
+ expect(setDragImage.mock.calls[0][0]).toBeInstanceOf(HTMLImageElement);
43
+ });
44
+ });
45
+ //# sourceMappingURL=useDnDItemProps.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDnDItemProps.test.js","sourceRoot":"../../../../src","sources":["hooks/__tests__/useDnDItemProps.test.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jest-environment jsdom */\n\nimport React from 'react';\n\nimport {act, fireEvent, render, screen} from '@testing-library/react';\n\nimport {ActionPanel} from '../../components/ActionPanel/ActionPanel';\nimport {DashKitDnDWrapper} from '../../components/DashKitDnDWrapper/DashKitDnDWrapper';\n\nconst item = {id: 'chart', title: 'Chart', icon: 'icon', dragProps: {type: 'chart'}};\n\ndescribe('ActionPanel drag preview', () => {\n it('captures the solid item before disabling the panel source and restores it on drag end', () => {\n jest.useFakeTimers();\n const onDragStart = jest.fn();\n const onDragEnd = jest.fn();\n const setDragImage = jest.fn();\n\n render(\n <DashKitDnDWrapper onDragStart={onDragStart} onDragEnd={onDragEnd}>\n <ActionPanel items={[item]} />\n </DashKitDnDWrapper>,\n );\n const source = screen.getByRole('button', {name: /Chart/});\n const disabledSourceClassName = 'dashkit-action-panel__item_dragging-source-disabled';\n\n setDragImage.mockImplementation(() => {\n expect(source.classList.contains('dashkit-action-panel__item_dragging')).toBe(true);\n expect(source.classList.contains(disabledSourceClassName)).toBe(false);\n });\n fireEvent.dragStart(source, {dataTransfer: {setDragImage}});\n expect(setDragImage).toHaveBeenCalledWith(source, 0, 0);\n expect(onDragStart).toHaveBeenCalledWith(item.dragProps);\n act(() => jest.runOnlyPendingTimers());\n expect(source.classList.contains(disabledSourceClassName)).toBe(true);\n\n fireEvent.dragEnd(source);\n expect(source.classList.contains('dashkit-action-panel__item_dragging')).toBe(false);\n expect(source.classList.contains(disabledSourceClassName)).toBe(false);\n expect(onDragEnd).toHaveBeenCalledTimes(1);\n jest.useRealTimers();\n });\n\n it('respects a custom drag image', () => {\n const setDragImage = jest.fn();\n render(\n <DashKitDnDWrapper dragImageSrc=\"data:image/png;base64,AAAA\">\n <ActionPanel items={[item]} />\n </DashKitDnDWrapper>,\n );\n\n fireEvent.dragStart(screen.getByRole('button', {name: /Chart/}), {\n dataTransfer: {setDragImage},\n });\n expect(setDragImage.mock.calls[0][0]).toBeInstanceOf(HTMLImageElement);\n });\n});\n"]}
@@ -9,7 +9,7 @@ const useDnDItemProps = (item) => {
9
9
  const onDragStart = react_1.default.useCallback((e) => {
10
10
  if (dragContext && item.dragProps) {
11
11
  dragContext.onDragStart(e, item.dragProps);
12
- e.dataTransfer.setDragImage(dragContext.dragImagePreview, 0, 0);
12
+ e.dataTransfer.setDragImage(dragContext.dragImagePreview || e.currentTarget, 0, 0);
13
13
  }
14
14
  }, [dragContext, item.dragProps]);
15
15
  const onDragEnd = react_1.default.useCallback((e) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useDnDItemProps.js","sourceRoot":"../../../src","sources":["hooks/useDnDItemProps.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAG1B,iDAA6C;AAStC,MAAM,eAAe,GAAG,CAAC,IAAqB,EAAY,EAAE;IAC/D,MAAM,WAAW,GAAG,eAAK,CAAC,UAAU,CAAC,2BAAiB,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,eAAK,CAAC,WAAW,CACjC,CAAC,CAAkB,EAAE,EAAE;QACnB,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACL,CAAC,EACD,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAChC,CAAC;IAEF,MAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CAC/B,CAAC,CAAC,EAAE,EAAE;QACF,IAAI,WAAW,EAAE,CAAC;YACd,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO;YACH,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,IAAI;YAClB,WAAW;YACX,SAAS;SACZ,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAhCW,QAAA,eAAe,mBAgC1B","sourcesContent":["import React from 'react';\n\nimport {ActionPanelItem} from '../components';\nimport {DashKitDnDContext} from '../context';\n\ntype DndProps = null | {\n draggable: true;\n unselectable: 'on';\n onDragStart: React.DragEventHandler<HTMLDivElement>;\n onDragEnd: React.DragEventHandler<HTMLDivElement>;\n};\n\nexport const useDnDItemProps = (item: ActionPanelItem): DndProps => {\n const dragContext = React.useContext(DashKitDnDContext);\n\n const onDragStart = React.useCallback(\n (e: React.DragEvent) => {\n if (dragContext && item.dragProps) {\n dragContext.onDragStart(e, item.dragProps);\n e.dataTransfer.setDragImage(dragContext.dragImagePreview, 0, 0);\n }\n },\n [dragContext, item.dragProps],\n );\n\n const onDragEnd = React.useCallback<React.DragEventHandler<HTMLDivElement>>(\n (e) => {\n if (dragContext) {\n dragContext.onDragEnd(e);\n }\n },\n [dragContext],\n );\n\n if (dragContext && item.dragProps) {\n return {\n draggable: true,\n unselectable: 'on',\n onDragStart,\n onDragEnd,\n };\n }\n\n return null;\n};\n"]}
1
+ {"version":3,"file":"useDnDItemProps.js","sourceRoot":"../../../src","sources":["hooks/useDnDItemProps.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAG1B,iDAA6C;AAStC,MAAM,eAAe,GAAG,CAAC,IAAqB,EAAY,EAAE;IAC/D,MAAM,WAAW,GAAG,eAAK,CAAC,UAAU,CAAC,2BAAiB,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,eAAK,CAAC,WAAW,CACjC,CAAC,CAAkB,EAAE,EAAE;QACnB,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,gBAAgB,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;IACL,CAAC,EACD,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAChC,CAAC;IAEF,MAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CAC/B,CAAC,CAAC,EAAE,EAAE;QACF,IAAI,WAAW,EAAE,CAAC;YACd,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO;YACH,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,IAAI;YAClB,WAAW;YACX,SAAS;SACZ,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAhCW,QAAA,eAAe,mBAgC1B","sourcesContent":["import React from 'react';\n\nimport {ActionPanelItem} from '../components';\nimport {DashKitDnDContext} from '../context';\n\ntype DndProps = null | {\n draggable: true;\n unselectable: 'on';\n onDragStart: React.DragEventHandler<HTMLDivElement>;\n onDragEnd: React.DragEventHandler<HTMLDivElement>;\n};\n\nexport const useDnDItemProps = (item: ActionPanelItem): DndProps => {\n const dragContext = React.useContext(DashKitDnDContext);\n\n const onDragStart = React.useCallback(\n (e: React.DragEvent) => {\n if (dragContext && item.dragProps) {\n dragContext.onDragStart(e, item.dragProps);\n e.dataTransfer.setDragImage(dragContext.dragImagePreview || e.currentTarget, 0, 0);\n }\n },\n [dragContext, item.dragProps],\n );\n\n const onDragEnd = React.useCallback<React.DragEventHandler<HTMLDivElement>>(\n (e) => {\n if (dragContext) {\n dragContext.onDragEnd(e);\n }\n },\n [dragContext],\n );\n\n if (dragContext && item.dragProps) {\n return {\n draggable: true,\n unselectable: 'on',\n onDragStart,\n onDragEnd,\n };\n }\n\n return null;\n};\n"]}
@@ -1 +1 @@
1
- {"version":"10.4.3","type":"commonjs","sideEffects":["*.scss","*.css"]}
1
+ {"version":"10.5.0","type":"commonjs","sideEffects":["*.scss","*.css"]}
@@ -427,7 +427,7 @@ interface DashKitDnDWrapperProps {
427
427
  }
428
428
  ```
429
429
 
430
- - **dragImageSrc**: Drag image preview, by default used transparent 1px png base64
430
+ - **dragImageSrc**: Optional custom drag image. By default, the dragged ActionPanel item is shown as the preview.
431
431
  - **onDragStart**: Callback called when element is dragged from ActionPanel
432
432
  - **onDragEnd**: Callback called when element dropped or drag canceled
433
433
 
@@ -490,7 +490,9 @@ const onDrop = (dropProps: ItemDropProps) => {
490
490
  | `--dashkit-action-panel-item-color` | Backgroud color |
491
491
  | `--dashkit-action-panel-item-text-color` | Text color |
492
492
  | `--dashkit-action-panel-item-color-hover` | Hover backgroud color |
493
+ | `--dashkit-action-panel-item-color-dragging` | Drag background color |
493
494
  | `--dashkit-action-panel-item-text-color-hover` | Hover text color |
495
+ | `--dashkit-action-panel-item-text-color-dragging` | Drag text color |
494
496
  | Overlay variables | |
495
497
  | `--dashkit-overlay-border-color` | Border color |
496
498
  | `--dashkit-overlay-color` | Background color |
@@ -1,20 +1,25 @@
1
1
  .dashkit-action-panel {
2
- --_--dashkit-action-panel-color: var(--dashkit-action-panel-color, var(--g-color-base-float));
3
- --_--dashkit-action-panel-border-color: var(
4
- --dashkit-action-panel-border-color,
5
- var(--g-color-base-brand)
2
+ --_--dashkit-action-panel-color: var(
3
+ --dashkit-action-panel-color,
4
+ var(--g-color-base-float-heavy)
6
5
  );
6
+ --_--dashkit-action-panel-border-color: var(--dashkit-action-panel-border-color, transparent);
7
7
  --_--dashkit-action-panel-border-radius: var(
8
8
  --dashkit-action-panel-border-radius,
9
- var(--g-border-radius-xl)
9
+ var(--g-border-radius-2xl, 16px)
10
10
  );
11
11
  background-color: var(--_--dashkit-action-panel-color);
12
+ backdrop-filter: blur(18px);
12
13
  position: fixed;
13
14
  bottom: 20px;
14
15
  display: flex;
16
+ width: max-content;
17
+ max-width: calc(100vw - 40px);
18
+ overflow-x: auto;
15
19
  border-radius: var(--_--dashkit-action-panel-border-radius);
16
- border: 2px solid var(--_--dashkit-action-panel-border-color);
17
- padding: 8px;
20
+ outline: 2px solid var(--_--dashkit-action-panel-border-color);
21
+ outline-offset: -2px;
22
+ padding: 6px;
18
23
  gap: 0;
19
24
  left: 50%;
20
25
  transform: translateX(-50%) translateY(0);
@@ -40,46 +45,70 @@
40
45
  --_--dashkit-action-panel-item-color: var(--dashkit-action-panel-item-color, transparent);
41
46
  --_--dashkit-action-panel-item-text-color: var(
42
47
  --dashkit-action-panel-item-text-color,
43
- var(--g-color-text-primary)
48
+ var(--g-color-text-light-primary)
44
49
  );
45
50
  --_--dashkit-action-panel-item-color-hover: var(
46
51
  --dashkit-action-panel-item-color-hover,
47
- var(--g-color-base-simple-hover)
52
+ var(--g-color-base-light-simple-hover)
53
+ );
54
+ --_--dashkit-action-panel-item-color-dragging: var(
55
+ --dashkit-action-panel-item-color-dragging,
56
+ var(--g-color-base-float-heavy)
48
57
  );
49
58
  --_--dashkit-action-panel-item-text-color-hover: var(
50
59
  --dashkit-action-panel-item-text-color-hover,
51
- var(--g-color-text-primary)
60
+ var(--g-color-text-light-primary)
52
61
  );
53
- height: 68px;
54
- width: 98px;
62
+ min-height: 40px;
63
+ max-width: 200px;
64
+ flex: 0 0 auto;
55
65
  display: flex;
56
- flex-direction: column;
66
+ gap: 4px;
57
67
  justify-content: center;
58
68
  align-items: center;
59
- transition: 300ms color ease-in-out, 300ms background-color ease-in-out;
60
- border-radius: 6px;
61
- padding: 0 12px;
69
+ border-radius: var(--g-border-radius-xl);
70
+ padding: 0 16px;
62
71
  box-sizing: border-box;
63
72
  white-space: nowrap;
64
- overflow: hidden;
65
73
  background-color: var(--_--dashkit-action-panel-item-color);
66
74
  color: var(--_--dashkit-action-panel-item-text-color);
67
- will-change: color, backgroung-color;
68
- }
69
- .dashkit-action-panel__item:hover {
70
75
  cursor: pointer;
76
+ }
77
+ .dashkit-action-panel__item:hover, .dashkit-action-panel__item:focus-visible {
71
78
  background-color: var(--_--dashkit-action-panel-item-color-hover);
72
79
  color: var(--_--dashkit-action-panel-item-text-color-hover);
73
80
  }
81
+ .dashkit-action-panel__item_draggable {
82
+ transform: translate(0, 0);
83
+ cursor: grab;
84
+ }
85
+ .dashkit-action-panel__item_draggable:hover, .dashkit-action-panel__item_draggable:active {
86
+ transform: translateY(-2px);
87
+ box-shadow: 0 3px 5px rgba(0, 0, 0, 0.15);
88
+ }
89
+ .dashkit-action-panel__item_draggable:active {
90
+ cursor: grabbing;
91
+ }
92
+ .dashkit-action-panel__item_dragging, .dashkit-action-panel__item_dragging:hover {
93
+ transform: translate(0, 0);
94
+ background-color: var(--_--dashkit-action-panel-item-color-dragging);
95
+ color: var(--dashkit-action-panel-item-text-color-dragging, var(--g-color-text-light-primary));
96
+ }
97
+ .dashkit-action-panel__item_dragging-source-disabled, .dashkit-action-panel__item_dragging-source-disabled:hover {
98
+ opacity: 0.5;
99
+ box-shadow: none;
100
+ }
74
101
  .dashkit-action-panel__icon {
75
- margin-bottom: 4px;
102
+ display: flex;
103
+ flex: 0 0 auto;
104
+ align-items: center;
105
+ justify-content: center;
76
106
  }
77
107
  .dashkit-action-panel__title {
78
- font-size: 13px;
108
+ min-width: 0;
109
+ font-size: 12px;
79
110
  font-weight: 400;
80
111
  line-height: 16px;
81
- max-width: 100%;
82
- white-space: nowrap;
83
112
  overflow: hidden;
84
113
  text-overflow: ellipsis;
85
114
  }
@@ -7,7 +7,33 @@ import "./ActionPanel.css";
7
7
  const b = cn('dashkit-action-panel');
8
8
  export const ActionPanelItemContainer = ({ item }) => {
9
9
  const dndProps = useDnDItemProps(item);
10
- return (React.createElement("div", Object.assign({ role: "button", className: b('item', { draggable: Boolean(dndProps) }, item.className), onClick: item.onClick, "data-qa": item.qa }, dndProps),
10
+ const draggingClassName = `${b('item')}_dragging`;
11
+ const disabledSourceClassName = `${b('item')}_dragging-source-disabled`;
12
+ const disableSourceTimer = React.useRef(null);
13
+ React.useEffect(() => () => {
14
+ if (disableSourceTimer.current !== null) {
15
+ clearTimeout(disableSourceTimer.current);
16
+ }
17
+ }, []);
18
+ const onDragStart = (event) => {
19
+ const source = event.currentTarget;
20
+ source.classList.add(draggingClassName);
21
+ dndProps === null || dndProps === void 0 ? void 0 : dndProps.onDragStart(event);
22
+ // The native drag image captures the solid item before the panel source is disabled.
23
+ disableSourceTimer.current = setTimeout(() => {
24
+ source.classList.add(disabledSourceClassName);
25
+ disableSourceTimer.current = null;
26
+ }, 0);
27
+ };
28
+ const onDragEnd = (event) => {
29
+ if (disableSourceTimer.current !== null) {
30
+ clearTimeout(disableSourceTimer.current);
31
+ disableSourceTimer.current = null;
32
+ }
33
+ event.currentTarget.classList.remove(draggingClassName, disabledSourceClassName);
34
+ dndProps === null || dndProps === void 0 ? void 0 : dndProps.onDragEnd(event);
35
+ };
36
+ return (React.createElement("div", Object.assign({ role: "button", className: b('item', { draggable: Boolean(dndProps) }, item.className), onClick: item.onClick, "data-qa": item.qa }, dndProps, { onDragStart: dndProps ? onDragStart : undefined, onDragEnd: dndProps ? onDragEnd : undefined }),
11
37
  React.createElement("div", { className: b('icon') }, item.icon),
12
38
  React.createElement("div", { className: b('title'), title: item.title }, item.title)));
13
39
  };