source-code/
portofolio-neo-gruv
Public
codeCodeinfoIssues 0call_splitPull Requestsplay_circleActions
portofolio-neo-gruv/src/app/dashboard/page.tsx
typescript159 lines5.4 KB
import React from 'react';
import { ConfigEditor } from './components/ConfigEditor';
import { GithubSyncButton } from './components/GithubSyncButton';

export default function DashboardPage() {
  return (
    <div className="max-w-5xl mx-auto flex flex-col gap-4">
      <GithubSyncButton />

      <ConfigEditor 
        configKey="hero"
        title="Hero Section"
        fields={[
          { key: 'tagline', label: 'Tagline', type: 'textarea' },
          { 
            key: 'headline', 
            label: 'Headline', 
            type: 'nested', 
            fields: [
              { key: 'line1', label: 'Line 1', type: 'text' },
              { key: 'line2', label: 'Line 2', type: 'text' },
              { key: 'highlight', label: 'Highlight Word', type: 'text' }
            ]
          },
          { key: 'ctaText', label: 'CTA Button Text', type: 'text' },
          { key: 'ctaHref', label: 'CTA Button Link', type: 'text' },
          { 
            key: 'heroImage', 
            label: 'Hero Graphic Image', 
            type: 'nested', 
            fields: [
              { key: 'src', label: 'Image URL', type: 'text' },
              { key: 'alt', label: 'Image Alt Text', type: 'text' }
            ]
          }
        ]}
      />

      <ConfigEditor 
        configKey="about"
        title="About Section"
        fields={[
          { key: 'badge', label: 'Badge Text', type: 'text' },
          { 
            key: 'headline', 
            label: 'Headline', 
            type: 'nested', 
            fields: [
              { key: 'line1', label: 'Line 1', type: 'text' },
              { key: 'line2', label: 'Line 2', type: 'text' },
              { key: 'highlight', label: 'Highlight Word', type: 'text' }
            ]
          },
          { key: 'manifesto', label: 'Manifesto / Paragraph', type: 'textarea' },
          { key: 'portraitLabel', label: 'Portrait Label', type: 'text' },
          { key: 'portraitPlaceholder', label: 'Portrait Image URL / Text Placeholder', type: 'text' },
          { key: 'groupImagePlaceholder', label: 'Group Image URL / Text Placeholder (Mobile)', type: 'text' },
          {
            key: 'rules',
            label: 'Rules / Core Values',
            type: 'object_array',
            defaultItem: { label: 'Rule 0X', text: 'Rule description goes here.' },
            fields: [
              { key: 'label', label: 'Label (e.g. Rule 01)', type: 'text' },
              { key: 'text', label: 'Text', type: 'text' }
            ]
          }
        ]}
      />

      <ConfigEditor 
        configKey="resume"
        title="Resume Section"
        fields={[
          { key: 'versionLabel', label: 'Version Label', type: 'text' },
          { 
            key: 'headline', 
            label: 'Headline', 
            type: 'nested', 
            fields: [
              { key: 'prefix', label: 'Prefix', type: 'text' },
              { key: 'highlight', label: 'Highlight Word', type: 'text' }
            ]
          },
          { key: 'ctaText', label: 'CTA Button Text', type: 'text' },
          { key: 'downloadUrl', label: 'Download URL', type: 'text' },
        ]}
      />

      <ConfigEditor 
        configKey="contact"
        title="Contact Section"
        fields={[
          { 
            key: 'headline', 
            label: 'Headline', 
            type: 'nested', 
            fields: [
              { key: 'line1', label: 'Line 1', type: 'text' },
              { key: 'line2', label: 'Line 2', type: 'text' },
              { key: 'highlight', label: 'Highlight Word', type: 'text' }
            ]
          },
          { key: 'subtitle', label: 'Subtitle', type: 'textarea' },
          { key: 'emailDestination', label: 'Email Destination (mailto:...)', type: 'text' },
        ]}
      />

      <ConfigEditor 
        configKey="navigation"
        title="Navbar"
        fields={[
          { key: 'brandName', label: 'Brand Name (e.g. CREATIVE.RAW)', type: 'text' },
          { key: 'ctaText', label: 'CTA Button Text', type: 'text' },
          {
            key: 'navLinks',
            label: 'Navigation Links',
            type: 'object_array',
            defaultItem: { label: 'New Link', href: '#' },
            fields: [
              { key: 'label', label: 'Label', type: 'text' },
              { key: 'href', label: 'URL (e.g. #about)', type: 'text' }
            ]
          }
        ]}
      />

      <ConfigEditor 
        configKey="footer"
        title="Footer"
        fields={[
          { key: 'brandName', label: 'Brand Name', type: 'text' },
          { key: 'copyright', label: 'Copyright Text', type: 'text' },
          { 
            key: 'socials', 
            label: 'Social Links', 
            type: 'object_array',
            defaultItem: { label: 'New Link', href: '#', hoverColor: 'hover:text-theme-yellow', hoverBorder: 'hover:border-theme-yellow' },
            fields: [
              { key: 'label', label: 'Label', type: 'text' },
              { key: 'href', label: 'URL', type: 'text' },
              { key: 'hoverColor', label: 'Hover Color Class (e.g. hover:text-theme-red)', type: 'text' },
              { key: 'hoverBorder', label: 'Hover Border Class (e.g. hover:border-theme-red)', type: 'text' }
            ]
          }
        ]}
      />

      <ConfigEditor 
        configKey="marquee"
        title="Marquee Text"
        fields={[
          { key: '', label: 'Marquee Items (One per line)', type: 'root_string_array' }
        ]}
      />
    </div>
  );
}

About

Custom portfolio frontend designed using retro Neo-Brutalist styling. Features server-rendered pages, persistent codebase layout, interactive file explorer tree, and Shiki code syntax highlighting.

TypeScriptNext.jsReact 19Tailwind CSSShiki

Contributors

1