SetupPage-w_FtYlgJ.js 21 KB

1
  1. import{d as O,j as e,r as h}from"./react-DnK_pEU5.js";import{B as l,u as S,d as f,t as m,L as R,I,S as H}from"./index-LUV-rsLw.js";import{L as b}from"./label-CyGXWE6X.js";import{S as P}from"./switch-BTqCTolc.js";import{A as k,a as w}from"./alert-nibgKJd5.js";import{A as M,a as F,b as D,c as A}from"./accordion-tcZ-azK3.js";import"./dnd-Bgdma8TD.js";import"./motion-8nKk6_RD.js";import"./index-CLGWHFf2.js";const T=[{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 $(x){return T.findIndex(r=>r.key===x)}function L(){const x=S(s=>s.status?.connection_status??!1),r=S(s=>s.status?.is_running??!1),[t,n]=h.useState({step:"precheck",yCorrect:null,xCorrect:null,sending:!1,fixing:!1}),j=h.useCallback(async(s,c=!0)=>{c&&n(o=>({...o,sending:!0}));try{(await f.post("/api/fluidnc/command",{command:s})).success||m.error("Command failed")}catch(o){m.error(`Error: ${o instanceof Error?o.message:"Unknown error"}`)}finally{c&&n(o=>({...o,sending:!1}))}},[]),v=h.useCallback(async()=>{n(s=>({...s,fixing:!0}));try{const s={};t.yCorrect===!1&&(s.y={direction_inverted:!0}),t.xCorrect===!1&&(s.x={direction_inverted:!0}),await f.patch("/api/fluidnc/config",{axes:s});try{await f.post("/api/fluidnc/command",{command:"$Bye",timeout:2})}catch{}m.success("Direction toggled and saved. Controller is restarting — wait for it to reconnect.")}catch(s){m.error(`Fix failed: ${s instanceof Error?s.message:"Unknown"}`)}finally{n(s=>({...s,fixing:!1}))}},[t.yCorrect,t.xCorrect]),y=h.useCallback(async(s=3e4)=>{const c=Date.now();for(;Date.now()-c<s;){await new Promise(o=>setTimeout(o,1e3));try{if((await f.post("/api/fluidnc/command",{command:"?",timeout:2})).responses?.some(a=>a.includes("Idle")))return!0}catch{}}return!1},[]),p=()=>n({step:"precheck",yCorrect:null,xCorrect:null,sending:!1,fixing:!1}),g=$(t.step),_=x&&!r;return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"flex items-center gap-1 overflow-x-auto pb-2",children:T.map((s,c)=>e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",title:s.label,onClick:()=>n(o=>({...o,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<g?"bg-primary text-primary-foreground":c===g?"bg-primary text-primary-foreground ring-2 ring-primary/30":"bg-muted text-muted-foreground"}`,children:c<g?e.jsx("span",{className:"material-icons-outlined text-sm",children:"check"}):c+1}),c<T.length-1&&e.jsx("div",{className:`w-4 h-0.5 ${c<g?"bg-primary":"bg-muted"}`})]},s.key))}),t.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 ${r?"text-red-500":"text-green-500"}`,children:r?"cancel":"check_circle"}),e.jsx("span",{className:"text-sm",children:"No pattern running"})]})]}),e.jsx(l,{onClick:()=>n(s=>({...s,step:"home"})),disabled:!_,children:"Begin Calibration"})]}),t.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(l,{onClick:async()=>{n(s=>({...s,sending:!0}));try{await f.post("/send_home"),m.success("Homing complete"),n(s=>({...s,sending:!1,step:"test-y"}))}catch(s){m.error(`Homing failed: ${s instanceof Error?s.message:"Unknown error"}`),n(c=>({...c,sending:!1}))}},disabled:t.sending,children:[t.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"}),t.sending?"Homing...":"Home Table"]}),e.jsx(l,{variant:"outline",onClick:()=>n(s=>({...s,step:"test-y"})),disabled:t.sending,children:"Skip"})]})]}),t.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(l,{onClick:()=>j("$J=G91 G21 Y5 F100.0"),disabled:t.sending,children:[t.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(l,{variant:"outline",onClick:()=>n(s=>({...s,yCorrect:!0,step:"test-x"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"thumb_up"}),"Yes, moved outward"]}),e.jsxs(l,{variant:"outline",onClick:()=>n(s=>({...s,yCorrect:!1,step:"test-x"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-red-500",children:"thumb_down"}),"No, moved inward"]})]})]}),t.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(l,{onClick:()=>j("$J=G91 G21 X5 F100.0"),disabled:t.sending,children:[t.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(l,{variant:"outline",onClick:()=>{n(s=>({...s,xCorrect:!0,step:s.yCorrect===!1?"fix":"sanity-y"}))},disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"thumb_up"}),"Yes, moved clockwise"]}),e.jsxs(l,{variant:"outline",onClick:()=>n(s=>({...s,xCorrect:!1,step:"fix"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-red-500",children:"thumb_down"}),"No, moved counter-clockwise"]})]})]}),t.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. Auto-fix toggles the ",e.jsx("code",{children:":low"})," flag on the direction pin."]}),e.jsxs("div",{className:"space-y-3",children:[t.yCorrect===!1&&e.jsxs("div",{className:"p-3 rounded-lg border",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"})]}),t.xCorrect===!1&&e.jsxs("div",{className:"p-3 rounded-lg border",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.jsxs(k,{children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"warning"}),e.jsx(w,{children:"Direction pin changes require a controller restart to take effect. Fixing automatically restarts the controller — wait for it to reconnect before continuing."})]}),e.jsxs("div",{className:"flex gap-3",children:[e.jsxs(l,{onClick:v,disabled:t.fixing,children:[e.jsx("span",{className:"material-icons-outlined mr-2 text-base",children:"build"}),t.fixing?"Fixing...":"Fix Automatically"]}),e.jsx(l,{variant:"outline",onClick:()=>n(s=>({...s,step:"sanity-y"})),disabled:t.fixing||!x,children:"Continue to Verification"})]})]}),t.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(l,{onClick:async()=>{n(s=>({...s,sending:!0}));try{await f.post("/move_to_center"),await y(6e4),await j("$J=G91 G21 Y20 F100.0",!1),await y()}finally{n(s=>({...s,sending:!1}))}},disabled:t.sending,children:[t.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"}),t.sending?"Moving...":"Send Verification Command"]}),e.jsxs("div",{className:"flex flex-wrap gap-3 pt-2",children:[e.jsxs(l,{onClick:()=>n(s=>({...s,step:"sanity-x"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"check"}),"Looks Correct"]}),e.jsxs(l,{variant:"outline",onClick:()=>n(s=>({...s,step:"dip-check"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-amber-500",children:"warning"}),"Only Moved Halfway"]}),e.jsx(l,{variant:"outline",onClick:p,disabled:t.sending,children:"Start Over"})]})]}),t.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(l,{onClick:async()=>{n(s=>({...s,sending:!0}));try{await j("$J=G91 G21 X50 F100.0",!1),await y()}finally{n(s=>({...s,sending:!1}))}},disabled:t.sending,children:[t.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"}),t.sending?"Moving...":"Send Verification Command"]}),e.jsxs("div",{className:"flex flex-wrap gap-3 pt-2",children:[e.jsxs(l,{onClick:()=>n(s=>({...s,step:"complete"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-green-500",children:"check"}),"Looks Correct"]}),e.jsxs(l,{variant:"outline",onClick:()=>n(s=>({...s,step:"dip-check"})),disabled:t.sending,children:[e.jsx("span",{className:"material-icons-outlined mr-1 text-base text-amber-500",children:"warning"}),"Only Half a Revolution"]}),e.jsx(l,{variant:"outline",onClick:p,disabled:t.sending,children:"Start Over"})]})]}),t.step==="dip-check"&&e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"font-semibold",children:"Check DIP Switches"}),e.jsxs(k,{variant:"destructive",children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"power_off"}),e.jsxs(w,{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(l,{variant:"outline",onClick:p,children:"Restart Wizard"})})]}),t.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(l,{variant:"outline",onClick:p,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"}],G=[{key:"homing_positive_direction",label:"Positive Direction"}];function B(){const x=S(a=>a.status?.connection_status??!1),[r,t]=h.useState(null),[n,j]=h.useState(null),[v,y]=h.useState(!1),[p,g]=h.useState(!1),_=h.useCallback(async()=>{y(!0);try{const a=await f.get("/api/fluidnc/config");a.success&&(t(a.settings),j(structuredClone(a.settings)),m.success("Configuration loaded from controller"))}catch(a){m.error(`Failed to read config: ${a instanceof Error?a.message:"Unknown"}`)}finally{y(!1)}},[]),s=h.useCallback(async()=>{if(!(!r||!n)){g(!0);try{const a={};for(const d of["x","y"]){const u={},C=r.axes[d],E=n.axes[d];for(const N of Object.keys(C))N!=="direction_pin"&&C[N]!==E[N]&&C[N]!==null&&(u[N]=C[N]);Object.keys(u).length>0&&(a.axes||(a.axes={}),a.axes[d]=u)}if(r.start.must_home!==n.start.must_home&&r.start.must_home!==null&&(a.start={must_home:r.start.must_home}),!a.axes&&!a.start){m.info("No changes to save"),g(!1);return}const i=await f.patch("/api/fluidnc/config",a);i.success&&(j(structuredClone(r)),i.restart_required?m.warning("Settings saved. Direction pin changes require a controller restart."):i.saved?m.success(`Saved ${i.changes_applied.length} setting(s) to controller`):m.warning("Settings applied but flash save may have failed"))}catch(a){m.error(`Save failed: ${a instanceof Error?a.message:"Unknown"}`)}finally{g(!1)}}},[r,n]),c=(a,i,d)=>{t(u=>u&&{...u,axes:{...u.axes,[a]:{...u.axes[a],[i]:d}}})},o=r&&n?JSON.stringify(r)!==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(l,{onClick:_,disabled:v||!x,children:[v?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"}),v?"Reading...":"Read from Controller"]}),r&&e.jsxs(l,{onClick:s,disabled:p||!o,children:[p?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"}),p?"Saving...":"Save to Controller"]}),o&&e.jsx(R,{variant:"secondary",children:"Unsaved changes"})]}),!x&&e.jsxs(k,{children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"link_off"}),e.jsx(w,{children:"Connect to a controller first to read or modify FluidNC settings."})]}),r&&e.jsx(M,{type:"multiple",defaultValue:["axis-x","axis-y"],children:["x","y"].map(a=>e.jsxs(F,{value:`axis-${a}`,className:"border rounded-lg px-4 mt-2 bg-card",children:[e.jsx(D,{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:a==="x"?"rotate_right":"swap_vert"}),e.jsxs("div",{className:"text-left",children:[e.jsxs("div",{className:"font-semibold",children:[a.toUpperCase()," Axis — ",a==="x"?"Angular":"Radial"]}),e.jsxs("div",{className:"text-sm text-muted-foreground font-normal",children:["Movement, direction, and homing for the ",a==="x"?"angular":"radial"," motor"]})]})]})}),e.jsxs(A,{className:"pt-4 pb-6 space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx(b,{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(b,{className:"text-xs text-muted-foreground",children:i.label}),e.jsx(I,{type:"number",step:"any",value:r.axes[a][i.key]??"",onChange:d=>c(a,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(b,{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:r.axes[a].direction_pin!==null?e.jsxs("p",{className:"text-xs text-muted-foreground font-mono",children:["Pin: ",r.axes[a].direction_pin]}):e.jsx("p",{className:"text-xs text-muted-foreground",children:"Not available (may not be a stepstick driver)"})}),r.axes[a].direction_inverted!==null&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(b,{className:"text-sm",children:"Inverted"}),e.jsx(P,{checked:r.axes[a].direction_inverted??!1,onCheckedChange:i=>c(a,"direction_inverted",i)})]})]})]}),e.jsx(H,{}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(b,{className:"text-sm font-semibold text-muted-foreground uppercase tracking-wide",children:"Homing"}),e.jsx("div",{className:"space-y-3",children:G.map(i=>e.jsxs("div",{className:"flex items-center justify-between p-2 rounded-lg border",children:[e.jsx(b,{className:"text-sm",children:i.label}),e.jsx(P,{checked:r.axes[a][i.key]??!1,onCheckedChange:d=>c(a,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(b,{className:"text-xs text-muted-foreground",children:i.label}),e.jsx(I,{type:"number",step:"any",value:r.axes[a][i.key]??"",onChange:d=>c(a,i.key,d.target.value?parseFloat(d.target.value):null),placeholder:i.unit})]},i.key))})]})]})]},a))})]})}function ee(){const x=O();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(l,{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(k,{children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"info"}),e.jsxs(w,{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(M,{type:"multiple",defaultValue:["calibration","config"],children:[e.jsxs(F,{value:"calibration",className:"border rounded-lg px-4 bg-card",children:[e.jsx(D,{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(A,{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(D,{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(A,{className:"pt-4 pb-6",forceMount:!0,children:[e.jsxs(k,{className:"mb-4",children:[e.jsx("span",{className:"material-icons-outlined text-base mr-2 shrink-0",children:"warning"}),e.jsx(w,{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(B,{})]})]})]})]})}export{ee as SetupPage};