1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[55859],{2360:()=>{},15969:(e,r,n)=>{"use strict";n.d(r,{Screenshots:()=>c});var t=n(95155),s=n(12115),i=n(78531),o=n(77549),l=n(94242),a=n.n(l);let d=[{src:"/screenshots/workspace-resources.webp",alt:"Workspace dashboard with 84 resources, 6 outputs, runs activity, and resource inventory list",caption:"1 \xb7 Workspace overview: resources, outputs, runs activity, and history at a glance"},{src:"/screenshots/iam-access-policy.webp",alt:"IAM access policy permissions showing Workspace Operator role with runs, state, variables, and workspaces access",caption:"2 \xb7 Fine-grained RBAC: scope permissions to accounts, environments, or workspaces"},{src:"/screenshots/terragrunt.webp",alt:"Terragrunt run in Scalr showing plan output with resource changes and variable warnings",caption:"3 \xb7 Native Terragrunt support: full plan visibility with resource changes and diagnostics"},{src:"/screenshots/opa.webp",alt:"Scalr run with OPA policy checks showing soft-fail, passed, and advisory results",caption:"4 \xb7 Open Policy Agent: soft-fail, hard-fail, and advisory policy checks on every run"},{src:"/screenshots/gitops-0.webp",alt:"GitHub PR checks tab with Scalr plan-only report and execution log",caption:"5 \xb7 GitOps: plan-only reports with full execution logs on every PR"},{src:"/screenshots/gitops-1.webp",alt:"Scalr PR comment with plan summary, slash commands, and AI assistant triggers",caption:"6 \xb7 PR comments with /scalr plan, /scalr apply, and AI-powered explanations"}],c=e=>{let{...r}=e,[n,l]=(0,s.useState)(0),c=(0,s.useRef)(null),h=e=>{e>=0&&e<d.length&&l(e)};return(0,t.jsxs)(i.VP,{horizontal:"center",gap:"l",fillWidth:!0,...r,children:[(0,t.jsx)(i.n1,{x:50,y:0,radius:65,children:(0,t.jsx)(i.N1,{})}),(0,t.jsx)(i.VS,{position:"absolute",top:"0",left:"0","data-solid":"color",mask:{cursor:!0,radius:100},gradient:{display:!0,opacity:100,tilt:0,height:100,width:120,x:0,y:0,colorStart:"brand-solid-strong",colorEnd:"static-transparent"}}),(0,t.jsx)(i.DZ,{as:"h2",variant:"display-strong-s",align:"center",children:"See it in action"}),(0,t.jsx)(i.EY,{variant:"body-default-xl",align:"center",onBackground:"neutral-medium",wrap:"balance",children:"A familiar workflow, with RBAC, policy checks, and PR reports built in"}),(0,t.jsxs)(i.VP,{fillWidth:!0,maxWidth:"m",paddingX:"l",gap:"8",children:[(0,t.jsx)(o.N,{children:(0,t.jsxs)("div",{className:a().sliderViewport,onTouchStart:e=>{c.current=e.touches[0].clientX},onTouchEnd:e=>{if(null===c.current)return;let r=c.current-e.changedTouches[0].clientX;Math.abs(r)>50&&(r>0&&n<d.length-1?h(n+1):r<0&&n>0&&h(n-1)),c.current=null},children:[(0,t.jsx)("div",{className:a().sliderTrack,style:{transform:"translateX(-".concat(100*n,"%)")},children:d.map(e=>(0,t.jsx)("div",{className:a().sliderSlide,children:(0,t.jsx)(i.$U,{src:e.src,alt:e.alt,fillWidth:!0,aspectRatio:"16/10",sizes:"(max-width: 768px) 100vw, 768px",style:{objectPosition:"top left"}})},e.src))}),(0,t.jsxs)("div",{className:a().controls,children:[(0,t.jsx)("button",{className:a().controlButton,onClick:()=>h(n-1),disabled:0===n,"aria-label":"Previous screenshot",children:"â¹"}),(0,t.jsx)("button",{className:a().controlButton,onClick:()=>h(n+1),disabled:n===d.length-1,"aria-label":"Next screenshot",children:"âº"})]})]})}),(0,t.jsx)(i.fI,{as:"figcaption",fillWidth:!0,textVariant:"label-default-s",onBackground:"neutral-weak",paddingY:"12",paddingX:"24",horizontal:"center",align:"center",children:d[n].caption}),(0,t.jsx)("div",{className:a().indicators,children:d.map((e,r)=>(0,t.jsx)("button",{className:a().indicator,onClick:()=>h(r),"aria-label":"Go to screenshot ".concat(r+1),children:(0,t.jsx)("span",{className:"".concat(a().indicatorBar," ").concat(r===n?a().active:a().inactive)})},e.src))})]})]})}},48982:(e,r,n)=>{"use strict";n.d(r,{default:()=>v});var t=n(95155),s=n(30308),i=n(26497),o=n(32164),l=n(12115),a=n(78531);let d={left:"rgba(0, 0, 0, 0.7)",right:"rgba(0, 25, 203, 0.7)"},c=e=>{let{leftContent:r,rightContent:n,aspectRatio:s="16/9",objectPosition:i,leftLabel:o,rightLabel:c,...h}=e,m=(0,l.useRef)(null),b=(0,l.useRef)(null),v=(0,l.useRef)(null),u=(0,l.useRef)(null),p=(0,l.useRef)(null),P=(0,l.useRef)(!1),x=(0,l.useRef)(50),f=(0,l.useCallback)(e=>{b.current&&(b.current.style.clipPath="inset(0 ".concat(100-e,"% 0 0)")),v.current&&(v.current.style.clipPath="inset(0 0 0 ".concat(e,"%)")),u.current&&(u.current.style.left="".concat(e,"%")),p.current&&(p.current.style.left="".concat(e,"%"))},[]),g=(0,l.useCallback)(e=>{if(!P.current||!m.current)return;let r=m.current.getBoundingClientRect(),n=Math.max(0,Math.min(100,(e-r.left)/r.width*100));x.current=n,f(n)},[f]);(0,l.useEffect)(()=>{f(x.current)},[f]);let y=(0,l.useCallback)(()=>{P.current=!0;let e=e=>g(e.clientX),r=e=>g(e.touches[0].clientX),n=()=>{P.current=!1,document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n),document.removeEventListener("touchmove",r,{capture:!1}),document.removeEventListener("touchend",n)};document.addEventListener("mousemove",e),document.addEventListener("mouseup",n),document.addEventListener("touchmove",r,{passive:!0}),document.addEventListener("touchend",n)},[g]),w=(e,r,n,o)=>
1(0,t.jsxs)("div",{ref:r,style:{position:"absolute",inset:0,willChange:"clip-path"},children:["string"==typeof e.src?(0,t.jsx)(a.$U,{src:e.src,alt:e.alt||"",fill:!0,aspectRatio:s,position:"absolute",style:i?{objectPosition:i}:void 0}):(0,t.jsx)(a.so,{fill:!0,position:"absolute",children:e.src}),o&&(0,t.jsx)("div",{style:(e=>({position:"absolute",bottom:12,..."left"===e?{left:12}:{right:12},zIndex:3,padding:"8px 18px",borderRadius:"var(--radius-s, 6px)",background:d[e],backdropFilter:"blur(8px)",WebkitBackdropFilter:"blur(8px)",color:"#fff",fontSize:15,fontWeight:600,letterSpacing:"0.02em",lineHeight:1,pointerEvents:"none",whiteSpace:"nowrap",border:"1px solid rgba(255, 255, 255, 0.15)"}))(n),children:o})]});return(0,t.jsxs)(a.so,{ref:m,aspectRatio:s,fillWidth:!0,style:{touchAction:"none",position:"relative"},...h,children:[w(r,b,"left",o),w(n,v,"right",c),(0,t.jsx)(a.so,{ref:u,position:"absolute",horizontal:"center",width:3,top:"0",bottom:"0",style:{cursor:"col-resize",transform:"translateX(-50%)"},onMouseDown:y,onTouchStart:y,children:(0,t.jsx)(a.so,{width:"1",fillHeight:!0,background:"neutral-strong",zIndex:2})}),(0,t.jsx)(a.so,{ref:p,radius:"l",fitHeight:!0,style:{position:"absolute",top:"50%",transform:"translate(-50%, -50%)",cursor:"col-resize",zIndex:2,pointerEvents:"auto",background:"#2563eb",borderRadius:"var(--radius-l)"},children:(0,t.jsx)(a.K0,{icon:"chevronsLeftRight",variant:"secondary",style:{color:"#ffffff"},onMouseDown:y,onTouchStart:y})})]})};var h=n(77549),m=n(21105);n(2360);let b=e=>{let{src:r,cols:s=100,rows:i=35,autoPlay:o=!0,loop:a=!0,speed:d=1,theme:c="monokai",fit:h="width",idleTimeLimit:m=2,preload:b=!0,poster:v="npt:0:01",terminalFontFamily:u="'JetBrains Mono', 'Fira Code', 'SF Mono', 'Menlo', monospace",terminalFontSize:p="13px",className:P}=e,x=(0,l.useRef)(null),f=(0,l.useRef)(null);return(0,l.useEffect)(()=>{if(!x.current)return;let e=!1;return Promise.all([n.e(60625),n.e(20458)]).then(n.bind(n,20458)).then(n=>{!e&&x.current&&(f.current=n.create(r,x.current,{cols:s,rows:i,autoPlay:o,loop:a,speed:d,theme:c,fit:h,idleTimeLimit:m,preload:b,poster:v,terminalFontFamily:u,terminalFontSize:p}))}),()=>{e=!0,f.current&&(f.current.dispose(),f.current=null)}},[r,s,i,o,a,d,c,h,m,b,v,u,p]),(0,t.jsx)("div",{ref:x,className:P})},v=()=>{let[e,r]=(0,l.useState)(0),n=(0,l.useRef)(0),s=e>n.current?1:-1,d=(0,t.jsxs)(a.VP,{fillWidth:!0,horizontal:"center",gap:"8",paddingBottom:"16",children:[(0,t.jsx)(a.DZ,{as:"h2",variant:"display-strong-m",align:"center",children:"Migration is simple"}),(0,t.jsx)(a.EY,{variant:"body-default-m",onBackground:"neutral-medium",align:"center",style:{maxWidth:560},children:"Scalr clones your workspaces, state, and variables from Terraform Cloud automatically. Add your secrets, run a plan, and you're live."})]});return(0,t.jsxs)(a.VP,{fillWidth:!0,maxWidth:"l",horizontal:"center",paddingX:"xl",children:[(0,t.jsxs)(a.VP,{fillWidth:!0,horizontal:"center",gap:"24",s:{hide:!0},children:[d,(0,t.jsx)(m.Tabs,{items:u.map(e=>({title:e.title,icon:(0,t.jsx)(e.Icon,{})})),selected:e,onSelect:t=>{n.current=e,r(t)},layoutId:"tabs-features-underline"}),(0,t.jsx)(i.N,{mode:"wait",custom:s,children:u.map((r,n)=>e===n?(0,t.jsx)(o.P.div,{custom:s,initial:"enter",animate:"center",exit:"exit",variants:{enter:e=>({opacity:0,x:60*e}),center:{opacity:1,x:0},exit:e=>({opacity:0,x:-60*e})},transition:{duration:.25,ease:"easeInOut"},style:{width:"100%"},children:(0,t.jsx)(r.Feature,{})},n):void 0)})]}),(0,t.jsxs)(a.VP,{fillWidth:!0,gap:"24",hide:!0,s:{hide:!1},children:[d,u.map((e,r)=>(0,t.jsxs)(a.fI,{fillWidth:!0,gap:"16",vertical:"center",padding:"16",style:{borderBottom:"1px solid var(--neutral-alpha-weak)"},children:[(0,t.jsx)(a.so,{horizontal:"center",vertical:"center",padding:"12",radius:"m",style:{fontSize:"1.5rem",color:"var(--brand-on-background-weak)",background:"var(--brand-alpha-weak)",flexShrink:0},children:(0,t.jsx)(e.Icon,{})}),(0,t.jsxs)(a.VP,{gap:"4",children:[(0,t.jsx)(a.EY,{variant:"label-default-s",onBackground:"neutral-strong",children:e.title}
1),(0,t.jsx)(a.EY,{variant:"body-default-s",onBackground:"neutral-medium",children:e.description})]})]},r))]})]})},u=[{title:"One command clones your setup",Icon:s.fmZ,Feature:()=>(0,t.jsx)(a.VP,{fillWidth:!0,paddingY:"32",paddingX:"32",horizontal:"center",style:{maxWidth:720,margin:"0 auto"},children:(0,t.jsx)(h.N,{url:"Terminal â migration-assistant",children:(0,t.jsx)(b,{src:"/recordings/migration.cast",cols:100,rows:20,autoPlay:!0,loop:!0,speed:2,idleTimeLimit:1,fit:"width",poster:"npt:0:03",terminalFontSize:"10px"})})}),description:"Workspaces, state, variables, and VCS connections come over automatically. Just bring your secrets over from a secrets manager or enter them once."},{title:"Your pipelines keep working as-is",Icon:s.JiX,Feature:()=>{let e={context:{bg:"transparent",color:"var(--neutral-on-background-medium)",prefix:" "},removed:{bg:"rgba(248, 81, 73, 0.10)",color:"#f85149",prefix:"-"},added:{bg:"rgba(63, 185, 80, 0.10)",color:"#3fb950",prefix:"+"}};return(0,t.jsx)(a.VP,{fillWidth:!0,paddingY:"32",paddingX:"32",horizontal:"center",style:{maxWidth:520,margin:"0 auto"},children:(0,t.jsx)(h.N,{url:"backend.tf",meta:"1 line changed",children:(0,t.jsx)("pre",{style:{margin:0,padding:"12px 0",fontFamily:"var(--font-family-code)",fontSize:"0.8rem",lineHeight:1.8,overflow:"auto"},children:[{text:"terraform {",type:"context"},{text:" cloud {",type:"context"},{text:' hostname = "app.terraform.io"',type:"removed"},{text:' hostname = "scalr.io"',type:"added"},{text:' organization = "acme-corp"',type:"context"},{text:"",type:"context"},{text:" workspaces {",type:"context"},{text:' tags = ["prod"]',type:"context"},{text:" }",type:"context"},{text:" }",type:"context"},{text:"}",type:"context"}].map((r,n)=>{let s=e[r.type];return(0,t.jsxs)("div",{style:{background:s.bg,padding:"0 16px",display:"flex"},children:[(0,t.jsx)("span",{style:{color:"rgba(255,255,255,0.15)",userSelect:"none",width:"2.2em",flexShrink:0,textAlign:"right",paddingRight:12},children:n+1}),(0,t.jsx)("span",{style:{color:s.color,opacity:.4,userSelect:"none",width:"1.2em",flexShrink:0},children:s.prefix}),(0,t.jsx)("span",{style:{color:s.color},children:r.text})]},n)})})})})},description:"Run plan, apply, and destroy with the same CLI commands and API endpoints you already use. Scalr is a drop-in replacement for TFC's remote backend."},{title:"Your team won't notice the difference",Icon:s.pkD,Feature:()=>(0,t.jsx)(a.VP,{fillWidth:!0,paddingY:"32",paddingX:"32",children:(0,t.jsx)(h.N,{children:(0,t.jsx)(c,{leftContent:{src:"/screenshots/tfc-workspaces.webp",alt:"Terraform Cloud"}
1,rightContent:{src:"/screenshots/scalr-workspaces.png",alt:"Scalr"},leftLabel:"Terraform Cloud",rightLabel:"Scalr",aspectRatio:"16/9",objectPosition:"top left"})})}),description:"A clean, intuitive dashboard for managing workspaces, runs, and policies â designed to feel familiar if you've used Terraform Cloud."}]},94242:e=>{e.exports={sliderViewport:"Screenshots_sliderViewport__FdwE7",sliderTrack:"Screenshots_sliderTrack__hzMkJ",sliderSlide:"Screenshots_sliderSlide__KJitX",controls:"Screenshots_controls__ERtMo",controlButton:"Screenshots_controlButton__J5_RX",indicators:"Screenshots_indicators__4cX4N",indicator:"Screenshots_indicator__0HS3u",indicatorBar:"Screenshots_indicatorBar__I0Ktv",active:"Screenshots_active__2sK37",inactive:"Screenshots_inactive__N8AyX"}},98090:(e,r,n)=>{Promise.resolve().then(n.bind(n,70349)),Promise.resolve().then(n.bind(n,50240)),Promise.resolve().then(n.bind(n,8877)),Promise.resolve().then(n.bind(n,80474)),Promise.resolve().then(n.bind(n,10784)),Promise.resolve().then(n.bind(n,46671)),Promise.resolve().then(n.bind(n,24120)),Promise.resolve().then(n.bind(n,55739)),Promise.resolve().then(n.bind(n,59873)),Promise.resolve().then(n.bind(n,34736)),Promise.resolve().then(n.bind(n,68322)),Promise.resolve().then(n.bind(n,48629)),Promise.resolve().then(n.bind(n,89499)),Promise.resolve().then(n.bind(n,38703)),Promise.resolve().then(n.bind(n,28029)),Promise.resolve().then(n.bind(n,56560)),Promise.resolve().then(n.bind(n,34399)),Promise.resolve().then(n.bind(n,92117)),Promise.resolve().then(n.bind(n,94326)),Promise.resolve().then(n.bind(n,62924)),Promise.resolve().then(n.bind(n,13271)),Promise.resolve().then(n.bind(n,10481)),Promise.resolve().then(n.bind(n,89467)),Promise.resolve().then(n.bind(n,75318)),Promise.resolve().then(n.bind(n,89438)),Promise.resolve().then(n.bind(n,37431)),Promise.resolve().then(n.bind(n,59821)),Promise.resolve().then(n.bind(n,79067)),Promise.resolve().then(n.bind(n,86715)),Promise.resolve().then(n.bind(n,44642)),Promise.resolve().then(n.bind(n,86476)),Promise.resolve().then(n.bind(n,39161)),Promise.resolve().then(n.bind(n,20016)),Promise.resolve().then(n.bind(n,97787)),Promise.resolve().then(n.bind(n,10753)),Promise.resolve().then(n.bind(n,59666)),Promise.resolve().then(n.bind(n,56050)),Promise.resolve().then(n.bind(n,55500)),Promise.resolve().then(n.bind(n,98200)),Promise.resolve().then(n.bind(n,27394)),Promise.resolve().then(n.bind(n,31905)),Promise.resolve().then(n.bind(n,77079)),Promise.resolve().then(n.bind(n,96757)),Promise.resolve().then(n.bind(n,36971)),Promise.resolve().then(n.bind(n,86192)),Promise.resolve().then(n.bind(n,11376)),Promise.resolve().then(n.bind(n,89740)),Promise.resolve().then(n.bind(n,34793)),Promise.resolve().then(n.bind(n,10791)),Promise.resolve().then(n.bind(n,84851)),Promise.resolve().then(n.bind(n,78327)),Promise.resolve().then(n.bind(n,40279)),Promise.resolve().then(n.bind(n,4269)),Promise.resolve().then(n.bind(n,42678)),Promise.resolve().then(n.bind(n,3238)),Promise.resolve().then(n.bind(n,46483)),Promise.resolve().then(n.bind(n,11065)),Promise.resolve().then(n.bind(n,30138)),Promise.resolve().then(n.bind(n,26561)),Promise.resolve().then(n.bind(n,49532)),Promise.resolve().then(n.bind(n,45445)),Promise.resolve().then(n.bind(n,95892)),Promise.resolve().then(n.bind(n,67806)),Promise.resolve().then(n.bind(n,71683)),Promise.resolve().then(n.bind(n,10868)),Promise.resolve().then(n.bind(n,3167)),Promise.resolve().then(n.bind(n,81214)),Promise.resolve().then(n.bind(n,65676)),Promise.resolve().then(n.bind(n,85018)),Promise.resolve().then(n.bind(n,26071)),Promise.resolve().then(n.bind(n,20667)),Promise.resolve().then(n.bind(n,83131)),Promise.resolve().then(n.bind(n,86340)),Promise.resolve().then(n.bind(n,7284)),Promise.resolve().then(n.bind(n,28005)),Promise.resolve().then(n.bind(n,26034)),Promise.resolve().then(n.bind(n,44686)),Promise.resolve().then(n.bind(n,98984)),Promise.resolve().then(n.bind(n,7510)),Promise.resolve().then(n.bind(n,24278)),Promise.resolve().then(n.bind(n,52256)),Promise.resolve().then(n.bind(n,56541)),Promise.resolve().then(n.bind(n,34565)),Promise.resolve().then(n.bind(n,59891)),Promise.resolve().then(n.bind(n,93647)),Promise.resolve().then(n.bind(n,64905)),Promise.resolve().then(n.bind(n,97299)),Promise.resolve().then(n.bind(n,69145)),Promise.resolve().then(n.bind(n,68056)),Promise.resolve().then(n.bind(n,41234)),Promise.resolve().then(n.bind(n,82968)),Promise.resolve().then(n.bind(n,94163)),Promise.resolve().then(n.bind(n,76025)),Promise.resolve().then(n.bind(n,179)),Promise.resolve().then(n.bind(n,70122)),Promise.resolve().then(n.bind(n,23233)),Promise.resolve().then(n.bind(n,5797)),Promise.resolve().then(n.bind(n,85779)),Promise.resolve().then(n.bind(n,9493)),Promise.resolve().then(n.bind(n,16598)),Promise.resolve().then(n.bind(n,89403)),Promise.resolve().then(n.bind(n,14269)),Promise.resolve().then(n.bind(n,11399)),Promise.resolve().then(n.bind(n,81282)),Promise.resolve().then(n.bind(n,97959)),Promise.resolve().then(n.bind(n,60200)),Promise.resolve().then(n.bind(n,24502)),Promise.resolve().then(n.bind(n,89350)),Promise.resolve().then(n.bind(n,42960)),Promise.resolve().then(n.bind(n,7163)),Promise.resolve().then(n.bind(n,5635)),Promise.resolve().then(n.bind(n,47658)),Promise.resolve().then(n.bind(n,86363)),Promise.resolve().then(n.bind(n,32486)),Promise.resolve().then(n.bind(n,37749)),Promise.resolve().then(n.bind(n,14543)),Promise.resolve().then(n.bind(n,47487)),Promise.resolve().then(n.bind(n,39334)),Promise.resolve().then(n.bind(n,13675)),Promise.resolve().then(n.bind(n,80463)),Promise.resolve().then(n.bind(n,82832)),Promise.resolve().then(n.bind(n,13369)),Promise.resolve().then(n.bind(n,43246)),Promise.resolve().then(n.bind(n,26935)),Promise.resolve().then(n.bind(n,33740)),Promise.resolve().then(n.bind(n,74786)),Promise.resolve().then(n.bind(n,61961)),Promise.resolve().then(n.t.bind(n,52619,23)),Promise.resolve().then(n.t.bind(n,41402,23)),Promise.resolve().then(n.bind(n,85890)),Promise.resolve().then(n.bind(n,10236)),Promise.resolve().then(n.bind(n,9654)),Promise.resolve().then(n.bind(n,98245)),Promise.resolve().then(n.bind(n,62285)),Promise.resolve().then(n.bind(n,87661)),Promise.resolve().then(n.bind(n,58771)),Promise.resolve().then(n.bind(n,59115)),Promise.resolve().then(n.bind(n,60443)),Promise.resolve().then(n.bind(n,72326)),Promise.resolve().then(n.bind(n,26488)),Promise.resolve().then(n.bind(n,89911)),Promise.resolve().then(n.bind(n,15969)),Promise.resolve().then(n.bind(n,66102)),Promise.resolve().then(n.bind(n,26235)),Promise.resolve().then(n.bind(n,56111)),Promise.resolve().then(n.bind(n,40824)),Promise.resolve().then(n.bind(n,65160)),Promise.resolve().then(n.bind(n,11483)),Promise.resolve().then(n.bind(n,21467)),Promise.resolve().then(n.bind(n,45373)),Promise.resolve().then(n.bind(n,48982))}},e=>
1{e.O(0,[14501,69095,191,10726,27933,97307,34506,32150,60512,35760,24777,81356,81154,88587,948,28269,28441,31255,77358],()=>e(e.s=98090)),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.