Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
343 changes: 202 additions & 141 deletions multiace/i18n/de.json

Large diffs are not rendered by default.

341 changes: 201 additions & 140 deletions multiace/i18n/en.json

Large diffs are not rendered by default.

765 changes: 625 additions & 140 deletions multiace/klipper/extras/ace.py

Large diffs are not rendered by default.

17 changes: 15 additions & 2 deletions multiace/web/backend/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3643,8 +3643,8 @@ async def calibration_action(payload: CalibrationAction) -> dict:
script = 'ACE_CALIBRATION_FEED'
elif action == 'retract':
length = int(payload.length or 0)
if length < 5 or length > 500:
raise HTTPException(400, 'retract length must be 5-500 mm')
if length < 5 or length > 5000:
raise HTTPException(400, 'retract length must be 5-5000 mm')
script = 'ACE_CALIBRATION_RETRACT LENGTH=%d' % length
elif action == 'feed_jog':
length = int(payload.length or 0)
Expand All @@ -3653,6 +3653,19 @@ async def calibration_action(payload: CalibrationAction) -> dict:
script = 'ACE_CALIBRATION_FEED_JOG LENGTH=%d' % length
elif action == 'mark_swap':
script = 'ACE_CALIBRATION_MARK MARK=swap'
elif action == 'mark_undo':
script = 'ACE_CALIBRATION_MARK MARK=undo'
elif action == 'stop':
script = 'ACE_CALIBRATION_STOP'
elif action == 'resume':
script = 'ACE_CALIBRATION_RESUME'
elif action == 'home':
script = 'ACE_CALIBRATION_HOME'
elif action == 'verify_hub_jog':
length = int(payload.length or 0)
if length not in (5, 10, 25, 50):
raise HTTPException(400, 'hub jog must be 5, 10, 25 or 50 mm')
script = 'ACE_CALIBRATION_VERIFY ACTION=hub_jog LENGTH=%d' % length
elif action == 'return_park':
script = 'ACE_CALIBRATION_RETURN'
elif action == 'verify_start':
Expand Down
613 changes: 379 additions & 234 deletions multiace/web/frontend/app.js

Large diffs are not rendered by default.

890 changes: 509 additions & 381 deletions multiace/web/frontend/index.html

Large diffs are not rendered by default.

239 changes: 239 additions & 0 deletions multiace/web/frontend/style-new.css
Original file line number Diff line number Diff line change
Expand Up @@ -1376,6 +1376,245 @@ html[data-theme="new"] .nt-config-tab > .config-form > .config-row:has(.spool-pi
html[data-theme="new"] .nt-config-tab > .config-form > .config-row:has(.spool-picker-row) { justify-content: flex-start; }


/* ---- Calibration tab -------------------------------------------------
style.css paints this tab with fixed dark colours and rounded cards.
Here every surface goes through the design tokens (so the light shade
needs no rules of its own) and takes the square, line-drawn look of the
other tabs. */
html[data-theme="new"] .calibration-page h2 {
margin: 18px 0 6px; font-size: 22px; font-weight: 600;
text-transform: none; letter-spacing: 0; color: var(--fg);
}
html[data-theme="new"] .calibration-heading { margin-bottom: 14px; }
html[data-theme="new"] .calibration-heading p.muted { font-size: 12.5px; color: var(--muted); max-width: 720px; }
html[data-theme="new"] .calibration-guided { max-width: none; }

/* route header + diagram */
html[data-theme="new"] .calibration-route-summary {
padding: 14px 16px; background: var(--card); border-color: var(--border); border-radius: 0;
}
html[data-theme="new"] .calibration-route-summary strong { font-size: 14px; font-weight: 700; color: var(--fg); }
html[data-theme="new"] .calibration-route-summary small { font-size: 12.5px; color: var(--muted); }
html[data-theme="new"] .calibration-route-summary > span {
padding: 4px 10px; border-radius: 0; font-size: 11.5px; font-weight: 700;
color: var(--nt-warn-fg); border-color: var(--nt-warn); background: transparent;
}
html[data-theme="new"] .calibration-route-summary > span.ready { color: var(--nt-ok); border-color: var(--nt-ok); }
html[data-theme="new"] .calibration-route-summary > span.busy { color: var(--accent); border-color: var(--accent); }
html[data-theme="new"] .calibration-route-summary > span.attention { color: var(--nt-warn-fg); border-color: var(--nt-warn); }
html[data-theme="new"] .calibration-guided .calibration-route {
padding: 18px 16px 22px; background: var(--nt-bg2); border-color: var(--border); border-radius: 0;
}
html[data-theme="new"] .calibration-route span {
padding: 8px 10px; border-radius: 0; border-color: var(--nt-ctl);
background: var(--card); color: var(--muted); font-size: 11.5px;
}
html[data-theme="new"] .calibration-route strong { color: var(--fg); font-size: 13px; font-weight: 700; }
html[data-theme="new"] .calibration-route-tube { height: 2px; border-radius: 0; background: var(--nt-ctl); }
html[data-theme="new"] .calibration-route-tube small { top: 10px; font-size: 11px; color: var(--nt-label); }
html[data-theme="new"] .calibration-tip-marker {
color: var(--accent-fg); background: var(--accent); border-color: var(--nt-bg2);
}
html[data-theme="new"] .calibration-route.paused .calibration-tip-marker {
color: var(--nt-on-color); background: var(--nt-warn-hi);
}
html[data-theme="new"] .calibration-route.unknown .calibration-tip-marker {
color: var(--nt-warn-fg); background: var(--nt-warn-bg); border-color: var(--nt-warn);
}
html[data-theme="new"] .calibration-route.moving .calibration-tip-marker { animation-name: nt-calibration-tip-pulse; }
@keyframes nt-calibration-tip-pulse {
50% { box-shadow: 0 0 0 6px rgba(var(--accent-rgb), .18); }
}
html[data-theme="new"] .calibration-route-caption {
padding: 10px 16px; margin-bottom: 16px; font-size: 12px;
color: var(--muted); background: var(--card); border-color: var(--border); border-radius: 0;
}
html[data-theme="new"] .calibration-route-caption strong { color: var(--fg); }
html[data-theme="new"] .calibration-glossary summary { color: var(--accent); }
html[data-theme="new"] .calibration-glossary dt { color: var(--fg); }

/* stopped / returning bar */
html[data-theme="new"] .calibration-recovery {
margin-bottom: 16px; padding: 14px 16px; border-radius: 0;
border: 1px solid var(--nt-warn); background: var(--nt-warn-bg);
box-shadow: inset 2px 0 0 var(--nt-warn-hi);
}
html[data-theme="new"] .calibration-recovery > div:first-child { color: var(--nt-fg2); font-size: 12.5px; }
html[data-theme="new"] .calibration-recovery strong { color: var(--nt-warn-fg); font-size: 14px; }

/* workflow shell + its four tabs */
html[data-theme="new"] .calibration-workflow { background: var(--card); border-color: var(--border); border-radius: 0; }
html[data-theme="new"] .calibration-workflow-tabs { background: var(--nt-bg2); border-bottom-color: var(--border); }
html[data-theme="new"] .calibration-workflow-tabs button {
padding: 12px 16px; color: var(--muted); border-right-color: var(--border);
}
html[data-theme="new"] .calibration-workflow-tabs button:hover { background: rgba(var(--nt-tint), .03); }
html[data-theme="new"] .calibration-workflow-tabs button.active {
color: var(--accent); background: var(--card); box-shadow: inset 0 -2px 0 var(--accent);
}
html[data-theme="new"] .calibration-workflow-tabs strong { font-size: 13.5px; font-weight: 600; color: var(--fg); }
html[data-theme="new"] .calibration-workflow-tabs button.active strong { color: var(--accent); }
html[data-theme="new"] .calibration-workflow-tabs small { font-size: 11.5px; }
html[data-theme="new"] .calibration-workflow-body { padding: 20px; }

/* panel heading */
html[data-theme="new"] .calibration-task-heading > div > small {
margin-bottom: 4px; font-size: 12px; font-weight: 400; letter-spacing: 0;
text-transform: none; color: var(--nt-label);
}
html[data-theme="new"] .calibration-task-heading h3 {
margin: 0 0 4px; font-size: 17px; font-weight: 600;
text-transform: none; letter-spacing: 0; color: var(--fg);
}
html[data-theme="new"] .calibration-task-heading p { font-size: 12.5px; color: var(--muted); }
html[data-theme="new"] .calibration-task-heading > span {
padding: 4px 10px; border-radius: 0; font-size: 11.5px;
color: var(--accent); border-color: var(--accent);
}

/* route choices (ACE, slot, toolhead, save-for) */
html[data-theme="new"] .calibration-selector-block > label { font-size: 12px; color: var(--muted); }
html[data-theme="new"] .calibration-route-option {
padding: 10px 12px; border-radius: 0; color: var(--fg);
background: var(--nt-input); border: 1px solid var(--nt-ctl);
}
html[data-theme="new"] .calibration-route-option strong { font-size: 13.5px; font-weight: 700; }
html[data-theme="new"] .calibration-route-option small { font-size: 11.5px; color: var(--muted); }
html[data-theme="new"] .calibration-route-option:hover:not(:disabled) { border-color: var(--accent); }
html[data-theme="new"] .calibration-route-option.selected {
border-color: var(--accent); background: var(--nt-sel); box-shadow: inset 2px 0 0 var(--accent);
}
html[data-theme="new"] .calibration-route-option:disabled { opacity: 1; color: var(--nt-disabled); border-color: var(--nt-line); }
html[data-theme="new"] .calibration-route-option:disabled small { color: var(--nt-disabled); }
html[data-theme="new"] .calibration-route-option.selected:disabled { border-color: var(--nt-ctl); box-shadow: inset 2px 0 0 var(--nt-ctl); color: var(--nt-fg2); }

/* check list: a line each, the state carried by the mark */
html[data-theme="new"] .calibration-checks { gap: 0 24px; }
html[data-theme="new"] .calibration-checks div {
padding: 10px 0; border: 0; border-bottom: 1px solid var(--nt-line); border-radius: 0;
background: transparent; color: var(--muted); font-size: 12.5px;
}
html[data-theme="new"] .calibration-checks div::before { color: var(--nt-warn-fg); }
html[data-theme="new"] .calibration-checks div.ok { color: var(--fg); background: transparent; border-color: var(--nt-line); }
html[data-theme="new"] .calibration-checks div.ok::before { color: var(--nt-ok); }

/* step chips: a rule above, like the tab underline */
html[data-theme="new"] .calibration-steps { gap: 12px; margin: 14px 0; }
html[data-theme="new"] .calibration-steps div {
padding: 8px 0 0; border: 0; border-top: 2px solid var(--nt-ctl); border-radius: 0;
background: transparent; color: var(--nt-label); font-size: 12px;
}
html[data-theme="new"] .calibration-steps div.active { color: var(--accent); border-top-color: var(--accent); }
html[data-theme="new"] .calibration-steps div.done { color: var(--nt-ok); border-top-color: var(--nt-ok); }

/* value cells */
html[data-theme="new"] .calibration-metrics { gap: 0; border: 1px solid var(--border); }
html[data-theme="new"] .calibration-metrics div {
padding: 12px 16px; border: 0; border-right: 1px solid var(--border); border-radius: 0; background: var(--nt-bg2);
}
html[data-theme="new"] .calibration-metrics div:last-child { border-right: 0; }
html[data-theme="new"] .calibration-metrics small { font-size: 12px; text-transform: none; color: var(--nt-label); }
html[data-theme="new"] .calibration-metrics strong { font-size: 18px; font-weight: 700; color: var(--fg); }
html[data-theme="new"] .calibration-metrics span { font-size: 11.5px; color: var(--muted); }

/* jog panels */
html[data-theme="new"] .calibration-jog-panel,
html[data-theme="new"] .calibration-fine-position {
padding: 14px 16px; border-radius: 0; background: var(--nt-bg2); border-color: var(--border);
}
html[data-theme="new"] .calibration-fine-position { border-color: var(--nt-warn); }
html[data-theme="new"] .calibration-fine-head span,
html[data-theme="new"] .calibration-fine-row > span { font-size: 12px; color: var(--muted); }
html[data-theme="new"] .calibration-fine-row > strong { color: var(--fg); }

/* buttons: outlined by default, the accent fill for the one next step */
html[data-theme="new"] .calibration-jogs button,
html[data-theme="new"] .calibration-page .row button,
html[data-theme="new"] .calibration-hold {
min-height: 34px; padding: 0 14px; border-radius: 0; font-size: 12.5px;
color: var(--fg); background: transparent; border: 1px solid var(--nt-ctl);
}
html[data-theme="new"] .calibration-jogs button:hover:not(:disabled),
html[data-theme="new"] .calibration-page .row button:hover:not(:disabled),
html[data-theme="new"] .calibration-hold:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
html[data-theme="new"] .calibration-page .row button.primary {
min-height: 40px; padding: 0 18px; font-weight: 700;
color: var(--accent-fg); background: var(--accent); border-color: var(--accent);
}
html[data-theme="new"] .calibration-page .row button.primary:hover:not(:disabled) {
color: var(--accent-fg); background: var(--accent-hi); border-color: var(--accent-hi);
}
html[data-theme="new"] .calibration-page .row button.warn,
html[data-theme="new"] .calibration-jogs button.warn {
color: var(--nt-danger-fg); border-color: var(--nt-danger); background: transparent;
}
html[data-theme="new"] .calibration-page .row button.warn:hover:not(:disabled) {
color: var(--nt-on-color); background: var(--nt-danger); border-color: var(--nt-danger);
}
html[data-theme="new"] .calibration-hold { min-width: 240px; min-height: 40px; font-weight: 600; }
html[data-theme="new"] .calibration-hold.holding,
html[data-theme="new"] .calibration-hold.holding:hover {
color: var(--accent-fg); background: var(--accent); border-color: var(--accent);
}
html[data-theme="new"] .calibration-page button:disabled { opacity: 1; }
html[data-theme="new"] .calibration-jogs button:disabled,
html[data-theme="new"] .calibration-page .row button:disabled,
html[data-theme="new"] .calibration-hold:disabled { color: var(--nt-disabled); border-color: var(--nt-line); }
html[data-theme="new"] .calibration-page .row button.primary:disabled {
color: var(--nt-main-dis-fg); background: var(--nt-main-dis-bg); border-color: var(--nt-main-dis-bg);
}

/* messages */
html[data-theme="new"] .calibration-notice,
html[data-theme="new"] .calibration-warning,
html[data-theme="new"] .calibration-success {
padding: 12px 16px; border-radius: 0; font-size: 12.5px; line-height: 1.5;
}
html[data-theme="new"] .calibration-notice { color: var(--muted); background: var(--nt-bg2); border-color: var(--border); }
html[data-theme="new"] .calibration-notice strong { color: var(--fg); }
html[data-theme="new"] .calibration-warning {
color: var(--nt-warn-fg); background: var(--nt-warn-bg); border: 1px solid var(--nt-warn);
box-shadow: inset 2px 0 0 var(--nt-warn-hi);
}
html[data-theme="new"] .calibration-success {
color: var(--fg); background: var(--nt-bg2); border: 1px solid var(--border);
box-shadow: inset 2px 0 0 var(--nt-ok);
}
html[data-theme="new"] .calibration-success strong { color: var(--nt-ok); }
html[data-theme="new"] .calibration-details { color: var(--muted); font-size: 12.5px; }
html[data-theme="new"] .calibration-panel p.muted { font-size: 12.5px; color: var(--muted); }
html[data-theme="new"] .calibration-details summary { color: var(--fg); }

/* results table */
html[data-theme="new"] .calibration-review { border: 1px solid var(--border); font-size: 13px; }
html[data-theme="new"] .calibration-review th {
padding: 10px 12px; font-size: 12px; font-weight: 400; color: var(--muted); border-bottom-color: var(--border);
}
html[data-theme="new"] .calibration-review td { padding: 10px 12px; border-bottom-color: var(--border); }
html[data-theme="new"] .calibration-review tr:last-child td { border-bottom: 0; }
html[data-theme="new"] .calibration-review td small { font-size: 11.5px; color: var(--muted); }
html[data-theme="new"] .calibration-review td.save { color: var(--accent); font-weight: 700; font-size: 14px; }
html[data-theme="new"] .calibration-review input {
height: 30px; border-radius: 0; color: var(--fg); background: var(--nt-input); border: 1px solid var(--nt-ctl);
}
html[data-theme="new"] .calibration-review input:focus { outline: none; border-color: var(--accent); }
@media (max-width: 760px) {
html[data-theme="new"] .calibration-workflow-body { padding: 14px 12px; }
html[data-theme="new"] .calibration-steps { gap: 8px; }
html[data-theme="new"] .calibration-steps div { font-size: 11px; }
}
@media (max-width: 560px) {
html[data-theme="new"] .calibration-guided .calibration-route { padding: 14px 12px; }
html[data-theme="new"] .calibration-route-tube { width: 2px; height: 34px; }
html[data-theme="new"] .calibration-route-tube small { top: 50%; }
html[data-theme="new"] .calibration-metrics div { border-right: 0; border-bottom: 1px solid var(--border); }
html[data-theme="new"] .calibration-metrics div:last-child { border-bottom: 0; }
html[data-theme="new"] .calibration-hold { min-width: 0; }
html[data-theme="new"] .calibration-review th,
html[data-theme="new"] .calibration-review td { padding: 8px 6px; }
html[data-theme="new"] .calibration-page .row button.primary { flex: 1 1 100%; }
}

/* ---- Light shade: surfaces the new design inherits from style.css ----
style.css paints these with fixed dark colours. The dark shade lives
with that, the light one replaces them here. Kept at the end of the file
Expand Down
Loading
Loading