control-page-v4.html 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>BambuTrack Control - Bambu Studio Exact</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. }
  13. :root {
  14. --bg-main: #f5f5f5;
  15. --bg-white: #ffffff;
  16. --bg-light: #fafafa;
  17. --bg-hover: #f0f0f0;
  18. --text-primary: #333333;
  19. --text-secondary: #666666;
  20. --text-muted: #999999;
  21. --border: #e0e0e0;
  22. --border-light: #eeeeee;
  23. --accent: #00ae42;
  24. --accent-light: #e8f5e9;
  25. }
  26. body {
  27. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  28. background: var(--bg-main);
  29. color: var(--text-primary);
  30. font-size: 13px;
  31. }
  32. /* Main Layout */
  33. .main-layout {
  34. display: grid;
  35. grid-template-columns: 1fr 320px;
  36. height: 100vh;
  37. }
  38. /* Left Panel - Camera */
  39. .left-panel {
  40. display: flex;
  41. flex-direction: column;
  42. background: var(--bg-main);
  43. }
  44. .camera-header {
  45. display: flex;
  46. align-items: center;
  47. padding: 8px 12px;
  48. background: var(--bg-white);
  49. border-bottom: 1px solid var(--border);
  50. gap: 4px;
  51. }
  52. .camera-title {
  53. font-size: 12px;
  54. color: var(--text-secondary);
  55. margin-right: auto;
  56. }
  57. .camera-icon-btn {
  58. width: 28px;
  59. height: 28px;
  60. border: none;
  61. background: none;
  62. cursor: pointer;
  63. border-radius: 4px;
  64. display: flex;
  65. align-items: center;
  66. justify-content: center;
  67. }
  68. .camera-icon-btn:hover {
  69. background: var(--bg-hover);
  70. }
  71. .camera-icon-btn img {
  72. width: 18px;
  73. height: 18px;
  74. opacity: 0.6;
  75. }
  76. .camera-feed {
  77. flex: 1;
  78. background: #1a1a1a;
  79. display: flex;
  80. align-items: center;
  81. justify-content: center;
  82. color: #666;
  83. }
  84. /* Print Progress */
  85. .print-progress {
  86. background: var(--bg-white);
  87. border-top: 1px solid var(--border);
  88. padding: 12px 16px;
  89. }
  90. .progress-header {
  91. font-size: 11px;
  92. color: var(--text-muted);
  93. margin-bottom: 10px;
  94. }
  95. .progress-content {
  96. display: flex;
  97. gap: 12px;
  98. }
  99. .progress-thumb {
  100. width: 60px;
  101. height: 60px;
  102. background: var(--bg-light);
  103. border: 1px solid var(--border);
  104. border-radius: 6px;
  105. display: flex;
  106. align-items: center;
  107. justify-content: center;
  108. }
  109. .progress-thumb img {
  110. width: 40px;
  111. opacity: 0.5;
  112. }
  113. .progress-info {
  114. flex: 1;
  115. }
  116. .progress-name {
  117. font-weight: 500;
  118. margin-bottom: 2px;
  119. }
  120. .progress-status {
  121. color: var(--accent);
  122. font-size: 12px;
  123. margin-bottom: 6px;
  124. }
  125. .progress-bar-container {
  126. height: 4px;
  127. background: var(--border-light);
  128. border-radius: 2px;
  129. margin-bottom: 6px;
  130. }
  131. .progress-bar-fill {
  132. height: 100%;
  133. background: var(--accent);
  134. border-radius: 2px;
  135. width: 0%;
  136. }
  137. .progress-details {
  138. display: flex;
  139. gap: 16px;
  140. font-size: 11px;
  141. color: var(--text-muted);
  142. }
  143. .progress-actions {
  144. display: flex;
  145. flex-direction: column;
  146. gap: 4px;
  147. align-items: flex-end;
  148. }
  149. .progress-icons {
  150. display: flex;
  151. gap: 4px;
  152. }
  153. .progress-icon-btn {
  154. width: 24px;
  155. height: 24px;
  156. border: 1px solid var(--border);
  157. background: var(--bg-white);
  158. border-radius: 4px;
  159. cursor: pointer;
  160. font-size: 10px;
  161. color: var(--text-muted);
  162. }
  163. .progress-icon-btn:hover {
  164. background: var(--bg-hover);
  165. }
  166. /* Right Panel - Control */
  167. .right-panel {
  168. background: var(--bg-white);
  169. border-left: 1px solid var(--border);
  170. overflow-y: auto;
  171. display: flex;
  172. flex-direction: column;
  173. }
  174. .control-header {
  175. display: flex;
  176. align-items: center;
  177. padding: 8px 12px;
  178. border-bottom: 1px solid var(--border);
  179. gap: 8px;
  180. }
  181. .control-title {
  182. font-size: 13px;
  183. color: var(--text-primary);
  184. margin-right: auto;
  185. }
  186. .header-btn {
  187. padding: 4px 10px;
  188. font-size: 11px;
  189. border: none;
  190. border-radius: 4px;
  191. cursor: pointer;
  192. background: var(--accent);
  193. color: white;
  194. }
  195. .header-btn:hover {
  196. opacity: 0.9;
  197. }
  198. .control-content {
  199. padding: 12px;
  200. display: flex;
  201. flex-direction: column;
  202. gap: 16px;
  203. }
  204. /* Temperature Section */
  205. .temp-list {
  206. display: flex;
  207. flex-direction: column;
  208. gap: 4px;
  209. }
  210. .temp-row {
  211. display: flex;
  212. align-items: center;
  213. gap: 8px;
  214. padding: 6px 0;
  215. }
  216. .temp-icon {
  217. width: 20px;
  218. height: 20px;
  219. display: flex;
  220. align-items: center;
  221. justify-content: center;
  222. }
  223. .temp-icon img {
  224. width: 18px;
  225. height: 18px;
  226. opacity: 0.7;
  227. }
  228. .temp-badge {
  229. font-size: 10px;
  230. font-weight: 600;
  231. color: var(--accent);
  232. background: var(--accent-light);
  233. padding: 1px 4px;
  234. border-radius: 3px;
  235. }
  236. .temp-value {
  237. font-size: 15px;
  238. font-weight: 500;
  239. }
  240. .temp-target {
  241. font-size: 13px;
  242. color: var(--text-muted);
  243. }
  244. .temp-unit {
  245. font-size: 13px;
  246. color: var(--text-muted);
  247. }
  248. /* Air Condition */
  249. .air-row {
  250. display: flex;
  251. align-items: center;
  252. gap: 12px;
  253. padding: 8px 0;
  254. border-top: 1px solid var(--border-light);
  255. }
  256. .air-label {
  257. display: flex;
  258. align-items: center;
  259. gap: 6px;
  260. font-size: 12px;
  261. color: var(--text-secondary);
  262. }
  263. .air-label img {
  264. width: 16px;
  265. height: 16px;
  266. opacity: 0.6;
  267. }
  268. .air-item {
  269. display: flex;
  270. align-items: center;
  271. gap: 6px;
  272. padding: 6px 12px;
  273. background: var(--bg-light);
  274. border-radius: 6px;
  275. cursor: pointer;
  276. }
  277. .air-item:hover {
  278. background: var(--bg-hover);
  279. }
  280. .air-item img {
  281. width: 16px;
  282. height: 16px;
  283. opacity: 0.6;
  284. }
  285. .lamp-dot {
  286. width: 10px;
  287. height: 10px;
  288. border-radius: 50%;
  289. background: var(--accent);
  290. }
  291. /* Movement Section */
  292. .movement-section {
  293. display: flex;
  294. gap: 12px;
  295. padding-top: 8px;
  296. border-top: 1px solid var(--border-light);
  297. }
  298. .jog-area {
  299. display: flex;
  300. flex-direction: column;
  301. align-items: center;
  302. gap: 8px;
  303. }
  304. .nozzle-toggle {
  305. display: flex;
  306. border-radius: 6px;
  307. overflow: hidden;
  308. border: 1px solid var(--border);
  309. }
  310. .nozzle-toggle button {
  311. padding: 4px 16px;
  312. border: none;
  313. background: var(--bg-white);
  314. font-size: 11px;
  315. cursor: pointer;
  316. color: var(--text-secondary);
  317. }
  318. .nozzle-toggle button.active {
  319. background: var(--accent);
  320. color: white;
  321. }
  322. .jog-pad {
  323. position: relative;
  324. width: 120px;
  325. height: 120px;
  326. }
  327. .jog-ring {
  328. width: 100%;
  329. height: 100%;
  330. border-radius: 50%;
  331. background: var(--bg-light);
  332. border: 1px solid var(--border);
  333. position: relative;
  334. }
  335. .jog-label {
  336. position: absolute;
  337. font-size: 10px;
  338. color: var(--text-muted);
  339. }
  340. .jog-label.y-plus { top: 8px; left: 50%; transform: translateX(-50%); }
  341. .jog-label.y-minus { bottom: 8px; left: 50%; transform: translateX(-50%); }
  342. .jog-label.x-minus { left: 8px; top: 50%; transform: translateY(-50%); }
  343. .jog-label.x-plus { right: 8px; top: 50%; transform: translateY(-50%); }
  344. .jog-btn {
  345. position: absolute;
  346. width: 24px;
  347. height: 24px;
  348. background: var(--bg-white);
  349. border: 1px solid var(--border);
  350. border-radius: 4px;
  351. cursor: pointer;
  352. font-size: 10px;
  353. color: var(--text-secondary);
  354. }
  355. .jog-btn:hover {
  356. background: var(--accent);
  357. color: white;
  358. border-color: var(--accent);
  359. }
  360. .jog-btn.up { top: 20px; left: 50%; transform: translateX(-50%); }
  361. .jog-btn.down { bottom: 20px; left: 50%; transform: translateX(-50%); }
  362. .jog-btn.left { left: 20px; top: 50%; transform: translateY(-50%); }
  363. .jog-btn.right { right: 20px; top: 50%; transform: translateY(-50%); }
  364. .jog-home {
  365. position: absolute;
  366. top: 50%;
  367. left: 50%;
  368. transform: translate(-50%, -50%);
  369. width: 36px;
  370. height: 36px;
  371. border-radius: 50%;
  372. background: var(--accent);
  373. border: none;
  374. cursor: pointer;
  375. }
  376. .jog-home img {
  377. width: 18px;
  378. height: 18px;
  379. filter: brightness(0) invert(1);
  380. }
  381. .step-col {
  382. display: flex;
  383. flex-direction: column;
  384. gap: 2px;
  385. font-size: 10px;
  386. }
  387. .step-btn {
  388. padding: 4px 8px;
  389. background: var(--bg-light);
  390. border: 1px solid var(--border);
  391. border-radius: 4px;
  392. cursor: pointer;
  393. color: var(--text-secondary);
  394. font-size: 10px;
  395. }
  396. .step-btn:hover, .step-btn.active {
  397. background: var(--bg-hover);
  398. color: var(--text-primary);
  399. }
  400. .step-label {
  401. text-align: center;
  402. color: var(--text-muted);
  403. padding: 2px 0;
  404. }
  405. /* Extruder */
  406. .extruder-area {
  407. display: flex;
  408. flex-direction: column;
  409. align-items: center;
  410. gap: 4px;
  411. }
  412. .extruder-label {
  413. font-size: 10px;
  414. color: var(--text-muted);
  415. }
  416. .extruder-graphic {
  417. height: 80px;
  418. }
  419. .extruder-graphic img {
  420. height: 100%;
  421. }
  422. .extruder-btns {
  423. display: flex;
  424. flex-direction: column;
  425. gap: 2px;
  426. }
  427. .ext-btn {
  428. width: 24px;
  429. height: 20px;
  430. background: var(--bg-light);
  431. border: 1px solid var(--border);
  432. border-radius: 4px;
  433. cursor: pointer;
  434. font-size: 9px;
  435. color: var(--text-secondary);
  436. }
  437. .ext-btn:hover {
  438. background: var(--bg-hover);
  439. }
  440. /* AMS Nozzle Colors */
  441. .nozzle-colors-row {
  442. display: flex;
  443. gap: 8px;
  444. padding: 8px 0;
  445. border-top: 1px solid var(--border-light);
  446. }
  447. .nozzle-color-box {
  448. flex: 1;
  449. display: flex;
  450. align-items: center;
  451. gap: 4px;
  452. padding: 6px 10px;
  453. background: var(--bg-light);
  454. border: 1px solid var(--border);
  455. border-radius: 6px;
  456. }
  457. .nozzle-color-box.active {
  458. border-color: var(--accent);
  459. }
  460. .color-dot {
  461. width: 14px;
  462. height: 14px;
  463. border-radius: 3px;
  464. border: 1px solid rgba(0,0,0,0.1);
  465. }
  466. .color-dot.empty {
  467. background: var(--bg-light) !important;
  468. border: 1px dashed var(--border);
  469. }
  470. /* AMS Section */
  471. .ams-section {
  472. border-top: 1px solid var(--border-light);
  473. padding-top: 12px;
  474. }
  475. .ams-header-row {
  476. display: flex;
  477. align-items: center;
  478. gap: 8px;
  479. margin-bottom: 8px;
  480. }
  481. .ams-humidity {
  482. display: flex;
  483. align-items: center;
  484. gap: 4px;
  485. font-size: 11px;
  486. color: var(--text-muted);
  487. }
  488. .ams-humidity img {
  489. width: 12px;
  490. height: 12px;
  491. opacity: 0.5;
  492. }
  493. .ams-slots-row {
  494. display: flex;
  495. gap: 4px;
  496. margin-bottom: 8px;
  497. }
  498. .ams-slot-label {
  499. font-size: 9px;
  500. color: var(--text-muted);
  501. display: flex;
  502. align-items: center;
  503. gap: 2px;
  504. }
  505. .ams-slots {
  506. display: flex;
  507. gap: 6px;
  508. }
  509. .ams-slot {
  510. width: 52px;
  511. border: 2px solid var(--border);
  512. border-radius: 8px;
  513. overflow: hidden;
  514. cursor: pointer;
  515. background: var(--bg-white);
  516. }
  517. .ams-slot:hover {
  518. border-color: var(--text-muted);
  519. }
  520. .ams-slot.active {
  521. border-color: var(--accent);
  522. }
  523. .ams-slot-color {
  524. height: 36px;
  525. display: flex;
  526. align-items: flex-end;
  527. justify-content: center;
  528. padding-bottom: 4px;
  529. }
  530. .ams-slot-color img {
  531. width: 14px;
  532. height: 14px;
  533. opacity: 0.5;
  534. }
  535. .ams-slot-info {
  536. background: var(--bg-light);
  537. padding: 4px;
  538. text-align: center;
  539. border-top: 1px solid var(--border-light);
  540. }
  541. .ams-slot-type {
  542. font-size: 10px;
  543. font-weight: 600;
  544. color: var(--text-primary);
  545. }
  546. /* AMS Connector Lines */
  547. .ams-connector {
  548. display: flex;
  549. justify-content: center;
  550. padding: 8px 0;
  551. position: relative;
  552. }
  553. .connector-lines {
  554. display: flex;
  555. gap: 20px;
  556. }
  557. .connector-line {
  558. width: 2px;
  559. height: 20px;
  560. background: var(--border);
  561. }
  562. .connector-hub {
  563. position: absolute;
  564. bottom: 0;
  565. display: flex;
  566. align-items: center;
  567. gap: 4px;
  568. }
  569. /* External Spool */
  570. .ext-spool-row {
  571. display: flex;
  572. align-items: center;
  573. gap: 8px;
  574. padding: 8px 0;
  575. }
  576. .ext-label {
  577. font-size: 11px;
  578. color: var(--text-muted);
  579. width: 24px;
  580. }
  581. .ext-slot {
  582. width: 52px;
  583. height: 52px;
  584. background: var(--bg-light);
  585. border: 1px solid var(--border);
  586. border-radius: 8px;
  587. display: flex;
  588. flex-direction: column;
  589. align-items: center;
  590. justify-content: center;
  591. font-size: 16px;
  592. color: var(--text-muted);
  593. cursor: pointer;
  594. }
  595. .ext-slot:hover {
  596. background: var(--bg-hover);
  597. }
  598. .ext-slot-label {
  599. font-size: 8px;
  600. }
  601. .spool-graphic {
  602. flex: 1;
  603. height: 52px;
  604. display: flex;
  605. align-items: center;
  606. justify-content: center;
  607. }
  608. .spool-graphic img {
  609. height: 45px;
  610. opacity: 0.8;
  611. }
  612. /* AMS Buttons */
  613. .ams-actions {
  614. display: flex;
  615. gap: 8px;
  616. padding-top: 8px;
  617. }
  618. .ams-action-btn {
  619. padding: 6px 12px;
  620. font-size: 11px;
  621. border-radius: 6px;
  622. cursor: pointer;
  623. }
  624. .ams-action-btn.auto {
  625. background: var(--bg-light);
  626. border: 1px solid var(--border);
  627. color: var(--text-secondary);
  628. display: flex;
  629. align-items: center;
  630. gap: 4px;
  631. }
  632. .ams-action-btn.auto img {
  633. width: 14px;
  634. height: 14px;
  635. opacity: 0.5;
  636. }
  637. .ams-action-btn.auto:hover {
  638. background: var(--bg-hover);
  639. }
  640. .ams-spacer {
  641. flex: 1;
  642. }
  643. .ams-action-btn.unload {
  644. background: var(--bg-light);
  645. border: 1px solid var(--border);
  646. color: var(--text-secondary);
  647. }
  648. .ams-action-btn.unload:hover {
  649. background: var(--bg-hover);
  650. }
  651. .ams-action-btn.load {
  652. background: var(--accent);
  653. border: none;
  654. color: white;
  655. }
  656. .ams-action-btn.load:hover {
  657. opacity: 0.9;
  658. }
  659. /* Hub Graphic */
  660. .hub-area {
  661. display: flex;
  662. justify-content: center;
  663. padding: 12px 0;
  664. }
  665. .hub-graphic {
  666. display: flex;
  667. align-items: center;
  668. gap: 4px;
  669. }
  670. .hub-line {
  671. width: 30px;
  672. height: 2px;
  673. background: var(--border);
  674. }
  675. .hub-box {
  676. padding: 4px 12px;
  677. background: var(--bg-light);
  678. border: 1px solid var(--border);
  679. border-radius: 4px;
  680. font-size: 10px;
  681. color: var(--text-muted);
  682. }
  683. </style>
  684. </head>
  685. <body>
  686. <div class="main-layout">
  687. <!-- Left Panel -->
  688. <div class="left-panel">
  689. <div class="camera-header">
  690. <span class="camera-title">Camera</span>
  691. <button class="camera-icon-btn"><img src="icons/video-camera.svg" alt=""></button>
  692. <button class="camera-icon-btn"><img src="icons/webcam.svg" alt=""></button>
  693. <button class="camera-icon-btn"><img src="icons/settings.svg" alt=""></button>
  694. <button class="camera-icon-btn"><img src="icons/reload.svg" alt=""></button>
  695. </div>
  696. <div class="camera-feed">
  697. Camera Feed
  698. </div>
  699. <div class="print-progress">
  700. <div class="progress-header">Printing Progress</div>
  701. <div class="progress-content">
  702. <div class="progress-thumb">
  703. <img src="icons/micro-sd.svg" alt="">
  704. </div>
  705. <div class="progress-info">
  706. <div class="progress-name">N/A</div>
  707. <div class="progress-status">N/A</div>
  708. <div class="progress-bar-container">
  709. <div class="progress-bar-fill"></div>
  710. </div>
  711. <div class="progress-details">
  712. <span>Layer: N/A &nbsp; N/A</span>
  713. </div>
  714. <div class="progress-details" style="margin-top: 4px;">
  715. <span>Estimated finish time: N/A</span>
  716. </div>
  717. </div>
  718. <div class="progress-actions">
  719. <div class="progress-icons">
  720. <button class="progress-icon-btn">⌂</button>
  721. <button class="progress-icon-btn">⏸</button>
  722. <button class="progress-icon-btn">⏹</button>
  723. </div>
  724. </div>
  725. </div>
  726. </div>
  727. </div>
  728. <!-- Right Panel -->
  729. <div class="right-panel">
  730. <div class="control-header">
  731. <span class="control-title">Control</span>
  732. <button class="header-btn">Printer Parts</button>
  733. <button class="header-btn">Print Options</button>
  734. <button class="header-btn">Calibration</button>
  735. </div>
  736. <div class="control-content">
  737. <!-- Temperature -->
  738. <div class="temp-list">
  739. <div class="temp-row">
  740. <div class="temp-icon"><img src="icons/hotend.svg" alt=""></div>
  741. <span class="temp-badge">L</span>
  742. <span class="temp-value">22</span>
  743. <span class="temp-target">/0</span>
  744. <span class="temp-unit">°C</span>
  745. </div>
  746. <div class="temp-row">
  747. <div class="temp-icon"><img src="icons/hotend.svg" alt=""></div>
  748. <span class="temp-badge">R</span>
  749. <span class="temp-value">21</span>
  750. <span class="temp-target">/0</span>
  751. <span class="temp-unit">°C</span>
  752. </div>
  753. <div class="temp-row">
  754. <div class="temp-icon"><img src="icons/heatbed.svg" alt=""></div>
  755. <span class="temp-value">21</span>
  756. <span class="temp-target">/0</span>
  757. <span class="temp-unit">°C</span>
  758. </div>
  759. <div class="temp-row">
  760. <div class="temp-icon"><img src="icons/chamber.svg" alt=""></div>
  761. <span class="temp-value">21</span>
  762. <span class="temp-target">/0</span>
  763. <span class="temp-unit">°C</span>
  764. </div>
  765. </div>
  766. <!-- Air Condition -->
  767. <div class="air-row">
  768. <div class="air-label">
  769. <img src="icons/ventilation.svg" alt="">
  770. Air Condition
  771. </div>
  772. <div class="air-item">
  773. <img src="icons/ventilation.svg" alt="">
  774. <span>100%</span>
  775. </div>
  776. <div class="air-item">
  777. <span>Lamp</span>
  778. <div class="lamp-dot"></div>
  779. </div>
  780. </div>
  781. <!-- Movement -->
  782. <div class="movement-section">
  783. <div class="jog-area">
  784. <div class="jog-pad">
  785. <div class="jog-ring">
  786. <span class="jog-label y-plus">Y</span>
  787. <span class="jog-label y-minus">-Y</span>
  788. <span class="jog-label x-minus">-X</span>
  789. <span class="jog-label x-plus">X</span>
  790. <button class="jog-btn up">▲</button>
  791. <button class="jog-btn down">▼</button>
  792. <button class="jog-btn left">◀</button>
  793. <button class="jog-btn right">▶</button>
  794. <button class="jog-home">
  795. <img src="icons/home.svg" alt="">
  796. </button>
  797. </div>
  798. </div>
  799. </div>
  800. <div class="step-col">
  801. <button class="step-btn">↑ 10</button>
  802. <button class="step-btn active">↑ 1</button>
  803. <span class="step-label">Bed</span>
  804. <button class="step-btn">↓ 1</button>
  805. <button class="step-btn">↓ 10</button>
  806. </div>
  807. <div class="extruder-area">
  808. <div class="nozzle-toggle">
  809. <button class="active">Left</button>
  810. <button>Right</button>
  811. </div>
  812. <div class="extruder-graphic">
  813. <img src="icons/dual-extruder.png" alt="">
  814. </div>
  815. <span class="extruder-label">Extruder</span>
  816. <div class="extruder-btns">
  817. <button class="ext-btn">▲</button>
  818. <button class="ext-btn">▼</button>
  819. </div>
  820. </div>
  821. </div>
  822. <!-- Nozzle Color Assignment -->
  823. <div class="nozzle-colors-row">
  824. <div class="nozzle-color-box active">
  825. <div class="color-dot" style="background: #FFD700;"></div>
  826. <div class="color-dot" style="background: #8B4513;"></div>
  827. <div class="color-dot" style="background: #1a1a1a;"></div>
  828. <div class="color-dot" style="background: #222;"></div>
  829. </div>
  830. <div class="nozzle-color-box">
  831. <div class="color-dot empty"></div>
  832. </div>
  833. </div>
  834. <!-- AMS -->
  835. <div class="ams-section">
  836. <div class="ams-header-row">
  837. <div class="ams-humidity">
  838. <img src="icons/water.svg" alt="">
  839. 18 %
  840. </div>
  841. <div class="ams-humidity">
  842. </div>
  843. </div>
  844. <div class="ams-slots-row">
  845. <span class="ams-slot-label">A1 <img src="icons/reload.svg" style="width:10px;opacity:0.4"></span>
  846. <span class="ams-slot-label">A2 <img src="icons/reload.svg" style="width:10px;opacity:0.4"></span>
  847. <span class="ams-slot-label">A3 <img src="icons/reload.svg" style="width:10px;opacity:0.4"></span>
  848. <span class="ams-slot-label">A4 <img src="icons/reload.svg" style="width:10px;opacity:0.4"></span>
  849. <span style="flex:1"></span>
  850. <span class="ams-slot-label">Ext</span>
  851. </div>
  852. <div style="display: flex; gap: 12px;">
  853. <div class="ams-slots">
  854. <div class="ams-slot active">
  855. <div class="ams-slot-color" style="background: linear-gradient(180deg, #FFD700 60%, #E6C200 100%);">
  856. <img src="icons/eye.svg" alt="">
  857. </div>
  858. <div class="ams-slot-info">
  859. <div class="ams-slot-type">PLA</div>
  860. </div>
  861. </div>
  862. <div class="ams-slot">
  863. <div class="ams-slot-color" style="background: linear-gradient(180deg, #1a1a1a 60%, #0a0a0a 100%);">
  864. <img src="icons/eye.svg" alt="" style="filter: invert(1);">
  865. </div>
  866. <div class="ams-slot-info">
  867. <div class="ams-slot-type">PETG</div>
  868. </div>
  869. </div>
  870. <div class="ams-slot">
  871. <div class="ams-slot-color" style="background: linear-gradient(180deg, #8B4513 60%, #6B3510 100%);">
  872. <img src="icons/eye.svg" alt="" style="filter: invert(1);">
  873. </div>
  874. <div class="ams-slot-info">
  875. <div class="ams-slot-type">PETG</div>
  876. </div>
  877. </div>
  878. <div class="ams-slot">
  879. <div class="ams-slot-color" style="background: linear-gradient(180deg, #222 60%, #111 100%);">
  880. <img src="icons/eye.svg" alt="" style="filter: invert(1);">
  881. </div>
  882. <div class="ams-slot-info">
  883. <div class="ams-slot-type">PLA</div>
  884. </div>
  885. </div>
  886. </div>
  887. <div style="display: flex; flex-direction: column; align-items: center; gap: 4px;">
  888. <div class="ext-slot">
  889. ?
  890. <span class="ext-slot-label">∠</span>
  891. </div>
  892. <div class="spool-graphic">
  893. <img src="icons/single-extruder1.png" alt="">
  894. </div>
  895. </div>
  896. </div>
  897. <!-- Actions -->
  898. <div class="ams-actions">
  899. <button class="ams-action-btn auto">
  900. Auto-refill
  901. <img src="icons/ams-settings.svg" alt="">
  902. </button>
  903. <div class="ams-spacer"></div>
  904. <button class="ams-action-btn unload">Unload</button>
  905. <button class="ams-action-btn load">Load</button>
  906. </div>
  907. <!-- Hub -->
  908. <div class="hub-area">
  909. <div class="hub-graphic">
  910. <div class="hub-line"></div>
  911. <div class="hub-box">HUB</div>
  912. <div class="hub-line"></div>
  913. </div>
  914. </div>
  915. </div>
  916. </div>
  917. </div>
  918. </div>
  919. </body>
  920. </html>