diff --git a/app/javascript/mastodon/features/reaction_deck/index.tsx b/app/javascript/mastodon/features/reaction_deck/index.tsx index 0e5960d75b..ba3b731c23 100644 --- a/app/javascript/mastodon/features/reaction_deck/index.tsx +++ b/app/javascript/mastodon/features/reaction_deck/index.tsx @@ -7,6 +7,7 @@ import type { ReactNode } from 'react'; import { useState, useCallback } from 'react'; +import { createPortal } from 'react-dom'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; @@ -28,6 +29,7 @@ import { useSensors, DragOverlay, } from '@dnd-kit/core'; +import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; import { SortableContext, sortableKeyboardCoordinates, @@ -115,9 +117,8 @@ const ReactionEmoji: React.FC<{ ref={setNodeRef} style={style} {...attributes} - {...listeners} > - <span> + <span {...listeners}> <Icon id='bars' icon={MenuIcon} className='handle' /> </span> <div className='reaction_deck__emoji'> @@ -259,6 +260,7 @@ export const ReactionDeck: React.FC<{ collisionDetection={closestCenter} onDragStart={handleDragStart} onDragEnd={handleDragEnd} + modifiers={[restrictToVerticalAxis]} > <SortableContext items={deck.toArray()} strategy={rectSortingStrategy}> {deck.map((emoji: any, index) => ( @@ -274,16 +276,21 @@ export const ReactionDeck: React.FC<{ ))} </SortableContext> - <DragOverlay> - {activeId ? ( - <ReactionEmoji - emojiMap={emojiMap} - emoji={activeEmoji.get('name')} - index={-1} - overlay - /> - ) : null} - </DragOverlay> + {createPortal( + <DragOverlay> + {activeId ? ( + <div style={{ position: 'fixed' }}> + <ReactionEmoji + emojiMap={emojiMap} + emoji={activeEmoji.get('name')} + index={-1} + overlay + /> + </div> + ) : null} + </DragOverlay>, + document.body, + )} </DndContext> <div> diff --git a/package.json b/package.json index 3a437000a5..e9c024cf73 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "dependencies": { "@csstools/stylelint-formatter-github": "^1.0.0", "@dnd-kit/core": "^6.1.0", + "@dnd-kit/modifiers": "9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@formatjs/intl-pluralrules": "^5.4.4", diff --git a/yarn.lock b/yarn.lock index 3f30edb449..6d5c880101 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1710,6 +1710,19 @@ __metadata: languageName: node linkType: hard +"@dnd-kit/modifiers@npm:9.0.0": + version: 9.0.0 + resolution: "@dnd-kit/modifiers@npm:9.0.0" + dependencies: + "@dnd-kit/utilities": "npm:^3.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + "@dnd-kit/core": ^6.3.0 + react: ">=16.8.0" + checksum: 10c0/ca8cc9da8296df10774d779c1611074dc327ccc3c49041c102111c98c7f2b2b73b6af5209c0eef6b2fe978ac63dc2a985efa87c85a8d786577304bd2e64cee1d + languageName: node + linkType: hard + "@dnd-kit/sortable@npm:^10.0.0": version: 10.0.0 resolution: "@dnd-kit/sortable@npm:10.0.0" @@ -2462,6 +2475,7 @@ __metadata: dependencies: "@csstools/stylelint-formatter-github": "npm:^1.0.0" "@dnd-kit/core": "npm:^6.1.0" + "@dnd-kit/modifiers": "npm:9.0.0" "@dnd-kit/sortable": "npm:^10.0.0" "@dnd-kit/utilities": "npm:^3.2.2" "@eslint/js": "npm:^9.23.0"