export declare const PRINTFUL_THREAD_PALETTE: readonly ["#FFFFFF", "#000000", "#96A1A8", "#A67843", "#FFCC00", "#E25C27", "#CC3366", "#CC3333", "#660000", "#333366", "#005397", "#3399FF", "#6B5294", "#01784E", "#7BA35A"]; /** Max thread colors we attach per design — each extra color raises stitch density and price. */ export declare const MAX_THREAD_COLORS = 6; export declare function isEmbroideryPlacement(placement: string | undefined): boolean; /** * The Printful option id for a placement's thread colors. Placement-suffixed for most placements * (`embroidery_front_large` -> `thread_colors_front_large`, `embroidery_chest_left` -> * `thread_colors_chest_left`) — but the PLAIN `embroidery_front` placement uses the BARE * `thread_colors` id (all three shapes verified empirically against live syncs, 2026-07-09). * Printful's per-product quirks beyond this table are covered by the sync self-heal, which reads * the expected id straight out of Printful's error message. */ export declare function threadColorsOptionId(placement: string): string; /** * Printful rejects a sync whose thread-colors option id doesn't match the product's expected id * with ` option is missing or incorrect! Allowed values: ...`. Extract that id so * the sync can be healed (rewrite the option id, retry once). */ export declare function expectedThreadColorsIdFromError(message: string): string | undefined; /** * Validate + normalize a thread-color list against the fixed palette (uppercase, deduped, * capped). Throws a structured error naming the palette when a color is off-palette — Printful * rejects the ENTIRE sync call for a single bad value, so failing here is strictly better. */ export declare function normalizeThreadColors(colors: string[]): string[];