@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.
- package/README.md +26 -2
- package/dist/{CsvViewer-DxujFEM3.js → CsvViewer-CqWeV8VO.js} +22 -22
- package/dist/CsvViewer-CqWeV8VO.js.map +1 -0
- package/dist/{DrawioViewer-DCvWnX2t.js → DrawioViewer-BNALOB04.js} +16 -16
- package/dist/DrawioViewer-BNALOB04.js.map +1 -0
- package/dist/filex-core.js +9346 -8069
- package/dist/filex-core.js.map +1 -1
- package/dist/filex-core.umd.cjs +49 -49
- package/dist/filex-core.umd.cjs.map +1 -1
- package/dist/index.d.ts +235 -16
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/FileExplorer.vue +776 -246
- package/src/components/CommandPalette.vue +21 -5
- package/src/components/ConnectionsPanel.vue +2 -1
- package/src/components/E2eRecoveryUnlockModal.vue +29 -4
- package/src/components/FilterBar.vue +244 -0
- package/src/components/GalleryView.vue +12 -1
- package/src/components/GridView.vue +48 -5
- package/src/components/InspectorPanel.vue +231 -8
- package/src/components/ListView.vue +12 -3
- package/src/components/NFSExportsPanel.vue +2 -1
- package/src/components/PendingOpsTray.vue +1 -1
- package/src/components/PresenceBar.vue +3 -2
- package/src/components/S3KeysPanel.vue +2 -1
- package/src/components/SSHKeysPanel.vue +2 -1
- package/src/components/SecondaryPane.vue +28 -13
- package/src/components/SideNav.vue +161 -1
- package/src/components/StarButton.vue +2 -1
- package/src/components/TabBar.vue +2 -2
- package/src/components/ThemeGallery.vue +1 -1
- package/src/components/TokensPanel.vue +2 -1
- package/src/components/Toolbar.vue +244 -58
- package/src/components/ViewSwitcher.vue +81 -0
- package/src/composables/useFileApi.ts +49 -2
- package/src/composables/useLocale.ts +1 -1
- package/src/composables/useOperations.ts +3 -3
- package/src/composables/usePendingOps.ts +1 -1
- package/src/composables/useTabs.ts +1 -1
- package/src/composables/useUploadChunked.ts +39 -7
- package/src/index.ts +8 -2
- package/src/lib/e2ecrypto.ts +191 -3
- package/src/lib/fileFilters.ts +143 -0
- package/src/lib/listing.ts +47 -0
- package/src/lib/themes.ts +7 -7
- package/src/lib/transfer.ts +6 -6
- package/src/locales/en.ts +115 -0
- package/src/locales/index.ts +1 -0
- package/src/locales/resolve.ts +66 -0
- package/src/locales/tr.ts +116 -0
- package/src/modals/ConvertModal.vue +14 -12
- package/src/modals/NewFolderModal.vue +1 -1
- package/src/modals/PermissionsModal.vue +30 -13
- package/src/modals/PreviewModal.vue +9 -9
- package/src/styles/base.css +520 -26
- package/src/styles/variables.css +1 -1
- package/src/types/ExplorerConfig.ts +18 -2
- package/src/types/FileNode.ts +1 -1
- package/src/viewers/CsvViewer.vue +4 -4
- package/src/viewers/DrawioViewer.vue +2 -2
- package/dist/CsvViewer-DxujFEM3.js.map +0 -1
- package/dist/DrawioViewer-DCvWnX2t.js.map +0 -1
package/src/styles/base.css
CHANGED
|
@@ -275,7 +275,7 @@ filex-explorer {
|
|
|
275
275
|
.fe-toolbar__spacer {
|
|
276
276
|
flex: 1 1 auto;
|
|
277
277
|
}
|
|
278
|
-
/* Search +
|
|
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 —
|
|
346
|
-
|
|
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: "
|
|
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
|
|
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 —
|
|
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 —
|
|
3335
|
-
flex-column.
|
|
3336
|
-
breadcrumb
|
|
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 —
|
|
3377
|
-
font) → split
|
|
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 —
|
|
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
|
|
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 —
|
|
3511
|
+
/* === wiring:d2 — gallery view (GalleryView.vue) === */
|
|
3510
3512
|
|
|
3511
|
-
/*
|
|
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
|
|
3577
|
-
hover/
|
|
3578
|
+
/* Hover meta band — a 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
|
-
/*
|
|
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
|
-
/*
|
|
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 —
|
|
3754
|
-
/*
|
|
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
|
-
/*
|
|
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
|
-
/*
|
|
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
|
-
/*
|
|
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
|
|
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 —
|
|
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 === */
|
package/src/styles/variables.css
CHANGED
|
@@ -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:
|
|
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. */
|