Compare commits

...
2 Commits
Author SHA1 Message Date
ginnoir 51c8d3c92d chore: release v0.5.1
Release / build-and-push (push) Has been cancelled
2026-06-03 19:55:57 -05:00
ginnoir 62c3d33350 fix: dashboard switcher, platform-aware search shortcut, mobile search, static topbar
- Always show dashboard tab strip + add button (was gated behind length > 1)
- Search shortcut now shows Ctrl+K on Windows/Linux, ⌘K on Mac
- Add icon-only search button in topbar for mobile viewports
- Lock html/body overflow and use 100dvh to prevent topbar scrolling off-screen on mobile
2026-06-03 19:55:00 -05:00
6 changed files with 57 additions and 19 deletions
+9
View File
@@ -1,5 +1,14 @@
# Changelog # Changelog
## [0.5.1](https://github.com/ginnoir/famapp/compare/v0.5.0...v0.5.1) (2026-06-03)
### Bug Fixes
- **dashboard:** always show tab strip and add-dashboard button regardless of dashboard count
- **search:** show Ctrl+K on Windows/Linux instead of ⌘K
- **mobile:** add search icon button in topbar for mobile viewports
- **mobile:** lock html/body overflow and use 100dvh to prevent topbar scrolling off-screen
## [0.5.0](https://github.com/ginnoir/famapp/compare/v0.4.10...v0.5.0) (2026-06-03) ## [0.5.0](https://github.com/ginnoir/famapp/compare/v0.4.10...v0.5.0) (2026-06-03)
### Features ### Features
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "famapp", "name": "famapp",
"version": "0.5.0", "version": "0.5.1",
"private": true, "private": true,
"type": "module", "type": "module",
"packageManager": "pnpm@10.33.3", "packageManager": "pnpm@10.33.3",
+1 -1
View File
@@ -93,7 +93,7 @@ export default async function DashboardPage({
return ( return (
<div className={containerCls}> <div className={containerCls}>
{userDashboards.length > 1 && ( {userDashboards.length >= 1 && (
<div className="flex items-center gap-1 mb-4 overflow-x-auto"> <div className="flex items-center gap-1 mb-4 overflow-x-auto">
{userDashboards.map((d) => ( {userDashboards.map((d) => (
<DashboardTab key={d.id} slug={d.slug} name={d.name} /> <DashboardTab key={d.id} slug={d.slug} name={d.name} />
+3
View File
@@ -490,6 +490,8 @@
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
height: 100%;
overflow: hidden;
} }
body { body {
@apply bg-background text-foreground; @apply bg-background text-foreground;
@@ -521,6 +523,7 @@
display: grid; display: grid;
grid-template-columns: 232px 1fr; grid-template-columns: 232px 1fr;
height: 100vh; height: 100vh;
height: 100dvh;
background: var(--paper); background: var(--paper);
} }
:where(html[data-nav="rail"]) .app { :where(html[data-nav="rail"]) .app {
+7 -1
View File
@@ -29,8 +29,14 @@ const QUICK_ADD_ICON: Record<string, string> = {
"file-plus": "note", "file-plus": "note",
}; };
function useShortcutLabel() {
if (typeof navigator === "undefined") return "⌘K";
return /Mac|iPhone|iPad|iPod/.test(navigator.platform) ? "⌘K" : "Ctrl+K";
}
export function QuickAddSheet() { export function QuickAddSheet() {
const { sheetOpen, closeSheet, actions } = useQuickAdd(); const { sheetOpen, closeSheet, actions } = useQuickAdd();
const shortcut = useShortcutLabel();
const router = useRouter(); const router = useRouter();
const backdropRef = useRef<HTMLDivElement>(null); const backdropRef = useRef<HTMLDivElement>(null);
@@ -110,7 +116,7 @@ export function QuickAddSheet() {
}} }}
> >
<Sparkles className="size-3" /> <Sparkles className="size-3" />
<span>Pick what to add or use K to search.</span> <span>Pick what to add or use {shortcut} to search.</span>
</div> </div>
<div className="max-h-[60vh] overflow-y-auto"> <div className="max-h-[60vh] overflow-y-auto">
+36 -16
View File
@@ -3,25 +3,45 @@
import { useQuickAdd } from "@/components/quick-add-provider"; import { useQuickAdd } from "@/components/quick-add-provider";
import { NavIcon } from "@/components/nav-icon"; import { NavIcon } from "@/components/nav-icon";
function useShortcutLabel() {
if (typeof navigator === "undefined") return "⌘K";
return /Mac|iPhone|iPad|iPod/.test(navigator.platform) ? "⌘K" : "Ctrl+K";
}
export function TopbarSearch() { export function TopbarSearch() {
const { openPalette } = useQuickAdd(); const { openPalette } = useQuickAdd();
const shortcut = useShortcutLabel();
return ( return (
<button <>
type="button" {/* Desktop: pill with shortcut hint */}
onClick={openPalette} <button
aria-label="Search (⌘K)" type="button"
className="hidden md:flex items-center gap-2 h-8 px-2.5 rounded-md text-[13px]" onClick={openPalette}
style={{ aria-label={`Search (${shortcut})`}
border: "0.5px solid var(--hair-2)", className="hidden md:flex items-center gap-2 h-8 px-2.5 rounded-md text-[13px]"
background: "var(--card)", style={{
color: "var(--ink-mute)", border: "0.5px solid var(--hair-2)",
width: 220, background: "var(--card)",
}} color: "var(--ink-mute)",
> width: 220,
<NavIcon name="search" className="size-3.5" /> }}
<span style={{ flex: 1, textAlign: "left" }}>Search</span> >
<span className="kbd">K</span> <NavIcon name="search" className="size-3.5" />
</button> <span style={{ flex: 1, textAlign: "left" }}>Search</span>
<span className="kbd">{shortcut}</span>
</button>
{/* Mobile: icon-only */}
<button
type="button"
onClick={openPalette}
aria-label="Search"
className="flex md:hidden items-center justify-center h-8 w-8 rounded-md"
style={{ color: "var(--ink-mute)" }}
>
<NavIcon name="search" className="size-4" />
</button>
</>
); );
} }