From d118c61ccc759133af55480a176f9b582adf767c Mon Sep 17 00:00:00 2001 From: fruitriin Date: Wed, 3 Jun 2026 13:25:33 +0900 Subject: [PATCH 1/2] =?UTF-8?q?enhance(frontend):=20MkDraggable=20?= =?UTF-8?q?=E3=82=92=E3=82=BF=E3=83=83=E3=83=81=E6=93=8D=E4=BD=9C=20(?= =?UTF-8?q?=E9=95=B7=E6=8A=BC=E3=81=97=20=E2=86=92=20=E3=83=89=E3=83=A9?= =?UTF-8?q?=E3=83=83=E3=82=B0)=20=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit スマートフォン等のタッチデバイスで MkDraggable による並び替えができる ようにする。ghost element を追従させながら elementFromPoint でドロップ先 を判定する。 ドラッグ開始モードを 3 種類から選べる: - manualDragStart: ハンドル要素を触った瞬間に即ドラッグ開始 (待ち時間 0ms) → profile / server-rules / RolesEditorFormula / channel-editor / settings/navbar / page-editor のセクション - longPress=true: 行全体を 400ms 長押しでドラッグ開始 (待ち時間中に動かす と通常スクロールに譲る) → MkWidgets (行が大きいケース) - longPress=false (default): 行全体を一定量 (8px) 動かしたらドラッグ開始。 tap (動かさず touchend) はそのまま click として通過するので、行内に tap メニュー等を持つアイテムでも両立する → MkPostFormAttaches / emoji-palette iOS の long-press callout / 標準コンテキストメニューは touch session 中 だけ抑止し、PC の右クリックには干渉しない。 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../frontend/src/components/MkDraggable.vue | 395 +++++++++++++++++- .../frontend/src/components/MkWidgets.vue | 1 + .../src/pages/admin/RolesEditorFormula.vue | 6 +- .../frontend/src/pages/admin/server-rules.vue | 4 +- .../frontend/src/pages/channel-editor.vue | 4 +- .../page-editor/els/page-editor.el.image.vue | 3 +- .../page-editor/els/page-editor.el.note.vue | 3 +- .../els/page-editor.el.section.vue | 3 +- .../page-editor/els/page-editor.el.text.vue | 3 +- .../pages/page-editor/page-editor.blocks.vue | 3 +- .../page-editor/page-editor.container.vue | 3 +- .../frontend/src/pages/settings/navbar.vue | 4 +- .../frontend/src/pages/settings/profile.vue | 4 +- 13 files changed, 406 insertions(+), 30 deletions(-) diff --git a/packages/frontend/src/components/MkDraggable.vue b/packages/frontend/src/components/MkDraggable.vue index 6e2e038f87d..3a2785ddcdf 100644 --- a/packages/frontend/src/components/MkDraggable.vue +++ b/packages/frontend/src/components/MkDraggable.vue @@ -17,6 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
void) | null = null; + +// タッチ操作はDataTransferが使えないので、インスタンス間連携用にmodule-levelレジストリを用意する +type TouchDropHandler = (draggedItem: { id: string }, sourceGroup: string, targetItemId: string, backward: boolean) => void; +type TouchEmptyDropHandler = (draggedItem: { id: string }, sourceGroup: string) => void; +const touchDropHandlers = new Map(); +const touchEmptyDropHandlers = new Map(); + +// 全インスタンスで共有するタッチドロップ位置 (インスタンスIDで自インスタンス判定する) +const touchDropTarget = ref<{ instanceId: string; itemId: string; area: 'forward' | 'backward' } | null>(null);