mohsin-devs commited on
Commit
939b0c8
·
1 Parent(s): 5e3f3ec

Refine Links UI: Match image aesthetics with optimized box sizes

Browse files
Files changed (3) hide show
  1. js/main.js +26 -39
  2. js/ui/uiRenderer.js +3 -5
  3. styles.css +387 -272
js/main.js CHANGED
@@ -536,56 +536,43 @@ class App {
536
  }
537
 
538
  linksContainer.innerHTML = links
539
- .map((link) => {
540
- const hostname = this.getLinkHostname(link.url);
541
- const faviconUrl = `https://www.google.com/s2/favicons?domain=${hostname}&sz=128`;
542
-
543
- return `
544
- <article class="link-card" data-link-id="${link.id}">
545
  <div class="link-card-header">
546
- <div class="link-icon-container">
547
- <img src="${faviconUrl}" alt="" class="link-favicon" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex'">
548
- <div class="link-icon-fallback" style="display:none">
549
- <i class="ph-fill ph-link"></i>
550
- </div>
551
  </div>
552
  <div class="link-card-content">
553
  <div class="link-card-topline">
554
- <div class="link-title" title="${this.escapeHtml(link.title || link.url)}">${this.escapeHtml(link.title || link.url)}</div>
555
- <span class="link-domain-badge">${this.escapeHtml(hostname)}</span>
556
  </div>
557
- <a href="${this.escapeHtml(link.url)}" target="_blank" rel="noopener noreferrer" class="link-url">
558
  ${this.escapeHtml(link.url)}
559
  </a>
560
  </div>
561
  </div>
562
-
563
- <div class="link-card-body">
564
- ${link.description ? `<p class="link-description">${this.escapeHtml(link.description)}</p>` : '<p class="link-description empty">No additional notes.</p>'}
 
565
  </div>
566
-
567
- <div class="link-card-footer">
568
- <div class="link-meta">
569
- <i class="ph-fill ph-clock"></i>
570
- <span>${this.formatRelativeDate(link.updated_at || link.created_at)}</span>
571
- </div>
572
- <div class="link-actions">
573
- <button class="link-action-btn copy-btn" data-action="copy" data-link-url="${this.escapeHtml(link.url)}" title="Copy Link">
574
- <i class="ph-bold ph-copy"></i>
575
- </button>
576
- <button class="link-action-btn edit-btn" data-action="edit" data-link-id="${link.id}" title="Edit Link">
577
- <i class="ph-bold ph-pencil-simple"></i>
578
- </button>
579
- <button class="link-action-btn delete-btn" data-action="delete" data-link-id="${link.id}" title="Delete Link">
580
- <i class="ph-bold ph-trash"></i>
581
- </button>
582
- <a href="${this.escapeHtml(link.url)}" target="_blank" rel="noopener noreferrer" class="btn-visit">
583
- Visit <i class="ph-bold ph-arrow-square-out"></i>
584
- </a>
585
- </div>
586
  </div>
587
  </article>
588
- `;})
589
  .join('');
590
 
591
  linksContainer.querySelectorAll('[data-action="copy"]').forEach((btn) => {
@@ -984,7 +971,7 @@ class App {
984
  }
985
  });
986
  } catch (err) {
987
- this.ui.renderHistory([], () => {});
988
  this.ui.showToast(err.message || 'Failed to load history', 'error');
989
  }
990
  }
 
536
  }
537
 
538
  linksContainer.innerHTML = links
539
+ .map((link) => `
540
+ <article class="link-card">
 
 
 
 
541
  <div class="link-card-header">
542
+ <div class="link-icon">
543
+ <i class="ph-fill ph-link"></i>
 
 
 
544
  </div>
545
  <div class="link-card-content">
546
  <div class="link-card-topline">
547
+ <div class="link-title">${this.escapeHtml(link.title || link.url)}</div>
548
+ <span class="link-domain-badge">${this.escapeHtml(this.getLinkHostname(link.url))}</span>
549
  </div>
550
+ <a href="${this.escapeHtml(link.url)}" target="_blank" rel="noopener noreferrer" class="link-url" title="${this.escapeHtml(link.url)}">
551
  ${this.escapeHtml(link.url)}
552
  </a>
553
  </div>
554
  </div>
555
+ ${link.description ? `<p class="link-description">${this.escapeHtml(link.description)}</p>` : '<p class="link-description muted">No notes added yet.</p>'}
556
+ <div class="link-meta">
557
+ <span><i class="ph-fill ph-clock"></i> ${this.formatRelativeDate(link.updated_at || link.created_at)}</span>
558
+ <span><i class="ph-fill ph-bookmark-simple"></i> Saved item</span>
559
  </div>
560
+ <div class="link-actions">
561
+ <a href="${this.escapeHtml(link.url)}" target="_blank" rel="noopener noreferrer" class="link-action-btn">
562
+ <i class="ph-fill ph-arrow-up-right"></i> Open
563
+ </a>
564
+ <button class="link-action-btn" data-action="copy" data-link-url="${this.escapeHtml(link.url)}">
565
+ <i class="ph-fill ph-copy"></i> Copy
566
+ </button>
567
+ <button class="link-action-btn" data-action="edit" data-link-id="${link.id}">
568
+ <i class="ph-fill ph-pencil-simple"></i> Edit
569
+ </button>
570
+ <button class="link-action-btn delete" data-action="delete" data-link-id="${link.id}">
571
+ <i class="ph-fill ph-trash"></i> Delete
572
+ </button>
 
 
 
 
 
 
 
573
  </div>
574
  </article>
575
+ `)
576
  .join('');
577
 
578
  linksContainer.querySelectorAll('[data-action="copy"]').forEach((btn) => {
 
971
  }
972
  });
973
  } catch (err) {
974
+ this.ui.renderHistory([], () => { });
975
  this.ui.showToast(err.message || 'Failed to load history', 'error');
976
  }
977
  }
js/ui/uiRenderer.js CHANGED
@@ -65,11 +65,9 @@ export class UIRenderer {
65
 
66
  renderFolders(folders, onFolderClick, onRename, onDelete) {
67
  this.containers.folders.innerHTML = '';
68
- // Filter out hidden folders (starting with .)
69
- const visibleFolders = folders.filter(f => !f.name.startsWith('.'));
70
- if (!visibleFolders.length) return;
71
 
72
- visibleFolders.forEach(folder => {
73
  const card = document.createElement('div');
74
  card.className = 'folder-card';
75
  card.innerHTML = `
@@ -296,7 +294,7 @@ export class UIRenderer {
296
  history.forEach((commit, idx) => {
297
  const item = document.createElement('div');
298
  item.className = 'history-item';
299
-
300
  const date = new Date(commit.timestamp).toLocaleString();
301
  const shortId = commit.id.substring(0, 7);
302
 
 
65
 
66
  renderFolders(folders, onFolderClick, onRename, onDelete) {
67
  this.containers.folders.innerHTML = '';
68
+ if (!folders.length) return;
 
 
69
 
70
+ folders.forEach(folder => {
71
  const card = document.createElement('div');
72
  card.className = 'folder-card';
73
  card.innerHTML = `
 
294
  history.forEach((commit, idx) => {
295
  const item = document.createElement('div');
296
  item.className = 'history-item';
297
+
298
  const date = new Date(commit.timestamp).toLocaleString();
299
  const shortId = commit.id.substring(0, 7);
300
 
styles.css CHANGED
@@ -235,7 +235,7 @@ body {
235
  padding: 16px;
236
  border-radius: 16px;
237
  border: 1px solid var(--border-color);
238
- box-shadow: 0 4px 12px rgba(0,0,0,0.03);
239
  }
240
 
241
  .storage-header {
@@ -469,8 +469,8 @@ body {
469
  linear-gradient(90deg, #18315f 0%, #1c2e68 48%, #146d83 100%);
470
  color: #f8fafc;
471
  border-radius: 24px;
472
- padding: 24px 30px;
473
- min-height: 180px;
474
  display: flex;
475
  align-items: center;
476
  justify-content: space-between;
@@ -490,7 +490,7 @@ body {
490
  opacity: 0.22;
491
  pointer-events: none;
492
  background:
493
- radial-gradient(circle, rgba(255,255,255,0.14) 1.4px, transparent 1.5px);
494
  background-size: 14px 14px;
495
  }
496
 
@@ -510,32 +510,32 @@ body {
510
  }
511
 
512
  .links-hero h2 {
513
- font-size: clamp(26px, 3vw, 40px);
514
  line-height: 1.1;
515
- letter-spacing: -1.2px;
516
- margin-bottom: 12px;
517
- max-width: 600px;
518
  }
519
 
520
  .links-hero p {
521
- max-width: 500px;
522
  color: rgba(241, 245, 249, 0.86);
523
- line-height: 1.5;
524
- font-size: 14px;
525
  }
526
 
527
  .links-hero .btn-primary {
528
  position: relative;
529
  z-index: 1;
530
- min-width: 140px;
531
- min-height: 48px;
532
  justify-content: center;
533
- border-radius: 14px;
534
  }
535
 
536
  .links-hero-art {
537
- flex: 0 0 280px;
538
- height: 140px;
539
  position: relative;
540
  z-index: 1;
541
  margin-left: auto;
@@ -567,7 +567,7 @@ body {
567
  position: absolute;
568
  border: 3px solid rgba(136, 170, 214, 0.24);
569
  border-radius: 18px;
570
- background: linear-gradient(180deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02));
571
  }
572
 
573
  .hero-card-back {
@@ -616,7 +616,7 @@ body {
616
  border-radius: 10px 10px 0 0;
617
  border: 3px solid rgba(136, 170, 214, 0.24);
618
  border-bottom: none;
619
- background: linear-gradient(180deg, rgba(255,255,255,0.05), rgba(255,255,255,0.01));
620
  }
621
 
622
  .hero-link-glyph {
@@ -654,26 +654,26 @@ body {
654
  .links-note-chip {
655
  display: flex;
656
  align-items: center;
657
- gap: 12px;
658
- padding: 10px 14px;
659
- border-radius: 16px;
660
  background: #ffffff;
661
  border: 1px solid var(--border-color);
662
  color: var(--text-muted);
663
- font-size: 11px;
664
  font-weight: 500;
665
- box-shadow: 0 8px 20px rgba(15, 23, 42, 0.04);
666
  }
667
 
668
  .links-note-icon {
669
- width: 42px;
670
- height: 42px;
671
  border-radius: 14px;
672
  display: flex;
673
  align-items: center;
674
  justify-content: center;
675
  flex-shrink: 0;
676
- font-size: 22px;
677
  }
678
 
679
  .links-note-copy {
@@ -683,30 +683,30 @@ body {
683
  }
684
 
685
  .links-note-copy strong {
686
- font-size: 15px;
687
  color: #18315f;
688
  }
689
 
690
  .links-note-copy span {
691
- font-size: 13px;
692
  color: #62748e;
693
  }
694
 
695
  .links-stat-card,
696
  .links-search {
697
- background: #ffffff;
698
  border: 1px solid var(--border-color);
699
  border-radius: 20px;
700
- padding: 14px 18px;
701
- box-shadow: 0 10px 24px rgba(15, 23, 42, 0.04);
702
  transition: all 0.2s ease;
703
  }
704
 
705
  .links-stat-card {
706
  display: flex;
707
  align-items: center;
708
- gap: 12px;
709
- min-height: 84px;
710
  justify-content: flex-start;
711
  }
712
 
@@ -730,7 +730,7 @@ body {
730
  .links-stat-copy {
731
  display: flex;
732
  flex-direction: column;
733
- gap: 4px;
734
  }
735
 
736
  .links-stat-label {
@@ -742,7 +742,7 @@ body {
742
  }
743
 
744
  .links-stat-card strong {
745
- font-size: 22px;
746
  line-height: 1.1;
747
  color: #0f2b63;
748
  }
@@ -757,7 +757,7 @@ body {
757
  align-items: center;
758
  justify-content: space-between;
759
  gap: 14px;
760
- min-height: 108px;
761
  border-color: #d7e2ee;
762
  padding: 16px 18px;
763
  }
@@ -765,18 +765,18 @@ body {
765
  .links-search-input {
766
  display: flex;
767
  align-items: center;
768
- gap: 16px;
769
- min-height: 68px;
770
  flex: 1;
771
  border: 1px solid #e6edf5;
772
- border-radius: 18px;
773
  padding: 0 18px;
774
  background: linear-gradient(180deg, #ffffff, #fbfdff);
775
  }
776
 
777
  .links-search-input i {
778
  color: #6b778a;
779
- font-size: 24px;
780
  }
781
 
782
  .links-search input {
@@ -785,7 +785,7 @@ body {
785
  background: transparent;
786
  outline: none;
787
  font-family: inherit;
788
- font-size: 15px;
789
  color: var(--text-main);
790
  }
791
 
@@ -795,8 +795,8 @@ body {
795
  }
796
 
797
  .links-filter-btn {
798
- min-height: 40px;
799
- padding: 0 16px;
800
  border-radius: 999px;
801
  border: 1px solid #dce7f2;
802
  background: #ffffff;
@@ -1447,7 +1447,7 @@ body {
1447
  align-items: center;
1448
  gap: 6px;
1449
  transition: all 0.2s ease;
1450
- box-shadow: 0 4px 12px rgba(0,0,0,0.1);
1451
  }
1452
 
1453
  .btn-primary:hover {
@@ -1529,7 +1529,9 @@ body {
1529
  }
1530
 
1531
  @keyframes spin {
1532
- to { transform: rotate(360deg); }
 
 
1533
  }
1534
 
1535
  .loading-state {
@@ -1552,8 +1554,15 @@ body {
1552
  }
1553
 
1554
  @keyframes pulse-danger {
1555
- 0%, 100% { transform: scale(1); }
1556
- 50% { transform: scale(1.06); }
 
 
 
 
 
 
 
1557
  }
1558
 
1559
  /* ── UPLOAD PROGRESS ── */
@@ -1627,23 +1636,55 @@ body {
1627
  flex-shrink: 0;
1628
  }
1629
 
1630
- .toast-success { border-left: 4px solid var(--primary-color); }
1631
- .toast-success i { color: var(--primary-color); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1632
 
1633
- .toast-error { border-left: 4px solid var(--danger-color); }
1634
- .toast-error i { color: var(--danger-color); }
 
1635
 
1636
- .toast-warning { border-left: 4px solid #f59e0b; }
1637
- .toast-warning i { color: #f59e0b; }
 
1638
 
1639
- .toast-info { border-left: 4px solid var(--file-color); }
1640
- .toast-info i { color: var(--file-color); }
 
1641
 
1642
  /* ── SCROLLBAR ── */
1643
- ::-webkit-scrollbar { width: 8px; }
1644
- ::-webkit-scrollbar-track { background: var(--bg-color); }
1645
- ::-webkit-scrollbar-thumb { background: #d1d5db; border-radius: 10px; }
1646
- ::-webkit-scrollbar-thumb:hover { background: #9ca3af; }
 
 
 
 
 
 
 
 
 
 
 
 
1647
 
1648
  /* ── DROPDOWN MENU (3-dot) ── */
1649
  .dropdown-menu {
@@ -1763,6 +1804,7 @@ body {
1763
  opacity: 0;
1764
  transform: scale(0.95);
1765
  }
 
1766
  to {
1767
  opacity: 1;
1768
  transform: scale(1);
@@ -1888,8 +1930,13 @@ body {
1888
  }
1889
 
1890
  @keyframes skeletonLoading {
1891
- 0% { background-position: 200% 0; }
1892
- 100% { background-position: -200% 0; }
 
 
 
 
 
1893
  }
1894
 
1895
  .skeleton-card {
@@ -1912,8 +1959,15 @@ body {
1912
  }
1913
 
1914
  @keyframes fadeInUp {
1915
- from { opacity: 0; transform: translateY(20px); }
1916
- to { opacity: 1; transform: translateY(0); }
 
 
 
 
 
 
 
1917
  }
1918
 
1919
  .empty-state i {
@@ -1924,10 +1978,24 @@ body {
1924
  }
1925
 
1926
  @keyframes bounceIn {
1927
- 0% { opacity: 0; transform: scale(0.3); }
1928
- 50% { opacity: 1; transform: scale(1.05); }
1929
- 70% { transform: scale(0.9); }
1930
- 100% { opacity: 1; transform: scale(1); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1931
  }
1932
 
1933
  .empty-state h3 {
@@ -1944,13 +2012,17 @@ body {
1944
  }
1945
 
1946
  /* ── BUTTON LOADING STATE ── */
1947
- .btn-primary.loading, .btn-secondary.loading, .btn-danger.loading {
 
 
1948
  position: relative;
1949
  color: transparent !important;
1950
  pointer-events: none;
1951
  }
1952
 
1953
- .btn-primary.loading::after, .btn-secondary.loading::after, .btn-danger.loading::after {
 
 
1954
  content: "";
1955
  position: absolute;
1956
  width: 18px;
@@ -1969,31 +2041,57 @@ body {
1969
  }
1970
 
1971
  @keyframes spin {
1972
- to { transform: rotate(360deg); }
 
 
1973
  }
1974
 
1975
  /* ── RESPONSIVE ── */
1976
  @media (max-width: 992px) {
1977
- .app-container { gap: 12px; padding: 10px; }
1978
- .sidebar { width: 224px; }
1979
- .search-bar { width: 100%; max-width: 420px; }
1980
- .grid-container { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1981
  .links-hero {
1982
  padding: 32px 28px;
1983
  min-height: 220px;
1984
  }
 
1985
  .links-hero-art {
1986
  flex-basis: 250px;
1987
  transform: scale(0.82);
1988
  transform-origin: right center;
1989
  }
1990
- .links-toolbar { grid-template-columns: 1fr 1fr; }
1991
- .links-search { grid-column: 1 / -1; }
1992
- .links-insights { grid-template-columns: 1fr; }
 
 
 
 
 
 
 
 
 
1993
  }
1994
 
1995
  @media (max-width: 768px) {
1996
- .sidebar {
1997
  position: fixed;
1998
  left: -260px;
1999
  height: 100vh;
@@ -2001,43 +2099,80 @@ body {
2001
  box-shadow: var(--shadow-xl);
2002
  border-radius: 0 20px 20px 0;
2003
  }
 
2004
  .sidebar.mobile-open {
2005
  left: 0;
2006
  }
 
2007
  .main-content {
2008
  margin-left: 0;
2009
  border-radius: 18px;
2010
  }
 
2011
  .top-header {
2012
  padding: 0 12px;
2013
  min-height: 62px;
2014
  gap: 8px;
2015
  }
 
2016
  .search-bar {
2017
  width: 100%;
2018
  margin: 0 6px;
2019
  padding: 10px 14px;
2020
  }
2021
- .user-actions { gap: 8px; }
2022
- .content-area { padding: 0 12px 14px; }
2023
- .breadcrumbs { padding: 14px 12px 8px; font-size: 16px; }
2024
- .breadcrumb-item { font-size: 14px; }
2025
- .section-header { margin-bottom: 14px; }
2026
- .grid-container { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; }
2027
- .folder-card { padding: 12px; min-height: 136px; }
2028
- .file-card { border-radius: 16px; }
2029
- .file-preview { height: 92px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2030
  .links-hero {
2031
  padding: 24px 20px;
2032
  flex-direction: column;
2033
  align-items: flex-start;
2034
  min-height: auto;
2035
  }
 
2036
  .links-hero::after {
2037
  left: auto;
2038
  right: 18px;
2039
  top: 120px;
2040
  }
 
2041
  .links-hero-art {
2042
  width: 100%;
2043
  height: 132px;
@@ -2046,37 +2181,56 @@ body {
2046
  transform: scale(0.8);
2047
  transform-origin: left center;
2048
  }
2049
- .links-hero h2 {
2050
- font-size: clamp(26px, 3vw, 40px);
2051
- line-height: 1.1;
2052
- letter-spacing: -1.2px;
2053
- margin-bottom: 12px;
2054
- max-width: 600px;
2055
- .links-toolbar { grid-template-columns: 1fr; }
 
 
2056
  .links-stat-card {
2057
  min-height: auto;
2058
  padding: 20px;
2059
  }
2060
- .links-stat-card strong { font-size: 24px; }
 
 
 
 
2061
  .links-search {
2062
  flex-direction: column;
2063
  align-items: stretch;
2064
  }
 
2065
  .links-search-input {
2066
  min-height: 64px;
2067
  }
 
2068
  .links-filter-btn {
2069
  width: fit-content;
2070
  align-self: flex-end;
2071
  }
2072
- .links-note-chip { width: 100%; }
 
 
 
 
2073
  .links-container {
2074
  padding: 16px;
2075
  border-radius: 20px;
2076
  }
2077
- .link-card-topline { flex-direction: column; }
2078
- .shortcut-hint { width: 100%; margin-right: 0; }
2079
-
 
 
 
 
 
 
 
2080
  /* Mobile Menu Toggle */
2081
  .menu-toggle {
2082
  display: flex !important;
@@ -2089,12 +2243,15 @@ body {
2089
  color: var(--text-main);
2090
  cursor: pointer;
2091
  }
 
2092
  .sidebar-bottom {
2093
  padding-top: 14px;
2094
  }
 
2095
  .storage-dashboard {
2096
  padding: 12px;
2097
  }
 
2098
  .hf-badge {
2099
  padding: 9px 10px;
2100
  font-size: 11px;
@@ -2102,7 +2259,9 @@ body {
2102
  }
2103
 
2104
  /* Add menu toggle to header if it doesn't exist */
2105
- .menu-toggle { display: none; }
 
 
2106
 
2107
  /* ── VERSION HISTORY ── */
2108
  .history-list {
@@ -2209,92 +2368,47 @@ body {
2209
  font-size: 13px;
2210
  }
2211
 
2212
- /* -- LINKS SECTION -- */
2213
  .links-container {
2214
  display: grid;
2215
- grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
2216
  gap: 24px;
2217
  margin-top: var(--space-2);
2218
  background: #ffffff;
2219
  border: 1px solid #e8edf4;
2220
  border-radius: 28px;
2221
- min-height: 240px;
2222
- padding: 24px;
2223
  box-shadow: var(--shadow-sm);
2224
  }
2225
 
2226
  .link-card {
2227
- background: #ffffff;
2228
- border: 1px solid #eef2f6;
2229
- border-radius: 20px;
2230
  padding: 18px;
2231
  position: relative;
 
 
 
2232
  display: flex;
2233
  flex-direction: column;
2234
- gap: 14px;
2235
- transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1);
2236
- box-shadow: 0 4px 12px rgba(15, 23, 42, 0.02);
2237
- animation: cardFadeIn 0.5s ease-out forwards;
2238
  opacity: 0;
2239
- transform: translateY(15px);
2240
- overflow: hidden;
2241
- }
2242
-
2243
- @keyframes cardFadeIn {
2244
- to { opacity: 1; transform: translateY(0); }
2245
  }
2246
 
2247
  .link-card:hover {
2248
- transform: translateY(-6px);
2249
- box-shadow: 0 12px 32px rgba(15, 23, 42, 0.08);
2250
- border-color: rgba(16, 185, 129, 0.2);
2251
- }
2252
-
2253
- .link-card::before {
2254
- content: "";
2255
- position: absolute;
2256
- top: 0;
2257
- left: 0;
2258
- width: 100%;
2259
- height: 4px;
2260
- background: var(--primary-gradient);
2261
- opacity: 0;
2262
- transition: opacity 0.3s ease;
2263
- }
2264
-
2265
- .link-card:hover::before {
2266
- opacity: 1;
2267
  }
2268
 
2269
  .link-card-header {
2270
  display: flex;
2271
- align-items: center;
2272
- gap: 16px;
2273
- }
2274
-
2275
- .link-icon-container {
2276
- width: 44px;
2277
- height: 44px;
2278
- background: #f8fafc;
2279
- border: 1px solid #f1f5f9;
2280
- border-radius: 14px;
2281
- display: flex;
2282
- align-items: center;
2283
- justify-content: center;
2284
- flex-shrink: 0;
2285
- overflow: hidden;
2286
- box-shadow: inset 0 1px 3px rgba(0,0,0,0.02);
2287
- }
2288
-
2289
- .link-favicon {
2290
- width: 26px;
2291
- height: 26px;
2292
- object-fit: contain;
2293
- }
2294
-
2295
- .link-icon-fallback {
2296
- color: var(--primary-color);
2297
- font-size: 24px;
2298
  }
2299
 
2300
  .link-card-content {
@@ -2306,143 +2420,123 @@ body {
2306
  display: flex;
2307
  align-items: flex-start;
2308
  justify-content: space-between;
2309
- gap: 12px;
2310
- margin-bottom: 4px;
 
 
 
 
 
 
 
 
 
 
 
 
 
2311
  }
2312
 
2313
  .link-title {
2314
  font-size: 15px;
2315
- font-weight: 700;
2316
- color: #1e293b;
2317
- line-height: 1.4;
2318
- white-space: nowrap;
2319
- overflow: hidden;
2320
- text-overflow: ellipsis;
2321
  }
2322
 
2323
  .link-domain-badge {
 
 
 
 
 
 
 
 
2324
  font-size: 11px;
2325
  font-weight: 700;
2326
- text-transform: uppercase;
2327
- letter-spacing: 0.5px;
2328
- color: #64748b;
2329
- background: #f1f5f9;
2330
- padding: 4px 10px;
2331
- border-radius: 8px;
2332
- white-space: nowrap;
2333
  }
2334
 
2335
  .link-url {
2336
- font-size: 13px;
2337
  color: var(--primary-color);
 
2338
  text-decoration: none;
2339
- white-space: nowrap;
2340
  overflow: hidden;
2341
- text-overflow: ellipsis;
2342
- display: block;
2343
- font-weight: 500;
2344
- transition: color 0.2s ease;
2345
- }
2346
-
2347
- .link-url:hover {
2348
- color: var(--primary-hover);
2349
- text-decoration: underline;
2350
- }
2351
-
2352
- .link-card-body {
2353
- flex: 1;
2354
  }
2355
 
2356
  .link-description {
2357
- font-size: 12px;
2358
- line-height: 1.6;
2359
- color: #475569;
2360
  display: -webkit-box;
2361
  -webkit-line-clamp: 2;
2362
  -webkit-box-orient: vertical;
2363
  overflow: hidden;
2364
- margin: 0;
2365
  }
2366
 
2367
- .link-description.empty {
2368
  color: #94a3b8;
2369
  font-style: italic;
2370
- font-size: 13px;
2371
- }
2372
-
2373
- .link-card-footer {
2374
- display: flex;
2375
- align-items: center;
2376
- justify-content: space-between;
2377
- padding-top: 16px;
2378
- border-top: 1px solid #f1f5f9;
2379
- margin-top: auto;
2380
  }
2381
 
2382
  .link-meta {
2383
  display: flex;
2384
- align-items: center;
2385
- gap: 6px;
2386
  font-size: 12px;
2387
- color: #94a3b8;
2388
- font-weight: 500;
2389
  }
2390
 
2391
- .link-meta i {
2392
- font-size: 14px;
 
 
2393
  }
2394
 
2395
  .link-actions {
2396
  display: flex;
2397
- align-items: center;
2398
  gap: 8px;
 
 
 
 
2399
  }
2400
 
2401
  .link-action-btn {
2402
- width: 32px;
2403
- height: 32px;
2404
- border-radius: 8px;
2405
- border: 1px solid #e2e8f0;
2406
- background: #ffffff;
2407
- color: #64748b;
2408
  display: flex;
2409
  align-items: center;
2410
  justify-content: center;
2411
- cursor: pointer;
2412
- transition: all 0.2s ease;
2413
- }
2414
-
2415
- .link-action-btn:hover {
2416
- background: #f8fafc;
2417
- color: #1e293b;
2418
- border-color: #cbd5e1;
2419
- }
2420
-
2421
- .link-action-btn.delete-btn:hover {
2422
- background: #fef2f2;
2423
- color: #ef4444;
2424
- border-color: #fecaca;
2425
- }
2426
-
2427
- .btn-visit {
2428
- display: inline-flex;
2429
- align-items: center;
2430
  gap: 6px;
2431
- padding: 6px 12px;
2432
- background: var(--primary-color);
2433
- color: #ffffff;
2434
- border-radius: 10px;
 
2435
  font-size: 13px;
2436
  font-weight: 600;
 
 
2437
  text-decoration: none;
2438
- transition: all 0.2s ease;
2439
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.15);
2440
  }
2441
 
2442
- .btn-visit:hover {
2443
- background: var(--primary-hover);
2444
- transform: translateY(-1px);
2445
- box-shadow: 0 6px 16px rgba(16, 185, 129, 0.25);
 
 
 
 
 
 
2446
  }
2447
 
2448
  .links-empty {
@@ -2451,42 +2545,63 @@ body {
2451
  flex-direction: column;
2452
  align-items: center;
2453
  justify-content: center;
2454
- padding: 60px 20px;
2455
  text-align: center;
2456
- color: #64748b;
 
2457
  }
2458
 
2459
  .links-empty-illustration {
2460
- width: 80px;
2461
- height: 80px;
2462
- background: #f1f5f9;
2463
- border-radius: 24px;
2464
  display: flex;
2465
  align-items: center;
2466
  justify-content: center;
2467
- font-size: 40px;
2468
- color: #94a3b8;
2469
- margin-bottom: 24px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2470
  }
2471
 
2472
  .links-empty h3 {
2473
- font-size: 20px;
2474
  font-weight: 700;
2475
- color: #1e293b;
2476
- margin-bottom: 8px;
 
2477
  }
2478
 
2479
  .links-empty p {
2480
- font-size: 15px;
2481
- max-width: 320px;
2482
- margin-bottom: 24px;
2483
  line-height: 1.6;
2484
- }
2485
-
2486
- .btn-link-secondary {
2487
- padding: 12px 24px;
2488
- border-radius: 12px;
2489
- font-weight: 600;
2490
  }
2491
 
2492
  .input-group textarea {
@@ -2506,4 +2621,4 @@ body {
2506
  .input-group textarea:focus {
2507
  border-color: var(--primary-color);
2508
  box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.12);
2509
- }
 
235
  padding: 16px;
236
  border-radius: 16px;
237
  border: 1px solid var(--border-color);
238
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);
239
  }
240
 
241
  .storage-header {
 
469
  linear-gradient(90deg, #18315f 0%, #1c2e68 48%, #146d83 100%);
470
  color: #f8fafc;
471
  border-radius: 24px;
472
+ padding: 34px 40px;
473
+ min-height: 220px;
474
  display: flex;
475
  align-items: center;
476
  justify-content: space-between;
 
490
  opacity: 0.22;
491
  pointer-events: none;
492
  background:
493
+ radial-gradient(circle, rgba(255, 255, 255, 0.14) 1.4px, transparent 1.5px);
494
  background-size: 14px 14px;
495
  }
496
 
 
510
  }
511
 
512
  .links-hero h2 {
513
+ font-size: clamp(28px, 3.5vw, 48px);
514
  line-height: 1.1;
515
+ letter-spacing: -1.4px;
516
+ margin-bottom: 16px;
517
+ max-width: 670px;
518
  }
519
 
520
  .links-hero p {
521
+ max-width: 560px;
522
  color: rgba(241, 245, 249, 0.86);
523
+ line-height: 1.55;
524
+ font-size: 15px;
525
  }
526
 
527
  .links-hero .btn-primary {
528
  position: relative;
529
  z-index: 1;
530
+ min-width: 156px;
531
+ min-height: 52px;
532
  justify-content: center;
533
+ border-radius: 16px;
534
  }
535
 
536
  .links-hero-art {
537
+ flex: 0 0 320px;
538
+ height: 160px;
539
  position: relative;
540
  z-index: 1;
541
  margin-left: auto;
 
567
  position: absolute;
568
  border: 3px solid rgba(136, 170, 214, 0.24);
569
  border-radius: 18px;
570
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02));
571
  }
572
 
573
  .hero-card-back {
 
616
  border-radius: 10px 10px 0 0;
617
  border: 3px solid rgba(136, 170, 214, 0.24);
618
  border-bottom: none;
619
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.01));
620
  }
621
 
622
  .hero-link-glyph {
 
654
  .links-note-chip {
655
  display: flex;
656
  align-items: center;
657
+ gap: 14px;
658
+ padding: 14px 18px;
659
+ border-radius: 18px;
660
  background: #ffffff;
661
  border: 1px solid var(--border-color);
662
  color: var(--text-muted);
663
+ font-size: 12px;
664
  font-weight: 500;
665
+ box-shadow: var(--shadow-sm);
666
  }
667
 
668
  .links-note-icon {
669
+ width: 40px;
670
+ height: 40px;
671
  border-radius: 14px;
672
  display: flex;
673
  align-items: center;
674
  justify-content: center;
675
  flex-shrink: 0;
676
+ font-size: 20px;
677
  }
678
 
679
  .links-note-copy {
 
683
  }
684
 
685
  .links-note-copy strong {
686
+ font-size: 16px;
687
  color: #18315f;
688
  }
689
 
690
  .links-note-copy span {
691
+ font-size: 14px;
692
  color: #62748e;
693
  }
694
 
695
  .links-stat-card,
696
  .links-search {
697
+ background: var(--card);
698
  border: 1px solid var(--border-color);
699
  border-radius: 20px;
700
+ padding: 16px 20px;
701
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
702
  transition: all 0.2s ease;
703
  }
704
 
705
  .links-stat-card {
706
  display: flex;
707
  align-items: center;
708
+ gap: 14px;
709
+ min-height: 100px;
710
  justify-content: flex-start;
711
  }
712
 
 
730
  .links-stat-copy {
731
  display: flex;
732
  flex-direction: column;
733
+ gap: 6px;
734
  }
735
 
736
  .links-stat-label {
 
742
  }
743
 
744
  .links-stat-card strong {
745
+ font-size: 24px;
746
  line-height: 1.1;
747
  color: #0f2b63;
748
  }
 
757
  align-items: center;
758
  justify-content: space-between;
759
  gap: 14px;
760
+ min-height: 100px;
761
  border-color: #d7e2ee;
762
  padding: 16px 18px;
763
  }
 
765
  .links-search-input {
766
  display: flex;
767
  align-items: center;
768
+ gap: 14px;
769
+ min-height: 56px;
770
  flex: 1;
771
  border: 1px solid #e6edf5;
772
+ border-radius: 16px;
773
  padding: 0 18px;
774
  background: linear-gradient(180deg, #ffffff, #fbfdff);
775
  }
776
 
777
  .links-search-input i {
778
  color: #6b778a;
779
+ font-size: 22px;
780
  }
781
 
782
  .links-search input {
 
785
  background: transparent;
786
  outline: none;
787
  font-family: inherit;
788
+ font-size: 16px;
789
  color: var(--text-main);
790
  }
791
 
 
795
  }
796
 
797
  .links-filter-btn {
798
+ min-height: 46px;
799
+ padding: 0 18px;
800
  border-radius: 999px;
801
  border: 1px solid #dce7f2;
802
  background: #ffffff;
 
1447
  align-items: center;
1448
  gap: 6px;
1449
  transition: all 0.2s ease;
1450
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1451
  }
1452
 
1453
  .btn-primary:hover {
 
1529
  }
1530
 
1531
  @keyframes spin {
1532
+ to {
1533
+ transform: rotate(360deg);
1534
+ }
1535
  }
1536
 
1537
  .loading-state {
 
1554
  }
1555
 
1556
  @keyframes pulse-danger {
1557
+
1558
+ 0%,
1559
+ 100% {
1560
+ transform: scale(1);
1561
+ }
1562
+
1563
+ 50% {
1564
+ transform: scale(1.06);
1565
+ }
1566
  }
1567
 
1568
  /* ── UPLOAD PROGRESS ── */
 
1636
  flex-shrink: 0;
1637
  }
1638
 
1639
+ .toast-success {
1640
+ border-left: 4px solid var(--primary-color);
1641
+ }
1642
+
1643
+ .toast-success i {
1644
+ color: var(--primary-color);
1645
+ }
1646
+
1647
+ .toast-error {
1648
+ border-left: 4px solid var(--danger-color);
1649
+ }
1650
+
1651
+ .toast-error i {
1652
+ color: var(--danger-color);
1653
+ }
1654
+
1655
+ .toast-warning {
1656
+ border-left: 4px solid #f59e0b;
1657
+ }
1658
 
1659
+ .toast-warning i {
1660
+ color: #f59e0b;
1661
+ }
1662
 
1663
+ .toast-info {
1664
+ border-left: 4px solid var(--file-color);
1665
+ }
1666
 
1667
+ .toast-info i {
1668
+ color: var(--file-color);
1669
+ }
1670
 
1671
  /* ── SCROLLBAR ── */
1672
+ ::-webkit-scrollbar {
1673
+ width: 8px;
1674
+ }
1675
+
1676
+ ::-webkit-scrollbar-track {
1677
+ background: var(--bg-color);
1678
+ }
1679
+
1680
+ ::-webkit-scrollbar-thumb {
1681
+ background: #d1d5db;
1682
+ border-radius: 10px;
1683
+ }
1684
+
1685
+ ::-webkit-scrollbar-thumb:hover {
1686
+ background: #9ca3af;
1687
+ }
1688
 
1689
  /* ── DROPDOWN MENU (3-dot) ── */
1690
  .dropdown-menu {
 
1804
  opacity: 0;
1805
  transform: scale(0.95);
1806
  }
1807
+
1808
  to {
1809
  opacity: 1;
1810
  transform: scale(1);
 
1930
  }
1931
 
1932
  @keyframes skeletonLoading {
1933
+ 0% {
1934
+ background-position: 200% 0;
1935
+ }
1936
+
1937
+ 100% {
1938
+ background-position: -200% 0;
1939
+ }
1940
  }
1941
 
1942
  .skeleton-card {
 
1959
  }
1960
 
1961
  @keyframes fadeInUp {
1962
+ from {
1963
+ opacity: 0;
1964
+ transform: translateY(20px);
1965
+ }
1966
+
1967
+ to {
1968
+ opacity: 1;
1969
+ transform: translateY(0);
1970
+ }
1971
  }
1972
 
1973
  .empty-state i {
 
1978
  }
1979
 
1980
  @keyframes bounceIn {
1981
+ 0% {
1982
+ opacity: 0;
1983
+ transform: scale(0.3);
1984
+ }
1985
+
1986
+ 50% {
1987
+ opacity: 1;
1988
+ transform: scale(1.05);
1989
+ }
1990
+
1991
+ 70% {
1992
+ transform: scale(0.9);
1993
+ }
1994
+
1995
+ 100% {
1996
+ opacity: 1;
1997
+ transform: scale(1);
1998
+ }
1999
  }
2000
 
2001
  .empty-state h3 {
 
2012
  }
2013
 
2014
  /* ── BUTTON LOADING STATE ── */
2015
+ .btn-primary.loading,
2016
+ .btn-secondary.loading,
2017
+ .btn-danger.loading {
2018
  position: relative;
2019
  color: transparent !important;
2020
  pointer-events: none;
2021
  }
2022
 
2023
+ .btn-primary.loading::after,
2024
+ .btn-secondary.loading::after,
2025
+ .btn-danger.loading::after {
2026
  content: "";
2027
  position: absolute;
2028
  width: 18px;
 
2041
  }
2042
 
2043
  @keyframes spin {
2044
+ to {
2045
+ transform: rotate(360deg);
2046
+ }
2047
  }
2048
 
2049
  /* ── RESPONSIVE ── */
2050
  @media (max-width: 992px) {
2051
+ .app-container {
2052
+ gap: 12px;
2053
+ padding: 10px;
2054
+ }
2055
+
2056
+ .sidebar {
2057
+ width: 224px;
2058
+ }
2059
+
2060
+ .search-bar {
2061
+ width: 100%;
2062
+ max-width: 420px;
2063
+ }
2064
+
2065
+ .grid-container {
2066
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
2067
+ }
2068
+
2069
  .links-hero {
2070
  padding: 32px 28px;
2071
  min-height: 220px;
2072
  }
2073
+
2074
  .links-hero-art {
2075
  flex-basis: 250px;
2076
  transform: scale(0.82);
2077
  transform-origin: right center;
2078
  }
2079
+
2080
+ .links-toolbar {
2081
+ grid-template-columns: 1fr 1fr;
2082
+ }
2083
+
2084
+ .links-search {
2085
+ grid-column: 1 / -1;
2086
+ }
2087
+
2088
+ .links-insights {
2089
+ grid-template-columns: 1fr;
2090
+ }
2091
  }
2092
 
2093
  @media (max-width: 768px) {
2094
+ .sidebar {
2095
  position: fixed;
2096
  left: -260px;
2097
  height: 100vh;
 
2099
  box-shadow: var(--shadow-xl);
2100
  border-radius: 0 20px 20px 0;
2101
  }
2102
+
2103
  .sidebar.mobile-open {
2104
  left: 0;
2105
  }
2106
+
2107
  .main-content {
2108
  margin-left: 0;
2109
  border-radius: 18px;
2110
  }
2111
+
2112
  .top-header {
2113
  padding: 0 12px;
2114
  min-height: 62px;
2115
  gap: 8px;
2116
  }
2117
+
2118
  .search-bar {
2119
  width: 100%;
2120
  margin: 0 6px;
2121
  padding: 10px 14px;
2122
  }
2123
+
2124
+ .user-actions {
2125
+ gap: 8px;
2126
+ }
2127
+
2128
+ .content-area {
2129
+ padding: 0 12px 14px;
2130
+ }
2131
+
2132
+ .breadcrumbs {
2133
+ padding: 14px 12px 8px;
2134
+ font-size: 16px;
2135
+ }
2136
+
2137
+ .breadcrumb-item {
2138
+ font-size: 14px;
2139
+ }
2140
+
2141
+ .section-header {
2142
+ margin-bottom: 14px;
2143
+ }
2144
+
2145
+ .grid-container {
2146
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
2147
+ gap: 10px;
2148
+ }
2149
+
2150
+ .folder-card {
2151
+ padding: 12px;
2152
+ min-height: 136px;
2153
+ }
2154
+
2155
+ .file-card {
2156
+ border-radius: 16px;
2157
+ }
2158
+
2159
+ .file-preview {
2160
+ height: 92px;
2161
+ }
2162
+
2163
  .links-hero {
2164
  padding: 24px 20px;
2165
  flex-direction: column;
2166
  align-items: flex-start;
2167
  min-height: auto;
2168
  }
2169
+
2170
  .links-hero::after {
2171
  left: auto;
2172
  right: 18px;
2173
  top: 120px;
2174
  }
2175
+
2176
  .links-hero-art {
2177
  width: 100%;
2178
  height: 132px;
 
2181
  transform: scale(0.8);
2182
  transform-origin: left center;
2183
  }
2184
+
2185
+ .links-hero h2 {
2186
+ font-size: 24px;
2187
+ }
2188
+
2189
+ .links-toolbar {
2190
+ grid-template-columns: 1fr;
2191
+ }
2192
+
2193
  .links-stat-card {
2194
  min-height: auto;
2195
  padding: 20px;
2196
  }
2197
+
2198
+ .links-stat-card strong {
2199
+ font-size: 24px;
2200
+ }
2201
+
2202
  .links-search {
2203
  flex-direction: column;
2204
  align-items: stretch;
2205
  }
2206
+
2207
  .links-search-input {
2208
  min-height: 64px;
2209
  }
2210
+
2211
  .links-filter-btn {
2212
  width: fit-content;
2213
  align-self: flex-end;
2214
  }
2215
+
2216
+ .links-note-chip {
2217
+ width: 100%;
2218
+ }
2219
+
2220
  .links-container {
2221
  padding: 16px;
2222
  border-radius: 20px;
2223
  }
2224
+
2225
+ .link-card-topline {
2226
+ flex-direction: column;
2227
+ }
2228
+
2229
+ .shortcut-hint {
2230
+ width: 100%;
2231
+ margin-right: 0;
2232
+ }
2233
+
2234
  /* Mobile Menu Toggle */
2235
  .menu-toggle {
2236
  display: flex !important;
 
2243
  color: var(--text-main);
2244
  cursor: pointer;
2245
  }
2246
+
2247
  .sidebar-bottom {
2248
  padding-top: 14px;
2249
  }
2250
+
2251
  .storage-dashboard {
2252
  padding: 12px;
2253
  }
2254
+
2255
  .hf-badge {
2256
  padding: 9px 10px;
2257
  font-size: 11px;
 
2259
  }
2260
 
2261
  /* Add menu toggle to header if it doesn't exist */
2262
+ .menu-toggle {
2263
+ display: none;
2264
+ }
2265
 
2266
  /* ── VERSION HISTORY ── */
2267
  .history-list {
 
2368
  font-size: 13px;
2369
  }
2370
 
2371
+ /* ── LINKS SECTION ── */
2372
  .links-container {
2373
  display: grid;
2374
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
2375
  gap: 24px;
2376
  margin-top: var(--space-2);
2377
  background: #ffffff;
2378
  border: 1px solid #e8edf4;
2379
  border-radius: 28px;
2380
+ min-height: 300px;
2381
+ padding: 32px;
2382
  box-shadow: var(--shadow-sm);
2383
  }
2384
 
2385
  .link-card {
2386
+ background: var(--card);
2387
+ border: 1px solid var(--border-color);
2388
+ border-radius: 14px;
2389
  padding: 18px;
2390
  position: relative;
2391
+ cursor: pointer;
2392
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2393
+ box-shadow: var(--shadow-sm);
2394
  display: flex;
2395
  flex-direction: column;
2396
+ gap: 12px;
2397
+ animation: cardFadeIn 0.4s ease-out forwards;
 
 
2398
  opacity: 0;
2399
+ transform: translateY(20px);
 
 
 
 
 
2400
  }
2401
 
2402
  .link-card:hover {
2403
+ transform: translateY(-4px);
2404
+ box-shadow: var(--shadow-lg);
2405
+ border-color: var(--primary-color);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2406
  }
2407
 
2408
  .link-card-header {
2409
  display: flex;
2410
+ align-items: flex-start;
2411
+ gap: 12px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2412
  }
2413
 
2414
  .link-card-content {
 
2420
  display: flex;
2421
  align-items: flex-start;
2422
  justify-content: space-between;
2423
+ gap: 10px;
2424
+ margin-bottom: 6px;
2425
+ }
2426
+
2427
+ .link-icon {
2428
+ width: 40px;
2429
+ height: 40px;
2430
+ background: var(--primary-light);
2431
+ border-radius: 10px;
2432
+ display: flex;
2433
+ align-items: center;
2434
+ justify-content: center;
2435
+ color: var(--primary-color);
2436
+ font-size: 20px;
2437
+ flex-shrink: 0;
2438
  }
2439
 
2440
  .link-title {
2441
  font-size: 15px;
2442
+ font-weight: 600;
2443
+ color: var(--text-main);
2444
+ word-break: break-word;
2445
+ line-height: 1.3;
 
 
2446
  }
2447
 
2448
  .link-domain-badge {
2449
+ display: inline-flex;
2450
+ align-items: center;
2451
+ white-space: nowrap;
2452
+ padding: 5px 10px;
2453
+ border-radius: 999px;
2454
+ background: var(--hover-bg);
2455
+ color: var(--text-muted);
2456
+ border: 1px solid var(--border-color);
2457
  font-size: 11px;
2458
  font-weight: 700;
2459
+ letter-spacing: 0.3px;
 
 
 
 
 
 
2460
  }
2461
 
2462
  .link-url {
2463
+ font-size: 12px;
2464
  color: var(--primary-color);
2465
+ word-break: break-all;
2466
  text-decoration: none;
2467
+ line-height: 1.4;
2468
  overflow: hidden;
2469
+ display: -webkit-box;
2470
+ -webkit-line-clamp: 1;
2471
+ -webkit-box-orient: vertical;
 
 
 
 
 
 
 
 
 
 
2472
  }
2473
 
2474
  .link-description {
2475
+ font-size: 13px;
2476
+ color: var(--text-muted);
2477
+ line-height: 1.5;
2478
  display: -webkit-box;
2479
  -webkit-line-clamp: 2;
2480
  -webkit-box-orient: vertical;
2481
  overflow: hidden;
 
2482
  }
2483
 
2484
+ .link-description.muted {
2485
  color: #94a3b8;
2486
  font-style: italic;
 
 
 
 
 
 
 
 
 
 
2487
  }
2488
 
2489
  .link-meta {
2490
  display: flex;
2491
+ flex-wrap: wrap;
2492
+ gap: 10px 16px;
2493
  font-size: 12px;
2494
+ color: var(--text-muted);
 
2495
  }
2496
 
2497
+ .link-meta span {
2498
+ display: inline-flex;
2499
+ align-items: center;
2500
+ gap: 6px;
2501
  }
2502
 
2503
  .link-actions {
2504
  display: flex;
 
2505
  gap: 8px;
2506
+ justify-content: space-between;
2507
+ flex-wrap: wrap;
2508
+ padding-top: 8px;
2509
+ border-top: 1px solid var(--border-color);
2510
  }
2511
 
2512
  .link-action-btn {
2513
+ flex: 1 1 140px;
 
 
 
 
 
2514
  display: flex;
2515
  align-items: center;
2516
  justify-content: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2517
  gap: 6px;
2518
+ padding: 8px 12px;
2519
+ background: var(--hover-bg);
2520
+ border: 1px solid var(--border-color);
2521
+ border-radius: 8px;
2522
+ color: var(--text-muted);
2523
  font-size: 13px;
2524
  font-weight: 600;
2525
+ cursor: pointer;
2526
+ transition: all 0.15s ease;
2527
  text-decoration: none;
 
 
2528
  }
2529
 
2530
+ .link-action-btn:hover {
2531
+ background: var(--primary-light);
2532
+ color: var(--primary-color);
2533
+ border-color: var(--primary-color);
2534
+ }
2535
+
2536
+ .link-action-btn.delete:hover {
2537
+ background: rgba(239, 68, 68, 0.1);
2538
+ color: var(--danger-color);
2539
+ border-color: var(--danger-color);
2540
  }
2541
 
2542
  .links-empty {
 
2545
  flex-direction: column;
2546
  align-items: center;
2547
  justify-content: center;
2548
+ padding: 78px 24px 84px;
2549
  text-align: center;
2550
+ color: var(--text-muted);
2551
+ animation: fadeInUp 0.6s ease-out;
2552
  }
2553
 
2554
  .links-empty-illustration {
2555
+ width: 84px;
2556
+ height: 84px;
2557
+ border-radius: 50%;
 
2558
  display: flex;
2559
  align-items: center;
2560
  justify-content: center;
2561
+ margin-bottom: var(--space-3);
2562
+ background: linear-gradient(180deg, #eef2f7, #e5ebf4);
2563
+ position: relative;
2564
+ }
2565
+
2566
+ .links-empty-illustration i {
2567
+ font-size: 38px;
2568
+ color: #7d8798;
2569
+ opacity: 1;
2570
+ animation: bounceIn 0.8s ease-out;
2571
+ }
2572
+
2573
+ .links-empty-illustration::after {
2574
+ content: '+';
2575
+ position: absolute;
2576
+ right: -4px;
2577
+ bottom: 4px;
2578
+ width: 24px;
2579
+ height: 24px;
2580
+ border-radius: 50%;
2581
+ background: #ffffff;
2582
+ border: 2px solid #95a2b5;
2583
+ color: #64748b;
2584
+ display: flex;
2585
+ align-items: center;
2586
+ justify-content: center;
2587
+ font-size: 16px;
2588
+ font-weight: 700;
2589
  }
2590
 
2591
  .links-empty h3 {
2592
+ font-size: 18px;
2593
  font-weight: 700;
2594
+ line-height: 1.2;
2595
+ margin-bottom: 12px;
2596
+ color: #25324a;
2597
  }
2598
 
2599
  .links-empty p {
2600
+ font-size: 14px;
 
 
2601
  line-height: 1.6;
2602
+ max-width: 420px;
2603
+ margin-bottom: 18px;
2604
+ color: #72839a;
 
 
 
2605
  }
2606
 
2607
  .input-group textarea {
 
2621
  .input-group textarea:focus {
2622
  border-color: var(--primary-color);
2623
  box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.12);
2624
+ }