body {
font-family: 'Inter', sans-serif;
background: linear-gradient(135deg, #f4f1eb 0%, #ede7dd 100%);
margin: 0;
padding: 40px 20px;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.progress-container {
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
padding: 30px;
border-radius: 20px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
max-width: 400px;
width: 100%;
}
.progress-header {
text-align: center;
margin-bottom: 25px;
}
.progress-title {
color: #8b6f4d;
font-size: 18px;
font-weight: 600;
margin-bottom: 5px;
}
.progress-subtitle {
color: #a68b6b;
font-size: 14px;
font-weight: 400;
}
.progress-bar-container {
position: relative;
background: #e8ddd1;
height: 12px;
border-radius: 20px;
overflow: hidden;
margin: 20px 0;
box-shadow: inset 0 2px 4px rgba(139, 111, 77, 0.1);
}
.progress-bar {
height: 100%;
background: linear-gradient(90deg, #d4a574 0%, #c19660 50%, #b8875a 100%);
border-radius: 20px;
transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
box-shadow: 0 2px 8px rgba(180, 135, 90, 0.3);
}
.progress-bar::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 50%;
background: linear-gradient(90deg, rgba(255, 255, 255, 0.3) 0%, rgba(255, 255, 255, 0.1) 100%);
border-radius: 20px;
}
.progress-percentage {
text-align: center;
margin-top: 15px;
font-size: 24px;
font-weight: 600;
color: #8b6f4d;
}
.controls {
display: flex;
gap: 12px;
margin-top: 25px;
justify-content: center;
}
.control-btn {
background: linear-gradient(135deg, #d4a574 0%, #c19660 100%);
border: none;
color: white;
padding: 10px 20px;
border-radius: 12px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(180, 135, 90, 0.3);
}
.control-btn:hover {
background: linear-gradient(135deg, #c19660 0%, #b8875a 100%);
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(180, 135, 90, 0.4);
}
.control-btn:active {
transform: translateY(0);
}
.milestone-dots {
display: flex;
justify-content: space-between;
margin: 15px 0 -5px 0;
position: relative;
}
.milestone {
width: 8px;
height: 8px;
border-radius: 50%;
background: #e8ddd1;
transition: all 0.3s ease;
position: relative;
}
.milestone.active {
background: #d4a574;
box-shadow: 0 0 0 3px rgba(212, 165, 116, 0.3);
}
.milestone-label {
position: absolute;
top: 12px;
left: 50%;
transform: translateX(-50%);
font-size: 10px;
color: #a68b6b;
white-space: nowrap;
}
.celebration {
position: absolute;
top: -10px;
left: 50%;
transform: translateX(-50%);
font-size: 20px;
opacity: 0;
transition: all 0.5s ease;
pointer-events: none;
}
.celebration.show {
opacity: 1;
transform: translateX(-50%) translateY(-20px);
}
@keyframes shimmer {
0% { background-position: -200% 0; }
100% { background-position: 200% 0; }
}
.progress-bar.shimmer {
background: linear-gradient(90deg, #d4a574 25%, #f2e6d3 50%, #d4a574 75%);
background-size: 200% 100%;
animation: shimmer 2s infinite;
}
</style>
Hobby Progress
Your cozy journey continues
<div class="milestone-dots">
<div class="milestone" data-value="0">
<div class="milestone-label">Start</div>
</div>
<div class="milestone" data-value="25">
<div class="milestone-label">Quarter</div>
</div>
<div class="milestone" data-value="50">
<div class="milestone-label">Halfway</div>
</div>
<div class="milestone" data-value="75">
<div class="milestone-label">Almost</div>
</div>
<div class="milestone" data-value="100">
<div class="milestone-label">Complete</div>
</div>
</div>
<div class="progress-bar-container">
<div class="progress-bar" id="progressBar"></div>
<div class="celebration" id="celebration">🎉</div>
</div>
<div class="progress-percentage" id="progressText">0%</div>
<div class="controls">
<button class="control-btn" onclick="decreaseProgress()">- 10%</button>
<button class="control-btn" onclick="increaseProgress()">+ 10%</button>
<button class="control-btn" onclick="resetProgress()">Reset</button>
<button class="control-btn" onclick="completeProgress()">Complete</button>
</div>
</div>
<script>
let currentProgress = 0;
const progressBar = document.getElementById('progressBar');
const progressText = document.getElementById('progressText');
const celebration = document.getElementById('celebration');
const milestones = document.querySelectorAll('.milestone');
function updateProgress(newProgress) {
currentProgress = Math.max(0, Math.min(100, newProgress));
progressBar.style.width = currentProgress + '%';
progressText.textContent = currentProgress + '%';
// Update milestones
milestones.forEach(milestone => {
const value = parseInt(milestone.dataset.value);
if (currentProgress >= value) {
milestone.classList.add('active');
} else {
milestone.classList.remove('active');
}
});
// Show celebration at 100%
if (currentProgress === 100) {
progressBar.classList.add('shimmer');
celebration.classList.add('show');
setTimeout(() => {
celebration.classList.remove('show');
progressBar.classList.remove('shimmer');
}, 2000);
}
}
function increaseProgress() {
updateProgress(currentProgress + 10);
}
function decreaseProgress() {
updateProgress(currentProgress - 10);
}
function resetProgress() {
updateProgress(0);
}
function completeProgress() {
updateProgress(100);
}
// Initialize
updateProgress(35); // Start with some progress to show the design
</script>