diff --git a/src/app/HeaderButtons.tsx b/src/app/HeaderButtons.tsx index fda0f03..f8f5451 100644 --- a/src/app/HeaderButtons.tsx +++ b/src/app/HeaderButtons.tsx @@ -19,18 +19,30 @@ const InfoIcon = ( export default function HeaderButtons() { return ( -
- +
+ Admin Login {/* If your server for about me is running on a different port, change the port number here */} - + About Me
diff --git a/src/app/MobileNav.tsx b/src/app/MobileNav.tsx new file mode 100644 index 0000000..6b267ac --- /dev/null +++ b/src/app/MobileNav.tsx @@ -0,0 +1,93 @@ +'use client'; + +import { useState } from 'react'; +import Link from 'next/link'; + +interface MobileNavProps { + blogOwner: string; +} + +export default function MobileNav({ blogOwner }: MobileNavProps) { + const [isOpen, setIsOpen] = useState(false); + + const toggleMenu = () => { + setIsOpen(!isOpen); + }; + + return ( +
+ {/* Mobile menu button */} + + + {/* Mobile menu overlay */} + {isOpen && ( +
+
e.stopPropagation()}> +
+

{blogOwner}'s Blog

+ + + +
+
+ © {new Date().getFullYear()} {blogOwner} +
+
+
+
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/app/admin/manage/page.tsx b/src/app/admin/manage/page.tsx index 2709875..238fff7 100644 --- a/src/app/admin/manage/page.tsx +++ b/src/app/admin/manage/page.tsx @@ -219,37 +219,38 @@ export default function ManagePage() { } return ( -
+
-
-
-

Manage Content

+ {/* Mobile-friendly header */} +
+
+

Manage Content

Back to Admin
- {/* Breadcrumbs with back button */} -
+ {/* Mobile-friendly breadcrumbs */} +
{currentPath.length > 0 && ( )} -
+
{breadcrumbs.map((crumb, index) => (
- {index > 0 && /} + {index > 0 && /}
- {/* Content List */} -
+ {/* Mobile-friendly content grid */} +
{currentNodes.map((node) => ( node.type === 'folder' ? (
setCurrentPath([...currentPath, node.name])} onDoubleClick={() => setDeleteAllConfirm({ show: true, folder: node })} onDragOver={e => { e.preventDefault(); setDragOverFolder(node.name); }} @@ -301,8 +302,8 @@ export default function ManagePage() { }} >
-
-

{node.name}

+
+

{node.name}

{folderDetails[node.path] ? ( folderDetails[node.path].error ? ( @@ -321,12 +322,12 @@ export default function ManagePage() {
- {/* Delete Confirmation Modal */} + {/* Mobile-friendly delete confirmation modal */} {deleteConfirm.show && ( -
-
+
+

Confirm Delete

-

+

Are you sure you want to delete {deleteConfirm.item?.type === 'folder' ? 'folder' : 'post'} "{deleteConfirm.item?.type === 'folder' ? deleteConfirm.item.name : deleteConfirm.item?.title}"?

-
+
@@ -414,20 +415,20 @@ export default function ManagePage() {
)} - {/* Delete Full Folder Modal */} + {/* Mobile-friendly delete full folder modal */} {deleteAllConfirm.show && ( -
-
+
+

Delete Full Folder

-

+

Are you sure you want to delete the entire folder and all its contents?
This cannot be undone!

-
+
@@ -448,7 +449,7 @@ export default function ManagePage() { setDeleteAllConfirm({ show: false, folder: null }); loadContent(); }} - className="px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700" + className="px-4 py-3 sm:py-2 bg-red-600 text-white rounded hover:bg-red-700 text-base font-medium" > Delete All diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 455c361..41ee941 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -640,15 +640,15 @@ export default function AdminPage() { }; return ( -
+
{pinFeedback && ( -
+
{pinFeedback}
)} {!isAuthenticated ? ( -
-

Admin Login

+
+

Admin Login

@@ -692,31 +692,32 @@ export default function AdminPage() {
) : (
-
-

Admin Dashboard

-
+ {/* Mobile-friendly header */} +
+

Admin Dashboard

+
{/* Docker warning above export button */} {isDocker && ( -
+
Warning: Docker is in use. Exporting will export the entire /app root directory (including all files and folders in the container's root).
)}
-

Passwort ändern

+

Passwort ändern

@@ -756,7 +757,7 @@ export default function AdminPage() { type="password" value={changePwOld} onChange={e => setChangePwOld(e.target.value)} - className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-base" required autoComplete="current-password" /> @@ -767,7 +768,7 @@ export default function AdminPage() { type="password" value={changePwNew} onChange={e => setChangePwNew(e.target.value)} - className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-base" required autoComplete="new-password" /> @@ -778,7 +779,7 @@ export default function AdminPage() { type="password" value={changePwConfirm} onChange={e => setChangePwConfirm(e.target.value)} - className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-base" required autoComplete="new-password" /> @@ -788,7 +789,7 @@ export default function AdminPage() { )} @@ -797,17 +798,17 @@ export default function AdminPage() {
)} - {/* Breadcrumbs with back button */} -
+ {/* Mobile-friendly breadcrumbs */} +
{currentPath.length > 0 && ( )} -
+
{breadcrumbs.map((crumb, index) => (
- {index > 0 && /} + {index > 0 && /}
{/* Show current folder path above post creation form */} -
+
Current folder: {currentPath.join('/') || 'root'}
{/* Create Folder Form */} -
-

Create New Folder

- +
+

Create New Folder

+ setNewFolderName(e.target.value)} placeholder="Folder name" - className="flex-1 rounded-md border border-gray-300 px-3 py-2" + className="flex-1 rounded-md border border-gray-300 px-3 py-2 text-base" required /> @@ -867,7 +868,7 @@ export default function AdminPage() { {/* Drag and Drop Zone */}
-

Drag and drop Markdown files here

-

Files will be uploaded to: {currentPath.join('/') || 'root'}

+

Drag and drop Markdown files here

+

Files will be uploaded to: {currentPath.join('/') || 'root'}

{/* Create Post Form */} -
-

Create New Post

+
+

Create New Post

@@ -890,7 +891,7 @@ export default function AdminPage() { type="text" value={newPost.title} onChange={(e) => setNewPost({ ...newPost, title: e.target.value })} - className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-base" required />
@@ -900,7 +901,7 @@ export default function AdminPage() { type="date" value={newPost.date} onChange={(e) => setNewPost({ ...newPost, date: e.target.value })} - className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-base" required />
@@ -910,7 +911,7 @@ export default function AdminPage() { type="text" value={newPost.tags} onChange={(e) => setNewPost({ ...newPost, tags: e.target.value })} - className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2" + className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-base" placeholder="tag1, tag2, tag3" />
@@ -919,41 +920,36 @@ export default function AdminPage() {