@@ -378,95 +479,95 @@ export default function EditorPage() {
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.1 }}
- className="admin-glass-card p-4 rounded-xl"
+ className="glass-card p-4 rounded-2xl"
>
-
-
+
+
-
+
-
+
@@ -477,24 +578,29 @@ export default function EditorPage() {
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.2 }}
- className="admin-glass-card p-6 rounded-xl"
+ className="glass-card p-6 rounded-2xl"
>
-
Content
+
Content
{
const target = e.target as HTMLDivElement;
+ setIsTyping(true);
setFormData(prev => ({
...prev,
content: target.textContent || ''
}));
}}
+ onBlur={() => {
+ setIsTyping(false);
+ }}
suppressContentEditableWarning={true}
+ data-placeholder="Start writing your project content..."
>
- {formData.content || 'Start writing your project content...'}
+ {!isTyping ? formData.content : undefined}
Supports Markdown formatting. Use the toolbar above or type directly.
@@ -506,14 +612,14 @@ export default function EditorPage() {
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.3 }}
- className="admin-glass-card p-6 rounded-xl"
+ className="glass-card p-6 rounded-2xl"
>
-
Description
+
Description
+
+ {/* Preview Modal */}
+
+ {showPreview && (
+ setShowPreview(false)}
+ >
+ e.stopPropagation()}
+ >
+
+
Project Preview
+
+
+
+ {/* Preview Content */}
+
+ {/* Project Header */}
+
+
+ {formData.title || 'Untitled Project'}
+
+
+ {formData.description || 'No description provided'}
+
+
+ {/* Project Meta */}
+
+
+
+ {formData.category}
+
+ {formData.featured && (
+
+ ⭐ Featured
+
+ )}
+
+
+ {/* Tags */}
+ {formData.tags.length > 0 && (
+
+ {formData.tags.map((tag, index) => (
+
+ {tag}
+
+ ))}
+
+ )}
+
+ {/* Links */}
+ {((formData.github && formData.github.trim()) || (formData.live && formData.live.trim())) && (
+
+ {formData.github && formData.github.trim() && (
+
+
+ GitHub
+
+ )}
+ {formData.live && formData.live.trim() && (
+
+
+ Live Demo
+
+ )}
+
+ )}
+
+
+ {/* Content Preview */}
+ {formData.content && (
+
+ )}
+
+ {/* Status */}
+
+
+
+
+ {formData.published ? 'Published' : 'Draft'}
+
+ {formData.featured && (
+
+ Featured
+
+ )}
+
+
+ Last updated: {new Date().toLocaleDateString()}
+
+
+
+
+
+
+ )}
+
);
+}
+
+export default function EditorPage() {
+ return (
+
+ Loading editor...
+ }>
+
+
+ );
}
\ No newline at end of file
diff --git a/app/globals.css b/app/globals.css
index c2fc9eb..58a7d10 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -114,6 +114,132 @@ body {
transition: all 0.2s ease !important;
}
+/* Admin Gradient Background */
+.admin-gradient {
+ background:
+ radial-gradient(circle at 20% 80%, rgba(59, 130, 246, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(139, 92, 246, 0.15) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(236, 72, 153, 0.08) 0%, transparent 50%),
+ linear-gradient(-45deg, #0a0a0a, #111111, #0d0d0d, #151515);
+ background-size: 400% 400%, 400% 400%, 400% 400%, 400% 400%;
+ animation: gradientShift 25s ease infinite;
+ min-height: 100vh;
+}
+
+/* Admin Glass Header */
+.admin-glass-header {
+ background: rgba(255, 255, 255, 0.08) !important;
+ backdrop-filter: blur(20px) !important;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.15) !important;
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3) !important;
+}
+
+/* Editor-specific styles */
+.editor-content-editable:empty:before {
+ content: attr(data-placeholder);
+ color: #9ca3af;
+ pointer-events: none;
+ font-style: italic;
+ opacity: 0.7;
+}
+
+.editor-content-editable:focus:before {
+ content: none;
+}
+
+.editor-content-editable:empty {
+ min-height: 400px;
+ display: flex;
+ align-items: flex-start;
+ padding-top: 1.5rem;
+}
+
+.editor-content-editable:not(:empty) {
+ min-height: 400px;
+}
+
+/* Enhanced form styling */
+.form-input-enhanced {
+ background: rgba(17, 24, 39, 0.8) !important;
+ border: 1px solid rgba(75, 85, 99, 0.5) !important;
+ color: #ffffff !important;
+ transition: all 0.3s ease !important;
+ backdrop-filter: blur(10px) !important;
+}
+
+.form-input-enhanced:focus {
+ border-color: #3b82f6 !important;
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2), 0 0 20px rgba(59, 130, 246, 0.1) !important;
+ background: rgba(17, 24, 39, 0.9) !important;
+ transform: translateY(-1px) !important;
+}
+
+
+.form-input-enhanced::placeholder {
+ color: #9ca3af !important;
+}
+
+/* Select styling */
+select.form-input-enhanced {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
+ background-position: right 0.5rem center;
+ background-repeat: no-repeat;
+ background-size: 1.5em 1.5em;
+ padding-right: 2.5rem;
+ appearance: none;
+ cursor: pointer;
+}
+
+select.form-input-enhanced:focus {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%233b82f6' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
+}
+
+/* Custom dropdown styling */
+.custom-select {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+}
+
+.custom-select select {
+ width: 100%;
+ padding: 0.75rem 2.5rem 0.75rem 0.75rem;
+ background: rgba(17, 24, 39, 0.8);
+ border: 1px solid rgba(75, 85, 99, 0.5);
+ border-radius: 0.5rem;
+ color: #ffffff;
+ font-size: 0.875rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ backdrop-filter: blur(10px);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
+ background-position: right 0.75rem center;
+ background-repeat: no-repeat;
+ background-size: 1.25em 1.25em;
+}
+
+
+.custom-select select:focus {
+ outline: none;
+ border-color: #3b82f6;
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2), 0 0 20px rgba(59, 130, 246, 0.1);
+ background: rgba(17, 24, 39, 0.9);
+ transform: translateY(-1px);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%233b82f6' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
+}
+
+/* Ensure no default browser arrows show */
+.custom-select select::-ms-expand {
+ display: none;
+}
+
+.custom-select select::-webkit-appearance {
+ -webkit-appearance: none;
+}
+
/* Gradient Text */
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
diff --git a/app/projects/[slug]/page.tsx b/app/projects/[slug]/page.tsx
index 6ccb452..1eb573c 100644
--- a/app/projects/[slug]/page.tsx
+++ b/app/projects/[slug]/page.tsx
@@ -115,33 +115,37 @@ const ProjectDetail = () => {
+ {((project.github && project.github.trim() && project.github !== "#") || (project.live && project.live.trim() && project.live !== "#")) && (
+
+ {project.github && project.github.trim() && project.github !== "#" && (
+
+
+ View Code
+
+ )}
+
+ {project.live && project.live.trim() && project.live !== "#" && (
+
+
+ Live Demo
+
+ )}
+
+ )}
{/* Project Content */}
diff --git a/app/projects/page.tsx b/app/projects/page.tsx
index 26b58a0..55585c8 100644
--- a/app/projects/page.tsx
+++ b/app/projects/page.tsx
@@ -145,32 +145,34 @@ const ProjectsPage = () => {