Interactive frameworks to help discover your purpose and calling
Sweet Spot Discovery
What You LOVE
What You're GOOD AT
What the World NEEDS
Your Sweet Spot
Your calling lives here!
What You Love
What You're Good At
What the World Needs
Your Sweet Spot Analysis
Calling Compass
YOU
DREAMS & PASSIONS
SKILLS & ABILITIES
PERSONALITY & TEMPERAMENT
VALUES & MEANING
Dreams & Passions (North)
Skills & Abilities (South)
Personality & Temperament (East)
Values & Meaning (West)
Your Calling Direction
Life Design Dashboard
Rate each area of your life from 0-100%
50%
Health
Physical, mental, emotional wellbeing
50%
Work
Career satisfaction, purpose, growth
50%
Play
Fun, recreation, creativity, hobbies
50%
Love
Relationships, family, community, spiritual
Your Life Analysis
Odyssey Plans
Design three different 5-year life scenarios
Plan A: Current Trajectory
Your current path if everything goes well
5/10
Plan B: Alternative Path
What you'd do if Plan A wasn't possible
5/10
Plan C: Wild Card
What you'd do if money and image didn't matter
5/10
Your Odyssey Analysis
// Tab functionality
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', () => {
// Remove active class from all tabs and sections
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.tool-section').forEach(s => s.classList.remove('active'));
// Add active class to clicked tab and corresponding section
tab.classList.add('active');
document.getElementById(tab.getAttribute('data-target')).classList.add('active');
});
});
// Sweet Spot functionality
function generateSweetSpot() {
const love = document.getElementById('love-input').value;
const good = document.getElementById('good-input').value;
const needs = document.getElementById('needs-input').value;
if (love && good && needs) {
const analysis = `Based on your responses, your sweet spot appears to be in helping others through your unique combination of passion, skills, and addressing world needs.
Your passion for ${love.split('.')[0].toLowerCase()} combined with your strength in ${good.split('.')[0].toLowerCase()} could address the world's need for ${needs.split('.')[0].toLowerCase()}.
Consider roles, projects, or causes that allow you to express these three elements simultaneously. This is where you'll find both fulfillment and impact.`;
document.getElementById('sweet-spot-text').textContent = analysis;
document.getElementById('sweet-spot-results').style.display = 'block';
} else {
alert('Please fill in all three sections before generating your sweet spot.');
}
}
function saveSweetSpot() {
const data = {
love: document.getElementById('love-input').value,
good: document.getElementById('good-input').value,
needs: document.getElementById('needs-input').value,
analysis: document.getElementById('sweet-spot-text').textContent
};
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'sweet-spot-analysis.json';
a.click();
URL.revokeObjectURL(url);
}
// Compass functionality
function showCompassDetail(direction) {
const details = {
north: "Dreams & Passions represent your deepest desires and what energizes you most.",
south: "Skills & Abilities are your natural talents and developed competencies.",
east: "Personality & Temperament reflect how you prefer to work and interact.",
west: "Values & Meaning define what matters most to you and your desired legacy."
};
alert(details[direction]);
}
function generateCompass() {
const dreams = document.getElementById('dreams-input').value;
const skills = document.getElementById('skills-input').value;
const personality = document.getElementById('personality-input').value;
const values = document.getElementById('values-input').value;
if (dreams && skills && personality && values) {
const analysis = `Your calling compass points toward a path that combines your dreams with your natural abilities while honoring your personality and values.
The intersection of your passion for ${dreams.split('.')[0].toLowerCase()}, your skills in ${skills.split('.')[0].toLowerCase()}, your ${personality.split('.')[0].toLowerCase()} nature, and your value of ${values.split('.')[0].toLowerCase()} suggests a calling in roles that allow you to express all these elements.
Look for opportunities that engage your dreams, utilize your skills, match your temperament, and align with your values.`;
document.getElementById('compass-text').textContent = analysis;
document.getElementById('compass-results').style.display = 'block';
} else {
alert('Please fill in all four compass directions before generating your analysis.');
}
}
function saveCompass() {
const data = {
dreams: document.getElementById('dreams-input').value,
skills: document.getElementById('skills-input').value,
personality: document.getElementById('personality-input').value,
values: document.getElementById('values-input').value,
analysis: document.getElementById('compass-text').textContent
};
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'calling-compass-analysis.json';
a.click();
URL.revokeObjectURL(url);
}
// Dashboard functionality
function updateGauge(category, value) {
const gauge = document.getElementById(category + '-gauge');
const valueSpan = document.getElementById(category + '-value');
valueSpan.textContent = value;
const percentage = (value / 100) * 360;
const color = getGaugeColor(value);
gauge.style.background = `conic-gradient(${color} 0deg, ${color} ${percentage}deg, #e2e8f0 ${percentage}deg, #e2e8f0 360deg)`;
}
function getGaugeColor(value) {
if (value < 30) return '#ff6b6b';
if (value < 70) return '#f39c12';
return '#38a169';
}
function analyzeDashboard() {
const health = document.getElementById('health-slider').value;
const work = document.getElementById('work-slider').value;
const play = document.getElementById('play-slider').value;
const love = document.getElementById('love-slider').value;
const values = [health, work, play, love];
const labels = ['Health', 'Work', 'Play', 'Love'];
const lowest = Math.min(...values);
const highest = Math.max(...values);
const lowestIndex = values.indexOf(lowest);