diff --git a/html/rfid.js b/html/rfid.js
index 826adc2..3761f51 100644
--- a/html/rfid.js
+++ b/html/rfid.js
@@ -215,20 +215,6 @@ document.addEventListener('filamentSelected', function (event) {
updateSpoolButtons(selectedText !== "Please choose...");
});
-// Hilfsfunktion für kontrastreiche Textfarbe
-function getContrastColor(hexcolor) {
- // Konvertiere Hex zu RGB
- const r = parseInt(hexcolor.substr(0,2),16);
- const g = parseInt(hexcolor.substr(2,2),16);
- const b = parseInt(hexcolor.substr(4,2),16);
-
- // Berechne Helligkeit (YIQ Formel)
- const yiq = ((r*299)+(g*587)+(b*114))/1000;
-
- // Return schwarz oder weiß basierend auf Helligkeit
- return (yiq >= 128) ? '#000000' : '#FFFFFF';
-}
-
function updateNfcInfo() {
const selectedText = document.getElementById("selected-filament").textContent;
const nfcInfo = document.getElementById("nfcInfo");
diff --git a/html/spoolman.js b/html/spoolman.js
index 5cc2f91..8193984 100644
--- a/html/spoolman.js
+++ b/html/spoolman.js
@@ -169,9 +169,32 @@ function updateFilamentDropdown(selectedSmId = null) {
option.setAttribute("data-value", spool.filament.id);
option.setAttribute("data-nfc-id", spool.extra.nfc_id || "");
- const colorHex = spool.filament.color_hex || 'FFFFFF';
+
+ // Generate color representation based on filament type (single or multi color)
+ let colorHTML = '';
+
+ // Check if this is a multicolor filament
+ if (spool.filament.multi_color_hexes) {
+ // Parse multi color hexes from comma-separated string
+ const colors = spool.filament.multi_color_hexes.replace(/#/g, '').split(',');
+
+ // Determine the display style based on direction
+ const direction = spool.filament.multi_color_direction || 'coaxial';
+
+ // Generate color circles for each color
+ colorHTML = '
';
+ colors.forEach(color => {
+ colorHTML += `
`;
+ });
+ colorHTML += '
';
+ } else {
+ // Single color filament
+ const colorHex = spool.filament.color_hex || 'FFFFFF';
+ colorHTML = ``;
+ }
+
option.innerHTML = `
-
+ ${colorHTML}
${spool.id} | ${spool.filament.name} (${spool.filament.material})
`;
@@ -190,7 +213,29 @@ function selectFilament(spool) {
const selectedText = document.getElementById("selected-filament");
const dropdownContent = document.getElementById("filament-dropdown-content");
- selectedColor.style.backgroundColor = `#${spool.filament.color_hex || 'FFFFFF'}`;
+ // Update the selected color display
+ if (spool.filament.multi_color_hexes) {
+ // Handle multicolor filament display in the selection header
+ const colors = spool.filament.multi_color_hexes.replace(/#/g, '').split(',');
+ const direction = spool.filament.multi_color_direction || 'coaxial';
+
+ // Replace the single color div with multiple color divs
+ selectedColor.innerHTML = '';
+ colors.forEach(color => {
+ const colorDiv = document.createElement('div');
+ colorDiv.className = `color-segment multi-color ${direction}`;
+ colorDiv.style.backgroundColor = `#${color}`;
+ selectedColor.appendChild(colorDiv);
+ });
+ // Add multiple color class to the container
+ selectedColor.classList.add('multi-color-container');
+ } else {
+ // Single color filament - reset to default display
+ selectedColor.innerHTML = '';
+ selectedColor.classList.remove('multi-color-container');
+ selectedColor.style.backgroundColor = `#${spool.filament.color_hex || 'FFFFFF'}`;
+ }
+
selectedText.textContent = `${spool.id} | ${spool.filament.name} (${spool.filament.material})`;
dropdownContent.classList.remove("show");
diff --git a/html/style.css b/html/style.css
index e2c12ac..e0f37aa 100644
--- a/html/style.css
+++ b/html/style.css
@@ -759,6 +759,50 @@ a:hover {
flex-shrink: 0;
}
+/* Multi-color filament styles */
+.option-colors {
+ display: flex;
+ flex-shrink: 0;
+ gap: 2px;
+}
+
+.multi-color {
+ width: 14px;
+ height: 14px;
+ border-radius: 50%;
+ border: 1px solid #333;
+}
+
+/* Coaxial pattern (horizontal stripes) */
+.multi-color.coaxial {
+ border-radius: 50%;
+ position: relative;
+}
+
+/* Longitudinal pattern (vertical stripes) */
+.multi-color.longitudinal {
+ border-radius: 50%;
+ position: relative;
+}
+
+/* Container for multiple colors in selected display */
+.multi-color-container {
+ display: flex !important;
+ background: none !important;
+ border: none !important;
+ gap: 2px;
+ align-items: center;
+ justify-content: flex-start;
+ width: auto !important;
+}
+
+.color-segment {
+ width: 16px;
+ height: 16px;
+ border-radius: 50%;
+ border: 1px solid #333;
+}
+
.notification {
position: fixed;
top: 20px;