@brftech/filex-core 0.4.2 → 0.6.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.
- package/dist/{ArchiveViewer-B_0IQExT.js → ArchiveViewer-EGgNqLPE.js} +2 -2
- package/dist/{ArchiveViewer-B_0IQExT.js.map → ArchiveViewer-EGgNqLPE.js.map} +1 -1
- package/dist/{CsvViewer-maMfUy5i.js → CsvViewer-BvriJ42M.js} +2 -2
- package/dist/{CsvViewer-maMfUy5i.js.map → CsvViewer-BvriJ42M.js.map} +1 -1
- package/dist/{DrawioViewer-DP_pXI00.js → DrawioViewer-B_bSPsWX.js} +2 -2
- package/dist/{DrawioViewer-DP_pXI00.js.map → DrawioViewer-B_bSPsWX.js.map} +1 -1
- package/dist/{EpubViewer-DSaqGnVx.js → EpubViewer-hl68h4gG.js} +2 -2
- package/dist/{EpubViewer-DSaqGnVx.js.map → EpubViewer-hl68h4gG.js.map} +1 -1
- package/dist/{IpynbViewer-BmdBanF1.js → IpynbViewer-lhwOjXK7.js} +2 -2
- package/dist/{IpynbViewer-BmdBanF1.js.map → IpynbViewer-lhwOjXK7.js.map} +1 -1
- package/dist/{MermaidViewer-Drlkl0Z5.js → MermaidViewer-H2Z6AYXg.js} +2 -2
- package/dist/{MermaidViewer-Drlkl0Z5.js.map → MermaidViewer-H2Z6AYXg.js.map} +1 -1
- package/dist/{PsdViewer-gftUJrsm.js → PsdViewer-Bsk-11yH.js} +2 -2
- package/dist/{PsdViewer-gftUJrsm.js.map → PsdViewer-Bsk-11yH.js.map} +1 -1
- package/dist/{TiffViewer-0Uv0-Lxh.js → TiffViewer-D-j9vycG.js} +2 -2
- package/dist/{TiffViewer-0Uv0-Lxh.js.map → TiffViewer-D-j9vycG.js.map} +1 -1
- package/dist/{Viewer3D-Gu3kUpxV.js → Viewer3D-Bcr70rTe.js} +2 -2
- package/dist/{Viewer3D-Gu3kUpxV.js.map → Viewer3D-Bcr70rTe.js.map} +1 -1
- package/dist/filex-core.js +50 -25
- package/dist/filex-core.umd.cjs +59 -58
- package/dist/filex-core.umd.cjs.map +1 -1
- package/dist/index-C_ZSnk_I.js +11109 -0
- package/dist/index-C_ZSnk_I.js.map +1 -0
- package/dist/index.d.ts +597 -4
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/FileExplorer.vue +636 -15
- package/src/components/CommandPalette.vue +24 -1
- package/src/components/ContextMenu.vue +114 -8
- package/src/components/GalleryView.vue +214 -0
- package/src/components/GridView.vue +34 -1
- package/src/components/InspectorPanel.vue +170 -0
- package/src/components/ListView.vue +40 -6
- package/src/components/OnboardingTour.vue +332 -0
- package/src/components/OperationsCenter.vue +284 -0
- package/src/components/PendingOpsTray.vue +50 -66
- package/src/components/QuickLook.vue +142 -0
- package/src/components/SecondaryPane.vue +411 -0
- package/src/components/ShortcutSettings.vue +270 -0
- package/src/components/ShortcutsHelp.vue +30 -9
- package/src/components/TabBar.vue +174 -0
- package/src/components/ThemeGallery.vue +253 -0
- package/src/components/Toolbar.vue +75 -11
- package/src/components/UploadProgress.vue +49 -57
- package/src/composables/useFileApi.ts +53 -0
- package/src/composables/useKeyboardShortcuts.ts +340 -137
- package/src/composables/useOperations.ts +291 -0
- package/src/composables/useTabs.ts +222 -0
- package/src/index.ts +51 -0
- package/src/lib/dragGhost.ts +41 -0
- package/src/lib/themes.ts +505 -0
- package/src/locales/en.ts +125 -0
- package/src/locales/tr.ts +125 -0
- package/src/modals/Modal.vue +41 -5
- package/src/styles/base.css +1210 -0
- package/src/types/FileNode.ts +1 -1
- package/dist/index-BLocdbmc.js +0 -7993
- package/dist/index-BLocdbmc.js.map +0 -1
package/src/locales/tr.ts
CHANGED
|
@@ -240,4 +240,129 @@ export const tr: Record<string, string> = {
|
|
|
240
240
|
'inspector.perm.manage': 'İzinleri yönet',
|
|
241
241
|
'inspector.shares.empty': 'Paylaşım linki yok',
|
|
242
242
|
'inspector.shares.copy': 'Linki kopyala',
|
|
243
|
+
|
|
244
|
+
/* wiring:c1 — tema galerisi */
|
|
245
|
+
'theme.menu': 'Tema',
|
|
246
|
+
'theme.title': 'Tema Galerisi',
|
|
247
|
+
'theme.hint': 'Tema yalnız renk paletini değiştirir; açık/koyu mod ayrı çalışmaya devam eder.',
|
|
248
|
+
'theme.reset': 'Varsayılana dön',
|
|
249
|
+
'theme.close': 'Kapat',
|
|
250
|
+
'theme.selected': 'Seçili',
|
|
251
|
+
'theme.name.default': 'Varsayılan',
|
|
252
|
+
'theme.name.night': 'Gece Mavisi',
|
|
253
|
+
'theme.name.forest': 'Orman',
|
|
254
|
+
'theme.name.amber': 'Kehribar',
|
|
255
|
+
'theme.name.lilac': 'Leylak',
|
|
256
|
+
'theme.name.contrast': 'Yüksek Kontrast',
|
|
257
|
+
'theme.name.gray': 'Yumuşak Gri',
|
|
258
|
+
'theme.name.terminal': 'Terminal Yeşili',
|
|
259
|
+
/* === wiring:c2 — özelleştirilebilir kısayollar + hızlı bakış === */
|
|
260
|
+
'shortcuts.quicklook': 'Hızlı bakış',
|
|
261
|
+
'shortcuts.customize': 'Özelleştir',
|
|
262
|
+
'shortcuts.settings.menu': 'Kısayollar',
|
|
263
|
+
'shortcuts.settings.title': 'Kısayol Ayarları',
|
|
264
|
+
'shortcuts.settings.hint': 'Bir kısayolu değiştirmek için "Değiştir"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',
|
|
265
|
+
'shortcuts.settings.change': 'Değiştir',
|
|
266
|
+
'shortcuts.settings.capture': 'Tuşlara basın… (Esc iptal)',
|
|
267
|
+
'shortcuts.settings.reset': 'Varsayılana dön',
|
|
268
|
+
'shortcuts.settings.reset_all': 'Tümünü sıfırla',
|
|
269
|
+
'shortcuts.settings.unbound': 'Atanmadı',
|
|
270
|
+
'shortcuts.settings.fixed': 'Sabit',
|
|
271
|
+
'shortcuts.settings.customized': 'Özelleştirildi',
|
|
272
|
+
'shortcuts.settings.conflict': 'kombinasyonu "{name}" kısayolunda kullanılıyor.',
|
|
273
|
+
'shortcuts.settings.conflict_fixed': 'kombinasyonu "{name}" sabit kısayoluna ayrılmış — kullanılamaz.',
|
|
274
|
+
'shortcuts.settings.conflict_take': 'Eskisini boşa çıkar ve ata',
|
|
275
|
+
'shortcuts.settings.conflict_cancel': 'Vazgeç',
|
|
276
|
+
'quicklook.hint_close': 'kapat',
|
|
277
|
+
'quicklook.hint_nav': 'önceki/sonraki',
|
|
278
|
+
'quicklook.hint_open': 'aç',
|
|
279
|
+
/* === /wiring:c2 === */
|
|
280
|
+
/* === wiring:c3 — işlem merkezi === */
|
|
281
|
+
'opc.title': 'İşlemler',
|
|
282
|
+
'opc.aria_badge': '{n} işlem — işlem merkezini aç/kapat',
|
|
283
|
+
'opc.close': 'Kapat',
|
|
284
|
+
'opc.active': 'Sürüyor',
|
|
285
|
+
'opc.history': 'Geçmiş',
|
|
286
|
+
'opc.clear': 'Temizle',
|
|
287
|
+
'opc.empty': 'İşlem yok',
|
|
288
|
+
'opc.cancel': 'İptal',
|
|
289
|
+
'opc.retry': 'Yeniden dene',
|
|
290
|
+
'opc.dismiss': 'Kapat',
|
|
291
|
+
'opc.queued': 'Sırada',
|
|
292
|
+
'opc.percent': '%{n}',
|
|
293
|
+
'opc.status.running': 'Sürüyor',
|
|
294
|
+
'opc.status.done': 'Bitti',
|
|
295
|
+
'opc.status.error': 'Hata',
|
|
296
|
+
'opc.status.aborted': 'İptal edildi',
|
|
297
|
+
'opc.kind.upload': 'Yükleme',
|
|
298
|
+
'opc.kind.copy': 'Kopyalama',
|
|
299
|
+
'opc.kind.move': 'Taşıma',
|
|
300
|
+
'opc.kind.delete': 'Silme',
|
|
301
|
+
'opc.kind.convert': 'Dönüştürme',
|
|
302
|
+
'opc.kind.archive': 'Arşiv',
|
|
303
|
+
/* === wiring:c4 — onboarding turu + erişilebilirlik + hata kartı === */
|
|
304
|
+
'tour.aria': 'Tanıtım turu',
|
|
305
|
+
'tour.restart': 'Turu tekrar başlat',
|
|
306
|
+
'tour.skip': 'Turu atla',
|
|
307
|
+
'tour.back': 'Geri',
|
|
308
|
+
'tour.next': 'İleri',
|
|
309
|
+
'tour.done': 'Bitti',
|
|
310
|
+
'tour.progress': '{n} / {m}',
|
|
311
|
+
'tour.step.nav.title': 'Depo ve klasörler',
|
|
312
|
+
'tour.step.nav.desc':
|
|
313
|
+
'Bulunduğun konum burada görünür. Kırıntı çubuğundaki adımlara tıklayarak üst klasörlere ve depo köküne dönebilirsin.',
|
|
314
|
+
'tour.step.upload.title': 'Dosya yükle',
|
|
315
|
+
'tour.step.upload.desc':
|
|
316
|
+
'Bu düğmeyle dosya seçebilirsin; dosyaları doğrudan pencereye sürükleyip bırakmak da çalışır.',
|
|
317
|
+
'tour.step.search.title': 'Arama',
|
|
318
|
+
'tour.step.search.desc':
|
|
319
|
+
'Bu kutu bulunduğun klasörü filtreler. Ctrl+K komut paleti ile tüm depolarda arama yapabilir ve komut çalıştırabilirsin.',
|
|
320
|
+
'tour.step.view.title': 'Görünümü değiştir',
|
|
321
|
+
'tour.step.view.desc':
|
|
322
|
+
'Liste ve ızgara görünümü arasında geçiş yapabilirsin; seçimin hatırlanır.',
|
|
323
|
+
'tour.step.share.title': 'Paylaşım',
|
|
324
|
+
'tour.step.share.desc':
|
|
325
|
+
'Bir dosyaya sağ tıklayıp "Paylaş / İzinler" ile bağlantı oluşturabilir, PIN ve son kullanma süresi ekleyebilirsin.',
|
|
326
|
+
'tour.step.help.title': 'Kısayollar',
|
|
327
|
+
'tour.step.help.desc':
|
|
328
|
+
'? tuşu kısayol kartını, Ctrl+K komut paletini açar. Bu turu menüdeki "Turu tekrar başlat" ile dilediğinde yeniden izleyebilirsin.',
|
|
329
|
+
'error.hint': 'Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.',
|
|
330
|
+
'error.details': 'Teknik ayrıntılar',
|
|
331
|
+
'col.star': 'Yıldız',
|
|
332
|
+
'toolbar.view_label': 'Görünüm',
|
|
333
|
+
'list.aria': 'Dosya listesi',
|
|
334
|
+
'grid.aria': 'Dosya ızgarası',
|
|
335
|
+
|
|
336
|
+
/* === wiring:d1 — sekmeler + split panel === */
|
|
337
|
+
'tabs.strip': 'Sekmeler',
|
|
338
|
+
'tabs.new': 'Yeni sekme',
|
|
339
|
+
'tabs.close': 'Sekmeyi kapat',
|
|
340
|
+
'tabs.split': 'Görünümü böl',
|
|
341
|
+
'tabs.split_off': 'Bölmeyi kapat',
|
|
342
|
+
'ctx.open_new_tab': 'Yeni sekmede aç',
|
|
343
|
+
'shortcuts.group.tabs': 'Sekmeler',
|
|
344
|
+
'shortcuts.tab_new': 'Yeni sekme',
|
|
345
|
+
'shortcuts.tab_close': 'Sekmeyi kapat',
|
|
346
|
+
'shortcuts.tab_next': 'Sonraki sekme',
|
|
347
|
+
'shortcuts.tab_prev': 'Önceki sekme',
|
|
348
|
+
'cmd.tab_new': 'Yeni sekme aç',
|
|
349
|
+
'cmd.split_toggle': 'Görünümü böl / birleştir',
|
|
350
|
+
'split.pane': 'İkincil panel',
|
|
351
|
+
'split.close': 'Yan paneli kapat',
|
|
352
|
+
'split.error': 'Liste yüklenemedi',
|
|
353
|
+
'split.retry': 'Yeniden dene',
|
|
354
|
+
'split.copy_queued': 'Kopyalama kuyruğa alındı',
|
|
355
|
+
'split.cross_copy': 'Depolar farklı — kopyalama kuyruğa alındı',
|
|
356
|
+
'split.cross_failed': 'Depolar arası kopyalama bu sunucuda desteklenmiyor',
|
|
357
|
+
/* === /wiring:d1 === */
|
|
358
|
+
/* wiring:d2 — galeri görünümü */
|
|
359
|
+
'toolbar.view.gallery': 'Galeri',
|
|
360
|
+
'gallery.aria': 'Dosya galerisi',
|
|
361
|
+
/* /wiring:d2 */
|
|
362
|
+
/* wiring:d3 — Yorumlar (inspector node comments) */
|
|
363
|
+
'inspector.section.comments': 'Yorumlar',
|
|
364
|
+
'inspector.comments.empty': 'Henüz yorum yok.',
|
|
365
|
+
'inspector.comments.placeholder': 'Yorum yaz…',
|
|
366
|
+
'inspector.comments.send': 'Gönder',
|
|
367
|
+
'inspector.comments.delete': 'Yorumu sil',
|
|
243
368
|
};
|
package/src/modals/Modal.vue
CHANGED
|
@@ -31,19 +31,32 @@ const emit = defineEmits<{
|
|
|
31
31
|
|
|
32
32
|
const cardEl = ref<HTMLElement | null>(null);
|
|
33
33
|
|
|
34
|
+
/* wiring:c4 — a11y: unique title id for aria-labelledby + focus restore.
|
|
35
|
+
* The element focused before the modal opened gets focus back on close so
|
|
36
|
+
* keyboard users return to where they were instead of <body>. */
|
|
37
|
+
let modalSeq = 0;
|
|
38
|
+
const titleId = `fe-modal-title-${++modalSeq}-${Math.random().toString(36).slice(2, 7)}`;
|
|
39
|
+
let prevFocus: HTMLElement | null = null;
|
|
40
|
+
|
|
41
|
+
const FOCUSABLE =
|
|
42
|
+
'input:not([disabled]),select:not([disabled]),textarea:not([disabled]),' +
|
|
43
|
+
'button:not([disabled]),a[href],[tabindex]:not([tabindex="-1"])';
|
|
44
|
+
|
|
34
45
|
watch(
|
|
35
46
|
() => props.open,
|
|
36
47
|
(v) => {
|
|
37
48
|
if (v) {
|
|
49
|
+
prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */
|
|
38
50
|
document.addEventListener('keydown', onKey);
|
|
39
51
|
setTimeout(() => {
|
|
40
|
-
const focusable = cardEl.value?.querySelector<HTMLElement>(
|
|
41
|
-
'input,select,textarea,button,[tabindex]:not([tabindex="-1"])',
|
|
42
|
-
);
|
|
52
|
+
const focusable = cardEl.value?.querySelector<HTMLElement>(FOCUSABLE);
|
|
43
53
|
focusable?.focus();
|
|
44
54
|
}, 30);
|
|
45
55
|
} else {
|
|
46
56
|
document.removeEventListener('keydown', onKey);
|
|
57
|
+
/* wiring:c4 — return focus to the opener. */
|
|
58
|
+
prevFocus?.focus?.();
|
|
59
|
+
prevFocus = null;
|
|
47
60
|
}
|
|
48
61
|
},
|
|
49
62
|
);
|
|
@@ -51,7 +64,28 @@ watch(
|
|
|
51
64
|
onBeforeUnmount(() => document.removeEventListener('keydown', onKey));
|
|
52
65
|
|
|
53
66
|
function onKey(e: KeyboardEvent) {
|
|
54
|
-
if (e.key === 'Escape')
|
|
67
|
+
if (e.key === 'Escape') {
|
|
68
|
+
emit('close');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
/* wiring:c4 — focus trap: Tab cycles inside the card (WAI-ARIA dialog).
|
|
72
|
+
* Without it, Tab walked out into the host page behind the backdrop. */
|
|
73
|
+
if (e.key === 'Tab' && cardEl.value) {
|
|
74
|
+
const nodes = Array.from(cardEl.value.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(
|
|
75
|
+
(el) => el.offsetParent !== null || el === document.activeElement,
|
|
76
|
+
);
|
|
77
|
+
if (nodes.length === 0) return;
|
|
78
|
+
const first = nodes[0];
|
|
79
|
+
const last = nodes[nodes.length - 1];
|
|
80
|
+
const active = document.activeElement as HTMLElement | null;
|
|
81
|
+
if (e.shiftKey && (active === first || !cardEl.value.contains(active))) {
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
last.focus();
|
|
84
|
+
} else if (!e.shiftKey && (active === last || !cardEl.value.contains(active))) {
|
|
85
|
+
e.preventDefault();
|
|
86
|
+
first.focus();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
55
89
|
}
|
|
56
90
|
|
|
57
91
|
function onBackdrop() {
|
|
@@ -81,10 +115,12 @@ function onBackdrop() {
|
|
|
81
115
|
]"
|
|
82
116
|
role="dialog"
|
|
83
117
|
aria-modal="true"
|
|
118
|
+
:aria-labelledby="title && !chromeless ? titleId : undefined"
|
|
119
|
+
:aria-label="!title || chromeless ? title || undefined : undefined"
|
|
84
120
|
@click.stop
|
|
85
121
|
>
|
|
86
122
|
<header v-if="title && !chromeless" class="fe-modal__head">
|
|
87
|
-
<h2 class="fe-modal__title">{{ title }}</h2>
|
|
123
|
+
<h2 :id="titleId" class="fe-modal__title">{{ title }}</h2>
|
|
88
124
|
<button
|
|
89
125
|
type="button"
|
|
90
126
|
class="fe-modal__close"
|