@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.
Files changed (58) hide show
  1. package/dist/{ArchiveViewer-B_0IQExT.js → ArchiveViewer-EGgNqLPE.js} +2 -2
  2. package/dist/{ArchiveViewer-B_0IQExT.js.map → ArchiveViewer-EGgNqLPE.js.map} +1 -1
  3. package/dist/{CsvViewer-maMfUy5i.js → CsvViewer-BvriJ42M.js} +2 -2
  4. package/dist/{CsvViewer-maMfUy5i.js.map → CsvViewer-BvriJ42M.js.map} +1 -1
  5. package/dist/{DrawioViewer-DP_pXI00.js → DrawioViewer-B_bSPsWX.js} +2 -2
  6. package/dist/{DrawioViewer-DP_pXI00.js.map → DrawioViewer-B_bSPsWX.js.map} +1 -1
  7. package/dist/{EpubViewer-DSaqGnVx.js → EpubViewer-hl68h4gG.js} +2 -2
  8. package/dist/{EpubViewer-DSaqGnVx.js.map → EpubViewer-hl68h4gG.js.map} +1 -1
  9. package/dist/{IpynbViewer-BmdBanF1.js → IpynbViewer-lhwOjXK7.js} +2 -2
  10. package/dist/{IpynbViewer-BmdBanF1.js.map → IpynbViewer-lhwOjXK7.js.map} +1 -1
  11. package/dist/{MermaidViewer-Drlkl0Z5.js → MermaidViewer-H2Z6AYXg.js} +2 -2
  12. package/dist/{MermaidViewer-Drlkl0Z5.js.map → MermaidViewer-H2Z6AYXg.js.map} +1 -1
  13. package/dist/{PsdViewer-gftUJrsm.js → PsdViewer-Bsk-11yH.js} +2 -2
  14. package/dist/{PsdViewer-gftUJrsm.js.map → PsdViewer-Bsk-11yH.js.map} +1 -1
  15. package/dist/{TiffViewer-0Uv0-Lxh.js → TiffViewer-D-j9vycG.js} +2 -2
  16. package/dist/{TiffViewer-0Uv0-Lxh.js.map → TiffViewer-D-j9vycG.js.map} +1 -1
  17. package/dist/{Viewer3D-Gu3kUpxV.js → Viewer3D-Bcr70rTe.js} +2 -2
  18. package/dist/{Viewer3D-Gu3kUpxV.js.map → Viewer3D-Bcr70rTe.js.map} +1 -1
  19. package/dist/filex-core.js +50 -25
  20. package/dist/filex-core.umd.cjs +59 -58
  21. package/dist/filex-core.umd.cjs.map +1 -1
  22. package/dist/index-C_ZSnk_I.js +11109 -0
  23. package/dist/index-C_ZSnk_I.js.map +1 -0
  24. package/dist/index.d.ts +597 -4
  25. package/dist/style.css +1 -1
  26. package/package.json +1 -1
  27. package/src/FileExplorer.vue +636 -15
  28. package/src/components/CommandPalette.vue +24 -1
  29. package/src/components/ContextMenu.vue +114 -8
  30. package/src/components/GalleryView.vue +214 -0
  31. package/src/components/GridView.vue +34 -1
  32. package/src/components/InspectorPanel.vue +170 -0
  33. package/src/components/ListView.vue +40 -6
  34. package/src/components/OnboardingTour.vue +332 -0
  35. package/src/components/OperationsCenter.vue +284 -0
  36. package/src/components/PendingOpsTray.vue +50 -66
  37. package/src/components/QuickLook.vue +142 -0
  38. package/src/components/SecondaryPane.vue +411 -0
  39. package/src/components/ShortcutSettings.vue +270 -0
  40. package/src/components/ShortcutsHelp.vue +30 -9
  41. package/src/components/TabBar.vue +174 -0
  42. package/src/components/ThemeGallery.vue +253 -0
  43. package/src/components/Toolbar.vue +75 -11
  44. package/src/components/UploadProgress.vue +49 -57
  45. package/src/composables/useFileApi.ts +53 -0
  46. package/src/composables/useKeyboardShortcuts.ts +340 -137
  47. package/src/composables/useOperations.ts +291 -0
  48. package/src/composables/useTabs.ts +222 -0
  49. package/src/index.ts +51 -0
  50. package/src/lib/dragGhost.ts +41 -0
  51. package/src/lib/themes.ts +505 -0
  52. package/src/locales/en.ts +125 -0
  53. package/src/locales/tr.ts +125 -0
  54. package/src/modals/Modal.vue +41 -5
  55. package/src/styles/base.css +1210 -0
  56. package/src/types/FileNode.ts +1 -1
  57. package/dist/index-BLocdbmc.js +0 -7993
  58. package/dist/index-BLocdbmc.js.map +0 -1
@@ -2405,3 +2405,1213 @@ filex-explorer {
2405
2405
  }
2406
2406
  }
2407
2407
  }
2408
+
2409
+ /* wiring:c2 — shortcut settings modal + quick-look hint bar */
2410
+
2411
+ .fe-shortcuts__unbound {
2412
+ font-size: 12px;
2413
+ font-style: italic;
2414
+ color: var(--fe-text-muted);
2415
+ }
2416
+ .fe-shortcuts__custom {
2417
+ margin-left: 4px;
2418
+ font-size: 9px;
2419
+ vertical-align: 2px;
2420
+ color: var(--fe-primary);
2421
+ }
2422
+
2423
+ .fe-shortset {
2424
+ display: flex;
2425
+ flex-direction: column;
2426
+ gap: 14px;
2427
+ }
2428
+ .fe-shortset__topbar {
2429
+ display: flex;
2430
+ align-items: center;
2431
+ justify-content: space-between;
2432
+ gap: 12px;
2433
+ }
2434
+ .fe-shortset__hint {
2435
+ margin: 0;
2436
+ font-size: 12px;
2437
+ color: var(--fe-text-muted);
2438
+ flex: 1 1 auto;
2439
+ }
2440
+ .fe-shortset__reset-all {
2441
+ flex: 0 0 auto;
2442
+ }
2443
+ .fe-shortset__group {
2444
+ display: flex;
2445
+ flex-direction: column;
2446
+ }
2447
+ .fe-shortset__item {
2448
+ border-radius: var(--fe-radius-sm);
2449
+ padding: 2px 6px;
2450
+ margin: 0 -6px;
2451
+ }
2452
+ .fe-shortset__item.is-capturing {
2453
+ background: var(--fe-bg-hover);
2454
+ outline: 1px dashed var(--fe-primary);
2455
+ outline-offset: -1px;
2456
+ }
2457
+ .fe-shortset__item.is-conflict {
2458
+ background: color-mix(in srgb, var(--fe-danger) 8%, transparent);
2459
+ outline: 1px solid var(--fe-danger);
2460
+ outline-offset: -1px;
2461
+ }
2462
+ .fe-shortset__row {
2463
+ display: flex;
2464
+ align-items: center;
2465
+ gap: 12px;
2466
+ padding: 4px 0;
2467
+ min-height: 34px;
2468
+ }
2469
+ .fe-shortset__label {
2470
+ flex: 1 1 auto;
2471
+ font-size: 13px;
2472
+ color: var(--fe-text);
2473
+ }
2474
+ .fe-shortset__keys {
2475
+ flex: 0 0 auto;
2476
+ display: flex;
2477
+ align-items: center;
2478
+ gap: 6px;
2479
+ flex-wrap: wrap;
2480
+ justify-content: flex-end;
2481
+ }
2482
+ .fe-shortset__capture {
2483
+ font-size: 12px;
2484
+ color: var(--fe-primary);
2485
+ animation: fe-shortset-blink 1.1s ease-in-out infinite;
2486
+ }
2487
+ @keyframes fe-shortset-blink {
2488
+ 0%, 100% { opacity: 1; }
2489
+ 50% { opacity: 0.45; }
2490
+ }
2491
+ .fe-shortset__actions {
2492
+ flex: 0 0 auto;
2493
+ display: flex;
2494
+ align-items: center;
2495
+ gap: 6px;
2496
+ min-width: 118px;
2497
+ justify-content: flex-end;
2498
+ }
2499
+ .fe-shortset__btn {
2500
+ padding: 3px 9px;
2501
+ font-size: 12px;
2502
+ }
2503
+ .fe-shortset__fixed {
2504
+ font-size: 11px;
2505
+ text-transform: uppercase;
2506
+ letter-spacing: 0.04em;
2507
+ color: var(--fe-text-muted);
2508
+ border: 1px solid var(--fe-border);
2509
+ border-radius: var(--fe-radius-sm);
2510
+ padding: 2px 7px;
2511
+ }
2512
+ .fe-shortset__conflict {
2513
+ display: flex;
2514
+ align-items: center;
2515
+ gap: 10px;
2516
+ flex-wrap: wrap;
2517
+ padding: 6px 2px 8px;
2518
+ font-size: 12.5px;
2519
+ color: var(--fe-danger);
2520
+ }
2521
+ .fe-shortset__conflict-msg {
2522
+ flex: 1 1 auto;
2523
+ display: inline-flex;
2524
+ align-items: center;
2525
+ gap: 6px;
2526
+ min-width: 200px;
2527
+ }
2528
+ .fe-shortset__conflict-actions {
2529
+ flex: 0 0 auto;
2530
+ display: flex;
2531
+ gap: 6px;
2532
+ }
2533
+
2534
+ /* Quick-look hint bar — floats above the PreviewModal backdrop (z 70).
2535
+ * Carries the `.fe` class for the theme-variable cascade, so the `.fe`
2536
+ * root layout defaults (column flex, min-height 420px, 100% height)
2537
+ * must be explicitly neutralised here. */
2538
+ .fe-ql-hint {
2539
+ position: fixed;
2540
+ left: 50%;
2541
+ bottom: 14px;
2542
+ transform: translateX(-50%);
2543
+ z-index: 72;
2544
+ display: inline-flex;
2545
+ flex-direction: row;
2546
+ align-items: center;
2547
+ width: auto;
2548
+ height: auto;
2549
+ min-height: 0;
2550
+ gap: 6px;
2551
+ padding: 6px 12px;
2552
+ border-radius: 999px;
2553
+ border: 1px solid var(--fe-border);
2554
+ background: var(--fe-bg-elev);
2555
+ color: var(--fe-text-muted);
2556
+ font-size: 12px;
2557
+ box-shadow: var(--fe-shadow);
2558
+ pointer-events: none;
2559
+ white-space: nowrap;
2560
+ }
2561
+ .fe-ql-hint .fe-kbd {
2562
+ font-size: 10.5px;
2563
+ padding: 1px 5px;
2564
+ }
2565
+ .fe-ql-hint__sep {
2566
+ opacity: 0.5;
2567
+ }
2568
+ /* /wiring:c2 */
2569
+ /* =========================================================
2570
+ * wiring:c3 — Operations center (unified upload + ops-queue surface)
2571
+ * Badge bottom-right (count + aggregate progress ring), expanding
2572
+ * panel with active ops + session history. Replaces the old
2573
+ * .fe-upload / .fe-ops corner trays (those components are now
2574
+ * renderless publishers — their CSS above is retained but unused).
2575
+ * ================================================================ */
2576
+
2577
+ .fe-opc {
2578
+ position: absolute;
2579
+ right: 16px;
2580
+ bottom: 16px;
2581
+ z-index: 45;
2582
+ display: flex;
2583
+ flex-direction: column;
2584
+ align-items: flex-end;
2585
+ gap: 10px;
2586
+ max-width: calc(100% - 32px);
2587
+ }
2588
+
2589
+ .fe-opc__badge {
2590
+ display: flex;
2591
+ align-items: center;
2592
+ gap: 8px;
2593
+ padding: 8px 14px 8px 10px;
2594
+ border-radius: 999px;
2595
+ border: 1px solid var(--fe-border);
2596
+ background: var(--fe-bg);
2597
+ color: var(--fe-text);
2598
+ box-shadow: var(--fe-shadow);
2599
+ cursor: pointer;
2600
+ font: inherit;
2601
+ font-size: 13px;
2602
+ line-height: 1;
2603
+ }
2604
+ .fe-opc__badge:hover {
2605
+ background: var(--fe-bg-hover);
2606
+ }
2607
+ .fe-opc__badge:focus-visible {
2608
+ outline: 2px solid var(--fe-primary);
2609
+ outline-offset: 2px;
2610
+ }
2611
+ .fe-opc__badge.is-error {
2612
+ border-color: var(--fe-danger);
2613
+ }
2614
+ .fe-opc__badge.is-error .fe-opc__count {
2615
+ color: var(--fe-danger);
2616
+ }
2617
+
2618
+ .fe-opc__ring {
2619
+ width: 22px;
2620
+ height: 22px;
2621
+ flex: 0 0 auto;
2622
+ }
2623
+ .fe-opc__ring-track {
2624
+ stroke: var(--fe-border-strong);
2625
+ }
2626
+ .fe-opc__ring-fill {
2627
+ stroke: var(--fe-primary);
2628
+ transition: stroke-dashoffset 0.25s;
2629
+ }
2630
+ .fe-opc__badge.is-error .fe-opc__ring-fill {
2631
+ stroke: var(--fe-danger);
2632
+ }
2633
+ .fe-opc__ring--spin {
2634
+ animation: fe-opc-spin 1s linear infinite;
2635
+ }
2636
+ @keyframes fe-opc-spin {
2637
+ to {
2638
+ transform: rotate(360deg);
2639
+ }
2640
+ }
2641
+ .fe-opc__count {
2642
+ font-weight: 600;
2643
+ }
2644
+ .fe-opc__pct {
2645
+ color: var(--fe-text-muted);
2646
+ font-size: 12px;
2647
+ }
2648
+
2649
+ .fe-opc__panel {
2650
+ width: min(380px, calc(100vw - 32px));
2651
+ max-width: 100%;
2652
+ max-height: min(420px, 60vh);
2653
+ display: flex;
2654
+ flex-direction: column;
2655
+ overflow: hidden;
2656
+ background: var(--fe-bg);
2657
+ border: 1px solid var(--fe-border);
2658
+ border-radius: var(--fe-radius-lg);
2659
+ box-shadow: var(--fe-shadow);
2660
+ }
2661
+ .fe-opc__head {
2662
+ display: flex;
2663
+ align-items: center;
2664
+ justify-content: space-between;
2665
+ padding: 10px 14px;
2666
+ background: var(--fe-bg-elev);
2667
+ border-bottom: 1px solid var(--fe-border);
2668
+ font-size: 13px;
2669
+ }
2670
+ .fe-opc__body {
2671
+ overflow: auto;
2672
+ padding: 6px 0 8px;
2673
+ }
2674
+ .fe-opc__section + .fe-opc__section {
2675
+ border-top: 1px solid var(--fe-border);
2676
+ margin-top: 6px;
2677
+ }
2678
+ .fe-opc__section-title {
2679
+ display: flex;
2680
+ align-items: center;
2681
+ justify-content: space-between;
2682
+ margin: 0;
2683
+ padding: 8px 14px 4px;
2684
+ font-size: 11px;
2685
+ font-weight: 600;
2686
+ text-transform: uppercase;
2687
+ letter-spacing: 0.04em;
2688
+ color: var(--fe-text-muted);
2689
+ }
2690
+ .fe-opc__list {
2691
+ list-style: none;
2692
+ margin: 0;
2693
+ padding: 0;
2694
+ }
2695
+ .fe-opc__item {
2696
+ display: flex;
2697
+ align-items: flex-start;
2698
+ gap: 10px;
2699
+ padding: 8px 14px;
2700
+ }
2701
+ .fe-opc__item + .fe-opc__item {
2702
+ border-top: 1px solid var(--fe-border);
2703
+ }
2704
+ .fe-opc__item.is-error {
2705
+ background: color-mix(in srgb, var(--fe-danger) 7%, transparent);
2706
+ }
2707
+ .fe-opc__kicon {
2708
+ width: 18px;
2709
+ height: 18px;
2710
+ flex: 0 0 auto;
2711
+ margin-top: 2px;
2712
+ color: var(--fe-text-muted);
2713
+ }
2714
+ .fe-opc__item.is-error .fe-opc__kicon {
2715
+ color: var(--fe-danger);
2716
+ }
2717
+ .fe-opc__mid {
2718
+ flex: 1 1 auto;
2719
+ min-width: 0;
2720
+ }
2721
+ .fe-opc__name {
2722
+ overflow: hidden;
2723
+ text-overflow: ellipsis;
2724
+ white-space: nowrap;
2725
+ font-size: 13px;
2726
+ }
2727
+ .fe-opc__sub {
2728
+ display: flex;
2729
+ align-items: baseline;
2730
+ gap: 5px;
2731
+ font-size: 11px;
2732
+ color: var(--fe-text-muted);
2733
+ margin-top: 1px;
2734
+ min-width: 0;
2735
+ }
2736
+ .fe-opc__sub--err,
2737
+ .fe-opc__item.is-error .fe-opc__state {
2738
+ color: var(--fe-danger);
2739
+ }
2740
+ .fe-opc__state {
2741
+ overflow: hidden;
2742
+ text-overflow: ellipsis;
2743
+ white-space: nowrap;
2744
+ }
2745
+ .fe-opc__bar {
2746
+ background: var(--fe-bg-elev);
2747
+ border-radius: 99px;
2748
+ height: 5px;
2749
+ overflow: hidden;
2750
+ margin-top: 5px;
2751
+ }
2752
+ .fe-opc__bar-fill {
2753
+ background: var(--fe-primary);
2754
+ height: 100%;
2755
+ transition: width 0.2s;
2756
+ }
2757
+ .fe-opc__spin {
2758
+ flex: 0 0 auto;
2759
+ width: 14px;
2760
+ height: 14px;
2761
+ margin-top: 4px;
2762
+ border-radius: 50%;
2763
+ border: 2px solid var(--fe-border-strong);
2764
+ border-top-color: var(--fe-primary);
2765
+ animation: fe-opc-spin 0.8s linear infinite;
2766
+ }
2767
+ .fe-opc__acts {
2768
+ display: flex;
2769
+ align-items: center;
2770
+ gap: 2px;
2771
+ flex: 0 0 auto;
2772
+ }
2773
+ .fe-opc__act {
2774
+ background: transparent;
2775
+ border: 0;
2776
+ color: var(--fe-primary);
2777
+ cursor: pointer;
2778
+ font: inherit;
2779
+ font-size: 12px;
2780
+ padding: 2px 4px;
2781
+ border-radius: var(--fe-radius-sm);
2782
+ }
2783
+ .fe-opc__act:hover {
2784
+ background: var(--fe-bg-hover);
2785
+ }
2786
+ .fe-opc__act--retry {
2787
+ font-weight: 600;
2788
+ }
2789
+ .fe-opc__x {
2790
+ background: transparent;
2791
+ border: 0;
2792
+ color: var(--fe-text-muted);
2793
+ cursor: pointer;
2794
+ font-size: 16px;
2795
+ line-height: 1;
2796
+ padding: 0 4px;
2797
+ border-radius: var(--fe-radius-sm);
2798
+ }
2799
+ .fe-opc__x:hover {
2800
+ color: var(--fe-text);
2801
+ }
2802
+ .fe-opc__item--history .fe-opc__name {
2803
+ font-size: 12px;
2804
+ color: var(--fe-text-muted);
2805
+ }
2806
+ .fe-opc__chip {
2807
+ flex: 0 0 auto;
2808
+ font-size: 10px;
2809
+ font-weight: 600;
2810
+ padding: 2px 7px;
2811
+ border-radius: 999px;
2812
+ background: var(--fe-bg-elev);
2813
+ color: var(--fe-text-muted);
2814
+ }
2815
+ .fe-opc__chip.is-done {
2816
+ color: var(--fe-ok, #16a34a);
2817
+ background: color-mix(in srgb, var(--fe-ok, #16a34a) 12%, transparent);
2818
+ }
2819
+ .fe-opc__chip.is-error {
2820
+ color: var(--fe-danger);
2821
+ background: color-mix(in srgb, var(--fe-danger) 12%, transparent);
2822
+ }
2823
+ .fe-opc__item.is-done .fe-opc__bar-fill {
2824
+ background: var(--fe-ok, #16a34a);
2825
+ }
2826
+ .fe-opc__empty {
2827
+ margin: 0;
2828
+ padding: 16px 14px;
2829
+ font-size: 12px;
2830
+ color: var(--fe-text-muted);
2831
+ text-align: center;
2832
+ }
2833
+
2834
+ .fe-opc-pop-enter-active,
2835
+ .fe-opc-pop-leave-active {
2836
+ transition: transform 0.16s ease, opacity 0.16s ease;
2837
+ }
2838
+ .fe-opc-pop-enter-from,
2839
+ .fe-opc-pop-leave-to {
2840
+ opacity: 0;
2841
+ transform: translateY(8px) scale(0.98);
2842
+ }
2843
+
2844
+ /* Narrow / embedded: clear the FAB and behave like a bottom sheet —
2845
+ * badge stays compact at the right, panel stretches edge to edge. */
2846
+ .fe--narrow .fe-opc {
2847
+ left: 12px;
2848
+ right: 12px;
2849
+ bottom: 84px;
2850
+ max-width: none;
2851
+ }
2852
+ .fe--narrow .fe-opc__panel {
2853
+ width: 100%;
2854
+ max-height: 50vh;
2855
+ }
2856
+
2857
+ @media (prefers-reduced-motion: reduce) {
2858
+ .fe-opc__ring--spin,
2859
+ .fe-opc__spin {
2860
+ animation-duration: 3s;
2861
+ }
2862
+ .fe-opc-pop-enter-active,
2863
+ .fe-opc-pop-leave-active {
2864
+ transition: none;
2865
+ }
2866
+ }
2867
+ /* /wiring:c3 */
2868
+ =======
2869
+ /* === wiring:c4 — onboarding turu, erişilebilirlik ve etkileşim cilası === */
2870
+
2871
+ /* ---------- Focus ring: grid cards (list rows already had one) ---------- */
2872
+ .fe-grid__card:focus-visible {
2873
+ outline: 2px solid var(--fe-primary);
2874
+ outline-offset: 2px;
2875
+ }
2876
+ .fe-ctx__item:focus-visible {
2877
+ outline: 2px solid var(--fe-primary);
2878
+ outline-offset: -2px;
2879
+ background: var(--fe-bg-hover);
2880
+ }
2881
+
2882
+ /* ---------- Drag & drop feedback ---------- */
2883
+
2884
+ /* The folder currently hovered by an internal drag. Dashed ring + tinted
2885
+ background so it reads differently from plain selection. */
2886
+ .fe-list__row.is-droptarget,
2887
+ .fe-grid__card.is-droptarget {
2888
+ outline: 2px dashed var(--fe-primary);
2889
+ outline-offset: -2px;
2890
+ background: var(--fe-bg-selected);
2891
+ }
2892
+ .fe-grid__card.is-droptarget {
2893
+ border-color: var(--fe-primary);
2894
+ }
2895
+
2896
+ /* Custom drag ghost (lib/dragGhost.ts) — appended to <body>, themed via the
2897
+ :root/.dark token publication. */
2898
+ .fe-dragghost {
2899
+ display: inline-flex;
2900
+ align-items: center;
2901
+ gap: 8px;
2902
+ max-width: 260px;
2903
+ padding: 6px 10px;
2904
+ border: 1px solid var(--fe-border-strong);
2905
+ border-radius: var(--fe-radius);
2906
+ background: var(--fe-bg-elev);
2907
+ color: var(--fe-text);
2908
+ font-family: var(--fe-font);
2909
+ font-size: 13px;
2910
+ box-shadow: var(--fe-shadow-sm);
2911
+ pointer-events: none;
2912
+ z-index: 96;
2913
+ }
2914
+ .fe-dragghost__name {
2915
+ overflow: hidden;
2916
+ text-overflow: ellipsis;
2917
+ white-space: nowrap;
2918
+ }
2919
+ .fe-dragghost__badge {
2920
+ flex: 0 0 auto;
2921
+ min-width: 20px;
2922
+ padding: 1px 6px;
2923
+ border-radius: 999px;
2924
+ background: var(--fe-primary);
2925
+ color: var(--fe-text-on-primary);
2926
+ font-size: 12px;
2927
+ font-weight: 600;
2928
+ text-align: center;
2929
+ }
2930
+
2931
+ /* ---------- Error state: technical detail disclosure ---------- */
2932
+ .fe-state__details {
2933
+ margin-top: 10px;
2934
+ max-width: 480px;
2935
+ font-size: 12px;
2936
+ text-align: left;
2937
+ }
2938
+ .fe-state__details-summary {
2939
+ cursor: pointer;
2940
+ text-align: center;
2941
+ color: var(--fe-text-muted);
2942
+ user-select: none;
2943
+ }
2944
+ .fe-state__details-summary:focus-visible {
2945
+ outline: 2px solid var(--fe-primary);
2946
+ outline-offset: 2px;
2947
+ }
2948
+ .fe-state__details-pre {
2949
+ margin: 8px 0 0;
2950
+ padding: 8px 10px;
2951
+ border: 1px solid var(--fe-border);
2952
+ border-radius: var(--fe-radius-sm);
2953
+ background: var(--fe-bg-elev);
2954
+ font-family: var(--fe-font-mono);
2955
+ font-size: 11px;
2956
+ white-space: pre-wrap;
2957
+ word-break: break-word;
2958
+ max-height: 160px;
2959
+ overflow: auto;
2960
+ }
2961
+
2962
+ /* ---------- Onboarding tour ---------- */
2963
+
2964
+ .fe-tour {
2965
+ position: fixed;
2966
+ inset: 0;
2967
+ z-index: 96; /* above the command palette (95) */
2968
+ color: var(--fe-text);
2969
+ font-family: var(--fe-font);
2970
+ font-size: 14px;
2971
+ }
2972
+ /* Spotlight cutout: the element itself is transparent; the dim layer is the
2973
+ giant box-shadow around it. */
2974
+ .fe-tour__spot {
2975
+ position: fixed;
2976
+ border-radius: 10px;
2977
+ box-shadow: 0 0 0 9999px rgba(13, 19, 27, 0.55);
2978
+ border: 2px solid var(--fe-primary);
2979
+ pointer-events: none;
2980
+ }
2981
+ .fe-tour__dim {
2982
+ position: fixed;
2983
+ inset: 0;
2984
+ background: rgba(13, 19, 27, 0.55);
2985
+ pointer-events: none;
2986
+ }
2987
+ .fe-tour__card {
2988
+ position: fixed;
2989
+ display: flex;
2990
+ flex-direction: column;
2991
+ gap: 6px;
2992
+ padding: 14px 16px;
2993
+ border: 1px solid var(--fe-border-strong);
2994
+ border-radius: var(--fe-radius-lg);
2995
+ background: var(--fe-bg);
2996
+ color: var(--fe-text);
2997
+ box-shadow: var(--fe-shadow);
2998
+ outline: none;
2999
+ }
3000
+ .fe-tour__card--center {
3001
+ top: 50%;
3002
+ left: 50%;
3003
+ transform: translate(-50%, -50%);
3004
+ width: min(360px, calc(100vw - 24px));
3005
+ }
3006
+ .fe-tour__progress {
3007
+ margin: 0;
3008
+ font-size: 11px;
3009
+ font-weight: 600;
3010
+ letter-spacing: 0.06em;
3011
+ color: var(--fe-text-muted);
3012
+ }
3013
+ .fe-tour__title {
3014
+ margin: 0;
3015
+ font-size: 15px;
3016
+ font-weight: 700;
3017
+ }
3018
+ .fe-tour__desc {
3019
+ margin: 0;
3020
+ font-size: 13px;
3021
+ line-height: 1.5;
3022
+ color: var(--fe-text-muted);
3023
+ }
3024
+ .fe-tour__dots {
3025
+ display: flex;
3026
+ gap: 5px;
3027
+ margin-top: 4px;
3028
+ }
3029
+ .fe-tour__dot {
3030
+ width: 7px;
3031
+ height: 7px;
3032
+ border-radius: 50%;
3033
+ background: var(--fe-border-strong);
3034
+ transition: background 0.15s;
3035
+ }
3036
+ .fe-tour__dot.is-active {
3037
+ background: var(--fe-primary);
3038
+ }
3039
+ .fe-tour__actions {
3040
+ display: flex;
3041
+ align-items: center;
3042
+ gap: 8px;
3043
+ margin-top: 8px;
3044
+ }
3045
+ .fe-tour__actions-spacer {
3046
+ flex: 1 1 auto;
3047
+ }
3048
+ .fe-tour__skip {
3049
+ color: var(--fe-text-muted);
3050
+ }
3051
+ .fe-tour-enter-active,
3052
+ .fe-tour-leave-active {
3053
+ transition: opacity 0.16s ease;
3054
+ }
3055
+ .fe-tour-enter-from,
3056
+ .fe-tour-leave-to {
3057
+ opacity: 0;
3058
+ }
3059
+
3060
+ /* ---------- prefers-reduced-motion: quiet the remaining movers ---------- */
3061
+ @media (prefers-reduced-motion: reduce) {
3062
+ .fe-tour-enter-active,
3063
+ .fe-tour-leave-active,
3064
+ .fe-ctx-enter-active,
3065
+ .fe-ctx-leave-active,
3066
+ .fe-sheet-enter-active,
3067
+ .fe-sheet-leave-active,
3068
+ .fe-toast-enter-active,
3069
+ .fe-toast-leave-active {
3070
+ transition: none !important;
3071
+ }
3072
+ .fe-list__row,
3073
+ .fe-grid__card,
3074
+ .fe-tour__dot,
3075
+ .fe-list__col--star {
3076
+ transition: none !important;
3077
+ }
3078
+ }
3079
+ /* === /wiring:c4 === */
3080
+
3081
+ /* === wiring:d1 — sekmeler (tab şeridi) + split panel === */
3082
+
3083
+ /* Tab strip — thin row ABOVE the toolbar. The host renders it only with
3084
+ 2+ tabs, so the default single-tab embed stays pixel-identical. */
3085
+ .fe-tabs {
3086
+ display: flex;
3087
+ align-items: stretch;
3088
+ gap: 4px;
3089
+ flex: 0 0 auto;
3090
+ padding: 4px 6px 0;
3091
+ background: var(--fe-bg-elev);
3092
+ border-bottom: 1px solid var(--fe-border);
3093
+ user-select: none;
3094
+ }
3095
+ .fe-tabs__scroll {
3096
+ display: flex;
3097
+ align-items: stretch;
3098
+ gap: 2px;
3099
+ flex: 1 1 auto;
3100
+ min-width: 0;
3101
+ overflow-x: auto;
3102
+ scrollbar-width: thin;
3103
+ }
3104
+ .fe-tabs__tab {
3105
+ display: flex;
3106
+ align-items: center;
3107
+ gap: 6px;
3108
+ max-width: 180px;
3109
+ min-width: 72px;
3110
+ padding: 4px 6px 4px 10px;
3111
+ font-size: 12px;
3112
+ color: var(--fe-text-muted);
3113
+ background: transparent;
3114
+ border: 1px solid transparent;
3115
+ border-bottom: none;
3116
+ border-radius: 8px 8px 0 0;
3117
+ cursor: pointer;
3118
+ white-space: nowrap;
3119
+ position: relative;
3120
+ }
3121
+ .fe-tabs__tab:hover {
3122
+ background: var(--fe-bg-hover);
3123
+ color: var(--fe-text);
3124
+ }
3125
+ .fe-tabs__tab.is-active {
3126
+ background: var(--fe-bg);
3127
+ color: var(--fe-text);
3128
+ border-color: var(--fe-border);
3129
+ }
3130
+ /* Mask the strip's bottom border under the active tab (connected look). */
3131
+ .fe-tabs__tab.is-active::after {
3132
+ content: '';
3133
+ position: absolute;
3134
+ left: 0;
3135
+ right: 0;
3136
+ bottom: -1px;
3137
+ height: 1px;
3138
+ background: var(--fe-bg);
3139
+ }
3140
+ .fe-tabs__tab.is-dragover {
3141
+ outline: 1px dashed var(--fe-primary);
3142
+ outline-offset: -2px;
3143
+ }
3144
+ .fe-tabs__tab:focus-visible {
3145
+ outline: 2px solid var(--fe-primary);
3146
+ outline-offset: -2px;
3147
+ }
3148
+ .fe-tabs__label {
3149
+ overflow: hidden;
3150
+ text-overflow: ellipsis;
3151
+ flex: 1 1 auto;
3152
+ min-width: 0;
3153
+ }
3154
+ .fe-tabs__splitdot {
3155
+ width: 6px;
3156
+ height: 6px;
3157
+ border-radius: 2px;
3158
+ background: var(--fe-primary);
3159
+ flex: 0 0 auto;
3160
+ }
3161
+ .fe-tabs__close {
3162
+ flex: 0 0 auto;
3163
+ width: 16px;
3164
+ height: 16px;
3165
+ line-height: 1;
3166
+ display: inline-flex;
3167
+ align-items: center;
3168
+ justify-content: center;
3169
+ border: none;
3170
+ border-radius: 4px;
3171
+ background: transparent;
3172
+ color: inherit;
3173
+ font-size: 13px;
3174
+ cursor: pointer;
3175
+ padding: 0;
3176
+ }
3177
+ .fe-tabs__close:hover {
3178
+ background: var(--fe-bg-hover);
3179
+ }
3180
+ .fe-tabs__new,
3181
+ .fe-tabs__split {
3182
+ flex: 0 0 auto;
3183
+ align-self: center;
3184
+ width: 22px;
3185
+ height: 22px;
3186
+ display: inline-flex;
3187
+ align-items: center;
3188
+ justify-content: center;
3189
+ border: 1px solid transparent;
3190
+ border-radius: 6px;
3191
+ background: transparent;
3192
+ color: var(--fe-text-muted);
3193
+ font-size: 15px;
3194
+ cursor: pointer;
3195
+ padding: 0;
3196
+ }
3197
+ .fe-tabs__split .fe-ficon {
3198
+ width: 14px;
3199
+ height: 14px;
3200
+ }
3201
+ .fe-tabs__new:hover,
3202
+ .fe-tabs__split:hover {
3203
+ background: var(--fe-bg-hover);
3204
+ color: var(--fe-text);
3205
+ }
3206
+ .fe-tabs__split.is-active {
3207
+ background: var(--fe-bg-selected);
3208
+ color: var(--fe-primary);
3209
+ border-color: var(--fe-border);
3210
+ }
3211
+ /* Narrow embeds: split disabled — the host already hides the button via
3212
+ prop; this is belt & braces. */
3213
+ .fe--narrow .fe-tabs__split {
3214
+ display: none;
3215
+ }
3216
+
3217
+ /* Split layout — equal halves inside fe__main; the inspector (koru:k1)
3218
+ keeps its fixed width to the right of both. */
3219
+ .fe__main--split > .fe__body {
3220
+ flex: 1 1 50%;
3221
+ }
3222
+ .fe-split {
3223
+ flex: 1 1 50%;
3224
+ min-width: 0;
3225
+ min-height: 0;
3226
+ display: flex;
3227
+ flex-direction: column;
3228
+ border-left: 1px solid var(--fe-border);
3229
+ background: var(--fe-bg);
3230
+ color: var(--fe-text);
3231
+ }
3232
+ /* Active-panel accent: a thin top line on whichever pane owns the keyboard. */
3233
+ .fe__main--split > .fe__body,
3234
+ .fe-split {
3235
+ box-shadow: inset 0 2px 0 transparent;
3236
+ }
3237
+ .fe__main--split > .fe__body.fe-pane--focus,
3238
+ .fe-split.fe-pane--focus {
3239
+ box-shadow: inset 0 2px 0 var(--fe-primary);
3240
+ }
3241
+
3242
+ .fe-split__crumbs {
3243
+ display: flex;
3244
+ align-items: center;
3245
+ gap: 2px;
3246
+ flex: 0 0 auto;
3247
+ padding: 6px 8px;
3248
+ border-bottom: 1px solid var(--fe-border);
3249
+ font-size: 12px;
3250
+ color: var(--fe-text-muted);
3251
+ overflow: hidden;
3252
+ white-space: nowrap;
3253
+ }
3254
+ .fe-split__crumb {
3255
+ border: none;
3256
+ background: transparent;
3257
+ color: inherit;
3258
+ font: inherit;
3259
+ padding: 2px 5px;
3260
+ border-radius: 5px;
3261
+ cursor: pointer;
3262
+ max-width: 140px;
3263
+ overflow: hidden;
3264
+ text-overflow: ellipsis;
3265
+ white-space: nowrap;
3266
+ }
3267
+ .fe-split__crumb:hover {
3268
+ background: var(--fe-bg-hover);
3269
+ color: var(--fe-text);
3270
+ }
3271
+ .fe-split__crumb.is-last {
3272
+ color: var(--fe-text);
3273
+ font-weight: 600;
3274
+ }
3275
+ .fe-split__sep {
3276
+ opacity: 0.6;
3277
+ flex: 0 0 auto;
3278
+ }
3279
+ .fe-split__spacer {
3280
+ flex: 1 1 auto;
3281
+ }
3282
+ .fe-split__closebtn {
3283
+ flex: 0 0 auto;
3284
+ width: 20px;
3285
+ height: 20px;
3286
+ display: inline-flex;
3287
+ align-items: center;
3288
+ justify-content: center;
3289
+ border: none;
3290
+ border-radius: 5px;
3291
+ background: transparent;
3292
+ color: var(--fe-text-muted);
3293
+ font-size: 14px;
3294
+ cursor: pointer;
3295
+ padding: 0;
3296
+ }
3297
+ .fe-split__closebtn:hover {
3298
+ background: var(--fe-bg-hover);
3299
+ color: var(--fe-text);
3300
+ }
3301
+
3302
+ .fe-split__body {
3303
+ flex: 1 1 auto;
3304
+ min-height: 0;
3305
+ overflow: auto;
3306
+ position: relative;
3307
+ }
3308
+ .fe-split__body.is-dropover {
3309
+ outline: 2px dashed var(--fe-primary);
3310
+ outline-offset: -4px;
3311
+ }
3312
+ .fe-split__list {
3313
+ padding: 4px 0;
3314
+ }
3315
+ .fe-split__row {
3316
+ display: flex;
3317
+ align-items: center;
3318
+ gap: 8px;
3319
+ padding: 5px 10px;
3320
+ font-size: 13px;
3321
+ cursor: default;
3322
+ }
3323
+ .fe-split__row:hover {
3324
+ background: var(--fe-bg-hover);
3325
+ }
3326
+ .fe-split__row.is-selected {
3327
+ background: var(--fe-bg-selected);
3328
+ }
3329
+ .fe-split__row.is-droptarget {
3330
+ outline: 1.5px dashed var(--fe-primary);
3331
+ outline-offset: -2px;
3332
+ border-radius: 6px;
3333
+ }
3334
+ .fe-split__row:focus-visible {
3335
+ outline: 2px solid var(--fe-primary);
3336
+ outline-offset: -2px;
3337
+ }
3338
+ .fe-split__icon {
3339
+ flex: 0 0 auto;
3340
+ width: 18px;
3341
+ height: 18px;
3342
+ display: inline-flex;
3343
+ align-items: center;
3344
+ justify-content: center;
3345
+ font-size: 16px;
3346
+ }
3347
+ .fe-split__icon .fe-ficon {
3348
+ width: 16px;
3349
+ height: 16px;
3350
+ }
3351
+ .fe-split__name {
3352
+ flex: 1 1 auto;
3353
+ min-width: 0;
3354
+ overflow: hidden;
3355
+ text-overflow: ellipsis;
3356
+ white-space: nowrap;
3357
+ }
3358
+ .fe-split__size {
3359
+ flex: 0 0 auto;
3360
+ color: var(--fe-text-muted);
3361
+ font-size: 11.5px;
3362
+ }
3363
+ .fe-split__state {
3364
+ padding: 24px 12px;
3365
+ text-align: center;
3366
+ color: var(--fe-text-muted);
3367
+ font-size: 12.5px;
3368
+ display: flex;
3369
+ flex-direction: column;
3370
+ gap: 10px;
3371
+ align-items: center;
3372
+ }
3373
+ /* === /wiring:d1 === */
3374
+
3375
+ /* === wiring:d2 — galeri görünümü (GalleryView.vue) === */
3376
+
3377
+ /* Büyük thumbnail ızgarası: kare kartlar, ad altta, boyut+tarih hover'da. */
3378
+ .fe-gal {
3379
+ display: grid;
3380
+ grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
3381
+ gap: var(--fe-gap);
3382
+ padding: var(--fe-gap);
3383
+ }
3384
+ .fe-gal__card {
3385
+ display: flex;
3386
+ flex-direction: column;
3387
+ align-items: stretch;
3388
+ border: 1px solid var(--fe-border);
3389
+ border-radius: var(--fe-radius);
3390
+ background: var(--fe-bg-elev);
3391
+ cursor: pointer;
3392
+ overflow: hidden;
3393
+ transition: background 0.08s, border-color 0.08s;
3394
+ user-select: none;
3395
+ }
3396
+ .fe-gal__card:hover {
3397
+ background: var(--fe-bg-hover);
3398
+ border-color: var(--fe-border-strong);
3399
+ }
3400
+ .fe-gal__card.is-selected {
3401
+ background: var(--fe-bg-selected);
3402
+ border-color: var(--fe-primary);
3403
+ }
3404
+ .fe-gal__card.is-trash {
3405
+ opacity: 0.7;
3406
+ }
3407
+ .fe-gal__card.is-clipped {
3408
+ opacity: 0.55;
3409
+ border-style: dashed;
3410
+ }
3411
+ .fe-gal__card:focus-visible {
3412
+ outline: 2px solid var(--fe-primary);
3413
+ outline-offset: 2px;
3414
+ }
3415
+ .fe-gal__card.is-droptarget {
3416
+ outline: 2px dashed var(--fe-primary);
3417
+ outline-offset: -2px;
3418
+ background: var(--fe-bg-selected);
3419
+ border-color: var(--fe-primary);
3420
+ }
3421
+ .fe-gal__thumb {
3422
+ position: relative;
3423
+ display: flex;
3424
+ align-items: center;
3425
+ justify-content: center;
3426
+ aspect-ratio: 1 / 1;
3427
+ background: var(--fe-bg);
3428
+ overflow: hidden;
3429
+ }
3430
+ .fe-gal__thumb img {
3431
+ width: 100%;
3432
+ height: 100%;
3433
+ object-fit: cover;
3434
+ }
3435
+ .fe-gal__icon {
3436
+ font-size: 44px;
3437
+ }
3438
+ .fe-gal__icon--svg svg {
3439
+ width: 64px;
3440
+ height: 64px;
3441
+ }
3442
+ /* Hover meta bandı — thumbnail'ın altına oturan yarı saydam şerit; yalnız
3443
+ hover/klavye odağında görünür (dokunmatikte kartın title'ı yeterli). */
3444
+ .fe-gal__meta {
3445
+ position: absolute;
3446
+ left: 0;
3447
+ right: 0;
3448
+ bottom: 0;
3449
+ display: flex;
3450
+ flex-direction: column;
3451
+ gap: 1px;
3452
+ padding: 6px 8px;
3453
+ font-size: 11px;
3454
+ line-height: 1.35;
3455
+ color: var(--fe-text);
3456
+ background: color-mix(in srgb, var(--fe-bg-elev) 88%, transparent);
3457
+ backdrop-filter: blur(2px);
3458
+ opacity: 0;
3459
+ transform: translateY(4px);
3460
+ transition: opacity 0.12s ease, transform 0.12s ease;
3461
+ pointer-events: none;
3462
+ }
3463
+ .fe-gal__card:hover .fe-gal__meta,
3464
+ .fe-gal__card:focus-visible .fe-gal__meta {
3465
+ opacity: 1;
3466
+ transform: translateY(0);
3467
+ }
3468
+ .fe-gal__meta-line {
3469
+ overflow: hidden;
3470
+ text-overflow: ellipsis;
3471
+ white-space: nowrap;
3472
+ }
3473
+ .fe-gal__meta-line--path {
3474
+ color: var(--fe-text-muted);
3475
+ font-style: italic;
3476
+ }
3477
+ .fe-gal__label {
3478
+ padding: 7px 9px;
3479
+ font-size: 13px;
3480
+ overflow: hidden;
3481
+ text-overflow: ellipsis;
3482
+ white-space: nowrap;
3483
+ text-align: center;
3484
+ }
3485
+ .fe-gal__empty {
3486
+ grid-column: 1 / -1;
3487
+ padding: 40px 20px;
3488
+ text-align: center;
3489
+ color: var(--fe-text-muted);
3490
+ }
3491
+ /* Dar/embed mini modda daha küçük döşemeler (2-3 sütun sığar). */
3492
+ .fe--narrow .fe-gal {
3493
+ grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
3494
+ }
3495
+ /* Yoğunluk: kompakt tercihte döşemeler küçülür (grid'le aynı mantık). */
3496
+ .fe--density-compact .fe-gal {
3497
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
3498
+ gap: calc(var(--fe-gap) * 0.6);
3499
+ }
3500
+ .fe--density-compact .fe-gal__label {
3501
+ padding: 5px 7px;
3502
+ font-size: 12px;
3503
+ }
3504
+ @media (prefers-reduced-motion: reduce) {
3505
+ .fe-gal__card,
3506
+ .fe-gal__meta {
3507
+ transition: none !important;
3508
+ transform: none;
3509
+ }
3510
+ }
3511
+ /* === /wiring:d2 === */
3512
+
3513
+ /* === wiring:d3 — inspector Yorumlar (node comments) === */
3514
+ .fe-inspector__countbadge {
3515
+ display: inline-flex;
3516
+ align-items: center;
3517
+ justify-content: center;
3518
+ min-width: 16px;
3519
+ height: 16px;
3520
+ padding: 0 4px;
3521
+ margin-left: 6px;
3522
+ border-radius: 8px;
3523
+ font-size: 10px;
3524
+ font-weight: 600;
3525
+ letter-spacing: 0;
3526
+ background: var(--fe-bg-hover);
3527
+ color: var(--fe-text);
3528
+ vertical-align: middle;
3529
+ }
3530
+
3531
+ .fe-inspector__comments {
3532
+ list-style: none;
3533
+ margin: 0 0 8px;
3534
+ padding: 0;
3535
+ display: flex;
3536
+ flex-direction: column;
3537
+ gap: 8px;
3538
+ }
3539
+ .fe-inspector__comment {
3540
+ border: 1px solid var(--fe-border);
3541
+ border-radius: 8px;
3542
+ padding: 6px 8px;
3543
+ background: var(--fe-bg);
3544
+ }
3545
+ .fe-inspector__comment-top {
3546
+ display: flex;
3547
+ align-items: baseline;
3548
+ gap: 6px;
3549
+ min-width: 0;
3550
+ }
3551
+ .fe-inspector__comment-author {
3552
+ font-size: 12px;
3553
+ font-weight: 600;
3554
+ color: var(--fe-text);
3555
+ overflow: hidden;
3556
+ text-overflow: ellipsis;
3557
+ white-space: nowrap;
3558
+ min-width: 0;
3559
+ }
3560
+ .fe-inspector__comment-time {
3561
+ font-size: 11px;
3562
+ color: var(--fe-text-muted);
3563
+ flex: 1 1 auto;
3564
+ white-space: nowrap;
3565
+ }
3566
+ .fe-inspector__comment-del {
3567
+ border: none;
3568
+ background: none;
3569
+ color: var(--fe-text-muted);
3570
+ font-size: 14px;
3571
+ line-height: 1;
3572
+ cursor: pointer;
3573
+ padding: 0 4px;
3574
+ border-radius: 4px;
3575
+ flex: 0 0 auto;
3576
+ }
3577
+ .fe-inspector__comment-del:hover {
3578
+ background: var(--fe-bg-hover);
3579
+ color: var(--fe-danger);
3580
+ }
3581
+ .fe-inspector__comment-del:disabled {
3582
+ opacity: 0.5;
3583
+ cursor: default;
3584
+ }
3585
+ .fe-inspector__comment-body {
3586
+ margin: 4px 0 0;
3587
+ font-size: 12px;
3588
+ line-height: 1.45;
3589
+ color: var(--fe-text);
3590
+ overflow-wrap: anywhere;
3591
+ white-space: pre-wrap;
3592
+ }
3593
+
3594
+ .fe-inspector__comment-form {
3595
+ display: flex;
3596
+ gap: 6px;
3597
+ align-items: center;
3598
+ }
3599
+ .fe-inspector__comment-input {
3600
+ flex: 1 1 auto;
3601
+ min-width: 0;
3602
+ border: 1px solid var(--fe-border);
3603
+ border-radius: 8px;
3604
+ background: var(--fe-bg);
3605
+ color: var(--fe-text);
3606
+ font: inherit;
3607
+ font-size: 12px;
3608
+ padding: 6px 8px;
3609
+ }
3610
+ .fe-inspector__comment-input:focus {
3611
+ outline: none;
3612
+ border-color: var(--fe-accent);
3613
+ }
3614
+ .fe-inspector__comment-input:disabled {
3615
+ opacity: 0.6;
3616
+ }
3617
+ /* === /wiring:d3 === */