From 23d71a635fd96ec2706f488f98b5a20dcfa454ae Mon Sep 17 00:00:00 2001 From: abdel-17 Date: Sun, 30 Nov 2025 16:25:05 +0200 Subject: [PATCH 1/2] fix: support rtl for keyboard shortcuts --- .../src/lib/components/TreeItem.svelte | 8 +- sites/preview/src/lib/Tree.svelte | 93 ++++++++++++++++--- sites/preview/src/lib/TreeItem.svelte | 37 +++++--- sites/preview/src/lib/utils.ts | 3 + sites/preview/src/routes/+page.svelte | 38 ++++++++ sites/preview/src/routes/rtl/+page.svelte | 69 ++++++++++++++ 6 files changed, 221 insertions(+), 27 deletions(-) create mode 100644 sites/preview/src/lib/utils.ts create mode 100644 sites/preview/src/routes/rtl/+page.svelte diff --git a/packages/svelte-file-tree/src/lib/components/TreeItem.svelte b/packages/svelte-file-tree/src/lib/components/TreeItem.svelte index a091614..50c8445 100644 --- a/packages/svelte-file-tree/src/lib/components/TreeItem.svelte +++ b/packages/svelte-file-tree/src/lib/components/TreeItem.svelte @@ -38,8 +38,12 @@ return; } + const isRtl = getComputedStyle(event.currentTarget).direction === "rtl"; + const arrowRight = isRtl ? "ArrowLeft" : "ArrowRight"; + const arrowLeft = isRtl ? "ArrowRight" : "ArrowLeft"; + switch (event.key) { - case "ArrowRight": { + case arrowRight: { if (item.node.type === "file") { break; } @@ -55,7 +59,7 @@ } break; } - case "ArrowLeft": { + case arrowLeft: { if (item.node.type === "folder" && item.expanded) { treeContext.getExpandedIds().delete(item.node.id); break; diff --git a/sites/preview/src/lib/Tree.svelte b/sites/preview/src/lib/Tree.svelte index 80f59d0..9e67a8c 100644 --- a/sites/preview/src/lib/Tree.svelte +++ b/sites/preview/src/lib/Tree.svelte @@ -22,6 +22,7 @@ type FileTreeNode, type TreeItemState, } from "./tree.svelte.js"; + import { arabicNumbers } from "./utils.js"; const sortCollator = new Intl.Collator(); @@ -29,14 +30,70 @@ return sortCollator.compare(x.name, y.name); } + const translations = { + toast: { + cannotMoveInsideItself: { + en: (name: string) => `Cannot move "${name}" inside itself`, + ar: (name: string) => `لا يمكن نقل "${name}" داخل نفسه`, + }, + itemAlreadyExists: { + en: (name: string) => `An item named "${name}" already exists in this location`, + ar: (name: string) => `عنصر باسم "${name}" موجود بالفعل في هذا الموقع`, + }, + failedToReadFiles: { + en: "Failed to read uploaded files", + ar: "فشل قراءة الملفات المرفوعة", + }, + }, + dialog: { + failedToCopyItems: { + en: "Failed to copy items", + ar: "فشل نسخ العناصر", + }, + failedToMoveItems: { + en: "Failed to move items", + ar: "فشل نقل العناصر", + }, + nameConflictDescription: { + en: (name: string) => + `An item named "${name}" already exists in this location. Do you want to skip it or cancel the operation entirely?`, + ar: (name: string) => + `عنصر باسم "${name}" موجود بالفعل في هذا الموقع. هل تريد تخطيه أو إلغاء العملية بالكامل؟`, + }, + skip: { + en: "Skip", + ar: "تخطي", + }, + deleteConfirmTitle: { + en: (count: number) => `Are you sure you want to delete ${count} item(s)?`, + ar: (count: number) => + `هل أنت متأكد أنك تريد حذف ${arabicNumbers(count.toString())} عناصر؟`, + }, + deleteConfirmDescription: { + en: "They will be permanently deleted. This action cannot be undone.", + ar: "سيتم حذفها نهائياً. لا يمكن التراجع عن هذا الإجراء.", + }, + confirm: { + en: "Confirm", + ar: "تأكيد", + }, + cancel: { + en: "Cancel", + ar: "إلغاء", + }, + }, + }; + export type TreeProps = { children: Snippet<[args: TreeChildrenSnippetArgs]>; root: FileTree; + lang?: "en" | "ar"; class?: ClassValue; style?: string; }; export type TreeContext = { + getLang: () => "en" | "ar"; getSelectedIds: () => Set; getExpandedIds: () => Set; getDraggedId: () => string | undefined; @@ -53,7 +110,7 @@ + + + {#snippet children({ visibleItems })} + {#each visibleItems as item, order (item.node.id)} + + {/each} + {/snippet} + From 07eb811f37eb369f57d9d6201470effd3b9a891e Mon Sep 17 00:00:00 2001 From: abdel-17 Date: Sun, 30 Nov 2025 16:28:26 +0200 Subject: [PATCH 2/2] chore: add changeset --- .changeset/tall-beans-attack.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tall-beans-attack.md diff --git a/.changeset/tall-beans-attack.md b/.changeset/tall-beans-attack.md new file mode 100644 index 0000000..2bad11b --- /dev/null +++ b/.changeset/tall-beans-attack.md @@ -0,0 +1,5 @@ +--- +"svelte-file-tree": patch +--- + +fix: swap arrow left/right in rtl