Action Successful
Hue&Sat
#4F46E5
rgb(79, 70, 229) hsl(243°, 75%, 59%) cmyk(66%, 69%, 0%, 10%)
HUE
SAT
LUM
0/14
Avg Contrast - Pairwise score
Completeness - Palette size
Gradient - Hue spread
Chroma - Expressiveness
L/D Balance - Ratio
Comp. Suggestion
-

Palette

Generated Shades

// Reed-Solomon GF(256) with prime poly 0x11d const GF_EXP = new Uint8Array(512); const GF_LOG = new Uint8Array(256); (() => { let x = 1; for (let i = 0; i < 255; i++) { GF_EXP[i] = x; GF_LOG[x] = i; x <<= 1; if (x & 256) x ^= 0x11d; } for (let i = 255; i < 512; i++) GF_EXP[i] = GF_EXP[i - 255]; })(); const gfMul = (a, b) => a && b ? GF_EXP[GF_LOG[a] + GF_LOG[b]] : 0; const gfPoly = (ec) => { let p = [1]; for (let i = 0; i < ec; i++) { const q = [1, GF_EXP[i]]; const r = new Uint8Array(p.length + 1); for (let j = 0; j < p.length; j++) for (let k = 0; k < q.length; k++) r[j + k] ^= gfMul(p[j], q[k]); p = Array.from(r); } return p.slice(1); }; const rsEncode = (data, ec) => { const gen = gfPoly(ec); const res = new Uint8Array(data.length + ec); res.set(data); for (let i = 0; i < data.length; i++) { const c = res[i]; if (c) for (let j = 0; j < gen.length; j++) res[i + 1 + j] ^= gfMul(gen[j], c); } return Array.from(res.slice(data.length)); }; // Version/ECC table: [version, ecWords, dataCapacity(bytes), remainder] const VER = [ [1,10,16,0],[2,16,28,7],[3,26,44,7],[4,18,64,7],[5,24,86,7], [6,16,108,7],[7,18,124,0],[8,22,154,0],[9,22,182,0],[10,26,216,0] ]; // Alignment pattern positions per version const ALIGN = [[],[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46]]; function makeMatrix(ver) { const size = ver * 4 + 17; const m = Array.from({length:size},()=>new Int8Array(size).fill(-1)); const set = (r,c,v) => { if(r>=0&&r=0&&c { for (let r=-1;r<=7;r++) for (let c=-1;c<=7;c++) { const v = r<0||r>6||c<0||c>6 ? 0 : r===0||r===6||c===0||c===6 ? 1 : r>=2&&r<=4&&c>=2&&c<=4 ? 1 : 0; set(tr+r, tc+c, v); } }; finder(0,0); finder(0,size-7); finder(size-7,0); // Timing for (let i=8;i=0;i--) bits.push((fmt>>i)&1); // Place format bits const pos = [0,1,2,3,4,5,7,8]; // rows/cols around finder for (let i=0;i<6;i++) { m[8][pos[i]]=bits[i]; m[pos[i]][8]=bits[14-i]; } m[8][7]=bits[6]; m[8][8]=bits[7]; m[7][8]=bits[8]; for (let i=0;i<7;i++) { m[size-1-i][8]=bits[i]; m[8][size-6+i]=bits[14-i]; } } function placeData(m, bits) { const size = m.length; let bi = 0; let up = true; for (let col = size-1; col >= 1; col -= 2) { if (col === 6) col = 5; for (let row = up ? size-1 : 0; up ? row>=0 : row { for(let i=n-1;i>=0;i--) bits.push((val>>i)&1); }; addBits(0b0100, 4); // byte mode addBits(len, 8); bytes.forEach(b => addBits(b, 8)); // Terminator for (let i=0;i<4&&bits.length addBits.call({push:b=>finalBits.push(b)}, w, 8) || (() => { for(let i=7;i>=0;i--) finalBits.push((w>>i)&1); })()); // Rebuild finalBits properly const fb = []; allWords.forEach(w => { for(let i=7;i>=0;i--) fb.push((w>>i)&1); }); for (let i=0;i<(VER[ver-1][3]||0);i++) fb.push(0); // Build matrix const m = makeMatrix(ver); placeData(m, fb); // Apply mask 0: (row+col)%2===0 const size = m.length; for (let r=0;rnew Uint8Array(size)); for(let r=0;r