@brftech/filex-core 0.1.83 → 0.2.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-BRASXNIS.js → ArchiveViewer-DCZ1FZYV.js} +2 -2
  2. package/dist/{ArchiveViewer-BRASXNIS.js.map → ArchiveViewer-DCZ1FZYV.js.map} +1 -1
  3. package/dist/{CsvViewer-CgiLiHWw.js → CsvViewer-DMvnp82x.js} +2 -2
  4. package/dist/{CsvViewer-CgiLiHWw.js.map → CsvViewer-DMvnp82x.js.map} +1 -1
  5. package/dist/{DrawioViewer-D2I_uEng.js → DrawioViewer-B5Io0yTO.js} +2 -2
  6. package/dist/{DrawioViewer-D2I_uEng.js.map → DrawioViewer-B5Io0yTO.js.map} +1 -1
  7. package/dist/{EpubViewer-6nVPRR6R.js → EpubViewer-z6RZd3K8.js} +2 -2
  8. package/dist/{EpubViewer-6nVPRR6R.js.map → EpubViewer-z6RZd3K8.js.map} +1 -1
  9. package/dist/{IpynbViewer-B7p9hxFx.js → IpynbViewer-DfL4EauH.js} +2 -2
  10. package/dist/{IpynbViewer-B7p9hxFx.js.map → IpynbViewer-DfL4EauH.js.map} +1 -1
  11. package/dist/{MermaidViewer-O9vGvp4y.js → MermaidViewer-QNl_o7V-.js} +2 -2
  12. package/dist/{MermaidViewer-O9vGvp4y.js.map → MermaidViewer-QNl_o7V-.js.map} +1 -1
  13. package/dist/{PsdViewer-C6EaEAxF.js → PsdViewer-Btmpr0Fz.js} +2 -2
  14. package/dist/{PsdViewer-C6EaEAxF.js.map → PsdViewer-Btmpr0Fz.js.map} +1 -1
  15. package/dist/{TiffViewer-Dod4uIXI.js → TiffViewer-CMLpwds5.js} +2 -2
  16. package/dist/{TiffViewer-Dod4uIXI.js.map → TiffViewer-CMLpwds5.js.map} +1 -1
  17. package/dist/{Viewer3D-B3kLZrwO.js → Viewer3D-gf3cb2gv.js} +2 -2
  18. package/dist/{Viewer3D-B3kLZrwO.js.map → Viewer3D-gf3cb2gv.js.map} +1 -1
  19. package/dist/filex-core.js +17 -15
  20. package/dist/filex-core.umd.cjs +38 -38
  21. package/dist/filex-core.umd.cjs.map +1 -1
  22. package/dist/index-D49iw00E.js +7119 -0
  23. package/dist/index-D49iw00E.js.map +1 -0
  24. package/dist/index.d.ts +63 -0
  25. package/dist/style.css +1 -1
  26. package/package.json +1 -1
  27. package/src/FileExplorer.vue +440 -32
  28. package/src/components/Breadcrumb.vue +100 -5
  29. package/src/components/CommandPalette.vue +533 -0
  30. package/src/components/GridView.vue +8 -13
  31. package/src/components/ListView.vue +199 -21
  32. package/src/components/ShortcutsHelp.vue +59 -0
  33. package/src/components/Toolbar.vue +65 -1
  34. package/src/composables/useFileApi.ts +45 -0
  35. package/src/composables/useKeyboardShortcuts.ts +38 -0
  36. package/src/composables/useRealtime.ts +9 -1
  37. package/src/index.ts +4 -0
  38. package/src/lib/fileIcons.ts +127 -0
  39. package/src/lib/snippet.ts +43 -0
  40. package/src/locales/en.ts +62 -0
  41. package/src/locales/tr.ts +62 -0
  42. package/src/styles/base.css +650 -0
  43. package/src/styles/variables.css +70 -0
  44. package/dist/index-DL6_eaM3.js +0 -5888
  45. package/dist/index-DL6_eaM3.js.map +0 -1
@@ -1281,3 +1281,653 @@ filex-explorer {
1281
1281
  min-width: 120px;
1282
1282
  }
1283
1283
  }
1284
+
1285
+ /* === cila:a — file-type SVG icons + date group headers + density mode === */
1286
+
1287
+ /* SVG icon set (lib/fileIcons) — sized by the wrapper's font-size so the
1288
+ * existing 32px grid / 16px list scales keep working. */
1289
+ .fe-ficon {
1290
+ width: 1em;
1291
+ height: 1em;
1292
+ display: block;
1293
+ flex-shrink: 0;
1294
+ }
1295
+ .fe-ficon--folder { color: var(--fe-icon-folder); }
1296
+ .fe-ficon--image { color: var(--fe-icon-image); }
1297
+ .fe-ficon--video { color: var(--fe-icon-video); }
1298
+ .fe-ficon--audio { color: var(--fe-icon-audio); }
1299
+ .fe-ficon--pdf { color: var(--fe-icon-pdf); }
1300
+ .fe-ficon--doc { color: var(--fe-icon-doc); }
1301
+ .fe-ficon--sheet { color: var(--fe-icon-sheet); }
1302
+ .fe-ficon--slides { color: var(--fe-icon-slides); }
1303
+ .fe-ficon--archive { color: var(--fe-icon-archive); }
1304
+ .fe-ficon--code { color: var(--fe-icon-code); }
1305
+ .fe-ficon--text { color: var(--fe-icon-text); }
1306
+ .fe-ficon--unknown { color: var(--fe-icon-unknown); }
1307
+ .fe-grid__icon--svg {
1308
+ display: flex;
1309
+ align-items: center;
1310
+ justify-content: center;
1311
+ }
1312
+ .fe-list__icon--svg {
1313
+ display: inline-flex;
1314
+ align-items: center;
1315
+ }
1316
+
1317
+ /* Sortable list column headers — plain-looking buttons, arrow only when
1318
+ * the column drives the order. */
1319
+ .fe-list__sort {
1320
+ display: inline-flex;
1321
+ align-items: center;
1322
+ gap: 4px;
1323
+ background: transparent;
1324
+ border: 0;
1325
+ padding: 0;
1326
+ font: inherit;
1327
+ color: inherit;
1328
+ text-transform: inherit;
1329
+ letter-spacing: inherit;
1330
+ cursor: pointer;
1331
+ }
1332
+ .fe-list__sort:hover {
1333
+ color: var(--fe-text);
1334
+ }
1335
+ .fe-list__sort:focus-visible {
1336
+ outline: 2px solid var(--fe-primary);
1337
+ outline-offset: 2px;
1338
+ border-radius: 2px;
1339
+ }
1340
+ .fe-list__sort-arrow {
1341
+ font-size: 11px;
1342
+ color: var(--fe-primary);
1343
+ }
1344
+
1345
+ /* Date group headers (only while sorted by modified date) — thin, muted,
1346
+ * non-interactive. */
1347
+ .fe-list__group {
1348
+ padding: 12px 12px 4px;
1349
+ font-size: 11px;
1350
+ font-weight: 600;
1351
+ text-transform: uppercase;
1352
+ letter-spacing: 0.05em;
1353
+ color: var(--fe-text-muted);
1354
+ user-select: none;
1355
+ }
1356
+
1357
+ /* Density: compact — tighter rows/cards, smaller grid tiles. Toggled from
1358
+ * the toolbar; class lives on the `.fe` root. */
1359
+ .fe--density-compact .fe-toolbar {
1360
+ padding: 6px 8px;
1361
+ gap: 6px;
1362
+ }
1363
+ .fe--density-compact .fe-breadcrumb {
1364
+ padding: 4px 12px;
1365
+ }
1366
+ .fe--density-compact .fe-list__head {
1367
+ padding: 4px 12px;
1368
+ }
1369
+ .fe--density-compact .fe-list__row {
1370
+ padding: 3px 12px;
1371
+ }
1372
+ .fe--density-compact .fe-list__icon {
1373
+ font-size: 14px;
1374
+ }
1375
+ .fe--density-compact .fe-list__group {
1376
+ padding: 8px 12px 2px;
1377
+ }
1378
+ .fe--density-compact .fe-grid {
1379
+ grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
1380
+ gap: 8px;
1381
+ padding: 8px;
1382
+ }
1383
+ .fe--density-compact .fe-grid__card {
1384
+ padding: 6px;
1385
+ }
1386
+ .fe--density-compact .fe-grid__icon {
1387
+ font-size: 24px;
1388
+ }
1389
+
1390
+
1391
+ /* === cila:c — command palette + shortcuts help + breadcrumb overflow === */
1392
+
1393
+ /* Command palette (Ctrl/Cmd+K) — top-anchored launcher card. */
1394
+ .fe-cmdp__backdrop {
1395
+ align-items: flex-start;
1396
+ padding-top: min(18vh, 160px);
1397
+ }
1398
+ .fe-cmdp {
1399
+ background: var(--fe-bg);
1400
+ border: 1px solid var(--fe-border);
1401
+ border-radius: var(--fe-radius-lg);
1402
+ box-shadow: var(--fe-shadow);
1403
+ width: min(560px, calc(100vw - 32px));
1404
+ display: flex;
1405
+ flex-direction: column;
1406
+ overflow: hidden;
1407
+ }
1408
+ .fe-cmdp__inputwrap {
1409
+ display: flex;
1410
+ align-items: center;
1411
+ gap: 8px;
1412
+ padding: 10px 14px;
1413
+ border-bottom: 1px solid var(--fe-border);
1414
+ color: var(--fe-text-muted);
1415
+ }
1416
+ .fe-cmdp__glyph {
1417
+ flex: 0 0 auto;
1418
+ }
1419
+ .fe-cmdp__input {
1420
+ flex: 1 1 auto;
1421
+ min-width: 0;
1422
+ border: 0;
1423
+ outline: none;
1424
+ background: transparent;
1425
+ color: var(--fe-text);
1426
+ font: inherit;
1427
+ font-size: 15px;
1428
+ }
1429
+ .fe-cmdp__input::placeholder {
1430
+ color: var(--fe-text-muted);
1431
+ }
1432
+ .fe-cmdp__list {
1433
+ max-height: min(48vh, 380px);
1434
+ overflow-y: auto;
1435
+ padding: 6px;
1436
+ }
1437
+ .fe-cmdp__group {
1438
+ padding: 8px 10px 4px;
1439
+ font-size: 11px;
1440
+ font-weight: 600;
1441
+ letter-spacing: 0.05em;
1442
+ text-transform: uppercase;
1443
+ color: var(--fe-text-muted);
1444
+ }
1445
+ .fe-cmdp__item {
1446
+ display: flex;
1447
+ align-items: center;
1448
+ gap: 10px;
1449
+ width: 100%;
1450
+ text-align: left;
1451
+ background: transparent;
1452
+ border: 0;
1453
+ border-radius: var(--fe-radius-sm);
1454
+ padding: 8px 10px;
1455
+ color: var(--fe-text);
1456
+ font: inherit;
1457
+ font-size: 14px;
1458
+ cursor: pointer;
1459
+ }
1460
+ .fe-cmdp__item.is-active {
1461
+ background: var(--fe-bg-selected);
1462
+ }
1463
+ .fe-cmdp__item:focus-visible {
1464
+ outline: 2px solid var(--fe-primary);
1465
+ outline-offset: -2px;
1466
+ }
1467
+ .fe-cmdp__icon {
1468
+ flex: 0 0 auto;
1469
+ width: 20px;
1470
+ text-align: center;
1471
+ }
1472
+ .fe-cmdp__label {
1473
+ flex: 1 1 auto;
1474
+ overflow: hidden;
1475
+ text-overflow: ellipsis;
1476
+ white-space: nowrap;
1477
+ }
1478
+ .fe-cmdp__empty {
1479
+ padding: 20px 12px;
1480
+ text-align: center;
1481
+ color: var(--fe-text-muted);
1482
+ font-size: 13px;
1483
+ }
1484
+ .fe-cmdp__hint {
1485
+ padding: 8px 14px;
1486
+ border-top: 1px solid var(--fe-border);
1487
+ background: var(--fe-bg-elev);
1488
+ font-size: 11px;
1489
+ color: var(--fe-text-muted);
1490
+ }
1491
+
1492
+ /* Shortcuts help ("?") — grouped cheat-sheet inside the standard modal. */
1493
+ .fe-shortcuts {
1494
+ display: flex;
1495
+ flex-direction: column;
1496
+ gap: 16px;
1497
+ }
1498
+ .fe-shortcuts__heading {
1499
+ margin: 0 0 6px;
1500
+ font-size: 11px;
1501
+ font-weight: 600;
1502
+ letter-spacing: 0.05em;
1503
+ text-transform: uppercase;
1504
+ color: var(--fe-text-muted);
1505
+ }
1506
+ .fe-shortcuts__table {
1507
+ display: flex;
1508
+ flex-direction: column;
1509
+ }
1510
+ .fe-shortcuts__row {
1511
+ display: flex;
1512
+ align-items: center;
1513
+ gap: 12px;
1514
+ padding: 4px 0;
1515
+ }
1516
+ .fe-shortcuts__keys {
1517
+ flex: 0 0 40%;
1518
+ display: flex;
1519
+ align-items: center;
1520
+ gap: 6px;
1521
+ flex-wrap: wrap;
1522
+ }
1523
+ .fe-shortcuts__desc {
1524
+ flex: 1 1 auto;
1525
+ font-size: 13px;
1526
+ color: var(--fe-text);
1527
+ }
1528
+ .fe-shortcuts__or {
1529
+ color: var(--fe-text-muted);
1530
+ font-size: 11px;
1531
+ }
1532
+ .fe-kbd {
1533
+ display: inline-block;
1534
+ padding: 2px 7px;
1535
+ border: 1px solid var(--fe-border-strong);
1536
+ border-bottom-width: 2px;
1537
+ border-radius: var(--fe-radius-sm);
1538
+ background: var(--fe-bg-elev);
1539
+ color: var(--fe-text);
1540
+ font-family: var(--fe-font-mono);
1541
+ font-size: 11.5px;
1542
+ line-height: 1.4;
1543
+ }
1544
+
1545
+ /* Breadcrumb overflow — "…" trigger + dropdown for the collapsed middle. */
1546
+ .fe-breadcrumb__more-wrap {
1547
+ position: relative;
1548
+ display: inline-flex;
1549
+ align-items: center;
1550
+ gap: 4px;
1551
+ }
1552
+ .fe-breadcrumb__more {
1553
+ background: transparent;
1554
+ border: 0;
1555
+ color: inherit;
1556
+ padding: 2px 8px;
1557
+ border-radius: var(--fe-radius-sm);
1558
+ cursor: pointer;
1559
+ font: inherit;
1560
+ line-height: 1.2;
1561
+ }
1562
+ .fe-breadcrumb__more:hover,
1563
+ .fe-breadcrumb__more[aria-expanded='true'] {
1564
+ background: var(--fe-bg-hover);
1565
+ color: var(--fe-text);
1566
+ }
1567
+ .fe-breadcrumb__more:focus-visible {
1568
+ outline: 2px solid var(--fe-primary);
1569
+ outline-offset: 1px;
1570
+ }
1571
+ .fe-breadcrumb__menu {
1572
+ position: absolute;
1573
+ top: calc(100% + 4px);
1574
+ left: 0;
1575
+ z-index: 80;
1576
+ min-width: 160px;
1577
+ max-width: 280px;
1578
+ max-height: 40vh;
1579
+ overflow-y: auto;
1580
+ display: flex;
1581
+ flex-direction: column;
1582
+ padding: 4px;
1583
+ background: var(--fe-bg);
1584
+ border: 1px solid var(--fe-border);
1585
+ border-radius: var(--fe-radius);
1586
+ box-shadow: var(--fe-shadow);
1587
+ }
1588
+ .fe-breadcrumb__menu-item {
1589
+ text-align: left;
1590
+ background: transparent;
1591
+ border: 0;
1592
+ padding: 6px 10px;
1593
+ border-radius: var(--fe-radius-sm);
1594
+ color: var(--fe-text);
1595
+ font: inherit;
1596
+ font-size: 13px;
1597
+ cursor: pointer;
1598
+ overflow: hidden;
1599
+ text-overflow: ellipsis;
1600
+ white-space: nowrap;
1601
+ }
1602
+ .fe-breadcrumb__menu-item:hover,
1603
+ .fe-breadcrumb__menu-item:focus-visible {
1604
+ background: var(--fe-bg-hover);
1605
+ }
1606
+
1607
+ /* Long folder names shouldn't blow up the crumb row — ellipsize labels. */
1608
+ .fe-breadcrumb__crumb > span:first-child {
1609
+ max-width: 200px;
1610
+ overflow: hidden;
1611
+ text-overflow: ellipsis;
1612
+ white-space: nowrap;
1613
+ }
1614
+ @media (max-width: 640px) {
1615
+ .fe-breadcrumb__crumb > span:first-child {
1616
+ max-width: 110px;
1617
+ }
1618
+ }
1619
+
1620
+ @media (prefers-reduced-motion: reduce) {
1621
+ .fe-modal-enter-active,
1622
+ .fe-modal-leave-active {
1623
+ transition: none !important;
1624
+ }
1625
+ }
1626
+
1627
+
1628
+ /* === cila:b — skeleton loading, state screens, undo snackbar, connection badge === */
1629
+
1630
+ /* Screen-reader-only helper (skeleton announces "loading" without visuals). */
1631
+ .fe-sr-only {
1632
+ position: absolute;
1633
+ width: 1px;
1634
+ height: 1px;
1635
+ padding: 0;
1636
+ margin: -1px;
1637
+ overflow: hidden;
1638
+ clip: rect(0 0 0 0);
1639
+ white-space: nowrap;
1640
+ border: 0;
1641
+ }
1642
+
1643
+ /* ---------- Skeleton (initial load) ---------- */
1644
+
1645
+ .fe__skeleton {
1646
+ min-height: 240px;
1647
+ }
1648
+ .fe-skel {
1649
+ position: relative;
1650
+ overflow: hidden;
1651
+ border-radius: var(--fe-radius-sm);
1652
+ background: color-mix(in srgb, var(--fe-text-muted) 14%, transparent);
1653
+ }
1654
+ .fe-skel::after {
1655
+ content: '';
1656
+ position: absolute;
1657
+ inset: 0;
1658
+ transform: translateX(-100%);
1659
+ background: linear-gradient(
1660
+ 90deg,
1661
+ transparent,
1662
+ color-mix(in srgb, var(--fe-text-muted) 12%, transparent),
1663
+ transparent
1664
+ );
1665
+ animation: fe-skel-shimmer 1.4s ease-in-out infinite;
1666
+ }
1667
+ @keyframes fe-skel-shimmer {
1668
+ to { transform: translateX(100%); }
1669
+ }
1670
+ @media (prefers-reduced-motion: reduce) {
1671
+ /* Static faint blocks — no sweep. */
1672
+ .fe-skel::after {
1673
+ animation: none;
1674
+ content: none;
1675
+ }
1676
+ }
1677
+
1678
+ /* List-mode ghosts mirror .fe-list__row's grid so the swap to real rows
1679
+ doesn't shift the layout. */
1680
+ .fe-skel-list {
1681
+ padding-top: 2px;
1682
+ }
1683
+ .fe-skel-row {
1684
+ display: grid;
1685
+ grid-template-columns: 32px minmax(0, 1fr) 120px 180px;
1686
+ gap: 8px;
1687
+ align-items: center;
1688
+ padding: 12px;
1689
+ border-bottom: 1px solid var(--fe-border);
1690
+ }
1691
+ .fe-skel-row .fe-skel {
1692
+ height: 12px;
1693
+ }
1694
+ .fe-skel-row .fe-skel--icon {
1695
+ width: 20px;
1696
+ height: 20px;
1697
+ border-radius: 6px;
1698
+ }
1699
+ .fe-skel-row .fe-skel--name { width: 55%; }
1700
+ .fe-skel-row:nth-child(2n) .fe-skel--name { width: 38%; }
1701
+ .fe-skel-row:nth-child(3n) .fe-skel--name { width: 70%; }
1702
+ .fe-skel-row .fe-skel--size { width: 56px; justify-self: start; }
1703
+ .fe-skel-row .fe-skel--date { width: 110px; justify-self: start; }
1704
+
1705
+ /* Grid-mode ghosts mirror .fe-grid / .fe-grid__card. */
1706
+ .fe-skel-grid {
1707
+ display: grid;
1708
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
1709
+ gap: var(--fe-gap);
1710
+ padding: var(--fe-gap);
1711
+ }
1712
+ .fe-skel-card {
1713
+ display: flex;
1714
+ flex-direction: column;
1715
+ gap: 8px;
1716
+ padding: 8px;
1717
+ border: 1px solid var(--fe-border);
1718
+ border-radius: var(--fe-radius);
1719
+ background: var(--fe-bg-elev);
1720
+ }
1721
+ .fe-skel-card .fe-skel--thumb {
1722
+ aspect-ratio: 1 / 1;
1723
+ }
1724
+ .fe-skel-card .fe-skel--label {
1725
+ height: 12px;
1726
+ width: 70%;
1727
+ }
1728
+ .fe-skel-card:nth-child(2n) .fe-skel--label { width: 50%; }
1729
+ .fe-skel-card:nth-child(3n) .fe-skel--label { width: 85%; }
1730
+
1731
+ /* ---------- State screens (empty / search-empty / not-found / error) ---------- */
1732
+
1733
+ .fe-state {
1734
+ display: flex;
1735
+ flex-direction: column;
1736
+ align-items: center;
1737
+ justify-content: center;
1738
+ gap: 6px;
1739
+ min-height: 240px;
1740
+ height: 100%;
1741
+ padding: 24px;
1742
+ text-align: center;
1743
+ color: var(--fe-text-muted);
1744
+ }
1745
+ .fe-state__art {
1746
+ color: var(--fe-text-muted);
1747
+ opacity: 0.7;
1748
+ margin-bottom: 4px;
1749
+ flex: 0 0 auto;
1750
+ }
1751
+ .fe-state__title {
1752
+ margin: 2px 0 0;
1753
+ font-size: 15px;
1754
+ font-weight: 600;
1755
+ color: var(--fe-text);
1756
+ }
1757
+ .fe-state__hint {
1758
+ margin: 0;
1759
+ font-size: 13px;
1760
+ max-width: 420px;
1761
+ }
1762
+ .fe-state__path {
1763
+ margin: 0;
1764
+ font-size: 12px;
1765
+ font-family: var(--fe-font-mono);
1766
+ word-break: break-all;
1767
+ max-width: 480px;
1768
+ }
1769
+ .fe-state__actions {
1770
+ margin-top: 12px;
1771
+ display: flex;
1772
+ gap: 8px;
1773
+ }
1774
+
1775
+ /* ---------- Undo snackbar (action-capable toast) ---------- */
1776
+
1777
+ .fe-toast--action {
1778
+ display: flex;
1779
+ align-items: center;
1780
+ gap: 14px;
1781
+ padding: 8px 10px 8px 14px;
1782
+ cursor: pointer;
1783
+ max-width: min(480px, calc(100% - 32px));
1784
+ }
1785
+ .fe-toast__msg {
1786
+ min-width: 0;
1787
+ }
1788
+ .fe-toast__action {
1789
+ flex: 0 0 auto;
1790
+ background: transparent;
1791
+ border: 0;
1792
+ padding: 4px 8px;
1793
+ border-radius: var(--fe-radius-sm);
1794
+ font: inherit;
1795
+ font-weight: 600;
1796
+ color: color-mix(in srgb, var(--fe-primary) 70%, var(--fe-bg));
1797
+ cursor: pointer;
1798
+ }
1799
+ .fe-toast__action:hover {
1800
+ background: color-mix(in srgb, var(--fe-bg) 14%, transparent);
1801
+ }
1802
+ .fe-toast__action:focus-visible {
1803
+ outline: 2px solid var(--fe-bg);
1804
+ outline-offset: 1px;
1805
+ }
1806
+
1807
+ /* ---------- Connection badge (degraded realtime only) ---------- */
1808
+
1809
+ .fe-connbadge {
1810
+ display: inline-flex;
1811
+ align-items: center;
1812
+ gap: 6px;
1813
+ font-size: 12px;
1814
+ line-height: 1.4;
1815
+ color: var(--fe-text-muted);
1816
+ background: var(--fe-bg-elev);
1817
+ border: 1px solid var(--fe-border);
1818
+ border-radius: 999px;
1819
+ padding: 2px 10px;
1820
+ cursor: help;
1821
+ white-space: nowrap;
1822
+ overflow: hidden;
1823
+ text-overflow: ellipsis;
1824
+ max-width: 100%;
1825
+ }
1826
+ .fe-connbadge__dot {
1827
+ flex: 0 0 auto;
1828
+ width: 7px;
1829
+ height: 7px;
1830
+ border-radius: 50%;
1831
+ background: var(--fe-warning, #f59e0b);
1832
+ }
1833
+
1834
+ /* === bul:s3 === */
1835
+
1836
+ /* Palette — "Everywhere" hit rows (name + crumb + snippet stack). */
1837
+ .fe-cmdp__item--hit {
1838
+ align-items: flex-start;
1839
+ }
1840
+ .fe-cmdp__item--hit .fe-cmdp__icon {
1841
+ margin-top: 1px;
1842
+ }
1843
+ .fe-cmdp__hitbody {
1844
+ flex: 1 1 auto;
1845
+ min-width: 0;
1846
+ display: flex;
1847
+ flex-direction: column;
1848
+ gap: 2px;
1849
+ }
1850
+ .fe-cmdp__hitline {
1851
+ display: flex;
1852
+ align-items: center;
1853
+ gap: 8px;
1854
+ min-width: 0;
1855
+ }
1856
+ .fe-cmdp__badge,
1857
+ .fe-list__badge {
1858
+ flex: 0 0 auto;
1859
+ display: inline-block;
1860
+ padding: 1px 6px;
1861
+ border-radius: 999px;
1862
+ border: 1px solid color-mix(in srgb, var(--fe-primary) 35%, transparent);
1863
+ background: color-mix(in srgb, var(--fe-primary) 12%, transparent);
1864
+ color: var(--fe-primary);
1865
+ font-size: 10px;
1866
+ font-weight: 600;
1867
+ line-height: 1.5;
1868
+ white-space: nowrap;
1869
+ vertical-align: middle;
1870
+ }
1871
+ .fe-cmdp__crumb {
1872
+ overflow: hidden;
1873
+ text-overflow: ellipsis;
1874
+ white-space: nowrap;
1875
+ font-size: 11.5px;
1876
+ color: var(--fe-text-muted);
1877
+ }
1878
+ .fe-cmdp__snippet,
1879
+ .fe-list__snippet {
1880
+ display: block;
1881
+ overflow: hidden;
1882
+ text-overflow: ellipsis;
1883
+ white-space: nowrap;
1884
+ font-size: 12px;
1885
+ color: var(--fe-text-muted);
1886
+ }
1887
+ .fe-cmdp__mark,
1888
+ .fe-list__mark {
1889
+ background: color-mix(in srgb, var(--fe-primary) 22%, transparent);
1890
+ color: var(--fe-text);
1891
+ border-radius: 2px;
1892
+ padding: 0 1px;
1893
+ font-weight: 600;
1894
+ }
1895
+ .fe-cmdp__loading {
1896
+ padding: 8px 12px;
1897
+ font-size: 13px;
1898
+ color: var(--fe-text-muted);
1899
+ }
1900
+
1901
+ /* Palette — saved-search rows (div-based so the delete button nests legally). */
1902
+ .fe-cmdp__item--saved {
1903
+ user-select: none;
1904
+ }
1905
+ .fe-cmdp__del {
1906
+ flex: 0 0 auto;
1907
+ background: transparent;
1908
+ border: 0;
1909
+ border-radius: var(--fe-radius-sm);
1910
+ padding: 2px 6px;
1911
+ font: inherit;
1912
+ font-size: 13px;
1913
+ color: var(--fe-text-muted);
1914
+ cursor: pointer;
1915
+ opacity: 0.55;
1916
+ }
1917
+ .fe-cmdp__item--saved:hover .fe-cmdp__del,
1918
+ .fe-cmdp__item--saved.is-active .fe-cmdp__del {
1919
+ opacity: 1;
1920
+ }
1921
+ .fe-cmdp__del:hover {
1922
+ background: var(--fe-bg-elev);
1923
+ color: var(--fe-danger, #dc2626);
1924
+ }
1925
+ .fe-cmdp__del:focus-visible {
1926
+ outline: 2px solid var(--fe-primary);
1927
+ outline-offset: -2px;
1928
+ }
1929
+
1930
+ /* List view — search-result snippet line under the filename. */
1931
+ .fe-list__snippet {
1932
+ max-width: 100%;
1933
+ }
@@ -88,3 +88,73 @@
88
88
  --fe-shadow-sm: 0 2px 6px rgba(0, 0, 0, 0.25);
89
89
  }
90
90
  }
91
+
92
+ /* === cila:a — file-type icon accent tokens (lib/fileIcons families) === */
93
+ :root {
94
+ --fe-icon-folder: #d97706;
95
+ --fe-icon-image: #7c3aed;
96
+ --fe-icon-video: #db2777;
97
+ --fe-icon-audio: #0d9488;
98
+ --fe-icon-pdf: #dc2626;
99
+ --fe-icon-doc: #2563eb;
100
+ --fe-icon-sheet: #16a34a;
101
+ --fe-icon-slides: #ea580c;
102
+ --fe-icon-archive: #78716c;
103
+ --fe-icon-code: #4f46e5;
104
+ --fe-icon-text: #64748b;
105
+ --fe-icon-unknown: #94a3b8;
106
+ }
107
+
108
+ /* Dark values — same selector strategy as the palette blocks above. */
109
+ .fe--theme-dark,
110
+ :root[data-theme='dark'] .fe,
111
+ .fe.fe--theme-dark,
112
+ :root.dark,
113
+ .dark,
114
+ :root.dark .fe,
115
+ .dark .fe,
116
+ .fe-ctx-backdrop--theme-dark,
117
+ .fe-ctx-backdrop--theme-auto[data-prefers-dark='1'] {
118
+ --fe-icon-folder: #fbbf24;
119
+ --fe-icon-image: #a78bfa;
120
+ --fe-icon-video: #f472b6;
121
+ --fe-icon-audio: #2dd4bf;
122
+ --fe-icon-pdf: #f87171;
123
+ --fe-icon-doc: #60a5fa;
124
+ --fe-icon-sheet: #4ade80;
125
+ --fe-icon-slides: #fb923c;
126
+ --fe-icon-archive: #a8a29e;
127
+ --fe-icon-code: #818cf8;
128
+ --fe-icon-text: #94a3b8;
129
+ --fe-icon-unknown: #8b95a7;
130
+ }
131
+
132
+ @media (prefers-color-scheme: dark) {
133
+ .fe:not(.fe--theme-light),
134
+ .fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light) {
135
+ --fe-icon-folder: #fbbf24;
136
+ --fe-icon-image: #a78bfa;
137
+ --fe-icon-video: #f472b6;
138
+ --fe-icon-audio: #2dd4bf;
139
+ --fe-icon-pdf: #f87171;
140
+ --fe-icon-doc: #60a5fa;
141
+ --fe-icon-sheet: #4ade80;
142
+ --fe-icon-slides: #fb923c;
143
+ --fe-icon-archive: #a8a29e;
144
+ --fe-icon-code: #818cf8;
145
+ --fe-icon-text: #94a3b8;
146
+ --fe-icon-unknown: #8b95a7;
147
+ }
148
+ }
149
+
150
+ /* === cila:b — status tokens === */
151
+ /* Amber status accent (connection badge dot; StarButton already referenced it
152
+ via var(--fe-warning, #f59e0b)). Declared with the SAME value the fallbacks
153
+ used, and identical in light + dark on purpose — amber reads well on both
154
+ palettes, so making the token official changes nothing visually. */
155
+ :root,
156
+ .fe--theme-dark,
157
+ :root.dark,
158
+ .dark {
159
+ --fe-warning: #f59e0b;
160
+ }