@brftech/filex-core 0.5.0 → 0.7.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 (49) hide show
  1. package/dist/{ArchiveViewer-DKW-HyXT.js → ArchiveViewer-w6GDJJt9.js} +2 -2
  2. package/dist/{ArchiveViewer-DKW-HyXT.js.map → ArchiveViewer-w6GDJJt9.js.map} +1 -1
  3. package/dist/{CsvViewer-D2HmP2yr.js → CsvViewer-Ci5-mke8.js} +2 -2
  4. package/dist/{CsvViewer-D2HmP2yr.js.map → CsvViewer-Ci5-mke8.js.map} +1 -1
  5. package/dist/{DrawioViewer-DPNvOFCs.js → DrawioViewer-D2iMuQfD.js} +2 -2
  6. package/dist/{DrawioViewer-DPNvOFCs.js.map → DrawioViewer-D2iMuQfD.js.map} +1 -1
  7. package/dist/{EpubViewer-ByqjNuNL.js → EpubViewer-D4ydsa9X.js} +2 -2
  8. package/dist/{EpubViewer-ByqjNuNL.js.map → EpubViewer-D4ydsa9X.js.map} +1 -1
  9. package/dist/{IpynbViewer-2iONhbuJ.js → IpynbViewer-CWBwiFKX.js} +2 -2
  10. package/dist/{IpynbViewer-2iONhbuJ.js.map → IpynbViewer-CWBwiFKX.js.map} +1 -1
  11. package/dist/{MermaidViewer-CmiU7hIT.js → MermaidViewer-CDhuqQli.js} +2 -2
  12. package/dist/{MermaidViewer-CmiU7hIT.js.map → MermaidViewer-CDhuqQli.js.map} +1 -1
  13. package/dist/{PsdViewer-Inhl2yN9.js → PsdViewer-C_TkFb2H.js} +2 -2
  14. package/dist/{PsdViewer-Inhl2yN9.js.map → PsdViewer-C_TkFb2H.js.map} +1 -1
  15. package/dist/{TiffViewer-C2AFFEze.js → TiffViewer-BmWCXR7e.js} +2 -2
  16. package/dist/{TiffViewer-C2AFFEze.js.map → TiffViewer-BmWCXR7e.js.map} +1 -1
  17. package/dist/{Viewer3D-YdW14q_n.js → Viewer3D-5kPT1QsY.js} +2 -2
  18. package/dist/{Viewer3D-YdW14q_n.js.map → Viewer3D-5kPT1QsY.js.map} +1 -1
  19. package/dist/filex-core.js +66 -47
  20. package/dist/filex-core.umd.cjs +41 -40
  21. package/dist/filex-core.umd.cjs.map +1 -1
  22. package/dist/index-nc0-oI_l.js +11723 -0
  23. package/dist/index-nc0-oI_l.js.map +1 -0
  24. package/dist/index.d.ts +364 -1
  25. package/dist/style.css +1 -1
  26. package/package.json +1 -1
  27. package/src/FileExplorer.vue +756 -23
  28. package/src/components/CommandPalette.vue +12 -1
  29. package/src/components/EncryptedFolderModal.vue +125 -0
  30. package/src/components/GalleryView.vue +215 -0
  31. package/src/components/GridView.vue +2 -0
  32. package/src/components/InspectorPanel.vue +170 -0
  33. package/src/components/ListView.vue +2 -0
  34. package/src/components/SecondaryPane.vue +411 -0
  35. package/src/components/TabBar.vue +174 -0
  36. package/src/components/Toolbar.vue +23 -5
  37. package/src/composables/useFileApi.ts +60 -0
  38. package/src/composables/useKeyboardShortcuts.ts +19 -0
  39. package/src/composables/useTabs.ts +222 -0
  40. package/src/index.ts +27 -0
  41. package/src/lib/e2ecrypto.ts +299 -0
  42. package/src/locales/en.ts +67 -0
  43. package/src/locales/tr.ts +67 -0
  44. package/src/modals/NewFolderModal.vue +18 -0
  45. package/src/modals/PreviewModal.vue +7 -2
  46. package/src/styles/base.css +631 -0
  47. package/src/types/FileNode.ts +4 -1
  48. package/dist/index-eARevpz0.js +0 -9952
  49. package/dist/index-eARevpz0.js.map +0 -1
@@ -3077,3 +3077,634 @@ filex-explorer {
3077
3077
  }
3078
3078
  }
3079
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 === */
3618
+
3619
+ /* === wiring:e2 — uçtan uca şifreli klasörler === */
3620
+ /* Kilit açık şeridi (presence şeridiyle aynı yatay dil). */
3621
+ .fe-e2e-strip {
3622
+ display: flex;
3623
+ align-items: center;
3624
+ gap: 8px;
3625
+ padding: 4px 12px;
3626
+ font-size: 12.5px;
3627
+ color: var(--fe-text-muted);
3628
+ border-bottom: 1px solid var(--fe-border);
3629
+ background: var(--fe-bg-elev);
3630
+ }
3631
+ .fe-e2e-strip__icon {
3632
+ font-size: 13px;
3633
+ line-height: 1;
3634
+ }
3635
+ .fe-e2e-strip__label {
3636
+ flex: 1;
3637
+ overflow: hidden;
3638
+ text-overflow: ellipsis;
3639
+ white-space: nowrap;
3640
+ }
3641
+ .fe-e2e-strip__btn {
3642
+ padding: 2px 10px;
3643
+ font-size: 12px;
3644
+ }
3645
+
3646
+ /* Kilit ekranı: fe-state dilinin üstüne parola formu. */
3647
+ .fe-e2e-lock__form {
3648
+ display: flex;
3649
+ gap: 8px;
3650
+ align-items: stretch;
3651
+ margin-top: 12px;
3652
+ width: min(340px, 100%);
3653
+ }
3654
+ .fe-e2e-lock__input {
3655
+ flex: 1;
3656
+ min-width: 0;
3657
+ }
3658
+
3659
+ /* Şifreli klasör oluşturma modalı. */
3660
+ .fe-e2e-form {
3661
+ display: flex;
3662
+ flex-direction: column;
3663
+ gap: 10px;
3664
+ }
3665
+ .fe-e2e-warn {
3666
+ border: 1px solid var(--fe-danger);
3667
+ border-radius: var(--fe-radius-sm);
3668
+ padding: 8px 10px;
3669
+ font-size: 12.5px;
3670
+ color: var(--fe-text);
3671
+ background: color-mix(in srgb, var(--fe-danger) 8%, transparent);
3672
+ }
3673
+ .fe-e2e-warn strong {
3674
+ display: block;
3675
+ color: var(--fe-danger);
3676
+ margin-bottom: 2px;
3677
+ }
3678
+ .fe-e2e-warn p {
3679
+ margin: 0;
3680
+ color: var(--fe-text-muted);
3681
+ }
3682
+ .fe-e2e-ack {
3683
+ display: flex;
3684
+ align-items: flex-start;
3685
+ gap: 8px;
3686
+ font-size: 12.5px;
3687
+ color: var(--fe-text);
3688
+ cursor: pointer;
3689
+ }
3690
+ .fe-e2e-ack input {
3691
+ margin-top: 2px;
3692
+ accent-color: var(--fe-primary);
3693
+ }
3694
+
3695
+ /* NewFolderModal içindeki "şifreli klasör" giriş linki. */
3696
+ .fe-e2e-optlink {
3697
+ margin-top: 10px;
3698
+ padding: 0;
3699
+ border: none;
3700
+ background: none;
3701
+ font: inherit;
3702
+ font-size: 12.5px;
3703
+ color: var(--fe-primary);
3704
+ cursor: pointer;
3705
+ text-align: left;
3706
+ }
3707
+ .fe-e2e-optlink:hover {
3708
+ text-decoration: underline;
3709
+ }
3710
+ /* === /wiring:e2 === */
@@ -42,6 +42,9 @@ export interface FileNode {
42
42
  * projectFileNodes emits it when a storage has RBAC on). '' / undefined =
43
43
  * ACL not enforced. Used to gate edit/manage affordances client-side. */
44
44
  perm?: 'none' | 'viewer' | 'editor' | 'owner';
45
+ /* wiring:e2 — dir rows: true when the folder is E2E-encrypted (carries a
46
+ * `.filex-e2e.json` marker). Drives the 🔒 badge in the listings. */
47
+ e2e?: boolean;
45
48
  /** Generic — any additional fields the backend wants to inline. */
46
49
  [k: string]: unknown;
47
50
  }
@@ -114,7 +117,7 @@ export interface ArchiveEntry {
114
117
  lastModified?: number;
115
118
  }
116
119
 
117
- export type ViewMode = 'list' | 'grid';
120
+ export type ViewMode = 'list' | 'grid' | 'gallery'; /* wiring:d2 — üçüncü görünüm: galeri */
118
121
 
119
122
  export interface ClipboardState {
120
123
  mode: 'cut' | 'copy' | null;