@brftech/filex-core 0.4.2 → 0.5.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.
Files changed (51) hide show
  1. package/dist/{ArchiveViewer-B_0IQExT.js → ArchiveViewer-DKW-HyXT.js} +2 -2
  2. package/dist/{ArchiveViewer-B_0IQExT.js.map → ArchiveViewer-DKW-HyXT.js.map} +1 -1
  3. package/dist/{CsvViewer-maMfUy5i.js → CsvViewer-D2HmP2yr.js} +2 -2
  4. package/dist/{CsvViewer-maMfUy5i.js.map → CsvViewer-D2HmP2yr.js.map} +1 -1
  5. package/dist/{DrawioViewer-DP_pXI00.js → DrawioViewer-DPNvOFCs.js} +2 -2
  6. package/dist/{DrawioViewer-DP_pXI00.js.map → DrawioViewer-DPNvOFCs.js.map} +1 -1
  7. package/dist/{EpubViewer-DSaqGnVx.js → EpubViewer-ByqjNuNL.js} +2 -2
  8. package/dist/{EpubViewer-DSaqGnVx.js.map → EpubViewer-ByqjNuNL.js.map} +1 -1
  9. package/dist/{IpynbViewer-BmdBanF1.js → IpynbViewer-2iONhbuJ.js} +2 -2
  10. package/dist/{IpynbViewer-BmdBanF1.js.map → IpynbViewer-2iONhbuJ.js.map} +1 -1
  11. package/dist/{MermaidViewer-Drlkl0Z5.js → MermaidViewer-CmiU7hIT.js} +2 -2
  12. package/dist/{MermaidViewer-Drlkl0Z5.js.map → MermaidViewer-CmiU7hIT.js.map} +1 -1
  13. package/dist/{PsdViewer-gftUJrsm.js → PsdViewer-Inhl2yN9.js} +2 -2
  14. package/dist/{PsdViewer-gftUJrsm.js.map → PsdViewer-Inhl2yN9.js.map} +1 -1
  15. package/dist/{TiffViewer-0Uv0-Lxh.js → TiffViewer-C2AFFEze.js} +2 -2
  16. package/dist/{TiffViewer-0Uv0-Lxh.js.map → TiffViewer-C2AFFEze.js.map} +1 -1
  17. package/dist/{Viewer3D-Gu3kUpxV.js → Viewer3D-YdW14q_n.js} +2 -2
  18. package/dist/{Viewer3D-Gu3kUpxV.js.map → Viewer3D-YdW14q_n.js.map} +1 -1
  19. package/dist/filex-core.js +47 -25
  20. package/dist/filex-core.umd.cjs +40 -40
  21. package/dist/filex-core.umd.cjs.map +1 -1
  22. package/dist/index-eARevpz0.js +9952 -0
  23. package/dist/index-eARevpz0.js.map +1 -0
  24. package/dist/index.d.ts +363 -3
  25. package/dist/style.css +1 -1
  26. package/package.json +1 -1
  27. package/src/FileExplorer.vue +269 -1
  28. package/src/components/CommandPalette.vue +12 -0
  29. package/src/components/ContextMenu.vue +114 -8
  30. package/src/components/GridView.vue +33 -1
  31. package/src/components/ListView.vue +39 -6
  32. package/src/components/OnboardingTour.vue +332 -0
  33. package/src/components/OperationsCenter.vue +284 -0
  34. package/src/components/PendingOpsTray.vue +50 -66
  35. package/src/components/QuickLook.vue +142 -0
  36. package/src/components/ShortcutSettings.vue +270 -0
  37. package/src/components/ShortcutsHelp.vue +30 -9
  38. package/src/components/ThemeGallery.vue +253 -0
  39. package/src/components/Toolbar.vue +52 -6
  40. package/src/components/UploadProgress.vue +49 -57
  41. package/src/composables/useKeyboardShortcuts.ts +321 -137
  42. package/src/composables/useOperations.ts +291 -0
  43. package/src/index.ts +45 -0
  44. package/src/lib/dragGhost.ts +41 -0
  45. package/src/lib/themes.ts +505 -0
  46. package/src/locales/en.ts +92 -0
  47. package/src/locales/tr.ts +92 -0
  48. package/src/modals/Modal.vue +41 -5
  49. package/src/styles/base.css +672 -0
  50. package/dist/index-BLocdbmc.js +0 -7993
  51. package/dist/index-BLocdbmc.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -71,6 +71,53 @@ declare type __VLS_Props_5 = {
71
71
  refreshKey?: number | string;
72
72
  };
73
73
 
74
+ declare type __VLS_Props_6 = {
75
+ open: boolean;
76
+ locale: LocaleCode;
77
+ /** Host mode (forwarded to Modal so the backdrop themes correctly). */
78
+ theme?: ThemeMode;
79
+ /** Resolved mode — decides which variant the preview cards paint. */
80
+ dark: boolean;
81
+ /** Currently selected theme id. */
82
+ current: string;
83
+ };
84
+
85
+ declare type __VLS_Props_7 = {
86
+ open: boolean;
87
+ locale: LocaleCode;
88
+ theme?: 'light' | 'dark' | 'auto';
89
+ };
90
+
91
+ declare type __VLS_Props_8 = {
92
+ open: boolean;
93
+ locale: LocaleCode;
94
+ file: FileNode | null;
95
+ previewUrl: (path: string) => string;
96
+ downloadUrl: (path: string) => string;
97
+ onlyOfficeBase?: string | null;
98
+ onlyOfficeConfigEndpoint?: string | null;
99
+ authHeaders?: () => Record<string, string>;
100
+ authCredentials?: RequestCredentials;
101
+ drawioUrl?: string | null;
102
+ pdfWorkerUrl?: string | null;
103
+ viewerBaseUrl?: string | null;
104
+ theme?: 'light' | 'dark' | 'auto';
105
+ };
106
+
107
+ declare type __VLS_Props_9 = {
108
+ center: OperationsStore;
109
+ locale: LocaleCode;
110
+ narrow?: boolean;
111
+ };
112
+
113
+ /**
114
+ * Set (or clear, for the default theme) the selected theme's tokens as
115
+ * inline CSS variables on the explorer root element, resolved to the
116
+ * active variant. Inline style wins over every stylesheet rule, so the
117
+ * root subtree is always correct regardless of host CSS.
118
+ */
119
+ export declare function applyThemeToEl(el: HTMLElement, id: string, dark: boolean): void;
120
+
74
121
  export declare interface ArchiveEntry {
75
122
  name: string;
76
123
  size: number;
@@ -152,6 +199,13 @@ export declare interface ClipboardState {
152
199
  sourcePath: string | null;
153
200
  }
154
201
 
202
+ /**
203
+ * Canonical combo for a keyboard event, or null for a bare modifier
204
+ * press. Meta folds into Ctrl; Shift is dropped for printable symbols
205
+ * because the produced character already encodes it (`?` not `Shift+?`).
206
+ */
207
+ export declare function comboFromEvent(e: KeyboardEvent): string | null;
208
+
155
209
  declare interface ContextAction {
156
210
  key: string;
157
211
  label: string;
@@ -162,8 +216,13 @@ declare interface ContextAction {
162
216
  divider?: boolean;
163
217
  }
164
218
 
219
+ export declare const DEFAULT_THEME_ID = "default";
220
+
165
221
  declare type Density = 'comfortable' | 'compact';
166
222
 
223
+ /** Current combo for an action ('' = unbound). */
224
+ export declare function effectiveCombo(id: string): string;
225
+
167
226
  /** English UI strings. */
168
227
  export declare const en: Record<string, string>;
169
228
 
@@ -484,27 +543,31 @@ inspectorOpen?: boolean;
484
543
  }> & Readonly<{
485
544
  onAction?: ((key: string) => any) | undefined;
486
545
  onUpload?: (() => any) | undefined;
546
+ "onGo-up"?: (() => any) | undefined;
487
547
  "onUpdate:viewMode"?: ((v: ViewMode) => any) | undefined;
488
548
  "onUpdate:searchQuery"?: ((v: string) => any) | undefined;
489
549
  "onNew-folder"?: (() => any) | undefined;
490
550
  onRefresh?: (() => any) | undefined;
491
- "onGo-up"?: (() => any) | undefined;
492
551
  "onOpen-recents"?: (() => any) | undefined;
493
552
  "onUpdate:density"?: ((v: Density) => any) | undefined;
494
553
  "onToggle-inspector"?: (() => any) | undefined;
554
+ "onOpen-theme"?: (() => any) | undefined;
555
+ "onOpen-shortcut-settings"?: (() => any) | undefined;
495
556
  }>, {
496
557
  focusSearch: () => Promise<void>;
497
558
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
498
559
  action: (key: string) => any;
499
560
  upload: () => any;
561
+ "go-up": () => any;
500
562
  "update:viewMode": (v: ViewMode) => any;
501
563
  "update:searchQuery": (v: string) => any;
502
564
  "new-folder": () => any;
503
565
  refresh: () => any;
504
- "go-up": () => any;
505
566
  "open-recents": () => any;
506
567
  "update:density": (v: Density) => any;
507
568
  "toggle-inspector": () => any;
569
+ "open-theme": () => any;
570
+ "open-shortcut-settings": () => any;
508
571
  }, PublicProps, {}, false, {}, {}, GlobalComponents, GlobalDirectives, string, {
509
572
  searchEl: HTMLInputElement;
510
573
  moreBtnEl: HTMLButtonElement;
@@ -572,14 +635,16 @@ inspectorOpen?: boolean;
572
635
  }> & Readonly<{
573
636
  onAction?: ((key: string) => any) | undefined;
574
637
  onUpload?: (() => any) | undefined;
638
+ "onGo-up"?: (() => any) | undefined;
575
639
  "onUpdate:viewMode"?: ((v: ViewMode) => any) | undefined;
576
640
  "onUpdate:searchQuery"?: ((v: string) => any) | undefined;
577
641
  "onNew-folder"?: (() => any) | undefined;
578
642
  onRefresh?: (() => any) | undefined;
579
- "onGo-up"?: (() => any) | undefined;
580
643
  "onOpen-recents"?: (() => any) | undefined;
581
644
  "onUpdate:density"?: ((v: Density) => any) | undefined;
582
645
  "onToggle-inspector"?: (() => any) | undefined;
646
+ "onOpen-theme"?: (() => any) | undefined;
647
+ "onOpen-shortcut-settings"?: (() => any) | undefined;
583
648
  }>, {
584
649
  focusSearch: () => Promise<void>;
585
650
  }, {}, {}, {}, {}> | null;
@@ -673,6 +738,22 @@ export declare interface FileNode {
673
738
  [k: string]: unknown;
674
739
  }
675
740
 
741
+ /**
742
+ * Does `combo` already trigger another action? Checks both effective
743
+ * combos and the reserved fixed combos (Backspace, Esc). Returns null
744
+ * when free.
745
+ */
746
+ export declare function findShortcutConflict(combo: string, excludeId: string): ShortcutConflict | null;
747
+
748
+ /**
749
+ * Generate a stylesheet that mirrors styles/variables.css' selector
750
+ * cascade 1:1 (light base → explicit-dark selectors → prefers-dark media
751
+ * block) with the theme's palette. Appended after the bundled CSS it
752
+ * overrides every surface — teleported context menus, modal backdrops —
753
+ * in whichever mode they resolve to, without JS having to track them.
754
+ */
755
+ export declare function generateThemeCss(theme: ThemeDef): string;
756
+
676
757
  export declare function getHighlight(): unknown | null;
677
758
 
678
759
  /** Synchronous cached lookup — null if Monaco not yet ready or absent. */
@@ -760,6 +841,89 @@ declare interface NodeVersion {
760
841
  created_at: string;
761
842
  }
762
843
 
844
+ export declare interface Operation {
845
+ /** `${group}:${id}` — unique across publishers. */
846
+ key: string;
847
+ kind: OperationKind;
848
+ name: string;
849
+ percent: number | null;
850
+ status: OperationStatus;
851
+ error: string | null;
852
+ queued: boolean;
853
+ doneCount: number | null;
854
+ totalCount: number | null;
855
+ uploadedBytes: number | null;
856
+ totalBytes: number | null;
857
+ cancellable: boolean;
858
+ retryable: boolean;
859
+ startedAt: number;
860
+ settledAt: number | null;
861
+ }
862
+
863
+ export declare interface OperationActions {
864
+ cancel?: () => void;
865
+ /** Clean the row out of the OWNING source list (called on retire/dismiss). */
866
+ dismiss?: () => void;
867
+ retry?: () => void;
868
+ }
869
+
870
+ /** What a publisher hands to `sync()` for one row. */
871
+ export declare interface OperationInput {
872
+ /** Stable id within the group (upload uuid / ops row id). */
873
+ id: string | number;
874
+ kind: OperationKind;
875
+ /** Primary label — file name or target path. '' → renderer falls back to the kind verb. */
876
+ name: string;
877
+ /** 0..100, or null for indeterminate (renderer shows a spinner). */
878
+ percent: number | null;
879
+ status: OperationStatus;
880
+ error?: string | null;
881
+ /** Queue op accepted but not started yet ("Sırada"). */
882
+ queued?: boolean;
883
+ /** Progress counters for queue ops (3/5 items). */
884
+ doneCount?: number;
885
+ totalCount?: number;
886
+ /** Byte progress for uploads. */
887
+ uploadedBytes?: number;
888
+ totalBytes?: number;
889
+ cancellable?: boolean;
890
+ retryable?: boolean;
891
+ }
892
+
893
+ /**
894
+ * useOperations — unified long-running-operation store (wiring:c3).
895
+ *
896
+ * One presentation-level aggregation point for everything that used to be
897
+ * scattered across corner UIs:
898
+ * - uploads (useUploadChunked jobs / legacy multipart rows)
899
+ * - ops-queue jobs (usePendingOps copy/move/delete worker ops)
900
+ * - future kinds (convert / archive — same `sync()` contract, own group)
901
+ *
902
+ * The store does NOT talk to the network. Publishers (renderless
903
+ * UploadProgress / PendingOpsTray adapters) reconcile their reactive source
904
+ * lists into the store via `sync(group, items)`; OperationsCenter renders the
905
+ * merged picture (badge + panel). Action callbacks (cancel/retry/dismiss)
906
+ * are registered per row so the panel can route user intent back to the
907
+ * owning surface without the store knowing any transport details.
908
+ *
909
+ * Lifecycle rules (per the İşlem Merkezi contract):
910
+ * - running rows live in `active`;
911
+ * - done/aborted rows linger in `active` for DONE_LINGER_MS ("bitti"
912
+ * flash) then move to `history` (session-only, capped);
913
+ * - error rows are STICKY: they stay in `active` until the user
914
+ * dismisses or retries them — even after the source list swept them
915
+ * (usePendingOps drops terminal ops after its RETAIN window).
916
+ */
917
+ export declare type OperationKind = 'upload' | 'copy' | 'move' | 'delete' | 'convert' | 'archive';
918
+
919
+ export declare const OperationsCenter: DefineComponent<__VLS_Props_9, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_9> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
920
+ rootEl: HTMLDivElement;
921
+ }, any>;
922
+
923
+ export declare type OperationsStore = ReturnType<typeof useOperations>;
924
+
925
+ export declare type OperationStatus = 'running' | 'done' | 'error' | 'aborted';
926
+
763
927
  export declare interface PendingOp {
764
928
  id: number;
765
929
  op_type: 'copy' | 'move' | 'delete';
@@ -839,6 +1003,16 @@ monacoEl: HTMLDivElement;
839
1003
  officeEl: HTMLDivElement;
840
1004
  }, any>;
841
1005
 
1006
+ export declare const QuickLook: DefineComponent<__VLS_Props_8, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
1007
+ close: () => any;
1008
+ nav: (delta: number) => any;
1009
+ "open-full": () => any;
1010
+ }, string, PublicProps, Readonly<__VLS_Props_8> & Readonly<{
1011
+ onClose?: (() => any) | undefined;
1012
+ onNav?: ((delta: number) => any) | undefined;
1013
+ "onOpen-full"?: (() => any) | undefined;
1014
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1015
+
842
1016
  export declare const RecentlyOpened: DefineComponent<__VLS_Props_5, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
843
1017
  error: (message: string) => any;
844
1018
  open: (node: RecentNode) => any;
@@ -856,6 +1030,10 @@ declare interface RecentNode {
856
1030
  last_opened?: string;
857
1031
  }
858
1032
 
1033
+ export declare function resetAllShortcuts(): void;
1034
+
1035
+ export declare function resetShortcut(id: string): void;
1036
+
859
1037
  declare interface ResolveEmailResponse {
860
1038
  found: boolean;
861
1039
  user?: {
@@ -879,6 +1057,11 @@ export declare type SearchMatched = 'name' | 'content' | 'both';
879
1057
 
880
1058
  declare type SelectionMode_2 = 'none' | 'single-file' | 'single-dir' | 'multi';
881
1059
 
1060
+ /** Set (or clear back to default) a user override. '' unbinds. */
1061
+ export declare function setShortcutOverride(id: string, combo: string): void;
1062
+
1063
+ export declare function setTheme(id: string): void;
1064
+
882
1065
  export declare interface ShareInfo {
883
1066
  uuid: string;
884
1067
  url: string;
@@ -889,6 +1072,38 @@ export declare interface ShareInfo {
889
1072
  created_at?: string;
890
1073
  }
891
1074
 
1075
+ /** Registry order = help/settings display order. */
1076
+ export declare const SHORTCUT_ACTIONS: ShortcutActionDef[];
1077
+
1078
+ /** One remappable action in the shortcut registry. */
1079
+ export declare interface ShortcutActionDef {
1080
+ /** Stable id — also the localStorage override key. */
1081
+ id: string;
1082
+ /** Default combo in canonical form. */
1083
+ defaultCombo: string;
1084
+ /**
1085
+ * Extra built-in combos that also trigger the action but are NOT
1086
+ * remappable (e.g. Backspace on go-up, which carries the
1087
+ * selection-dependent dual behaviour). Shown in the help sheet and
1088
+ * reserved in conflict detection.
1089
+ */
1090
+ fixedCombos?: string[];
1091
+ labelKey: string;
1092
+ groupKey: string;
1093
+ /** false → the combo can't be remapped (Esc). Default true. */
1094
+ customizable?: boolean;
1095
+ /** false → don't preventDefault on match (Enter / Esc). Default true. */
1096
+ prevent?: boolean;
1097
+ /** true → fires even when focus sits in a form control (Esc). */
1098
+ inForms?: boolean;
1099
+ }
1100
+
1101
+ export declare interface ShortcutConflict {
1102
+ id: string;
1103
+ /** true → the clash is with a fixed (non-remappable) combo. */
1104
+ fixed: boolean;
1105
+ }
1106
+
892
1107
  export declare interface ShortcutHandlers {
893
1108
  onDelete?: () => void;
894
1109
  onRename?: () => void;
@@ -904,9 +1119,30 @@ export declare interface ShortcutHandlers {
904
1119
  onGoUp?: () => void;
905
1120
  onShowHelp?: () => void;
906
1121
  onToggleInspector?: () => void;
1122
+ onQuickLook?: () => void;
907
1123
  hasSelection?: () => boolean;
908
1124
  }
909
1125
 
1126
+ export declare const ShortcutSettings: DefineComponent<__VLS_Props_7, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
1127
+ close: () => any;
1128
+ }, string, PublicProps, Readonly<__VLS_Props_7> & Readonly<{
1129
+ onClose?: (() => any) | undefined;
1130
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1131
+
1132
+ export declare interface ShortcutView {
1133
+ id: string;
1134
+ /** Current (possibly remapped) combo, '' = unbound. */
1135
+ combo: string;
1136
+ /** Non-remappable extra combos (display + reservation only). */
1137
+ fixedCombos: string[];
1138
+ /** Display combos: [combo, ...fixedCombos] minus empties. */
1139
+ keys: string[];
1140
+ labelKey: string;
1141
+ groupKey: string;
1142
+ customizable: boolean;
1143
+ overridden: boolean;
1144
+ }
1145
+
910
1146
  /**
911
1147
  * Snippet segment parser — the search backend returns content snippets as
912
1148
  * PLAIN TEXT with matched words wrapped in «guillemets» (contract: no HTML
@@ -936,6 +1172,12 @@ onError?: ((message: string) => any) | undefined;
936
1172
  onChange?: ((value: boolean) => any) | undefined;
937
1173
  }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
938
1174
 
1175
+ /**
1176
+ * Create/update/empty the singleton `<style data-filex-theme>` element in
1177
+ * <head>. Idempotent — safe to call from every explorer instance.
1178
+ */
1179
+ export declare function syncThemeStyle(id: string): void;
1180
+
939
1181
  export declare const TagPicker: DefineComponent<__VLS_Props_4, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
940
1182
  error: (message: string) => any;
941
1183
  change: (tags: string[]) => any;
@@ -944,8 +1186,36 @@ onError?: ((message: string) => any) | undefined;
944
1186
  onChange?: ((tags: string[]) => any) | undefined;
945
1187
  }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
946
1188
 
1189
+ export declare const THEME_LS_KEY = "filex.theme";
1190
+
1191
+ export declare function themeById(id: string | null | undefined): ThemeDef | undefined;
1192
+
1193
+ export declare interface ThemeDef {
1194
+ /** Stable id — persisted in localStorage, never shown to users. */
1195
+ id: string;
1196
+ /** i18n catalogue key for the display name (tr + en). */
1197
+ nameKey: string;
1198
+ /** Palette applied when the resolved mode is light. */
1199
+ light: ThemeTokenMap;
1200
+ /** Palette applied when the resolved mode is dark. */
1201
+ dark: ThemeTokenMap;
1202
+ }
1203
+
1204
+ export declare const ThemeGallery: DefineComponent<__VLS_Props_6, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
1205
+ close: () => any;
1206
+ select: (id: string) => any;
1207
+ }, string, PublicProps, Readonly<__VLS_Props_6> & Readonly<{
1208
+ onClose?: (() => any) | undefined;
1209
+ onSelect?: ((id: string) => any) | undefined;
1210
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
1211
+
947
1212
  export declare type ThemeMode = 'light' | 'dark' | 'auto';
948
1213
 
1214
+ export declare const THEMES: ThemeDef[];
1215
+
1216
+ /** Map of `--fe-*` custom property → value. */
1217
+ export declare type ThemeTokenMap = Record<string, string>;
1218
+
949
1219
  /** Turkish UI strings. */
950
1220
  export declare const tr: Record<string, string>;
951
1221
 
@@ -1157,6 +1427,87 @@ export declare function useMonacoLoader(): {
1157
1427
  getHighlight: typeof getHighlight;
1158
1428
  };
1159
1429
 
1430
+ export declare function useOperations(): {
1431
+ active: Ref< {
1432
+ key: string;
1433
+ kind: OperationKind;
1434
+ name: string;
1435
+ percent: number | null;
1436
+ status: OperationStatus;
1437
+ error: string | null;
1438
+ queued: boolean;
1439
+ doneCount: number | null;
1440
+ totalCount: number | null;
1441
+ uploadedBytes: number | null;
1442
+ totalBytes: number | null;
1443
+ cancellable: boolean;
1444
+ retryable: boolean;
1445
+ startedAt: number;
1446
+ settledAt: number | null;
1447
+ }[], Operation[] | {
1448
+ key: string;
1449
+ kind: OperationKind;
1450
+ name: string;
1451
+ percent: number | null;
1452
+ status: OperationStatus;
1453
+ error: string | null;
1454
+ queued: boolean;
1455
+ doneCount: number | null;
1456
+ totalCount: number | null;
1457
+ uploadedBytes: number | null;
1458
+ totalBytes: number | null;
1459
+ cancellable: boolean;
1460
+ retryable: boolean;
1461
+ startedAt: number;
1462
+ settledAt: number | null;
1463
+ }[]>;
1464
+ history: Ref< {
1465
+ key: string;
1466
+ kind: OperationKind;
1467
+ name: string;
1468
+ percent: number | null;
1469
+ status: OperationStatus;
1470
+ error: string | null;
1471
+ queued: boolean;
1472
+ doneCount: number | null;
1473
+ totalCount: number | null;
1474
+ uploadedBytes: number | null;
1475
+ totalBytes: number | null;
1476
+ cancellable: boolean;
1477
+ retryable: boolean;
1478
+ startedAt: number;
1479
+ settledAt: number | null;
1480
+ }[], Operation[] | {
1481
+ key: string;
1482
+ kind: OperationKind;
1483
+ name: string;
1484
+ percent: number | null;
1485
+ status: OperationStatus;
1486
+ error: string | null;
1487
+ queued: boolean;
1488
+ doneCount: number | null;
1489
+ totalCount: number | null;
1490
+ uploadedBytes: number | null;
1491
+ totalBytes: number | null;
1492
+ cancellable: boolean;
1493
+ retryable: boolean;
1494
+ startedAt: number;
1495
+ settledAt: number | null;
1496
+ }[]>;
1497
+ runningCount: ComputedRef<number>;
1498
+ errorCount: ComputedRef<number>;
1499
+ hasError: ComputedRef<boolean>;
1500
+ overallPercent: ComputedRef<number | null>;
1501
+ sync: (group: string, items: Array<{
1502
+ input: OperationInput;
1503
+ actions?: OperationActions;
1504
+ }>) => void;
1505
+ cancel: (key: string) => void;
1506
+ retry: (key: string) => void;
1507
+ dismiss: (key: string) => void;
1508
+ clearHistory: () => void;
1509
+ };
1510
+
1160
1511
  export declare function usePendingOps(config: ExplorerConfig, api: FileApi, opts?: UsePendingOpsOptions): {
1161
1512
  ops: Ref< {
1162
1513
  id: number;
@@ -1226,6 +1577,15 @@ export declare function useSelection(items: () => FileNode[]): {
1226
1577
  nodes: ComputedRef<FileNode[]>;
1227
1578
  };
1228
1579
 
1580
+ /** Reactive, override-aware view of the registry (registry order). */
1581
+ export declare function useShortcutList(): ComputedRef<ShortcutView[]>;
1582
+
1583
+ /** Reactive handle for components: `{ themeId, setTheme }`. */
1584
+ export declare function useThemeState(): {
1585
+ themeId: Ref<string>;
1586
+ setTheme: (id: string) => void;
1587
+ };
1588
+
1229
1589
  export declare function useUploadChunked(config: ExplorerConfig, api: FileApi): {
1230
1590
  uploadFile: (opts: UploadOptions) => Promise<UploadFinalizeResponse>;
1231
1591
  };