diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cfe4df..cb8a816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,28 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Every release corresponds to a `staging` to `main` pull request and a matching `vX.Y.Z` tag on `main`. +## [0.1.3] - 2026-06-30 + +### Fixed + +- Dark mode: the resume nav bar, the home "your resumes" / empty-state boxes, and + the template gallery's search box and filter chips now use dark surfaces + instead of staying light (which read as muddy grey over the dark canvas). + Template cards stay light "sheets", but their pills keep light styling so they + are not dark-grey on white. +- Template card actions are an even three-column row (copy / use / preview) that + fills the footer. The home featured templates use the same 3-column grid as the + gallery (two rows of three), so the cards match the gallery width and the + "preview" button no longer overflows on the narrower cards. + +### Changed + +- Home resume row: edit and delete are now icon buttons (pencil / trash) with + accessible labels, instead of text. +- Renaming a resume on the home hub now saves on Enter or blur (and reverts on + Escape), replacing the standalone "save" button that looked like it saved the + whole résumé. + ## [0.1.2] - 2026-06-30 ### Fixed @@ -75,6 +97,7 @@ marketing site rebrand. - Invalid nested `` in template cards (hydration error). - Tolerate a missing `text_align` column before the migration runs. +[0.1.3]: https://github.com/BiSemaphore/binarysemaphore.com/releases/tag/v0.1.3 [0.1.2]: https://github.com/BiSemaphore/binarysemaphore.com/releases/tag/v0.1.2 [0.1.1]: https://github.com/BiSemaphore/binarysemaphore.com/releases/tag/v0.1.1 [0.1.0]: https://github.com/BiSemaphore/binarysemaphore.com/releases/tag/v0.1.0 diff --git a/package.json b/package.json index 112daec..1681ab1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "binarysemaphore", - "version": "0.1.2", + "version": "0.1.3", "private": true, "scripts": { "dev": "next dev", diff --git a/src/app/globals.css b/src/app/globals.css index eb5fd66..a160c2f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -576,6 +576,18 @@ body { .dark .rx-pill:hover { color: #f5f5f5; } +/* The template card is an always-light "sheet" (it frames a white resume), so + its pills keep the light styling even in dark mode, like the card's + fixed-dark text. Same specificity as `.dark .rx-pill`, declared after it so it + wins inside a card. */ +.rx-card .rx-pill { + background: rgba(255, 255, 255, 0.9); + border-color: rgba(20, 20, 19, 0.12); + color: #6b6b6b; +} +.rx-card .rx-pill:hover { + color: #171717; +} /* Translucent floating surfaces (tune panel, control pills). */ .rx-panel { background: rgba(255, 255, 255, 0.88); diff --git a/src/app/resume/(app)/layout.tsx b/src/app/resume/(app)/layout.tsx index b07ed5a..6ef424b 100644 --- a/src/app/resume/(app)/layout.tsx +++ b/src/app/resume/(app)/layout.tsx @@ -33,7 +33,7 @@ export default async function ResumeAppLayout({
-
+
@@ -65,7 +63,7 @@ export default async function ResumeHome() {
{!user ? ( -
+

Sign in to create and manage your resumes.

@@ -77,7 +75,7 @@ export default async function ResumeHome() {
) : resumes.length === 0 ? ( -
+

No resumes yet. Click{" "} + new resume, @@ -89,42 +87,32 @@ export default async function ResumeHome() { {resumes.map((resume) => (

  • -
    - - - -
    +

    {resume.templateId} · updated {formatDate(resume.updatedAt)}

    - - edit + +
    @@ -147,7 +135,7 @@ export default async function ResumeHome() { browse all ({TEMPLATES.length}) →
  • -
    +
    {featured.map((t) => ( ))} diff --git a/src/app/resume/(app)/templates/templates-gallery.tsx b/src/app/resume/(app)/templates/templates-gallery.tsx index 4ea76d0..b807e06 100644 --- a/src/app/resume/(app)/templates/templates-gallery.tsx +++ b/src/app/resume/(app)/templates/templates-gallery.tsx @@ -48,7 +48,7 @@ export function TemplatesGallery() { onChange={(e) => setQ(e.target.value)} placeholder="search by name, tag, or description" aria-label="search templates" - className="w-full rounded-lg border border-black/15 bg-white/80 py-2 pl-8 pr-3 font-mono text-sm text-foreground placeholder:text-[color:var(--rx-muted)] focus:border-[color:var(--rx-accent)] focus:outline-none" + className="w-full rounded-lg border border-black/15 bg-white/80 py-2 pl-8 pr-3 font-mono text-sm text-foreground placeholder:text-[color:var(--rx-muted)] focus:border-[color:var(--rx-accent)] focus:outline-none dark:border-white/15 dark:bg-white/[0.04]" /> @@ -73,7 +73,7 @@ export function TemplatesGallery() { className={`rounded-full border px-2.5 py-0.5 font-mono text-[11px] transition-colors ${ tags.length === 0 ? "rx-accent border-transparent" - : "border-black/10 text-[color:var(--rx-muted)] hover:bg-black/5" + : "border-black/10 text-[color:var(--rx-muted)] hover:bg-black/5 dark:border-white/15 dark:hover:bg-white/10" }`} > all @@ -89,7 +89,7 @@ export function TemplatesGallery() { className={`rounded-full border px-2.5 py-0.5 font-mono text-[11px] transition-colors ${ active ? "rx-accent border-transparent" - : "border-black/10 text-[color:var(--rx-muted)] hover:bg-black/5" + : "border-black/10 text-[color:var(--rx-muted)] hover:bg-black/5 dark:border-white/15 dark:hover:bg-white/10" }`} > {tag} diff --git a/src/components/icons.tsx b/src/components/icons.tsx index 1a1427d..eee2cab 100644 --- a/src/components/icons.tsx +++ b/src/components/icons.tsx @@ -289,3 +289,41 @@ export function CheckIcon(props: IconProps) { ); } + +export function PencilIcon(props: IconProps) { + return ( + + ); +} + +export function TrashIcon(props: IconProps) { + return ( + + ); +} diff --git a/src/components/resume/rename-title.tsx b/src/components/resume/rename-title.tsx new file mode 100644 index 0000000..74c7d69 --- /dev/null +++ b/src/components/resume/rename-title.tsx @@ -0,0 +1,51 @@ +"use client"; + +import { useRef } from "react"; +import { renameResumeAction } from "@/app/resume/(app)/actions"; + +/** + * Inline résumé-title rename on the home hub. Persists on Enter or blur (only + * when the name actually changed), reverts on Escape, and shows no explicit + * save button. Submits the existing `renameResumeAction` via the form, so the + * server action + revalidation stay the source of truth. + */ +export function RenameTitle({ id, title }: { id: string; title: string }) { + const formRef = useRef(null); + const inputRef = useRef(null); + + function commit() { + const input = inputRef.current; + if (!input) return; + const next = input.value.trim(); + if (!next) { + input.value = title; // don't allow an empty title + return; + } + if (next !== title) formRef.current?.requestSubmit(); + } + + return ( +
    + + { + if (e.key === "Enter") { + e.preventDefault(); + inputRef.current?.blur(); // triggers onBlur -> commit + } else if (e.key === "Escape") { + e.preventDefault(); + if (inputRef.current) inputRef.current.value = title; + inputRef.current?.blur(); + } + }} + onBlur={commit} + className="w-full max-w-xs rounded-lg border border-transparent bg-transparent px-2 py-1 text-base font-medium text-foreground hover:border-black/15 focus:border-black/20 focus:outline-none dark:hover:border-white/20 dark:focus:border-white/25" + /> +
    + ); +} diff --git a/src/components/resume/template-card.tsx b/src/components/resume/template-card.tsx index b6bbd69..bfc3a7a 100644 --- a/src/components/resume/template-card.tsx +++ b/src/components/resume/template-card.tsx @@ -14,7 +14,7 @@ import { SubmitButton } from "@/components/resume/submit-button"; */ export function TemplateCard({ template }: { template: Template }) { return ( -
    +
    {/* Live mini-preview: a fixed-height window onto the top of the page, with a soft fade so the crop reads as intentional. The clickable layer is an overlay link (sibling, not ancestor) so the resume's own @@ -61,13 +61,23 @@ export function TemplateCard({ template }: { template: Template }) { Fixed-dark text since the card is an always-white sheet. */}

    {template.id}

    -
    - -
    + {/* Three equal-width buttons that fill the footer, so the row reads as + a deliberate, balanced control bar in every card width. */} +
    + + - use + + use + - + preview →