{
  "id": "color-tool",
  "name": "Farb-Konverter",
  "version": "1.0.0",
  "type": "agent-tool",
  "author": "Astoris",
  "premium": false,
  "description": "Konvertiert Farben (HEX/RGB) nach HEX, RGB und HSL und prueft den WCAG-Kontrast zweier Farben.",
  "inputHint": "{ \"color\": \"#3366ff\", \"color2\": \"#ffffff\" }",
  "code": "async function run(input) {\n  var color = String((input && input.color) || '').trim();\n  var color2 = (input && input.color2) ? String(input.color2).trim() : '';\n  function parse(c) {\n    c = c.trim();\n    var m = c.match(/^#?([0-9a-fA-F]{3})$/);\n    if (m) {\n      var s = m[1];\n      return [parseInt(s[0] + s[0], 16), parseInt(s[1] + s[1], 16), parseInt(s[2] + s[2], 16)];\n    }\n    m = c.match(/^#?([0-9a-fA-F]{6})$/);\n    if (m) {\n      var h = m[1];\n      return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n    }\n    m = c.match(/^rgba?\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})/i);\n    if (m) {\n      return [Number(m[1]), Number(m[2]), Number(m[3])];\n    }\n    return null;\n  }\n  function toHex(rgb) {\n    return '#' + rgb.map(function (v) { return Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0'); }).join('');\n  }\n  function toHsl(rgb) {\n    var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255;\n    var max = Math.max(r, g, b), min = Math.min(r, g, b);\n    var hue = 0, sat = 0, lum = (max + min) / 2;\n    if (max !== min) {\n      var d = max - min;\n      sat = lum > 0.5 ? d / (2 - max - min) : d / (max + min);\n      if (max === r) hue = (g - b) / d + (g < b ? 6 : 0);\n      else if (max === g) hue = (b - r) / d + 2;\n      else hue = (r - g) / d + 4;\n      hue = hue / 6;\n    }\n    return 'hsl(' + Math.round(hue * 360) + ', ' + Math.round(sat * 100) + '%, ' + Math.round(lum * 100) + '%)';\n  }\n  function relLum(rgb) {\n    var a = rgb.map(function (v) {\n      var x = v / 255;\n      return x <= 0.03928 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n    });\n    return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n  }\n  var rgb1 = parse(color);\n  if (!rgb1) return { fehler: 'Farbe nicht erkannt. Erlaubt: #rrggbb, #rgb, rgb(r,g,b).' };\n  var result = {\n    hex: toHex(rgb1),\n    rgb: 'rgb(' + rgb1[0] + ', ' + rgb1[1] + ', ' + rgb1[2] + ')',\n    hsl: toHsl(rgb1)\n  };\n  if (color2) {\n    var rgb2 = parse(color2);\n    if (!rgb2) return { fehler: 'Zweite Farbe nicht erkannt.' };\n    var l1 = relLum(rgb1), l2 = relLum(rgb2);\n    var lighter = Math.max(l1, l2), darker = Math.min(l1, l2);\n    var ratio = (lighter + 0.05) / (darker + 0.05);\n    ratio = Math.round(ratio * 100) / 100;\n    result.kontrast = {\n      verhaeltnis: ratio,\n      AA_normal: ratio >= 4.5,\n      AA_gross: ratio >= 3,\n      AAA_normal: ratio >= 7\n    };\n  }\n  return result;\n}"
}
