From c29ad517c56f278fed03d6eb3884539dfd63a5c4 Mon Sep 17 00:00:00 2001 From: Sir Blob Date: Fri, 28 Nov 2025 19:00:24 +0000 Subject: [PATCH] pages terminal scripts --- src/lib/assets/css/navbar-waybar.css | 48 ++- src/lib/assets/css/tui-header.css | 35 +- src/lib/components/NavbarWaybar.svelte | 27 +- src/lib/components/tui/TuiHeader.svelte | 2 +- src/lib/config/terminal.ts | 3 +- src/lib/config/user.ts | 13 +- src/lib/pages/components.ts | 519 ++++++++++++++++++++++++ src/lib/pages/home.ts | 33 ++ src/lib/pages/portfolio.ts | 136 +++++++ src/lib/pages/projects.ts | 64 +++ src/routes/+page.svelte | 37 +- src/routes/components/+page.svelte | 519 +----------------------- src/routes/portfolio/+page.svelte | 118 +----- src/routes/projects/+page.svelte | 67 +-- 14 files changed, 870 insertions(+), 751 deletions(-) create mode 100644 src/lib/pages/components.ts create mode 100644 src/lib/pages/home.ts create mode 100644 src/lib/pages/portfolio.ts create mode 100644 src/lib/pages/projects.ts diff --git a/src/lib/assets/css/navbar-waybar.css b/src/lib/assets/css/navbar-waybar.css index 9f92cd5..a477e2d 100644 --- a/src/lib/assets/css/navbar-waybar.css +++ b/src/lib/assets/css/navbar-waybar.css @@ -39,8 +39,23 @@ display: flex; } +.workspaces.desktop-only, +.window-title.desktop-only { + display: flex; +} + @media (max-width: 768px) { - .desktop-only { + .desktop-only, + .workspaces.desktop-only, + .window-title.desktop-only { + display: none !important; + } + + .bar-left { + gap: 0.35rem; + } + + .bar-center { display: none; } } @@ -104,7 +119,7 @@ display: flex; align-items: center; gap: 0.35rem; - padding: 0.35rem 0.6rem; + padding: 0.35rem 0.4rem; color: var(--bar-muted); text-decoration: none; border-radius: 4px; @@ -193,7 +208,7 @@ position: absolute; top: calc(100% + 0.5rem); right: 0; - min-width: 160px; + min-width: 175px; background: var(--bar-bg); border: 1px solid var(--bar-border); border-radius: 8px; @@ -251,7 +266,7 @@ position: fixed; inset: 0; background: transparent; - z-index: 999; + z-index: 997; border: none; cursor: default; } @@ -264,10 +279,11 @@ right: 0; background: var(--bar-bg); border-bottom: 1px solid var(--bar-border); - z-index: 998; + z-index: 1000; padding: 1rem; font-family: 'JetBrains Mono', 'Fira Code', monospace; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + pointer-events: auto; } .mobile-nav-links { @@ -286,10 +302,18 @@ border-radius: 6px; transition: all 0.15s ease; font-size: 0.9rem; + cursor: pointer; + position: relative; + z-index: 1; } .mobile-nav-link:hover { background: var(--bar-bg-module); + color: var(--bar-primary); +} + +.mobile-nav-link:active { + transform: scale(0.98); } .mobile-nav-link.active { @@ -341,11 +365,18 @@ font-family: inherit; font-size: 0.75rem; transition: all 0.15s ease; + position: relative; + z-index: 1; } .mobile-theme-btn:hover { background: color-mix(in srgb, var(--bar-primary) 15%, transparent); border-color: var(--bar-primary); + color: var(--bar-primary); +} + +.mobile-theme-btn:active { + transform: scale(0.98); } .mobile-theme-btn.active { @@ -369,9 +400,16 @@ font-size: 0.8rem; transition: all 0.15s ease; width: 100%; + position: relative; + z-index: 1; } .mobile-mode-btn:hover { background: color-mix(in srgb, var(--bar-primary) 15%, transparent); border-color: var(--bar-primary); + color: var(--bar-primary); +} + +.mobile-mode-btn:active { + transform: scale(0.98); } diff --git a/src/lib/assets/css/tui-header.css b/src/lib/assets/css/tui-header.css index 973a074..88b3d3a 100644 --- a/src/lib/assets/css/tui-header.css +++ b/src/lib/assets/css/tui-header.css @@ -6,22 +6,40 @@ font-size: 0.75rem; background: var(--terminal-bg-light); border-color: var(--terminal-border); + gap: 1rem; + position: relative; } .tui-statusbar.top { border-bottom: 1px solid var(--terminal-border); } -.status-left, .status-right { +.status-left { display: flex; align-items: center; gap: 0.5rem; color: var(--terminal-muted); + flex-shrink: 0; + z-index: 1; +} + +.status-right { + display: flex; + align-items: center; + gap: 0.5rem; + color: var(--terminal-muted); + flex-shrink: 0; + z-index: 1; } .status-center { + position: absolute; + left: 50%; + transform: translateX(-50%); color: var(--terminal-primary); font-weight: 600; + text-align: center; + white-space: nowrap; } .hint { @@ -31,8 +49,23 @@ font-size: 0.7rem; } +.user-host { + display: inline; +} + @media (max-width: 768px) { .hint { display: none; } + + .user-host { + display: none; + } + + .status-center { + position: static; + transform: none; + left: 0; + } } + diff --git a/src/lib/components/NavbarWaybar.svelte b/src/lib/components/NavbarWaybar.svelte index 0f55875..2366966 100644 --- a/src/lib/components/NavbarWaybar.svelte +++ b/src/lib/components/NavbarWaybar.svelte @@ -218,24 +218,43 @@ {/if} - - {#if themeDropdownOpen || mobileMenuOpen} + + {#if themeDropdownOpen} {/if} + +{#if mobileMenuOpen} + +{/if} + {#if mobileMenuOpen}
- {user.username}@{user.hostname} + {user.username}@{user.hostname} {title} diff --git a/src/lib/config/terminal.ts b/src/lib/config/terminal.ts index 3ccb916..5ad6f6e 100644 --- a/src/lib/config/terminal.ts +++ b/src/lib/config/terminal.ts @@ -124,7 +124,8 @@ export const pageSpeedSettings: Record = { 'home': 'fast', 'portfolio': 'fast', 'models': 'fast', - 'projects': 'fast' + 'projects': 'fast', + 'components': 'fast' }; // Per-page autoscroll settings (whether to auto-scroll as content types) diff --git a/src/lib/config/user.ts b/src/lib/config/user.ts index 104405d..38f809c 100644 --- a/src/lib/config/user.ts +++ b/src/lib/config/user.ts @@ -9,9 +9,10 @@ export const user = { hostname: 'engineering', title: 'Engineering Student', email: 'sirblob0@gmail.com', - location: 'Washington DC-Baltimore Area', + location: 'USA (EAST)', bio: `Hi, I am Sir Blob — a engineer who loves making things. ` + - `I build fun coding projects, participate in game jams and hackathons, and enjoy games like Minecraft and Pokémon TCG Live.`, + `I build fun coding projects, participate in game jams and hackathons, and enjoy games like Minecraft and Pokémon TCG Live. ` + + `I'm interested in Open Source, Game Development, Embedded Systems, and AI/ML.`, // Prefer an absolute avatar URL if you want to pull directly from GitHub avatar: '/blob_nerd.png', @@ -32,10 +33,10 @@ export const user = { export const skills = { languages: ['Python', 'JavaScript', 'TypeScript', 'C', 'C++', 'Java', 'Node.js'], - frameworks: ['Arduino', 'Bootstrap', 'TailwindCSS', 'Discord.js', 'React', 'Electron', 'Svelte'], - applications: ['Windows', 'Linux', 'macOS', 'IntelliJ', 'VS Code', 'Git', 'Blender', 'Godot'], + frameworks: ['React', 'Electron', 'Svelte', 'Bootstrap', 'TailwindCSS', 'Discord.js', ], + applications: ['IntelliJ', 'VS Code', 'Git', 'Blender', 'Godot'], platforms: ['Windows', 'Linux', 'macOS', 'Arduino', 'Raspberry Pi'], tools: ['Git', 'Docker', 'Neovim', 'VS Code'], - databases: ['MongoDB', 'Redis', 'SQLite'], - interests: ['Open Source', '3D Graphics', 'Game Development', 'Embedded Systems', 'AI/ML'] + databases: ['MongoDB', 'SQLite'], + interests: ['Open Source', 'Game Development', 'Embedded Systems', 'AI/ML'] }; diff --git a/src/lib/pages/components.ts b/src/lib/pages/components.ts new file mode 100644 index 0000000..1612a3b --- /dev/null +++ b/src/lib/pages/components.ts @@ -0,0 +1,519 @@ +import type { TerminalLine } from '$lib/components/tui/types'; +import { user } from '$lib/config'; + +const sampleTableHeaders = ['Name', 'Type', 'Status']; +const sampleTableRows = [ + ['Button', 'Interactive', 'Ready'], + ['Progress', 'Display', 'Active'], + ['Card', 'Container', 'Ready'] +]; + +const sampleAccordionItems = [ + { title: 'What is this?', content: 'A showcase of all TUI components available in this terminal.' }, + { title: 'How to use?', content: 'Copy the code examples and customize for your needs.' }, + { title: 'Can I add more?', content: 'Yes! Check the types.ts file for the full API.' } +]; + +// Build comprehensive component showcase +export const lines: TerminalLine[] = [ + // Header + { type: 'command', content: 'cat ~/components/README.md' }, + { type: 'blank', content: '' }, + { type: 'header', content: '(&primary,bold)Terminal UI Components(&)' }, + { type: 'output', content: '(&muted)A comprehensive showcase of all available TUI components(&)' }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // TEXT FORMATTING + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'TEXT FORMATTING' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Colors(&)' }, + { type: 'output', content: '(&red)red(&) (&green)green(&) (&yellow)yellow(&) (&blue)blue(&) (&magenta)magenta(&) (&cyan)cyan(&) (&orange)orange(&) (&pink)pink(&)' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Semantic Colors(&)' }, + { type: 'output', content: '(&primary)primary(&) (&accent)accent(&) (&muted)muted(&) (&error)error(&) (&success)success(&) (&warning)warning(&) (&info)info(&)' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Text Styles(&)' }, + { type: 'output', content: '(&bold)bold(&) (&dim)dim(&) (&italic)italic(&) (&underline)underline(&) (&strikethrough)strikethrough(&)' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Combined Styles(&)' }, + { type: 'output', content: '(&bold,red)bold red(&) (&italic,cyan)italic cyan(&) (&bold,underline,yellow)bold underline yellow(&)' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Inline Icons(&)' }, + { type: 'output', content: '(&icon, mdi:github) GitHub (&icon, mdi:twitter) Twitter (&icon, mdi:heart) Love (&icon, mdi:star) Star' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Background Colors(&)' }, + { type: 'output', content: '(&bg-surface)surface bg(&) (&bg-red)red bg(&) (&bg-blue)blue bg(&) (&bg-green)green bg(&)' }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // LINE TYPES + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'LINE TYPES' }, + { type: 'blank', content: '' }, + + { type: 'command', content: 'echo "This is a command line"' }, + { type: 'output', content: 'This is an output line' }, + { type: 'info', content: 'This is an info line' }, + { type: 'success', content: 'This is a success line' }, + { type: 'warning', content: 'This is a warning line' }, + { type: 'error', content: 'This is an error line' }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // BUTTONS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'BUTTONS' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Button Styles(&)' }, + { + type: 'button', + content: 'Primary Button', + icon: 'mdi:check', + style: 'primary', + action: () => console.log('Primary clicked') + }, + { + type: 'button', + content: 'Secondary Button', + icon: 'mdi:information', + style: 'secondary', + action: () => console.log('Secondary clicked') + }, + { + type: 'button', + content: 'Accent Button', + icon: 'mdi:star', + style: 'accent', + action: () => console.log('Accent clicked') + }, + { + type: 'button', + content: 'Warning Button', + icon: 'mdi:alert', + style: 'warning', + action: () => console.log('Warning clicked') + }, + { + type: 'button', + content: 'Error Button', + icon: 'mdi:close-circle', + style: 'error', + action: () => console.log('Error clicked') + }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Link Buttons(&)' }, + { + type: 'button', + content: 'External Link (GitHub)', + icon: 'mdi:github', + style: 'primary', + href: 'https://github.com', + external: true + }, + { + type: 'button', + content: 'Internal Link (Home)', + icon: 'mdi:home', + style: 'accent', + href: '/' + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // LINKS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'LINKS' }, + { type: 'blank', content: '' }, + + { + type: 'link', + content: 'Click here to visit GitHub', + href: 'https://github.com', + icon: 'mdi:github', + external: true + }, + { + type: 'link', + content: 'Go to portfolio page', + href: '/portfolio', + icon: 'mdi:folder' + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // PROGRESS BARS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'PROGRESS BARS' }, + { type: 'blank', content: '' }, + + { + type: 'progress', + content: 'Loading...', + progress: 25, + progressLabel: 'Installing packages' + }, + { + type: 'progress', + content: '', + progress: 50, + progressLabel: 'Building project' + }, + { + type: 'progress', + content: '', + progress: 75, + progressLabel: 'Running tests' + }, + { + type: 'progress', + content: '', + progress: 100, + progressLabel: 'Complete!' + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // IMAGES + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'IMAGES' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Image with Caption(&)' }, + { + type: 'image', + content: 'User Avatar', + image: user.avatar, + imageAlt: 'Profile picture', + imageWidth: 100 + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // CARDS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'CARDS' }, + { type: 'blank', content: '' }, + + { + type: 'card', + content: 'This is card content. Cards can contain formatted text and are great for highlighting information.', + cardTitle: 'Card Title', + cardFooter: 'Card Footer' + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // TABLES + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'TABLES' }, + { type: 'blank', content: '' }, + + { + type: 'table', + content: '', + tableHeaders: sampleTableHeaders, + tableRows: sampleTableRows + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // ACCORDIONS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'ACCORDIONS' }, + { type: 'blank', content: '' }, + + { + type: 'accordion', + content: '', + accordionItems: sampleAccordionItems, + accordionOpen: false + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // TOOLTIPS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'TOOLTIPS' }, + { type: 'blank', content: '' }, + + { + type: 'tooltip', + content: 'Hover over me for more info!', + tooltipText: 'This is tooltip content that appears on hover.', + tooltipPosition: 'top' + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // DIVIDERS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'DIVIDER STYLES' }, + { type: 'blank', content: '' }, + + { type: 'output', content: '(&muted)Dividers are simple horizontal separators with optional text:(&)' }, + { type: 'divider', content: 'SECTION A' }, + { type: 'output', content: '(&muted)Content for section A...(&)' }, + { type: 'divider', content: 'SECTION B' }, + { type: 'output', content: '(&muted)Content for section B...(&)' }, + { type: 'divider', content: '' }, + { type: 'output', content: '(&muted)Empty divider above (no text)(&)' }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // FORM INPUTS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'FORM INPUTS' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Text Input(&)' }, + { + type: 'input', + content: 'Username:', + icon: 'mdi:account', + inputPlaceholder: 'Enter your username', + style: 'primary' + }, + { + type: 'input', + content: 'Email:', + icon: 'mdi:email', + inputPlaceholder: 'you@example.com', + inputType: 'email', + style: 'accent' + }, + { + type: 'input', + content: 'With prefix/suffix:', + inputPlaceholder: '100', + inputPrefix: '$', + inputSuffix: '.00', + inputType: 'number' + }, + { + type: 'input', + content: 'Error state:', + inputPlaceholder: 'Invalid input', + inputError: true, + inputErrorMessage: 'This field is required', + style: 'error' + }, + { + type: 'input', + content: 'Disabled:', + inputPlaceholder: 'Cannot edit', + inputDisabled: true + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // TEXTAREA + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'TEXTAREA' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Multi-line Text Area(&)' }, + { + type: 'textarea', + content: 'Message:', + icon: 'mdi:message-text', + inputPlaceholder: 'Type your message here...', + textareaRows: 4, + style: 'primary' + }, + { + type: 'textarea', + content: 'With character limit:', + inputPlaceholder: 'Limited to 100 characters', + textareaRows: 3, + textareaMaxLength: 100, + style: 'accent' + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // CHECKBOX + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'CHECKBOXES' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Checkbox Options(&)' }, + { + type: 'checkbox', + content: 'Enable notifications', + icon: 'mdi:bell', + style: 'primary' + }, + { + type: 'checkbox', + content: 'Accept terms and conditions', + style: 'accent' + }, + { + type: 'checkbox', + content: 'Indeterminate state', + checkboxIndeterminate: true, + style: 'warning' + }, + { + type: 'checkbox', + content: 'Disabled checkbox', + inputDisabled: true + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // RADIO BUTTONS + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'RADIO BUTTONS' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Radio Group (Vertical)(&)' }, + { + type: 'radio', + content: 'Select theme:', + icon: 'mdi:palette', + style: 'primary', + radioOptions: [ + { value: 'dark', label: 'Dark Mode', icon: 'mdi:weather-night' }, + { value: 'light', label: 'Light Mode', icon: 'mdi:weather-sunny' }, + { value: 'system', label: 'System Default', icon: 'mdi:desktop-mac' } + ] + }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Radio Group (Horizontal)(&)' }, + { + type: 'radio', + content: 'Size:', + style: 'accent', + radioHorizontal: true, + radioOptions: [ + { value: 'sm', label: 'Small' }, + { value: 'md', label: 'Medium' }, + { value: 'lg', label: 'Large' }, + { value: 'xl', label: 'Extra Large', disabled: true } + ] + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // SELECT DROPDOWN + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'SELECT DROPDOWN' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Basic Select(&)' }, + { + type: 'select', + content: 'Country:', + icon: 'mdi:earth', + inputPlaceholder: 'Select a country...', + style: 'primary', + selectOptions: [ + { value: 'us', label: 'United States', icon: 'emojione-v1:flag-for-united-states' }, + { value: 'uk', label: 'United Kingdom', icon: 'emojione-v1:flag-for-united-kingdom' }, + { value: 'de', label: 'Germany', icon: 'emojione-v1:flag-for-germany' }, + { value: 'fr', label: 'France', icon: 'emojione-v1:flag-for-france' }, + { value: 'jp', label: 'Japan', icon: 'emojione-v1:flag-for-japan' } + ] + }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Searchable Select(&)' }, + { + type: 'select', + content: 'Programming Language:', + icon: 'mdi:code-braces', + inputPlaceholder: 'Search languages...', + style: 'accent', + selectSearchable: true, + selectOptions: [ + { value: 'ts', label: 'TypeScript', icon: 'mdi:language-typescript' }, + { value: 'js', label: 'JavaScript', icon: 'mdi:language-javascript' }, + { value: 'py', label: 'Python', icon: 'mdi:language-python' }, + { value: 'rs', label: 'Rust', icon: 'mdi:language-rust' }, + { value: 'go', label: 'Go', icon: 'mdi:language-go' }, + { value: 'cpp', label: 'C++', icon: 'mdi:language-cpp' }, + { value: 'java', label: 'Java', icon: 'mdi:language-java' } + ] + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // TOGGLE SWITCH + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'TOGGLE SWITCHES' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Toggle Options(&)' }, + { + type: 'toggle', + content: 'Dark Mode', + icon: 'mdi:theme-light-dark', + style: 'primary' + }, + { + type: 'toggle', + content: 'Airplane Mode', + icon: 'mdi:airplane', + style: 'accent', + toggleOnLabel: 'ON', + toggleOffLabel: 'OFF' + }, + { + type: 'toggle', + content: 'Custom Labels', + icon: 'mdi:toggle-switch', + style: 'warning', + toggleOnLabel: 'YES', + toggleOffLabel: 'NO' + }, + { + type: 'toggle', + content: 'No Labels', + toggleShowLabels: false, + style: 'accent' + }, + { + type: 'toggle', + content: 'Disabled Toggle', + inputDisabled: true + }, + { type: 'blank', content: '' }, + + // ═══════════════════════════════════════════════════════════════ + // USAGE EXAMPLES + // ═══════════════════════════════════════════════════════════════ + { type: 'divider', content: 'USAGE' }, + { type: 'blank', content: '' }, + + { type: 'info', content: '(&blue,bold)Code Example(&)' }, + { type: 'output', content: "(&muted)// Text formatting(&)" }, + { type: 'output', content: "{ type: 'output', content: '(&green)colored text(&)' }" }, + { type: 'blank', content: '' }, + { type: 'output', content: "(&muted)// Button with action(&)" }, + { type: 'output', content: "{ type: 'button', content: 'Click', icon: 'mdi:check', style: 'primary', action: () => {} }" }, + { type: 'blank', content: '' }, + { type: 'output', content: "(&muted)// Form input(&)" }, + { type: 'output', content: "{ type: 'input', content: 'Label:', inputPlaceholder: 'Enter value...', style: 'primary' }" }, + { type: 'blank', content: '' }, + { type: 'output', content: "(&muted)// Checkbox(&)" }, + { type: 'output', content: "{ type: 'checkbox', content: 'Enable option', style: 'accent' }" }, + { type: 'blank', content: '' }, + { type: 'output', content: "(&muted)// Select dropdown(&)" }, + { type: 'output', content: "{ type: 'select', content: 'Choose:', selectOptions: [{ value: 'a', label: 'Option A' }] }" }, + { type: 'blank', content: '' }, + + // End + { type: 'success', content: '(&success)Component showcase complete!(&)' } +]; \ No newline at end of file diff --git a/src/lib/pages/home.ts b/src/lib/pages/home.ts new file mode 100644 index 0000000..f752e7b --- /dev/null +++ b/src/lib/pages/home.ts @@ -0,0 +1,33 @@ +import type { TerminalLine } from "$lib/components/tui/types"; +import { user } from "$lib/config"; +import { navigation } from "$lib/config"; + +export const lines: TerminalLine[] = [ + // neofetch style intro + { type: 'command', content: 'bash ~/startup.sh', delay: 300 }, + + // Color palette (moved below the art/stats block) + { type: 'blank', content: '' }, + { type: 'output', content: '(&red)███(&)(&orange)███(&)(&yellow)███(&)(&green)███(&)(&cyan)███(&)(&blue)███(&)(&magenta)███(&)(&pink)███(&)', inline: true }, + { type: 'output', content: '(&dim,red)███(&)(&dim,orange)███(&)(&dim,yellow)███(&)(&dim,green)███(&)(&dim,cyan)███(&)(&dim,blue)███(&)(&dim,magenta)███(&)(&dim,pink)███(&)', inline: true }, + + { type: 'blank', content: '' }, + { type: 'header', content: `Welcome to ${user.displayname}'s Portfolio` }, + { type: 'blank', content: '' }, + { type: 'output', content: `(&muted)${user.bio}(&)` }, + { type: 'blank', content: '' }, + + { type: 'divider', content: 'NAVIGATION' }, + { type: 'blank', content: '' }, + + // Interactive navigation buttons + ...navigation.map(nav => ({ + type: 'button' as const, + content: nav.name, + icon: nav.icon === '📁' ? 'mdi:folder' : nav.icon === '🎨' ? 'mdi:palette' : 'mdi:trophy', + style: 'primary' as const, + href: nav.path, + inline: true + })), + { type: 'blank', content: '' }, +]; \ No newline at end of file diff --git a/src/lib/pages/portfolio.ts b/src/lib/pages/portfolio.ts new file mode 100644 index 0000000..4ff3402 --- /dev/null +++ b/src/lib/pages/portfolio.ts @@ -0,0 +1,136 @@ + +import type { TerminalLine } from '$lib/components/tui/types'; +import { user, skills, projects } from '$lib/config'; + +export const lines: TerminalLine[] = [ + // Header command + { type: 'command', content: 'cat ~/about.md' }, + { type: 'blank', content: '' }, + + // Avatar image + { type: 'image', content: '', image: user.avatar, imageAlt: user.name, imageWidth: 150 }, + { type: 'blank', content: '' }, + + // User info + { type: 'header', content: `(&primary,bold)${user.name}(&)` }, + { type: 'info', content: `(&accent)${user.title}(&)` }, + { type: 'output', content: `(&white)Location:(&) (&primary)${user.location}(&)` }, + { type: 'output', content: `(&muted)${user.bio}(&)` }, + { type: 'blank', content: '' }, + { type: 'output', content: `(&primary, bold)Links >(&)`, inline: true }, + { type: 'link', href: "/portfolio#contact", content: `(&bg-blue,black)Contact(&)`, inline: true }, + { type: 'link', href: "/portfolio#skills", content: `(&bg-orange,black)Skills(&)`, inline: true }, + { type: 'link', href: "/portfolio#projects", content: `(&bg-green,black)Projects(&)`, inline: true }, + { type: 'blank', content: '' }, + + { type: 'divider', content: 'CONTACT', id: 'contact' }, + { type: 'blank', content: '' }, + + // Contact buttons - dynamically generated from socials array + ...user.socials.map(social => ({ + type: 'button' as const, + content: `${social.name}`, + icon: social.icon, + style: 'primary' as const, + href: social.link, + inline: true + })), + // { + // type: 'button', + // content: `Email: ${user.email}`, + // icon: 'mdi:email', + // style: 'secondary', + // href: `mailto:${user.email}` + // }, + + { type: 'blank', content: '' }, + { type: 'divider', content: 'SKILLS', id: 'skills' }, + { type: 'blank', content: '' }, + + // Skills as TUI sections + + // Languages + { type: 'info', content: '(&blue,bold)▸ Languages(&)' }, + { type: 'output', content: ' ' + skills.languages.map(s => `(&cyan)${s}(&)`).join(' (&muted)•(&) ') }, + { type: 'blank', content: '' }, + + // Frameworks + { type: 'info', content: '(&magenta,bold)▸ Frameworks(&)' }, + { type: 'output', content: ' ' + skills.frameworks.map(s => `(&pink)${s}(&)`).join(' (&muted)•(&) ') }, + { type: 'blank', content: '' }, + + // Applications + { type: 'info', content: '(&green,bold)▸ Tools(&)' }, + { type: 'output', content: ' ' + skills.tools.map(s => `(&green)${s}(&)`).join(' (&muted)•(&) ') }, + { type: 'blank', content: '' }, + + // Platforms + { type: 'info', content: '(&yellow,bold)▸ Platforms(&)' }, + { type: 'output', content: ' ' + skills.platforms.map(s => `(&yellow)${s}(&)`).join(' (&muted)•(&) ') }, + { type: 'blank', content: '' }, + + // Applications + { type: 'info', content: '(&purple,bold)▸ Applications(&)' }, + { type: 'output', content: ' ' + skills.applications.map(s => `(&purple)${s}(&)`).join(' (&muted)•(&) ') }, + { type: 'blank', content: '' }, + + // Databases + { type: 'info', content: '(&cyan,bold)▸ Databases(&)' }, + { type: 'output', content: ' ' + skills.databases.map(s => `(&cyan)${s}(&)`).join(' (&muted)•(&) ') }, + { type: 'blank', content: '' }, + + // Interests + { type: 'info', content: '(&accent,bold)▸ Interests(&)' }, + { type: 'output', content: ' ' + skills.interests.map(s => `(&muted)${s}(&)`).join(' (&muted)•(&) ') }, + + { type: 'blank', content: '' }, + { type: 'divider', content: 'PROJECTS', id: 'projects' }, + { type: 'blank', content: '' }, + + // Featured projects with buttons + ...projects.filter(p => p.featured).flatMap(project => [ + { type: 'header' as const, content: `(&primary,bold)${project.name}(&)` }, + { type: 'output' as const, content: `(&muted)${project.description}(&)` }, + { type: 'info' as const, content: `(&info)TechStack: (&primary)${project.tech.join(', ')}(&)` }, + ...(project.github ? [{ + type: 'button' as const, + content: 'View on GitHub', + icon: 'mdi:github', + style: 'accent' as const, + href: project.github + }] : []), + ...(project.live ? [{ + type: 'button' as const, + content: 'View Live Demo', + icon: 'mdi:open-in-new', + style: 'accent' as const, + href: project.live + }] : []), + { type: 'blank' as const, content: '' } + ]), + + // Other projects + ...projects.filter(p => !p.featured).flatMap(project => [ + { type: 'success' as const, content: `(&success)${project.name}(&)` }, + { type: 'output' as const, content: `(&muted)${project.description}(&)` }, + { type: 'info' as const, content: `(&info)TechStack:(&) (&primary)${project.tech.join(', ')}(&)` }, + ...(project.github ? [{ + type: 'button' as const, + content: 'View on GitHub', + icon: 'mdi:github', + style: 'accent' as const, + href: project.github + }] : []), + ...(project.live ? [{ + type: 'button' as const, + content: 'View Live', + icon: 'mdi:open-in-new', + style: 'accent' as const, + href: project.live + }] : []), + { type: 'blank' as const, content: '' } + ]), + + // End + { type: 'success', content: `(&success)Portfolio loaded successfully!(&)` } +]; \ No newline at end of file diff --git a/src/lib/pages/projects.ts b/src/lib/pages/projects.ts new file mode 100644 index 0000000..dbb78d7 --- /dev/null +++ b/src/lib/pages/projects.ts @@ -0,0 +1,64 @@ +import type { TerminalLine } from '$lib/components/tui/types'; +import { sortedCards, projects } from '$lib/config'; + +const totalHackathons = sortedCards.length; +const totalAwards = sortedCards.filter(c => c.awards && c.awards.length > 0).length; +const featuredCount = sortedCards.filter(c => c.featured).length; + +// Build the terminal lines with card grid +export const lines: TerminalLine[] = [ + { type: 'divider', content: 'PROJECTS' }, + { type: 'command', content: 'ls ~/projects --grid' }, + { type: 'blank', content: '' }, + ...projects.filter(p => p.featured).flatMap(project => [ + { type: 'header' as const, content: `(&primary,bold)${project.name}(&)` }, + { type: 'output' as const, content: `(&muted)${project.description}(&)` }, + { type: 'info' as const, content: `(&info)Tech: (&primary)${project.tech.join(', ')}(&)` }, + ...(project.github ? [{ + type: 'button' as const, + content: 'View on GitHub', + icon: 'mdi:github', + style: 'accent' as const, + href: project.github + }] : []), + ...(project.live ? [{ + type: 'button' as const, + content: 'View Live Demo', + icon: 'mdi:open-in-new', + style: 'accent' as const, + href: project.live + }] : []), + { type: 'blank' as const, content: '' } + ]), + ...projects.filter(p => !p.featured).flatMap(project => [ + { type: 'success' as const, content: `(&success)${project.name}(&)` }, + { type: 'output' as const, content: `(&muted)${project.description}(&)` }, + { type: 'info' as const, content: `(&info)Tech:(&) (&primary)${project.tech.join(', ')}(&)` }, + ...(project.github ? [{ + type: 'button' as const, + content: 'View on GitHub', + icon: 'mdi:github', + style: 'accent' as const, + href: project.github + }] : []), + ...(project.live ? [{ + type: 'button' as const, + content: 'View Live', + icon: 'mdi:open-in-new', + style: 'accent' as const, + href: project.live + }] : []), + { type: 'blank' as const, content: '' } + ]), + { type: 'blank', content: '' }, + { type: 'divider', content: 'HACKATHONS' }, + { type: 'command', content: 'ls ~/hackathons --grid' }, + { type: 'blank', content: '' }, + { type: 'header', content: `Hackathon Journey` }, + { type: 'output', content: `(&muted)Total:(&) (&primary)${totalHackathons}(&) (&muted)| Awards:(&) (&yellow)${totalAwards}(&) (&muted)| Featured:(&) (&accent)${featuredCount}(&)` }, + { type: 'blank', content: '' }, + { type: 'blank', content: '' }, + { type: 'cardgrid', content: '', cards: sortedCards }, + { type: 'blank', content: '' }, + { type: 'success', content: `(&success)Ready for the next hackathon! 🚀(&)` }, +]; \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 4d60407..66a63c9 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,43 +1,12 @@ diff --git a/src/routes/components/+page.svelte b/src/routes/components/+page.svelte index 32c05cf..cab5df6 100644 --- a/src/routes/components/+page.svelte +++ b/src/routes/components/+page.svelte @@ -1,529 +1,12 @@ diff --git a/src/routes/portfolio/+page.svelte b/src/routes/portfolio/+page.svelte index a6ae702..21955c6 100644 --- a/src/routes/portfolio/+page.svelte +++ b/src/routes/portfolio/+page.svelte @@ -1,125 +1,11 @@ diff --git a/src/routes/projects/+page.svelte b/src/routes/projects/+page.svelte index 357bab7..419821b 100644 --- a/src/routes/projects/+page.svelte +++ b/src/routes/projects/+page.svelte @@ -1,74 +1,11 @@