diff --git a/Sanity-studio/schemaTypes/galleryItem.ts b/Sanity-studio/schemaTypes/galleryItem.ts new file mode 100644 index 0000000..d995568 --- /dev/null +++ b/Sanity-studio/schemaTypes/galleryItem.ts @@ -0,0 +1,72 @@ +import { defineType, defineField } from 'sanity' + +export default defineType({ + name: 'galleryItem', + title: 'Gallery Photo', + type: 'document', + fields: [ + defineField({ + name: 'title', + title: 'Photo Title (Optional)', + type: 'string', + description: 'Short headline or caption for this photo' + }), + defineField({ + name: 'photo', + title: 'Photo Asset', + type: 'image', + options: { + hotspot: true + }, + description: 'Upload high-resolution photo file' + }), + defineField({ + name: 'photoUrl', + title: 'Direct Photo URL (Fallback / Optional)', + type: 'url', + description: 'Direct image link if not uploading asset file directly' + }), + defineField({ + name: 'description', + title: 'Description / Context (Optional)', + type: 'text', + rows: 3, + description: 'Details, background context, or memory regarding this photo' + }), + defineField({ + name: 'category', + title: 'Category (Optional)', + type: 'string', + options: { + list: [ + { title: 'Projects & Demos', value: 'Projects' }, + { title: 'Academics & Campus', value: 'Academics' }, + { title: 'Certificates & Milestones', value: 'Certificates' }, + { title: 'Events & Hackathons', value: 'Events' }, + { title: 'Personal & Behind The Scenes', value: 'Personal' } + ] + }, + description: 'Filter category displayed in gallery header' + }), + defineField({ + name: 'order', + title: 'Display Order', + type: 'number', + initialValue: 1 + }) + ], + preview: { + select: { + title: 'title', + subtitle: 'category', + media: 'photo' + }, + prepare({ title, subtitle, media }) { + return { + title: title || 'Untitled Photo', + subtitle: subtitle || 'Uncategorized', + media + } + } + } +}) diff --git a/Sanity-studio/schemaTypes/index.ts b/Sanity-studio/schemaTypes/index.ts index 172cb2c..17e0dbe 100644 --- a/Sanity-studio/schemaTypes/index.ts +++ b/Sanity-studio/schemaTypes/index.ts @@ -6,6 +6,7 @@ import experience from './experience' import education from './education' import testimonial from './testimonial' import socialLink from './socialLink' +import galleryItem from './galleryItem' export const schemaTypes = [ siteSettings, @@ -15,5 +16,6 @@ export const schemaTypes = [ experience, education, testimonial, - socialLink + socialLink, + galleryItem ] diff --git a/Sanity-studio/schemaTypes/testimonial.ts b/Sanity-studio/schemaTypes/testimonial.ts index be7d1e5..56813d6 100644 --- a/Sanity-studio/schemaTypes/testimonial.ts +++ b/Sanity-studio/schemaTypes/testimonial.ts @@ -45,6 +45,14 @@ export default defineType({ type: 'string', description: 'e.g. Collaborated on TIS Management System' }), + defineField({ + name: 'rating', + title: 'Star Rating (1 - 5)', + type: 'number', + initialValue: 5, + validation: Rule => Rule.min(1).max(5).integer(), + description: 'Number of gold stars to display (1 to 5, default is 5)' + }), defineField({ name: 'order', title: 'Display Order', diff --git a/Sanity-studio/structure.ts b/Sanity-studio/structure.ts index bf13784..00b4119 100644 --- a/Sanity-studio/structure.ts +++ b/Sanity-studio/structure.ts @@ -18,5 +18,6 @@ export const structure: StructureResolver = (S) => S.documentTypeListItem('experience').title('Work Experience'), S.documentTypeListItem('education').title('Education & Academics'), S.documentTypeListItem('testimonial').title('Testimonials'), + S.documentTypeListItem('galleryItem').title('Photo Gallery'), S.documentTypeListItem('socialLink').title('Social Links & Directory'), ]) diff --git a/TODO.md b/TODO.md index b8f8dcc..3607135 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,9 @@ -just redesign all pages dont use Fluent UI and Material UI for all screen size and orientation, nav, header, footer, body, content, add certifications page and section,, - aesthetic for UI design style, make the design optimize for all devices low end, mid range, high end, remove the loading replace something unique - -# Some certifications add these and can add manually with other like NC2 or like these but for a while use these credly badges -https://www.credly.com/badges/d2f0c176-2e45-4b99-88e2-fa9fb9ff34c6/public_url -https://www.credly.com/badges/20ec510f-8325-483c-b16e-2ca00ae660ae/public_url -https://www.credly.com/badges/2aae16d4-b16c-474f-a84e-f06c330193cd/public_url -https://www.credly.com/badges/adc49a5e-87bb-4917-991d-a28160942c13/public_url \ No newline at end of file +- testimonial section stars add in sanity studio +- accessibility dropdown background color in light mode it has transparent +- add a photo gallery in gallery page -> uploads from sanity title(optional), photo upload/url, description (optional), category(optional) -> hover overlay blur + show title + show description + click show full image in a modal with cross button in top right -> add filter by category in top right -> display all the photos in a grid layout. -> responsive grid layout for mobile, tablet and desktop -> animation for the photo grid when loaded from the bottom +- optimize the low end mobile color theme -> dark mode, light mode -> colors, background, buttons, text, links, icons, everything minimize the blur effect +- chat bot remove from navigation bar and its page -> turn the chat bot into FAB -> keyword-matching search assistant for chat -> dont use api, dont label it as ai chat bot label it as Portfolio Assistant +- footer make the spotify like on messenger/instagram chat music disk spinning when playing if not its not sppining disk -> layout the socials that is not blocked by bring to top button +- link page -> optimize the theme colors, layout, animation for low end mobile -> make it linktree style that no header and footer +- navigation bar in mobile -> fix the background colors theme -> fix not working minimize or bring back icon + \ No newline at end of file diff --git a/src/components/BackToTop.tsx b/src/components/BackToTop.tsx index c82db20..ed4caa2 100644 --- a/src/components/BackToTop.tsx +++ b/src/components/BackToTop.tsx @@ -32,7 +32,7 @@ export default function BackToTop() { return ( {isVisible && ( -
+
{/* Header */} diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index edab223..4cf2efc 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -61,7 +61,7 @@ export default function Footer({ fullName = 'Cris Charles Garcia', socialLinks = ]; return ( -
+
{/* Center: Spotify Widget Box */} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 92c49e2..89528d6 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -7,8 +7,8 @@ const navItems = [ { label: 'Projects', href: '/projects' }, { label: 'About', href: '/about' }, { label: 'Certifications', href: '/certifications' }, + { label: 'Gallery', href: '/gallery' }, { label: 'Links', href: '/links' }, - { label: 'Chat', href: '/chat' }, { label: 'Contact', href: '/contact' }, ]; @@ -41,6 +41,18 @@ export default function Navbar({ fullName = 'Cris Charles', logoImage = '/logo.p return () => window.removeEventListener('resize', onResize); }, []); + // Lock scroll when mobile drawer is open + useEffect(() => { + if (drawerOpen) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'unset'; + } + return () => { + document.body.style.overflow = 'unset'; + }; + }, [drawerOpen]); + const isActive = (href: string) => { if (href === '/') return activePath === '/'; return activePath === href || activePath.startsWith(href + '/'); @@ -100,16 +112,16 @@ export default function Navbar({ fullName = 'Cris Charles', logoImage = '/logo.p - {/* Hamburger — mobile only */} + {/* Hamburger / Toggle — mobile only */}
@@ -118,22 +130,45 @@ export default function Navbar({ fullName = 'Cris Charles', logoImage = '/logo.p {/* ── Mobile Drawer Backdrop ── */} {drawerOpen && (
setDrawerOpen(false)} aria-hidden="true" /> )} - {/* ── Mobile Drawer ── */} + {/* ── Mobile Drawer (Solid Opaque Theme with Close Button) ── */}