.progress { height: 16px; } .progress .bar { -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } .progress-primary .bar { background: var(--element-gradient); } .progress-info .bar { background: var(--element-gradient); } .progress-success .bar { background: var(--element-gradient); } .progress-warnng .bar { background: var(--element-gradient); } .progress { height: 16px; margin-bottom: 0px; border-radius: var(--element-radius); overflow: hidden; background-color: var(--layered-background); box-shadow: var(--input-shadow); } .progress-wrapper .percent-label { font-size:var(--font-size-s); } .progress-bar { float: left; width: 0; height: 100%; font-size: var(--base-font-size); color: var(--accent1-color); text-align: center; background-color: var(--accent1); -webkit-box-shadow: var(--min-shadow); box-shadow: var(--min-shadow); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background: var(--element-gradient); } .progress-striped .progress-bar-success { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: var(--blue); } .progress-striped .progress-bar-info { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: var(--yellow); } .progress-striped .progress-bar-warning { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: var(--red); } .progress-striped .progress-bar-danger { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progressWrapper { position:relative; height: 44px; } .progressWrapper .step { position: absolute; display: block; top: -10px; margin-left: -16px; } .progressWrapper .step .innerCircle { display:block; width: 30px; height: 30px; border: 5px solid var(--layered-background); border-radius: 20px; background: var(--solid-neutral); margin-top: 4px; } .progressWrapper .step .title { margin-left:calc(-50% + 36px); padding-top: 4px; display: inline-block; color:var(--primary-font-color); opacity:var(--opacity-disabled); font-size:var(--font-size-m); } .progressWrapper .step .title:hover { color:var(--primary-font-color) !important; } @-webkit-keyframes breathing { 0% { -webkit-transform: scale(0.9); transform: scale(0.9); } 25% { -webkit-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(1.2); transform: scale(1.2); } 75% { -webkit-transform: scale(1); transform: scale(1); } 100% { -webkit-transform: scale(0.9); transform: scale(0.9); } } @keyframes breathing { 0% { -webkit-transform: scale(0.9); -ms-transform: scale(0.9); transform: scale(0.9); } 25% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(1.2); -ms-transform: scale(1.2); transform: scale(1.2); } 75% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } 100% { -webkit-transform: scale(0.9); -ms-transform: scale(0.9); transform: scale(0.9); } } .progressWrapper .step.complete .innerCircle { background:var(--accent1); color:var(--accent1); } .progressWrapper .step.complete .title{ color:var(--accent1); opacity:1; } .progressWrapper .step.current .innerCircle { -webkit-animation: breathing 2s ease-out infinite normal; animation: breathing 2s ease-out infinite normal; background:var(--accent2); } .progressWrapper .step.current .title{ color:var(--accent1); font-weight:var(--font-weight-bold); opacity:1; } .progressWrapper .step .dropdown-menu { padding:10px; min-width:360px; } .progressWrapper .step .dropdown-menu li { display:block; clear:both; padding:0px 10px 4px 10px; border-color:var(--accent1); border:1px solid var(--accent1); border-radius:var(--box-radius); margin-bottom:4px; } .progressWrapper .step .dropdown-menu li label { color:var(--accent1); } .progressWrapper .step .dropdown-menu li.done { opacity:var(--opacity-muted); } .progressWrapper .step .dropdown-menu li:hover { background:var(--main-menu-link-hover-bg); } .progressWrapper .step .dropdown-menu li.done label{ text-decoration: line-through; color:var(--primary-font-color); } .progressWrapper .step .dropdown-menu li input { float:left; margin-right:4px; } .progressWrapper .step li.checklistDescription { padding:4px; font-style:italic; border:none; } .progressWrapper .step li .taskDescription { font-size: var(--font-size-s); } .full-width-loader { opacity: 0; position: fixed; z-index: var(--zlayer-7); top: 0px; left: 0px; height: 4px; width: 100%; background-color: transparent; overflow: hidden; } .full-width-loader .indeterminate { position: relative; width: 100%; background-color: transparent; height: 4px; } .full-width-loader .indeterminate::before { content: ''; position: absolute; height: 100%; background: var(--element-gradient); animation: indeterminate 1.5s infinite ease-in-out; width: 70%; left: -70%; box-shadow: var(--regular-shadow); } @keyframes indeterminate { 0% { left: -70%; } 100% { left: 100%; } } .full-width-loader.htmx-request { display: block; opacity: 1; } /* Singleton top-of-page HTMX progress bar (driven by leantime.htmxProgress in app.js). One fixed element for the whole app; position:fixed means it never affects layout. */ #lt-htmx-progress { position: fixed; top: 0; left: 0; right: 0; height: 3px; z-index: var(--zlayer-9, 9999); pointer-events: none; opacity: 0; transition: opacity 150ms ease; overflow: hidden; } #lt-htmx-progress.active { opacity: 1; } #lt-htmx-progress .bar { position: absolute; top: 0; bottom: 0; width: 40%; left: -40%; background: var(--element-gradient, var(--accent1, #006d9f)); animation: lt-htmx-progress-slide 1.1s infinite ease-in-out; } @keyframes lt-htmx-progress-slide { 0% { left: -40%; width: 40%; } 50% { left: 30%; width: 55%; } 100% { left: 100%; width: 40%; } } /* ---------------------------------------------- * Generated by Animista on 2025-3-4 12:23:18 * Licensed under FreeBSD License. * See http://animista.net/license for more info. * w: http://animista.net, t: @cssanimista * ---------------------------------------------- */ /** * ---------------------------------------- * animation color-change-2x * ---------------------------------------- */ @-webkit-keyframes color-change-2x { 0% { color: var(--accent1); } 50% { color: var(--accent2); } 100% { color: var(--accent1); } } @keyframes color-change-2x { 0% { color: var(--accent1); } 50% { color: var(--accent2); } 100% { color: var(--accent1); } } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } @keyframes circle-pulse { 0%{ transform: rotate(0deg); border-color: var(--accent1); } 100% { transform: rotate(360deg); border-color: var(--accent2); } } /* Animations */ @keyframes startPulse { 0% { transform: scale(1); } 50% { transform: scale(0.95); } 75% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes rippleOut { 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; } 100% { transform: translate(-50%, -50%) scale(1.5); opacity: 0; } } @keyframes glowIn { 0% { opacity: 0; } 100% { opacity: 1; } } /* Animations */ @keyframes completePulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } @keyframes glowPulse { 0% { transform: translate(-50%, -50%) scale(0.8); opacity: 0.8; } 50% { opacity: 0.6; } 100% { transform: translate(-50%, -50%) scale(2.5); opacity: 0; } } @keyframes fadeInCheck { 0% { opacity: 0; transform: scale(0.8); } 100% { opacity: 1; transform: scale(1); } } @keyframes circleAppear { 0% { transform: translate(-50%, -50%) scale(0); opacity: 0; } 100% { transform: translate(-50%, -50%) scale(1); opacity: 1; } } /* Particle animations - each one goes in a different direction */ @keyframes particleAnimation1 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(-30px, -30px); opacity: 0; } } @keyframes particleAnimation2 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(30px, -30px); opacity: 0; } } @keyframes particleAnimation3 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(40px, 0); opacity: 0; } } @keyframes particleAnimation4 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(30px, 30px); opacity: 0; } } @keyframes particleAnimation5 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(-30px, 30px); opacity: 0; } } @keyframes particleAnimation6 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(-40px, 0); opacity: 0; } } @keyframes particleAnimation7 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(-20px, -40px); opacity: 0; } } @keyframes particleAnimation8 { 0% { transform: translate(0, 0); opacity: 1; } 100% { transform: translate(20px, 40px); opacity: 0; } } .pulse { -webkit-animation: pulse 1s infinite linear both; animation: pulse 1s infinite linear both; } .color-change-2x { -webkit-animation: color-change-2x 1s infinite linear both; animation: color-change-2x 1s infinite linear both; } .pulse-click.starting { animation: startPulse 0.5s cubic-bezier(0.22, 0.61, 0.36, 1); } .pulse-click.starting::before { content: ''; position: absolute; top: 50%; left: 50%; width: 100%; height: 100%; background-color: rgba(82, 113, 255, 0.3); border-radius: 50%; transform: translate(-50%, -50%) scale(0); animation: rippleOut 0.5s ease-out; } .pulse-click.starting::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 20px; box-shadow: inset 0 0 10px rgba(255, 255, 255, 0.5); opacity: 0; animation: glowIn 0.4s ease-out forwards; } .circle-pulse { -webkit-animation: circle-pulse 1s infinite linear both; animation: circle-pulse 1s infinite linear both; } .timerContainer.stopped { animation: pulse 0.4s ease-out; } .timerContainer .stopped::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; background-image: radial-gradient(circle, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0.0) 70%); border-radius: 50%; opacity: 0; animation: burst 0.8s ease-out forwards; } /* Stopped state with celebrations */ .timerContainer .stopped { animation: completePulse 0.4s ease-out; } /* Glow effect behind the button */ .timerContainer .stopped::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; background: radial-gradient(circle, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0.0) 70%); border-radius: 50%; z-index: -1; opacity: 0; animation: glowPulse 0.8s ease-out forwards; } /* Checkmark that appears */ .timerContainer .stopped::after { content: '✓'; color: white; font-size: var(--font-size-xxl); position: absolute; z-index: var(--zlayer-2); opacity: 0; animation: fadeInCheck 0.3s 0.2s ease-out forwards; } /* Success circle that appears */ .timerContainer .success-circle { position: absolute; display:none; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0); width: 40px; height: 40px; border-color: var(--grey); border-width: 1px; border-style: solid; border-radius: 50%; z-index: var(--zlayer-1); opacity: 0; } .timerContainer .stopped .success-circle { display:block; animation: circleAppear 0.3s 0.1s ease-out forwards; } /* Container for all the particles */ .particles-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; } /* Individual particles with different colors */ .particle { position: absolute; top: 50%; left: 50%; width: 8px; height: 8px; border-radius: 50%; opacity: 0; } .timerContainer .stopped .particle-1 { background-color: var(--accent1); animation: particleAnimation1 0.8s ease-out; } .timerContainer .stopped .particle-2 { background-color: var(--accent2); animation: particleAnimation2 0.8s ease-out; } .timerContainer .stopped .particle-3 { background-color: var(--accent4); animation: particleAnimation3 0.8s ease-out; } .timerContainer .stopped .particle-4 { background-color: var(--accent1); animation: particleAnimation4 0.8s ease-out; } .timerContainer .stopped .particle-5 { background-color: var(--accent2); animation: particleAnimation5 0.8s ease-out; } .timerContainer .stopped .particle-6 { background-color: var(--accent4); animation: particleAnimation6 0.8s ease-out; } .timerContainer .stopped .particle-7 { background-color: var(--accent1); animation: particleAnimation7 0.8s ease-out; } .timerContainer .stopped .particle-8 { background-color: var(--accent2); animation: particleAnimation8 0.8s ease-out; } @keyframes rotate { from { transform: rotate(0); } to { transform: rotate(360deg); } }