(function attachPyroToolCatalog(root) {
  'use strict';

  const TablerIcons = root.PyroTablerIcons || (typeof require === 'function' ? require('../ui/tabler-icons.js') : null);

  const names = Object.freeze({
    pencil: 'Stift', brush: 'Pinsel', eraser: 'Radierer', 'color-eraser': 'Farbradierer', line: 'Linie', polyline: 'Polylinie', rectangle: 'Rechteck',
    'rounded-rectangle': 'Abgerundetes Rechteck', ellipse: 'Ellipse', polygon: 'Polygon', arrow: 'Pfeil',
    'block-arrow': 'Blockpfeil', 'beveled-rectangle': 'Abgeschrägtes Rechteck', 'chamfer-rectangle': 'Chamfer-Rechteck',
    'connector-line': 'Verbinderlinie', doughnut: 'Ring', 'l-shape': 'L-Form', measure: 'Maßband', pie: 'Tortensegment',
    'smart-polygon': 'Intelligentes Polygon', spiral: 'Spirale', star: 'Stern', text: 'Text', 'vector-emoji': 'Vektor-Emoji', 'vector-flag': 'Landesflagge', 'text-outline': 'Textpfad', image: 'Bild', group: 'Gruppe', marquee: 'Rechteckauswahl', 'ellipse-marquee': 'Ellipsenauswahl', lasso: 'Lasso', 'polygon-lasso': 'Polygon-Lasso', wand: 'Zauberstab', crop: 'Zuschneiden',
    'vector-select': 'Vektorzeiger', knife: 'Messer', pen: 'Zeichenfeder', freeform: 'Freiform', 'reshape-area': 'Bereich formen',
    'path-scrubber-add': 'Pfadschrubber +', 'path-scrubber-subtract': 'Pfadschrubber −', 'compound-path': 'Vektorpfad', 'mask-group': 'Vektormaske', 'clip-group': 'Clipping-Gruppe', 'symbol-instance': 'Symbolinstanz',
    'red-eye': 'Rote Augen', clone: 'Klonen', heal: 'Heilen', 'spot-heal': 'Flecken entfernen', liquify: 'Verflüssigen',
    'mesh-warp': 'Ebenenverformung', 'shape-grid': 'Formgitter', 'puppet-warp': 'Gelenkverformung', 'stretch-area': 'Bereich strecken'
  });

  const eraserToolInfo = Object.freeze({
    eraser: {
      label: 'Radierer', title: 'Radierer – alle übermalten Pixel transparent machen (E)',
      tablerIcon: 'eraser'
    },
    'color-eraser': {
      label: 'Farbradierer', title: 'Farbradierer – die beim Ansetzen aufgenommene Farbe transparent malen',
      tablerIcon: 'droplet-off'
    }
  });

  const retouchToolInfo = Object.freeze({
    clone: { label: 'Klonen', title: 'Klonstempel – Alt-Klick setzt die Quelle (K)', tablerIcon: 'rubber-stamp' },
    heal: { label: 'Heilen', title: 'Heilpinsel – Alt-Klick setzt die Quelle (J)', tablerIcon: 'bandage' },
    'spot-heal': { label: 'Flecken entfernen', title: 'Bereichsreparatur – kleine Hautflecken ohne Klonquelle mit einem Klick entfernen', tablerIcon: 'sparkles' },
    'red-eye': { label: 'Rote Augen', title: 'Rote Augen entfernen (Y)', tablerIcon: 'eye-edit' }
  });

  const warpToolInfo = Object.freeze({
    liquify: { label: 'Verflüssigen', title: 'Verflüssigen – Pixel mit einem weichen Pinsel organisch verschieben', tablerIcon: 'wave-sine' },
    'mesh-warp': { label: 'Ebenenverformung', title: 'Ebenenverformung – die gesamte aktive Ebene über ein Kontrollgitter verformen', tablerIcon: 'mesh' },
    'shape-grid': { label: 'Formgitter', title: 'Formgitter – ein ausgewähltes Bitmap lokal und präzise verformen', tablerIcon: 'grid-dots' },
    'puppet-warp': { label: 'Gelenkverformung', title: 'Gelenkverformung – ein ausgewähltes Bitmap mit Gelenkpunkten verformen', tablerIcon: 'affiliate' },
    'stretch-area': { label: 'Bereich strecken', title: 'Bereich strecken – einen vertikalen oder horizontalen Bildstreifen strecken oder stauchen', tablerIcon: 'arrows-vertical' }
  });

  const marqueeToolInfo = Object.freeze({
    marquee: { label: 'Rechteckauswahl', title: 'Rechteckauswahl (M)', tablerIcon: 'square-dashed' },
    'ellipse-marquee': { label: 'Ellipsenauswahl', title: 'Ellipsenauswahl', tablerIcon: 'circle-dashed' },
    lasso: { label: 'Lasso', title: 'Lasso – freihändig ziehen', tablerIcon: 'lasso' },
    'polygon-lasso': { label: 'Polygon-Lasso', title: 'Polygon-Lasso – Punkte klicken, mit Enter oder Startpunkt schließen', tablerIcon: 'lasso-polygon' }
  });

  const lineToolInfo = Object.freeze({
    line: { label: 'Linie', title: 'Linie (L)', tablerIcon: 'stroke-straight' },
    polyline: { label: 'Polylinie', title: 'Polylinie – Punkte klicken, mit Enter oder Doppelklick beenden', tablerIcon: 'line', mirrored: false }
  });

  const pathModifierToolInfo = Object.freeze({
    freeform: {
      label: 'Freiform', title: 'Freiform – Pfadbereiche direkt ziehen oder schieben',
      tablerIcon: 'scribble'
    },
    'reshape-area': {
      label: 'Bereich formen', title: 'Bereich formen – Pfadpunkte im Pinselbereich mit weichem Abfall verziehen',
      tablerIcon: 'focus-2'
    },
    'path-scrubber-add': {
      label: 'Pfadschrubber +', title: 'Pfadschrubber additiv – lokale Konturstärke erhöhen',
      tablerIcon: 'pencil-plus'
    },
    'path-scrubber-subtract': {
      label: 'Pfadschrubber −', title: 'Pfadschrubber subtraktiv – lokale Konturstärke verringern',
      tablerIcon: 'pencil-minus'
    }
  });

  const shapeToolInfo = Object.freeze({
    rectangle: { label: 'Rechteck', title: 'Rechteck (R)', icon: '<rect x="4" y="5" width="16" height="14" rx=".5"/>' },
    ellipse: { label: 'Ellipse', title: 'Ellipse (O)', icon: '<ellipse cx="12" cy="12" rx="8" ry="6.5"/>' },
    polygon: { label: 'Polygon', title: 'Polygon zeichnen', icon: '<path d="m12 3 8 5.8-3.1 9.2H7.1L4 8.8 12 3Z"/>' },
    'block-arrow': { label: 'Blockpfeil', title: 'Gefüllter Blockpfeil', icon: '<path d="M3 9h9V5l9 7-9 7v-4H3Z"/>' },
    arrow: { label: 'Pfeil', title: 'Pfeil (A)', icon: '<path d="M4 18 18 6m-7 0h7v7"/>' },
    'beveled-rectangle': { label: 'Abgeschrägt', title: 'Abgeschrägtes Rechteck', icon: '<path d="m7 5 2-2h10l2 2v14l-2 2H5l-2-2V9Z"/>' },
    'connector-line': { label: 'Verbinder', title: 'Verbinderlinie', icon: '<path d="M4 5h7v14h9"/><circle cx="4" cy="5" r="1.4"/><circle cx="20" cy="19" r="1.4"/>' },
    doughnut: { label: 'Ring', title: 'Ring', icon: '<circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="3.4"/>' },
    'l-shape': { label: 'L-Form', title: 'L-Form', icon: '<path d="M5 4h6v10h8v6H5Z"/>' },
    measure: { label: 'Maßband', title: 'Maßband – misst die Strecke zwischen zwei Punkten', tablerIcon: 'ruler-3', icon: '<path d="M4 18 20 6M4 14l4 4m8-12 4 4"/><path d="M8 15.2 10 13.7m1.2-2.9 2-1.5"/>' },
    pie: { label: 'Torte', title: 'Tortensegment', tablerIcon: 'chart-pie', icon: '<path d="M12 12V4a8 8 0 0 1 8 8Z"/><path d="M12 12 4.7 15.3A8 8 0 1 0 12 4"/>' },
    'smart-polygon': { label: 'Intelligentes Polygon', title: 'Intelligentes Polygon', icon: '<path d="m12 3 7 4v10l-7 4-7-4V7Z"/>' },
    spiral: { label: 'Spirale', title: 'Spirale', tablerIcon: 'spiral', icon: '<path d="M12 12c3-3 7 1 5 5-2 4-9 3-10-2C6 9 13 5 17 9c4 4 0 11-6 11"/>' },
    star: { label: 'Stern', title: 'Stern', icon: '<path d="m12 3 2.7 5.7 6.3.8-4.6 4.4 1.2 6.2-5.6-3-5.6 3 1.2-6.2L3 9.5l6.3-.8Z"/>' },
    'vector-emoji': { label: 'Emoji', title: 'Noto SVG Emoji als Vektor einsetzen', tablerIcon: 'mood-smile' },
    'vector-flag': { label: 'Landesflagge', title: 'flag-icons-Landesflagge als Vektor einsetzen', tablerIcon: 'flag' }
  });

  const openVectorShapeTypes = new Set(['pencil', 'brush', 'eraser', 'line', 'polyline', 'arrow', 'connector-line', 'measure', 'spiral']);
  const cuttableVectorTypes = new Set(['pencil', 'brush', 'eraser', 'line', 'polyline', 'arrow']);
  const fillableVectorShapeTypes = new Set(['rectangle', 'rounded-rectangle', 'ellipse', 'polygon', 'pen', 'compound-path', 'block-arrow', 'beveled-rectangle', 'chamfer-rectangle', 'doughnut', 'l-shape', 'pie', 'smart-polygon', 'star']);
  const closedKnifeTypes = new Set([...fillableVectorShapeTypes]);
  const polygonConvertibleTypes = new Set(['rectangle', 'rounded-rectangle', 'beveled-rectangle', 'chamfer-rectangle']);
  const colorableVectorTypes = new Set([...openVectorShapeTypes, ...fillableVectorShapeTypes]);
  const DEFAULT_STROKE_TYPE = 'basic-soft-rounded';
  const strokeTypeInfo = Object.freeze({
    none: Object.freeze({ label: 'Keine', group: '', antialias: false, rounded: false }),
    'basic-hard': Object.freeze({ label: 'Harte Linie', group: 'Standard', antialias: false, rounded: false }),
    'basic-hard-rounded': Object.freeze({ label: 'Hart abgerundet', group: 'Standard', antialias: false, rounded: true }),
    'basic-soft': Object.freeze({ label: 'Weiche Linie', group: 'Standard', antialias: true, rounded: false }),
    'basic-soft-rounded': Object.freeze({ label: 'Weich abgerundet', group: 'Standard', antialias: true, rounded: true })
  });
  const normalizeStrokeType = (value) => Object.prototype.hasOwnProperty.call(strokeTypeInfo, value) ? value : DEFAULT_STROKE_TYPE;
  const strokeTypeDefinition = (value) => strokeTypeInfo[normalizeStrokeType(value)];
  const blendModes = Object.freeze([
    'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn',
    'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'
  ]);
  const blendModeSet = new Set(blendModes);
  const normalizeBlendMode = (value) => {
    const mode = String(value ?? '').trim().toLowerCase();
    return blendModeSet.has(mode) ? mode : 'normal';
  };
  const uiThemes = Object.freeze({ macos9: '#dddddd', 'modern-gray': '#d4d0c8', retro: '#d4d0c8', 'classic-gray': '#d4d0c8', classic: '#eef1f6', ocean: '#bfd0dd', warm: '#d8d0c3', graphite: '#2b2d31' });

  const api = Object.freeze({
    names, eraserToolInfo, retouchToolInfo, warpToolInfo, marqueeToolInfo, lineToolInfo, pathModifierToolInfo, shapeToolInfo,
    openVectorShapeTypes, cuttableVectorTypes, fillableVectorShapeTypes, closedKnifeTypes, polygonConvertibleTypes, colorableVectorTypes,
    DEFAULT_STROKE_TYPE, strokeTypeInfo, normalizeStrokeType, strokeTypeDefinition,
    blendModes, normalizeBlendMode,
    uiThemes
  });
  root.PyroToolCatalog = api;
  if (typeof module === 'object' && module?.exports) module.exports = api;
})(typeof globalThis !== 'undefined' ? globalThis : window);
