|
| 1 | +"use client"; |
| 2 | +import React from "react"; |
| 3 | +import { motion } from "framer-motion"; |
| 4 | + |
| 5 | +const criteria = [ |
| 6 | + { |
| 7 | + category: "Project-Specific Inputs", |
| 8 | + items: [ |
| 9 | + { |
| 10 | + label: "project_complexity", |
| 11 | + description: "Complexity of features and integrations", |
| 12 | + example: |
| 13 | + "Example: Low: Simple CRUD, few users, known tech, Medium: Multiple modules, external API, High: High concurrency, AI/ML, microservices", |
| 14 | + howToGet: "Self-assessment or PM judgment", |
| 15 | + }, |
| 16 | + |
| 17 | + { |
| 18 | + label: "scope_clarity", |
| 19 | + description: "Clarity and completeness of the requirements", |
| 20 | + example: |
| 21 | + "Example: Clear: Detailed requirements documented, Medium: Partial clarity, Vague: No detailed specs or frequent changes", |
| 22 | + howToGet: "Ask PM/stakeholders during planning", |
| 23 | + }, |
| 24 | + { |
| 25 | + label: "urgency_level", |
| 26 | + description: "Time pressure or critical deadlines", |
| 27 | + example: |
| 28 | + "Example: Low: Flexible timeline, Medium: Moderate pressure, High: Time-critical, regulatory deadline", |
| 29 | + howToGet: "Ask client/business team", |
| 30 | + }, |
| 31 | + |
| 32 | + { |
| 33 | + label: "on_schedule", |
| 34 | + description: "Delivered within planned timeline", |
| 35 | + example: "Example: First release completed 2 days early.", |
| 36 | + howToGet: "Compare timeline with actual delivery", |
| 37 | + }, |
| 38 | + { |
| 39 | + label: "budget_estimation", |
| 40 | + description: "Total allocated project budget (USD)", |
| 41 | + example: "Example: The project has a budget of $75,000.", |
| 42 | + howToGet: "From project documentation or finance team", |
| 43 | + }, |
| 44 | + ], |
| 45 | + }, |
| 46 | + { |
| 47 | + category: "Organizational Structure", |
| 48 | + items: [ |
| 49 | + { |
| 50 | + label: "org_structure_type", |
| 51 | + description: "Functional, Matrix, or Projectized", |
| 52 | + example: "Example: Matrix structure with dual reporting.", |
| 53 | + howToGet: "Ask HR or management", |
| 54 | + }, |
| 55 | + { |
| 56 | + label: "client_priority", |
| 57 | + description: "Whether time, cost, or quality is top priority", |
| 58 | + example: 'Example: Client prioritizes "Time to Market".', |
| 59 | + howToGet: "Ask the client or PM", |
| 60 | + }, |
| 61 | + { |
| 62 | + label: "control_mechanism", |
| 63 | + description: "Monitoring tools and decision mechanisms used", |
| 64 | + example: "Example: Progress tracked via Jira sprint board.", |
| 65 | + howToGet: "Ask team or check tools used for governance", |
| 66 | + }, |
| 67 | + { |
| 68 | + label: "risk_management_score", |
| 69 | + description: "Preparedness for and response to risks", |
| 70 | + example: |
| 71 | + "Example: - Low: No planning, Medium: Identified but not tracked, High: Tracked & mitigated", |
| 72 | + howToGet: "Ask PM or review risk documentation", |
| 73 | + }, |
| 74 | + ], |
| 75 | + }, |
| 76 | + { |
| 77 | + category: "Team Experience & Collaboration", |
| 78 | + items: [ |
| 79 | + { |
| 80 | + label: "avg_dev_experience", |
| 81 | + description: "Average years of experience among developers", |
| 82 | + example: |
| 83 | + "Example: A team with members having 3, 5, and 7 years experience averages 5 years.", |
| 84 | + howToGet: |
| 85 | + "Ask HR/project manager for average years of experience of developers on the project", |
| 86 | + }, |
| 87 | + { |
| 88 | + label: "pm_experience", |
| 89 | + description: "Project manager’s experience in years", |
| 90 | + example: |
| 91 | + "Example: The PM has 8 years of project management experience.", |
| 92 | + howToGet: "Ask project manager or HR for PM’s experience in years", |
| 93 | + }, |
| 94 | + |
| 95 | + { |
| 96 | + label: "team_sdlc_knowledge", |
| 97 | + description: "Familiarity with software development lifecycle", |
| 98 | + example: |
| 99 | + "Example: Low: No formal training, Medium: Aware of SDLC steps, High: Experienced with multiple SDLCs", |
| 100 | + howToGet: "Interview or check training records", |
| 101 | + }, |
| 102 | + { |
| 103 | + label: "user_involvement", |
| 104 | + description: "End-user participation in project phases", |
| 105 | + example: |
| 106 | + "Example: Low: No user input, Medium: Periodic reviews, High: Users in every phase", |
| 107 | + howToGet: "Observe or ask about user engagement", |
| 108 | + }, |
| 109 | + |
| 110 | + { |
| 111 | + label: "communication_quality", |
| 112 | + description: "How effective team communication was", |
| 113 | + example: "Example: Daily standups and retrospectives held.", |
| 114 | + howToGet: "Survey team or check communication logs", |
| 115 | + }, |
| 116 | + ], |
| 117 | + }, |
| 118 | + { |
| 119 | + category: "Technology & Tools", |
| 120 | + items: [ |
| 121 | + { |
| 122 | + label: "tool_familiarity", |
| 123 | + description: "Familiarity with tools like Git, Jira, CI/CD", |
| 124 | + example: "Example: Team uses GitHub, Jenkins, and Jira daily.", |
| 125 | + howToGet: "Ask team members directly", |
| 126 | + }, |
| 127 | + { |
| 128 | + label: "legacy_system_involved", |
| 129 | + description: "Whether integration with old systems was required", |
| 130 | + example: "Example: Integrated with Oracle 2008 system.", |
| 131 | + howToGet: "Ask technical lead or review system dependencies", |
| 132 | + }, |
| 133 | + { |
| 134 | + label: "tech_stack_familiarity", |
| 135 | + description: "Whether team is comfortable with the tech stack", |
| 136 | + example: "Example: Prior experience with React and Node.js.", |
| 137 | + howToGet: "Ask developers if stack is familiar or new", |
| 138 | + }, |
| 139 | + { |
| 140 | + label: "testing_strategy", |
| 141 | + description: "Manual or automated testing approaches", |
| 142 | + example: "Example: Automated tests with Jest and Cypress.", |
| 143 | + howToGet: "Ask QA team or review test plans", |
| 144 | + }, |
| 145 | + ], |
| 146 | + }, |
| 147 | +]; |
| 148 | + |
| 149 | +export const CriteriaGrid = () => { |
| 150 | + return ( |
| 151 | + <section className="grid w-[1200px] mt-[150px] gap-8 md:grid-cols-2 "> |
| 152 | + {criteria.map((block, index) => ( |
| 153 | + <motion.div |
| 154 | + key={index} |
| 155 | + className="rounded-2xl shadow-lg flex flex-col items-center p-6 bg-white hover:shadow-xl transition-shadow" |
| 156 | + initial={{ opacity: 0, y: 30 }} |
| 157 | + whileInView={{ opacity: 1, y: 0 }} |
| 158 | + transition={{ duration: 0.5, delay: index * 0.1 }} |
| 159 | + viewport={{ once: true }} |
| 160 | + > |
| 161 | + <h3 className="text-xl font-semibold mb-4 text-indigo-600"> |
| 162 | + {block.category} |
| 163 | + </h3> |
| 164 | + <ul className="space-y-4"> |
| 165 | + {block.items.map((item, idx) => ( |
| 166 | + <li key={idx}> |
| 167 | + <div className="font-medium text-gray-700">{item.label}:</div> |
| 168 | + <div className="text-gray-600 mb-1">{item.description}</div> |
| 169 | + <div className="text-sm text-gray-500 italic"> |
| 170 | + {item.example} |
| 171 | + </div> |
| 172 | + {item.howToGet && ( |
| 173 | + <div className="text-xs text-gray-400 mt-1"> |
| 174 | + How to get: {item.howToGet} |
| 175 | + </div> |
| 176 | + )} |
| 177 | + </li> |
| 178 | + ))} |
| 179 | + </ul> |
| 180 | + </motion.div> |
| 181 | + ))} |
| 182 | + </section> |
| 183 | + ); |
| 184 | +}; |
0 commit comments