chore: untrack sanity-studio
This commit is contained in:
1 parent
ef5d35dbf4
commit
5824716e9c
19 files changed
+1
-14874
No files matched your search
@@ -18,6 +18,7 @@ node_modules/
|
||||
Sanity-studio/.sanity/
|
||||
Sanity-studio/dist/
|
||||
theme/
|
||||
Sanity-studio/
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# Sanity Studio ignore rules
|
||||
node_modules/
|
||||
.env*
|
||||
.sanity/
|
||||
dist/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.DS_Store
|
||||
@@ -1,5 +0,0 @@
|
||||
{"_id":"cert-hardware-basics","_type":"certification","code":"01","title":"Computer Hardware Basics","issuer":"Cisco","category":"Hardware & Systems","badgeImageUrl":"https://images.credly.com/images/19e742ef-13be-4d26-87ed-ac8f5fd0643c/linkedin_thumb_image.png","badgeUrl":"https://www.credly.com/badges/d2f0c176-2e45-4b99-88e2-fa9fb9ff34c6/public_url","description":"Hardware diagnostics, mobile device architectures, component installation, preventative maintenance, and troubleshooting tools.","skills":["PC Architecture","Component Diagnostics","Hardware Assembly","System Repair"],"featured":true,"order":1}
|
||||
{"_id":"cert-digital-awareness","_type":"certification","code":"02","title":"Digital Awareness","issuer":"Cisco × OpenEDG","category":"Digital Literacy","badgeImageUrl":"https://images.credly.com/images/29e7c859-4719-4081-a12f-6bdc073a43d2/linkedin_thumb_image.png","badgeUrl":"https://www.credly.com/badges/20ec510f-8325-483c-b16e-2ca00ae660ae/public_url","description":"Digital tools ecosystem, online safety protocols, data management, and ethical technology practices in modern computing.","skills":["Digital Privacy","Cyber Hygiene","Content Ethics","Security Best Practices"],"featured":true,"order":2}
|
||||
{"_id":"cert-endpoint-security","_type":"certification","code":"03","title":"Endpoint Security","issuer":"Cisco","category":"Cybersecurity","badgeImageUrl":"https://images.credly.com/images/0ca5f542-fb5e-4a22-9b7a-c1a1ce4c3db7/linkedin_thumb_EndpointSecurity.png","badgeUrl":"https://www.credly.com/badges/2aae16d4-b16c-474f-a84e-f06c330193cd/public_url","description":"Host and OS hardening, endpoint telemetry, malware detection, network segmentation, and defense-in-depth principles.","skills":["Endpoint Hardening","Threat Telemetry","OS Security","Mitigation Protocols"],"featured":true,"order":3}
|
||||
{"_id":"cert-intro-cybersecurity","_type":"certification","code":"04","title":"Introduction to Cybersecurity","issuer":"Cisco","category":"Cybersecurity","badgeImageUrl":"https://images.credly.com/images/af8c6b4e-fc31-47c4-8dcb-eb7a2065dc5b/linkedin_thumb_I2CS__1_.png","badgeUrl":"https://www.credly.com/badges/adc49a5e-87bb-4917-991d-a28160942c13/public_url","description":"Global threat landscape, vulnerability assessment methodologies, incident mitigation, and defensive cybersecurity operations.","skills":["Threat Modeling","Vulnerability Assessment","Incident Response","Network Defense"],"featured":true,"order":4}
|
||||
{"_id":"edu-lspu-bsit","_type":"education","institution":"Laguna State Polytechnic University","degree":"Bachelor of Science in Information Technology","fieldOfStudy":"Major in Software Development","startDate":"2022","endDate":"2026","location":"Laguna, Philippines","achievements":["Specialized in full-stack software development, database design, and systems architecture.","Developed enterprise records and data management projects."],"order":1}
|
||||
Generated
-13902
File diff suppressed because it is too large.
Load diff
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"name": "portfolio-studio",
|
||||
"private": true,
|
||||
"version": "1.0.0",
|
||||
"main": "package.json",
|
||||
"scripts": {
|
||||
"dev": "sanity dev",
|
||||
"build": "sanity build",
|
||||
"start": "sanity start"
|
||||
},
|
||||
"dependencies": {
|
||||
"@sanity/vision": "^6.3.0",
|
||||
"react": "^19.2.7",
|
||||
"react-dom": "^19.2.7",
|
||||
"sanity": "^6.3.0",
|
||||
"sanity-plugin-vercel-deploy": "^4.0.0",
|
||||
"styled-components": "^6.1.15"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.4.5"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
import { defineCliConfig } from 'sanity/cli'
|
||||
|
||||
export default defineCliConfig({
|
||||
api: {
|
||||
projectId: process.env.SANITY_STUDIO_PROJECT_ID || 'rk63yuwi',
|
||||
dataset: process.env.SANITY_STUDIO_DATASET || 'production'
|
||||
}
|
||||
})
|
||||
@@ -1,24 +0,0 @@
|
||||
import { defineConfig } from 'sanity'
|
||||
import { structureTool } from 'sanity/structure'
|
||||
import { visionTool } from '@sanity/vision'
|
||||
import { vercelDeployTool } from 'sanity-plugin-vercel-deploy'
|
||||
import { structure } from './structure'
|
||||
import { schemaTypes } from './schemaTypes'
|
||||
|
||||
export default defineConfig({
|
||||
name: 'default',
|
||||
title: 'Developer Portfolio Studio',
|
||||
|
||||
projectId: process.env.SANITY_STUDIO_PROJECT_ID || 'rk63yuwi',
|
||||
dataset: process.env.SANITY_STUDIO_DATASET || 'production',
|
||||
|
||||
plugins: [
|
||||
structureTool({ structure }),
|
||||
visionTool(),
|
||||
vercelDeployTool()
|
||||
],
|
||||
|
||||
schema: {
|
||||
types: schemaTypes,
|
||||
},
|
||||
})
|
||||
@@ -1,118 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'certification',
|
||||
title: 'Certification / Credential',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'title',
|
||||
title: 'Certification Title',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Computer Hardware Basics, Introduction to Cybersecurity'
|
||||
}),
|
||||
defineField({
|
||||
name: 'code',
|
||||
title: 'Badge / Cert Code',
|
||||
type: 'string',
|
||||
description: 'e.g. 01, 02, NC2, or Cisco Cert ID'
|
||||
}),
|
||||
defineField({
|
||||
name: 'issuer',
|
||||
title: 'Issuing Organization',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Cisco, Cisco × OpenEDG, TESDA, Coursera'
|
||||
}),
|
||||
defineField({
|
||||
name: 'category',
|
||||
title: 'Category',
|
||||
type: 'string',
|
||||
options: {
|
||||
list: [
|
||||
{ title: 'Cybersecurity', value: 'Cybersecurity' },
|
||||
{ title: 'Hardware & Systems', value: 'Hardware & Systems' },
|
||||
{ title: 'Digital Literacy', value: 'Digital Literacy' },
|
||||
{ title: 'Software Development', value: 'Software Development' },
|
||||
{ title: 'Cloud & DevOps', value: 'Cloud & DevOps' },
|
||||
{ title: 'Networking', value: 'Networking' },
|
||||
{ title: 'Other', value: 'Other' }
|
||||
]
|
||||
},
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'badgeImage',
|
||||
title: 'Badge Image Upload',
|
||||
type: 'image',
|
||||
options: {
|
||||
hotspot: true
|
||||
},
|
||||
description: 'Upload PNG or badge asset directly'
|
||||
}),
|
||||
defineField({
|
||||
name: 'badgeImageUrl',
|
||||
title: 'Badge Image External URL (Fallback)',
|
||||
type: 'url',
|
||||
description: 'Direct CDN/Credly image URL (e.g. https://images.credly.com/images/...)'
|
||||
}),
|
||||
defineField({
|
||||
name: 'badgeUrl',
|
||||
title: 'Verification / Public Badge URL',
|
||||
type: 'url',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'Public verification link (e.g. Credly badge URL)'
|
||||
}),
|
||||
defineField({
|
||||
name: 'description',
|
||||
title: 'Description',
|
||||
type: 'text',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'Overview of competencies, exam scope, and skills covered'
|
||||
}),
|
||||
defineField({
|
||||
name: 'skills',
|
||||
title: 'Validated Competencies / Skills',
|
||||
type: 'array',
|
||||
of: [{ type: 'string' }],
|
||||
description: 'List of skills demonstrated (e.g. Threat Modeling, Incident Response)'
|
||||
}),
|
||||
defineField({
|
||||
name: 'issueDate',
|
||||
title: 'Issue Date',
|
||||
type: 'date',
|
||||
options: {
|
||||
dateFormat: 'YYYY-MM-DD'
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'expiryDate',
|
||||
title: 'Expiration Date (if applicable)',
|
||||
type: 'date',
|
||||
options: {
|
||||
dateFormat: 'YYYY-MM-DD'
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'featured',
|
||||
title: 'Featured Credential',
|
||||
type: 'boolean',
|
||||
initialValue: true,
|
||||
description: 'Highlight on homepage credentials section'
|
||||
}),
|
||||
defineField({
|
||||
name: 'order',
|
||||
title: 'Display Order',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'title',
|
||||
subtitle: 'issuer',
|
||||
media: 'badgeImage'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,68 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'education',
|
||||
title: 'Education',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'institution',
|
||||
title: 'School / Institution Name',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Laguna State Polytechnic University'
|
||||
}),
|
||||
defineField({
|
||||
name: 'degree',
|
||||
title: 'Degree / Certificate',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Bachelor of Science in Information Technology'
|
||||
}),
|
||||
defineField({
|
||||
name: 'fieldOfStudy',
|
||||
title: 'Major / Field of Study',
|
||||
type: 'string',
|
||||
description: 'e.g. Major in Software Development'
|
||||
}),
|
||||
defineField({
|
||||
name: 'startDate',
|
||||
title: 'Start Year / Date',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. 2022'
|
||||
}),
|
||||
defineField({
|
||||
name: 'endDate',
|
||||
title: 'End Year / Date',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. 2026 or Present'
|
||||
}),
|
||||
defineField({
|
||||
name: 'location',
|
||||
title: 'Location',
|
||||
type: 'string',
|
||||
description: 'e.g. Laguna, Philippines'
|
||||
}),
|
||||
defineField({
|
||||
name: 'achievements',
|
||||
title: 'Key Highlights / Coursework / Honors',
|
||||
type: 'array',
|
||||
of: [{ type: 'string' }],
|
||||
description: 'List of bullet points or academic highlights'
|
||||
}),
|
||||
defineField({
|
||||
name: 'order',
|
||||
title: 'Display Order',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'degree',
|
||||
subtitle: 'institution'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,90 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'experience',
|
||||
title: 'Experience / Career History',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'company',
|
||||
title: 'Company / Organization Name',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Talisay Integrated School'
|
||||
}),
|
||||
defineField({
|
||||
name: 'role',
|
||||
title: 'Role / Job Title',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Programmer, Full Stack Developer'
|
||||
}),
|
||||
defineField({
|
||||
name: 'employmentType',
|
||||
title: 'Employment Type',
|
||||
type: 'string',
|
||||
options: {
|
||||
list: [
|
||||
{ title: 'Full-time', value: 'Full-time' },
|
||||
{ title: 'Part-time', value: 'Part-time' },
|
||||
{ title: 'Internship', value: 'Internship' },
|
||||
{ title: 'Contract / Freelance', value: 'Contract' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'location',
|
||||
title: 'Location',
|
||||
type: 'string',
|
||||
description: 'e.g. Laguna, Philippines / Remote'
|
||||
}),
|
||||
defineField({
|
||||
name: 'startDate',
|
||||
title: 'Start Date',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. 2025 or 2025-01'
|
||||
}),
|
||||
defineField({
|
||||
name: 'endDate',
|
||||
title: 'End Date',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
initialValue: 'Present',
|
||||
description: 'e.g. Present, 2026-05, etc.'
|
||||
}),
|
||||
defineField({
|
||||
name: 'isCurrent',
|
||||
title: 'Currently Working Here',
|
||||
type: 'boolean',
|
||||
initialValue: true
|
||||
}),
|
||||
defineField({
|
||||
name: 'description',
|
||||
title: 'Achievements & Responsibilities',
|
||||
type: 'array',
|
||||
of: [{ type: 'string' }],
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'Bullet points detailing key contributions and systems engineered'
|
||||
}),
|
||||
defineField({
|
||||
name: 'technologies',
|
||||
title: 'Technologies Used',
|
||||
type: 'array',
|
||||
of: [{ type: 'string' }],
|
||||
description: 'e.g. PHP, MySQL, JavaScript, HTML/CSS'
|
||||
}),
|
||||
defineField({
|
||||
name: 'order',
|
||||
title: 'Display Order',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'role',
|
||||
subtitle: 'company'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,72 +0,0 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,21 +0,0 @@
|
||||
import siteSettings from './siteSettings'
|
||||
import project from './project'
|
||||
import skill from './skill'
|
||||
import certification from './certification'
|
||||
import experience from './experience'
|
||||
import education from './education'
|
||||
import testimonial from './testimonial'
|
||||
import socialLink from './socialLink'
|
||||
import galleryItem from './galleryItem'
|
||||
|
||||
export const schemaTypes = [
|
||||
siteSettings,
|
||||
project,
|
||||
skill,
|
||||
certification,
|
||||
experience,
|
||||
education,
|
||||
testimonial,
|
||||
socialLink,
|
||||
galleryItem
|
||||
]
|
||||
@@ -1,133 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'project',
|
||||
title: 'Project',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'title',
|
||||
title: 'Project Title',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'slug',
|
||||
title: 'Slug',
|
||||
type: 'slug',
|
||||
options: {
|
||||
source: 'title',
|
||||
maxLength: 96
|
||||
},
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'category',
|
||||
title: 'Project Category',
|
||||
type: 'string',
|
||||
options: {
|
||||
list: [
|
||||
{ title: 'Web Application', value: 'Web Application' },
|
||||
{ title: 'Mobile Application', value: 'Mobile Application' },
|
||||
{ title: 'System / Record Management', value: 'System / Record Management' },
|
||||
{ title: 'AI / Machine Learning', value: 'AI / Machine Learning' },
|
||||
{ title: 'Full Stack', value: 'Full Stack' },
|
||||
{ title: 'Open Source', value: 'Open Source' },
|
||||
{ title: 'Tools & Utilities', value: 'Tools & Utilities' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'status',
|
||||
title: 'Project Status',
|
||||
type: 'string',
|
||||
options: {
|
||||
list: [
|
||||
{ title: 'LIVE PRODUCTION', value: 'LIVE PRODUCTION' },
|
||||
{ title: 'IN DEVELOPMENT', value: 'IN DEVELOPMENT' },
|
||||
{ title: 'COMPLETED', value: 'COMPLETED' },
|
||||
{ title: 'PROTOTYPE', value: 'PROTOTYPE' },
|
||||
{ title: 'ARCHIVED', value: 'ARCHIVED' }
|
||||
]
|
||||
},
|
||||
initialValue: 'LIVE PRODUCTION'
|
||||
}),
|
||||
defineField({
|
||||
name: 'summary',
|
||||
title: 'Card Summary',
|
||||
type: 'text',
|
||||
rows: 2,
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'Short 1-2 sentence overview displayed on project cards'
|
||||
}),
|
||||
defineField({
|
||||
name: 'description',
|
||||
title: 'Detailed Description',
|
||||
type: 'text',
|
||||
rows: 5,
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'Comprehensive overview for project showcase page'
|
||||
}),
|
||||
defineField({
|
||||
name: 'coverImage',
|
||||
title: 'Cover / Banner Image',
|
||||
type: 'image',
|
||||
options: {
|
||||
hotspot: true
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'gallery',
|
||||
title: 'Project Screenshots / Gallery',
|
||||
type: 'array',
|
||||
of: [{ type: 'image', options: { hotspot: true } }],
|
||||
description: 'Additional preview screenshots for the project details page'
|
||||
}),
|
||||
defineField({
|
||||
name: 'technologies',
|
||||
title: 'Technologies & Frameworks',
|
||||
type: 'array',
|
||||
of: [{ type: 'string' }],
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. PHP, MySQL, React, JavaScript, Bootstrap, Tailwind, Node.js'
|
||||
}),
|
||||
defineField({
|
||||
name: 'repositoryUrl',
|
||||
title: 'Source Code / Repository URL',
|
||||
type: 'url',
|
||||
description: 'e.g. https://github.com/ssbg04/repo-name'
|
||||
}),
|
||||
defineField({
|
||||
name: 'liveUrl',
|
||||
title: 'Live Demo / Production URL',
|
||||
type: 'url',
|
||||
description: 'e.g. https://my-app.vercel.app'
|
||||
}),
|
||||
defineField({
|
||||
name: 'featured',
|
||||
title: 'Featured (Show on Homepage)',
|
||||
type: 'boolean',
|
||||
initialValue: true
|
||||
}),
|
||||
defineField({
|
||||
name: 'order',
|
||||
title: 'Display Order',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
}),
|
||||
defineField({
|
||||
name: 'publishedAt',
|
||||
title: 'Published Date / Year',
|
||||
type: 'string',
|
||||
initialValue: '2026',
|
||||
description: 'e.g. 2026 or 2026-05'
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'title',
|
||||
subtitle: 'category',
|
||||
media: 'coverImage'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,157 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'siteSettings',
|
||||
title: 'Site Settings',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'fullName',
|
||||
title: 'Full Name',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'title',
|
||||
title: 'Professional Title',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'valueProposition',
|
||||
title: 'Value Proposition / Hero Headline',
|
||||
type: 'text',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'Short introduction displayed on the hero section'
|
||||
}),
|
||||
defineField({
|
||||
name: 'isAvailable',
|
||||
title: 'Available for New Projects / Roles',
|
||||
type: 'boolean',
|
||||
initialValue: true,
|
||||
description: 'Controls the live pulsating status indicator'
|
||||
}),
|
||||
defineField({
|
||||
name: 'availabilityStatus',
|
||||
title: 'Availability Status Text',
|
||||
type: 'string',
|
||||
initialValue: 'Available for new projects',
|
||||
description: 'e.g. Available for new projects, Open to Engineering Roles'
|
||||
}),
|
||||
defineField({
|
||||
name: 'biography',
|
||||
title: 'Biography Paragraphs',
|
||||
type: 'array',
|
||||
of: [{ type: 'text', rows: 3 }],
|
||||
description: 'Paragraphs for the About section.'
|
||||
}),
|
||||
defineField({
|
||||
name: 'heroImage',
|
||||
title: 'Profile Picture / Hero Image (Day / Primary)',
|
||||
type: 'image',
|
||||
options: {
|
||||
hotspot: true
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'heroImageNight',
|
||||
title: 'Profile Picture (Night / Dark Mode Optional)',
|
||||
type: 'image',
|
||||
options: {
|
||||
hotspot: true
|
||||
},
|
||||
description: 'Optional image to show when dark mode is enabled'
|
||||
}),
|
||||
defineField({
|
||||
name: 'email',
|
||||
title: 'Contact Email',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'location',
|
||||
title: 'Location',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Laguna, Philippines'
|
||||
}),
|
||||
defineField({
|
||||
name: 'resumeAsset',
|
||||
title: 'Resume / CV Document Upload (PDF)',
|
||||
type: 'file',
|
||||
description: 'Upload your latest CV or Resume directly as a PDF file'
|
||||
}),
|
||||
defineField({
|
||||
name: 'resumeFile',
|
||||
title: 'Resume File Link (or Static Fallback URL)',
|
||||
type: 'string',
|
||||
initialValue: '/CV-Cris-Charles-Garcia.pdf',
|
||||
description: 'URL or path to fallback resume (e.g. /CV-Cris-Charles-Garcia.pdf or Google Drive link)'
|
||||
}),
|
||||
defineField({
|
||||
name: 'logoImage',
|
||||
title: 'Navbar Brand Logo / Avatar Icon',
|
||||
type: 'image',
|
||||
options: {
|
||||
hotspot: true
|
||||
},
|
||||
description: 'Custom logo image displayed in the navbar and favicon fallback'
|
||||
}),
|
||||
defineField({
|
||||
name: 'contactHeading',
|
||||
title: 'Contact Section Headline',
|
||||
type: 'string',
|
||||
initialValue: "Let's create something amazing.",
|
||||
description: 'Main heading text for the contact form section'
|
||||
}),
|
||||
defineField({
|
||||
name: 'contactSubtitle',
|
||||
title: 'Contact Section Subtitle / Message',
|
||||
type: 'text',
|
||||
rows: 2,
|
||||
initialValue: "Whether you have a question, a project idea, or just want to say hi, my inbox is always open. I'll try my best to get back to you!",
|
||||
description: 'Introductory sentence displayed next to contact details'
|
||||
}),
|
||||
defineField({
|
||||
name: 'maintenanceMode',
|
||||
title: 'Enable Maintenance Mode',
|
||||
type: 'boolean',
|
||||
initialValue: false,
|
||||
description: 'When enabled, visitors will see the maintenance/under development page'
|
||||
}),
|
||||
defineField({
|
||||
name: 'maintenanceTitle',
|
||||
title: 'Maintenance Page Title',
|
||||
type: 'string',
|
||||
initialValue: 'Please come back later.',
|
||||
description: 'Headline on the maintenance page'
|
||||
}),
|
||||
defineField({
|
||||
name: 'maintenanceMessage',
|
||||
title: 'Maintenance Page Message',
|
||||
type: 'text',
|
||||
rows: 3,
|
||||
initialValue: 'The website is currently being refined and updated. You can still reach me directly through my channels below.',
|
||||
description: 'Body message on the maintenance page'
|
||||
}),
|
||||
defineField({
|
||||
name: 'seoTitle',
|
||||
title: 'Default SEO Title Override',
|
||||
type: 'string',
|
||||
description: 'Custom browser tab title prefix'
|
||||
}),
|
||||
defineField({
|
||||
name: 'seoDescription',
|
||||
title: 'Default SEO Meta Description',
|
||||
type: 'text',
|
||||
description: 'Meta description for search engines and social shares'
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'fullName',
|
||||
subtitle: 'title',
|
||||
media: 'heroImage'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,59 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'skill',
|
||||
title: 'Skill & Technology',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'name',
|
||||
title: 'Skill / Technology Name',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. PHP, Node.js, React, MySQL, Flutter, Docker, Git'
|
||||
}),
|
||||
defineField({
|
||||
name: 'category',
|
||||
title: 'Category',
|
||||
type: 'string',
|
||||
options: {
|
||||
list: [
|
||||
{ title: 'Frontend', value: 'Frontend' },
|
||||
{ title: 'Backend', value: 'Backend' },
|
||||
{ title: 'Mobile', value: 'Mobile' },
|
||||
{ title: 'Database', value: 'Database' },
|
||||
{ title: 'DevOps & Cloud', value: 'DevOps' },
|
||||
{ title: 'Cybersecurity', value: 'Cybersecurity' },
|
||||
{ title: 'AI/ML', value: 'AI/ML' },
|
||||
{ title: 'Tools & Workflow', value: 'Tools' }
|
||||
]
|
||||
},
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'proficiency',
|
||||
title: 'Proficiency Percentage (0-100)',
|
||||
type: 'number',
|
||||
initialValue: 85,
|
||||
validation: Rule => Rule.min(0).max(100)
|
||||
}),
|
||||
defineField({
|
||||
name: 'icon',
|
||||
title: 'Icon Name / SVG Reference',
|
||||
type: 'string',
|
||||
description: 'e.g. react, nodejs, mysql, php, flutter'
|
||||
}),
|
||||
defineField({
|
||||
name: 'order',
|
||||
title: 'Display Order',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'name',
|
||||
subtitle: 'category'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,75 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'socialLink',
|
||||
title: 'Social Link & Directory Profile',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'platform',
|
||||
title: 'Platform Name',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. GitHub, LinkedIn, Facebook, TikTok, Email, X (Twitter), YouTube, Discord'
|
||||
}),
|
||||
defineField({
|
||||
name: 'url',
|
||||
title: 'Target URL',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. https://github.com/ssbg04 or mailto:crischarlesgarcia345@gmail.com'
|
||||
}),
|
||||
defineField({
|
||||
name: 'icon',
|
||||
title: 'Icon Key / Reference',
|
||||
type: 'string',
|
||||
options: {
|
||||
list: [
|
||||
{ title: 'GitHub', value: 'github' },
|
||||
{ title: 'LinkedIn', value: 'linkedin' },
|
||||
{ title: 'Facebook', value: 'facebook' },
|
||||
{ title: 'TikTok', value: 'tiktok' },
|
||||
{ title: 'Email / Mail', value: 'mail' },
|
||||
{ title: 'X / Twitter', value: 'twitter' },
|
||||
{ title: 'Messenger', value: 'messenger' },
|
||||
{ title: 'YouTube', value: 'youtube' },
|
||||
{ title: 'Instagram', value: 'instagram' },
|
||||
{ title: 'Discord', value: 'discord' },
|
||||
{ title: 'Generic Web Link', value: 'link' }
|
||||
]
|
||||
},
|
||||
initialValue: 'link',
|
||||
description: 'Select platform icon or type key'
|
||||
}),
|
||||
defineField({
|
||||
name: 'order',
|
||||
title: 'Display Order',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
}),
|
||||
defineField({
|
||||
name: 'showInHero',
|
||||
title: 'Show in Hero Section',
|
||||
type: 'boolean',
|
||||
initialValue: true
|
||||
}),
|
||||
defineField({
|
||||
name: 'showInFooter',
|
||||
title: 'Show in Footer Section',
|
||||
type: 'boolean',
|
||||
initialValue: true
|
||||
}),
|
||||
defineField({
|
||||
name: 'showInLinksPage',
|
||||
title: 'Show in /links NFC Directory Page',
|
||||
type: 'boolean',
|
||||
initialValue: true
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'platform',
|
||||
subtitle: 'url'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,70 +0,0 @@
|
||||
import { defineType, defineField } from 'sanity'
|
||||
|
||||
export default defineType({
|
||||
name: 'testimonial',
|
||||
title: 'Testimonial & Recommendation',
|
||||
type: 'document',
|
||||
fields: [
|
||||
defineField({
|
||||
name: 'name',
|
||||
title: 'Person Name',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'role',
|
||||
title: 'Role / Designation',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required(),
|
||||
description: 'e.g. Lead Engineer, Academic Advisor, Client'
|
||||
}),
|
||||
defineField({
|
||||
name: 'company',
|
||||
title: 'Company / Organization',
|
||||
type: 'string',
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'avatar',
|
||||
title: 'Avatar / Photo',
|
||||
type: 'image',
|
||||
options: {
|
||||
hotspot: true
|
||||
}
|
||||
}),
|
||||
defineField({
|
||||
name: 'quote',
|
||||
title: 'Recommendation / Quote Text',
|
||||
type: 'text',
|
||||
rows: 4,
|
||||
validation: Rule => Rule.required()
|
||||
}),
|
||||
defineField({
|
||||
name: 'relationship',
|
||||
title: 'Context / Project Association',
|
||||
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',
|
||||
type: 'number',
|
||||
initialValue: 1
|
||||
})
|
||||
],
|
||||
preview: {
|
||||
select: {
|
||||
title: 'name',
|
||||
subtitle: 'company',
|
||||
media: 'avatar'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -1,23 +0,0 @@
|
||||
import type { StructureResolver } from 'sanity/structure'
|
||||
|
||||
export const structure: StructureResolver = (S) =>
|
||||
S.list()
|
||||
.title('Portfolio Content')
|
||||
.items([
|
||||
S.listItem()
|
||||
.title('Site Settings & Profile')
|
||||
.child(
|
||||
S.document()
|
||||
.schemaType('siteSettings')
|
||||
.documentId('4bd177d0-487c-4ade-8f8f-b9647d68a49e')
|
||||
),
|
||||
S.divider(),
|
||||
S.documentTypeListItem('project').title('Projects'),
|
||||
S.documentTypeListItem('certification').title('Certifications & Badges'),
|
||||
S.documentTypeListItem('skill').title('Skills Matrix'),
|
||||
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'),
|
||||
])
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "react-jsx"
|
||||
},
|
||||
"include": ["**/*.ts", "**/*.tsx"]
|
||||
}
|
||||
Reference in new issue
Block a user