From 53287eabff9832e92904945b65b64547e964a661 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Thu, 16 Apr 2026 14:07:17 -0400 Subject: [PATCH] fix ui --- src/App.vue | 48 ++++++------ src/components/SortDropdown.vue | 82 +++++++++++++++++++++ src/styles.css | 127 +++++++++++++++++++++++++++++--- 3 files changed, 225 insertions(+), 32 deletions(-) create mode 100644 src/components/SortDropdown.vue diff --git a/src/App.vue b/src/App.vue index f02e1ac..90dee99 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,4 +1,5 @@ + + diff --git a/src/styles.css b/src/styles.css index 52a2974..ae72c4b 100644 --- a/src/styles.css +++ b/src/styles.css @@ -295,22 +295,100 @@ button { margin-bottom: 12px; } -.sort-control { +.sort-dropdown { display: inline-flex; align-items: center; gap: 8px; + position: relative; +} + +.sort-dropdown-label { color: var(--muted); font-size: 0.84rem; } -.sort-control select { - min-width: 132px; - padding: 7px 28px 7px 10px; +.sort-dropdown-trigger { + display: inline-flex; + align-items: center; + justify-content: space-between; + gap: 14px; + min-width: 152px; + padding: 7px 10px; border: 1px solid rgba(148, 163, 184, 0.26); border-radius: 10px; - background: rgba(255, 255, 255, 0.9); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(241, 245, 249, 0.92)); color: var(--text); - outline: none; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7); + cursor: pointer; + transition: + border-color 160ms ease, + box-shadow 160ms ease, + background 160ms ease; +} + +.sort-dropdown-trigger:hover { + border-color: rgba(100, 116, 139, 0.36); +} + +.sort-dropdown-trigger.open { + border-color: rgba(47, 111, 237, 0.42); + box-shadow: + 0 0 0 3px rgba(47, 111, 237, 0.12), + inset 0 1px 0 rgba(255, 255, 255, 0.8); +} + +.sort-dropdown-caret { + width: 10px; + height: 10px; + flex-shrink: 0; + border-right: 1.8px solid #64748b; + border-bottom: 1.8px solid #64748b; + transform: rotate(45deg) translateY(-1px); + transition: transform 160ms ease; +} + +.sort-dropdown-trigger.open .sort-dropdown-caret { + transform: rotate(-135deg) translate(-2px, -2px); +} + +.sort-dropdown-menu { + position: absolute; + top: calc(100% + 8px); + right: 0; + z-index: 30; + min-width: 100%; + padding: 6px; + border: 1px solid rgba(148, 163, 184, 0.22); + border-radius: 14px; + background: rgba(255, 255, 255, 0.98); + box-shadow: + 0 20px 40px rgba(15, 23, 42, 0.14), + inset 0 1px 0 rgba(255, 255, 255, 0.75); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); +} + +.sort-dropdown-option { + display: block; + width: 100%; + padding: 10px 12px; + border-radius: 10px; + text-align: left; + color: var(--text); + background: transparent; + cursor: pointer; + transition: + background 140ms ease, + color 140ms ease; +} + +.sort-dropdown-option:hover { + background: rgba(241, 245, 249, 0.92); +} + +.sort-dropdown-option.active { + color: #fff; + background: linear-gradient(135deg, #213f75, #325ca8); } .section-tabs { @@ -516,6 +594,36 @@ button { align-self: stretch; } +.browser-nav, +.content-scroll-area { + scrollbar-width: thin; + scrollbar-color: rgba(100, 116, 139, 0.42) transparent; +} + +.browser-nav::-webkit-scrollbar, +.content-scroll-area::-webkit-scrollbar { + width: 10px; +} + +.browser-nav::-webkit-scrollbar-track, +.content-scroll-area::-webkit-scrollbar-track { + background: transparent; +} + +.browser-nav::-webkit-scrollbar-thumb, +.content-scroll-area::-webkit-scrollbar-thumb { + border: 3px solid transparent; + border-radius: 999px; + background: linear-gradient(180deg, rgba(148, 163, 184, 0.72), rgba(100, 116, 139, 0.58)); + background-clip: padding-box; +} + +.browser-nav::-webkit-scrollbar-thumb:hover, +.content-scroll-area::-webkit-scrollbar-thumb:hover { + background: linear-gradient(180deg, rgba(100, 116, 139, 0.82), rgba(71, 85, 105, 0.72)); + background-clip: padding-box; +} + .state-panel.error { background: linear-gradient(180deg, rgba(254, 242, 242, 0.92), rgba(255, 255, 255, 0.86)); } @@ -545,14 +653,13 @@ button { justify-content: stretch; } - .sort-control { + .sort-dropdown { width: 100%; - justify-content: space-between; } - .sort-control select { + .sort-dropdown-trigger { min-width: 0; - width: 160px; + width: 100%; } .profile-card,