@brftech/filex-core 0.4.1 → 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-BOXJ2ub7.js → ArchiveViewer-DKW-HyXT.js} +2 -2
  2. package/dist/{ArchiveViewer-BOXJ2ub7.js.map → ArchiveViewer-DKW-HyXT.js.map} +1 -1
  3. package/dist/{CsvViewer-CDs9EpJx.js → CsvViewer-D2HmP2yr.js} +2 -2
  4. package/dist/{CsvViewer-CDs9EpJx.js.map → CsvViewer-D2HmP2yr.js.map} +1 -1
  5. package/dist/{DrawioViewer-Q__JcUmq.js → DrawioViewer-DPNvOFCs.js} +2 -2
  6. package/dist/{DrawioViewer-Q__JcUmq.js.map → DrawioViewer-DPNvOFCs.js.map} +1 -1
  7. package/dist/{EpubViewer-BlsOD2xl.js → EpubViewer-ByqjNuNL.js} +2 -2
  8. package/dist/{EpubViewer-BlsOD2xl.js.map → EpubViewer-ByqjNuNL.js.map} +1 -1
  9. package/dist/{IpynbViewer-DKSFiZmv.js → IpynbViewer-2iONhbuJ.js} +2 -2
  10. package/dist/{IpynbViewer-DKSFiZmv.js.map → IpynbViewer-2iONhbuJ.js.map} +1 -1
  11. package/dist/{MermaidViewer-D2Gnp4yX.js → MermaidViewer-CmiU7hIT.js} +2 -2
  12. package/dist/{MermaidViewer-D2Gnp4yX.js.map → MermaidViewer-CmiU7hIT.js.map} +1 -1
  13. package/dist/{PsdViewer-BD-rIrF1.js → PsdViewer-Inhl2yN9.js} +2 -2
  14. package/dist/{PsdViewer-BD-rIrF1.js.map → PsdViewer-Inhl2yN9.js.map} +1 -1
  15. package/dist/{TiffViewer-8qitRwcZ.js → TiffViewer-C2AFFEze.js} +2 -2
  16. package/dist/{TiffViewer-8qitRwcZ.js.map → TiffViewer-C2AFFEze.js.map} +1 -1
  17. package/dist/{Viewer3D-WLmIjgmZ.js → Viewer3D-YdW14q_n.js} +2 -2
  18. package/dist/{Viewer3D-WLmIjgmZ.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 +56 -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 +689 -1
  50. package/dist/index-f-_N5BV1.js +0 -7972
  51. package/dist/index-f-_N5BV1.js.map +0 -1
@@ -499,6 +499,21 @@ filex-explorer {
499
499
  margin-top: 2px;
500
500
  font-style: italic;
501
501
  }
502
+ /* bul:s3 — search-result content snippet on grid cards (clamped to two
503
+ * lines; the full plain text lives in the title attribute). */
504
+ .fe-grid__snippet {
505
+ margin-top: 2px;
506
+ font-size: 11px;
507
+ line-height: 1.35;
508
+ color: var(--fe-text-muted);
509
+ display: -webkit-box;
510
+ -webkit-line-clamp: 2;
511
+ line-clamp: 2;
512
+ -webkit-box-orient: vertical;
513
+ overflow: hidden;
514
+ overflow-wrap: anywhere;
515
+ text-align: left;
516
+ }
502
517
  .fe-grid__empty {
503
518
  grid-column: 1 / -1;
504
519
  padding: 40px 20px;
@@ -1885,7 +1900,8 @@ filex-explorer {
1885
1900
  color: var(--fe-text-muted);
1886
1901
  }
1887
1902
  .fe-cmdp__mark,
1888
- .fe-list__mark {
1903
+ .fe-list__mark,
1904
+ .fe-grid__mark {
1889
1905
  background: color-mix(in srgb, var(--fe-primary) 22%, transparent);
1890
1906
  color: var(--fe-text);
1891
1907
  border-radius: 2px;
@@ -2389,3 +2405,675 @@ filex-explorer {
2389
2405
  }
2390
2406
  }
2391
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 === */