| 1 |
- import{d as $,j as e,r as m}from"./react-DnK_pEU5.js";import{B as r,u as S,d as p,t as o,L as E,I,S as H}from"./index-B3c97KGp.js";import{L as j}from"./label-CasawWzc.js";import{S as R}from"./switch-BkKXBesV.js";import{A as v,a as k}from"./alert-CjHh5uAz.js";import{A as P,a as F,b as A,c as T}from"./accordion-Cq66Jm31.js";import"./dnd-Bgdma8TD.js";import"./motion-8nKk6_RD.js";import"./index-Sj6DXm4R.js";const D=[{key:"precheck",label:"Pre-check"},{key:"home",label:"Home"},{key:"test-y",label:"Test Y"},{key:"test-x",label:"Test X"},{key:"fix",label:"Fix"},{key:"sanity-y",label:"Verify Y"},{key:"sanity-x",label:"Verify X"},{key:"complete",label:"Done"}];function O(x){return D.findIndex(l=>l.key===x)}function L(){const x=S(s=>s.status?.connection_status??!1),l=S(s=>s.status?.is_running??!1),[a,n]=m.useState({step:"precheck",yCorrect:null,xCorrect:null,sending:!1,fixing:!1}),g=m.useCallback(async(s,c=!0)=>{c&&n(t=>({...t,sending:!0}));try{(await p.post("/api/fluidnc/command",{command:s})).success||o.error("Command failed")}catch(t){o.error(`Error: ${t instanceof Error?t.message:"Unknown error"}`)}finally{c&&n(t=>({...t,sending:!1}))}},[]),b=m.useCallback(async s=>{n(c=>({...c,fixing:!0}));try{await p.patch("/api/fluidnc/config",{axes:{[s]:{direction_inverted:!0}}}),o.success(`${s.toUpperCase()} direction toggled and saved`)}catch(c){o.error(`Fix failed: ${c instanceof Error?c.message:"Unknown"}`)}finally{n(c=>({...c,fixing:!1}))}},[]),w=m.useCallback(async()=>{n(s=>({...s,fixing:!0}));try{await p.post("/api/fluidnc/command",{command:"$Bye",timeout:2}),o.success("Restart command sent. Reconnect when ready.")}catch{o.info("Restart command sent. The controller will reboot.")}finally{n(s=>({...s,fixing:!1}))}},[]),f=m.useCallback(async(s=3e4)=>{const c=Date.now();for(;Date.now()-c<s;){await new Promise(t=>setTimeout(t,1e3));try{if((await p.post("/api/fluidnc/command",{command:"?",timeout:2})).responses?.some(i=>i.includes("Idle")))return!0}catch{}}return!1},[]),u=()=>n({step:"precheck",yCorrect:null,xCorrect:null,sending:!1,fixing:!1}),y=O(a.step),_=x&&!l;return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"flex items-center gap-1 overflow-x-auto pb-2",children:D.map((s,c)=>e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",title:s.label,onClick:()=>n(t=>({...t,step:s.key})),className:`flex items-center justify-center w-7 h-7 rounded-full text-xs font-medium shrink-0 cursor-pointer transition-opacity hover:opacity-80 ${c<y?"bg-primary text-primary-foreground":c===y?"bg-primary text-primary-foreground ring-2 ring-primary/30":"bg-muted text-muted-foreground"}`,children:c<y?e.jsx("span",{className:"material-icons-outlined text-sm",children:"check"}):c+1}),c<D.length-1&&e.jsx("div",{className:`w-4 h-0.5 ${c<y?"bg-primary":"bg-muted"}`})]},s.key))}),a.step==="precheck"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Pre-check"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Verify the table is connected and no pattern is running before calibrating motor directions."}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`material-icons-outlined text-base ${x?"text-green-500":"text-red-500"}`,children:x?"check_circle":"cancel"}),e.jsx("span",{className:"text-sm",children:"Controller connected"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`material-icons-outlined text-base ${l?"text-red-500":"text-green-500"}`,children:l?"cancel":"check_circle"}),e.jsx("span",{className:"text-sm",children:"No pattern running"})]})]}),e.jsx(r,{onClick:()=>n(s=>({...s,step:"home"})),disabled:!_,children:"Begin Calibration"})]}),a.step==="home"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Home Table"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Home the table to establish a known position before testing motor directions. The ball will move to the home position."}),e.jsxs("div",{className:"flex gap-3",children:[e.jsxs(r,{onClick:async()=>{n(s=>({...s,sending:!0}));try{await p.post("/send_home"),o.success("Homing complete"),n(s=>({...s,sending:!1,step:"test-y"}))}catch(s){o.error(`Homing failed: ${s instanceof Error?s.message:"Unknown error"}`),n(c=>({...c,sending:!1}))}},disabled:a.sending,children:[a.sending?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"home"}),a.sending?"Homing...":"Home Table"]}),e.jsx(r,{variant:"outline",onClick:()=>n(s=>({...s,step:"test-y"})),disabled:a.sending,children:"Skip"})]})]}),a.step==="test-y"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Test Y Axis (Radial)"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["This sends a small radial movement. Watch the ball and answer whether it moved ",e.jsx("strong",{children:"outward"})," (toward the perimeter)."]}),e.jsxs(r,{onClick:()=>g("$J=G91 G21 Y5 F100.0"),disabled:a.sending,children:[a.sending?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"play_arrow"}),"Send Test Command"]}),e.jsxs("div",{className:"flex gap-3 pt-2",children:[e.jsxs(r,{variant:"outline",onClick:()=>n(s=>({...s,yCorrect:!0,step:"test-x"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"thumb_up"}),"Yes, moved outward"]}),e.jsxs(r,{variant:"outline",onClick:()=>n(s=>({...s,yCorrect:!1,step:"test-x"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-red-500",children:"thumb_down"}),"No, moved inward"]})]})]}),a.step==="test-x"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Test X Axis (Angular)"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["This sends a small angular movement. Watch the ball and answer whether it moved ",e.jsx("strong",{children:"clockwise"})," when viewed from above."]}),e.jsxs(r,{onClick:()=>g("$J=G91 G21 X5 F100.0"),disabled:a.sending,children:[a.sending?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"play_arrow"}),"Send Test Command"]}),e.jsxs("div",{className:"flex gap-3 pt-2",children:[e.jsxs(r,{variant:"outline",onClick:()=>{n(s=>({...s,xCorrect:!0,step:s.yCorrect===!1?"fix":"sanity-y"}))},disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"thumb_up"}),"Yes, moved clockwise"]}),e.jsxs(r,{variant:"outline",onClick:()=>n(s=>({...s,xCorrect:!1,step:"fix"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-red-500",children:"thumb_down"}),"No, moved counter-clockwise"]})]})]}),a.step==="fix"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Fix Motor Directions"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["The following axes need their direction inverted. Click to auto-fix by toggling the ",e.jsx("code",{children:":low"})," flag on the direction pin."]}),e.jsxs("div",{className:"space-y-3",children:[a.yCorrect===!1&&e.jsxs("div",{className:"flex items-center justify-between p-3 rounded-lg border",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-sm",children:"Y Axis (Radial)"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Direction is inverted"})]}),e.jsx(r,{size:"sm",onClick:()=>b("y"),disabled:a.fixing,children:a.fixing?"Fixing...":"Fix Automatically"})]}),a.xCorrect===!1&&e.jsxs("div",{className:"flex items-center justify-between p-3 rounded-lg border",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-sm",children:"X Axis (Angular)"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Direction is inverted"})]}),e.jsx(r,{size:"sm",onClick:()=>b("x"),disabled:a.fixing,children:a.fixing?"Fixing...":"Fix Automatically"})]})]}),e.jsxs(v,{children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"warning"}),e.jsx(k,{children:"Direction pin changes require a controller restart to take effect. After fixing, restart the controller below, then re-run the wizard to verify."})]}),e.jsxs("div",{className:"flex gap-3",children:[e.jsxs(r,{variant:"outline",onClick:w,disabled:a.fixing,children:[e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"restart_alt"}),"Restart Controller"]}),e.jsx(r,{onClick:()=>n(s=>({...s,step:"sanity-y"})),children:"Continue to Verification"})]})]}),a.step==="sanity-y"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Verify Y Axis (Larger Movement)"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["This moves the ball to center first, then sends a longer radial movement. The ball should move clearly from ",e.jsx("strong",{children:"center toward the perimeter"}),"."]}),e.jsxs(r,{onClick:async()=>{n(s=>({...s,sending:!0}));try{await p.post("/move_to_center"),await f(6e4),await g("$J=G91 G21 Y20 F100.0",!1),await f()}finally{n(s=>({...s,sending:!1}))}},disabled:a.sending,children:[a.sending?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"play_arrow"}),a.sending?"Moving...":"Send Verification Command"]}),e.jsxs("div",{className:"flex flex-wrap gap-3 pt-2",children:[e.jsxs(r,{onClick:()=>n(s=>({...s,step:"sanity-x"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"check"}),"Looks Correct"]}),e.jsxs(r,{variant:"outline",onClick:()=>n(s=>({...s,step:"dip-check"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-amber-500",children:"warning"}),"Only Moved Halfway"]}),e.jsx(r,{variant:"outline",onClick:u,disabled:a.sending,children:"Start Over"})]})]}),a.step==="sanity-x"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Verify X Axis (Larger Movement)"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["This sends a larger angular movement. The ball should make roughly a ",e.jsx("strong",{children:"full clockwise rotation"}),". It will also spiral inward slightly — this is normal due to the mechanical coupling between the angular and radial axes."]}),e.jsxs(r,{onClick:async()=>{n(s=>({...s,sending:!0}));try{await g("$J=G91 G21 X50 F100.0",!1),await f()}finally{n(s=>({...s,sending:!1}))}},disabled:a.sending,children:[a.sending?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"play_arrow"}),a.sending?"Moving...":"Send Verification Command"]}),e.jsxs("div",{className:"flex flex-wrap gap-3 pt-2",children:[e.jsxs(r,{onClick:()=>n(s=>({...s,step:"complete"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"check"}),"Looks Correct"]}),e.jsxs(r,{variant:"outline",onClick:()=>n(s=>({...s,step:"dip-check"})),disabled:a.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-amber-500",children:"warning"}),"Only Half a Revolution"]}),e.jsx(r,{variant:"outline",onClick:u,disabled:a.sending,children:"Start Over"})]})]}),a.step==="dip-check"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Check DIP Switches"}),e.jsxs(v,{variant:"destructive",children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"power_off"}),e.jsxs(k,{children:[e.jsx("strong",{children:"Turn off the table completely"})," before touching any hardware. Disconnect power before checking DIP switches."]})]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["If the ball only moved ",e.jsx("strong",{children:"half the expected distance"}),", the stepper driver microstepping DIP switches are likely misconfigured."]}),e.jsxs("div",{className:"rounded-lg border p-4 space-y-3 bg-muted/30",children:[e.jsx("p",{className:"text-sm font-medium",children:"How to fix:"}),e.jsxs("ol",{className:"text-sm text-muted-foreground list-decimal list-inside space-y-2",children:[e.jsx("li",{children:"Power off the table completely"}),e.jsx("li",{children:"Locate the DIP switches underneath each stepper driver"}),e.jsxs("li",{children:["Set ",e.jsx("strong",{children:"all DIP switches to OFF"})," (this selects full-step or the driver's default microstepping)"]}),e.jsx("li",{children:"Power the table back on and re-run the calibration wizard"})]})]}),e.jsx("div",{className:"flex gap-3",children:e.jsx(r,{variant:"outline",onClick:u,children:"Restart Wizard"})})]}),a.step==="complete"&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2 text-green-600",children:[e.jsx("span",{className:"material-icons-outlined text-2xl",children:"check_circle"}),e.jsx("h3",{className:"font-semibold text-lg",children:"Calibration Complete"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Both axes are moving in the correct directions. Your table is ready to use."}),e.jsx(r,{variant:"outline",onClick:u,children:"Run Again"})]})]})}const V=[{key:"steps_per_mm",label:"Steps per mm",unit:"steps"},{key:"max_rate_mm_per_min",label:"Max Rate",unit:"mm/min"},{key:"acceleration_mm_per_sec2",label:"Acceleration",unit:"mm/s²"}],Y=[{key:"homing_cycle",label:"Homing Cycle",unit:"-1 = disabled"},{key:"homing_mpos_mm",label:"Homing MPos",unit:"mm"},{key:"homing_feed_mm_per_min",label:"Homing Feed Rate",unit:"mm/min"},{key:"homing_seek_mm_per_min",label:"Homing Seek Rate",unit:"mm/min"},{key:"homing_settle_ms",label:"Homing Settle Time",unit:"ms"},{key:"homing_seek_scaler",label:"Homing Seek Scaler",unit:""},{key:"homing_feed_scaler",label:"Homing Feed Scaler",unit:""},{key:"pulloff_mm",label:"Pulloff Distance",unit:"mm"}],z=[{key:"homing_positive_direction",label:"Positive Direction"}];function G(){const x=S(t=>t.status?.connection_status??!1),[l,a]=m.useState(null),[n,g]=m.useState(null),[b,w]=m.useState(!1),[f,u]=m.useState(!1),y=m.useCallback(async()=>{w(!0);try{const t=await p.get("/api/fluidnc/config");t.success&&(a(t.settings),g(structuredClone(t.settings)),o.success("Configuration loaded from controller"))}catch(t){o.error(`Failed to read config: ${t instanceof Error?t.message:"Unknown"}`)}finally{w(!1)}},[]),_=m.useCallback(async()=>{if(!(!l||!n)){u(!0);try{const t={};for(const d of["x","y"]){const h={},C=l.axes[d],M=n.axes[d];for(const N of Object.keys(C))N!=="direction_pin"&&C[N]!==M[N]&&C[N]!==null&&(h[N]=C[N]);Object.keys(h).length>0&&(t.axes||(t.axes={}),t.axes[d]=h)}if(l.start.must_home!==n.start.must_home&&l.start.must_home!==null&&(t.start={must_home:l.start.must_home}),!t.axes&&!t.start){o.info("No changes to save"),u(!1);return}const i=await p.patch("/api/fluidnc/config",t);i.success&&(g(structuredClone(l)),i.restart_required?o.warning("Settings saved. Direction pin changes require a controller restart."):i.saved?o.success(`Saved ${i.changes_applied.length} setting(s) to controller`):o.warning("Settings applied but flash save may have failed"))}catch(t){o.error(`Save failed: ${t instanceof Error?t.message:"Unknown"}`)}finally{u(!1)}}},[l,n]),s=(t,i,d)=>{a(h=>h&&{...h,axes:{...h.axes,[t]:{...h.axes[t],[i]:d}}})},c=l&&n?JSON.stringify(l)!==JSON.stringify(n):!1;return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs(r,{onClick:y,disabled:b||!x,children:[b?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"download"}),b?"Reading...":"Read from Controller"]}),l&&e.jsxs(r,{onClick:_,disabled:f||!c,children:[f?e.jsx("span",{className:"material-icons-outlined animate-spin mr-2 text-base",children:"sync"}):e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"save"}),f?"Saving...":"Save to Controller"]}),c&&e.jsx(E,{variant:"secondary",children:"Unsaved changes"})]}),!x&&e.jsxs(v,{children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"link_off"}),e.jsx(k,{children:"Connect to a controller first to read or modify FluidNC settings."})]}),l&&e.jsx(P,{type:"multiple",defaultValue:["axis-x","axis-y"],children:["x","y"].map(t=>e.jsxs(F,{value:`axis-${t}`,className:"border rounded-lg px-4 mt-2 bg-card",children:[e.jsx(A,{className:"hover:no-underline",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"material-icons-outlined text-muted-foreground",children:t==="x"?"rotate_right":"swap_vert"}),e.jsxs("div",{className:"text-left",children:[e.jsxs("div",{className:"font-semibold",children:[t.toUpperCase()," Axis — ",t==="x"?"Angular":"Radial"]}),e.jsxs("div",{className:"text-sm text-muted-foreground font-normal",children:["Movement, direction, and homing for the ",t==="x"?"angular":"radial"," motor"]})]})]})}),e.jsxs(T,{className:"pt-4 pb-6 space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx(j,{className:"text-sm font-semibold text-muted-foreground uppercase tracking-wide",children:"Movement"}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:V.map(i=>e.jsxs("div",{className:"space-y-1",children:[e.jsx(j,{className:"text-xs text-muted-foreground",children:i.label}),e.jsx(I,{type:"number",step:"any",value:l.axes[t][i.key]??"",onChange:d=>s(t,i.key,d.target.value?parseFloat(d.target.value):null),placeholder:i.unit})]},i.key))})]}),e.jsx(H,{}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(j,{className:"text-sm font-semibold text-muted-foreground uppercase tracking-wide",children:"Direction"}),e.jsxs("div",{className:"flex items-center justify-between p-3 rounded-lg border",children:[e.jsx("div",{children:l.axes[t].direction_pin!==null?e.jsxs("p",{className:"text-xs text-muted-foreground font-mono",children:["Pin: ",l.axes[t].direction_pin]}):e.jsx("p",{className:"text-xs text-muted-foreground",children:"Not available (may not be a stepstick driver)"})}),l.axes[t].direction_inverted!==null&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(j,{className:"text-sm",children:"Inverted"}),e.jsx(R,{checked:l.axes[t].direction_inverted??!1,onCheckedChange:i=>s(t,"direction_inverted",i)})]})]})]}),e.jsx(H,{}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(j,{className:"text-sm font-semibold text-muted-foreground uppercase tracking-wide",children:"Homing"}),e.jsx("div",{className:"space-y-3",children:z.map(i=>e.jsxs("div",{className:"flex items-center justify-between p-2 rounded-lg border",children:[e.jsx(j,{className:"text-sm",children:i.label}),e.jsx(R,{checked:l.axes[t][i.key]??!1,onCheckedChange:d=>s(t,i.key,d)})]},i.key))}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3",children:Y.map(i=>e.jsxs("div",{className:"space-y-1",children:[e.jsx(j,{className:"text-xs text-muted-foreground",children:i.label}),e.jsx(I,{type:"number",step:"any",value:l.axes[t][i.key]??"",onChange:d=>s(t,i.key,d.target.value?parseFloat(d.target.value):null),placeholder:i.unit})]},i.key))})]})]})]},t))})]})}function ee(){const x=$();return e.jsxs("div",{className:"max-w-4xl mx-auto space-y-6 p-4 pb-32",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(r,{variant:"ghost",size:"icon",onClick:()=>x("/settings"),children:e.jsx("span",{className:"material-icons-outlined",children:"arrow_back"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"Hardware Setup"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Calibrate motors and configure FluidNC settings"})]})]}),e.jsxs(v,{children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"info"}),e.jsxs(k,{children:["This page is for ",e.jsx("strong",{children:"FluidNC-based boards with bipolar stepper motors"})," (DLC32, MKS boards). Not applicable to unipolar/28BYJ-48 setups."]})]}),e.jsxs(P,{type:"multiple",defaultValue:["calibration","config"],children:[e.jsxs(F,{value:"calibration",className:"border rounded-lg px-4 bg-card",children:[e.jsx(A,{className:"hover:no-underline",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"material-icons-outlined text-muted-foreground",children:"tune"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-semibold",children:"Calibration Wizard"}),e.jsx("div",{className:"text-sm text-muted-foreground font-normal",children:"Verify and fix motor directions step by step"})]})]})}),e.jsx(T,{className:"pt-4 pb-6",children:e.jsx(L,{})})]}),e.jsxs(F,{value:"config",className:"border rounded-lg px-4 mt-2 bg-card",children:[e.jsx(A,{className:"hover:no-underline",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"material-icons-outlined text-muted-foreground",children:"settings"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-semibold",children:"FluidNC Configuration"}),e.jsx("div",{className:"text-sm text-muted-foreground font-normal",children:"Read and edit curated controller settings"})]})]})}),e.jsxs(T,{className:"pt-4 pb-6",forceMount:!0,children:[e.jsxs(v,{className:"mb-4",children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"warning"}),e.jsx(k,{children:"These are low-level FluidNC firmware settings. Only modify them if you understand what each parameter does — incorrect values can cause erratic movement or prevent the table from working."})]}),e.jsx(G,{})]})]})]})]})}export{ee as SetupPage};
|