control-page-v3.html 26 KB

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