@brftech/filex-core 0.31.0 → 0.33.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 (62) hide show
  1. package/README.md +26 -2
  2. package/dist/{CsvViewer-DxujFEM3.js → CsvViewer-CqWeV8VO.js} +22 -22
  3. package/dist/CsvViewer-CqWeV8VO.js.map +1 -0
  4. package/dist/{DrawioViewer-DCvWnX2t.js → DrawioViewer-BNALOB04.js} +16 -16
  5. package/dist/DrawioViewer-BNALOB04.js.map +1 -0
  6. package/dist/filex-core.js +9346 -8069
  7. package/dist/filex-core.js.map +1 -1
  8. package/dist/filex-core.umd.cjs +49 -49
  9. package/dist/filex-core.umd.cjs.map +1 -1
  10. package/dist/index.d.ts +235 -16
  11. package/dist/style.css +1 -1
  12. package/package.json +1 -1
  13. package/src/FileExplorer.vue +776 -246
  14. package/src/components/CommandPalette.vue +21 -5
  15. package/src/components/ConnectionsPanel.vue +2 -1
  16. package/src/components/E2eRecoveryUnlockModal.vue +29 -4
  17. package/src/components/FilterBar.vue +244 -0
  18. package/src/components/GalleryView.vue +12 -1
  19. package/src/components/GridView.vue +48 -5
  20. package/src/components/InspectorPanel.vue +231 -8
  21. package/src/components/ListView.vue +12 -3
  22. package/src/components/NFSExportsPanel.vue +2 -1
  23. package/src/components/PendingOpsTray.vue +1 -1
  24. package/src/components/PresenceBar.vue +3 -2
  25. package/src/components/S3KeysPanel.vue +2 -1
  26. package/src/components/SSHKeysPanel.vue +2 -1
  27. package/src/components/SecondaryPane.vue +28 -13
  28. package/src/components/SideNav.vue +161 -1
  29. package/src/components/StarButton.vue +2 -1
  30. package/src/components/TabBar.vue +2 -2
  31. package/src/components/ThemeGallery.vue +1 -1
  32. package/src/components/TokensPanel.vue +2 -1
  33. package/src/components/Toolbar.vue +244 -58
  34. package/src/components/ViewSwitcher.vue +81 -0
  35. package/src/composables/useFileApi.ts +49 -2
  36. package/src/composables/useLocale.ts +1 -1
  37. package/src/composables/useOperations.ts +3 -3
  38. package/src/composables/usePendingOps.ts +1 -1
  39. package/src/composables/useTabs.ts +1 -1
  40. package/src/composables/useUploadChunked.ts +39 -7
  41. package/src/index.ts +8 -2
  42. package/src/lib/e2ecrypto.ts +191 -3
  43. package/src/lib/fileFilters.ts +143 -0
  44. package/src/lib/listing.ts +47 -0
  45. package/src/lib/themes.ts +7 -7
  46. package/src/lib/transfer.ts +6 -6
  47. package/src/locales/en.ts +115 -0
  48. package/src/locales/index.ts +1 -0
  49. package/src/locales/resolve.ts +66 -0
  50. package/src/locales/tr.ts +116 -0
  51. package/src/modals/ConvertModal.vue +14 -12
  52. package/src/modals/NewFolderModal.vue +1 -1
  53. package/src/modals/PermissionsModal.vue +30 -13
  54. package/src/modals/PreviewModal.vue +9 -9
  55. package/src/styles/base.css +520 -26
  56. package/src/styles/variables.css +1 -1
  57. package/src/types/ExplorerConfig.ts +18 -2
  58. package/src/types/FileNode.ts +1 -1
  59. package/src/viewers/CsvViewer.vue +4 -4
  60. package/src/viewers/DrawioViewer.vue +2 -2
  61. package/dist/CsvViewer-DxujFEM3.js.map +0 -1
  62. package/dist/DrawioViewer-DCvWnX2t.js.map +0 -1
@@ -275,7 +275,7 @@ filex-explorer {
275
275
  .fe-toolbar__spacer {
276
276
  flex: 1 1 auto;
277
277
  }
278
- /* Search + Yükle + Yenile pinned together so the cluster doesn't get
278
+ /* Search + Upload + Refresh pinned together so the cluster doesn't get
279
279
  * orphaned by the wrap point on narrow widths. */
280
280
  .fe-toolbar__search-group {
281
281
  display: inline-flex;
@@ -342,8 +342,9 @@ filex-explorer {
342
342
  gap: 4px;
343
343
  flex-wrap: wrap;
344
344
  padding: 6px 12px;
345
- /* ui-fix — split'te yan panel .fe-split__crumbs ile aynı yükseklik (ana
346
- panelin "Yola Git" butonu yoksa da satırlar aynı y'den başlasın). */
345
+ /* ui-fix — same height as the side pane's .fe-split__crumbs in split mode
346
+ (so both rows start at the same y even without the main pane's "Yola Git"
347
+ ✏ button). */
347
348
  min-height: 37px;
348
349
  background: var(--fe-bg);
349
350
  border-bottom: 1px solid var(--fe-border);
@@ -373,7 +374,7 @@ filex-explorer {
373
374
  .fe-breadcrumb__sep {
374
375
  color: var(--fe-text-muted);
375
376
  }
376
- /* Edit pencil button — V1.5: "yolu yazıp gideyim" */
377
+ /* Edit pencil button — V1.5, verbatim (translated): "let me type a path and go" */
377
378
  .fe-breadcrumb__edit {
378
379
  margin-left: auto;
379
380
  background: none;
@@ -2952,7 +2953,7 @@ filex-explorer {
2952
2953
  }
2953
2954
  }
2954
2955
  /* /wiring:c3 */
2955
- /* === wiring:c4 — onboarding turu, erişilebilirlik ve etkileşim cilası === */
2956
+ /* === wiring:c4 — onboarding tour, accessibility and interaction polish === */
2956
2957
 
2957
2958
  /* ---------- Focus ring: grid cards (list rows already had one) ---------- */
2958
2959
  .fe-grid__card:focus-visible {
@@ -3164,7 +3165,7 @@ filex-explorer {
3164
3165
  }
3165
3166
  /* === /wiring:c4 === */
3166
3167
 
3167
- /* === wiring:d1 — sekmeler (tab şeridi) + split panel === */
3168
+ /* === wiring:d1 — tabs (tab strip) + split pane === */
3168
3169
 
3169
3170
  /* Tab strip — thin row ABOVE the toolbar. The host renders it only with
3170
3171
  2+ tabs, so the default single-tab embed stays pixel-identical. */
@@ -3331,9 +3332,9 @@ filex-explorer {
3331
3332
  display: none;
3332
3333
  }
3333
3334
 
3334
- /* ui-fix — sol panel sarmalı: breadcrumb + durum şeritleri + body bir
3335
- flex-column. Split olmadan tüm genişlik; split olunca sol yarı (böylece
3336
- breadcrumb kendi panelini kaplar, SecondaryPane ile simetrik). */
3335
+ /* ui-fix — left pane wrapper: breadcrumb + status strips + body in one
3336
+ flex-column. Full width without split; the left half once split (so the
3337
+ breadcrumb spans its own pane only, symmetric with SecondaryPane). */
3337
3338
  .fe__primary {
3338
3339
  display: flex;
3339
3340
  flex-direction: column;
@@ -3373,12 +3374,13 @@ filex-explorer {
3373
3374
  .fe-split__crumbs {
3374
3375
  display: flex;
3375
3376
  align-items: center;
3376
- /* ui-fix — ana panel .fe-breadcrumb ile BİREBİR aynı ölçüler (gap/padding/
3377
- font) → split'te iki breadcrumb tam hizalı, ince kayma yok. */
3377
+ /* ui-fix — EXACTLY the same metrics as the main pane's .fe-breadcrumb
3378
+ (gap/padding/font) → in split mode the two breadcrumbs line up perfectly,
3379
+ with no hairline drift. */
3378
3380
  gap: 4px;
3379
3381
  flex: 0 0 auto;
3380
3382
  padding: 6px 12px;
3381
- min-height: 37px; /* ui-fix — ana panel .fe-breadcrumb ile aynı yükseklik */
3383
+ min-height: 37px; /* ui-fix — same height as the main pane's .fe-breadcrumb */
3382
3384
  border-bottom: 1px solid var(--fe-border);
3383
3385
  font-size: 13px;
3384
3386
  color: var(--fe-text-muted);
@@ -3390,7 +3392,7 @@ filex-explorer {
3390
3392
  background: transparent;
3391
3393
  color: inherit;
3392
3394
  font: inherit;
3393
- padding: 2px 6px; /* ui-fix — .fe-breadcrumb__crumb ile aynı */
3395
+ padding: 2px 6px; /* ui-fix — same as .fe-breadcrumb__crumb */
3394
3396
  border-radius: var(--fe-radius-sm);
3395
3397
  cursor: pointer;
3396
3398
  max-width: 140px;
@@ -3506,9 +3508,9 @@ filex-explorer {
3506
3508
  }
3507
3509
  /* === /wiring:d1 === */
3508
3510
 
3509
- /* === wiring:d2 — galeri görünümü (GalleryView.vue) === */
3511
+ /* === wiring:d2 — gallery view (GalleryView.vue) === */
3510
3512
 
3511
- /* Büyük thumbnail ızgarası: kare kartlar, ad altta, boyut+tarih hover'da. */
3513
+ /* Large thumbnail grid: square cards, name below, size+date on hover. */
3512
3514
  .fe-gal {
3513
3515
  display: grid;
3514
3516
  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
@@ -3573,8 +3575,9 @@ filex-explorer {
3573
3575
  width: 64px;
3574
3576
  height: 64px;
3575
3577
  }
3576
- /* Hover meta bandıthumbnail'ın altına oturan yarı saydam şerit; yalnız
3577
- hover/klavye odağında görünür (dokunmatikte kartın title'ı yeterli). */
3578
+ /* Hover meta banda translucent strip sitting at the bottom of the
3579
+ thumbnail; visible only on hover/keyboard focus (on touch the card's
3580
+ title is enough). */
3578
3581
  .fe-gal__meta {
3579
3582
  position: absolute;
3580
3583
  left: 0;
@@ -3622,11 +3625,11 @@ filex-explorer {
3622
3625
  text-align: center;
3623
3626
  color: var(--fe-text-muted);
3624
3627
  }
3625
- /* Dar/embed mini modda daha küçük döşemeler (2-3 sütun sığar). */
3628
+ /* Smaller tiles in narrow/embed mini mode (2-3 columns fit). */
3626
3629
  .fe--narrow .fe-gal {
3627
3630
  grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
3628
3631
  }
3629
- /* Yoğunluk: kompakt tercihte döşemeler küçülür (grid'le aynı mantık). */
3632
+ /* Density: tiles shrink under the compact preference (same logic as grid). */
3630
3633
  .fe--density-compact .fe-gal {
3631
3634
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
3632
3635
  gap: calc(var(--fe-gap) * 0.6);
@@ -3750,8 +3753,8 @@ filex-explorer {
3750
3753
  }
3751
3754
  /* === /wiring:d3 === */
3752
3755
 
3753
- /* === wiring:e2 — uçtan uca şifreli klasörler === */
3754
- /* Kilit açık şeridi (presence şeridiyle aynı yatay dil). */
3756
+ /* === wiring:e2 — end-to-end encrypted folders === */
3757
+ /* Unlocked strip (same horizontal language as the presence strip). */
3755
3758
  .fe-e2e-strip {
3756
3759
  display: flex;
3757
3760
  align-items: center;
@@ -3777,7 +3780,7 @@ filex-explorer {
3777
3780
  font-size: 12px;
3778
3781
  }
3779
3782
 
3780
- /* Kilit ekranı: fe-state dilinin üstüne parola formu. */
3783
+ /* Lock screen: a passphrase form on top of the fe-state language. */
3781
3784
  .fe-e2e-lock__form {
3782
3785
  display: flex;
3783
3786
  gap: 8px;
@@ -3790,7 +3793,7 @@ filex-explorer {
3790
3793
  min-width: 0;
3791
3794
  }
3792
3795
 
3793
- /* Şifreli klasör oluşturma modalı. */
3796
+ /* Encrypted-folder creation modal. */
3794
3797
  .fe-e2e-form {
3795
3798
  display: flex;
3796
3799
  flex-direction: column;
@@ -3826,7 +3829,7 @@ filex-explorer {
3826
3829
  accent-color: var(--fe-primary);
3827
3830
  }
3828
3831
 
3829
- /* NewFolderModal içindeki "şifreli klasör" giriş linki. */
3832
+ /* The "şifreli klasör" (encrypted folder) entry link inside NewFolderModal. */
3830
3833
  .fe-e2e-optlink {
3831
3834
  margin-top: 10px;
3832
3835
  padding: 0;
@@ -3914,6 +3917,20 @@ filex-explorer {
3914
3917
  font-size: 12.5px;
3915
3918
  color: var(--fe-text-muted);
3916
3919
  }
3920
+ /* Why the escrow key does not apply to THIS folder. Deliberately not muted
3921
+ to the point of invisibility: it is the answer to a question the reader
3922
+ is already asking, and the pre-adoption case has no other surface. */
3923
+ .fe-e2e-recover__note {
3924
+ margin: 0;
3925
+ padding: 8px 10px;
3926
+ font-size: 12.5px;
3927
+ line-height: 1.45;
3928
+ color: var(--fe-text);
3929
+ border: 1px solid var(--fe-border);
3930
+ border-left: 3px solid var(--fe-warning, #f59e0b);
3931
+ border-radius: var(--fe-radius);
3932
+ background: var(--fe-bg-elev);
3933
+ }
3917
3934
  .fe-e2e-recover__tabs {
3918
3935
  display: flex;
3919
3936
  gap: 4px;
@@ -3988,9 +4005,39 @@ filex-explorer {
3988
4005
  gap: 8px;
3989
4006
  flex: none;
3990
4007
  }
4008
+ /* wiring:e2 escrow-offer — the same strip, asking a heavier question:
4009
+ accepting hands the operator a permanent second key. Amber rather than
4010
+ the recovery offer's primary tint, so it does not read as routine. */
4011
+ .fe-e2e-upgrade--escrow {
4012
+ border-left-color: var(--fe-warning, #f59e0b);
4013
+ background: color-mix(in srgb, var(--fe-warning, #f59e0b) 7%, transparent);
4014
+ }
4015
+ /* The link to the honest long version has to LOOK like a link: it inherits
4016
+ the warning colour, and without this it read as ordinary sentence text —
4017
+ somebody being asked to hand over a key should be able to see the way to
4018
+ the page that explains what they are handing over. */
4019
+ .fe-e2e-upgrade__escrow a {
4020
+ color: inherit;
4021
+ text-decoration: underline;
4022
+ text-underline-offset: 2px;
4023
+ font-weight: 600;
4024
+ }
4025
+ .fe-e2e-upgrade__escrow a:hover,
4026
+ .fe-e2e-upgrade__escrow a:focus-visible {
4027
+ text-decoration-thickness: 2px;
4028
+ }
4029
+ .fe-e2e-upgrade__pw {
4030
+ display: flex;
4031
+ flex-direction: column;
4032
+ gap: 4px;
4033
+ margin-top: 8px;
4034
+ max-width: 320px;
4035
+ font-size: 12.5px;
4036
+ color: var(--fe-text-muted);
4037
+ }
3991
4038
  /* === /wiring:e2 === */
3992
4039
 
3993
- /* === ui-fix — toolbar tek satır + katlama + ölçüm şeridi ============= */
4040
+ /* === ui-fix — toolbar single row + folding + measure strip ============ */
3994
4041
  .fe:not(.fe--narrow) .fe-toolbar {
3995
4042
  flex-wrap: nowrap;
3996
4043
  }
@@ -4017,7 +4064,7 @@ filex-explorer {
4017
4064
  /* === /ui-fix ========================================================= */
4018
4065
 
4019
4066
 
4020
- /* === wiring:c1 — gündüz / gece / otomatik =============================
4067
+ /* === wiring:c1 — day / night / auto ====================================
4021
4068
  Lives at the top of the theme gallery: "night mode" is what people open the
4022
4069
  theme button looking for, and a palette picker that cannot answer that
4023
4070
  question is the wrong place to stop. */
@@ -4622,3 +4669,450 @@ filex-explorer {
4622
4669
  margin-left: auto;
4623
4670
  }
4624
4671
  /* --- /gezinti:g1 --- */
4672
+
4673
+ /* === surucu:d1 — the Drive shell (uiProfile: 'drive', GitHub #14) ======
4674
+ Everything here is additive and gated on a class the other two profiles
4675
+ never carry, so `standard` and `simple` render exactly what they rendered
4676
+ before this block existed.
4677
+
4678
+ ⚠ Unscoped and prefixed, like the rest of this file. A `<style scoped>` in
4679
+ an SFC compiles to `.cls[data-v-HASH]`, and the hash does not match in the
4680
+ web-component build — the rules silently stop applying in every embed, which
4681
+ is how the share dialog once shipped as raw unstyled HTML.
4682
+ ---------------------------------------------------------------------- */
4683
+
4684
+ /* ── the header ───────────────────────────────────────────────────────── */
4685
+ .fe-toolbar--drive {
4686
+ gap: 10px;
4687
+ padding: 8px 12px;
4688
+ }
4689
+ /* The field takes the row. `min-width: 0` because a flex item's default `auto`
4690
+ minimum is its content width and an <input> reports a wide one — without it
4691
+ the header refuses to shrink and the whole explorer grows a horizontal
4692
+ scrollbar at 390px. */
4693
+ .fe-toolbar__search-group--drive {
4694
+ flex: 1 1 auto;
4695
+ min-width: 0;
4696
+ gap: 8px;
4697
+ }
4698
+ .fe-drivesearch {
4699
+ position: relative;
4700
+ display: flex;
4701
+ align-items: center;
4702
+ gap: 8px;
4703
+ flex: 1 1 auto;
4704
+ min-width: 0;
4705
+ max-width: 720px;
4706
+ padding: 0 10px 0 12px;
4707
+ height: 40px;
4708
+ border-radius: 999px;
4709
+ border: 1px solid transparent;
4710
+ background: var(--fe-bg-elev);
4711
+ color: var(--fe-text);
4712
+ }
4713
+ .fe-drivesearch:focus-within {
4714
+ background: var(--fe-bg);
4715
+ border-color: var(--fe-border-strong);
4716
+ box-shadow: var(--fe-shadow-sm);
4717
+ }
4718
+ .fe-drivesearch__glass {
4719
+ flex: 0 0 auto;
4720
+ width: 18px;
4721
+ height: 18px;
4722
+ color: var(--fe-text-muted);
4723
+ }
4724
+ .fe-drivesearch__input {
4725
+ flex: 1 1 auto;
4726
+ min-width: 0;
4727
+ border: 0;
4728
+ background: transparent;
4729
+ color: inherit;
4730
+ font: inherit;
4731
+ font-size: 14px;
4732
+ outline: none;
4733
+ }
4734
+ .fe-drivesearch__input::placeholder {
4735
+ color: var(--fe-text-muted);
4736
+ }
4737
+ /* The ⌘K chip. A real button, not decoration: it is the one visible door to
4738
+ the palette in this shell, so it has to be clickable and tab-reachable —
4739
+ printing a shortcut nobody can press with a mouse is a hint, not a control. */
4740
+ .fe-drivesearch__kbd {
4741
+ flex: 0 0 auto;
4742
+ padding: 3px 8px;
4743
+ border: 1px solid var(--fe-border);
4744
+ border-radius: var(--fe-radius-sm);
4745
+ background: var(--fe-bg);
4746
+ color: var(--fe-text-muted);
4747
+ font: inherit;
4748
+ font-size: 11.5px;
4749
+ letter-spacing: 0.02em;
4750
+ cursor: pointer;
4751
+ white-space: nowrap;
4752
+ }
4753
+ .fe-drivesearch__kbd:hover {
4754
+ color: var(--fe-text);
4755
+ border-color: var(--fe-border-strong);
4756
+ }
4757
+ .fe-drivesearch__kbd:focus-visible {
4758
+ outline: 2px solid var(--fe-primary);
4759
+ outline-offset: 1px;
4760
+ }
4761
+
4762
+ /* ── the "+ New" button ───────────────────────────────────────────────── */
4763
+ .fe-sidenav__new {
4764
+ display: inline-flex;
4765
+ align-items: center;
4766
+ gap: 10px;
4767
+ width: 100%;
4768
+ padding: 11px 18px;
4769
+ border-radius: 999px;
4770
+ border: 1px solid var(--fe-primary);
4771
+ background: var(--fe-primary);
4772
+ color: var(--fe-text-on-primary);
4773
+ font: inherit;
4774
+ font-size: 14px;
4775
+ font-weight: 600;
4776
+ text-align: left;
4777
+ white-space: nowrap;
4778
+ overflow: hidden;
4779
+ cursor: pointer;
4780
+ box-shadow: var(--fe-shadow-sm);
4781
+ }
4782
+ .fe-sidenav__new:hover {
4783
+ background: var(--fe-primary-hover);
4784
+ border-color: var(--fe-primary-hover);
4785
+ }
4786
+ .fe-sidenav__new:focus-visible {
4787
+ outline: 2px solid var(--fe-primary);
4788
+ outline-offset: 2px;
4789
+ }
4790
+ .fe-sidenav__new .fe-ficon {
4791
+ width: 20px;
4792
+ height: 20px;
4793
+ flex: 0 0 auto;
4794
+ }
4795
+ /* On the rail it becomes a circle: a pill with no label is a stretched blob. */
4796
+ .fe-sidenav--rail .fe-sidenav__new {
4797
+ width: 40px;
4798
+ height: 40px;
4799
+ padding: 0;
4800
+ justify-content: center;
4801
+ border-radius: 50%;
4802
+ }
4803
+
4804
+ /* ── the storage line ─────────────────────────────────────────────────── */
4805
+ .fe-sidenav__quota {
4806
+ flex: 0 0 auto;
4807
+ padding: 10px 12px 12px;
4808
+ border-top: 1px solid var(--fe-border);
4809
+ }
4810
+ .fe-sidenav--rail .fe-sidenav__quota {
4811
+ padding: 10px 8px;
4812
+ }
4813
+ .fe-sidenav__quota-label {
4814
+ margin: 0 0 6px;
4815
+ font-size: 11px;
4816
+ font-weight: 600;
4817
+ letter-spacing: 0.04em;
4818
+ text-transform: uppercase;
4819
+ color: var(--fe-text-muted);
4820
+ }
4821
+ .fe-sidenav__quota-bar {
4822
+ height: 5px;
4823
+ border-radius: 999px;
4824
+ background: var(--fe-bg-hover);
4825
+ overflow: hidden;
4826
+ }
4827
+ .fe-sidenav__quota-fill {
4828
+ display: block;
4829
+ height: 100%;
4830
+ border-radius: 999px;
4831
+ background: var(--fe-primary);
4832
+ transition: width 0.2s ease;
4833
+ }
4834
+ .fe-sidenav__quota-text {
4835
+ margin: 6px 0 0;
4836
+ font-size: 12px;
4837
+ color: var(--fe-text-muted);
4838
+ }
4839
+
4840
+ /* ── the breadcrumb row ───────────────────────────────────────────────── */
4841
+ /* Not a drive shell: the wrapper leaves layout entirely, so the breadcrumb is
4842
+ the same flex child of .fe__primary it has always been. */
4843
+ .fe-subhead--plain {
4844
+ display: contents;
4845
+ }
4846
+ .fe-subhead {
4847
+ display: flex;
4848
+ align-items: center;
4849
+ gap: 8px;
4850
+ min-width: 0;
4851
+ }
4852
+ .fe-subhead > .fe-breadcrumb {
4853
+ flex: 1 1 auto;
4854
+ min-width: 0;
4855
+ }
4856
+ .fe-subhead__actions {
4857
+ flex: 0 0 auto;
4858
+ display: flex;
4859
+ align-items: center;
4860
+ gap: 6px;
4861
+ padding-right: 8px;
4862
+ }
4863
+
4864
+ /* ── the filter row ───────────────────────────────────────────────────── */
4865
+ .fe-filterbar {
4866
+ flex: 0 0 auto;
4867
+ display: flex;
4868
+ align-items: center;
4869
+ gap: 8px;
4870
+ padding: 8px 10px;
4871
+ /* Scrolls sideways ON ITSELF at 390px rather than widening the explorer:
4872
+ three chips and a clear button do not fit a phone, and the alternative is
4873
+ a horizontal scrollbar on everything. */
4874
+ overflow-x: auto;
4875
+ overflow-y: hidden;
4876
+ scrollbar-width: none;
4877
+ }
4878
+ .fe-filterbar::-webkit-scrollbar {
4879
+ display: none;
4880
+ }
4881
+ .fe-filterbar__chip {
4882
+ flex: 0 0 auto;
4883
+ display: inline-flex;
4884
+ align-items: center;
4885
+ gap: 4px;
4886
+ height: 32px;
4887
+ padding: 0 10px 0 12px;
4888
+ border: 1px solid var(--fe-border-strong);
4889
+ border-radius: 999px;
4890
+ background: transparent;
4891
+ color: var(--fe-text);
4892
+ font: inherit;
4893
+ font-size: 13px;
4894
+ cursor: pointer;
4895
+ white-space: nowrap;
4896
+ }
4897
+ .fe-filterbar__chip:hover {
4898
+ background: var(--fe-bg-hover);
4899
+ }
4900
+ .fe-filterbar__chip.is-set {
4901
+ background: var(--fe-bg-selected);
4902
+ border-color: var(--fe-primary);
4903
+ font-weight: 600;
4904
+ }
4905
+ .fe-filterbar__chip.is-open {
4906
+ border-color: var(--fe-primary);
4907
+ }
4908
+ .fe-filterbar__chip:focus-visible {
4909
+ outline: 2px solid var(--fe-primary);
4910
+ outline-offset: 1px;
4911
+ }
4912
+ .fe-filterbar__caret {
4913
+ width: 15px;
4914
+ height: 15px;
4915
+ }
4916
+ .fe-filterbar__clear {
4917
+ flex: 0 0 auto;
4918
+ border: 0;
4919
+ background: transparent;
4920
+ color: var(--fe-primary);
4921
+ font: inherit;
4922
+ font-size: 12.5px;
4923
+ cursor: pointer;
4924
+ padding: 4px 6px;
4925
+ border-radius: var(--fe-radius-sm);
4926
+ white-space: nowrap;
4927
+ }
4928
+ .fe-filterbar__clear:hover {
4929
+ background: var(--fe-bg-hover);
4930
+ }
4931
+ .fe-filterbar__count {
4932
+ flex: 0 0 auto;
4933
+ margin-left: auto;
4934
+ padding-left: 8px;
4935
+ font-size: 12px;
4936
+ color: var(--fe-text-muted);
4937
+ white-space: nowrap;
4938
+ }
4939
+ /* Teleported to <body>: z-index 90, the layer the context menus already use.
4940
+ The onboarding tour sits above at 96 on purpose — a tour step must never end
4941
+ up behind a filter popover. */
4942
+ .fe-filterpop {
4943
+ position: fixed;
4944
+ z-index: 90;
4945
+ min-width: 190px;
4946
+ max-height: 60vh;
4947
+ overflow-y: auto;
4948
+ padding: 6px;
4949
+ border: 1px solid var(--fe-border);
4950
+ border-radius: var(--fe-radius-md);
4951
+ background: var(--fe-bg);
4952
+ color: var(--fe-text);
4953
+ box-shadow: var(--fe-shadow);
4954
+ font-family: var(--fe-font);
4955
+ }
4956
+ .fe-filterpop__item {
4957
+ display: flex;
4958
+ align-items: center;
4959
+ gap: 8px;
4960
+ width: 100%;
4961
+ padding: 7px 10px;
4962
+ border: 0;
4963
+ border-radius: var(--fe-radius-sm);
4964
+ background: transparent;
4965
+ color: inherit;
4966
+ font: inherit;
4967
+ font-size: 13px;
4968
+ text-align: left;
4969
+ cursor: pointer;
4970
+ }
4971
+ .fe-filterpop__item:hover {
4972
+ background: var(--fe-bg-hover);
4973
+ }
4974
+ .fe-filterpop__item:focus-visible {
4975
+ outline: 2px solid var(--fe-primary);
4976
+ outline-offset: -2px;
4977
+ }
4978
+ .fe-filterpop__tick {
4979
+ flex: 0 0 14px;
4980
+ color: var(--fe-primary);
4981
+ font-size: 12px;
4982
+ }
4983
+
4984
+ /* ── Folders / Files sections in the grid ─────────────────────────────── */
4985
+ /* A grid item spanning every column, so the cards keep flowing under it. */
4986
+ .fe-grid__heading {
4987
+ grid-column: 1 / -1;
4988
+ margin: 6px 2px 2px;
4989
+ font-size: 13px;
4990
+ font-weight: 600;
4991
+ color: var(--fe-text);
4992
+ }
4993
+ .fe-grid__heading:first-child {
4994
+ margin-top: 0;
4995
+ }
4996
+
4997
+ /* ── the details panel: tabs, people, link row ────────────────────────── */
4998
+ .fe-inspector__tabs {
4999
+ flex: 0 0 auto;
5000
+ display: flex;
5001
+ gap: 2px;
5002
+ padding: 0 10px;
5003
+ border-bottom: 1px solid var(--fe-border);
5004
+ }
5005
+ .fe-inspector__tab {
5006
+ padding: 9px 12px;
5007
+ border: 0;
5008
+ border-bottom: 2px solid transparent;
5009
+ background: transparent;
5010
+ color: var(--fe-text-muted);
5011
+ font: inherit;
5012
+ font-size: 13px;
5013
+ cursor: pointer;
5014
+ }
5015
+ .fe-inspector__tab:hover {
5016
+ color: var(--fe-text);
5017
+ }
5018
+ .fe-inspector__tab.is-active {
5019
+ color: var(--fe-primary);
5020
+ border-bottom-color: var(--fe-primary);
5021
+ font-weight: 600;
5022
+ }
5023
+ .fe-inspector__tab:focus-visible {
5024
+ outline: 2px solid var(--fe-primary);
5025
+ outline-offset: -2px;
5026
+ }
5027
+ .fe-inspector__people {
5028
+ list-style: none;
5029
+ margin: 0 0 8px;
5030
+ padding: 0;
5031
+ display: flex;
5032
+ flex-direction: column;
5033
+ gap: 8px;
5034
+ }
5035
+ .fe-inspector__person {
5036
+ display: flex;
5037
+ align-items: center;
5038
+ gap: 10px;
5039
+ min-width: 0;
5040
+ }
5041
+ .fe-inspector__avatar {
5042
+ flex: 0 0 28px;
5043
+ width: 28px;
5044
+ height: 28px;
5045
+ border-radius: 50%;
5046
+ display: inline-flex;
5047
+ align-items: center;
5048
+ justify-content: center;
5049
+ background: var(--fe-primary);
5050
+ color: var(--fe-text-on-primary);
5051
+ font-size: 12px;
5052
+ font-weight: 600;
5053
+ }
5054
+ .fe-inspector__person-main {
5055
+ display: flex;
5056
+ flex-direction: column;
5057
+ min-width: 0;
5058
+ }
5059
+ .fe-inspector__person-name {
5060
+ font-size: 13px;
5061
+ overflow: hidden;
5062
+ text-overflow: ellipsis;
5063
+ white-space: nowrap;
5064
+ }
5065
+ .fe-inspector__person-sub {
5066
+ font-size: 11.5px;
5067
+ color: var(--fe-text-muted);
5068
+ }
5069
+ .fe-inspector__linkrow {
5070
+ display: flex;
5071
+ align-items: center;
5072
+ gap: 8px;
5073
+ }
5074
+ .fe-inspector__linkicon {
5075
+ flex: 0 0 auto;
5076
+ font-size: 14px;
5077
+ }
5078
+ .fe-inspector__linknone {
5079
+ flex: 1 1 auto;
5080
+ min-width: 0;
5081
+ font-size: 13px;
5082
+ color: var(--fe-text-muted);
5083
+ }
5084
+ .fe-inspector__hint {
5085
+ margin: 6px 0 0;
5086
+ font-size: 12px;
5087
+ color: var(--fe-text-muted);
5088
+ }
5089
+
5090
+ /* ── narrow ───────────────────────────────────────────────────────────── */
5091
+ /* At 390px the chip is the only thing that has to go: the shortcut it prints
5092
+ cannot be typed on a phone anyway, and the palette stays reachable from the
5093
+ "⋯" menu. The field keeps the whole row. */
5094
+ .fe--narrow .fe-drivesearch__kbd {
5095
+ display: none;
5096
+ }
5097
+ .fe--narrow .fe-drivesearch {
5098
+ height: 36px;
5099
+ max-width: none;
5100
+ }
5101
+ .fe--narrow .fe-subhead__actions {
5102
+ padding-right: 4px;
5103
+ }
5104
+ .fe--narrow .fe-filterbar {
5105
+ padding: 6px 8px;
5106
+ }
5107
+ /* The narrow DRIVE header is three items: toggle · field · "⋯". The field is
5108
+ the only one that grows, and `min-width: 0` is what lets it shrink past its
5109
+ own content width — without it the row is wider than the phone. */
5110
+ .fe-toolbar--narrow.fe-toolbar--drive {
5111
+ gap: 6px;
5112
+ padding: 6px 8px;
5113
+ }
5114
+ .fe-toolbar--narrow .fe-drivesearch {
5115
+ flex: 1 1 auto;
5116
+ min-width: 0;
5117
+ }
5118
+ /* === /surucu:d1 === */
@@ -106,7 +106,7 @@
106
106
  --fe-icon-archive: #78716c;
107
107
  --fe-icon-code: #4f46e5;
108
108
  --fe-icon-text: #64748b;
109
- --fe-icon-unknown: #64748b; /* ui-fix: acik temada 3:1 UI kontrasti */
109
+ --fe-icon-unknown: #64748b; /* ui-fix: 3:1 UI contrast on the light theme */
110
110
  }
111
111
 
112
112
  /* Dark values — same selector strategy as the palette blocks above. */