/* V29 — purposeful movement, comfortable space, quiet surfaces. */
:root{--ease-out:cubic-bezier(.16,1,.3,1);--ease-spring:cubic-bezier(.2,.85,.3,1.12);--motion-fast:180ms;--motion-mid:420ms}
body{position:relative;isolation:isolate;overflow-x:hidden;background:radial-gradient(ellipse at 0 0,#fff2dc70,transparent 43%),radial-gradient(ellipse at 100% 30%,#f1e8ff7a,transparent 40%),#fffbfc}
.shell{animation:none!important}.brand .logo,.miniLabel,.cardKicker,.eyebrow,.featureChips span,.mascotHello,.resultMascot{animation:none}
.brand{padding-bottom:2px}.byGrowsia{box-shadow:none;background:#fff8fb}
.hero h1{letter-spacing:-.055em}.hero p{max-width:40ch}.hero h1 span:after{height:7px;bottom:2px;background:#fbd7e3}
.authHero:after,.homeHero:after,.authCard:before,.setupCard:after,.welcomeMini:before{display:none}
.card{border-color:#efdee5;background:#fff;box-shadow:0 5px 18px #77244805,0 20px 65px #6a294605;transition:border-color 220ms ease,box-shadow 280ms ease}
.card:hover,.welcomeMini:hover,.setupCard:hover{transform:none}
.card:focus-within{border-color:#e5b1c6;box-shadow:0 8px 28px #90254609}
.miniLabel,.cardKicker{font-weight:800;box-shadow:none;letter-spacing:.08em}.miniLabel:before,.cardKicker:before{box-shadow:none;width:6px;height:6px}
.welcomeMini{background:linear-gradient(110deg,#fff6e8,#fff5f9 64%,#f7f0ff);border:1px solid #f0dfe5;box-shadow:none}
.welcomeMini .eyebrow{font-size:9px;letter-spacing:.1em}.welcomeMini p{margin-top:6px}.featureChips span{box-shadow:none;transition:background 180ms ease,border-color 180ms ease}
.featureChips span:hover,.featureChips span:nth-child(2):hover{transform:none}
.tabs{position:relative;isolation:isolate;background:#f7edf1;padding:5px;gap:0;border:1px solid #f1dfe7;box-shadow:inset 0 1px 2px #8c304108}
.tabs.motionTabs:before{content:"";position:absolute;z-index:-1;left:0;top:5px;bottom:5px;width:var(--tab-width,0);transform:translateX(var(--tab-left,0));border-radius:14px;background:#fff;box-shadow:0 2px 7px #7f25420c;transition:transform 320ms var(--ease-out),width 320ms var(--ease-out)}
.tabs.motionTabs .tab,.tabs.motionTabs .tab.active{background:transparent;box-shadow:none;border:0}.tabs .tab{font-size:14px;font-weight:700}
button,.btn,.tab,summary{position:relative;touch-action:manipulation}.btn,.tab,.checkoutPlan,.simulatePayment{overflow:hidden;isolation:isolate}
.btn,.tab,.checkoutPlan,.miniButton,.quietFinish,.checkoutClose,.conversationClose{transition:transform 190ms var(--ease-spring),box-shadow 220ms ease,background-color 200ms ease,border-color 200ms ease,color 200ms ease}
.btn{background:linear-gradient(115deg,#ed3c75,#d71659);box-shadow:0 5px 0 #b6154820,0 8px 18px #d61f5b18;font-weight:780;letter-spacing:-.01em}
.btn:not(.secondary):not(.ghost):before{display:none}.btn.secondary,.btn.ghost{background:#fff;box-shadow:none}
.btn:active:not(:disabled),.tab:active:not(:disabled),.checkoutPlan:active:not(:disabled),.quietFinish:active:not(:disabled){transform:translateY(1px) scale(.98);box-shadow:none}
.motion-ripple{position:absolute;z-index:-1;border-radius:50%;pointer-events:none;background:currentColor;opacity:.1;transform:translate(-50%,-50%) scale(0);animation:luwiTouch 580ms ease-out forwards}
.btn .motion-ripple{background:#fff}.btn.secondary .motion-ripple,.tab .motion-ripple,.checkoutPlan .motion-ripple{background:#d61f5b}
.btn.motion-busy,.tab.motion-busy{padding-right:44px}.motion-busy:after{content:"";position:absolute;right:17px;top:calc(50% - 7px);width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:luwiSpin .85s linear infinite}
.checkoutPlan.motion-busy:after{width:12px;height:12px;border-radius:50%;box-shadow:none;background:none}
input,select,textarea{background:#fffcfd;border-color:#eedde5;transition:border-color 160ms ease,box-shadow 200ms ease,background 160ms ease;scroll-margin:20px}
input:focus,select:focus,textarea:focus{transform:none;border-color:#e46c98;box-shadow:0 0 0 3px #ed428011;background:#fff}
label:has(+input:focus),label:has(+select:focus){color:#af2455}.motion-picked{animation:luwiPicked 600ms ease-out}
input[type=file]{padding:14px;border:1px dashed #d9b8c7;background:#fff9fc;border-radius:18px;transition:background .2s,border-color .2s}
input[type=file]::file-selector-button{background:#f9e8ef;font-weight:650;border-radius:11px;padding:10px 12px}
input.documentPicked{border-style:solid;border-color:#d390ab;background:#fff3f8}
.sectionHeading>span{transition:transform 320ms var(--ease-spring),background-color 220ms ease}
.setupCard:focus-within .sectionHeading>span{animation:none;transform:rotate(-5deg) scale(1.04)}.setupCard:has(#document:focus) .sectionHeading.second>span{transform:rotate(5deg) scale(1.04)}
.checkoutBackdrop{animation:luwiBackdropIn 220ms ease-out both;backdrop-filter:blur(7px)}
.checkoutSheet{animation:luwiSheetIn 440ms var(--ease-out) both;transform-origin:center;box-shadow:0 12px 40px #51182a18,0 32px 95px #51182a24}
.checkoutPlan{transition:background 180ms ease,border-color 180ms ease,box-shadow 180ms ease,transform 240ms var(--ease-spring)}
.checkoutPlan.selected{border:1px solid #db3770;box-shadow:0 0 0 3px #ef599718;background:#fff4f9;animation:luwiSelection 400ms var(--ease-spring)}
.checkoutPlan.favorite em{animation:none;background:#fff0bd}.checkoutPlan.favorite:after{display:none}
.checkoutMascot{background:#fff;box-shadow:none}.qrisFrame{animation:luwiQRIn 420ms var(--ease-out) both;box-shadow:0 10px 25px #73214609}
/* QR itself is still and unobstructed for reliable scanning. */
.qrisFrame img{animation:none!important;transform:none!important}.paymentWaiting>i{position:relative;animation:none;box-shadow:none;background:#e8aa3e}
.paymentWaiting>i:after{content:"";position:absolute;inset:-5px;border:1px solid #e8aa3e;border-radius:50%;animation:luwiWaiting 2s ease-out infinite}
.conversationBackdrop.isOpen{animation:luwiBackdropIn 200ms ease-out both}.conversationPanel.isOpen{animation:luwiPanelIn 380ms var(--ease-out) both}
.bubble{animation:luwiMessageIn 280ms var(--ease-out) both}.bubble.user{animation-name:luwiUserMessageIn}
.conversationClose:hover,.checkoutClose:hover{background:#fff1f6}.conversationClose:active,.checkoutClose:active{transform:scale(.92)}
.conversationToggle.hasNew{animation:none}.conversationToggle.hasNew .chatCount{animation:luwiCountPop 400ms var(--ease-out)}
.sessionClock{animation:luwiClockIn 540ms var(--ease-out) both;border-color:#efd9e3;box-shadow:0 6px 20px #90254b08}
.sessionClock:before{background:#ffcc66}.sessionClock .timer{font-variant-numeric:tabular-nums}
.timeTrack i{transition:width .85s linear}.voiceStatus .statusTitle,.voiceStatus .statusSub{font-variant-numeric:tabular-nums}
.sessionShell .voiceStatus{transition:background-color 280ms ease,border-color 280ms ease;min-height:58px}
.statusDot{animation:none;box-shadow:none}.statusDot.listening:after,.statusDot.speaking:after{content:"";position:absolute;inset:-5px;border:1px solid currentColor;border-radius:50%;opacity:.4;animation:luwiWaiting 2.6s ease-out infinite}
.statusDot{position:relative;color:#c34475}.statusDot.listening{color:#2aaf7d}.statusDot.thinking{animation:luwiThinkingDot 1.4s ease-in-out infinite}
.sessionShell[data-orb-phase=thinking] .voiceStatus{background:#fffaf0;border-color:#f0dfbf}
.sessionShell[data-orb-phase=speaking] .voiceStatus{background:#fff3f8;border-color:#f0cbda}
.sessionShell[data-orb-phase=listening] .voiceStatus{background:#fff;border-color:#e7d7e0}
.sessionShell[data-user-speaking=true] .voiceStatus{transform:none;border-color:#c783a3}
.disciplineNotice:not(.hidden){animation:luwiMessageIn 240ms ease-out both}
.overallScore strong{display:inline-block;animation:luwiScoreIn 650ms var(--ease-out) both;font-variant-numeric:tabular-nums}
.scoreMetric i{transform-origin:left;animation:none}.scoreNarrative:after{display:none}.scoreBand{letter-spacing:-.02em}
.resultColumns>section,.scoreNarrative,.standardAssessment,.historyItem{transition:border-color 200ms ease,box-shadow 220ms ease,background 200ms ease}
.historyItem:hover{transform:none}.historyItem summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:12px}
.historyItem summary::-webkit-details-marker{display:none}.historyItem summary:after{content:"";width:7px;height:7px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg);margin-right:5px;transition:transform 220ms var(--ease-out)}
.historyItem details[open] summary:after{transform:rotate(225deg)}.historyItem:has(details[open]){border-color:#dab7c8;background:#fff}
.masterTabs .tab.active{background:#fceaf2;border-color:#dc94b3}.masterTable tbody tr{transition:background-color 160ms ease}.masterSummary>div{transition:border-color 180ms ease,box-shadow 180ms ease}
.policyBrand{display:inline-flex;align-items:center;gap:8px;font-size:24px;font-weight:850;text-decoration:none;color:#291b22!important;letter-spacing:-.04em}.policyBrand .logo{width:38px;height:38px}.policyBrand span:last-child{margin-left:5px;padding:5px 9px;border:1px solid #f0dce5;border-radius:99px;color:#b72458;font-size:11px;letter-spacing:0;font-weight:650}
.policyPage form{border:1px solid #efdde5;border-radius:22px;background:#fff;padding:22px}.policyPage .check input{flex:none}.policyPage .check span{min-width:0}.policyPage header{padding-bottom:22px;border-bottom:1px solid #efdee5}.policyPage p,.policyPage li{font-size:15px;line-height:1.8}.policyPage h1{letter-spacing:-.045em}.policyPage h2{letter-spacing:-.025em}.policyPage .logo{filter:none}
.policyPage a,.legalLinks a{border-radius:4px;text-decoration-color:#deb2c4;text-underline-offset:4px;transition:color 160ms,text-decoration-color 160ms}
.policyPage a:hover,.legalLinks a:hover{color:#cf1e5a;text-decoration-color:currentColor}
@media(hover:hover) and (pointer:fine){.btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 6px 0 #b615481a,0 12px 24px #d61f5b20}.btn.secondary:hover,.btn.ghost:hover{background:#fff5f9;box-shadow:0 4px 14px #b02f5608}.tab:hover:not(:disabled){background:#fff4f8}.tabs.motionTabs .tab:hover{background:transparent}.checkoutPlan:hover:not(:disabled){transform:translateY(-2px);border-color:#db9db7;box-shadow:0 6px 18px #8e294610}.masterTable tbody tr:hover{background:#fff5f9}.masterSummary>div:hover{border-color:#e0b2c5;box-shadow:0 8px 20px #8e294608}.historyItem:hover{border-color:#e4bdce}}
@keyframes luwiTouch{to{transform:translate(-50%,-50%) scale(1);opacity:0}}
@keyframes luwiSpin{to{transform:rotate(360deg)}}
@keyframes luwiPicked{0%{box-shadow:0 0 0 0 #e33b7930}40%{box-shadow:0 0 0 4px #e33b7920}100%{box-shadow:0 0 0 0 #e33b7900}}
@keyframes luwiBackdropIn{from{opacity:0}to{opacity:1}}
@keyframes luwiSheetIn{from{opacity:0;transform:translateY(16px) scale(.975)}to{opacity:1;transform:none}}
@keyframes luwiPanelIn{from{opacity:.35;transform:translateY(20px)}to{opacity:1;transform:none}}
@keyframes luwiSelection{40%{transform:scale(1.015)}to{transform:none}}
@keyframes luwiQRIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes luwiWaiting{0%{transform:scale(.75);opacity:.55}90%,100%{transform:scale(1.6);opacity:0}}
@keyframes luwiThinkingDot{50%{opacity:.45;transform:scale(.86)}}
@keyframes luwiMessageIn{from{opacity:.2;transform:translateY(7px)}to{opacity:1;transform:none}}
@keyframes luwiUserMessageIn{from{opacity:.2;transform:translateY(7px) translateX(3px)}to{opacity:1;transform:none}}
@keyframes luwiClockIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
@keyframes luwiScoreIn{from{opacity:0;transform:translateY(8px) scale(.92)}to{opacity:1;transform:none}}
@media(max-width:520px){.card{box-shadow:0 8px 25px #6a294604}.hero h1{font-size:34px}.checkoutSheet{animation-duration:360ms}.brand{font-size:24px}.featureChips{gap:6px}.featureChips span{padding:8px 10px}.authHero+.mascotStage{margin:0}}
@media(max-width:359px){.hero h1{font-size:30px}.featureChips span{font-size:10px;padding:7px 8px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}.motion-ripple{display:none}}
.appBackground *,.appBackground *:before,.appBackground *:after{animation-play-state:paused!important}
