diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1755aea..8011a15 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -87,6 +87,7 @@ All applications are defined in [`src/lib/data.ts`](src/lib/data.ts). 2. If found → use `arch` field 3. If NOT found → search [aur.archlinux.org](https://aur.archlinux.org/) → use `arch` field with AUR package name 4. Prefer `-bin` suffix packages in AUR (pre-built, faster install) +5. **IMPORTANT**: If your AUR package name does **NOT** end in `-bin`, `-git`, or `-appimage`, you **MUST** add it to `KNOWN_AUR_PACKAGES` in [`src/lib/aur.ts`](src/lib/aur.ts) so the app knows it's from AUR. #### Ubuntu/Debian: Official Repos Only diff --git a/README.md b/README.md index e3fdf24..3d85bc2 100644 --- a/README.md +++ b/README.md @@ -54,9 +54,9 @@ Shows which apps are available for your selected distro, with instructions for u ## 📸 Screenshots - - - + + + @@ -216,18 +216,21 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines. - [x] Nix, Flatpak & Snap universal package support - [x] 150+ applications across 15 categories - [x] Smart script generation with error handling -- [x] AUR helper integration (yay) for Arch -- [x] Keyboard navigation (Vim keys + Arrows) -- [x] Dark / Light theme toggle +- [x] Dark / Light theme toggle with smooth animations - [x] Copy command & Download script -- [x] Package availability indicators - [x] Custom domain -- [x] Docker support for containerized deployment -- [x] CI/CD workflow for automated Docker builds +- [x] Docker support +- [x] CI/CD shortcuts & workflow +- [x] Search & filter applications (Real-time) +- [x] AUR Helper selection (yay/paru) + Auto-detection +- [x] Keyboard navigation (Vim keys, Arrows, Space, Esc, Enter) +- [x] Package availability indicators (including AUR badges) + + + ### Planned -- [ ] Search & filter applications - [ ] Winget support (Windows) - [ ] Homebrew support (macOS) - [ ] Save custom presets / profiles diff --git a/src/app/globals.css b/src/app/globals.css index f4a1c4a..fd1152d 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -356,7 +356,7 @@ html { } .stagger-item { - animation: staggerIn 0.15s ease-out forwards; + animation: staggerIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Tooltip fade */ @@ -373,7 +373,7 @@ html { } .tooltip-animate { - animation: tooltipIn 0.15s ease-out forwards; + animation: tooltipIn 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Dropdown entrance */ @@ -390,7 +390,7 @@ html { } .dropdown-animate { - animation: dropIn 0.15s ease-out forwards; + animation: dropIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Button press */ @@ -478,24 +478,24 @@ html { @keyframes slideUp { 0% { opacity: 0; - transform: translateY(100%); + transform: translateY(20px) scale(0.98); } 100% { opacity: 1; - transform: translateY(0); + transform: translateY(0) scale(1); } } @keyframes slideDown { 0% { opacity: 1; - transform: translateY(0); + transform: translateY(0) scale(1); } 100% { opacity: 0; - transform: translateY(100%); + transform: translateY(20px) scale(0.98); } } @@ -509,6 +509,51 @@ html { } } +/* Smooth spring-like animations for floating cards */ +@keyframes cardSlideIn { + 0% { + opacity: 0; + transform: translateY(20px) scale(0.95); + } + + 60% { + transform: translateY(-3px) scale(1.01); + } + + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes cardSlideOut { + 0% { + opacity: 1; + transform: translateY(0) scale(1); + } + + 100% { + opacity: 0; + transform: translateY(10px) scale(0.95); + } +} + +@keyframes cardSlideInSecond { + 0% { + opacity: 0; + transform: translateY(15px) scale(0.97); + } + + 60% { + transform: translateY(-2px) scale(1.005); + } + + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } +} + @keyframes tooltipSlideUp { 0% { opacity: 0; @@ -524,25 +569,53 @@ html { /* ===== COMMAND BAR SCROLLBAR ===== */ .command-scroll { - scrollbar-width: thin; - scrollbar-color: var(--text-muted) var(--bg-hover); - padding-bottom: 10px; + scrollbar-width: none; + /* Firefox */ + -ms-overflow-style: none; + /* IE/Edge */ } .command-scroll::-webkit-scrollbar { - height: 6px; + display: none; + /* Chrome/Safari/Opera */ } -.command-scroll::-webkit-scrollbar-track { - background: var(--bg-hover); - border-radius: 6px; +/* ===== SEARCH POPUP ANIMATION ===== */ + +@keyframes searchPopIn { + 0% { + opacity: 0; + transform: translateY(10px) scale(0.95); + } + + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } } -.command-scroll::-webkit-scrollbar-thumb { - background: var(--text-muted); - border-radius: 6px; +/* ===== THEME FLASH ANIMATION ===== */ + +@keyframes themeFlash { + 0% { + opacity: 0; + } + + 50% { + opacity: 0.15; + } + + 100% { + opacity: 0; + } } -.command-scroll::-webkit-scrollbar-thumb:hover { +body.theme-flash::after { + content: ""; + position: fixed; + inset: 0; + z-index: 9999; + pointer-events: none; background: var(--text-primary); + animation: themeFlash 0.15s ease-out forwards; } \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 641de7a..887bc67 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import { ThemeProvider } from "@/hooks/useTheme"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -62,7 +63,9 @@ export default function RootLayout({
- {children} +