diff --git a/package-lock.json b/package-lock.json index e548439..18f1116 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@atproto/api": "^0.16.9", "@tailwindcss/postcss": "^4.1.13", + "clsx": "^2.1.1", "dayjs": "^1.11.18", "exifreader": "^4.32.0", "jimp": "^1.6.0", @@ -3596,6 +3597,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", diff --git a/package.json b/package.json index 30ee24e..b5563bd 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "dependencies": { "@atproto/api": "^0.16.9", "@tailwindcss/postcss": "^4.1.13", + "clsx": "^2.1.1", "dayjs": "^1.11.18", "exifreader": "^4.32.0", "jimp": "^1.6.0", diff --git a/src/app/drafts/page.tsx b/src/app/drafts/page.tsx index dcc1fe6..844887e 100644 --- a/src/app/drafts/page.tsx +++ b/src/app/drafts/page.tsx @@ -4,16 +4,17 @@ import { Callout } from '@/components/ui/callout' import { LinkButton } from '@/components/ui/forms' import DraftsProvider from '@/providers/DraftsProvider' import { Plus } from 'lucide-react' +import TwoColumn from '@/components/ui/TwoColumn' export default async function Drafts() { return ( -
-
+ + -
- -
+ +
) } diff --git a/src/app/page.tsx b/src/app/page.tsx index bc97707..516ad2b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -5,17 +5,18 @@ import BskyBackupProvider from '@/providers/BskyBackupProvider' import DraftProvider from '@/providers/DraftsProvider' import Link from '@/components/ui/link' import { Callout } from '@/components/ui/callout' +import TwoColumn from '@/components/ui/TwoColumn' export default async function Home() { return ( -
-
+ + -
- -
+ +
) diff --git a/src/app/schedules/page.tsx b/src/app/schedules/page.tsx index 3aecb92..7b0b84d 100644 --- a/src/app/schedules/page.tsx +++ b/src/app/schedules/page.tsx @@ -16,6 +16,10 @@ export default function SchedulesPage() { const [isEditing, setIsEditing] = useState(false) const [editForm, setEditForm] = useState>({}) + const handleCancel = () => { + setIsEditing(false) + } + const handleEdit = (schedule: Schedule) => { setSelectedSchedule(schedule) setEditForm(schedule) @@ -42,9 +46,9 @@ export default function SchedulesPage() { -
-
- {/* Schedule List */} +
+ {/* Schedule List */} + {!selectedSchedule && !isEditing && ( + )} + + {selectedSchedule && !isEditing && ( + + setSelectedSchedule(null)} + /> + + )} - {/* Edit Panel */} -
-
-

- {isEditing - ? selectedSchedule - ? 'Edit Schedule' - : 'Create Schedule' - : 'Schedule Details'} -

-
-
- {selectedSchedule || isEditing ? ( -
- {isEditing ? ( - - - - ) : ( - - - - )} -
- ) : ( -

- Select a schedule to view details -

- )} -
-
-
+ {/* Edit Panel */} + {isEditing && ( + + + + )}
diff --git a/src/app/settings/components/SettingsForm.tsx b/src/app/settings/components/SettingsForm.tsx index 0061a73..51d0965 100644 --- a/src/app/settings/components/SettingsForm.tsx +++ b/src/app/settings/components/SettingsForm.tsx @@ -49,7 +49,7 @@ export default function SettingsForm() { onSubmit={handleSubmit} className="space-y-6 bg-color-gray-200 dark:bg-gray-900 p-6 rounded-lg" > -
+
( -
- -
- - Local backup, drafts & scheduling for Bluesky. - -

BskyBackup

+const styles = { + navBar: + 'relative flex flex-row items-stretch justify-between border-b border-gray-200 dark:border-gray-700', + logoContainer: + 'flex items-center p-4 border-l border-gray-200 bg-blue-200 text-blue-950 dark:border-gray-700 dark:bg-blue-950 dark:text-white', + logoText: 'text-2xl font-bold', + navMenu: + 'absolute top-full right-0 lg:relative lg:top-auto lg:right-auto lg:block', + navList: + 'list-none h-full border-gray-200 border-1 flex flex-col px-10 py-5 bg-[var(--background)] dark:border-gray-800 lg:border-0 lg:items-center lg:flex-row lg:gap-4 lg:m-0 lg:p-0', + navItem: 'p-4 lg:inline-block', + navLink: + 'p-4 rounded text-gray-700 hover:text-blue-600 active:text-blue-900 active:bg-blue-500 transition-colors dark:text-gray-200 dark:hover:text-blue-400 dark:active:text-blue-200', + hamburgerButton: 'flex items-center px-4 lg:hidden', +} + +const HeaderNav = () => { + const [isMenuOpen, setIsMenuOpen] = useState(false) + + return ( +
+
+
BskyBackup
+
+ + {/* Nav: hidden on lg and below unless menu is open */} + + {/* Hamburger button for mobile */} +
-
-); + ) +} -export default HeaderNav; +export default HeaderNav diff --git a/src/components/schedules/FrequencyInput.tsx b/src/components/schedules/FrequencyInput.tsx index 11054d3..628490a 100644 --- a/src/components/schedules/FrequencyInput.tsx +++ b/src/components/schedules/FrequencyInput.tsx @@ -214,11 +214,11 @@ export default function FrequencyInput({ {interval.unit === 'weeks' && (
-
+
{WEEKDAYS.map((day) => (