← Pasty トップへ
v0.9.4-beta
Pasty v0.9.4-beta
2026-06-20 リリース
Pasty 0.9.4-beta — フォルダ並べ替えの再設計とクリップドラッグの再構築
🛠 フォルダ並べ替えを設計からやり直し
- SwiftUI の
.draggable + .dropDestination (高レベル Transferable API) で組んでいたフォルダタブの並べ替えを廃止
- v0.8.7 → v0.9.0 → v0.9.1 → v0.9.2 → v0.9.3 と連発していた「モディファイア順を 1 つ入れ替えただけで青い縦線インジケータが消える」回帰連鎖を、API レイヤを下げて根本的に断ち切った
- 専用 UTType
app.pasty.pinboard-tab を新設し、フォルダ並べ替え専用のドラッグペイロード PinboardDragItem をクリップ系ペイロードと完全に分離
- 並べ替え受け側は新規
PinboardReorderDelegate (DropDelegate) に集約。validateDrop / dropEntered / dropExited / performDrop をすべて明示的にハンドリングし、pastyPinboardTab 以外のドロップは確実に弾く
- ギャップ側ビューは
.onDrop(of: [.pastyPinboardTab], delegate: PinboardReorderDelegate(...)) だけのシンプルな構造に。SwiftUI の再評価で順序が入れ替わってもヒットテストが壊れない
🎯 クリップドラッグ preview を薄い四角に
- クリップを他アプリやフォルダタブにドラッグ中に表示されるカーソル追従プレビューを、新規
MiniClipDragPreview に置き換え
- サイズは
80×24、.regularMaterial ベース + opacity 0.55 の半透明四角に統一
- 複数選択時は右端に件数バッジを表示 (
2, 3, ... )
- 旧プレビュー (テキスト本文の長文プレビュー / 巨大なカードスナップショット) は画面の広い面積を占有していたため、操作中の視界を遮らない最小限の表現に切り替え
✨ ドロップ先フォルダの強ハイライト
- クリップをドラッグしてフォルダタブの上にカーソルを乗せた瞬間、対象タブが Capsule +
Color.accentColor ストロークで強く縁取られる
- 同時にタブ全体が
scale 1.05 に spring(response: 0.3, dampingFraction: 0.7) でリアクティブに浮き上がり、「ここに入る」を強く視覚化
- ホバー解除 / ドロップ完了 / Esc キャンセル時はすべて
scale 1.0 + 縁取り消失に滑らかに復帰
- 既存のフォルダ並べ替え時の青い縦線インジケータとは責務が分離されているため、両者が同時に発火することはない
v0.9.3 からの変更点
- v0.9.3 まではフォルダ並べ替えを SwiftUI の高レベル
Transferable API (.draggable + .dropDestination) で実装しており、モディファイアの積層順や SwiftUI 内部の差分検知に強く依存していた
- 「順序を入れ替えただけで動かなくなる」「v0.9.2 で動いて v0.9.3 で再回帰する」という連鎖的な回帰が複数バージョンに渡って発生
- v0.9.4 ではフォルダ並べ替えだけを中レベル API (
.onDrop(of:delegate:) + DropDelegate) に降格させ、SwiftUI の自動再評価から独立した明示的なステートマシンに作り直した
- クリップのドラッグ自体は引き続き
Transferable 経路を維持し、影響範囲を最小化
技術的な詳細
- 新規型:
PinboardReorderDelegate (DropDelegate), MiniClipDragPreview (View)
- 新規 UTType:
app.pasty.pinboard-tab (exported, conformsTo public.data)
- 影響ファイル:
Sources/Pasty/DragDropSupport.swift, Sources/Pasty/StripPanel.swift
- 設計ドキュメント:
docs/design/v0.9.4-folder-reorder-redesign.md
- クリップ単発 / 複数選択ドラッグ・他アプリへのテキストドロップ・
Transferable ペイロード経路は変更なし
PinboardStore.reorder のロジックには変更なし
GitHub Releases で詳細を見る ↗