@brftech/filex-core 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/{ArchiveViewer-DKW-HyXT.js → ArchiveViewer-EGgNqLPE.js} +2 -2
  2. package/dist/{ArchiveViewer-DKW-HyXT.js.map → ArchiveViewer-EGgNqLPE.js.map} +1 -1
  3. package/dist/{CsvViewer-D2HmP2yr.js → CsvViewer-BvriJ42M.js} +2 -2
  4. package/dist/{CsvViewer-D2HmP2yr.js.map → CsvViewer-BvriJ42M.js.map} +1 -1
  5. package/dist/{DrawioViewer-DPNvOFCs.js → DrawioViewer-B_bSPsWX.js} +2 -2
  6. package/dist/{DrawioViewer-DPNvOFCs.js.map → DrawioViewer-B_bSPsWX.js.map} +1 -1
  7. package/dist/{EpubViewer-ByqjNuNL.js → EpubViewer-hl68h4gG.js} +2 -2
  8. package/dist/{EpubViewer-ByqjNuNL.js.map → EpubViewer-hl68h4gG.js.map} +1 -1
  9. package/dist/{IpynbViewer-2iONhbuJ.js → IpynbViewer-lhwOjXK7.js} +2 -2
  10. package/dist/{IpynbViewer-2iONhbuJ.js.map → IpynbViewer-lhwOjXK7.js.map} +1 -1
  11. package/dist/{MermaidViewer-CmiU7hIT.js → MermaidViewer-H2Z6AYXg.js} +2 -2
  12. package/dist/{MermaidViewer-CmiU7hIT.js.map → MermaidViewer-H2Z6AYXg.js.map} +1 -1
  13. package/dist/{PsdViewer-Inhl2yN9.js → PsdViewer-Bsk-11yH.js} +2 -2
  14. package/dist/{PsdViewer-Inhl2yN9.js.map → PsdViewer-Bsk-11yH.js.map} +1 -1
  15. package/dist/{TiffViewer-C2AFFEze.js → TiffViewer-D-j9vycG.js} +2 -2
  16. package/dist/{TiffViewer-C2AFFEze.js.map → TiffViewer-D-j9vycG.js.map} +1 -1
  17. package/dist/{Viewer3D-YdW14q_n.js → Viewer3D-Bcr70rTe.js} +2 -2
  18. package/dist/{Viewer3D-YdW14q_n.js.map → Viewer3D-Bcr70rTe.js.map} +1 -1
  19. package/dist/filex-core.js +42 -39
  20. package/dist/filex-core.umd.cjs +59 -58
  21. package/dist/filex-core.umd.cjs.map +1 -1
  22. package/dist/index-C_ZSnk_I.js +11109 -0
  23. package/dist/index-C_ZSnk_I.js.map +1 -0
  24. package/dist/index.d.ts +234 -1
  25. package/dist/style.css +1 -1
  26. package/package.json +1 -1
  27. package/src/FileExplorer.vue +367 -14
  28. package/src/components/CommandPalette.vue +12 -1
  29. package/src/components/GalleryView.vue +214 -0
  30. package/src/components/GridView.vue +1 -0
  31. package/src/components/InspectorPanel.vue +170 -0
  32. package/src/components/ListView.vue +1 -0
  33. package/src/components/SecondaryPane.vue +411 -0
  34. package/src/components/TabBar.vue +174 -0
  35. package/src/components/Toolbar.vue +23 -5
  36. package/src/composables/useFileApi.ts +53 -0
  37. package/src/composables/useKeyboardShortcuts.ts +19 -0
  38. package/src/composables/useTabs.ts +222 -0
  39. package/src/index.ts +6 -0
  40. package/src/locales/en.ts +33 -0
  41. package/src/locales/tr.ts +33 -0
  42. package/src/styles/base.css +538 -0
  43. package/src/types/FileNode.ts +1 -1
  44. package/dist/index-eARevpz0.js +0 -9952
  45. package/dist/index-eARevpz0.js.map +0 -1
@@ -3077,3 +3077,541 @@ 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 === */
@@ -114,7 +114,7 @@ export interface ArchiveEntry {
114
114
  lastModified?: number;
115
115
  }
116
116
 
117
- export type ViewMode = 'list' | 'grid';
117
+ export type ViewMode = 'list' | 'grid' | 'gallery'; /* wiring:d2 — üçüncü görünüm: galeri */
118
118
 
119
119
  export interface ClipboardState {
120
120
  mode: 'cut' | 'copy' | null;