{"version":3,"sources":["../src/RoleMorphic.ts","../src/roles/area/validate.ts","../src/roles/length/validate.ts","../src/roles/mass/validate.ts","../src/roles/temperature/constants.ts","../src/roles/temperature/validate.ts","../src/roles/volume/validate.ts","../src/roles/speed/validate.ts","../src/roles/energy/validate.ts","../src/roles/power/validate.ts","../src/roles/pressure/validate.ts","../src/roles/frequency/validate.ts","../src/roles/angle/validate.ts","../src/roles/time/validate.ts","../src/roles/digital/validate.ts","../src/roles/color/validate.ts","../src/roles/date/validate.ts","../src/roles/currency/validate.ts","../src/roles/area/constants.ts","../src/roles/area/convert.ts","../src/roles/length/constants.ts","../src/roles/length/convert.ts","../src/roles/mass/constants.ts","../src/roles/mass/convert.ts","../src/roles/temperature/convert.ts","../src/roles/volume/constants.ts","../src/roles/volume/convert.ts","../src/roles/speed/constants.ts","../src/roles/speed/convert.ts","../src/roles/energy/constants.ts","../src/roles/energy/convert.ts","../src/roles/power/constants.ts","../src/roles/power/convert.ts","../src/roles/pressure/constants.ts","../src/roles/pressure/convert.ts","../src/roles/frequency/constants.ts","../src/roles/frequency/convert.ts","../src/roles/angle/constants.ts","../src/roles/angle/convert.ts","../src/roles/time/constants.ts","../src/roles/time/convert.ts","../src/roles/digital/constants.ts","../src/roles/digital/convert.ts","../src/roles/color/types.ts","../src/roles/color/convert.ts","../src/roles/date/convert.ts","../src/roles/area/cast.ts","../src/roles/length/cast.ts","../src/roles/mass/cast.ts","../src/roles/temperature/cast.ts","../src/roles/volume/cast.ts","../src/roles/speed/cast.ts","../src/roles/energy/cast.ts","../src/roles/power/cast.ts","../src/roles/pressure/cast.ts","../src/roles/frequency/cast.ts","../src/roles/angle/cast.ts","../src/roles/time/cast.ts","../src/roles/digital/cast.ts","../src/roles/color/cast.ts","../src/roles/date/cast.ts","../src/roles/currency/cast.ts","../src/roles/area/format.ts","../src/roles/length/format.ts","../src/roles/mass/format.ts","../src/roles/temperature/format.ts","../src/roles/volume/format.ts","../src/roles/speed/format.ts","../src/roles/energy/format.ts","../src/roles/power/format.ts","../src/roles/pressure/format.ts","../src/roles/frequency/format.ts","../src/roles/angle/format.ts","../src/roles/time/format.ts","../src/roles/digital/format.ts","../src/roles/color/format.ts","../src/roles/date/format.ts","../src/roles/currency/constants.ts","../src/roles/currency/format.ts","../src/contracts/IVariant.ts","../src/contracts/SimpleRole.ts","../src/contracts/ComplexRole.ts","../src/roles/area/AreaRole.ts","../src/roles/length/LengthRole.ts","../src/roles/mass/MassRole.ts","../src/roles/temperature/TemperatureRole.ts","../src/roles/angle/AngleRole.ts","../src/roles/energy/EnergyRole.ts","../src/roles/power/PowerRole.ts","../src/roles/speed/SpeedRole.ts","../src/roles/date/variants/IsoVariant.ts","../src/roles/date/variants/TimestampVariant.ts","../src/roles/date/variants/EpochVariant.ts","../src/roles/date/DateRole.ts","../src/roles/volume/VolumeRole.ts","../src/roles/time/TimeRole.ts","../src/roles/digital/DigitalRole.ts","../src/roles/frequency/FrequencyRole.ts","../src/roles/pressure/PressureRole.ts","../src/roles/color/variants/HexVariant.ts","../src/roles/color/variants/RgbObjectVariant.ts","../src/roles/color/variants/RgbStringVariant.ts","../src/roles/color/variants/HslObjectVariant.ts","../src/roles/color/variants/HslStringVariant.ts","../src/roles/color/ColorRole.ts","../src/roles/currency/CurrencyRole.ts"],"names":["p","q","parseNumber","detectUnit","numStr","value","formatWithIntl","ISO_DATE_ONLY_REGEX","ISO_DATE_TIME_REGEX"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * RoleMorphic\n *\n * Motor de conversão polimórfica de valores.\n * Permite que um valor assuma múltiplas formas (variantes) mantendo sua identidade semântica.\n *\n * Arquitetura Hub-and-Spoke:\n * - Cada role tem uma variante BASE que serve como pivot\n * - Toda conversão passa pela base: origem -> base -> destino\n * - Isso reduz a complexidade de N² para 2N conversões\n */\n\nimport {\n  RoleSpec,\n  VariantSpec,\n  ParsedVariantId,\n  ConversionResult,\n  ReversibilityResult,\n  MorpherFn,\n  MorpherSpec,\n} from \"./types\";\n\nexport class RoleMorphic {\n  /** Registry de roles */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private roles = new Map<string, RoleSpec<any>>();\n\n  /** Registry de morphers (transformações cross-role) */\n  private morphers = new Map<string, MorpherFn>();\n\n  // ===========================================================================\n  // ROLE MANAGEMENT\n  // ===========================================================================\n\n  /**\n   * Registra uma nova role\n   */\n  register<TBase = unknown>(roleId: string, spec: RoleSpec<TBase>): this {\n    if (this.roles.has(roleId)) {\n      throw new Error(`Role \"${roleId}\" is already registered`);\n    }\n\n    // Valida que a base existe nas variantes\n    if (!spec.variants[spec.base]) {\n      throw new Error(\n        `Base variant \"${spec.base}\" not found in role \"${roleId}\" variants`,\n      );\n    }\n\n    this.roles.set(roleId, spec);\n    return this;\n  }\n\n  /**\n   * Remove uma role registrada\n   */\n  unregister(roleId: string): boolean {\n    return this.roles.delete(roleId);\n  }\n\n  /**\n   * Verifica se uma role está registrada\n   */\n  hasRole(roleId: string): boolean {\n    return this.roles.has(roleId);\n  }\n\n  /**\n   * Obtém a spec de uma role\n   */\n  getRole(roleId: string): RoleSpec | undefined {\n    return this.roles.get(roleId);\n  }\n\n  /**\n   * Lista todas as roles registradas\n   */\n  listRoles(): string[] {\n    return Array.from(this.roles.keys());\n  }\n\n  // ===========================================================================\n  // VARIANT UTILITIES\n  // ===========================================================================\n\n  /**\n   * Parseia um identificador de variante\n   *\n   * \"color:rgb:object\" => { role: \"color\", variant: \"rgb:object\" }\n   * \"area:m2\" => { role: \"area\", variant: \"m2\" }\n   */\n  parseVariantId(fullId: string): ParsedVariantId {\n    const colonIndex = fullId.indexOf(\":\");\n    if (colonIndex === -1) {\n      throw new Error(\n        `Invalid variant identifier \"${fullId}\". Expected format: \"role:variant\"`,\n      );\n    }\n\n    return {\n      role: fullId.slice(0, colonIndex),\n      variant: fullId.slice(colonIndex + 1),\n    };\n  }\n\n  /**\n   * Verifica se uma variante existe\n   */\n  hasVariant(fullId: string): boolean {\n    try {\n      const { role, variant } = this.parseVariantId(fullId);\n      const spec = this.roles.get(role);\n      return spec ? variant in spec.variants : false;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Obtém a spec de uma variante\n   */\n  getVariant(fullId: string): VariantSpec | undefined {\n    const { role, variant } = this.parseVariantId(fullId);\n    const spec = this.roles.get(role);\n    return spec?.variants[variant];\n  }\n\n  /**\n   * Lista todas as variantes de uma role\n   */\n  listVariants(roleId: string): string[] {\n    const spec = this.roles.get(roleId);\n    if (!spec) return [];\n    return Object.keys(spec.variants);\n  }\n\n  /**\n   * Lista variantes para as quais uma variante pode converter\n   */\n  getConvertibleVariants(fullId: string): string[] {\n    const { role, variant } = this.parseVariantId(fullId);\n    const spec = this.roles.get(role);\n\n    if (!spec) return [];\n\n    return Object.keys(spec.variants)\n      .filter((v) => v !== variant)\n      .map((v) => `${role}:${v}`);\n  }\n\n  // ===========================================================================\n  // CONVERSION\n  // ===========================================================================\n\n  /**\n   * Converte um valor de uma variante para outra (mesma role)\n   *\n   * @param from - Identificador da variante de origem (ex: \"color:hex\")\n   * @param to - Identificador da variante de destino (ex: \"color:rgb:object\")\n   * @param value - Valor a converter\n   * @returns Valor convertido\n   * @throws Error se a conversão não for possível\n   */\n  convert<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): TTo {\n    const fromParsed = this.parseVariantId(from);\n    const toParsed = this.parseVariantId(to);\n\n    // Validação: mesma role\n    if (fromParsed.role !== toParsed.role) {\n      throw new Error(\n        `Cannot convert between different roles (\"${fromParsed.role}\" -> \"${toParsed.role}\"). ` +\n          `Use morph() for cross-role transformations.`,\n      );\n    }\n\n    const roleSpec = this.roles.get(fromParsed.role);\n    if (!roleSpec) {\n      throw new Error(`Role \"${fromParsed.role}\" is not registered`);\n    }\n\n    const fromVariant = roleSpec.variants[fromParsed.variant];\n    const toVariant = roleSpec.variants[toParsed.variant];\n\n    if (!fromVariant) {\n      throw new Error(\n        `Variant \"${fromParsed.variant}\" not found in role \"${fromParsed.role}\"`,\n      );\n    }\n\n    if (!toVariant) {\n      throw new Error(\n        `Variant \"${toParsed.variant}\" not found in role \"${fromParsed.role}\"`,\n      );\n    }\n\n    // Otimização: se origem === destino, retorna o valor\n    if (fromParsed.variant === toParsed.variant) {\n      return value as unknown as TTo;\n    }\n\n    // Conversão via base (hub-and-spoke)\n    const baseVariant = roleSpec.base;\n\n    // Se origem é a base, pula toBase\n    const baseValue =\n      fromParsed.variant === baseVariant ? value : fromVariant.toBase(value);\n\n    // Se destino é a base, retorna baseValue\n    if (toParsed.variant === baseVariant) {\n      return baseValue as TTo;\n    }\n\n    // Converte da base para o destino\n    return toVariant.fromBase(baseValue) as TTo;\n  }\n\n  /**\n   * Tenta converter, retornando Result ao invés de throw\n   */\n  tryConvert<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): ConversionResult<TTo> {\n    try {\n      const result = this.convert<TFrom, TTo>(from, to, value);\n      return { ok: true, value: result };\n    } catch (error) {\n      return {\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      };\n    }\n  }\n\n  // ===========================================================================\n  // SAFE CONVERSION (with reversibility check)\n  // ===========================================================================\n\n  /**\n   * Verifica se uma conversão é reversível (sem perda de dados)\n   */\n  isReversible<T = unknown>(from: string, to: string, value: T): boolean {\n    try {\n      const converted = this.convert(from, to, value);\n      const reconverted = this.convert(to, from, converted);\n\n      // Compara via JSON (deep equality simples)\n      return JSON.stringify(value) === JSON.stringify(reconverted);\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Retorna detalhes sobre a reversibilidade de uma conversão\n   */\n  checkReversibility<T = unknown>(\n    from: string,\n    to: string,\n    value: T,\n  ): ReversibilityResult {\n    try {\n      const converted = this.convert(from, to, value);\n      const reconverted = this.convert(to, from, converted);\n      const reversible = JSON.stringify(value) === JSON.stringify(reconverted);\n\n      return {\n        reversible,\n        original: value,\n        converted,\n        reconverted,\n      };\n    } catch (error) {\n      return {\n        reversible: false,\n        original: value,\n        converted: null,\n        reconverted: null,\n      };\n    }\n  }\n\n  /**\n   * Converte apenas se a conversão for reversível\n   *\n   * @throws Error se a conversão causar perda de dados\n   */\n  convertSafe<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): TTo {\n    const result = this.checkReversibility(from, to, value);\n\n    if (!result.reversible) {\n      throw new Error(\n        `Conversion from \"${from}\" to \"${to}\" is not reversible. ` +\n          `Original: ${JSON.stringify(value)}, ` +\n          `Reconverted: ${JSON.stringify(result.reconverted)}`,\n      );\n    }\n\n    return result.converted as TTo;\n  }\n\n  // ===========================================================================\n  // MORPHERS (cross-role transformations)\n  // ===========================================================================\n\n  /**\n   * Registra um morpher para transformação entre roles diferentes\n   */\n  registerMorpher<TFrom = unknown, TTo = unknown>(\n    spec: MorpherSpec<TFrom, TTo>,\n  ): this {\n    const key = `${spec.from}->${spec.to}`;\n\n    if (this.morphers.has(key)) {\n      throw new Error(`Morpher \"${key}\" is already registered`);\n    }\n\n    this.morphers.set(key, spec.transform as MorpherFn);\n    return this;\n  }\n\n  /**\n   * Remove um morpher\n   */\n  unregisterMorpher(from: string, to: string): boolean {\n    return this.morphers.delete(`${from}->${to}`);\n  }\n\n  /**\n   * Verifica se existe um morpher para a transformação\n   */\n  hasMorpher(from: string, to: string): boolean {\n    return this.morphers.has(`${from}->${to}`);\n  }\n\n  /**\n   * Lista morphers disponíveis a partir de uma variante\n   */\n  getMorphersFrom(from: string): string[] {\n    const prefix = `${from}->`;\n    const targets: string[] = [];\n\n    for (const key of this.morphers.keys()) {\n      if (key.startsWith(prefix)) {\n        targets.push(key.slice(prefix.length));\n      }\n    }\n\n    return targets;\n  }\n\n  /**\n   * Transforma um valor de uma role para outra usando um morpher registrado\n   */\n  morph<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): TTo {\n    const key = `${from}->${to}`;\n    const morpher = this.morphers.get(key);\n\n    if (!morpher) {\n      throw new Error(\n        `No morpher registered for \"${from}\" -> \"${to}\". ` +\n          `Register one with registerMorpher().`,\n      );\n    }\n\n    return morpher(value) as TTo;\n  }\n\n  /**\n   * Tenta transformar, retornando Result ao invés de throw\n   */\n  tryMorph<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): ConversionResult<TTo> {\n    try {\n      const result = this.morph<TFrom, TTo>(from, to, value);\n      return { ok: true, value: result };\n    } catch (error) {\n      return {\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      };\n    }\n  }\n\n  // ===========================================================================\n  // CONVENIENCE METHODS\n  // ===========================================================================\n\n  /**\n   * Converte ou transforma automaticamente\n   *\n   * - Se mesma role: usa convert()\n   * - Se roles diferentes: usa morph()\n   */\n  auto<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): TTo {\n    const fromParsed = this.parseVariantId(from);\n    const toParsed = this.parseVariantId(to);\n\n    if (fromParsed.role === toParsed.role) {\n      return this.convert<TFrom, TTo>(from, to, value);\n    }\n\n    return this.morph<TFrom, TTo>(from, to, value);\n  }\n\n  /**\n   * Converte um valor para a variante base da sua role\n   */\n  toBase<T = unknown, TBase = unknown>(fullId: string, value: T): TBase {\n    const { role, variant } = this.parseVariantId(fullId);\n    const spec = this.roles.get(role);\n\n    if (!spec) {\n      throw new Error(`Role \"${role}\" is not registered`);\n    }\n\n    // Se já é a base, retorna direto\n    if (variant === spec.base) {\n      return value as unknown as TBase;\n    }\n\n    const variantSpec = spec.variants[variant];\n    if (!variantSpec) {\n      throw new Error(`Variant \"${variant}\" not found in role \"${role}\"`);\n    }\n\n    return variantSpec.toBase(value) as TBase;\n  }\n\n  /**\n   * Converte um valor da base para uma variante específica\n   */\n  fromBase<TBase = unknown, T = unknown>(fullId: string, baseValue: TBase): T {\n    const { role, variant } = this.parseVariantId(fullId);\n    const spec = this.roles.get(role);\n\n    if (!spec) {\n      throw new Error(`Role \"${role}\" is not registered`);\n    }\n\n    // Se é a base, retorna direto\n    if (variant === spec.base) {\n      return baseValue as unknown as T;\n    }\n\n    const variantSpec = spec.variants[variant];\n    if (!variantSpec) {\n      throw new Error(`Variant \"${variant}\" not found in role \"${role}\"`);\n    }\n\n    return variantSpec.fromBase(baseValue) as T;\n  }\n}\n","/**\n * Area Role - Validate Pillar\n *\n * Validação semântica de valores de área.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateArea, isValidArea } from '@attrx/role-morphic/area/validate';\n *\n * validateArea(100);   // { valid: true, errors: [] }\n * validateArea(-5);    // { valid: false, errors: ['Area cannot be negative'] }\n * isValidArea(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface AreaValidationConfig {\n  min?: number;\n  max?: number;\n  integer?: boolean;\n  minError?: string;\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para área\n */\nexport const AREA_VALIDATION_CONFIG: AreaValidationConfig = {\n  min: 0,\n  minError: \"Area cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de área\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateArea(100);              // { valid: true, errors: [] }\n * validateArea(-5);               // { valid: false, errors: ['Area cannot be negative'] }\n * validateArea(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateArea(\n  value: unknown,\n  config: AreaValidationConfig = AREA_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Min check\n  if (config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Integer check\n  if (config.integer && !Number.isInteger(value)) {\n    errors.push(\"Value must be an integer\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de área é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidArea(100);  // true\n * isValidArea(-5);   // false\n */\nexport function isValidArea(\n  value: unknown,\n  config: AreaValidationConfig = AREA_VALIDATION_CONFIG\n): boolean {\n  return validateArea(value, config).valid;\n}\n","/**\n * Length Role - Validate Pillar\n *\n * Validação semântica de valores de comprimento.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateLength, isValidLength } from '@attrx/role-morphic/length/validate';\n *\n * validateLength(100);   // { valid: true, errors: [] }\n * validateLength(-5);    // { valid: false, errors: ['Length cannot be negative'] }\n * isValidLength(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface LengthValidationConfig {\n  min?: number;\n  max?: number;\n  integer?: boolean;\n  minError?: string;\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para comprimento\n * Length é magnitude escalar, portanto não-negativo por padrão\n */\nexport const LENGTH_VALIDATION_CONFIG: LengthValidationConfig = {\n  min: 0,\n  minError: \"Length cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de comprimento\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateLength(100);                    // { valid: true, errors: [] }\n * validateLength(-5);                     // { valid: false, errors: ['Length cannot be negative'] }\n * validateLength(-5, { min: undefined }); // { valid: true, errors: [] } - permite negativo\n */\nexport function validateLength(\n  value: unknown,\n  config: LengthValidationConfig = LENGTH_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Min check\n  if (config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Integer check\n  if (config.integer && !Number.isInteger(value)) {\n    errors.push(\"Value must be an integer\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de comprimento é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidLength(100);  // true\n * isValidLength(-5);   // false\n */\nexport function isValidLength(\n  value: unknown,\n  config: LengthValidationConfig = LENGTH_VALIDATION_CONFIG\n): boolean {\n  return validateLength(value, config).valid;\n}\n","/**\n * Mass Role - Validate Pillar\n *\n * Validação semântica de valores de massa.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateMass, isValidMass } from '@attrx/role-morphic/mass/validate';\n *\n * validateMass(100);   // { valid: true, errors: [] }\n * validateMass(-5);    // { valid: false, errors: ['Mass cannot be negative'] }\n * isValidMass(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface MassValidationConfig {\n  min?: number;\n  max?: number;\n  integer?: boolean;\n  minError?: string;\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para massa\n */\nexport const MASS_VALIDATION_CONFIG: MassValidationConfig = {\n  min: 0,\n  minError: \"Mass cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de massa\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateMass(100);              // { valid: true, errors: [] }\n * validateMass(-5);               // { valid: false, errors: ['Mass cannot be negative'] }\n * validateMass(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateMass(\n  value: unknown,\n  config: MassValidationConfig = MASS_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Min check\n  if (config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Integer check\n  if (config.integer && !Number.isInteger(value)) {\n    errors.push(\"Value must be an integer\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de massa é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidMass(100);  // true\n * isValidMass(-5);   // false\n */\nexport function isValidMass(\n  value: unknown,\n  config: MassValidationConfig = MASS_VALIDATION_CONFIG\n): boolean {\n  return validateMass(value, config).valid;\n}\n","/**\n * Temperature Role - Constants\n *\n * Fórmulas de conversão, símbolos e aliases para unidades de temperatura.\n *\n * IMPORTANTE: Temperatura usa FÓRMULAS, não fatores multiplicativos.\n * Isso porque as escalas têm offsets diferentes (0°C ≠ 0°F ≠ 0K).\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TemperatureUnit = \"celsius\" | \"fahrenheit\" | \"kelvin\" | \"rankine\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de temperatura.\n *\n * Base: celsius (°C)\n *\n * Fórmulas de conversão:\n * - Celsius ↔ Fahrenheit: °F = °C × 9/5 + 32\n * - Celsius ↔ Kelvin: K = °C + 273.15\n * - Celsius ↔ Rankine: °R = (°C + 273.15) × 9/5\n *\n * Pontos de referência:\n * | Descrição        | Celsius | Fahrenheit | Kelvin  | Rankine |\n * |------------------|---------|------------|---------|---------|\n * | Zero absoluto    | -273.15 | -459.67    | 0       | 0       |\n * | Congelamento H₂O | 0       | 32         | 273.15  | 491.67  |\n * | Corpo humano     | 37      | 98.6       | 310.15  | 558.27  |\n * | Ebulição H₂O     | 100     | 212        | 373.15  | 671.67  |\n */\nexport const TEMPERATURE_UNITS: Record<TemperatureUnit, SimpleUnitConfig> = {\n  celsius: {\n    symbol: \"°C\",\n    singular: \"degree Celsius\",\n    plural: \"degrees Celsius\",\n    toBase: (c: number) => c,\n    fromBase: (c: number) => c,\n    noSpace: true, // 25°C não 25 °C\n  },\n  fahrenheit: {\n    symbol: \"°F\",\n    singular: \"degree Fahrenheit\",\n    plural: \"degrees Fahrenheit\",\n    toBase: (f: number) => (f - 32) * (5 / 9),\n    fromBase: (c: number) => c * (9 / 5) + 32,\n    noSpace: true, // 77°F não 77 °F\n  },\n  kelvin: {\n    symbol: \"K\",\n    singular: \"kelvin\",\n    plural: \"kelvins\",\n    toBase: (k: number) => k - 273.15,\n    fromBase: (c: number) => c + 273.15,\n    // Kelvin usa espaço: \"273 K\" (convenção SI)\n  },\n  rankine: {\n    symbol: \"°R\",\n    singular: \"degree Rankine\",\n    plural: \"degrees Rankine\",\n    toBase: (r: number) => (r - 491.67) * (5 / 9),\n    fromBase: (c: number) => (c + 273.15) * (9 / 5),\n    noSpace: true, // 500°R não 500 °R\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const TEMPERATURE_ALIASES: UnitAliases = {\n  // celsius\n  c: \"celsius\",\n  \"°c\": \"celsius\",\n  // fahrenheit\n  f: \"fahrenheit\",\n  \"°f\": \"fahrenheit\",\n  // kelvin\n  k: \"kelvin\",\n  // rankine\n  r: \"rankine\",\n  \"°r\": \"rankine\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const TEMPERATURE_UNIT_LIST = Object.keys(\n  TEMPERATURE_UNITS,\n) as TemperatureUnit[];\n\n/**\n * Constantes importantes\n */\nexport const TEMPERATURE_CONSTANTS = {\n  /** Zero absoluto em Celsius */\n  ABSOLUTE_ZERO_CELSIUS: -273.15,\n  /** Zero absoluto em Fahrenheit */\n  ABSOLUTE_ZERO_FAHRENHEIT: -459.67,\n  /** Offset Celsius → Kelvin */\n  CELSIUS_TO_KELVIN_OFFSET: 273.15,\n  /** Offset Fahrenheit → Rankine (são a mesma escala, só diferente offset) */\n  FAHRENHEIT_TO_RANKINE_OFFSET: 459.67,\n  /** Ponto de congelamento da água em Fahrenheit */\n  WATER_FREEZING_FAHRENHEIT: 32,\n  /** Ponto de ebulição da água em Fahrenheit */\n  WATER_BOILING_FAHRENHEIT: 212,\n} as const;\n","/**\n * Temperature Role - Validate Pillar\n *\n * Validação semântica de valores de temperatura.\n * Zero dependências externas - pode ser usado standalone.\n *\n * IMPORTANTE: Temperatura não pode ser abaixo do zero absoluto.\n * O zero absoluto varia por escala:\n * - Celsius: -273.15°C\n * - Fahrenheit: -459.67°F\n * - Kelvin: 0K\n * - Rankine: 0°R\n *\n * @example\n * import { validateTemperature, isValidTemperature } from '@attrx/role-morphic/temperature/validate';\n *\n * validateTemperature(100, 'celsius');     // { valid: true, errors: [] }\n * validateTemperature(-300, 'celsius');    // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(-10, 'kelvin');      // { valid: false, errors: ['...below absolute zero...'] }\n * isValidTemperature(100, 'celsius');      // true\n */\n\nimport { type TemperatureUnit, TEMPERATURE_CONSTANTS } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface TemperatureValidationConfig {\n  /** Permite temperaturas abaixo do zero absoluto (default: false) */\n  allowBelowAbsoluteZero?: boolean;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para max */\n  maxError?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Zero absoluto em cada escala\n */\nexport const ABSOLUTE_ZERO: Record<TemperatureUnit, number> = {\n  celsius: TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS,\n  fahrenheit: TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_FAHRENHEIT,\n  kelvin: 0,\n  rankine: 0,\n};\n\n/**\n * Símbolos para mensagens de erro\n */\nconst UNIT_SYMBOLS: Record<TemperatureUnit, string> = {\n  celsius: \"°C\",\n  fahrenheit: \"°F\",\n  kelvin: \"K\",\n  rankine: \"°R\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de temperatura\n *\n * @param value - Valor a ser validado\n * @param unit - Unidade do valor (default: celsius)\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateTemperature(100, 'celsius');              // { valid: true, errors: [] }\n * validateTemperature(-300, 'celsius');             // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(-10, 'kelvin');               // { valid: false, errors: ['...below absolute zero...'] }\n * validateTemperature(0, 'kelvin');                 // { valid: true, errors: [] } (0K = zero absoluto)\n * validateTemperature(-459.67, 'fahrenheit');       // { valid: true, errors: [] } (zero absoluto em °F)\n */\nexport function validateTemperature(\n  value: unknown,\n  unit: TemperatureUnit = \"celsius\",\n  config: TemperatureValidationConfig = {}\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Absolute zero check (unless explicitly allowed)\n  if (!config.allowBelowAbsoluteZero) {\n    const absoluteZero = ABSOLUTE_ZERO[unit];\n    if (value < absoluteZero) {\n      const symbol = UNIT_SYMBOLS[unit];\n      errors.push(\n        `Temperature cannot be below absolute zero (${absoluteZero}${symbol})`\n      );\n    }\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de temperatura é válido\n *\n * @param value - Valor a ser validado\n * @param unit - Unidade do valor (default: celsius)\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidTemperature(100, 'celsius');   // true\n * isValidTemperature(-300, 'celsius');  // false\n * isValidTemperature(-10, 'kelvin');    // false\n */\nexport function isValidTemperature(\n  value: unknown,\n  unit: TemperatureUnit = \"celsius\",\n  config: TemperatureValidationConfig = {}\n): boolean {\n  return validateTemperature(value, unit, config).valid;\n}\n\n/**\n * Retorna o zero absoluto na escala especificada\n *\n * @example\n * getAbsoluteZero('celsius');     // -273.15\n * getAbsoluteZero('fahrenheit');  // -459.67\n * getAbsoluteZero('kelvin');      // 0\n */\nexport function getAbsoluteZero(unit: TemperatureUnit): number {\n  return ABSOLUTE_ZERO[unit];\n}\n","/**\n * Volume Role - Validate Pillar\n *\n * Validação semântica de valores de volume.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateVolume, isValidVolume } from '@attrx/role-morphic/volume/validate';\n *\n * validateVolume(100);   // { valid: true, errors: [] }\n * validateVolume(-5);    // { valid: false, errors: ['Volume cannot be negative'] }\n * isValidVolume(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface VolumeValidationConfig {\n  min?: number;\n  max?: number;\n  integer?: boolean;\n  minError?: string;\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para volume\n */\nexport const VOLUME_VALIDATION_CONFIG: VolumeValidationConfig = {\n  min: 0,\n  minError: \"Volume cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de volume\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateVolume(100);              // { valid: true, errors: [] }\n * validateVolume(-5);               // { valid: false, errors: ['Volume cannot be negative'] }\n * validateVolume(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateVolume(\n  value: unknown,\n  config: VolumeValidationConfig = VOLUME_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Min check\n  if (config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Integer check\n  if (config.integer && !Number.isInteger(value)) {\n    errors.push(\"Value must be an integer\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de volume é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidVolume(100);  // true\n * isValidVolume(-5);   // false\n */\nexport function isValidVolume(\n  value: unknown,\n  config: VolumeValidationConfig = VOLUME_VALIDATION_CONFIG\n): boolean {\n  return validateVolume(value, config).valid;\n}\n","/**\n * Speed Role - Validate Pillar\n *\n * Validação semântica de valores de velocidade.\n * Zero dependências externas - pode ser usado standalone.\n *\n * Nota: Velocidade pode ser negativa (movimento em direção oposta).\n *\n * @example\n * import { validateSpeed, isValidSpeed } from '@attrx/role-morphic/speed/validate';\n *\n * validateSpeed(100);   // { valid: true, errors: [] }\n * validateSpeed(-50);   // { valid: true, errors: [] } (negativo é válido)\n * isValidSpeed(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface SpeedValidationConfig {\n  min?: number;\n  max?: number;\n  integer?: boolean;\n  minError?: string;\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para velocidade\n * Nota: sem min/max por padrão - velocidade pode ser qualquer valor finito\n */\nexport const SPEED_VALIDATION_CONFIG: SpeedValidationConfig = {};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de velocidade\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateSpeed(100);              // { valid: true, errors: [] }\n * validateSpeed(-50);              // { valid: true, errors: [] }\n * validateSpeed(150, { max: 120 }) // { valid: false, errors: ['Value must be at most 120'] }\n */\nexport function validateSpeed(\n  value: unknown,\n  config: SpeedValidationConfig = SPEED_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Min check\n  if (config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Integer check\n  if (config.integer && !Number.isInteger(value)) {\n    errors.push(\"Value must be an integer\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de velocidade é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidSpeed(100);   // true\n * isValidSpeed(-50);   // true (negativo é válido)\n */\nexport function isValidSpeed(\n  value: unknown,\n  config: SpeedValidationConfig = SPEED_VALIDATION_CONFIG\n): boolean {\n  return validateSpeed(value, config).valid;\n}\n","/**\n * Energy Role - Validate Pillar\n *\n * Validação semântica de valores de energia.\n * Zero dependências externas - pode ser usado standalone.\n *\n * @example\n * import { validateEnergy, isValidEnergy } from '@attrx/role-morphic/energy/validate';\n *\n * validateEnergy(100);   // { valid: true, errors: [] }\n * validateEnergy(-5);    // { valid: false, errors: ['Energy cannot be negative'] }\n * isValidEnergy(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface EnergyValidationConfig {\n  min?: number;\n  max?: number;\n  integer?: boolean;\n  minError?: string;\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para energia\n */\nexport const ENERGY_VALIDATION_CONFIG: EnergyValidationConfig = {\n  min: 0,\n  minError: \"Energy cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de energia\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateEnergy(100);              // { valid: true, errors: [] }\n * validateEnergy(-5);               // { valid: false, errors: ['Energy cannot be negative'] }\n * validateEnergy(150, { max: 100 }) // { valid: false, errors: ['Value must be at most 100'] }\n */\nexport function validateEnergy(\n  value: unknown,\n  config: EnergyValidationConfig = ENERGY_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Min check\n  if (config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Integer check\n  if (config.integer && !Number.isInteger(value)) {\n    errors.push(\"Value must be an integer\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor de energia é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidEnergy(100);  // true\n * isValidEnergy(-5);   // false\n */\nexport function isValidEnergy(\n  value: unknown,\n  config: EnergyValidationConfig = ENERGY_VALIDATION_CONFIG\n): boolean {\n  return validateEnergy(value, config).valid;\n}\n","/**\n * Power Role - Validate Pillar\n *\n * Validação de valores de potência.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validatePower, isValidPower } from '@attrx/role-morphic/power/validate';\n *\n * validatePower(100);   // { valid: true, errors: [] }\n * validatePower(-5);    // { valid: false, errors: ['Power cannot be negative'] }\n * isValidPower(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PowerValidationConfig {\n  /** Valor mínimo permitido (default: 0) */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para valor abaixo do mínimo */\n  minError?: string;\n  /** Mensagem de erro para valor acima do máximo */\n  maxError?: string;\n  /** Permitir valores negativos (default: false) */\n  allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const POWER_VALIDATION_CONFIG: PowerValidationConfig = {\n  min: 0,\n  minError: \"Power cannot be negative\",\n  allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de potência\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validatePower(100);                    // { valid: true, errors: [] }\n * validatePower(-5);                     // { valid: false, errors: ['Power cannot be negative'] }\n * validatePower(-5, { allowNegative: true }); // { valid: true, errors: [] }\n * validatePower(1000, { max: 500 });     // { valid: false, errors: ['Value must be at most 500'] }\n */\nexport function validatePower(\n  value: unknown,\n  config: PowerValidationConfig = POWER_VALIDATION_CONFIG,\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Must be a number\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return {\n      valid: false,\n      errors: [\"Value must be a finite number\"],\n    };\n  }\n\n  // Merge with defaults\n  const effectiveConfig = { ...POWER_VALIDATION_CONFIG, ...config };\n\n  // Check negative\n  if (!effectiveConfig.allowNegative && value < 0) {\n    errors.push(effectiveConfig.minError || \"Power cannot be negative\");\n  }\n\n  // Check min (if allowNegative is true and min is set)\n  if (\n    effectiveConfig.allowNegative &&\n    effectiveConfig.min !== undefined &&\n    value < effectiveConfig.min\n  ) {\n    errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n  }\n\n  // Check max\n  if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n    errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Verifica se valor de potência é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidPower(100);  // true\n * isValidPower(-5);   // false\n */\nexport function isValidPower(\n  value: unknown,\n  config?: PowerValidationConfig,\n): boolean {\n  return validatePower(value, config).valid;\n}\n","/**\n * Pressure Role - Validate Pillar\n *\n * Validação de valores de pressão.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validatePressure, isValidPressure } from '@attrx/role-morphic/pressure/validate';\n *\n * validatePressure(100);   // { valid: true, errors: [] }\n * validatePressure(-5);    // { valid: false, errors: ['Pressure cannot be negative'] }\n * isValidPressure(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PressureValidationConfig {\n  /** Valor mínimo permitido (default: 0) */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para valor abaixo do mínimo */\n  minError?: string;\n  /** Mensagem de erro para valor acima do máximo */\n  maxError?: string;\n  /** Permitir valores negativos (default: false) */\n  allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const PRESSURE_VALIDATION_CONFIG: PressureValidationConfig = {\n  min: 0,\n  minError: \"Pressure cannot be negative\",\n  allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de pressão\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validatePressure(100);                    // { valid: true, errors: [] }\n * validatePressure(-5);                     // { valid: false, errors: ['Pressure cannot be negative'] }\n * validatePressure(-5, { allowNegative: true }); // { valid: true, errors: [] }\n * validatePressure(1000, { max: 500 });     // { valid: false, errors: ['Value must be at most 500'] }\n */\nexport function validatePressure(\n  value: unknown,\n  config: PressureValidationConfig = PRESSURE_VALIDATION_CONFIG,\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Must be a number\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return {\n      valid: false,\n      errors: [\"Value must be a finite number\"],\n    };\n  }\n\n  // Merge with defaults\n  const effectiveConfig = { ...PRESSURE_VALIDATION_CONFIG, ...config };\n\n  // Check negative\n  if (!effectiveConfig.allowNegative && value < 0) {\n    errors.push(effectiveConfig.minError || \"Pressure cannot be negative\");\n  }\n\n  // Check min (if allowNegative is true and min is set)\n  if (\n    effectiveConfig.allowNegative &&\n    effectiveConfig.min !== undefined &&\n    value < effectiveConfig.min\n  ) {\n    errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n  }\n\n  // Check max\n  if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n    errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Verifica se valor de pressão é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidPressure(100);  // true\n * isValidPressure(-5);   // false\n */\nexport function isValidPressure(\n  value: unknown,\n  config?: PressureValidationConfig,\n): boolean {\n  return validatePressure(value, config).valid;\n}\n","/**\n * Frequency Role - Validate Pillar\n *\n * Validação de valores de frequência.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateFrequency, isValidFrequency } from '@attrx/role-morphic/frequency/validate';\n *\n * validateFrequency(100);   // { valid: true, errors: [] }\n * validateFrequency(-5);    // { valid: false, errors: ['Frequency cannot be negative'] }\n * isValidFrequency(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FrequencyValidationConfig {\n  /** Valor mínimo permitido (default: 0) */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para valor abaixo do mínimo */\n  minError?: string;\n  /** Mensagem de erro para valor acima do máximo */\n  maxError?: string;\n  /** Permitir valores negativos (default: false) */\n  allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const FREQUENCY_VALIDATION_CONFIG: FrequencyValidationConfig = {\n  min: 0,\n  minError: \"Frequency cannot be negative\",\n  allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de frequência\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateFrequency(100);                    // { valid: true, errors: [] }\n * validateFrequency(-5);                     // { valid: false, errors: ['Frequency cannot be negative'] }\n * validateFrequency(-5, { allowNegative: true }); // { valid: true, errors: [] }\n * validateFrequency(1000, { max: 500 });     // { valid: false, errors: ['Value must be at most 500'] }\n */\nexport function validateFrequency(\n  value: unknown,\n  config: FrequencyValidationConfig = FREQUENCY_VALIDATION_CONFIG,\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Must be a number\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return {\n      valid: false,\n      errors: [\"Value must be a finite number\"],\n    };\n  }\n\n  // Merge with defaults\n  const effectiveConfig = { ...FREQUENCY_VALIDATION_CONFIG, ...config };\n\n  // Check negative\n  if (!effectiveConfig.allowNegative && value < 0) {\n    errors.push(effectiveConfig.minError || \"Frequency cannot be negative\");\n  }\n\n  // Check min (if allowNegative is true and min is set)\n  if (\n    effectiveConfig.allowNegative &&\n    effectiveConfig.min !== undefined &&\n    value < effectiveConfig.min\n  ) {\n    errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n  }\n\n  // Check max\n  if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n    errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Verifica se valor de frequência é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidFrequency(100);  // true\n * isValidFrequency(-5);   // false\n */\nexport function isValidFrequency(\n  value: unknown,\n  config?: FrequencyValidationConfig,\n): boolean {\n  return validateFrequency(value, config).valid;\n}\n","/**\n * Angle Role - Validate Pillar\n *\n * Validação de valores de ângulo.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * Nota: Ângulos podem ser negativos (rotação anti-horária) e maiores que 360° (múltiplas voltas).\n *\n * @example\n * import { validateAngle, isValidAngle } from '@attrx/role-morphic/angle/validate';\n *\n * validateAngle(90);    // { valid: true, errors: [] }\n * validateAngle(-45);   // { valid: true, errors: [] }\n * validateAngle(720);   // { valid: true, errors: [] }\n * isValidAngle(90);     // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AngleValidationConfig {\n  /** Valor mínimo permitido */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para valor abaixo do mínimo */\n  minError?: string;\n  /** Mensagem de erro para valor acima do máximo */\n  maxError?: string;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\n/** Ângulos não têm restrições por padrão - podem ser negativos e > 360° */\nexport const ANGLE_VALIDATION_CONFIG: AngleValidationConfig = {};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de ângulo\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateAngle(90);                    // { valid: true, errors: [] }\n * validateAngle(-45);                   // { valid: true, errors: [] }\n * validateAngle(90, { max: 180 });      // { valid: true, errors: [] }\n * validateAngle(270, { max: 180 });     // { valid: false, errors: ['...'] }\n */\nexport function validateAngle(\n  value: unknown,\n  config: AngleValidationConfig = ANGLE_VALIDATION_CONFIG,\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Must be a number\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return {\n      valid: false,\n      errors: [\"Value must be a finite number\"],\n    };\n  }\n\n  // Check min\n  if (config.min !== undefined && value < config.min) {\n    errors.push(config.minError || `Value must be at least ${config.min}`);\n  }\n\n  // Check max\n  if (config.max !== undefined && value > config.max) {\n    errors.push(config.maxError || `Value must be at most ${config.max}`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Verifica se valor de ângulo é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidAngle(90);   // true\n * isValidAngle(-45);  // true\n * isValidAngle(NaN);  // false\n */\nexport function isValidAngle(\n  value: unknown,\n  config?: AngleValidationConfig,\n): boolean {\n  return validateAngle(value, config).valid;\n}\n","/**\n * Time Role - Validate Pillar\n *\n * Validação de valores de tempo/duração.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateTime, isValidTime } from '@attrx/role-morphic/time/validate';\n *\n * validateTime(100);   // { valid: true, errors: [] }\n * validateTime(-5);    // { valid: false, errors: ['Time cannot be negative'] }\n * isValidTime(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TimeValidationConfig {\n  /** Valor mínimo permitido (default: 0) */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para valor abaixo do mínimo */\n  minError?: string;\n  /** Mensagem de erro para valor acima do máximo */\n  maxError?: string;\n  /** Permitir valores negativos (default: false) */\n  allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const TIME_VALIDATION_CONFIG: TimeValidationConfig = {\n  min: 0,\n  minError: \"Time cannot be negative\",\n  allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de tempo\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateTime(100);                    // { valid: true, errors: [] }\n * validateTime(-5);                     // { valid: false, errors: ['Time cannot be negative'] }\n * validateTime(-5, { allowNegative: true }); // { valid: true, errors: [] }\n */\nexport function validateTime(\n  value: unknown,\n  config: TimeValidationConfig = TIME_VALIDATION_CONFIG,\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Must be a number\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return {\n      valid: false,\n      errors: [\"Value must be a finite number\"],\n    };\n  }\n\n  // Merge with defaults\n  const effectiveConfig = { ...TIME_VALIDATION_CONFIG, ...config };\n\n  // Check negative\n  if (!effectiveConfig.allowNegative && value < 0) {\n    errors.push(effectiveConfig.minError || \"Time cannot be negative\");\n  }\n\n  // Check min (if allowNegative is true and min is set)\n  if (\n    effectiveConfig.allowNegative &&\n    effectiveConfig.min !== undefined &&\n    value < effectiveConfig.min\n  ) {\n    errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n  }\n\n  // Check max\n  if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n    errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Verifica se valor de tempo é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidTime(100);  // true\n * isValidTime(-5);   // false\n */\nexport function isValidTime(\n  value: unknown,\n  config?: TimeValidationConfig,\n): boolean {\n  return validateTime(value, config).valid;\n}\n","/**\n * Digital Role - Validate Pillar\n *\n * Validação de valores de armazenamento digital.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateDigital, isValidDigital } from '@attrx/role-morphic/digital/validate';\n *\n * validateDigital(100);   // { valid: true, errors: [] }\n * validateDigital(-5);    // { valid: false, errors: ['Digital storage cannot be negative'] }\n * isValidDigital(100);    // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DigitalValidationConfig {\n  /** Valor mínimo permitido (default: 0) */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Mensagem de erro para valor abaixo do mínimo */\n  minError?: string;\n  /** Mensagem de erro para valor acima do máximo */\n  maxError?: string;\n  /** Permitir valores negativos (default: false) */\n  allowNegative?: boolean;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\n// =============================================================================\n// DEFAULT CONFIG\n// =============================================================================\n\nexport const DIGITAL_VALIDATION_CONFIG: DigitalValidationConfig = {\n  min: 0,\n  minError: \"Digital storage cannot be negative\",\n  allowNegative: false,\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor de armazenamento digital\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns Resultado da validação com lista de erros\n *\n * @example\n * validateDigital(100);                    // { valid: true, errors: [] }\n * validateDigital(-5);                     // { valid: false, errors: ['Digital storage cannot be negative'] }\n * validateDigital(-5, { allowNegative: true }); // { valid: true, errors: [] }\n */\nexport function validateDigital(\n  value: unknown,\n  config: DigitalValidationConfig = DIGITAL_VALIDATION_CONFIG,\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Must be a number\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return {\n      valid: false,\n      errors: [\"Value must be a finite number\"],\n    };\n  }\n\n  // Merge with defaults\n  const effectiveConfig = { ...DIGITAL_VALIDATION_CONFIG, ...config };\n\n  // Check negative\n  if (!effectiveConfig.allowNegative && value < 0) {\n    errors.push(effectiveConfig.minError || \"Digital storage cannot be negative\");\n  }\n\n  // Check min (if allowNegative is true and min is set)\n  if (\n    effectiveConfig.allowNegative &&\n    effectiveConfig.min !== undefined &&\n    value < effectiveConfig.min\n  ) {\n    errors.push(effectiveConfig.minError || `Value must be at least ${effectiveConfig.min}`);\n  }\n\n  // Check max\n  if (effectiveConfig.max !== undefined && value > effectiveConfig.max) {\n    errors.push(effectiveConfig.maxError || `Value must be at most ${effectiveConfig.max}`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\n/**\n * Verifica se valor de armazenamento digital é válido (helper booleano)\n *\n * @param value - Valor a validar\n * @param config - Configuração de validação (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidDigital(100);  // true\n * isValidDigital(-5);   // false\n */\nexport function isValidDigital(\n  value: unknown,\n  config?: DigitalValidationConfig,\n): boolean {\n  return validateDigital(value, config).valid;\n}\n","/**\n * Color Role - Validate Pillar\n *\n * Validação de valores de cor.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateColor, isValidColor } from '@attrx/role-morphic/color/validate';\n *\n * validateColor('hex', '#ff0000');           // { valid: true, errors: [] }\n * validateColor('rgb_object', { r: 255, g: 0, b: 0 }); // { valid: true, errors: [] }\n * validateColor('hex', 'invalid');           // { valid: false, errors: [...] }\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type ValidationResult = { valid: boolean; errors: string[] };\n\n// =============================================================================\n// REGEX PATTERNS\n// =============================================================================\n\nconst HEX_3_REGEX = /^#?[0-9a-f]{3}$/i;\nconst HEX_4_REGEX = /^#?[0-9a-f]{4}$/i;\nconst HEX_6_REGEX = /^#?[0-9a-f]{6}$/i;\nconst HEX_8_REGEX = /^#?[0-9a-f]{8}$/i;\nconst RGB_STRING_REGEX = /^rgba?\\s*\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(,\\s*[\\d.]+\\s*)?\\)$/i;\nconst HSL_STRING_REGEX = /^hsla?\\s*\\(\\s*[\\d.]+\\s*,\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*(,\\s*[\\d.]+\\s*)?\\)$/i;\n\n// =============================================================================\n// VALIDATE BY VARIANT\n// =============================================================================\n\n/**\n * Valida valor hex\n */\nexport function validateHex(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"string\") {\n    errors.push(\"Hex color must be a string\");\n    return { valid: false, errors };\n  }\n\n  const trimmed = value.trim();\n\n  if (\n    !HEX_3_REGEX.test(trimmed) &&\n    !HEX_4_REGEX.test(trimmed) &&\n    !HEX_6_REGEX.test(trimmed) &&\n    !HEX_8_REGEX.test(trimmed)\n  ) {\n    errors.push(\"Invalid hex color format\");\n    return { valid: false, errors };\n  }\n\n  return { valid: true, errors: [] };\n}\n\n/**\n * Valida valor RGB object\n */\nexport function validateRgbObject(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"object\" || value === null) {\n    errors.push(\"RGB object must be an object\");\n    return { valid: false, errors };\n  }\n\n  const obj = value as Record<string, unknown>;\n\n  // Verifica propriedades obrigatórias\n  if (typeof obj.r !== \"number\") {\n    errors.push(\"RGB object must have numeric 'r' property\");\n  }\n  if (typeof obj.g !== \"number\") {\n    errors.push(\"RGB object must have numeric 'g' property\");\n  }\n  if (typeof obj.b !== \"number\") {\n    errors.push(\"RGB object must have numeric 'b' property\");\n  }\n\n  if (errors.length > 0) {\n    return { valid: false, errors };\n  }\n\n  const { r, g, b, a } = obj as unknown as ColorRgbObject;\n\n  // Valida ranges\n  if (r < 0 || r > 255) {\n    errors.push(\"RGB 'r' must be between 0 and 255\");\n  }\n  if (g < 0 || g > 255) {\n    errors.push(\"RGB 'g' must be between 0 and 255\");\n  }\n  if (b < 0 || b > 255) {\n    errors.push(\"RGB 'b' must be between 0 and 255\");\n  }\n  if (a !== undefined && (typeof a !== \"number\" || a < 0 || a > 1)) {\n    errors.push(\"RGB 'a' must be a number between 0 and 1\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Valida valor RGB string\n */\nexport function validateRgbString(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"string\") {\n    errors.push(\"RGB string must be a string\");\n    return { valid: false, errors };\n  }\n\n  const trimmed = value.trim();\n\n  if (!RGB_STRING_REGEX.test(trimmed)) {\n    errors.push(\"Invalid RGB string format\");\n    return { valid: false, errors };\n  }\n\n  return { valid: true, errors: [] };\n}\n\n/**\n * Valida valor HSL object\n */\nexport function validateHslObject(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"object\" || value === null) {\n    errors.push(\"HSL object must be an object\");\n    return { valid: false, errors };\n  }\n\n  const obj = value as Record<string, unknown>;\n\n  // Verifica propriedades obrigatórias\n  if (typeof obj.h !== \"number\") {\n    errors.push(\"HSL object must have numeric 'h' property\");\n  }\n  if (typeof obj.s !== \"number\") {\n    errors.push(\"HSL object must have numeric 's' property\");\n  }\n  if (typeof obj.l !== \"number\") {\n    errors.push(\"HSL object must have numeric 'l' property\");\n  }\n\n  if (errors.length > 0) {\n    return { valid: false, errors };\n  }\n\n  const { h, s, l, a } = obj as unknown as ColorHslObject;\n\n  // Valida ranges\n  if (h < 0 || h > 360) {\n    errors.push(\"HSL 'h' must be between 0 and 360\");\n  }\n  if (s < 0 || s > 100) {\n    errors.push(\"HSL 's' must be between 0 and 100\");\n  }\n  if (l < 0 || l > 100) {\n    errors.push(\"HSL 'l' must be between 0 and 100\");\n  }\n  if (a !== undefined && (typeof a !== \"number\" || a < 0 || a > 1)) {\n    errors.push(\"HSL 'a' must be a number between 0 and 1\");\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Valida valor HSL string\n */\nexport function validateHslString(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"string\") {\n    errors.push(\"HSL string must be a string\");\n    return { valid: false, errors };\n  }\n\n  const trimmed = value.trim();\n\n  if (!HSL_STRING_REGEX.test(trimmed)) {\n    errors.push(\"Invalid HSL string format\");\n    return { valid: false, errors };\n  }\n\n  return { valid: true, errors: [] };\n}\n\n// =============================================================================\n// MAIN VALIDATE\n// =============================================================================\n\n/**\n * Valida valor de cor para uma variante específica\n *\n * @param variant - Variante a validar\n * @param value - Valor a validar\n * @returns Resultado da validação\n *\n * @example\n * validateColor('hex', '#ff0000');\n * // { valid: true, errors: [] }\n *\n * validateColor('hex', 'invalid');\n * // { valid: false, errors: ['Invalid hex color format'] }\n */\nexport function validateColor(variant: ColorVariant, value: unknown): ValidationResult {\n  switch (variant) {\n    case \"hex\":\n      return validateHex(value);\n    case \"rgb_object\":\n      return validateRgbObject(value);\n    case \"rgb_string\":\n      return validateRgbString(value);\n    case \"hsl_object\":\n      return validateHslObject(value);\n    case \"hsl_string\":\n      return validateHslString(value);\n    default:\n      return { valid: false, errors: [`Unknown color variant: ${variant}`] };\n  }\n}\n\n/**\n * Verifica se valor é válido para uma variante específica (retorna boolean)\n *\n * @example\n * isValidColorVariant('hex', '#ff0000');  // true\n * isValidColorVariant('hex', 'invalid');  // false\n */\nexport function isValidColorVariant(variant: ColorVariant, value: unknown): boolean {\n  return validateColor(variant, value).valid;\n}\n\n/**\n * Verifica se variante existe\n */\nexport function hasColorVariant(variant: string): variant is ColorVariant {\n  return (\n    variant === \"hex\" ||\n    variant === \"rgb_object\" ||\n    variant === \"rgb_string\" ||\n    variant === \"hsl_object\" ||\n    variant === \"hsl_string\"\n  );\n}\n\n/**\n * Lista de variantes disponíveis\n */\nexport const COLOR_VARIANTS: ColorVariant[] = [\n  \"hex\",\n  \"rgb_object\",\n  \"rgb_string\",\n  \"hsl_object\",\n  \"hsl_string\",\n];\n","/**\n * Date Role - Validate Pillar\n *\n * Validação de valores de data.\n * ZERO dependências de outros pilares - totalmente standalone.\n *\n * @example\n * import { validateDate, isValidDate } from '@attrx/role-morphic/date/validate';\n *\n * validateDate('iso', '2024-12-05T19:30:00.000Z');  // { valid: true, errors: [] }\n * validateDate('timestamp', 1733425800000);         // { valid: true, errors: [] }\n * validateDate('epoch', 1733425800);                // { valid: true, errors: [] }\n */\n\nimport type { DateVariant } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type ValidationResult = { valid: boolean; errors: string[] };\n\n// =============================================================================\n// REGEX PATTERNS\n// =============================================================================\n\nconst ISO_DATE_TIME_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\nconst ISO_DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n// =============================================================================\n// VALIDATE BY VARIANT\n// =============================================================================\n\n/**\n * Valida valor ISO 8601\n */\nexport function validateIso(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"string\") {\n    errors.push(\"ISO date must be a string\");\n    return { valid: false, errors };\n  }\n\n  const trimmed = value.trim();\n\n  // Verifica se é um formato ISO válido\n  if (!ISO_DATE_TIME_REGEX.test(trimmed) && !ISO_DATE_ONLY_REGEX.test(trimmed)) {\n    errors.push(\"Invalid ISO 8601 format\");\n    return { valid: false, errors };\n  }\n\n  // Verifica se a data é parseável\n  const date = new Date(trimmed);\n  if (isNaN(date.getTime())) {\n    errors.push(\"Invalid date value\");\n    return { valid: false, errors };\n  }\n\n  return { valid: true, errors: [] };\n}\n\n/**\n * Valida valor timestamp (milissegundos)\n */\nexport function validateTimestamp(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"number\") {\n    errors.push(\"Timestamp must be a number\");\n    return { valid: false, errors };\n  }\n\n  if (!Number.isFinite(value)) {\n    errors.push(\"Timestamp must be a finite number\");\n    return { valid: false, errors };\n  }\n\n  if (!Number.isInteger(value)) {\n    errors.push(\"Timestamp must be an integer\");\n    return { valid: false, errors };\n  }\n\n  return { valid: true, errors: [] };\n}\n\n/**\n * Valida valor epoch (segundos)\n */\nexport function validateEpoch(value: unknown): ValidationResult {\n  const errors: string[] = [];\n\n  if (typeof value !== \"number\") {\n    errors.push(\"Epoch must be a number\");\n    return { valid: false, errors };\n  }\n\n  if (!Number.isFinite(value)) {\n    errors.push(\"Epoch must be a finite number\");\n    return { valid: false, errors };\n  }\n\n  if (!Number.isInteger(value)) {\n    errors.push(\"Epoch must be an integer\");\n    return { valid: false, errors };\n  }\n\n  return { valid: true, errors: [] };\n}\n\n// =============================================================================\n// MAIN VALIDATE\n// =============================================================================\n\n/**\n * Valida valor de data para uma variante específica\n *\n * @param variant - Variante a validar (\"iso\", \"timestamp\", \"epoch\")\n * @param value - Valor a validar\n * @returns Resultado da validação\n *\n * @example\n * validateDate('iso', '2024-12-05T19:30:00.000Z');\n * // { valid: true, errors: [] }\n *\n * validateDate('iso', 'invalid');\n * // { valid: false, errors: ['Invalid ISO 8601 format'] }\n */\nexport function validateDate(variant: DateVariant, value: unknown): ValidationResult {\n  switch (variant) {\n    case \"iso\":\n      return validateIso(value);\n    case \"timestamp\":\n      return validateTimestamp(value);\n    case \"epoch\":\n      return validateEpoch(value);\n    default:\n      return { valid: false, errors: [`Unknown date variant: ${variant}`] };\n  }\n}\n\n/**\n * Verifica se valor é válido (retorna boolean)\n *\n * @example\n * isValidDate('iso', '2024-12-05T19:30:00.000Z');  // true\n * isValidDate('iso', 'invalid');                   // false\n */\nexport function isValidDate(variant: DateVariant, value: unknown): boolean {\n  return validateDate(variant, value).valid;\n}\n\n/**\n * Verifica se variante existe\n */\nexport function hasDateVariant(variant: string): variant is DateVariant {\n  return variant === \"iso\" || variant === \"timestamp\" || variant === \"epoch\";\n}\n","/**\n * Currency Role - Validate Pillar\n *\n * Validação semântica de valores monetários.\n * Zero dependências externas - pode ser usado standalone.\n *\n * Currency valida o VALOR NUMÉRICO, não o tipo de moeda.\n * O código da moeda é metadata, usado apenas para formatação.\n *\n * @example\n * import { validateCurrency, isValidCurrency } from '@attrx/role-morphic/currency/validate';\n *\n * validateCurrency(100.50);              // { valid: true, errors: [] }\n * validateCurrency(-50);                 // { valid: false, errors: ['Currency value cannot be negative'] }\n * validateCurrency(100.999, { decimals: 2 }); // { valid: false, errors: ['...too many decimal places'] }\n * isValidCurrency(100.50);               // true\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n}\n\nexport interface CurrencyValidationConfig {\n  /** Valor mínimo permitido (default: 0) */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Máximo de casas decimais (default: sem limite) */\n  decimals?: number;\n  /** Permite valores negativos? (default: false) */\n  allowNegative?: boolean;\n  /** Mensagem de erro para min */\n  minError?: string;\n  /** Mensagem de erro para max */\n  maxError?: string;\n}\n\n// =============================================================================\n// CONFIG\n// =============================================================================\n\n/**\n * Configuração padrão de validação para currency\n */\nexport const CURRENCY_VALIDATION_CONFIG: CurrencyValidationConfig = {\n  min: 0,\n  allowNegative: false,\n  minError: \"Currency value cannot be negative\",\n};\n\n// =============================================================================\n// VALIDATE\n// =============================================================================\n\n/**\n * Valida um valor monetário\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns Resultado da validação com erros se houver\n *\n * @example\n * validateCurrency(100.50);                      // { valid: true, errors: [] }\n * validateCurrency(-50);                         // { valid: false, errors: ['Currency value cannot be negative'] }\n * validateCurrency(100.999, { decimals: 2 });    // { valid: false, errors: ['Value has too many decimal places (max: 2)'] }\n * validateCurrency(1000000, { max: 10000 });     // { valid: false, errors: ['Value must be at most 10000'] }\n * validateCurrency(-50, { allowNegative: true }); // { valid: true, errors: [] }\n */\nexport function validateCurrency(\n  value: unknown,\n  config: CurrencyValidationConfig = CURRENCY_VALIDATION_CONFIG\n): ValidationResult {\n  const errors: string[] = [];\n\n  // Type check\n  if (typeof value !== \"number\") {\n    return { valid: false, errors: [\"Value must be a number\"] };\n  }\n\n  // Finite check\n  if (!Number.isFinite(value)) {\n    return { valid: false, errors: [\"Value must be finite\"] };\n  }\n\n  // Negative check (se não permitido)\n  if (!config.allowNegative && value < 0) {\n    const msg = config.minError ?? \"Currency value cannot be negative\";\n    errors.push(msg);\n  }\n\n  // Min check (se allowNegative, pode ter min customizado)\n  if (config.allowNegative && config.min !== undefined && value < config.min) {\n    const msg = config.minError ?? `Value must be at least ${config.min}`;\n    errors.push(msg);\n  }\n\n  // Max check\n  if (config.max !== undefined && value > config.max) {\n    const msg = config.maxError ?? `Value must be at most ${config.max}`;\n    errors.push(msg);\n  }\n\n  // Decimals check\n  if (config.decimals !== undefined) {\n    const decimalPlaces = countDecimalPlaces(value);\n    if (decimalPlaces > config.decimals) {\n      errors.push(\n        `Value has too many decimal places (max: ${config.decimals})`\n      );\n    }\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n\n/**\n * Verifica se um valor monetário é válido\n *\n * @param value - Valor a ser validado\n * @param config - Configuração customizada (opcional)\n * @returns true se válido, false caso contrário\n *\n * @example\n * isValidCurrency(100.50);   // true\n * isValidCurrency(-50);      // false\n */\nexport function isValidCurrency(\n  value: unknown,\n  config: CurrencyValidationConfig = CURRENCY_VALIDATION_CONFIG\n): boolean {\n  return validateCurrency(value, config).valid;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Conta casas decimais de um número\n */\nfunction countDecimalPlaces(value: number): number {\n  if (Number.isInteger(value)) {\n    return 0;\n  }\n\n  const str = String(value);\n  const decimalIndex = str.indexOf(\".\");\n\n  if (decimalIndex === -1) {\n    return 0;\n  }\n\n  return str.length - decimalIndex - 1;\n}\n","/**\n * Area Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de área.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AreaUnit =\n  // SI\n  | \"square_kilometer\"\n  | \"hectare\"\n  | \"are\"\n  | \"square_meter\"\n  | \"square_decimeter\"\n  | \"square_centimeter\"\n  | \"square_millimeter\"\n  // Imperial/US\n  | \"square_mile\"\n  | \"acre\"\n  | \"square_yard\"\n  | \"square_foot\"\n  | \"square_inch\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de área.\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Imperial: derivados de (comprimento)² onde comprimento é exato desde 1959\n *\n * Relações imperiais:\n * - 1 in² = (0.0254 m)² = 0.00064516 m²\n * - 1 ft² = (0.3048 m)² = 0.09290304 m²\n * - 1 yd² = (0.9144 m)² = 0.83612736 m²\n * - 1 mi² = (1609.344 m)² = 2589988.110336 m²\n * - 1 acre = 43560 ft² = 4046.8564224 m²\n */\nexport const AREA_UNITS: Record<AreaUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  square_kilometer: {\n    factor: 1_000_000,\n    symbol: \"km²\",\n    singular: \"square kilometer\",\n    plural: \"square kilometers\",\n  },\n  hectare: {\n    factor: 10_000,\n    symbol: \"ha\",\n    singular: \"hectare\",\n    plural: \"hectares\",\n  },\n  are: {\n    factor: 100,\n    symbol: \"a\",\n    singular: \"are\",\n    plural: \"ares\",\n  },\n  square_meter: {\n    factor: 1,\n    symbol: \"m²\",\n    singular: \"square meter\",\n    plural: \"square meters\",\n  },\n  square_decimeter: {\n    factor: 0.01,\n    symbol: \"dm²\",\n    singular: \"square decimeter\",\n    plural: \"square decimeters\",\n  },\n  square_centimeter: {\n    factor: 0.0001,\n    symbol: \"cm²\",\n    singular: \"square centimeter\",\n    plural: \"square centimeters\",\n  },\n  square_millimeter: {\n    factor: 0.000001,\n    symbol: \"mm²\",\n    singular: \"square millimeter\",\n    plural: \"square millimeters\",\n  },\n\n  // Imperial/US (todos exatos, derivados de comprimento² desde 1959)\n  square_mile: {\n    factor: 2_589_988.110336,\n    symbol: \"mi²\",\n    singular: \"square mile\",\n    plural: \"square miles\",\n  },\n  acre: {\n    factor: 4_046.8564224,\n    symbol: \"ac\",\n    singular: \"acre\",\n    plural: \"acres\",\n  },\n  square_yard: {\n    factor: 0.83612736,\n    symbol: \"yd²\",\n    singular: \"square yard\",\n    plural: \"square yards\",\n  },\n  square_foot: {\n    factor: 0.09290304,\n    symbol: \"ft²\",\n    singular: \"square foot\",\n    plural: \"square feet\",\n  },\n  square_inch: {\n    factor: 0.00064516,\n    symbol: \"in²\",\n    singular: \"square inch\",\n    plural: \"square inches\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const AREA_ALIASES: UnitAliases = {\n  // square_kilometer\n  \"km²\": \"square_kilometer\",\n  km2: \"square_kilometer\",\n  // hectare\n  ha: \"hectare\",\n  // are\n  a: \"are\",\n  // square_meter\n  \"m²\": \"square_meter\",\n  m2: \"square_meter\",\n  // square_decimeter\n  \"dm²\": \"square_decimeter\",\n  dm2: \"square_decimeter\",\n  // square_centimeter\n  \"cm²\": \"square_centimeter\",\n  cm2: \"square_centimeter\",\n  // square_millimeter\n  \"mm²\": \"square_millimeter\",\n  mm2: \"square_millimeter\",\n  // square_mile\n  \"mi²\": \"square_mile\",\n  mi2: \"square_mile\",\n  // acre\n  ac: \"acre\",\n  // square_yard\n  \"yd²\": \"square_yard\",\n  yd2: \"square_yard\",\n  // square_foot\n  \"ft²\": \"square_foot\",\n  ft2: \"square_foot\",\n  // square_inch\n  \"in²\": \"square_inch\",\n  in2: \"square_inch\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const AREA_UNIT_LIST = Object.keys(AREA_UNITS) as AreaUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const AREA_FACTORS: Record<AreaUnit, number> = Object.fromEntries(\n  Object.entries(AREA_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<AreaUnit, number>;\n","/**\n * Area Role - Convert Pillar\n *\n * Conversão entre unidades de área usando arquitetura hub-and-spoke.\n * Base: square_meter (m²)\n *\n * @example\n * import { convertArea, toBaseArea, fromBaseArea } from '@attrx/role-morphic/area/convert';\n *\n * convertArea('hectare', 'acre', 1);     // 2.47105...\n * toBaseArea('hectare', 1);              // 10000\n * fromBaseArea('acre', 10000);           // 2.47105...\n */\n\nimport { AREA_UNITS, type AreaUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const AREA_BASE: AreaUnit = \"square_meter\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (square_meter)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em square_meter\n *\n * @example\n * toBaseArea('hectare', 1);     // 10000\n * toBaseArea('acre', 1);        // 4046.8564224\n */\nexport function toBaseArea(variant: AreaUnit, value: number): number {\n  const unit = AREA_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (square_meter) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em square_meter\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseArea('hectare', 10000);  // 1\n * fromBaseArea('acre', 4046.86);   // ~1\n */\nexport function fromBaseArea(variant: AreaUnit, baseValue: number): number {\n  const unit = AREA_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de área\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertArea('hectare', 'acre', 1);           // 2.47105...\n * convertArea('square_meter', 'hectare', 10000); // 1\n */\nexport function convertArea(\n  from: AreaUnit,\n  to: AreaUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const baseValue = toBaseArea(from, value);\n  return fromBaseArea(to, baseValue);\n}\n\n/**\n * Versão safe de convertArea que retorna Result\n *\n * @example\n * tryConvertArea('hectare', 'acre', 1);\n * // { ok: true, value: 2.47105... }\n *\n * tryConvertArea('invalid', 'acre', 1);\n * // { ok: false, error: 'Unknown area variant: invalid' }\n */\nexport function tryConvertArea(\n  from: AreaUnit,\n  to: AreaUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertArea(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasAreaVariant(variant: string): variant is AreaUnit {\n  return variant in AREA_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getAreaVariants(): AreaUnit[] {\n  return Object.keys(AREA_UNITS) as AreaUnit[];\n}\n","/**\n * Length Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de comprimento.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type LengthUnit =\n  // SI\n  | \"kilometer\"\n  | \"hectometer\"\n  | \"decameter\"\n  | \"meter\"\n  | \"decimeter\"\n  | \"centimeter\"\n  | \"millimeter\"\n  | \"micrometer\"\n  | \"nanometer\"\n  // Imperial/US\n  | \"inch\"\n  | \"foot\"\n  | \"yard\"\n  | \"mile\"\n  // Nautical\n  | \"nautical_mile\"\n  // Other\n  | \"fathom\"\n  | \"furlong\"\n  | \"league\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de comprimento.\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Imperial: exatos desde International Yard and Pound Agreement (1959)\n *   - 1 yard = 0.9144 m (exato por definição)\n *   - 1 foot = 0.3048 m (= yard/3)\n *   - 1 inch = 0.0254 m (= foot/12)\n *   - 1 mile = 1609.344 m (= 5280 feet)\n */\nexport const LENGTH_UNITS: Record<LengthUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  kilometer: {\n    factor: 1000,\n    symbol: \"km\",\n    singular: \"kilometer\",\n    plural: \"kilometers\",\n  },\n  hectometer: {\n    factor: 100,\n    symbol: \"hm\",\n    singular: \"hectometer\",\n    plural: \"hectometers\",\n  },\n  decameter: {\n    factor: 10,\n    symbol: \"dam\",\n    singular: \"decameter\",\n    plural: \"decameters\",\n  },\n  meter: {\n    factor: 1,\n    symbol: \"m\",\n    singular: \"meter\",\n    plural: \"meters\",\n  },\n  decimeter: {\n    factor: 0.1,\n    symbol: \"dm\",\n    singular: \"decimeter\",\n    plural: \"decimeters\",\n  },\n  centimeter: {\n    factor: 0.01,\n    symbol: \"cm\",\n    singular: \"centimeter\",\n    plural: \"centimeters\",\n  },\n  millimeter: {\n    factor: 0.001,\n    symbol: \"mm\",\n    singular: \"millimeter\",\n    plural: \"millimeters\",\n  },\n  micrometer: {\n    factor: 0.000001,\n    symbol: \"μm\",\n    singular: \"micrometer\",\n    plural: \"micrometers\",\n  },\n  nanometer: {\n    factor: 0.000000001,\n    symbol: \"nm\",\n    singular: \"nanometer\",\n    plural: \"nanometers\",\n  },\n\n  // Imperial/US (exatos desde 1959)\n  inch: {\n    factor: 0.0254,\n    symbol: \"in\",\n    singular: \"inch\",\n    plural: \"inches\",\n  },\n  foot: {\n    factor: 0.3048,\n    symbol: \"ft\",\n    singular: \"foot\",\n    plural: \"feet\",\n  },\n  yard: {\n    factor: 0.9144,\n    symbol: \"yd\",\n    singular: \"yard\",\n    plural: \"yards\",\n  },\n  mile: {\n    factor: 1609.344,\n    symbol: \"mi\",\n    singular: \"mile\",\n    plural: \"miles\",\n  },\n\n  // Nautical (exato por definição internacional)\n  nautical_mile: {\n    factor: 1852,\n    symbol: \"nmi\",\n    singular: \"nautical mile\",\n    plural: \"nautical miles\",\n  },\n\n  // Other (derivados, portanto exatos)\n  fathom: {\n    factor: 1.8288, // 6 feet\n    symbol: \"ftm\",\n    singular: \"fathom\",\n    plural: \"fathoms\",\n  },\n  furlong: {\n    factor: 201.168, // 660 feet = 1/8 mile\n    symbol: \"fur\",\n    singular: \"furlong\",\n    plural: \"furlongs\",\n  },\n  league: {\n    factor: 4828.032, // 3 miles\n    symbol: \"lea\",\n    singular: \"league\",\n    plural: \"leagues\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const LENGTH_ALIASES: UnitAliases = {\n  // kilometer\n  km: \"kilometer\",\n  // hectometer\n  hm: \"hectometer\",\n  // decameter\n  dam: \"decameter\",\n  // meter\n  m: \"meter\",\n  // decimeter\n  dm: \"decimeter\",\n  // centimeter\n  cm: \"centimeter\",\n  // millimeter\n  mm: \"millimeter\",\n  // micrometer\n  \"μm\": \"micrometer\",\n  um: \"micrometer\",\n  // nanometer\n  nm: \"nanometer\",\n  // inch\n  in: \"inch\",\n  '\"': \"inch\",\n  // foot\n  ft: \"foot\",\n  \"'\": \"foot\",\n  // yard\n  yd: \"yard\",\n  // mile\n  mi: \"mile\",\n  // nautical_mile\n  nmi: \"nautical_mile\",\n  // fathom\n  ftm: \"fathom\",\n  // furlong\n  fur: \"furlong\",\n  // league\n  lea: \"league\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const LENGTH_UNIT_LIST = Object.keys(LENGTH_UNITS) as LengthUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const LENGTH_FACTORS: Record<LengthUnit, number> = Object.fromEntries(\n  Object.entries(LENGTH_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<LengthUnit, number>;\n","/**\n * Length Role - Convert Pillar\n *\n * Conversão entre unidades de comprimento usando arquitetura hub-and-spoke.\n * Base: meter (m)\n *\n * @example\n * import { convertLength, toBaseLength, fromBaseLength } from '@attrx/role-morphic/length/convert';\n *\n * convertLength('kilometer', 'mile', 1);     // 0.621371...\n * toBaseLength('kilometer', 1);              // 1000\n * fromBaseLength('mile', 1000);              // 0.621371...\n */\n\nimport { LENGTH_UNITS, type LengthUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const LENGTH_BASE: LengthUnit = \"meter\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (meter)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em meters\n *\n * @example\n * toBaseLength('kilometer', 1);  // 1000\n * toBaseLength('mile', 1);       // 1609.344\n */\nexport function toBaseLength(variant: LengthUnit, value: number): number {\n  const unit = LENGTH_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (meter) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em meters\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseLength('kilometer', 1000);  // 1\n * fromBaseLength('mile', 1609.344);   // 1\n */\nexport function fromBaseLength(variant: LengthUnit, baseValue: number): number {\n  const unit = LENGTH_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de comprimento\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertLength('kilometer', 'mile', 1);     // 0.621371...\n * convertLength('foot', 'meter', 1);         // 0.3048\n */\nexport function convertLength(\n  from: LengthUnit,\n  to: LengthUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const baseValue = toBaseLength(from, value);\n  return fromBaseLength(to, baseValue);\n}\n\n/**\n * Versão safe de convertLength que retorna Result\n *\n * @example\n * tryConvertLength('kilometer', 'mile', 1);\n * // { ok: true, value: 0.621371... }\n *\n * tryConvertLength('invalid', 'mile', 1);\n * // { ok: false, error: 'Unknown length variant: invalid' }\n */\nexport function tryConvertLength(\n  from: LengthUnit,\n  to: LengthUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertLength(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasLengthVariant(variant: string): variant is LengthUnit {\n  return variant in LENGTH_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getLengthVariants(): LengthUnit[] {\n  return Object.keys(LENGTH_UNITS) as LengthUnit[];\n}\n","/**\n * Mass Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de massa.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - International Yard and Pound Agreement (1959)\n * - SI Brochure, 9th Edition (2019)\n *\n * Nota: Massa ≠ Peso\n * - Massa: quantidade de matéria (invariante)\n * - Peso: força gravitacional (varia com localização)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type MassUnit =\n  // SI / Metric\n  | \"metric_ton\"\n  | \"kilogram\"\n  | \"hectogram\"\n  | \"decagram\"\n  | \"gram\"\n  | \"decigram\"\n  | \"centigram\"\n  | \"milligram\"\n  | \"microgram\"\n  // Avoirdupois (US/UK)\n  | \"long_ton\"\n  | \"short_ton\"\n  | \"stone\"\n  | \"pound\"\n  | \"ounce\"\n  | \"dram\"\n  | \"grain\"\n  // Troy (metais preciosos)\n  | \"troy_pound\"\n  | \"troy_ounce\"\n  | \"pennyweight\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de massa.\n *\n * Base: kilogram (kg) - Unidade SI de massa\n *\n * TODOS os fatores são EXATOS:\n * - SI: derivados de potências de 10\n * - Avoirdupois: exatos desde International Yard and Pound Agreement (1959)\n *   - 1 pound = 0.45359237 kg (exato por definição)\n *   - Outras derivadas de pound\n * - Troy: derivados de grain e pound avoirdupois\n */\nexport const MASS_UNITS: Record<MassUnit, SimpleUnitConfig> = {\n  // ===========================================================================\n  // SI / Metric\n  // ===========================================================================\n  metric_ton: {\n    factor: 1000,\n    symbol: \"t\",\n    singular: \"metric ton\",\n    plural: \"metric tons\",\n  },\n  kilogram: {\n    factor: 1,\n    symbol: \"kg\",\n    singular: \"kilogram\",\n    plural: \"kilograms\",\n  },\n  hectogram: {\n    factor: 0.1,\n    symbol: \"hg\",\n    singular: \"hectogram\",\n    plural: \"hectograms\",\n  },\n  decagram: {\n    factor: 0.01,\n    symbol: \"dag\",\n    singular: \"decagram\",\n    plural: \"decagrams\",\n  },\n  gram: {\n    factor: 0.001,\n    symbol: \"g\",\n    singular: \"gram\",\n    plural: \"grams\",\n  },\n  decigram: {\n    factor: 0.0001,\n    symbol: \"dg\",\n    singular: \"decigram\",\n    plural: \"decigrams\",\n  },\n  centigram: {\n    factor: 0.00001,\n    symbol: \"cg\",\n    singular: \"centigram\",\n    plural: \"centigrams\",\n  },\n  milligram: {\n    factor: 0.000001,\n    symbol: \"mg\",\n    singular: \"milligram\",\n    plural: \"milligrams\",\n  },\n  microgram: {\n    factor: 0.000000001,\n    symbol: \"μg\",\n    singular: \"microgram\",\n    plural: \"micrograms\",\n  },\n\n  // ===========================================================================\n  // Avoirdupois (US/UK) - Sistema padrão para peso comum\n  // ===========================================================================\n  long_ton: {\n    factor: 1016.0469088, // 2240 lb (exato)\n    symbol: \"long tn\",\n    singular: \"long ton\",\n    plural: \"long tons\",\n  },\n  short_ton: {\n    factor: 907.18474, // 2000 lb (exato)\n    symbol: \"sh tn\",\n    singular: \"short ton\",\n    plural: \"short tons\",\n  },\n  stone: {\n    factor: 6.35029318, // 14 lb (exato)\n    symbol: \"st\",\n    singular: \"stone\",\n    plural: \"stone\", // stone não muda no plural em inglês\n  },\n  pound: {\n    factor: 0.45359237, // Exato desde 1959\n    symbol: \"lb\",\n    singular: \"pound\",\n    plural: \"pounds\",\n  },\n  ounce: {\n    factor: 0.028349523125, // 1/16 lb (exato)\n    symbol: \"oz\",\n    singular: \"ounce\",\n    plural: \"ounces\",\n  },\n  dram: {\n    factor: 0.0017718451953125, // 1/16 oz (exato)\n    symbol: \"dr\",\n    singular: \"dram\",\n    plural: \"drams\",\n  },\n  grain: {\n    factor: 0.00006479891, // 1/7000 lb (exato)\n    symbol: \"gr\",\n    singular: \"grain\",\n    plural: \"grains\",\n  },\n\n  // ===========================================================================\n  // Troy (metais preciosos)\n  // ===========================================================================\n  troy_pound: {\n    factor: 0.3732417216, // 12 troy oz (exato)\n    symbol: \"lb t\",\n    singular: \"troy pound\",\n    plural: \"troy pounds\",\n  },\n  troy_ounce: {\n    factor: 0.0311034768, // 480 grains (exato)\n    symbol: \"oz t\",\n    singular: \"troy ounce\",\n    plural: \"troy ounces\",\n  },\n  pennyweight: {\n    factor: 0.00155517384, // 1/20 troy oz (exato)\n    symbol: \"dwt\",\n    singular: \"pennyweight\",\n    plural: \"pennyweights\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const MASS_ALIASES: UnitAliases = {\n  // metric_ton\n  t: \"metric_ton\",\n  // kilogram\n  kg: \"kilogram\",\n  // hectogram\n  hg: \"hectogram\",\n  // decagram\n  dag: \"decagram\",\n  // gram\n  g: \"gram\",\n  // decigram\n  dg: \"decigram\",\n  // centigram\n  cg: \"centigram\",\n  // milligram\n  mg: \"milligram\",\n  // microgram\n  \"μg\": \"microgram\",\n  ug: \"microgram\",\n  mcg: \"microgram\",\n  // long_ton\n  \"long tn\": \"long_ton\",\n  // short_ton\n  \"sh tn\": \"short_ton\",\n  // stone\n  st: \"stone\",\n  // pound\n  lb: \"pound\",\n  lbs: \"pound\",\n  \"#\": \"pound\",\n  // ounce\n  oz: \"ounce\",\n  // dram\n  dr: \"dram\",\n  // grain\n  gr: \"grain\",\n  // troy_pound\n  \"lb t\": \"troy_pound\",\n  // troy_ounce\n  \"oz t\": \"troy_ounce\",\n  ozt: \"troy_ounce\",\n  // pennyweight\n  dwt: \"pennyweight\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const MASS_UNIT_LIST = Object.keys(MASS_UNITS) as MassUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const MASS_FACTORS: Record<MassUnit, number> = Object.fromEntries(\n  Object.entries(MASS_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<MassUnit, number>;\n","/**\n * Mass Role - Convert Pillar\n *\n * Conversão entre unidades de massa usando arquitetura hub-and-spoke.\n * Base: kilogram (kg)\n *\n * @example\n * import { convertMass, toBaseMass, fromBaseMass } from '@attrx/role-morphic/mass/convert';\n *\n * convertMass('kilogram', 'pound', 1);     // 2.20462...\n * toBaseMass('pound', 1);                  // 0.45359237\n * fromBaseMass('pound', 0.45359237);       // 1\n */\n\nimport { MASS_UNITS, type MassUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const MASS_BASE: MassUnit = \"kilogram\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (kilogram)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em kilogram\n *\n * @example\n * toBaseMass('pound', 1);     // 0.45359237\n * toBaseMass('gram', 1000);   // 1\n */\nexport function toBaseMass(variant: MassUnit, value: number): number {\n  const unit = MASS_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (kilogram) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em kilogram\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseMass('pound', 1);        // 2.20462...\n * fromBaseMass('gram', 1);         // 1000\n */\nexport function fromBaseMass(variant: MassUnit, baseValue: number): number {\n  const unit = MASS_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de massa\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertMass('kilogram', 'pound', 1);     // 2.20462...\n * convertMass('pound', 'kilogram', 2.2);   // ~1\n * convertMass('gram', 'milligram', 1);     // 1000\n */\nexport function convertMass(\n  from: MassUnit,\n  to: MassUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const baseValue = toBaseMass(from, value);\n  return fromBaseMass(to, baseValue);\n}\n\n/**\n * Versão safe de convertMass que retorna Result\n *\n * @example\n * tryConvertMass('kilogram', 'pound', 1);\n * // { ok: true, value: 2.20462... }\n *\n * tryConvertMass('invalid', 'pound', 1);\n * // { ok: false, error: 'Unknown mass variant: invalid' }\n */\nexport function tryConvertMass(\n  from: MassUnit,\n  to: MassUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertMass(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasMassVariant(variant: string): variant is MassUnit {\n  return variant in MASS_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getMassVariants(): MassUnit[] {\n  return Object.keys(MASS_UNITS) as MassUnit[];\n}\n","/**\n * Temperature Role - Convert Pillar\n *\n * Conversão entre unidades de temperatura usando arquitetura hub-and-spoke.\n * Base: celsius (°C)\n *\n * IMPORTANTE: Diferente de outras roles, temperatura usa FÓRMULAS\n * ao invés de fatores multiplicativos (escalas têm offsets diferentes).\n *\n * Fórmulas de conversão:\n * - Celsius ↔ Fahrenheit: °F = °C × 9/5 + 32\n * - Celsius ↔ Kelvin: K = °C + 273.15\n * - Celsius ↔ Rankine: °R = (°C + 273.15) × 9/5\n *\n * @example\n * import { convertTemperature, toBaseTemperature, fromBaseTemperature } from '@attrx/role-morphic/temperature/convert';\n *\n * convertTemperature('celsius', 'fahrenheit', 0);   // 32\n * convertTemperature('celsius', 'kelvin', 0);       // 273.15\n * toBaseTemperature('fahrenheit', 32);              // 0\n * fromBaseTemperature('kelvin', 0);                 // 273.15\n */\n\nimport { TEMPERATURE_UNITS, type TemperatureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const TEMPERATURE_BASE: TemperatureUnit = \"celsius\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (celsius)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em celsius\n *\n * @example\n * toBaseTemperature('fahrenheit', 32);   // 0\n * toBaseTemperature('kelvin', 273.15);   // 0\n * toBaseTemperature('rankine', 491.67);  // 0\n */\nexport function toBaseTemperature(variant: TemperatureUnit, value: number): number {\n  const unit = TEMPERATURE_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n\n  // Temperatura usa fórmulas (toBase/fromBase), não factor\n  if (unit.toBase) {\n    return unit.toBase(value);\n  }\n\n  // Fallback (não deveria acontecer para temperature)\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (celsius) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em celsius\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseTemperature('fahrenheit', 0);   // 32\n * fromBaseTemperature('kelvin', 0);       // 273.15\n * fromBaseTemperature('rankine', 0);      // 491.67\n */\nexport function fromBaseTemperature(variant: TemperatureUnit, baseValue: number): number {\n  const unit = TEMPERATURE_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n\n  // Temperatura usa fórmulas (toBase/fromBase), não factor\n  if (unit.fromBase) {\n    return unit.fromBase(baseValue);\n  }\n\n  // Fallback (não deveria acontecer para temperature)\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de temperatura\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertTemperature('celsius', 'fahrenheit', 0);     // 32\n * convertTemperature('celsius', 'fahrenheit', 100);   // 212\n * convertTemperature('fahrenheit', 'celsius', 32);    // 0\n * convertTemperature('celsius', 'kelvin', 0);         // 273.15\n * convertTemperature('kelvin', 'rankine', 0);         // 0\n */\nexport function convertTemperature(\n  from: TemperatureUnit,\n  to: TemperatureUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base (celsius) → to\n  const baseValue = toBaseTemperature(from, value);\n  return fromBaseTemperature(to, baseValue);\n}\n\n/**\n * Versão safe de convertTemperature que retorna Result\n *\n * @example\n * tryConvertTemperature('celsius', 'fahrenheit', 0);\n * // { ok: true, value: 32 }\n *\n * tryConvertTemperature('invalid', 'fahrenheit', 0);\n * // { ok: false, error: 'Unknown temperature variant: invalid' }\n */\nexport function tryConvertTemperature(\n  from: TemperatureUnit,\n  to: TemperatureUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertTemperature(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasTemperatureVariant(variant: string): variant is TemperatureUnit {\n  return variant in TEMPERATURE_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getTemperatureVariants(): TemperatureUnit[] {\n  return Object.keys(TEMPERATURE_UNITS) as TemperatureUnit[];\n}\n","/**\n * Volume Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de volume.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - NIST Handbook 44 (2024)\n * - SI Brochure, 9th Edition (2019)\n *\n * Notas:\n * - Base: liter (L) - unidade aceita para uso com o SI\n * - 1 L = 1 dm³ = 0.001 m³\n * - Galão US vs UK: ~20% diferença (UK é maior)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type VolumeUnit =\n  // SI / Métrico\n  | \"cubic_meter\"\n  | \"cubic_decimeter\"\n  | \"cubic_centimeter\"\n  | \"cubic_millimeter\"\n  | \"hectoliter\"\n  | \"decaliter\"\n  | \"liter\"\n  | \"deciliter\"\n  | \"centiliter\"\n  | \"milliliter\"\n  | \"microliter\"\n  // US Customary\n  | \"gallon_us\"\n  | \"quart_us\"\n  | \"pint_us\"\n  | \"cup_us\"\n  | \"fluid_ounce_us\"\n  | \"tablespoon_us\"\n  | \"teaspoon_us\"\n  // Imperial (UK)\n  | \"gallon_uk\"\n  | \"quart_uk\"\n  | \"pint_uk\"\n  | \"fluid_ounce_uk\"\n  // Other\n  | \"barrel_oil\"\n  | \"cubic_inch\"\n  | \"cubic_foot\"\n  | \"cubic_yard\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de volume.\n *\n * Base: liter (L)\n *\n * Fatores exatos:\n * - SI: derivados de potências de 10\n * - US: baseados em 1 gallon US = 231 in³ (exato)\n * - UK: 1 gallon UK = 4.54609 L (exato, definição 1985)\n */\nexport const VOLUME_UNITS: Record<VolumeUnit, SimpleUnitConfig> = {\n  // SI / Métrico\n  cubic_meter: {\n    factor: 1000,\n    symbol: \"m³\",\n    singular: \"cubic meter\",\n    plural: \"cubic meters\",\n  },\n  cubic_decimeter: {\n    factor: 1,\n    symbol: \"dm³\",\n    singular: \"cubic decimeter\",\n    plural: \"cubic decimeters\",\n  },\n  cubic_centimeter: {\n    factor: 0.001,\n    symbol: \"cm³\",\n    singular: \"cubic centimeter\",\n    plural: \"cubic centimeters\",\n  },\n  cubic_millimeter: {\n    factor: 0.000001,\n    symbol: \"mm³\",\n    singular: \"cubic millimeter\",\n    plural: \"cubic millimeters\",\n  },\n  hectoliter: {\n    factor: 100,\n    symbol: \"hL\",\n    singular: \"hectoliter\",\n    plural: \"hectoliters\",\n  },\n  decaliter: {\n    factor: 10,\n    symbol: \"daL\",\n    singular: \"decaliter\",\n    plural: \"decaliters\",\n  },\n  liter: {\n    factor: 1,\n    symbol: \"L\",\n    singular: \"liter\",\n    plural: \"liters\",\n  },\n  deciliter: {\n    factor: 0.1,\n    symbol: \"dL\",\n    singular: \"deciliter\",\n    plural: \"deciliters\",\n  },\n  centiliter: {\n    factor: 0.01,\n    symbol: \"cL\",\n    singular: \"centiliter\",\n    plural: \"centiliters\",\n  },\n  milliliter: {\n    factor: 0.001,\n    symbol: \"mL\",\n    singular: \"milliliter\",\n    plural: \"milliliters\",\n  },\n  microliter: {\n    factor: 0.000001,\n    symbol: \"μL\",\n    singular: \"microliter\",\n    plural: \"microliters\",\n  },\n\n  // US Customary (baseado em 1 gallon = 231 in³ = 3.785411784 L)\n  gallon_us: {\n    factor: 3.785411784,\n    symbol: \"gal\",\n    singular: \"gallon\",\n    plural: \"gallons\",\n  },\n  quart_us: {\n    factor: 0.946352946, // gallon/4\n    symbol: \"qt\",\n    singular: \"quart\",\n    plural: \"quarts\",\n  },\n  pint_us: {\n    factor: 0.473176473, // gallon/8\n    symbol: \"pt\",\n    singular: \"pint\",\n    plural: \"pints\",\n  },\n  cup_us: {\n    factor: 0.2365882365, // gallon/16\n    symbol: \"cup\",\n    singular: \"cup\",\n    plural: \"cups\",\n  },\n  fluid_ounce_us: {\n    factor: 0.0295735295625, // gallon/128\n    symbol: \"fl oz\",\n    singular: \"fluid ounce\",\n    plural: \"fluid ounces\",\n  },\n  tablespoon_us: {\n    factor: 0.01478676478125, // fl oz/2\n    symbol: \"tbsp\",\n    singular: \"tablespoon\",\n    plural: \"tablespoons\",\n  },\n  teaspoon_us: {\n    factor: 0.00492892159375, // tbsp/3\n    symbol: \"tsp\",\n    singular: \"teaspoon\",\n    plural: \"teaspoons\",\n  },\n\n  // Imperial UK (1 gallon UK = 4.54609 L exato)\n  gallon_uk: {\n    factor: 4.54609,\n    symbol: \"gal (UK)\",\n    singular: \"gallon (UK)\",\n    plural: \"gallons (UK)\",\n  },\n  quart_uk: {\n    factor: 1.1365225, // gallon/4\n    symbol: \"qt (UK)\",\n    singular: \"quart (UK)\",\n    plural: \"quarts (UK)\",\n  },\n  pint_uk: {\n    factor: 0.56826125, // gallon/8\n    symbol: \"pt (UK)\",\n    singular: \"pint (UK)\",\n    plural: \"pints (UK)\",\n  },\n  fluid_ounce_uk: {\n    factor: 0.0284130625, // gallon/160\n    symbol: \"fl oz (UK)\",\n    singular: \"fluid ounce (UK)\",\n    plural: \"fluid ounces (UK)\",\n  },\n\n  // Other\n  barrel_oil: {\n    factor: 158.987294928, // 42 US gallons (petroleum)\n    symbol: \"bbl\",\n    singular: \"barrel\",\n    plural: \"barrels\",\n  },\n  cubic_inch: {\n    factor: 0.016387064, // (0.0254)³ × 1000\n    symbol: \"in³\",\n    singular: \"cubic inch\",\n    plural: \"cubic inches\",\n  },\n  cubic_foot: {\n    factor: 28.316846592, // (0.3048)³ × 1000\n    symbol: \"ft³\",\n    singular: \"cubic foot\",\n    plural: \"cubic feet\",\n  },\n  cubic_yard: {\n    factor: 764.554857984, // (0.9144)³ × 1000\n    symbol: \"yd³\",\n    singular: \"cubic yard\",\n    plural: \"cubic yards\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const VOLUME_ALIASES: UnitAliases = {\n  // cubic_meter\n  \"m³\": \"cubic_meter\",\n  m3: \"cubic_meter\",\n  // cubic_decimeter\n  \"dm³\": \"cubic_decimeter\",\n  dm3: \"cubic_decimeter\",\n  // cubic_centimeter\n  \"cm³\": \"cubic_centimeter\",\n  cm3: \"cubic_centimeter\",\n  cc: \"cubic_centimeter\",\n  // cubic_millimeter\n  \"mm³\": \"cubic_millimeter\",\n  mm3: \"cubic_millimeter\",\n  // hectoliter\n  hL: \"hectoliter\",\n  hl: \"hectoliter\",\n  // decaliter\n  daL: \"decaliter\",\n  dal: \"decaliter\",\n  // liter\n  L: \"liter\",\n  l: \"liter\",\n  // deciliter\n  dL: \"deciliter\",\n  dl: \"deciliter\",\n  // centiliter\n  cL: \"centiliter\",\n  cl: \"centiliter\",\n  // milliliter\n  mL: \"milliliter\",\n  ml: \"milliliter\",\n  // microliter\n  \"μL\": \"microliter\",\n  uL: \"microliter\",\n  ul: \"microliter\",\n  // gallon_us\n  gal: \"gallon_us\",\n  // quart_us\n  qt: \"quart_us\",\n  // pint_us\n  pt: \"pint_us\",\n  // cup_us\n  cup: \"cup_us\",\n  // fluid_ounce_us\n  \"fl oz\": \"fluid_ounce_us\",\n  floz: \"fluid_ounce_us\",\n  // tablespoon_us\n  tbsp: \"tablespoon_us\",\n  // teaspoon_us\n  tsp: \"teaspoon_us\",\n  // gallon_uk\n  \"gal uk\": \"gallon_uk\",\n  // quart_uk\n  \"qt uk\": \"quart_uk\",\n  // pint_uk\n  \"pt uk\": \"pint_uk\",\n  // fluid_ounce_uk\n  \"fl oz uk\": \"fluid_ounce_uk\",\n  // barrel_oil\n  bbl: \"barrel_oil\",\n  // cubic_inch\n  \"in³\": \"cubic_inch\",\n  in3: \"cubic_inch\",\n  // cubic_foot\n  \"ft³\": \"cubic_foot\",\n  ft3: \"cubic_foot\",\n  // cubic_yard\n  \"yd³\": \"cubic_yard\",\n  yd3: \"cubic_yard\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const VOLUME_UNIT_LIST = Object.keys(VOLUME_UNITS) as VolumeUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const VOLUME_FACTORS: Record<VolumeUnit, number> = Object.fromEntries(\n  Object.entries(VOLUME_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<VolumeUnit, number>;\n","/**\n * Volume Role - Convert Pillar\n *\n * Conversão entre unidades de volume usando arquitetura hub-and-spoke.\n * Base: liter (L)\n *\n * @example\n * import { convertVolume, toBaseVolume, fromBaseVolume } from '@attrx/role-morphic/volume/convert';\n *\n * convertVolume('gallon_us', 'liter', 1);     // 3.785411784\n * toBaseVolume('milliliter', 500);            // 0.5\n * fromBaseVolume('gallon_us', 3.785411784);   // 1\n */\n\nimport { VOLUME_UNITS, type VolumeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const VOLUME_BASE: VolumeUnit = \"liter\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (liter)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em liter\n *\n * @example\n * toBaseVolume('milliliter', 500);     // 0.5\n * toBaseVolume('gallon_us', 1);        // 3.785411784\n */\nexport function toBaseVolume(variant: VolumeUnit, value: number): number {\n  const unit = VOLUME_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (liter) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em liter\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseVolume('milliliter', 0.5);        // 500\n * fromBaseVolume('gallon_us', 3.785411784); // 1\n */\nexport function fromBaseVolume(variant: VolumeUnit, baseValue: number): number {\n  const unit = VOLUME_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de volume\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertVolume('gallon_us', 'liter', 1);        // 3.785411784\n * convertVolume('milliliter', 'liter', 500);    // 0.5\n * convertVolume('cup_us', 'tablespoon_us', 1);  // 16\n */\nexport function convertVolume(\n  from: VolumeUnit,\n  to: VolumeUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const baseValue = toBaseVolume(from, value);\n  return fromBaseVolume(to, baseValue);\n}\n\n/**\n * Versão safe de convertVolume que retorna Result\n *\n * @example\n * tryConvertVolume('gallon_us', 'liter', 1);\n * // { ok: true, value: 3.785411784 }\n *\n * tryConvertVolume('invalid', 'liter', 1);\n * // { ok: false, error: 'Unknown volume variant: invalid' }\n */\nexport function tryConvertVolume(\n  from: VolumeUnit,\n  to: VolumeUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertVolume(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasVolumeVariant(variant: string): variant is VolumeUnit {\n  return variant in VOLUME_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getVolumeVariants(): VolumeUnit[] {\n  return Object.keys(VOLUME_UNITS) as VolumeUnit[];\n}\n","/**\n * Speed Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de velocidade.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n * - International Yard and Pound Agreement (1959)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type SpeedUnit =\n  // SI\n  | \"meter_per_second\"\n  | \"kilometer_per_hour\"\n  // Imperial/US\n  | \"mile_per_hour\"\n  | \"foot_per_second\"\n  // Nautical\n  | \"knot\"\n  // Scientific\n  | \"mach\"\n  | \"speed_of_light\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de velocidade.\n *\n * Fatores exatos:\n * - km/h = 1000/3600 m/s = 0.277777... m/s\n * - mph = 1609.344/3600 m/s = 0.44704 m/s (exato, derivado de mile)\n * - ft/s = 0.3048 m/s (exato, derivado de foot)\n * - knot = 1852/3600 m/s = 0.514444... m/s (exato, derivado de nautical mile)\n *\n * Fatores aproximados:\n * - Mach: varia com temperatura/altitude, usando 340.29 m/s (nível do mar, 15°C)\n * - Velocidade da luz: exato por definição SI (299792458 m/s)\n */\nexport const SPEED_UNITS: Record<SpeedUnit, SimpleUnitConfig> = {\n  // SI Units\n  meter_per_second: {\n    factor: 1,\n    symbol: \"m/s\",\n    singular: \"meter per second\",\n    plural: \"meters per second\",\n  },\n  kilometer_per_hour: {\n    factor: 1000 / 3600, // 0.277777...\n    symbol: \"km/h\",\n    singular: \"kilometer per hour\",\n    plural: \"kilometers per hour\",\n  },\n\n  // Imperial/US (exatos desde 1959)\n  mile_per_hour: {\n    factor: 0.44704, // 1609.344 / 3600 (exato)\n    symbol: \"mph\",\n    singular: \"mile per hour\",\n    plural: \"miles per hour\",\n  },\n  foot_per_second: {\n    factor: 0.3048, // exato\n    symbol: \"ft/s\",\n    singular: \"foot per second\",\n    plural: \"feet per second\",\n  },\n\n  // Nautical (exato)\n  knot: {\n    factor: 1852 / 3600, // 0.514444...\n    symbol: \"kn\",\n    singular: \"knot\",\n    plural: \"knots\",\n  },\n\n  // Scientific\n  mach: {\n    factor: 340.29, // velocidade do som ao nível do mar, 15°C (aproximado)\n    symbol: \"Ma\",\n    singular: \"mach\",\n    plural: \"mach\",\n  },\n  speed_of_light: {\n    factor: 299792458, // exato por definição SI\n    symbol: \"c\",\n    singular: \"speed of light\",\n    plural: \"speed of light\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const SPEED_ALIASES: UnitAliases = {\n  // meter_per_second\n  \"m/s\": \"meter_per_second\",\n  mps: \"meter_per_second\",\n  // kilometer_per_hour\n  \"km/h\": \"kilometer_per_hour\",\n  kmh: \"kilometer_per_hour\",\n  kph: \"kilometer_per_hour\",\n  // mile_per_hour\n  mph: \"mile_per_hour\",\n  \"mi/h\": \"mile_per_hour\",\n  // foot_per_second\n  \"ft/s\": \"foot_per_second\",\n  fps: \"foot_per_second\",\n  // knot\n  kn: \"knot\",\n  kt: \"knot\",\n  kts: \"knot\",\n  // mach\n  ma: \"mach\",\n  // speed_of_light\n  c: \"speed_of_light\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const SPEED_UNIT_LIST = Object.keys(SPEED_UNITS) as SpeedUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const SPEED_FACTORS: Record<SpeedUnit, number> = Object.fromEntries(\n  Object.entries(SPEED_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<SpeedUnit, number>;\n","/**\n * Speed Role - Convert Pillar\n *\n * Conversão entre unidades de velocidade usando arquitetura hub-and-spoke.\n * Base: meter_per_second (m/s)\n *\n * @example\n * import { convertSpeed, toBaseSpeed, fromBaseSpeed } from '@attrx/role-morphic/speed/convert';\n *\n * convertSpeed('kilometer_per_hour', 'mile_per_hour', 100);  // 62.1371...\n * toBaseSpeed('kilometer_per_hour', 100);                    // 27.7778...\n * fromBaseSpeed('mile_per_hour', 27.7778);                   // ~62.14\n */\n\nimport { SPEED_UNITS, type SpeedUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const SPEED_BASE: SpeedUnit = \"meter_per_second\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (meter_per_second)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em meter_per_second\n *\n * @example\n * toBaseSpeed('kilometer_per_hour', 100);  // 27.7778...\n * toBaseSpeed('mile_per_hour', 60);        // 26.8224\n */\nexport function toBaseSpeed(variant: SpeedUnit, value: number): number {\n  const unit = SPEED_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (meter_per_second) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em meter_per_second\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseSpeed('kilometer_per_hour', 27.7778);  // ~100\n * fromBaseSpeed('mile_per_hour', 26.8224);       // ~60\n */\nexport function fromBaseSpeed(variant: SpeedUnit, baseValue: number): number {\n  const unit = SPEED_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de velocidade\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertSpeed('kilometer_per_hour', 'mile_per_hour', 100);  // 62.1371...\n * convertSpeed('knot', 'kilometer_per_hour', 1);             // 1.852\n * convertSpeed('mach', 'kilometer_per_hour', 1);             // 1225.044\n */\nexport function convertSpeed(\n  from: SpeedUnit,\n  to: SpeedUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const baseValue = toBaseSpeed(from, value);\n  return fromBaseSpeed(to, baseValue);\n}\n\n/**\n * Versão safe de convertSpeed que retorna Result\n *\n * @example\n * tryConvertSpeed('kilometer_per_hour', 'mile_per_hour', 100);\n * // { ok: true, value: 62.1371... }\n *\n * tryConvertSpeed('invalid', 'mile_per_hour', 100);\n * // { ok: false, error: 'Unknown speed variant: invalid' }\n */\nexport function tryConvertSpeed(\n  from: SpeedUnit,\n  to: SpeedUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertSpeed(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasSpeedVariant(variant: string): variant is SpeedUnit {\n  return variant in SPEED_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getSpeedVariants(): SpeedUnit[] {\n  return Object.keys(SPEED_UNITS) as SpeedUnit[];\n}\n","/**\n * Energy Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de energia.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n * - CODATA 2018 (electronvolt)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EnergyUnit =\n  // SI\n  | \"gigajoule\"\n  | \"megajoule\"\n  | \"kilojoule\"\n  | \"joule\"\n  | \"millijoule\"\n  // Calories\n  | \"calorie\"\n  | \"kilocalorie\"\n  // Watt-hour\n  | \"watt_hour\"\n  | \"kilowatt_hour\"\n  | \"megawatt_hour\"\n  | \"gigawatt_hour\"\n  // BTU\n  | \"btu\"\n  | \"therm\"\n  // Scientific\n  | \"electronvolt\"\n  | \"kiloelectronvolt\"\n  | \"megaelectronvolt\"\n  | \"erg\"\n  // Mechanical\n  | \"foot_pound\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de energia.\n *\n * Base: joule (J) - unidade SI de energia\n * 1 joule = 1 newton × 1 metro = 1 kg⋅m²/s²\n *\n * Fatores exatos:\n * - SI: prefixos são potências de 10\n * - Calorie (IT): 4.1868 J (International Table, recomendado)\n * - Watt-hour: 3600 J (1 W × 1 h)\n * - BTU (IT): 1055.05585262 J (International Table)\n * - Electronvolt: 1.602176634e-19 J (SI 2019, exato)\n * - Erg: 1e-7 J (CGS)\n */\nexport const ENERGY_UNITS: Record<EnergyUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  gigajoule: {\n    factor: 1_000_000_000,\n    symbol: \"GJ\",\n    singular: \"gigajoule\",\n    plural: \"gigajoules\",\n  },\n  megajoule: {\n    factor: 1_000_000,\n    symbol: \"MJ\",\n    singular: \"megajoule\",\n    plural: \"megajoules\",\n  },\n  kilojoule: {\n    factor: 1_000,\n    symbol: \"kJ\",\n    singular: \"kilojoule\",\n    plural: \"kilojoules\",\n  },\n  joule: {\n    factor: 1,\n    symbol: \"J\",\n    singular: \"joule\",\n    plural: \"joules\",\n  },\n  millijoule: {\n    factor: 0.001,\n    symbol: \"mJ\",\n    singular: \"millijoule\",\n    plural: \"millijoules\",\n  },\n\n  // Calories (International Table - IT)\n  // 1 cal (IT) = 4.1868 J (exato por definição)\n  calorie: {\n    factor: 4.1868,\n    symbol: \"cal\",\n    singular: \"calorie\",\n    plural: \"calories\",\n  },\n  // 1 kcal = 1000 cal = 4186.8 J (= 1 \"food Calorie\")\n  kilocalorie: {\n    factor: 4186.8,\n    symbol: \"kcal\",\n    singular: \"kilocalorie\",\n    plural: \"kilocalories\",\n  },\n\n  // Watt-hour (exatos)\n  // 1 Wh = 1 W × 3600 s = 3600 J\n  watt_hour: {\n    factor: 3600,\n    symbol: \"Wh\",\n    singular: \"watt-hour\",\n    plural: \"watt-hours\",\n  },\n  kilowatt_hour: {\n    factor: 3_600_000,\n    symbol: \"kWh\",\n    singular: \"kilowatt-hour\",\n    plural: \"kilowatt-hours\",\n  },\n  megawatt_hour: {\n    factor: 3_600_000_000,\n    symbol: \"MWh\",\n    singular: \"megawatt-hour\",\n    plural: \"megawatt-hours\",\n  },\n  gigawatt_hour: {\n    factor: 3_600_000_000_000,\n    symbol: \"GWh\",\n    singular: \"gigawatt-hour\",\n    plural: \"gigawatt-hours\",\n  },\n\n  // BTU (International Table)\n  // 1 BTU (IT) = 1055.05585262 J (definição)\n  btu: {\n    factor: 1055.05585262,\n    symbol: \"BTU\",\n    singular: \"BTU\",\n    plural: \"BTUs\",\n  },\n  // 1 therm = 100,000 BTU (IT)\n  therm: {\n    factor: 105505585.262,\n    symbol: \"thm\",\n    singular: \"therm\",\n    plural: \"therms\",\n  },\n\n  // Scientific\n  // 1 eV = 1.602176634e-19 J (SI 2019, exato por definição)\n  electronvolt: {\n    factor: 1.602176634e-19,\n    symbol: \"eV\",\n    singular: \"electronvolt\",\n    plural: \"electronvolts\",\n  },\n  kiloelectronvolt: {\n    factor: 1.602176634e-16,\n    symbol: \"keV\",\n    singular: \"kiloelectronvolt\",\n    plural: \"kiloelectronvolts\",\n  },\n  megaelectronvolt: {\n    factor: 1.602176634e-13,\n    symbol: \"MeV\",\n    singular: \"megaelectronvolt\",\n    plural: \"megaelectronvolts\",\n  },\n  // 1 erg = 1e-7 J (CGS, exato)\n  erg: {\n    factor: 1e-7,\n    symbol: \"erg\",\n    singular: \"erg\",\n    plural: \"ergs\",\n  },\n\n  // Mechanical\n  // 1 ft⋅lbf = 1.3558179483314004 J (derivado de foot e pound-force)\n  foot_pound: {\n    factor: 1.3558179483314004,\n    symbol: \"ft⋅lbf\",\n    singular: \"foot-pound\",\n    plural: \"foot-pounds\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const ENERGY_ALIASES: UnitAliases = {\n  // gigajoule\n  gj: \"gigajoule\",\n  // megajoule\n  mj: \"megajoule\",\n  // kilojoule\n  kj: \"kilojoule\",\n  // joule\n  j: \"joule\",\n  // calorie\n  cal: \"calorie\",\n  // kilocalorie\n  kcal: \"kilocalorie\",\n  Cal: \"kilocalorie\",\n  // watt_hour\n  wh: \"watt_hour\",\n  // kilowatt_hour\n  kwh: \"kilowatt_hour\",\n  // megawatt_hour\n  mwh: \"megawatt_hour\",\n  // gigawatt_hour\n  gwh: \"gigawatt_hour\",\n  // btu\n  btu: \"btu\",\n  // therm\n  thm: \"therm\",\n  // electronvolt\n  ev: \"electronvolt\",\n  // kiloelectronvolt\n  kev: \"kiloelectronvolt\",\n  // megaelectronvolt\n  mev: \"megaelectronvolt\",\n  // erg\n  erg: \"erg\",\n  // foot_pound\n  \"ft-lb\": \"foot_pound\",\n  \"ft-lbf\": \"foot_pound\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const ENERGY_UNIT_LIST = Object.keys(ENERGY_UNITS) as EnergyUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const ENERGY_FACTORS: Record<EnergyUnit, number> = Object.fromEntries(\n  Object.entries(ENERGY_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<EnergyUnit, number>;\n","/**\n * Energy Role - Convert Pillar\n *\n * Conversão entre unidades de energia usando arquitetura hub-and-spoke.\n * Base: joule (J)\n *\n * @example\n * import { convertEnergy, toBaseEnergy, fromBaseEnergy } from '@attrx/role-morphic/energy/convert';\n *\n * convertEnergy('kilocalorie', 'kilojoule', 1);   // 4.1868\n * toBaseEnergy('kilowatt_hour', 1);               // 3600000\n * fromBaseEnergy('btu', 1055.06);                 // ~1\n */\n\nimport { ENERGY_UNITS, type EnergyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const ENERGY_BASE: EnergyUnit = \"joule\";\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (joule)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em joule\n *\n * @example\n * toBaseEnergy('kilowatt_hour', 1);   // 3600000\n * toBaseEnergy('kilocalorie', 1);     // 4186.8\n */\nexport function toBaseEnergy(variant: EnergyUnit, value: number): number {\n  const unit = ENERGY_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n\n  return value * (unit.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (joule) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em joule\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseEnergy('kilowatt_hour', 3600000);   // 1\n * fromBaseEnergy('kilocalorie', 4186.8);      // 1\n */\nexport function fromBaseEnergy(variant: EnergyUnit, baseValue: number): number {\n  const unit = ENERGY_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n\n  return baseValue / (unit.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de energia\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertEnergy('kilocalorie', 'kilojoule', 1);      // 4.1868\n * convertEnergy('kilowatt_hour', 'megajoule', 1);    // 3.6\n * convertEnergy('btu', 'joule', 1);                  // 1055.056...\n */\nexport function convertEnergy(\n  from: EnergyUnit,\n  to: EnergyUnit,\n  value: number\n): number {\n  // Otimização: mesma unidade\n  if (from === to) {\n    return value;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const baseValue = toBaseEnergy(from, value);\n  return fromBaseEnergy(to, baseValue);\n}\n\n/**\n * Versão safe de convertEnergy que retorna Result\n *\n * @example\n * tryConvertEnergy('kilocalorie', 'kilojoule', 1);\n * // { ok: true, value: 4.1868 }\n *\n * tryConvertEnergy('invalid', 'joule', 1);\n * // { ok: false, error: 'Unknown energy variant: invalid' }\n */\nexport function tryConvertEnergy(\n  from: EnergyUnit,\n  to: EnergyUnit,\n  value: number\n): Result<number> {\n  try {\n    const result = convertEnergy(from, to, value);\n    return { ok: true, value: result };\n  } catch (err) {\n    return { ok: false, error: String(err) };\n  }\n}\n\n/**\n * Verifica se uma variante existe\n */\nexport function hasEnergyVariant(variant: string): variant is EnergyUnit {\n  return variant in ENERGY_UNITS;\n}\n\n/**\n * Lista todas as variantes disponíveis\n */\nexport function getEnergyVariants(): EnergyUnit[] {\n  return Object.keys(ENERGY_UNITS) as EnergyUnit[];\n}\n","/**\n * Power Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de potência.\n *\n * Fontes:\n * - NIST SP 811 (2008)\n * - SI Brochure, 9th Edition (2019)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PowerUnit =\n  // SI\n  | \"gigawatt\"\n  | \"megawatt\"\n  | \"kilowatt\"\n  | \"watt\"\n  | \"milliwatt\"\n  | \"microwatt\"\n  // Horsepower\n  | \"horsepower_mechanical\"\n  | \"horsepower_metric\"\n  | \"horsepower_electric\"\n  | \"horsepower_boiler\"\n  // BTU-based\n  | \"btu_per_hour\"\n  | \"btu_per_second\"\n  // Other\n  | \"ton_of_refrigeration\"\n  | \"foot_pound_per_second\"\n  | \"calorie_per_second\"\n  | \"kilocalorie_per_hour\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de potência.\n *\n * Base: watt (W) - unidade SI de potência\n * 1 watt = 1 joule por segundo = 1 kg⋅m²/s³\n *\n * Cavalos-vapor (existem várias definições):\n * - Mechanical (imperial): 550 ft⋅lbf/s = 745.69987158227 W\n * - Metric (PS, CV, pk): 75 kgf⋅m/s = 735.49875 W (exato)\n * - Electrical: 746 W (exato por definição)\n * - Boiler: 9809.5 W (33,475 BTU/h)\n */\nexport const POWER_UNITS: Record<PowerUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  gigawatt: {\n    factor: 1_000_000_000,\n    symbol: \"GW\",\n    singular: \"gigawatt\",\n    plural: \"gigawatts\",\n  },\n  megawatt: {\n    factor: 1_000_000,\n    symbol: \"MW\",\n    singular: \"megawatt\",\n    plural: \"megawatts\",\n  },\n  kilowatt: {\n    factor: 1_000,\n    symbol: \"kW\",\n    singular: \"kilowatt\",\n    plural: \"kilowatts\",\n  },\n  watt: {\n    factor: 1,\n    symbol: \"W\",\n    singular: \"watt\",\n    plural: \"watts\",\n  },\n  milliwatt: {\n    factor: 0.001,\n    symbol: \"mW\",\n    singular: \"milliwatt\",\n    plural: \"milliwatts\",\n  },\n  microwatt: {\n    factor: 0.000001,\n    symbol: \"μW\",\n    singular: \"microwatt\",\n    plural: \"microwatts\",\n  },\n\n  // Horsepower variants\n  // Mechanical (imperial): 550 ft⋅lbf/s\n  // = 550 × 0.3048 m × 4.4482216152605 N / s = 745.69987158227 W\n  horsepower_mechanical: {\n    factor: 745.69987158227,\n    symbol: \"hp\",\n    singular: \"horsepower\",\n    plural: \"horsepower\",\n  },\n  // Metric (PS, CV, pk): 75 kgf⋅m/s = 75 × 9.80665 W = 735.49875 W (exato)\n  horsepower_metric: {\n    factor: 735.49875,\n    symbol: \"PS\",\n    singular: \"metric horsepower\",\n    plural: \"metric horsepower\",\n  },\n  // Electrical: 746 W (exato por definição)\n  horsepower_electric: {\n    factor: 746,\n    symbol: \"hp(E)\",\n    singular: \"electric horsepower\",\n    plural: \"electric horsepower\",\n  },\n  // Boiler: 33,475 BTU/h = 9809.5 W\n  horsepower_boiler: {\n    factor: 9809.5,\n    symbol: \"hp(S)\",\n    singular: \"boiler horsepower\",\n    plural: \"boiler horsepower\",\n  },\n\n  // BTU-based\n  // 1 BTU/h = 1055.05585262 J / 3600 s = 0.29307107017222 W\n  btu_per_hour: {\n    factor: 0.29307107017222,\n    symbol: \"BTU/h\",\n    singular: \"BTU per hour\",\n    plural: \"BTUs per hour\",\n  },\n  // 1 BTU/s = 1055.05585262 W\n  btu_per_second: {\n    factor: 1055.05585262,\n    symbol: \"BTU/s\",\n    singular: \"BTU per second\",\n    plural: \"BTUs per second\",\n  },\n\n  // Other\n  // 1 ton of refrigeration = 12000 BTU/h = 3516.8528420667 W\n  ton_of_refrigeration: {\n    factor: 3516.8528420667,\n    symbol: \"TR\",\n    singular: \"ton of refrigeration\",\n    plural: \"tons of refrigeration\",\n  },\n  // 1 ft⋅lbf/s = 1.3558179483314004 W\n  foot_pound_per_second: {\n    factor: 1.3558179483314004,\n    symbol: \"ft⋅lbf/s\",\n    singular: \"foot-pound per second\",\n    plural: \"foot-pounds per second\",\n  },\n  // 1 cal/s = 4.1868 W\n  calorie_per_second: {\n    factor: 4.1868,\n    symbol: \"cal/s\",\n    singular: \"calorie per second\",\n    plural: \"calories per second\",\n  },\n  // 1 kcal/h = 4186.8 / 3600 = 1.163 W\n  kilocalorie_per_hour: {\n    factor: 1.163,\n    symbol: \"kcal/h\",\n    singular: \"kilocalorie per hour\",\n    plural: \"kilocalories per hour\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const POWER_ALIASES: UnitAliases = {\n  // gigawatt\n  gw: \"gigawatt\",\n  // megawatt\n  mw: \"megawatt\",\n  // kilowatt\n  kw: \"kilowatt\",\n  // watt\n  w: \"watt\",\n  // microwatt\n  \"μw\": \"microwatt\",\n  uw: \"microwatt\",\n  // horsepower_mechanical\n  hp: \"horsepower_mechanical\",\n  // horsepower_metric\n  ps: \"horsepower_metric\",\n  cv: \"horsepower_metric\",\n  // horsepower_electric\n  \"hp(e)\": \"horsepower_electric\",\n  // horsepower_boiler\n  \"hp(s)\": \"horsepower_boiler\",\n  bhp: \"horsepower_boiler\",\n  // btu_per_hour\n  \"btu/h\": \"btu_per_hour\",\n  \"btu/hr\": \"btu_per_hour\",\n  // btu_per_second\n  \"btu/s\": \"btu_per_second\",\n  // ton_of_refrigeration\n  tr: \"ton_of_refrigeration\",\n  rt: \"ton_of_refrigeration\",\n  // foot_pound_per_second\n  \"ft-lb/s\": \"foot_pound_per_second\",\n  \"ft-lbf/s\": \"foot_pound_per_second\",\n  // calorie_per_second\n  \"cal/s\": \"calorie_per_second\",\n  // kilocalorie_per_hour\n  \"kcal/h\": \"kilocalorie_per_hour\",\n  \"kcal/hr\": \"kilocalorie_per_hour\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const POWER_UNIT_LIST = Object.keys(POWER_UNITS) as PowerUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const POWER_FACTORS: Record<PowerUnit, number> = Object.fromEntries(\n  Object.entries(POWER_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<PowerUnit, number>;\n","/**\n * Power Role - Convert Pillar\n *\n * Conversão entre unidades de potência usando hub-and-spoke (via watt).\n *\n * @example\n * import { convertPower, toBasePower, fromBasePower } from '@attrx/role-morphic/power/convert';\n *\n * convertPower('horsepower_mechanical', 'kilowatt', 1);  // 0.7457\n * toBasePower('kilowatt', 2.5);                          // 2500 (watts)\n * fromBasePower('kilowatt', 2500);                       // 2.5\n */\n\nimport { POWER_UNITS, type PowerUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const POWER_BASE: PowerUnit = \"watt\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (watt)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em watts\n *\n * @example\n * toBasePower('kilowatt', 2.5);             // 2500\n * toBasePower('horsepower_mechanical', 1);  // 745.7\n */\nexport function toBasePower(variant: PowerUnit, value: number): number {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n  return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (watt) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em watts\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBasePower('kilowatt', 2500);  // 2.5\n * fromBasePower('watt', 100);       // 100\n */\nexport function fromBasePower(variant: PowerUnit, baseValue: number): number {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n  return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de potência\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertPower('horsepower_mechanical', 'kilowatt', 1);  // 0.7457\n * convertPower('kilowatt', 'watt', 2.5);                 // 2500\n */\nexport function convertPower(\n  from: PowerUnit,\n  to: PowerUnit,\n  value: number,\n): number {\n  if (from === to) {\n    return value;\n  }\n  const baseValue = toBasePower(from, value);\n  return fromBasePower(to, baseValue);\n}\n\n/**\n * Versão safe de convertPower que retorna Result\n *\n * @example\n * tryConvertPower('kilowatt', 'watt', 1);  // { ok: true, value: 1000 }\n * tryConvertPower('invalid', 'watt', 1);   // { ok: false, error: '...' }\n */\nexport function tryConvertPower(\n  from: PowerUnit,\n  to: PowerUnit,\n  value: number,\n): Result<number> {\n  try {\n    return { ok: true, value: convertPower(from, to, value) };\n  } catch (e) {\n    return { ok: false, error: (e as Error).message };\n  }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasPowerVariant('kilowatt');  // true\n * hasPowerVariant('invalid');   // false\n */\nexport function hasPowerVariant(variant: string): variant is PowerUnit {\n  return variant in POWER_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getPowerVariants();  // ['gigawatt', 'megawatt', 'kilowatt', ...]\n */\nexport function getPowerVariants(): PowerUnit[] {\n  return Object.keys(POWER_UNITS) as PowerUnit[];\n}\n","/**\n * Pressure Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de pressão.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811\n * - 10th CGPM (1954) - definição da atmosfera padrão\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PressureUnit =\n  // SI\n  | \"megapascal\"\n  | \"kilopascal\"\n  | \"hectopascal\"\n  | \"pascal\"\n  // Bar\n  | \"bar\"\n  | \"millibar\"\n  // Atmosphere\n  | \"atmosphere\"\n  // Mercury\n  | \"torr\"\n  | \"mmhg\"\n  | \"inhg\"\n  // Imperial\n  | \"psi\"\n  | \"ksi\"\n  // Water column\n  | \"cmh2o\"\n  | \"inh2o\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de pressão.\n *\n * Base: pascal (Pa) = 1 N/m² = 1 kg/(m·s²)\n *\n * Relações importantes:\n * - 1 atm = 101325 Pa (exato, CGPM 1954)\n * - 1 bar = 100000 Pa (exato por definição)\n * - 1 Torr = 101325/760 Pa (exato)\n * - 1 psi = 6894.757293168 Pa (derivado de lb/in²)\n */\nexport const PRESSURE_UNITS: Record<PressureUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  megapascal: {\n    factor: 1e6,\n    symbol: \"MPa\",\n    singular: \"megapascal\",\n    plural: \"megapascals\",\n  },\n  kilopascal: {\n    factor: 1000,\n    symbol: \"kPa\",\n    singular: \"kilopascal\",\n    plural: \"kilopascals\",\n  },\n  hectopascal: {\n    factor: 100,\n    symbol: \"hPa\",\n    singular: \"hectopascal\",\n    plural: \"hectopascals\",\n  },\n  pascal: {\n    factor: 1,\n    symbol: \"Pa\",\n    singular: \"pascal\",\n    plural: \"pascals\",\n  },\n\n  // Bar (exatos por definição)\n  bar: {\n    factor: 100000,\n    symbol: \"bar\",\n    singular: \"bar\",\n    plural: \"bar\",\n  },\n  millibar: {\n    factor: 100, // = 1 hPa\n    symbol: \"mbar\",\n    singular: \"millibar\",\n    plural: \"millibar\",\n  },\n\n  // Atmosphere (exato, CGPM 1954)\n  atmosphere: {\n    factor: 101325,\n    symbol: \"atm\",\n    singular: \"atmosphere\",\n    plural: \"atmospheres\",\n  },\n\n  // Mercury column\n  torr: {\n    factor: 101325 / 760, // ≈ 133.322368421\n    symbol: \"Torr\",\n    singular: \"torr\",\n    plural: \"torr\",\n  },\n  mmhg: {\n    factor: 133.322387415, // Convenção NIST\n    symbol: \"mmHg\",\n    singular: \"millimeter of mercury\",\n    plural: \"millimeters of mercury\",\n  },\n  inhg: {\n    factor: 3386.389, // Polegadas de mercúrio\n    symbol: \"inHg\",\n    singular: \"inch of mercury\",\n    plural: \"inches of mercury\",\n  },\n\n  // Imperial (derivados de lb/in²)\n  psi: {\n    factor: 6894.757293168, // 1 lbf/in²\n    symbol: \"psi\",\n    singular: \"pound per square inch\",\n    plural: \"pounds per square inch\",\n  },\n  ksi: {\n    factor: 6894757.293168, // 1000 psi\n    symbol: \"ksi\",\n    singular: \"kilopound per square inch\",\n    plural: \"kilopounds per square inch\",\n  },\n\n  // Water column\n  cmh2o: {\n    factor: 98.0665, // cm de água a 4°C\n    symbol: \"cmH₂O\",\n    singular: \"centimeter of water\",\n    plural: \"centimeters of water\",\n  },\n  inh2o: {\n    factor: 249.08891, // polegadas de água\n    symbol: \"inH₂O\",\n    singular: \"inch of water\",\n    plural: \"inches of water\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const PRESSURE_ALIASES: UnitAliases = {\n  // megapascal\n  mpa: \"megapascal\",\n  // kilopascal\n  kpa: \"kilopascal\",\n  // hectopascal\n  hpa: \"hectopascal\",\n  // pascal\n  pa: \"pascal\",\n  // bar\n  bar: \"bar\",\n  // millibar\n  mbar: \"millibar\",\n  mb: \"millibar\",\n  // atmosphere\n  atm: \"atmosphere\",\n  // torr\n  torr: \"torr\",\n  // mmhg\n  mmhg: \"mmhg\",\n  // inhg\n  inhg: \"inhg\",\n  // psi\n  psi: \"psi\",\n  // ksi\n  ksi: \"ksi\",\n  // cmh2o\n  cmh2o: \"cmh2o\",\n  // inh2o\n  inh2o: \"inh2o\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const PRESSURE_UNIT_LIST = Object.keys(PRESSURE_UNITS) as PressureUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const PRESSURE_FACTORS: Record<PressureUnit, number> =\n  Object.fromEntries(\n    Object.entries(PRESSURE_UNITS).map(([unit, config]) => [\n      unit,\n      config.factor ?? 1,\n    ]),\n  ) as Record<PressureUnit, number>;\n","/**\n * Pressure Role - Convert Pillar\n *\n * Conversão entre unidades de pressão usando hub-and-spoke (via pascal).\n *\n * @example\n * import { convertPressure, toBasePressure, fromBasePressure } from '@attrx/role-morphic/pressure/convert';\n *\n * convertPressure('bar', 'pascal', 1);      // 100000\n * toBasePressure('bar', 2.5);               // 250000 (pascals)\n * fromBasePressure('bar', 250000);          // 2.5\n */\n\nimport { PRESSURE_UNITS, type PressureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const PRESSURE_BASE: PressureUnit = \"pascal\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (pascal)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em pascals\n *\n * @example\n * toBasePressure('bar', 2.5);        // 250000\n * toBasePressure('atmosphere', 1);   // 101325\n */\nexport function toBasePressure(variant: PressureUnit, value: number): number {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n  return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (pascal) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em pascals\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBasePressure('bar', 250000);      // 2.5\n * fromBasePressure('atmosphere', 101325); // 1\n */\nexport function fromBasePressure(variant: PressureUnit, baseValue: number): number {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n  return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de pressão\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertPressure('bar', 'pascal', 1);      // 100000\n * convertPressure('atmosphere', 'psi', 1);  // 14.696\n */\nexport function convertPressure(\n  from: PressureUnit,\n  to: PressureUnit,\n  value: number,\n): number {\n  if (from === to) {\n    return value;\n  }\n  const baseValue = toBasePressure(from, value);\n  return fromBasePressure(to, baseValue);\n}\n\n/**\n * Versão safe de convertPressure que retorna Result\n *\n * @example\n * tryConvertPressure('bar', 'pascal', 1);  // { ok: true, value: 100000 }\n * tryConvertPressure('invalid', 'pascal', 1);   // { ok: false, error: '...' }\n */\nexport function tryConvertPressure(\n  from: PressureUnit,\n  to: PressureUnit,\n  value: number,\n): Result<number> {\n  try {\n    return { ok: true, value: convertPressure(from, to, value) };\n  } catch (e) {\n    return { ok: false, error: (e as Error).message };\n  }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasPressureVariant('bar');     // true\n * hasPressureVariant('invalid'); // false\n */\nexport function hasPressureVariant(variant: string): variant is PressureUnit {\n  return variant in PRESSURE_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getPressureVariants();  // ['megapascal', 'kilopascal', 'hectopascal', ...]\n */\nexport function getPressureVariants(): PressureUnit[] {\n  return Object.keys(PRESSURE_UNITS) as PressureUnit[];\n}\n","/**\n * Frequency Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de frequência.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type FrequencyUnit =\n  // SI\n  | \"terahertz\"\n  | \"gigahertz\"\n  | \"megahertz\"\n  | \"kilohertz\"\n  | \"hertz\"\n  | \"millihertz\"\n  | \"microhertz\"\n  // Other\n  | \"rpm\"\n  | \"bpm\"\n  | \"radians_per_second\"\n  | \"cycles_per_minute\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de frequência.\n *\n * Base: hertz (Hz) = 1 ciclo por segundo\n *\n * Relações:\n * - 1 RPM = 1/60 Hz (rotações por minuto)\n * - 1 rad/s = 1/(2π) Hz\n */\nexport const FREQUENCY_UNITS: Record<FrequencyUnit, SimpleUnitConfig> = {\n  // SI Units (todos exatos)\n  terahertz: {\n    factor: 1e12,\n    symbol: \"THz\",\n    singular: \"terahertz\",\n    plural: \"terahertz\",\n  },\n  gigahertz: {\n    factor: 1e9,\n    symbol: \"GHz\",\n    singular: \"gigahertz\",\n    plural: \"gigahertz\",\n  },\n  megahertz: {\n    factor: 1e6,\n    symbol: \"MHz\",\n    singular: \"megahertz\",\n    plural: \"megahertz\",\n  },\n  kilohertz: {\n    factor: 1000,\n    symbol: \"kHz\",\n    singular: \"kilohertz\",\n    plural: \"kilohertz\",\n  },\n  hertz: {\n    factor: 1,\n    symbol: \"Hz\",\n    singular: \"hertz\",\n    plural: \"hertz\",\n  },\n  millihertz: {\n    factor: 0.001,\n    symbol: \"mHz\",\n    singular: \"millihertz\",\n    plural: \"millihertz\",\n  },\n  microhertz: {\n    factor: 0.000001,\n    symbol: \"μHz\",\n    singular: \"microhertz\",\n    plural: \"microhertz\",\n  },\n\n  // Other units\n  rpm: {\n    factor: 1 / 60, // 1 RPM = 1/60 Hz\n    symbol: \"rpm\",\n    singular: \"revolution per minute\",\n    plural: \"revolutions per minute\",\n  },\n  bpm: {\n    factor: 1 / 60, // 1 BPM = 1/60 Hz\n    symbol: \"bpm\",\n    singular: \"beat per minute\",\n    plural: \"beats per minute\",\n  },\n  radians_per_second: {\n    factor: 1 / (2 * Math.PI), // 1 rad/s = 1/(2π) Hz ≈ 0.159154943\n    symbol: \"rad/s\",\n    singular: \"radian per second\",\n    plural: \"radians per second\",\n  },\n  cycles_per_minute: {\n    factor: 1 / 60, // same as RPM\n    symbol: \"cpm\",\n    singular: \"cycle per minute\",\n    plural: \"cycles per minute\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const FREQUENCY_ALIASES: UnitAliases = {\n  // terahertz\n  thz: \"terahertz\",\n  // gigahertz\n  ghz: \"gigahertz\",\n  // megahertz\n  mhz: \"megahertz\",\n  // kilohertz\n  khz: \"kilohertz\",\n  // hertz\n  hz: \"hertz\",\n  cps: \"hertz\",\n  // microhertz\n  \"μhz\": \"microhertz\",\n  uhz: \"microhertz\",\n  // rpm\n  rpm: \"rpm\",\n  // bpm\n  bpm: \"bpm\",\n  // radians_per_second\n  \"rad/s\": \"radians_per_second\",\n  // cycles_per_minute\n  cpm: \"cycles_per_minute\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const FREQUENCY_UNIT_LIST = Object.keys(\n  FREQUENCY_UNITS,\n) as FrequencyUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const FREQUENCY_FACTORS: Record<FrequencyUnit, number> =\n  Object.fromEntries(\n    Object.entries(FREQUENCY_UNITS).map(([unit, config]) => [\n      unit,\n      config.factor ?? 1,\n    ]),\n  ) as Record<FrequencyUnit, number>;\n","/**\n * Frequency Role - Convert Pillar\n *\n * Conversão entre unidades de frequência usando hub-and-spoke (via hertz).\n *\n * @example\n * import { convertFrequency, toBaseFrequency, fromBaseFrequency } from '@attrx/role-morphic/frequency/convert';\n *\n * convertFrequency('megahertz', 'hertz', 1);  // 1000000\n * toBaseFrequency('megahertz', 2.4);          // 2400000 (hertz)\n * fromBaseFrequency('megahertz', 2400000);    // 2.4\n */\n\nimport { FREQUENCY_UNITS, type FrequencyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const FREQUENCY_BASE: FrequencyUnit = \"hertz\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (hertz)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em hertz\n *\n * @example\n * toBaseFrequency('megahertz', 2.4);  // 2400000\n * toBaseFrequency('rpm', 60);         // 1\n */\nexport function toBaseFrequency(variant: FrequencyUnit, value: number): number {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n  return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (hertz) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em hertz\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseFrequency('megahertz', 2400000);  // 2.4\n * fromBaseFrequency('rpm', 1);              // 60\n */\nexport function fromBaseFrequency(variant: FrequencyUnit, baseValue: number): number {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n  return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de frequência\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertFrequency('megahertz', 'hertz', 1);  // 1000000\n * convertFrequency('rpm', 'hertz', 60);       // 1\n */\nexport function convertFrequency(\n  from: FrequencyUnit,\n  to: FrequencyUnit,\n  value: number,\n): number {\n  if (from === to) {\n    return value;\n  }\n  const baseValue = toBaseFrequency(from, value);\n  return fromBaseFrequency(to, baseValue);\n}\n\n/**\n * Versão safe de convertFrequency que retorna Result\n *\n * @example\n * tryConvertFrequency('megahertz', 'hertz', 1);  // { ok: true, value: 1000000 }\n * tryConvertFrequency('invalid', 'hertz', 1);    // { ok: false, error: '...' }\n */\nexport function tryConvertFrequency(\n  from: FrequencyUnit,\n  to: FrequencyUnit,\n  value: number,\n): Result<number> {\n  try {\n    return { ok: true, value: convertFrequency(from, to, value) };\n  } catch (e) {\n    return { ok: false, error: (e as Error).message };\n  }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasFrequencyVariant('hertz');    // true\n * hasFrequencyVariant('invalid');  // false\n */\nexport function hasFrequencyVariant(variant: string): variant is FrequencyUnit {\n  return variant in FREQUENCY_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getFrequencyVariants();  // ['terahertz', 'gigahertz', 'megahertz', ...]\n */\nexport function getFrequencyVariants(): FrequencyUnit[] {\n  return Object.keys(FREQUENCY_UNITS) as FrequencyUnit[];\n}\n","/**\n * Angle Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de ângulo.\n *\n * Base: degree (grau) - mais comum em aplicações práticas.\n * Nota: Embora radiano seja a unidade SI, grau é mais intuitivo para a maioria dos casos.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - NIST SP 811 (2008)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AngleUnit =\n  | \"turn\"\n  | \"degree\"\n  | \"arcminute\"\n  | \"arcsecond\"\n  | \"milliarcsecond\"\n  | \"radian\"\n  | \"milliradian\"\n  | \"gradian\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Fator exato: 180/π graus por radiano\n * Valor: 57.29577951308232...\n */\nconst DEGREES_PER_RADIAN = 180 / Math.PI;\n\n/**\n * Fator exato: 180/(1000π) graus por milirradiano\n */\nconst DEGREES_PER_MILLIRADIAN = 180 / (1000 * Math.PI);\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de ângulo.\n *\n * Fatores EXATOS:\n * - turn: 360 (definição)\n * - degree: 1 (base)\n * - arcminute: 1/60 (definição)\n * - arcsecond: 1/3600 (definição)\n * - milliarcsecond: 1/3600000 (definição)\n * - gradian: 360/400 = 0.9 (definição)\n * - radian: 180/π (exato por definição matemática)\n * - milliradian: 180/(1000π) (derivado)\n */\nexport const ANGLE_UNITS: Record<AngleUnit, SimpleUnitConfig> = {\n  // Volta completa\n  turn: {\n    factor: 360,\n    symbol: \"tr\",\n    singular: \"turn\",\n    plural: \"turns\",\n  },\n\n  // Base\n  degree: {\n    factor: 1,\n    symbol: \"°\",\n    singular: \"degree\",\n    plural: \"degrees\",\n    noSpace: true, // 45° não 45 °\n  },\n\n  // Subdivisões do grau\n  arcminute: {\n    factor: 1 / 60, // 0.016666...\n    symbol: \"′\",\n    singular: \"arcminute\",\n    plural: \"arcminutes\",\n    noSpace: true, // 30′ não 30 ′\n  },\n  arcsecond: {\n    factor: 1 / 3600, // 0.000277...\n    symbol: \"″\",\n    singular: \"arcsecond\",\n    plural: \"arcseconds\",\n    noSpace: true, // 45″ não 45 ″\n  },\n  milliarcsecond: {\n    factor: 1 / 3600000, // 2.777...e-7\n    symbol: \"mas\",\n    singular: \"milliarcsecond\",\n    plural: \"milliarcseconds\",\n  },\n\n  // Radianos (unidade SI)\n  radian: {\n    factor: DEGREES_PER_RADIAN, // 180/π ≈ 57.2958\n    symbol: \"rad\",\n    singular: \"radian\",\n    plural: \"radians\",\n  },\n  milliradian: {\n    factor: DEGREES_PER_MILLIRADIAN, // 180/(1000π) ≈ 0.0573\n    symbol: \"mrad\",\n    singular: \"milliradian\",\n    plural: \"milliradians\",\n  },\n\n  // Gradiano (gon)\n  gradian: {\n    factor: 0.9, // 360/400\n    symbol: \"gon\",\n    singular: \"gradian\",\n    plural: \"gradians\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const ANGLE_ALIASES: UnitAliases = {\n  // turn\n  tr: \"turn\",\n  rev: \"turn\",\n  // degree\n  \"°\": \"degree\",\n  deg: \"degree\",\n  // arcminute\n  \"′\": \"arcminute\",\n  \"'\": \"arcminute\",\n  arcmin: \"arcminute\",\n  // arcsecond\n  \"″\": \"arcsecond\",\n  '\"': \"arcsecond\",\n  arcsec: \"arcsecond\",\n  // milliarcsecond\n  mas: \"milliarcsecond\",\n  // radian\n  rad: \"radian\",\n  // milliradian\n  mrad: \"milliradian\",\n  // gradian\n  gon: \"gradian\",\n  grad: \"gradian\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const ANGLE_UNIT_LIST = Object.keys(ANGLE_UNITS) as AngleUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const ANGLE_FACTORS: Record<AngleUnit, number> = Object.fromEntries(\n  Object.entries(ANGLE_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<AngleUnit, number>;\n","/**\n * Angle Role - Convert Pillar\n *\n * Conversão entre unidades de ângulo usando hub-and-spoke (via degree).\n *\n * @example\n * import { convertAngle, toBaseAngle, fromBaseAngle } from '@attrx/role-morphic/angle/convert';\n *\n * convertAngle('degree', 'radian', 180);  // π ≈ 3.14159\n * toBaseAngle('turn', 1);                 // 360 (degrees)\n * fromBaseAngle('radian', 180);           // π ≈ 3.14159\n */\n\nimport { ANGLE_UNITS, type AngleUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const ANGLE_BASE: AngleUnit = \"degree\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (degree)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em degrees\n *\n * @example\n * toBaseAngle('turn', 1);      // 360\n * toBaseAngle('radian', Math.PI); // 180\n */\nexport function toBaseAngle(variant: AngleUnit, value: number): number {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n  return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (degree) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em degrees\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseAngle('radian', 180);  // π ≈ 3.14159\n * fromBaseAngle('turn', 360);    // 1\n */\nexport function fromBaseAngle(variant: AngleUnit, baseValue: number): number {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n  return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de ângulo\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertAngle('degree', 'radian', 180);  // π ≈ 3.14159\n * convertAngle('turn', 'degree', 1);      // 360\n */\nexport function convertAngle(\n  from: AngleUnit,\n  to: AngleUnit,\n  value: number,\n): number {\n  if (from === to) {\n    return value;\n  }\n  const baseValue = toBaseAngle(from, value);\n  return fromBaseAngle(to, baseValue);\n}\n\n/**\n * Versão safe de convertAngle que retorna Result\n *\n * @example\n * tryConvertAngle('degree', 'radian', 180);  // { ok: true, value: π }\n * tryConvertAngle('invalid', 'radian', 180); // { ok: false, error: '...' }\n */\nexport function tryConvertAngle(\n  from: AngleUnit,\n  to: AngleUnit,\n  value: number,\n): Result<number> {\n  try {\n    return { ok: true, value: convertAngle(from, to, value) };\n  } catch (e) {\n    return { ok: false, error: (e as Error).message };\n  }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasAngleVariant('degree');   // true\n * hasAngleVariant('invalid');  // false\n */\nexport function hasAngleVariant(variant: string): variant is AngleUnit {\n  return variant in ANGLE_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getAngleVariants();  // ['turn', 'degree', 'arcminute', ...]\n */\nexport function getAngleVariants(): AngleUnit[] {\n  return Object.keys(ANGLE_UNITS) as AngleUnit[];\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte graus para radianos\n *\n * @example\n * degreesToRadians(180) // π ≈ 3.14159\n * degreesToRadians(90)  // π/2 ≈ 1.5708\n */\nexport function degreesToRadians(degrees: number): number {\n  return convertAngle(\"degree\", \"radian\", degrees);\n}\n\n/**\n * Converte radianos para graus\n *\n * @example\n * radiansToDegrees(Math.PI)     // 180\n * radiansToDegrees(Math.PI / 2) // 90\n */\nexport function radiansToDegrees(radians: number): number {\n  return convertAngle(\"radian\", \"degree\", radians);\n}\n\n/**\n * Normaliza ângulo para o intervalo [0, 360)\n *\n * @example\n * normalizeAngle(450)  // 90\n * normalizeAngle(-90)  // 270\n * normalizeAngle(360)  // 0\n */\nexport function normalizeAngle(degrees: number): number {\n  const normalized = degrees % 360;\n  // Evita -0 (JavaScript tem +0 e -0)\n  if (normalized === 0) return 0;\n  return normalized < 0 ? normalized + 360 : normalized;\n}\n","/**\n * Time Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de tempo/duração.\n *\n * Fontes:\n * - SI Brochure, 9th Edition (2019)\n * - Gregorian calendar (365.2425 dias/ano)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TimeUnit =\n  // SI prefixes\n  | \"nanosecond\"\n  | \"microsecond\"\n  | \"millisecond\"\n  | \"second\"\n  // Common\n  | \"minute\"\n  | \"hour\"\n  | \"day\"\n  | \"week\"\n  // Calendar (approximate)\n  | \"month\"\n  | \"year\"\n  | \"decade\"\n  | \"century\"\n  | \"millennium\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de tempo.\n *\n * Fatores exatos:\n * - SI: prefixos são exatos por definição\n * - day, hour, minute: exatos (86400s, 3600s, 60s)\n * - week: exato (7 dias = 604800s)\n *\n * Fatores aproximados (baseados no calendário Gregoriano):\n * - year: 365.2425 dias (média do ciclo de 400 anos)\n * - month: year/12\n */\nexport const TIME_UNITS: Record<TimeUnit, SimpleUnitConfig> = {\n  // SI prefixes (exatos)\n  nanosecond: {\n    factor: 1e-9,\n    symbol: \"ns\",\n    singular: \"nanosecond\",\n    plural: \"nanoseconds\",\n  },\n  microsecond: {\n    factor: 1e-6,\n    symbol: \"μs\",\n    singular: \"microsecond\",\n    plural: \"microseconds\",\n  },\n  millisecond: {\n    factor: 0.001,\n    symbol: \"ms\",\n    singular: \"millisecond\",\n    plural: \"milliseconds\",\n  },\n  second: {\n    factor: 1,\n    symbol: \"s\",\n    singular: \"second\",\n    plural: \"seconds\",\n  },\n\n  // Common (exatos)\n  minute: {\n    factor: 60,\n    symbol: \"min\",\n    singular: \"minute\",\n    plural: \"minutes\",\n  },\n  hour: {\n    factor: 3600,\n    symbol: \"h\",\n    singular: \"hour\",\n    plural: \"hours\",\n  },\n  day: {\n    factor: 86400,\n    symbol: \"d\",\n    singular: \"day\",\n    plural: \"days\",\n  },\n  week: {\n    factor: 604800,\n    symbol: \"wk\",\n    singular: \"week\",\n    plural: \"weeks\",\n  },\n\n  // Calendar (aproximados - baseados no ano Gregoriano)\n  month: {\n    factor: 2629746, // 31556952 / 12\n    symbol: \"mo\",\n    singular: \"month\",\n    plural: \"months\",\n  },\n  year: {\n    factor: 31556952, // 365.2425 * 86400\n    symbol: \"yr\",\n    singular: \"year\",\n    plural: \"years\",\n  },\n  decade: {\n    factor: 315569520, // 10 * year\n    symbol: \"dec\",\n    singular: \"decade\",\n    plural: \"decades\",\n  },\n  century: {\n    factor: 3155695200, // 100 * year\n    symbol: \"c\",\n    singular: \"century\",\n    plural: \"centuries\",\n  },\n  millennium: {\n    factor: 31556952000, // 1000 * year\n    symbol: \"ky\",\n    singular: \"millennium\",\n    plural: \"millennia\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const TIME_ALIASES: UnitAliases = {\n  // nanosecond\n  ns: \"nanosecond\",\n  // microsecond\n  \"μs\": \"microsecond\",\n  us: \"microsecond\",\n  // millisecond\n  ms: \"millisecond\",\n  // second\n  s: \"second\",\n  sec: \"second\",\n  // minute\n  min: \"minute\",\n  // hour\n  h: \"hour\",\n  hr: \"hour\",\n  hrs: \"hour\",\n  // day\n  d: \"day\",\n  // week\n  wk: \"week\",\n  // month\n  mo: \"month\",\n  // year\n  yr: \"year\",\n  y: \"year\",\n  // decade\n  dec: \"decade\",\n  // century\n  c: \"century\",\n  // millennium\n  ky: \"millennium\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const TIME_UNIT_LIST = Object.keys(TIME_UNITS) as TimeUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const TIME_FACTORS: Record<TimeUnit, number> = Object.fromEntries(\n  Object.entries(TIME_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<TimeUnit, number>;\n","/**\n * Time Role - Convert Pillar\n *\n * Conversão entre unidades de tempo usando hub-and-spoke (via second).\n *\n * @example\n * import { convertTime, toBaseTime, fromBaseTime } from '@attrx/role-morphic/time/convert';\n *\n * convertTime('hour', 'minute', 1);  // 60\n * toBaseTime('minute', 5);           // 300 (seconds)\n * fromBaseTime('hour', 3600);        // 1\n */\n\nimport { TIME_UNITS, type TimeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const TIME_BASE: TimeUnit = \"second\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (second)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em seconds\n *\n * @example\n * toBaseTime('minute', 5);  // 300\n * toBaseTime('hour', 1);    // 3600\n */\nexport function toBaseTime(variant: TimeUnit, value: number): number {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n  return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (second) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em seconds\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseTime('minute', 300);  // 5\n * fromBaseTime('hour', 3600);   // 1\n */\nexport function fromBaseTime(variant: TimeUnit, baseValue: number): number {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n  return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de tempo\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertTime('hour', 'minute', 1);  // 60\n * convertTime('day', 'hour', 1);     // 24\n */\nexport function convertTime(\n  from: TimeUnit,\n  to: TimeUnit,\n  value: number,\n): number {\n  if (from === to) {\n    return value;\n  }\n  const baseValue = toBaseTime(from, value);\n  return fromBaseTime(to, baseValue);\n}\n\n/**\n * Versão safe de convertTime que retorna Result\n *\n * @example\n * tryConvertTime('hour', 'minute', 1);   // { ok: true, value: 60 }\n * tryConvertTime('invalid', 'minute', 1); // { ok: false, error: '...' }\n */\nexport function tryConvertTime(\n  from: TimeUnit,\n  to: TimeUnit,\n  value: number,\n): Result<number> {\n  try {\n    return { ok: true, value: convertTime(from, to, value) };\n  } catch (e) {\n    return { ok: false, error: (e as Error).message };\n  }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasTimeVariant('second');   // true\n * hasTimeVariant('invalid');  // false\n */\nexport function hasTimeVariant(variant: string): variant is TimeUnit {\n  return variant in TIME_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getTimeVariants();  // ['nanosecond', 'microsecond', 'millisecond', ...]\n */\nexport function getTimeVariants(): TimeUnit[] {\n  return Object.keys(TIME_UNITS) as TimeUnit[];\n}\n","/**\n * Digital Storage Role - Constants\n *\n * Fatores de conversão, símbolos e aliases para unidades de armazenamento digital.\n *\n * Fontes:\n * - IEC 60027-2 (prefixos binários)\n * - SI Brochure, 9th Edition (2019)\n *\n * IMPORTANTE: Esta biblioteca suporta AMBOS os sistemas:\n * - SI (decimal): kB, MB, GB, TB (base 1000)\n * - IEC (binário): KiB, MiB, GiB, TiB (base 1024)\n */\n\nimport type { SimpleUnitConfig, UnitAliases } from \"../../contracts\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type DigitalUnit =\n  // Fundamental\n  | \"bit\"\n  | \"byte\"\n  // IEC Binary (base 1024)\n  | \"kibibyte\"\n  | \"mebibyte\"\n  | \"gibibyte\"\n  | \"tebibyte\"\n  | \"pebibyte\"\n  | \"exbibyte\"\n  // SI Decimal (base 1000)\n  | \"kilobyte\"\n  | \"megabyte\"\n  | \"gigabyte\"\n  | \"terabyte\"\n  | \"petabyte\"\n  | \"exabyte\";\n\n// =============================================================================\n// UNITS CONFIG\n// =============================================================================\n\n/**\n * Configuração de cada unidade de armazenamento digital.\n *\n * TODOS os fatores são EXATOS:\n * - IEC: potências de 2 (1024^n)\n * - SI: potências de 10 (1000^n)\n *\n * Convenção:\n * - byte é a BASE (fator = 1)\n * - bit = 1/8 byte (fator = 0.125)\n */\nexport const DIGITAL_UNITS: Record<DigitalUnit, SimpleUnitConfig> = {\n  // Fundamental\n  bit: {\n    factor: 0.125, // 1/8 byte\n    symbol: \"b\",\n    singular: \"bit\",\n    plural: \"bits\",\n  },\n  byte: {\n    factor: 1,\n    symbol: \"B\",\n    singular: \"byte\",\n    plural: \"bytes\",\n  },\n\n  // IEC Binary (base 1024) - RAM, cache, file systems\n  kibibyte: {\n    factor: 1024, // 2^10\n    symbol: \"KiB\",\n    singular: \"kibibyte\",\n    plural: \"kibibytes\",\n  },\n  mebibyte: {\n    factor: 1048576, // 2^20\n    symbol: \"MiB\",\n    singular: \"mebibyte\",\n    plural: \"mebibytes\",\n  },\n  gibibyte: {\n    factor: 1073741824, // 2^30\n    symbol: \"GiB\",\n    singular: \"gibibyte\",\n    plural: \"gibibytes\",\n  },\n  tebibyte: {\n    factor: 1099511627776, // 2^40\n    symbol: \"TiB\",\n    singular: \"tebibyte\",\n    plural: \"tebibytes\",\n  },\n  pebibyte: {\n    factor: 1125899906842624, // 2^50\n    symbol: \"PiB\",\n    singular: \"pebibyte\",\n    plural: \"pebibytes\",\n  },\n  exbibyte: {\n    factor: 1152921504606846976, // 2^60\n    symbol: \"EiB\",\n    singular: \"exbibyte\",\n    plural: \"exbibytes\",\n  },\n\n  // SI Decimal (base 1000) - HD marketing, network speeds\n  kilobyte: {\n    factor: 1000, // 10^3\n    symbol: \"kB\",\n    singular: \"kilobyte\",\n    plural: \"kilobytes\",\n  },\n  megabyte: {\n    factor: 1000000, // 10^6\n    symbol: \"MB\",\n    singular: \"megabyte\",\n    plural: \"megabytes\",\n  },\n  gigabyte: {\n    factor: 1000000000, // 10^9\n    symbol: \"GB\",\n    singular: \"gigabyte\",\n    plural: \"gigabytes\",\n  },\n  terabyte: {\n    factor: 1000000000000, // 10^12\n    symbol: \"TB\",\n    singular: \"terabyte\",\n    plural: \"terabytes\",\n  },\n  petabyte: {\n    factor: 1000000000000000, // 10^15\n    symbol: \"PB\",\n    singular: \"petabyte\",\n    plural: \"petabytes\",\n  },\n  exabyte: {\n    factor: 1000000000000000000, // 10^18\n    symbol: \"EB\",\n    singular: \"exabyte\",\n    plural: \"exabytes\",\n  },\n};\n\n// =============================================================================\n// ALIASES\n// =============================================================================\n\n/**\n * Aliases para reconhecimento de unidades no cast\n */\nexport const DIGITAL_ALIASES: UnitAliases = {\n  // bit\n  b: \"bit\",\n  // byte\n  B: \"byte\",\n  // kibibyte (IEC)\n  KiB: \"kibibyte\",\n  // mebibyte (IEC)\n  MiB: \"mebibyte\",\n  // gibibyte (IEC)\n  GiB: \"gibibyte\",\n  // tebibyte (IEC)\n  TiB: \"tebibyte\",\n  // pebibyte (IEC)\n  PiB: \"pebibyte\",\n  // exbibyte (IEC)\n  EiB: \"exbibyte\",\n  // kilobyte (SI)\n  kB: \"kilobyte\",\n  kb: \"kilobyte\",\n  // megabyte (SI)\n  MB: \"megabyte\",\n  // gigabyte (SI)\n  GB: \"gigabyte\",\n  // terabyte (SI)\n  TB: \"terabyte\",\n  // petabyte (SI)\n  PB: \"petabyte\",\n  // exabyte (SI)\n  EB: \"exabyte\",\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todas as unidades */\nexport const DIGITAL_UNIT_LIST = Object.keys(DIGITAL_UNITS) as DigitalUnit[];\n\n/** Fatores de conversão (para compatibilidade) */\nexport const DIGITAL_FACTORS: Record<DigitalUnit, number> = Object.fromEntries(\n  Object.entries(DIGITAL_UNITS).map(([unit, config]) => [\n    unit,\n    config.factor ?? 1,\n  ]),\n) as Record<DigitalUnit, number>;\n","/**\n * Digital Role - Convert Pillar\n *\n * Conversão entre unidades de armazenamento digital usando hub-and-spoke (via byte).\n *\n * @example\n * import { convertDigital, toBaseDigital, fromBaseDigital } from '@attrx/role-morphic/digital/convert';\n *\n * convertDigital('kilobyte', 'byte', 1);     // 1000\n * convertDigital('kibibyte', 'byte', 1);     // 1024\n * toBaseDigital('megabyte', 1);              // 1000000 (bytes)\n * fromBaseDigital('mebibyte', 1048576);      // 1\n */\n\nimport { DIGITAL_UNITS, type DigitalUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Unidade base para conversões (hub) */\nexport const DIGITAL_BASE: DigitalUnit = \"byte\";\n\n// =============================================================================\n// CORE CONVERSION\n// =============================================================================\n\n/**\n * Converte valor para a unidade base (byte)\n *\n * @param variant - Unidade de origem\n * @param value - Valor a converter\n * @returns Valor em bytes\n *\n * @example\n * toBaseDigital('kilobyte', 1);   // 1000\n * toBaseDigital('kibibyte', 1);   // 1024\n */\nexport function toBaseDigital(variant: DigitalUnit, value: number): number {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n  return value * (config.factor ?? 1);\n}\n\n/**\n * Converte valor da unidade base (byte) para outra unidade\n *\n * @param variant - Unidade de destino\n * @param baseValue - Valor em bytes\n * @returns Valor na unidade de destino\n *\n * @example\n * fromBaseDigital('kilobyte', 1000);   // 1\n * fromBaseDigital('kibibyte', 1024);   // 1\n */\nexport function fromBaseDigital(variant: DigitalUnit, baseValue: number): number {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n  return baseValue / (config.factor ?? 1);\n}\n\n/**\n * Converte entre duas unidades de armazenamento digital\n *\n * @param from - Unidade de origem\n * @param to - Unidade de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertDigital('kilobyte', 'byte', 1);     // 1000\n * convertDigital('kibibyte', 'byte', 1);     // 1024\n * convertDigital('gigabyte', 'gibibyte', 1); // ~0.931\n */\nexport function convertDigital(\n  from: DigitalUnit,\n  to: DigitalUnit,\n  value: number,\n): number {\n  if (from === to) {\n    return value;\n  }\n  const baseValue = toBaseDigital(from, value);\n  return fromBaseDigital(to, baseValue);\n}\n\n/**\n * Versão safe de convertDigital que retorna Result\n *\n * @example\n * tryConvertDigital('kilobyte', 'byte', 1);    // { ok: true, value: 1000 }\n * tryConvertDigital('invalid', 'byte', 1);     // { ok: false, error: '...' }\n */\nexport function tryConvertDigital(\n  from: DigitalUnit,\n  to: DigitalUnit,\n  value: number,\n): Result<number> {\n  try {\n    return { ok: true, value: convertDigital(from, to, value) };\n  } catch (e) {\n    return { ok: false, error: (e as Error).message };\n  }\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se uma variante existe\n *\n * @example\n * hasDigitalVariant('byte');     // true\n * hasDigitalVariant('invalid');  // false\n */\nexport function hasDigitalVariant(variant: string): variant is DigitalUnit {\n  return variant in DIGITAL_UNITS;\n}\n\n/**\n * Retorna lista de todas as variantes disponíveis\n *\n * @example\n * getDigitalVariants();  // ['bit', 'byte', 'kibibyte', ...]\n */\nexport function getDigitalVariants(): DigitalUnit[] {\n  return Object.keys(DIGITAL_UNITS) as DigitalUnit[];\n}\n","/**\n * Color Role - Types\n *\n * Tipos para representação de cores nas diferentes variantes.\n */\n\n// =============================================================================\n// BASE TYPE\n// =============================================================================\n\n/**\n * Tipo base para Color: objeto RGBA com valores 0-255 e alpha 0-1\n *\n * @example\n * const red: RGBA = { r: 255, g: 0, b: 0, a: 1 };\n * const semiTransparent: RGBA = { r: 0, g: 0, b: 255, a: 0.5 };\n */\nexport interface RGBA {\n  r: number; // 0-255\n  g: number; // 0-255\n  b: number; // 0-255\n  a: number; // 0-1\n}\n\n// =============================================================================\n// VARIANT TYPES\n// =============================================================================\n\n/**\n * Variante Hex\n *\n * @example\n * \"#ff0000\"     // RGB (6 chars)\n * \"#ff0000ff\"   // RGBA (8 chars)\n * \"#f00\"        // RGB shorthand (3 chars)\n * \"#f00f\"       // RGBA shorthand (4 chars)\n */\nexport type ColorHex = string;\n\n/**\n * Variante RGB Object\n *\n * @example\n * { r: 255, g: 0, b: 0 }\n * { r: 255, g: 0, b: 0, a: 0.5 }\n */\nexport interface ColorRgbObject {\n  r: number;\n  g: number;\n  b: number;\n  a?: number;\n}\n\n/**\n * Variante RGB String\n *\n * @example\n * \"rgb(255, 0, 0)\"\n * \"rgba(255, 0, 0, 0.5)\"\n */\nexport type ColorRgbString = string;\n\n/**\n * Variante HSL Object\n *\n * @example\n * { h: 0, s: 100, l: 50 }        // Red\n * { h: 0, s: 100, l: 50, a: 0.5 } // Semi-transparent red\n */\nexport interface ColorHslObject {\n  h: number; // 0-360\n  s: number; // 0-100\n  l: number; // 0-100\n  a?: number; // 0-1\n}\n\n/**\n * Variante HSL String\n *\n * @example\n * \"hsl(0, 100%, 50%)\"\n * \"hsla(0, 100%, 50%, 0.5)\"\n */\nexport type ColorHslString = string;\n\n// =============================================================================\n// VARIANT NAMES\n// =============================================================================\n\nexport type ColorVariant =\n  | \"hex\"\n  | \"rgb_object\"\n  | \"rgb_string\"\n  | \"hsl_object\"\n  | \"hsl_string\";\n\n// =============================================================================\n// FORMAT OPTIONS\n// =============================================================================\n\nimport type { BaseFormatOptions } from \"../../types\";\n\nexport interface ColorFormatOptions extends BaseFormatOptions {\n  /** Se true, usa letras maiúsculas para hex */\n  uppercase?: boolean;\n\n  /** Se true, inclui alpha mesmo quando é 1 */\n  includeAlpha?: boolean;\n\n  /** Se true, usa formato compacto (shorthand hex, sem espaços em rgb) */\n  compact?: boolean;\n}\n\n// =============================================================================\n// NAMED COLORS\n// =============================================================================\n\n/**\n * CSS Named Colors mais comuns\n */\nexport const NAMED_COLORS: Record<string, RGBA> = {\n  // Basic colors\n  black: { r: 0, g: 0, b: 0, a: 1 },\n  white: { r: 255, g: 255, b: 255, a: 1 },\n  red: { r: 255, g: 0, b: 0, a: 1 },\n  green: { r: 0, g: 128, b: 0, a: 1 },\n  blue: { r: 0, g: 0, b: 255, a: 1 },\n  yellow: { r: 255, g: 255, b: 0, a: 1 },\n  cyan: { r: 0, g: 255, b: 255, a: 1 },\n  magenta: { r: 255, g: 0, b: 255, a: 1 },\n\n  // Extended colors\n  orange: { r: 255, g: 165, b: 0, a: 1 },\n  purple: { r: 128, g: 0, b: 128, a: 1 },\n  pink: { r: 255, g: 192, b: 203, a: 1 },\n  brown: { r: 165, g: 42, b: 42, a: 1 },\n  gray: { r: 128, g: 128, b: 128, a: 1 },\n  grey: { r: 128, g: 128, b: 128, a: 1 },\n\n  // Web colors\n  lime: { r: 0, g: 255, b: 0, a: 1 },\n  aqua: { r: 0, g: 255, b: 255, a: 1 },\n  fuchsia: { r: 255, g: 0, b: 255, a: 1 },\n  silver: { r: 192, g: 192, b: 192, a: 1 },\n  maroon: { r: 128, g: 0, b: 0, a: 1 },\n  olive: { r: 128, g: 128, b: 0, a: 1 },\n  navy: { r: 0, g: 0, b: 128, a: 1 },\n  teal: { r: 0, g: 128, b: 128, a: 1 },\n\n  // Transparent\n  transparent: { r: 0, g: 0, b: 0, a: 0 },\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Clamp um valor entre min e max\n */\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Normaliza um canal RGB para 0-255\n */\nexport function normalizeRgbChannel(value: number): number {\n  return clamp(Math.round(value), 0, 255);\n}\n\n/**\n * Normaliza alpha para 0-1\n */\nexport function normalizeAlpha(value: number | undefined): number {\n  if (value === undefined) return 1;\n  return clamp(value, 0, 1);\n}\n\n/**\n * Converte RGB para HSL\n */\nexport function rgbToHsl(\n  r: number,\n  g: number,\n  b: number,\n): { h: number; s: number; l: number } {\n  r /= 255;\n  g /= 255;\n  b /= 255;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n\n  if (max === min) {\n    return { h: 0, s: 0, l: l * 100 };\n  }\n\n  const d = max - min;\n  const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n  let h: number;\n  switch (max) {\n    case r:\n      h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n      break;\n    case g:\n      h = ((b - r) / d + 2) / 6;\n      break;\n    default:\n      h = ((r - g) / d + 4) / 6;\n      break;\n  }\n\n  return {\n    h: Math.round(h * 360),\n    s: Math.round(s * 100),\n    l: Math.round(l * 100),\n  };\n}\n\n/**\n * Converte HSL para RGB\n */\nexport function hslToRgb(\n  h: number,\n  s: number,\n  l: number,\n): { r: number; g: number; b: number } {\n  h /= 360;\n  s /= 100;\n  l /= 100;\n\n  if (s === 0) {\n    const gray = Math.round(l * 255);\n    return { r: gray, g: gray, b: gray };\n  }\n\n  const hue2rgb = (p: number, q: number, t: number): number => {\n    if (t < 0) t += 1;\n    if (t > 1) t -= 1;\n    if (t < 1 / 6) return p + (q - p) * 6 * t;\n    if (t < 1 / 2) return q;\n    if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n  };\n\n  const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n  const p = 2 * l - q;\n\n  return {\n    r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n    g: Math.round(hue2rgb(p, q, h) * 255),\n    b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n  };\n}\n","/**\n * Color Role - Convert Pillar\n *\n * Conversão entre variantes de cor usando hub-and-spoke (via rgb_object/RGBA).\n *\n * @example\n * import { convertColor, hexToRgba, rgbaToHex } from '@attrx/role-morphic/color/convert';\n *\n * convertColor('hex', 'rgb_object', '#ff0000');  // { r: 255, g: 0, b: 0, a: 1 }\n * convertColor('rgb_object', 'hsl_string', { r: 255, g: 0, b: 0 }); // \"hsl(0, 100%, 50%)\"\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\nimport { rgbToHsl, hslToRgb, normalizeAlpha, normalizeRgbChannel, clamp } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nexport const COLOR_BASE: ColorVariant = \"rgb_object\";\n\nexport const COLOR_VARIANTS: ColorVariant[] = [\n  \"hex\",\n  \"rgb_object\",\n  \"rgb_string\",\n  \"hsl_object\",\n  \"hsl_string\",\n];\n\n// =============================================================================\n// TO BASE (→ RGBA)\n// =============================================================================\n\n/**\n * Converte hex para RGBA\n */\nexport function hexToRgba(hex: string): RGBA {\n  let h = hex.trim();\n  if (h.startsWith(\"#\")) h = h.slice(1);\n\n  let r: number, g: number, b: number, a: number;\n\n  if (h.length === 3) {\n    r = parseInt(h[0] + h[0], 16);\n    g = parseInt(h[1] + h[1], 16);\n    b = parseInt(h[2] + h[2], 16);\n    a = 1;\n  } else if (h.length === 4) {\n    r = parseInt(h[0] + h[0], 16);\n    g = parseInt(h[1] + h[1], 16);\n    b = parseInt(h[2] + h[2], 16);\n    a = parseInt(h[3] + h[3], 16) / 255;\n  } else if (h.length === 6) {\n    r = parseInt(h.slice(0, 2), 16);\n    g = parseInt(h.slice(2, 4), 16);\n    b = parseInt(h.slice(4, 6), 16);\n    a = 1;\n  } else if (h.length === 8) {\n    r = parseInt(h.slice(0, 2), 16);\n    g = parseInt(h.slice(2, 4), 16);\n    b = parseInt(h.slice(4, 6), 16);\n    a = parseInt(h.slice(6, 8), 16) / 255;\n  } else {\n    throw new Error(`Invalid hex color: ${hex}`);\n  }\n\n  return { r, g, b, a };\n}\n\n/**\n * Converte RGB object para RGBA\n */\nexport function rgbObjectToRgba(rgb: ColorRgbObject): RGBA {\n  return {\n    r: normalizeRgbChannel(rgb.r),\n    g: normalizeRgbChannel(rgb.g),\n    b: normalizeRgbChannel(rgb.b),\n    a: normalizeAlpha(rgb.a),\n  };\n}\n\n/**\n * Converte RGB string para RGBA\n */\nexport function rgbStringToRgba(rgb: string): RGBA {\n  const match = rgb.match(/rgba?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n  if (!match) {\n    throw new Error(`Invalid RGB string: ${rgb}`);\n  }\n\n  return {\n    r: normalizeRgbChannel(parseFloat(match[1])),\n    g: normalizeRgbChannel(parseFloat(match[2])),\n    b: normalizeRgbChannel(parseFloat(match[3])),\n    a: match[4] !== undefined ? normalizeAlpha(parseFloat(match[4])) : 1,\n  };\n}\n\n/**\n * Converte HSL object para RGBA\n */\nexport function hslObjectToRgba(hsl: ColorHslObject): RGBA {\n  const { r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l);\n  return {\n    r,\n    g,\n    b,\n    a: normalizeAlpha(hsl.a),\n  };\n}\n\n/**\n * Converte HSL string para RGBA\n */\nexport function hslStringToRgba(hsl: string): RGBA {\n  const match = hsl.match(/hsla?\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%?\\s*,\\s*([\\d.]+)%?\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/i);\n  if (!match) {\n    throw new Error(`Invalid HSL string: ${hsl}`);\n  }\n\n  const h = parseFloat(match[1]);\n  const s = parseFloat(match[2]);\n  const l = parseFloat(match[3]);\n  const a = match[4] !== undefined ? parseFloat(match[4]) : 1;\n\n  const { r, g, b } = hslToRgb(h, s, l);\n  return { r, g, b, a: normalizeAlpha(a) };\n}\n\n/**\n * Converte qualquer variante para RGBA (base)\n */\nexport function toBaseColor(variant: ColorVariant, value: unknown): RGBA {\n  switch (variant) {\n    case \"hex\":\n      return hexToRgba(value as string);\n    case \"rgb_object\":\n      return rgbObjectToRgba(value as ColorRgbObject);\n    case \"rgb_string\":\n      return rgbStringToRgba(value as string);\n    case \"hsl_object\":\n      return hslObjectToRgba(value as ColorHslObject);\n    case \"hsl_string\":\n      return hslStringToRgba(value as string);\n    default:\n      throw new Error(`Unknown color variant: ${variant}`);\n  }\n}\n\n// =============================================================================\n// FROM BASE (RGBA →)\n// =============================================================================\n\n/**\n * Converte RGBA para hex\n */\nexport function rgbaToHex(rgba: RGBA, includeAlpha = false): string {\n  const r = rgba.r.toString(16).padStart(2, \"0\");\n  const g = rgba.g.toString(16).padStart(2, \"0\");\n  const b = rgba.b.toString(16).padStart(2, \"0\");\n\n  if (includeAlpha || rgba.a < 1) {\n    const a = Math.round(rgba.a * 255)\n      .toString(16)\n      .padStart(2, \"0\");\n    return `#${r}${g}${b}${a}`;\n  }\n\n  return `#${r}${g}${b}`;\n}\n\n/**\n * Converte RGBA para RGB object\n */\nexport function rgbaToRgbObject(rgba: RGBA): ColorRgbObject {\n  if (rgba.a < 1) {\n    return { r: rgba.r, g: rgba.g, b: rgba.b, a: rgba.a };\n  }\n  return { r: rgba.r, g: rgba.g, b: rgba.b };\n}\n\n/**\n * Converte RGBA para RGB string\n */\nexport function rgbaToRgbString(rgba: RGBA): string {\n  if (rgba.a < 1) {\n    return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n  }\n  return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n}\n\n/**\n * Converte RGBA para HSL object\n */\nexport function rgbaToHslObject(rgba: RGBA): ColorHslObject {\n  const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n  if (rgba.a < 1) {\n    return { h, s, l, a: rgba.a };\n  }\n  return { h, s, l };\n}\n\n/**\n * Converte RGBA para HSL string\n */\nexport function rgbaToHslString(rgba: RGBA): string {\n  const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n  if (rgba.a < 1) {\n    return `hsla(${h}, ${s}%, ${l}%, ${rgba.a})`;\n  }\n  return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\n/**\n * Converte RGBA (base) para qualquer variante\n */\nexport function fromBaseColor(variant: ColorVariant, rgba: RGBA): unknown {\n  switch (variant) {\n    case \"hex\":\n      return rgbaToHex(rgba);\n    case \"rgb_object\":\n      return rgbaToRgbObject(rgba);\n    case \"rgb_string\":\n      return rgbaToRgbString(rgba);\n    case \"hsl_object\":\n      return rgbaToHslObject(rgba);\n    case \"hsl_string\":\n      return rgbaToHslString(rgba);\n    default:\n      throw new Error(`Unknown color variant: ${variant}`);\n  }\n}\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte entre duas variantes de cor\n *\n * @param from - Variante de origem\n * @param to - Variante de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertColor('hex', 'rgb_object', '#ff0000');\n * // { r: 255, g: 0, b: 0 }\n */\nexport function convertColor<TFrom = unknown, TTo = unknown>(\n  from: ColorVariant,\n  to: ColorVariant,\n  value: TFrom,\n): TTo {\n  // Otimização: mesma variante\n  if (from === to) {\n    return value as unknown as TTo;\n  }\n\n  // Converte via base (RGBA)\n  const rgba = toBaseColor(from, value);\n  return fromBaseColor(to, rgba) as TTo;\n}\n\n/**\n * Versão safe de convertColor que retorna Result\n */\nexport function tryConvertColor<TFrom = unknown, TTo = unknown>(\n  from: ColorVariant,\n  to: ColorVariant,\n  value: TFrom,\n): Result<TTo> {\n  try {\n    const result = convertColor<TFrom, TTo>(from, to, value);\n    return { ok: true, value: result };\n  } catch (error) {\n    return {\n      ok: false,\n      error: error instanceof Error ? error.message : String(error),\n    };\n  }\n}\n\n/**\n * Verifica se variante existe\n */\nexport function hasColorVariant(variant: string): variant is ColorVariant {\n  return COLOR_VARIANTS.includes(variant as ColorVariant);\n}\n\n/**\n * Retorna lista de variantes\n */\nexport function getColorVariants(): ColorVariant[] {\n  return [...COLOR_VARIANTS];\n}\n","/**\n * Date Role - Convert Pillar\n *\n * Conversão entre variantes de data usando hub-and-spoke (via timestamp).\n *\n * @example\n * import { convertDate, isoToTimestamp, epochToIso } from '@attrx/role-morphic/date/convert';\n *\n * convertDate('iso', 'epoch', '2024-12-05T19:30:00.000Z');  // 1733425800\n * convertDate('epoch', 'iso', 1733425800);                  // '2024-12-05T19:30:00.000Z'\n * isoToTimestamp('2024-12-05T19:30:00.000Z');               // 1733425800000\n */\n\nimport type { DateVariant, DateTimestamp, DateIso, DateEpoch } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Variante base para conversões */\nexport const DATE_BASE: DateVariant = \"timestamp\";\n\n/** Lista de variantes disponíveis */\nexport const DATE_VARIANTS: DateVariant[] = [\"iso\", \"timestamp\", \"epoch\"];\n\n// =============================================================================\n// TO BASE (para timestamp em ms)\n// =============================================================================\n\n/**\n * Converte ISO para timestamp (base)\n */\nexport function isoToBase(value: DateIso): DateTimestamp {\n  const date = new Date(value);\n  if (isNaN(date.getTime())) {\n    throw new Error(`Invalid ISO date: ${value}`);\n  }\n  return date.getTime();\n}\n\n/**\n * Timestamp já é a base\n */\nexport function timestampToBase(value: DateTimestamp): DateTimestamp {\n  return value;\n}\n\n/**\n * Converte epoch (segundos) para timestamp (base em ms)\n */\nexport function epochToBase(value: DateEpoch): DateTimestamp {\n  return value * 1000;\n}\n\n/**\n * Converte qualquer variante para base (timestamp)\n */\nexport function toBaseDate(variant: DateVariant, value: unknown): DateTimestamp {\n  switch (variant) {\n    case \"iso\":\n      return isoToBase(value as DateIso);\n    case \"timestamp\":\n      return timestampToBase(value as DateTimestamp);\n    case \"epoch\":\n      return epochToBase(value as DateEpoch);\n    default:\n      throw new Error(`Unknown date variant: ${variant}`);\n  }\n}\n\n// =============================================================================\n// FROM BASE (de timestamp em ms)\n// =============================================================================\n\n/**\n * Converte timestamp (base) para ISO\n */\nexport function baseToIso(base: DateTimestamp): DateIso {\n  const date = new Date(base);\n  if (isNaN(date.getTime())) {\n    throw new Error(`Invalid timestamp: ${base}`);\n  }\n  return date.toISOString();\n}\n\n/**\n * Timestamp já é a base\n */\nexport function baseToTimestamp(base: DateTimestamp): DateTimestamp {\n  return base;\n}\n\n/**\n * Converte timestamp (base em ms) para epoch (segundos)\n */\nexport function baseToEpoch(base: DateTimestamp): DateEpoch {\n  return Math.floor(base / 1000);\n}\n\n/**\n * Converte base (timestamp) para qualquer variante\n */\nexport function fromBaseDate(variant: DateVariant, base: DateTimestamp): unknown {\n  switch (variant) {\n    case \"iso\":\n      return baseToIso(base);\n    case \"timestamp\":\n      return baseToTimestamp(base);\n    case \"epoch\":\n      return baseToEpoch(base);\n    default:\n      throw new Error(`Unknown date variant: ${variant}`);\n  }\n}\n\n// =============================================================================\n// CONVERT\n// =============================================================================\n\n/**\n * Converte entre duas variantes de data\n *\n * @param from - Variante de origem\n * @param to - Variante de destino\n * @param value - Valor a converter\n * @returns Valor convertido\n *\n * @example\n * convertDate('iso', 'epoch', '2024-12-05T19:30:00.000Z');  // 1733425800\n * convertDate('epoch', 'iso', 1733425800);                  // '2024-12-05T19:30:00.000Z'\n */\nexport function convertDate<TFrom = unknown, TTo = unknown>(\n  from: DateVariant,\n  to: DateVariant,\n  value: TFrom\n): TTo {\n  // Otimização: mesma variante\n  if (from === to) {\n    return value as unknown as TTo;\n  }\n\n  // Hub-and-spoke: from → base → to\n  const base = toBaseDate(from, value);\n  return fromBaseDate(to, base) as TTo;\n}\n\n/**\n * Versão safe de convertDate que retorna Result\n */\nexport function tryConvertDate<TFrom = unknown, TTo = unknown>(\n  from: DateVariant,\n  to: DateVariant,\n  value: TFrom\n): Result<TTo> {\n  try {\n    const result = convertDate<TFrom, TTo>(from, to, value);\n    return { ok: true, value: result };\n  } catch (error) {\n    return {\n      ok: false,\n      error: error instanceof Error ? error.message : String(error),\n    };\n  }\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte ISO para timestamp (milissegundos)\n */\nexport function isoToTimestamp(iso: DateIso): DateTimestamp {\n  return isoToBase(iso);\n}\n\n/**\n * Converte timestamp (milissegundos) para ISO\n */\nexport function timestampToIso(timestamp: DateTimestamp): DateIso {\n  return baseToIso(timestamp);\n}\n\n/**\n * Converte ISO para epoch (segundos)\n */\nexport function isoToEpoch(iso: DateIso): DateEpoch {\n  return baseToEpoch(isoToBase(iso));\n}\n\n/**\n * Converte epoch (segundos) para ISO\n */\nexport function epochToIso(epoch: DateEpoch): DateIso {\n  return baseToIso(epochToBase(epoch));\n}\n\n/**\n * Converte timestamp (milissegundos) para epoch (segundos)\n */\nexport function timestampToEpoch(timestamp: DateTimestamp): DateEpoch {\n  return baseToEpoch(timestamp);\n}\n\n/**\n * Converte epoch (segundos) para timestamp (milissegundos)\n */\nexport function epochToTimestamp(epoch: DateEpoch): DateTimestamp {\n  return epochToBase(epoch);\n}\n\n// =============================================================================\n// NOW HELPERS\n// =============================================================================\n\n/**\n * Retorna o timestamp atual em milissegundos\n */\nexport function nowTimestamp(): DateTimestamp {\n  return Date.now();\n}\n\n/**\n * Retorna o epoch atual em segundos\n */\nexport function nowEpoch(): DateEpoch {\n  return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Retorna a data/hora atual em ISO\n */\nexport function nowIso(): DateIso {\n  return new Date().toISOString();\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Verifica se variante existe\n */\nexport function hasDateVariant(variant: string): variant is DateVariant {\n  return DATE_VARIANTS.includes(variant as DateVariant);\n}\n\n/**\n * Retorna lista de variantes\n */\nexport function getDateVariants(): DateVariant[] {\n  return [...DATE_VARIANTS];\n}\n","/**\n * Area Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castArea, castAreaStrict, detectAreaUnit } from '@attrx/role-morphic/area/cast';\n *\n * castArea('100 ha', 'hectare');     // 100\n * castArea('100 ha', 'acre');        // 247.105... (converte)\n * castAreaStrict('100 ha');          // 100 (não converte)\n * detectAreaUnit('100 hectares');    // 'hectare'\n */\n\nimport { AREA_UNITS, AREA_ALIASES, type AreaUnit } from \"./constants\";\nimport { convertArea } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castArea(100, 'hectare');            // 100\n * castArea('100', 'hectare');          // 100\n * castArea('100 ha', 'hectare');       // 100\n * castArea('100 ha', 'acre');          // 247.105... (converte)\n * castArea('100 acres', 'hectare');    // 40.4686... (converte)\n * castArea('invalid', 'hectare');      // null\n */\nexport function castArea(\n  input: unknown,\n  targetVariant: AreaUnit = \"square_meter\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseAreaString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castAreaStrict('100 ha');   // 100 (ignora unidade, não converte)\n * castAreaStrict('100');      // 100\n * castAreaStrict(100);        // 100\n */\nexport function castAreaStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castArea que retorna Result\n */\nexport function tryCastArea(\n  input: unknown,\n  targetVariant: AreaUnit = \"square_meter\"\n): Result<number> {\n  const result = castArea(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to area:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de área a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectAreaUnit('100 ha');        // 'hectare'\n * detectAreaUnit('100 hectares');  // 'hectare'\n * detectAreaUnit('100 m²');        // 'square_meter'\n * detectAreaUnit('100');           // null\n */\nexport function detectAreaUnit(input: string): AreaUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseAreaString(input: string, targetVariant: AreaUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertArea(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): AreaUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in AREA_ALIASES) {\n    return AREA_ALIASES[normalized] as AreaUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(AREA_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as AreaUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Length Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castLength, castLengthStrict, detectLengthUnit } from '@attrx/role-morphic/length/cast';\n *\n * castLength('100 km', 'kilometer');     // 100\n * castLength('100 km', 'mile');          // 62.1371... (converte)\n * castLengthStrict('100 km');            // 100 (não converte)\n * detectLengthUnit('100 meters');        // 'meter'\n */\n\nimport { LENGTH_UNITS, LENGTH_ALIASES, type LengthUnit } from \"./constants\";\nimport { convertLength } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castLength(100, 'meter');              // 100\n * castLength('100', 'meter');            // 100\n * castLength('100 km', 'kilometer');     // 100\n * castLength('100 km', 'mile');          // 62.1371... (converte)\n * castLength('1 mile', 'kilometer');     // 1.609344 (converte)\n * castLength('invalid', 'meter');        // null\n */\nexport function castLength(\n  input: unknown,\n  targetVariant: LengthUnit = \"meter\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseLengthString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castLengthStrict('100 km');   // 100 (ignora unidade, não converte)\n * castLengthStrict('100');      // 100\n * castLengthStrict(100);        // 100\n */\nexport function castLengthStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castLength que retorna Result\n */\nexport function tryCastLength(\n  input: unknown,\n  targetVariant: LengthUnit = \"meter\"\n): Result<number> {\n  const result = castLength(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to length:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de comprimento a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectLengthUnit('100 km');       // 'kilometer'\n * detectLengthUnit('100 meters');   // 'meter'\n * detectLengthUnit('100 ft');       // 'foot'\n * detectLengthUnit('100');          // null\n */\nexport function detectLengthUnit(input: string): LengthUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseLengthString(input: string, targetVariant: LengthUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertLength(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): LengthUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in LENGTH_ALIASES) {\n    return LENGTH_ALIASES[normalized] as LengthUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(LENGTH_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as LengthUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Mass Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castMass, castMassStrict, detectMassUnit } from '@attrx/role-morphic/mass/cast';\n *\n * castMass('100 kg', 'kilogram');     // 100\n * castMass('100 lb', 'kilogram');     // 45.359237 (converte)\n * castMassStrict('100 kg');           // 100 (não converte)\n * detectMassUnit('100 pounds');       // 'pound'\n */\n\nimport { MASS_UNITS, MASS_ALIASES, type MassUnit } from \"./constants\";\nimport { convertMass } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castMass(100, 'kilogram');            // 100\n * castMass('100', 'kilogram');          // 100\n * castMass('100 kg', 'kilogram');       // 100\n * castMass('100 lb', 'kilogram');       // 45.359237 (converte)\n * castMass('100 pounds', 'gram');       // 45359.237 (converte)\n * castMass('invalid', 'kilogram');      // null\n */\nexport function castMass(\n  input: unknown,\n  targetVariant: MassUnit = \"kilogram\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseMassString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castMassStrict('100 kg');   // 100 (ignora unidade, não converte)\n * castMassStrict('100');      // 100\n * castMassStrict(100);        // 100\n */\nexport function castMassStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castMass que retorna Result\n */\nexport function tryCastMass(\n  input: unknown,\n  targetVariant: MassUnit = \"kilogram\"\n): Result<number> {\n  const result = castMass(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to mass:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de massa a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectMassUnit('100 kg');        // 'kilogram'\n * detectMassUnit('100 pounds');    // 'pound'\n * detectMassUnit('100 oz');        // 'ounce'\n * detectMassUnit('100');           // null\n */\nexport function detectMassUnit(input: string): MassUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseMassString(input: string, targetVariant: MassUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertMass(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): MassUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in MASS_ALIASES) {\n    return MASS_ALIASES[normalized] as MassUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(MASS_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as MassUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Temperature Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castTemperature, castTemperatureStrict, detectTemperatureUnit } from '@attrx/role-morphic/temperature/cast';\n *\n * castTemperature('100 °C', 'celsius');       // 100\n * castTemperature('32 °F', 'celsius');        // 0 (converte)\n * castTemperatureStrict('100 °C');            // 100 (não converte)\n * detectTemperatureUnit('100 degrees F');     // 'fahrenheit'\n */\n\nimport { TEMPERATURE_UNITS, TEMPERATURE_ALIASES, type TemperatureUnit } from \"./constants\";\nimport { convertTemperature } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castTemperature(100, 'celsius');            // 100\n * castTemperature('100', 'celsius');          // 100\n * castTemperature('100 °C', 'celsius');       // 100\n * castTemperature('32 °F', 'celsius');        // 0 (converte F → C)\n * castTemperature('273.15 K', 'celsius');     // 0 (converte K → C)\n * castTemperature('invalid', 'celsius');      // null\n */\nexport function castTemperature(\n  input: unknown,\n  targetVariant: TemperatureUnit = \"celsius\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseTemperatureString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castTemperatureStrict('100 °C');   // 100 (ignora unidade, não converte)\n * castTemperatureStrict('100');      // 100\n * castTemperatureStrict(100);        // 100\n */\nexport function castTemperatureStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castTemperature que retorna Result\n */\nexport function tryCastTemperature(\n  input: unknown,\n  targetVariant: TemperatureUnit = \"celsius\"\n): Result<number> {\n  const result = castTemperature(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to temperature:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de temperatura a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectTemperatureUnit('100 °C');           // 'celsius'\n * detectTemperatureUnit('100 degrees F');    // 'fahrenheit'\n * detectTemperatureUnit('273 K');            // 'kelvin'\n * detectTemperatureUnit('100');              // null\n */\nexport function detectTemperatureUnit(input: string): TemperatureUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseTemperatureString(input: string, targetVariant: TemperatureUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertTemperature(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): TemperatureUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in TEMPERATURE_ALIASES) {\n    return TEMPERATURE_ALIASES[normalized] as TemperatureUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(TEMPERATURE_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as TemperatureUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Volume Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castVolume, castVolumeStrict, detectVolumeUnit } from '@attrx/role-morphic/volume/cast';\n *\n * castVolume('500 ml', 'liter');       // 0.5 (converte)\n * castVolume('1 gal', 'liter');        // 3.785411784 (converte)\n * castVolumeStrict('500 ml');          // 500 (não converte)\n * detectVolumeUnit('2 gallons');       // 'gallon_us'\n */\n\nimport { VOLUME_UNITS, VOLUME_ALIASES, type VolumeUnit } from \"./constants\";\nimport { convertVolume } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castVolume(100, 'liter');              // 100\n * castVolume('100', 'liter');            // 100\n * castVolume('500 ml', 'liter');         // 0.5 (converte)\n * castVolume('1 gal', 'liter');          // 3.785411784 (converte)\n * castVolume('invalid', 'liter');        // null\n */\nexport function castVolume(\n  input: unknown,\n  targetVariant: VolumeUnit = \"liter\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseVolumeString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castVolumeStrict('500 ml');   // 500 (ignora unidade, não converte)\n * castVolumeStrict('100');      // 100\n * castVolumeStrict(100);        // 100\n */\nexport function castVolumeStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castVolume que retorna Result\n */\nexport function tryCastVolume(\n  input: unknown,\n  targetVariant: VolumeUnit = \"liter\"\n): Result<number> {\n  const result = castVolume(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to volume:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de volume a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectVolumeUnit('500 ml');        // 'milliliter'\n * detectVolumeUnit('2 gallons');     // 'gallon_us'\n * detectVolumeUnit('1 L');           // 'liter'\n * detectVolumeUnit('100');           // null\n */\nexport function detectVolumeUnit(input: string): VolumeUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseVolumeString(input: string, targetVariant: VolumeUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertVolume(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): VolumeUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in VOLUME_ALIASES) {\n    return VOLUME_ALIASES[normalized] as VolumeUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(VOLUME_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as VolumeUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Speed Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castSpeed, castSpeedStrict, detectSpeedUnit } from '@attrx/role-morphic/speed/cast';\n *\n * castSpeed('100 km/h', 'meter_per_second');   // 27.7778... (converte)\n * castSpeed('60 mph', 'kilometer_per_hour');   // 96.5606... (converte)\n * castSpeedStrict('100 km/h');                 // 100 (não converte)\n * detectSpeedUnit('60 miles per hour');        // 'mile_per_hour'\n */\n\nimport { SPEED_UNITS, SPEED_ALIASES, type SpeedUnit } from \"./constants\";\nimport { convertSpeed } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castSpeed(100, 'meter_per_second');              // 100\n * castSpeed('100', 'meter_per_second');            // 100\n * castSpeed('100 km/h', 'meter_per_second');       // 27.7778... (converte)\n * castSpeed('60 mph', 'kilometer_per_hour');       // 96.5606... (converte)\n * castSpeed('invalid', 'meter_per_second');        // null\n */\nexport function castSpeed(\n  input: unknown,\n  targetVariant: SpeedUnit = \"meter_per_second\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseSpeedString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castSpeedStrict('100 km/h');   // 100 (ignora unidade, não converte)\n * castSpeedStrict('100');        // 100\n * castSpeedStrict(100);          // 100\n */\nexport function castSpeedStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castSpeed que retorna Result\n */\nexport function tryCastSpeed(\n  input: unknown,\n  targetVariant: SpeedUnit = \"meter_per_second\"\n): Result<number> {\n  const result = castSpeed(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to speed:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de velocidade a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectSpeedUnit('100 km/h');           // 'kilometer_per_hour'\n * detectSpeedUnit('60 mph');             // 'mile_per_hour'\n * detectSpeedUnit('10 knots');           // 'knot'\n * detectSpeedUnit('100');                // null\n */\nexport function detectSpeedUnit(input: string): SpeedUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseSpeedString(input: string, targetVariant: SpeedUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertSpeed(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): SpeedUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in SPEED_ALIASES) {\n    return SPEED_ALIASES[normalized] as SpeedUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(SPEED_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as SpeedUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Energy Role - Cast Pillar\n *\n * Normaliza input sujo para número tipado.\n * Detecta unidades em strings e converte se necessário.\n *\n * @example\n * import { castEnergy, castEnergyStrict, detectEnergyUnit } from '@attrx/role-morphic/energy/cast';\n *\n * castEnergy('100 kWh', 'kilowatt_hour');     // 100\n * castEnergy('100 BTU', 'joule');             // 105505.59 (converte)\n * castEnergyStrict('100 kWh');                // 100 (não converte)\n * detectEnergyUnit('100 kilocalories');       // 'kilocalorie'\n */\n\nimport { ENERGY_UNITS, ENERGY_ALIASES, type EnergyUnit } from \"./constants\";\nimport { convertEnergy } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, detectando e convertendo unidade se presente\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo para conversão\n * @returns Número ou null se não puder converter\n *\n * @example\n * castEnergy(100, 'joule');                   // 100\n * castEnergy('100', 'joule');                 // 100\n * castEnergy('100 kWh', 'kilowatt_hour');     // 100\n * castEnergy('100 BTU', 'joule');             // 105505.59 (converte)\n * castEnergy('1 kcal', 'kilojoule');          // 4.1868 (converte)\n * castEnergy('invalid', 'joule');             // null\n */\nexport function castEnergy(\n  input: unknown,\n  targetVariant: EnergyUnit = \"joule\"\n): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseEnergyString(input, targetVariant);\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão de unidade (só parseia o valor literal)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castEnergyStrict('100 kWh');   // 100 (ignora unidade, não converte)\n * castEnergyStrict('100');       // 100\n * castEnergyStrict(100);         // 100\n */\nexport function castEnergyStrict(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const numValue = parseNumber(input);\n    return numValue;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castEnergy que retorna Result\n */\nexport function tryCastEnergy(\n  input: unknown,\n  targetVariant: EnergyUnit = \"joule\"\n): Result<number> {\n  const result = castEnergy(input, targetVariant);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to energy:${targetVariant}`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECTION\n// =============================================================================\n\n/**\n * Detecta unidade de energia a partir de uma string\n *\n * @param input - String com possível unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectEnergyUnit('100 kWh');           // 'kilowatt_hour'\n * detectEnergyUnit('100 kilocalories');  // 'kilocalorie'\n * detectEnergyUnit('100 BTU');           // 'btu'\n * detectEnergyUnit('100');               // null\n */\nexport function detectEnergyUnit(input: string): EnergyUnit | null {\n  const trimmed = input.trim().toLowerCase();\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  return detectUnit(unitStr);\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Parseia string para número, detectando unidade e convertendo se necessário\n */\nfunction parseEnergyString(input: string, targetVariant: EnergyUnit): number | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extrai número e possível unidade\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const [, numStr, unitStr] = match;\n\n  // Normaliza número\n  const numValue = parseNumber(numStr);\n  if (numValue === null) {\n    return null;\n  }\n\n  // Se tem unidade no input, converte se necessário\n  const cleanUnitStr = unitStr.trim();\n  if (cleanUnitStr) {\n    const detectedUnit = detectUnit(cleanUnitStr);\n    if (detectedUnit && detectedUnit !== targetVariant) {\n      // Converte da unidade detectada para a target\n      return convertEnergy(detectedUnit, targetVariant, numValue);\n    }\n  }\n\n  return numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const afterComma = numStr.split(\",\").slice(1);\n    const isThousandSep = afterComma.every((part) => part.length === 3);\n    if (isThousandSep) {\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos: múltiplos pontos = milhar brasileiro\n    const afterDot = numStr.split(\".\").slice(1);\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n\n/**\n * Detecta unidade a partir de string (símbolo ou alias)\n */\nfunction detectUnit(unitStr: string): EnergyUnit | null {\n  const normalized = unitStr.toLowerCase().trim();\n\n  // Checa aliases primeiro\n  if (normalized in ENERGY_ALIASES) {\n    return ENERGY_ALIASES[normalized] as EnergyUnit;\n  }\n\n  // Checa símbolos e nomes\n  for (const [variant, config] of Object.entries(ENERGY_UNITS)) {\n    if (\n      config.symbol.toLowerCase() === normalized ||\n      config.singular?.toLowerCase() === normalized ||\n      config.plural?.toLowerCase() === normalized ||\n      variant.toLowerCase() === normalized\n    ) {\n      return variant as EnergyUnit;\n    }\n  }\n\n  return null;\n}\n","/**\n * Power Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castPower, castPowerStrict, detectPowerUnit } from '@attrx/role-morphic/power/cast';\n *\n * castPower('100 kW');                      // 100000 (converted to watts)\n * castPower('100 kW', 'kilowatt');          // 100 (kept as kilowatts)\n * castPowerStrict('100');                   // 100 (no conversion)\n * detectPowerUnit('100 hp');                // 'horsepower_mechanical'\n */\n\nimport { POWER_UNITS, POWER_ALIASES, type PowerUnit } from \"./constants\";\nimport { convertPower, POWER_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: watt)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castPower('100 kW');                 // 100000 (watts)\n * castPower('100 kW', 'kilowatt');     // 100\n * castPower('100');                    // 100\n * castPower(100);                      // 100\n * castPower('invalid');                // null\n */\nexport function castPower(\n  input: unknown,\n  targetVariant: PowerUnit = POWER_BASE,\n): number | null {\n  // Already a number\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String parsing\n  if (typeof input === \"string\") {\n    const parsed = parsePowerString(input);\n    if (parsed === null) {\n      return null;\n    }\n\n    // If unit was detected and differs from target, convert\n    if (parsed.unit && parsed.unit !== targetVariant) {\n      return convertPower(parsed.unit, targetVariant, parsed.value);\n    }\n\n    return parsed.value;\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castPowerStrict('100 kW');  // 100 (ignora a unidade)\n * castPowerStrict('100');     // 100\n */\nexport function castPowerStrict(input: unknown): number | null {\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  if (typeof input === \"string\") {\n    const parsed = parsePowerString(input);\n    return parsed?.value ?? null;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castPower que retorna Result\n */\nexport function tryCastPower(\n  input: unknown,\n  targetVariant: PowerUnit = POWER_BASE,\n): Result<number> {\n  const result = castPower(input, targetVariant);\n  if (result === null) {\n    return { ok: false, error: `Cannot cast \"${String(input)}\" to power` };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de potência de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectPowerUnit('100 kW');   // 'kilowatt'\n * detectPowerUnit('100 hp');   // 'horsepower_mechanical'\n * detectPowerUnit('100');      // null\n */\nexport function detectPowerUnit(input: string): PowerUnit | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extract unit part (after the number)\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  if (!unitStr) {\n    return null;\n  }\n\n  // Check direct unit names\n  if (unitStr in POWER_UNITS) {\n    return unitStr as PowerUnit;\n  }\n\n  // Check aliases\n  if (unitStr in POWER_ALIASES) {\n    return POWER_ALIASES[unitStr] as PowerUnit;\n  }\n\n  // Check symbols (case-sensitive for some)\n  for (const [unit, config] of Object.entries(POWER_UNITS)) {\n    if (config.symbol.toLowerCase() === unitStr) {\n      return unit as PowerUnit;\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedPower {\n  value: number;\n  unit: PowerUnit | null;\n}\n\n/**\n * Parseia string de potência extraindo valor e unidade\n */\nfunction parsePowerString(input: string): ParsedPower | null {\n  const trimmed = input.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  // Try to extract number and unit\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n  const value = parseFloat(numStr);\n\n  if (isNaN(value) || !Number.isFinite(value)) {\n    return null;\n  }\n\n  const unitStr = match[2]?.trim().toLowerCase() || \"\";\n  let unit: PowerUnit | null = null;\n\n  if (unitStr) {\n    // Check aliases first\n    if (unitStr in POWER_ALIASES) {\n      unit = POWER_ALIASES[unitStr] as PowerUnit;\n    }\n    // Check direct unit names\n    else if (unitStr in POWER_UNITS) {\n      unit = unitStr as PowerUnit;\n    }\n    // Check symbols\n    else {\n      for (const [u, config] of Object.entries(POWER_UNITS)) {\n        if (config.symbol.toLowerCase() === unitStr) {\n          unit = u as PowerUnit;\n          break;\n        }\n      }\n    }\n  }\n\n  return { value, unit };\n}\n","/**\n * Pressure Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castPressure, castPressureStrict, detectPressureUnit } from '@attrx/role-morphic/pressure/cast';\n *\n * castPressure('1 bar');                      // 100000 (converted to pascals)\n * castPressure('1 bar', 'bar');               // 1 (kept as bar)\n * castPressureStrict('100');                  // 100 (no conversion)\n * detectPressureUnit('14.7 psi');             // 'psi'\n */\n\nimport { PRESSURE_UNITS, PRESSURE_ALIASES, type PressureUnit } from \"./constants\";\nimport { convertPressure, PRESSURE_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: pascal)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castPressure('1 bar');            // 100000 (pascals)\n * castPressure('1 bar', 'bar');     // 1\n * castPressure('100');              // 100\n * castPressure(100);                // 100\n * castPressure('invalid');          // null\n */\nexport function castPressure(\n  input: unknown,\n  targetVariant: PressureUnit = PRESSURE_BASE,\n): number | null {\n  // Already a number\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String parsing\n  if (typeof input === \"string\") {\n    const parsed = parsePressureString(input);\n    if (parsed === null) {\n      return null;\n    }\n\n    // If unit was detected and differs from target, convert\n    if (parsed.unit && parsed.unit !== targetVariant) {\n      return convertPressure(parsed.unit, targetVariant, parsed.value);\n    }\n\n    return parsed.value;\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castPressureStrict('100 bar');  // 100 (ignora a unidade)\n * castPressureStrict('100');      // 100\n */\nexport function castPressureStrict(input: unknown): number | null {\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  if (typeof input === \"string\") {\n    const parsed = parsePressureString(input);\n    return parsed?.value ?? null;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castPressure que retorna Result\n */\nexport function tryCastPressure(\n  input: unknown,\n  targetVariant: PressureUnit = PRESSURE_BASE,\n): Result<number> {\n  const result = castPressure(input, targetVariant);\n  if (result === null) {\n    return { ok: false, error: `Cannot cast \"${String(input)}\" to pressure` };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de pressão de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectPressureUnit('100 bar');   // 'bar'\n * detectPressureUnit('14.7 psi');  // 'psi'\n * detectPressureUnit('100');       // null\n */\nexport function detectPressureUnit(input: string): PressureUnit | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extract unit part (after the number)\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  if (!unitStr) {\n    return null;\n  }\n\n  // Check direct unit names\n  if (unitStr in PRESSURE_UNITS) {\n    return unitStr as PressureUnit;\n  }\n\n  // Check aliases\n  if (unitStr in PRESSURE_ALIASES) {\n    return PRESSURE_ALIASES[unitStr] as PressureUnit;\n  }\n\n  // Check symbols (case-sensitive for some)\n  for (const [unit, config] of Object.entries(PRESSURE_UNITS)) {\n    if (config.symbol.toLowerCase() === unitStr) {\n      return unit as PressureUnit;\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedPressure {\n  value: number;\n  unit: PressureUnit | null;\n}\n\n/**\n * Parseia string de pressão extraindo valor e unidade\n */\nfunction parsePressureString(input: string): ParsedPressure | null {\n  const trimmed = input.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  // Try to extract number and unit\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n  const value = parseFloat(numStr);\n\n  if (isNaN(value) || !Number.isFinite(value)) {\n    return null;\n  }\n\n  const unitStr = match[2]?.trim().toLowerCase() || \"\";\n  let unit: PressureUnit | null = null;\n\n  if (unitStr) {\n    // Check aliases first\n    if (unitStr in PRESSURE_ALIASES) {\n      unit = PRESSURE_ALIASES[unitStr] as PressureUnit;\n    }\n    // Check direct unit names\n    else if (unitStr in PRESSURE_UNITS) {\n      unit = unitStr as PressureUnit;\n    }\n    // Check symbols\n    else {\n      for (const [u, config] of Object.entries(PRESSURE_UNITS)) {\n        if (config.symbol.toLowerCase() === unitStr) {\n          unit = u as PressureUnit;\n          break;\n        }\n      }\n    }\n  }\n\n  return { value, unit };\n}\n","/**\n * Frequency Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castFrequency, castFrequencyStrict, detectFrequencyUnit } from '@attrx/role-morphic/frequency/cast';\n *\n * castFrequency('2.4 GHz');                    // 2400000000 (converted to hertz)\n * castFrequency('2.4 GHz', 'gigahertz');       // 2.4 (kept as gigahertz)\n * castFrequencyStrict('100');                  // 100 (no conversion)\n * detectFrequencyUnit('3600 rpm');             // 'rpm'\n */\n\nimport { FREQUENCY_UNITS, FREQUENCY_ALIASES, type FrequencyUnit } from \"./constants\";\nimport { convertFrequency, FREQUENCY_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: hertz)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castFrequency('2.4 GHz');               // 2400000000 (hertz)\n * castFrequency('2.4 GHz', 'gigahertz');  // 2.4\n * castFrequency('100');                   // 100\n * castFrequency(100);                     // 100\n * castFrequency('invalid');               // null\n */\nexport function castFrequency(\n  input: unknown,\n  targetVariant: FrequencyUnit = FREQUENCY_BASE,\n): number | null {\n  // Already a number\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String parsing\n  if (typeof input === \"string\") {\n    const parsed = parseFrequencyString(input);\n    if (parsed === null) {\n      return null;\n    }\n\n    // If unit was detected and differs from target, convert\n    if (parsed.unit && parsed.unit !== targetVariant) {\n      return convertFrequency(parsed.unit, targetVariant, parsed.value);\n    }\n\n    return parsed.value;\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castFrequencyStrict('100 MHz');  // 100 (ignora a unidade)\n * castFrequencyStrict('100');      // 100\n */\nexport function castFrequencyStrict(input: unknown): number | null {\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  if (typeof input === \"string\") {\n    const parsed = parseFrequencyString(input);\n    return parsed?.value ?? null;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castFrequency que retorna Result\n */\nexport function tryCastFrequency(\n  input: unknown,\n  targetVariant: FrequencyUnit = FREQUENCY_BASE,\n): Result<number> {\n  const result = castFrequency(input, targetVariant);\n  if (result === null) {\n    return { ok: false, error: `Cannot cast \"${String(input)}\" to frequency` };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de frequência de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectFrequencyUnit('100 MHz');    // 'megahertz'\n * detectFrequencyUnit('3600 rpm');   // 'rpm'\n * detectFrequencyUnit('100');        // null\n */\nexport function detectFrequencyUnit(input: string): FrequencyUnit | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extract unit part (after the number)\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  if (!unitStr) {\n    return null;\n  }\n\n  // Check direct unit names\n  if (unitStr in FREQUENCY_UNITS) {\n    return unitStr as FrequencyUnit;\n  }\n\n  // Check aliases\n  if (unitStr in FREQUENCY_ALIASES) {\n    return FREQUENCY_ALIASES[unitStr] as FrequencyUnit;\n  }\n\n  // Check symbols (case-sensitive for some)\n  for (const [unit, config] of Object.entries(FREQUENCY_UNITS)) {\n    if (config.symbol.toLowerCase() === unitStr) {\n      return unit as FrequencyUnit;\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedFrequency {\n  value: number;\n  unit: FrequencyUnit | null;\n}\n\n/**\n * Parseia string de frequência extraindo valor e unidade\n */\nfunction parseFrequencyString(input: string): ParsedFrequency | null {\n  const trimmed = input.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  // Try to extract number and unit\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n  const value = parseFloat(numStr);\n\n  if (isNaN(value) || !Number.isFinite(value)) {\n    return null;\n  }\n\n  const unitStr = match[2]?.trim().toLowerCase() || \"\";\n  let unit: FrequencyUnit | null = null;\n\n  if (unitStr) {\n    // Check aliases first\n    if (unitStr in FREQUENCY_ALIASES) {\n      unit = FREQUENCY_ALIASES[unitStr] as FrequencyUnit;\n    }\n    // Check direct unit names\n    else if (unitStr in FREQUENCY_UNITS) {\n      unit = unitStr as FrequencyUnit;\n    }\n    // Check symbols\n    else {\n      for (const [u, config] of Object.entries(FREQUENCY_UNITS)) {\n        if (config.symbol.toLowerCase() === unitStr) {\n          unit = u as FrequencyUnit;\n          break;\n        }\n      }\n    }\n  }\n\n  return { value, unit };\n}\n","/**\n * Angle Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castAngle, castAngleStrict, detectAngleUnit } from '@attrx/role-morphic/angle/cast';\n *\n * castAngle('90°');                    // 90 (degrees)\n * castAngle('3.14159 rad', 'degree');  // ~180 (converted to degrees)\n * castAngleStrict('90');               // 90 (no conversion)\n * detectAngleUnit('45°');              // 'degree'\n */\n\nimport { ANGLE_UNITS, ANGLE_ALIASES, type AngleUnit } from \"./constants\";\nimport { convertAngle, ANGLE_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: degree)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castAngle('90°');                    // 90\n * castAngle('3.14159 rad', 'degree');  // ~180\n * castAngle('100');                    // 100\n * castAngle(45);                       // 45\n * castAngle('invalid');                // null\n */\nexport function castAngle(\n  input: unknown,\n  targetVariant: AngleUnit = ANGLE_BASE,\n): number | null {\n  // Already a number\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String parsing\n  if (typeof input === \"string\") {\n    const parsed = parseAngleString(input);\n    if (parsed === null) {\n      return null;\n    }\n\n    // If unit was detected and differs from target, convert\n    if (parsed.unit && parsed.unit !== targetVariant) {\n      return convertAngle(parsed.unit, targetVariant, parsed.value);\n    }\n\n    return parsed.value;\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castAngleStrict('90°');   // 90 (ignora a unidade)\n * castAngleStrict('100');   // 100\n */\nexport function castAngleStrict(input: unknown): number | null {\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  if (typeof input === \"string\") {\n    const parsed = parseAngleString(input);\n    return parsed?.value ?? null;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castAngle que retorna Result\n */\nexport function tryCastAngle(\n  input: unknown,\n  targetVariant: AngleUnit = ANGLE_BASE,\n): Result<number> {\n  const result = castAngle(input, targetVariant);\n  if (result === null) {\n    return { ok: false, error: `Cannot cast \"${String(input)}\" to angle` };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de ângulo de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectAngleUnit('90°');        // 'degree'\n * detectAngleUnit('3.14 rad');   // 'radian'\n * detectAngleUnit('100');        // null\n */\nexport function detectAngleUnit(input: string): AngleUnit | null {\n  const trimmed = input.trim();\n\n  // Special case: degree symbol can be directly attached to number\n  if (trimmed.endsWith(\"°\")) {\n    return \"degree\";\n  }\n\n  const lowerTrimmed = trimmed.toLowerCase();\n\n  // Extract unit part (after the number)\n  const match = lowerTrimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  if (!unitStr) {\n    return null;\n  }\n\n  // Check direct unit names\n  if (unitStr in ANGLE_UNITS) {\n    return unitStr as AngleUnit;\n  }\n\n  // Check aliases\n  if (unitStr in ANGLE_ALIASES) {\n    return ANGLE_ALIASES[unitStr] as AngleUnit;\n  }\n\n  // Check symbols (case-sensitive for some)\n  for (const [unit, config] of Object.entries(ANGLE_UNITS)) {\n    if (config.symbol.toLowerCase() === unitStr || config.symbol === unitStr) {\n      return unit as AngleUnit;\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedAngle {\n  value: number;\n  unit: AngleUnit | null;\n}\n\n/**\n * Parseia string de ângulo extraindo valor e unidade\n */\nfunction parseAngleString(input: string): ParsedAngle | null {\n  const trimmed = input.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  // Special case: degree symbol directly attached (45°)\n  const degreeMatch = trimmed.match(/^([+-]?[\\d.,]+)°$/);\n  if (degreeMatch) {\n    const numStr = degreeMatch[1].replace(\",\", \".\");\n    const value = parseFloat(numStr);\n    if (isNaN(value) || !Number.isFinite(value)) {\n      return null;\n    }\n    return { value, unit: \"degree\" };\n  }\n\n  // Try to extract number and unit\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n  const value = parseFloat(numStr);\n\n  if (isNaN(value) || !Number.isFinite(value)) {\n    return null;\n  }\n\n  const unitStr = match[2]?.trim().toLowerCase() || \"\";\n  let unit: AngleUnit | null = null;\n\n  if (unitStr) {\n    // Check aliases first\n    if (unitStr in ANGLE_ALIASES) {\n      unit = ANGLE_ALIASES[unitStr] as AngleUnit;\n    }\n    // Check direct unit names\n    else if (unitStr in ANGLE_UNITS) {\n      unit = unitStr as AngleUnit;\n    }\n    // Check symbols\n    else {\n      for (const [u, config] of Object.entries(ANGLE_UNITS)) {\n        if (config.symbol.toLowerCase() === unitStr || config.symbol === unitStr) {\n          unit = u as AngleUnit;\n          break;\n        }\n      }\n    }\n  }\n\n  return { value, unit };\n}\n","/**\n * Time Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castTime, castTimeStrict, detectTimeUnit } from '@attrx/role-morphic/time/cast';\n *\n * castTime('5 min');                    // 300 (converted to seconds)\n * castTime('5 min', 'minute');          // 5 (kept as minutes)\n * castTimeStrict('100');                // 100 (no conversion)\n * detectTimeUnit('2 hours');            // 'hour'\n */\n\nimport { TIME_UNITS, TIME_ALIASES, type TimeUnit } from \"./constants\";\nimport { convertTime, TIME_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: second)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castTime('5 min');            // 300 (seconds)\n * castTime('5 min', 'minute');  // 5\n * castTime('100');              // 100\n * castTime(100);                // 100\n * castTime('invalid');          // null\n */\nexport function castTime(\n  input: unknown,\n  targetVariant: TimeUnit = TIME_BASE,\n): number | null {\n  // Already a number\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String parsing\n  if (typeof input === \"string\") {\n    const parsed = parseTimeString(input);\n    if (parsed === null) {\n      return null;\n    }\n\n    // If unit was detected and differs from target, convert\n    if (parsed.unit && parsed.unit !== targetVariant) {\n      return convertTime(parsed.unit, targetVariant, parsed.value);\n    }\n\n    return parsed.value;\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castTimeStrict('5 min');  // 5 (ignora a unidade)\n * castTimeStrict('100');    // 100\n */\nexport function castTimeStrict(input: unknown): number | null {\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  if (typeof input === \"string\") {\n    const parsed = parseTimeString(input);\n    return parsed?.value ?? null;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castTime que retorna Result\n */\nexport function tryCastTime(\n  input: unknown,\n  targetVariant: TimeUnit = TIME_BASE,\n): Result<number> {\n  const result = castTime(input, targetVariant);\n  if (result === null) {\n    return { ok: false, error: `Cannot cast \"${String(input)}\" to time` };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de tempo de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectTimeUnit('5 min');     // 'minute'\n * detectTimeUnit('2 hours');   // 'hour'\n * detectTimeUnit('100');       // null\n */\nexport function detectTimeUnit(input: string): TimeUnit | null {\n  const trimmed = input.trim().toLowerCase();\n\n  // Extract unit part (after the number)\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  if (!unitStr) {\n    return null;\n  }\n\n  // Check direct unit names\n  if (unitStr in TIME_UNITS) {\n    return unitStr as TimeUnit;\n  }\n\n  // Check aliases\n  if (unitStr in TIME_ALIASES) {\n    return TIME_ALIASES[unitStr] as TimeUnit;\n  }\n\n  // Check symbols (case-sensitive for some)\n  for (const [unit, config] of Object.entries(TIME_UNITS)) {\n    if (config.symbol.toLowerCase() === unitStr) {\n      return unit as TimeUnit;\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedTime {\n  value: number;\n  unit: TimeUnit | null;\n}\n\n/**\n * Parseia string de tempo extraindo valor e unidade\n */\nfunction parseTimeString(input: string): ParsedTime | null {\n  const trimmed = input.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  // Try to extract number and unit\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n  const value = parseFloat(numStr);\n\n  if (isNaN(value) || !Number.isFinite(value)) {\n    return null;\n  }\n\n  const unitStr = match[2]?.trim().toLowerCase() || \"\";\n  let unit: TimeUnit | null = null;\n\n  if (unitStr) {\n    // Check aliases first\n    if (unitStr in TIME_ALIASES) {\n      unit = TIME_ALIASES[unitStr] as TimeUnit;\n    }\n    // Check direct unit names\n    else if (unitStr in TIME_UNITS) {\n      unit = unitStr as TimeUnit;\n    }\n    // Check symbols\n    else {\n      for (const [u, config] of Object.entries(TIME_UNITS)) {\n        if (config.symbol.toLowerCase() === unitStr) {\n          unit = u as TimeUnit;\n          break;\n        }\n      }\n    }\n  }\n\n  return { value, unit };\n}\n","/**\n * Digital Role - Cast Pillar\n *\n * Normaliza input sujo para número, com detecção automática de unidade.\n *\n * @example\n * import { castDigital, castDigitalStrict, detectDigitalUnit } from '@attrx/role-morphic/digital/cast';\n *\n * castDigital('1 MB');                     // 1000000 (converted to bytes)\n * castDigital('1 MB', 'megabyte');         // 1 (kept as megabytes)\n * castDigitalStrict('100');                // 100 (no conversion)\n * detectDigitalUnit('2 GiB');              // 'gibibyte'\n */\n\nimport { DIGITAL_UNITS, DIGITAL_ALIASES, type DigitalUnit } from \"./constants\";\nimport { convertDigital, DIGITAL_BASE } from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input para número, com conversão opcional para unidade alvo\n *\n * @param input - Valor de entrada (number, string, etc)\n * @param targetVariant - Unidade alvo (default: byte)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castDigital('1 MB');             // 1000000 (bytes)\n * castDigital('1 MB', 'megabyte'); // 1\n * castDigital('100');              // 100\n * castDigital(100);                // 100\n * castDigital('invalid');          // null\n */\nexport function castDigital(\n  input: unknown,\n  targetVariant: DigitalUnit = DIGITAL_BASE,\n): number | null {\n  // Already a number\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String parsing\n  if (typeof input === \"string\") {\n    const parsed = parseDigitalString(input);\n    if (parsed === null) {\n      return null;\n    }\n\n    // If unit was detected and differs from target, convert\n    if (parsed.unit && parsed.unit !== targetVariant) {\n      return convertDigital(parsed.unit, targetVariant, parsed.value);\n    }\n\n    return parsed.value;\n  }\n\n  return null;\n}\n\n/**\n * Faz cast sem conversão (apenas parseia o número)\n *\n * @param input - Valor de entrada\n * @returns Número ou null\n *\n * @example\n * castDigitalStrict('100 MB');  // 100 (ignora a unidade)\n * castDigitalStrict('100');     // 100\n */\nexport function castDigitalStrict(input: unknown): number | null {\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  if (typeof input === \"string\") {\n    const parsed = parseDigitalString(input);\n    return parsed?.value ?? null;\n  }\n\n  return null;\n}\n\n/**\n * Versão safe de castDigital que retorna Result\n */\nexport function tryCastDigital(\n  input: unknown,\n  targetVariant: DigitalUnit = DIGITAL_BASE,\n): Result<number> {\n  const result = castDigital(input, targetVariant);\n  if (result === null) {\n    return { ok: false, error: `Cannot cast \"${String(input)}\" to digital storage` };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// DETECT UNIT\n// =============================================================================\n\n/**\n * Detecta a unidade de armazenamento digital de uma string\n *\n * @param input - String com valor e unidade\n * @returns Unidade detectada ou null\n *\n * @example\n * detectDigitalUnit('100 MB');   // 'megabyte'\n * detectDigitalUnit('2 GiB');    // 'gibibyte'\n * detectDigitalUnit('100');      // null\n */\nexport function detectDigitalUnit(input: string): DigitalUnit | null {\n  const trimmed = input.trim();\n\n  // Extract unit part (after the number)\n  const match = trimmed.match(/^[+-]?[\\d.,\\s]+\\s*(.*)$/);\n  if (!match || !match[1]) {\n    return null;\n  }\n\n  const unitStr = match[1].trim();\n  if (!unitStr) {\n    return null;\n  }\n\n  const lowerUnitStr = unitStr.toLowerCase();\n\n  // Check direct unit names\n  if (lowerUnitStr in DIGITAL_UNITS) {\n    return lowerUnitStr as DigitalUnit;\n  }\n\n  // Check aliases (case-sensitive for IEC units like KiB, MiB)\n  if (unitStr in DIGITAL_ALIASES) {\n    return DIGITAL_ALIASES[unitStr] as DigitalUnit;\n  }\n  if (lowerUnitStr in DIGITAL_ALIASES) {\n    return DIGITAL_ALIASES[lowerUnitStr] as DigitalUnit;\n  }\n\n  // Check symbols\n  for (const [unit, config] of Object.entries(DIGITAL_UNITS)) {\n    if (config.symbol === unitStr || config.symbol.toLowerCase() === lowerUnitStr) {\n      return unit as DigitalUnit;\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\ninterface ParsedDigital {\n  value: number;\n  unit: DigitalUnit | null;\n}\n\n/**\n * Parseia string de armazenamento digital extraindo valor e unidade\n */\nfunction parseDigitalString(input: string): ParsedDigital | null {\n  const trimmed = input.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  // Try to extract number and unit\n  const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n  if (!match) {\n    return null;\n  }\n\n  const numStr = match[1].replace(/\\s/g, \"\").replace(\",\", \".\");\n  const value = parseFloat(numStr);\n\n  if (isNaN(value) || !Number.isFinite(value)) {\n    return null;\n  }\n\n  const unitStr = match[2]?.trim() || \"\";\n  const lowerUnitStr = unitStr.toLowerCase();\n  let unit: DigitalUnit | null = null;\n\n  if (unitStr) {\n    // Check aliases (case-sensitive for IEC)\n    if (unitStr in DIGITAL_ALIASES) {\n      unit = DIGITAL_ALIASES[unitStr] as DigitalUnit;\n    } else if (lowerUnitStr in DIGITAL_ALIASES) {\n      unit = DIGITAL_ALIASES[lowerUnitStr] as DigitalUnit;\n    }\n    // Check direct unit names\n    else if (lowerUnitStr in DIGITAL_UNITS) {\n      unit = lowerUnitStr as DigitalUnit;\n    }\n    // Check symbols\n    else {\n      for (const [u, config] of Object.entries(DIGITAL_UNITS)) {\n        if (config.symbol === unitStr || config.symbol.toLowerCase() === lowerUnitStr) {\n          unit = u as DigitalUnit;\n          break;\n        }\n      }\n    }\n  }\n\n  return { value, unit };\n}\n","/**\n * Color Role - Cast Pillar\n *\n * Normaliza input sujo para uma variante de cor específica.\n *\n * @example\n * import { castColor, tryCastColor, detectColorFormat } from '@attrx/role-morphic/color/cast';\n *\n * castColor('hex', 'red');                     // '#ff0000'\n * castColor('rgb_object', '#ff0000');          // { r: 255, g: 0, b: 0 }\n * castColor('hsl_string', { r: 255, g: 0, b: 0 }); // 'hsl(0, 100%, 50%)'\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject } from \"./types\";\nimport { NAMED_COLORS } from \"./types\";\nimport {\n  toBaseColor,\n  fromBaseColor,\n  hexToRgba,\n  rgbObjectToRgba,\n  rgbStringToRgba,\n  hslObjectToRgba,\n  hslStringToRgba,\n} from \"./convert\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// DETECT FORMAT\n// =============================================================================\n\n/**\n * Detecta o formato de uma string de cor\n *\n * @example\n * detectColorFormat('red');           // 'named'\n * detectColorFormat('#ff0000');       // 'hex'\n * detectColorFormat('rgb(255,0,0)');  // 'rgb_string'\n * detectColorFormat('hsl(0,100%,50%)'); // 'hsl_string'\n */\nexport function detectColorFormat(\n  value: string,\n): \"hex\" | \"rgb_string\" | \"hsl_string\" | \"named\" | null {\n  const trimmed = value.trim().toLowerCase();\n\n  // Named color\n  if (NAMED_COLORS[trimmed]) {\n    return \"named\";\n  }\n\n  // Hex\n  if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n    return \"hex\";\n  }\n\n  // RGB string\n  if (/^rgba?\\s*\\(/i.test(trimmed)) {\n    return \"rgb_string\";\n  }\n\n  // HSL string\n  if (/^hsla?\\s*\\(/i.test(trimmed)) {\n    return \"hsl_string\";\n  }\n\n  return null;\n}\n\n/**\n * Detecta se um objeto é RGB ou HSL\n */\nfunction detectObjectFormat(obj: Record<string, unknown>): \"rgb_object\" | \"hsl_object\" | null {\n  if (typeof obj.r === \"number\" && typeof obj.g === \"number\" && typeof obj.b === \"number\") {\n    return \"rgb_object\";\n  }\n  if (typeof obj.h === \"number\" && typeof obj.s === \"number\" && typeof obj.l === \"number\") {\n    return \"hsl_object\";\n  }\n  return null;\n}\n\n// =============================================================================\n// PARSE INPUT\n// =============================================================================\n\n/**\n * Tenta parsear qualquer input para RGBA\n */\nfunction parseToRgba(input: unknown): RGBA | null {\n  // Já é RGBA\n  if (\n    typeof input === \"object\" &&\n    input !== null &&\n    \"r\" in input &&\n    \"g\" in input &&\n    \"b\" in input &&\n    \"a\" in input\n  ) {\n    const rgba = input as RGBA;\n    if (\n      typeof rgba.r === \"number\" &&\n      typeof rgba.g === \"number\" &&\n      typeof rgba.b === \"number\" &&\n      typeof rgba.a === \"number\"\n    ) {\n      return rgba;\n    }\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const trimmed = input.trim();\n\n    // Named color\n    const namedColor = NAMED_COLORS[trimmed.toLowerCase()];\n    if (namedColor) {\n      return namedColor;\n    }\n\n    // Hex\n    if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n      try {\n        return hexToRgba(trimmed);\n      } catch {\n        return null;\n      }\n    }\n\n    // RGB string\n    if (/^rgba?\\s*\\(/i.test(trimmed)) {\n      try {\n        return rgbStringToRgba(trimmed);\n      } catch {\n        return null;\n      }\n    }\n\n    // HSL string\n    if (/^hsla?\\s*\\(/i.test(trimmed)) {\n      try {\n        return hslStringToRgba(trimmed);\n      } catch {\n        return null;\n      }\n    }\n\n    return null;\n  }\n\n  // Object\n  if (typeof input === \"object\" && input !== null) {\n    const format = detectObjectFormat(input as Record<string, unknown>);\n\n    if (format === \"rgb_object\") {\n      try {\n        return rgbObjectToRgba(input as ColorRgbObject);\n      } catch {\n        return null;\n      }\n    }\n\n    if (format === \"hsl_object\") {\n      try {\n        return hslObjectToRgba(input as ColorHslObject);\n      } catch {\n        return null;\n      }\n    }\n  }\n\n  return null;\n}\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de qualquer input para uma variante de cor\n *\n * @param variant - Variante de destino\n * @param input - Valor de entrada (string, object, etc)\n * @returns Valor na variante de destino ou null se não puder converter\n *\n * @example\n * castColor('hex', 'red');                     // '#ff0000'\n * castColor('rgb_object', '#ff0000');          // { r: 255, g: 0, b: 0 }\n * castColor('hsl_string', { r: 255, g: 0, b: 0 }); // 'hsl(0, 100%, 50%)'\n * castColor('hex', 'invalid');                 // null\n */\nexport function castColor<T = unknown>(variant: ColorVariant, input: unknown): T | null {\n  const rgba = parseToRgba(input);\n  if (!rgba) {\n    return null;\n  }\n\n  try {\n    return fromBaseColor(variant, rgba) as T;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Versão safe de castColor que retorna Result\n */\nexport function tryCastColor<T = unknown>(\n  variant: ColorVariant,\n  input: unknown,\n): Result<T> {\n  const result = castColor<T>(variant, input);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to color variant \"${variant}\"`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Converte hex para RGB object\n */\nexport function hexToRgb(hex: string): ColorRgbObject | null {\n  return castColor<ColorRgbObject>(\"rgb_object\", hex);\n}\n\n/**\n * Converte RGB object para hex\n */\nexport function rgbToHex(rgb: ColorRgbObject): string | null {\n  return castColor<string>(\"hex\", rgb);\n}\n\n/**\n * Converte hex para HSL object\n */\nexport function hexToHsl(hex: string): ColorHslObject | null {\n  return castColor<ColorHslObject>(\"hsl_object\", hex);\n}\n\n/**\n * Converte HSL object para hex\n */\nexport function hslToHex(hsl: ColorHslObject): string | null {\n  return castColor<string>(\"hex\", hsl);\n}\n\n/**\n * Converte RGB string para hex\n */\nexport function rgbStringToHex(rgb: string): string | null {\n  return castColor<string>(\"hex\", rgb);\n}\n\n/**\n * Converte hex para RGB string\n */\nexport function hexToRgbString(hex: string): string | null {\n  return castColor<string>(\"rgb_string\", hex);\n}\n\n/**\n * Converte HSL string para hex\n */\nexport function hslStringToHex(hsl: string): string | null {\n  return castColor<string>(\"hex\", hsl);\n}\n\n/**\n * Converte hex para HSL string\n */\nexport function hexToHslString(hex: string): string | null {\n  return castColor<string>(\"hsl_string\", hex);\n}\n\n/**\n * Verifica se uma string é uma cor válida (qualquer formato)\n */\nexport function isColorString(value: string): boolean {\n  return parseToRgba(value) !== null;\n}\n\n/**\n * Alias para isColorString - verifica se valor é uma cor válida\n * (Mantido para compatibilidade com API anterior)\n */\nexport function isValidColor(value: string): boolean {\n  return isColorString(value);\n}\n","/**\n * Date Role - Cast Pillar\n *\n * Normaliza input sujo para o tipo esperado de cada variante.\n *\n * @example\n * import { castDate, castIso, castTimestamp, castEpoch } from '@attrx/role-morphic/date/cast';\n *\n * castDate('iso', '2024-12-05');                // '2024-12-05T00:00:00.000Z'\n * castDate('timestamp', '2024-12-05');          // 1733356800000\n * castDate('epoch', new Date());                // 1733425800\n */\n\nimport type { DateVariant, DateIso, DateTimestamp, DateEpoch } from \"./types\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n// =============================================================================\n// CAST ISO\n// =============================================================================\n\n/**\n * Faz cast de input para ISO string\n *\n * @example\n * castIso('2024-12-05');           // '2024-12-05T00:00:00.000Z'\n * castIso(1733425800000);          // '2024-12-05T19:30:00.000Z'\n * castIso(new Date());             // ISO string da data atual\n */\nexport function castIso(input: unknown): DateIso | null {\n  // Já é string\n  if (typeof input === \"string\") {\n    const trimmed = input.trim();\n    const date = new Date(trimmed);\n    if (!isNaN(date.getTime())) {\n      return date.toISOString();\n    }\n    return null;\n  }\n\n  // Número (timestamp)\n  if (typeof input === \"number\") {\n    if (!Number.isFinite(input)) return null;\n    const date = new Date(input);\n    if (!isNaN(date.getTime())) {\n      return date.toISOString();\n    }\n    return null;\n  }\n\n  // Date object\n  if (input instanceof Date) {\n    if (isNaN(input.getTime())) return null;\n    return input.toISOString();\n  }\n\n  return null;\n}\n\n// =============================================================================\n// CAST TIMESTAMP\n// =============================================================================\n\n/**\n * Faz cast de input para timestamp (milissegundos)\n *\n * @example\n * castTimestamp('2024-12-05T19:30:00.000Z');  // 1733425800000\n * castTimestamp('1733425800000');             // 1733425800000\n * castTimestamp(new Date());                  // timestamp atual\n */\nexport function castTimestamp(input: unknown): DateTimestamp | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    if (!Number.isFinite(input)) return null;\n    return input;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const trimmed = input.trim();\n\n    // String numérica pura\n    if (/^-?\\d+$/.test(trimmed)) {\n      const num = parseInt(trimmed, 10);\n      if (Number.isFinite(num)) return num;\n    }\n\n    // Tenta parsear como ISO date\n    const date = new Date(trimmed);\n    if (!isNaN(date.getTime())) {\n      return date.getTime();\n    }\n\n    return null;\n  }\n\n  // Date object\n  if (input instanceof Date) {\n    const ts = input.getTime();\n    return isNaN(ts) ? null : ts;\n  }\n\n  return null;\n}\n\n// =============================================================================\n// CAST EPOCH\n// =============================================================================\n\n/**\n * Faz cast de input para epoch (segundos)\n *\n * Detecta automaticamente se o input é milissegundos (> 1e11) e converte.\n *\n * @example\n * castEpoch('2024-12-05T19:30:00.000Z');  // 1733425800\n * castEpoch(1733425800000);               // 1733425800 (detecta ms)\n * castEpoch(1733425800);                  // 1733425800\n * castEpoch(new Date());                  // epoch atual\n */\nexport function castEpoch(input: unknown): DateEpoch | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    if (!Number.isFinite(input)) return null;\n    // Se parece ser milissegundos (> 1e11), converte para segundos\n    if (Math.abs(input) > 1e11) {\n      return Math.floor(input / 1000);\n    }\n    return Math.floor(input);\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    const trimmed = input.trim();\n\n    // String numérica pura\n    if (/^-?\\d+$/.test(trimmed)) {\n      const num = parseInt(trimmed, 10);\n      if (Number.isFinite(num)) {\n        // Se parece ser milissegundos (> 1e11), converte para segundos\n        if (Math.abs(num) > 1e11) {\n          return Math.floor(num / 1000);\n        }\n        return num;\n      }\n    }\n\n    // Tenta parsear como ISO date e converter\n    const date = new Date(trimmed);\n    if (!isNaN(date.getTime())) {\n      return Math.floor(date.getTime() / 1000);\n    }\n\n    return null;\n  }\n\n  // Date object\n  if (input instanceof Date) {\n    const ts = input.getTime();\n    return isNaN(ts) ? null : Math.floor(ts / 1000);\n  }\n\n  return null;\n}\n\n// =============================================================================\n// MAIN CAST\n// =============================================================================\n\n/**\n * Faz cast de input para uma variante de data\n *\n * @param variant - Variante de destino (\"iso\", \"timestamp\", \"epoch\")\n * @param input - Valor de entrada\n * @returns Valor convertido ou null se não for possível\n *\n * @example\n * castDate('iso', '2024-12-05');      // '2024-12-05T00:00:00.000Z'\n * castDate('timestamp', new Date());  // timestamp atual\n * castDate('epoch', '2024-12-05');    // 1733356800\n */\nexport function castDate<T = unknown>(variant: DateVariant, input: unknown): T | null {\n  switch (variant) {\n    case \"iso\":\n      return castIso(input) as T | null;\n    case \"timestamp\":\n      return castTimestamp(input) as T | null;\n    case \"epoch\":\n      return castEpoch(input) as T | null;\n    default:\n      return null;\n  }\n}\n\n/**\n * Versão safe de castDate que retorna Result\n */\nexport function tryCastDate<T = unknown>(\n  variant: DateVariant,\n  input: unknown\n): Result<T> {\n  const result = castDate<T>(variant, input);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to date variant \"${variant}\"`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n/**\n * Detecta se um valor parece ser um timestamp em milissegundos ou segundos\n *\n * @returns \"timestamp\" se > 1e11, \"epoch\" caso contrário, null se não for número\n */\nexport function detectDateNumericVariant(value: unknown): \"timestamp\" | \"epoch\" | null {\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    return null;\n  }\n\n  // Timestamps em ms geralmente são > 1e12 (após ano 2001)\n  // Epochs em segundos são tipicamente < 1e11\n  return Math.abs(value) > 1e11 ? \"timestamp\" : \"epoch\";\n}\n","/**\n * Currency Role - Cast Pillar\n *\n * Normaliza input monetário sujo para número.\n * Extrai o valor numérico de strings formatadas como moeda.\n *\n * NÃO infere a moeda - apenas extrai o valor numérico.\n * A moeda deve ser conhecida via metadata.\n *\n * @example\n * import { castCurrency, castCurrencyStrict } from '@attrx/role-morphic/currency/cast';\n *\n * castCurrency('R$ 1.500,50');     // 1500.50\n * castCurrency('$1,000.00');       // 1000\n * castCurrency('€ 99,99');         // 99.99\n * castCurrency('1500');            // 1500\n * castCurrency(1500.50);           // 1500.50\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type Result<T> =\n  | { ok: true; value: T }\n  | { ok: false; error: string };\n\n// =============================================================================\n// CAST\n// =============================================================================\n\n/**\n * Faz cast de input monetário para número\n *\n * Suporta diversos formatos:\n * - Brasileiro: R$ 1.500,50\n * - Americano: $1,000.00\n * - Europeu: € 99,99 ou 99,99 €\n * - Sem símbolo: 1500.50 ou 1500,50\n *\n * @param input - Valor de entrada (number, string, etc)\n * @returns Número ou null se não puder converter\n *\n * @example\n * castCurrency('R$ 1.500,50');     // 1500.50\n * castCurrency('$1,000.00');       // 1000\n * castCurrency('€ 99,99');         // 99.99\n * castCurrency('1.500,50');        // 1500.50 (brasileiro)\n * castCurrency('1,500.50');        // 1500.50 (americano)\n * castCurrency('-R$ 50,00');       // -50\n * castCurrency('invalid');         // null\n */\nexport function castCurrency(input: unknown): number | null {\n  // Já é número\n  if (typeof input === \"number\") {\n    return Number.isFinite(input) ? input : null;\n  }\n\n  // String\n  if (typeof input === \"string\") {\n    return parseCurrencyString(input);\n  }\n\n  return null;\n}\n\n/**\n * Alias para castCurrency (currency não tem conversão, então strict é igual)\n */\nexport function castCurrencyStrict(input: unknown): number | null {\n  return castCurrency(input);\n}\n\n/**\n * Versão safe de castCurrency que retorna Result\n */\nexport function tryCastCurrency(input: unknown): Result<number> {\n  const result = castCurrency(input);\n  if (result === null) {\n    return {\n      ok: false,\n      error: `Cannot cast \"${String(input)}\" to currency value`,\n    };\n  }\n  return { ok: true, value: result };\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Símbolos de moeda conhecidos (para remoção no parse)\n */\nconst CURRENCY_SYMBOL_REGEX = /^[\\s]*([A-Z]{1,3}\\$?|[R$€£¥₹₩₽₺CHF]+)[\\s]*/i;\nconst CURRENCY_SYMBOL_SUFFIX_REGEX = /[\\s]*([€₽])[\\s]*$/;\n\n/**\n * Parseia string monetária para número\n */\nfunction parseCurrencyString(input: string): number | null {\n  let str = input.trim();\n\n  if (!str) {\n    return null;\n  }\n\n  // Detecta sinal negativo (pode estar antes do símbolo)\n  let isNegative = false;\n  if (str.startsWith(\"-\")) {\n    isNegative = true;\n    str = str.slice(1).trim();\n  } else if (str.startsWith(\"(\") && str.endsWith(\")\")) {\n    // Formato contábil: (1,000.00) = -1000\n    isNegative = true;\n    str = str.slice(1, -1).trim();\n  }\n\n  // Remove símbolo de moeda do início\n  str = str.replace(CURRENCY_SYMBOL_REGEX, \"\");\n\n  // Remove símbolo de moeda do final (ex: 100 €)\n  str = str.replace(CURRENCY_SYMBOL_SUFFIX_REGEX, \"\");\n\n  str = str.trim();\n\n  if (!str) {\n    return null;\n  }\n\n  // Parseia o número\n  const numValue = parseNumber(str);\n\n  if (numValue === null) {\n    return null;\n  }\n\n  return isNegative ? -numValue : numValue;\n}\n\n/**\n * Parseia string numérica considerando formatos brasileiro e americano\n *\n * Detecta automaticamente o formato baseado nos separadores:\n * - 1.000,50 → brasileiro → 1000.50\n * - 1,000.50 → americano → 1000.50\n * - 1.000 → ambíguo (assume milhar) → 1000\n * - 1,50 → brasileiro decimal → 1.50\n */\nfunction parseNumber(numStr: string): number | null {\n  // Remove espaços\n  numStr = numStr.replace(/\\s/g, \"\");\n\n  // Remove caracteres não numéricos exceto . , - +\n  if (!/^[+-]?[\\d.,]+$/.test(numStr)) {\n    return null;\n  }\n\n  const lastComma = numStr.lastIndexOf(\",\");\n  const lastDot = numStr.lastIndexOf(\".\");\n  const hasComma = lastComma !== -1;\n  const hasDot = lastDot !== -1;\n\n  if (hasComma && hasDot) {\n    if (lastComma > lastDot) {\n      // Brasileiro: 1.000,50 → vírgula é decimal\n      numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n    } else {\n      // Americano: 1,000.50 → ponto é decimal\n      numStr = numStr.replace(/,/g, \"\");\n    }\n  } else if (hasComma && !hasDot) {\n    // Só vírgulas: detecta se é milhar ou decimal\n    const parts = numStr.split(\",\");\n    const afterComma = parts.slice(1);\n\n    // Se tem múltiplas vírgulas OU parte após vírgula tem 3 dígitos = milhar\n    if (afterComma.length > 1 || (afterComma.length === 1 && afterComma[0].length === 3 && parts[0].length <= 3)) {\n      // Milhar brasileiro: 1,000,000 ou 1,000\n      numStr = numStr.replace(/,/g, \"\");\n    } else {\n      // Decimal brasileiro: 1,50\n      numStr = numStr.replace(\",\", \".\");\n    }\n  } else if (!hasComma && hasDot) {\n    // Só pontos\n    const parts = numStr.split(\".\");\n    const afterDot = parts.slice(1);\n\n    // Múltiplos pontos = milhar brasileiro: 1.000.000\n    if (afterDot.length > 1) {\n      numStr = numStr.replace(/\\./g, \"\");\n    } else if (afterDot.length === 1 && afterDot[0].length === 3) {\n      // Único ponto com exatamente 3 dígitos após = milhar (1.500 → 1500)\n      // Em contexto monetário, 1.500 é quase sempre milhar, não 1.5\n      numStr = numStr.replace(/\\./g, \"\");\n    }\n    // Outros casos: decimal americano (1.50, 1000.50)\n  }\n\n  const value = parseFloat(numStr);\n  return isNaN(value) ? null : value;\n}\n","/**\n * Area Role - Format Pillar\n *\n * Formata valores de área para apresentação.\n *\n * @example\n * import { formatArea } from '@attrx/role-morphic/area/format';\n *\n * formatArea('hectare', 2.5);                      // \"2.5 ha\"\n * formatArea('hectare', 2.5, { verbose: true });   // \"2.5 hectares\"\n * formatArea('hectare', 1000, { locale: 'pt-BR' }); // \"1.000 ha\"\n */\n\nimport { AREA_UNITS, type AreaUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AreaFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de área para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatArea('hectare', 2.5);                        // \"2.5 ha\"\n * formatArea('hectare', 2.5, { verbose: true });     // \"2.5 hectares\"\n * formatArea('hectare', 1, { verbose: true });       // \"1 hectare\"\n * formatArea('hectare', 1000, { locale: 'pt-BR' });  // \"1.000 ha\"\n * formatArea('hectare', 1500, { decimals: 0 });      // \"1500 ha\"\n */\nexport function formatArea(\n  variant: AreaUnit,\n  value: number,\n  options: AreaFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = AREA_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getAreaSymbol('hectare');  // \"ha\"\n * getAreaSymbol('acre');     // \"ac\"\n */\nexport function getAreaSymbol(variant: AreaUnit): string {\n  const unit = AREA_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getAreaName('hectare', 1);   // \"hectare\"\n * getAreaName('hectare', 2);   // \"hectares\"\n */\nexport function getAreaName(variant: AreaUnit, count: number = 1): string {\n  const unit = AREA_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown area variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Length Role - Format Pillar\n *\n * Formata valores de comprimento para apresentação.\n *\n * @example\n * import { formatLength } from '@attrx/role-morphic/length/format';\n *\n * formatLength('kilometer', 42.195);                      // \"42.2 km\"\n * formatLength('kilometer', 42.195, { verbose: true });   // \"42.2 kilometers\"\n * formatLength('meter', 1000, { locale: 'pt-BR' });       // \"1.000 m\"\n */\n\nimport { LENGTH_UNITS, type LengthUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface LengthFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de comprimento para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatLength('kilometer', 42.195);                        // \"42.2 km\"\n * formatLength('kilometer', 42.195, { verbose: true });     // \"42.2 kilometers\"\n * formatLength('kilometer', 1, { verbose: true });          // \"1 kilometer\"\n * formatLength('meter', 1000, { locale: 'pt-BR' });         // \"1.000 m\"\n * formatLength('meter', 1500, { decimals: 0 });             // \"1500 m\"\n */\nexport function formatLength(\n  variant: LengthUnit,\n  value: number,\n  options: LengthFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = LENGTH_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getLengthSymbol('kilometer');  // \"km\"\n * getLengthSymbol('mile');       // \"mi\"\n */\nexport function getLengthSymbol(variant: LengthUnit): string {\n  const unit = LENGTH_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getLengthName('kilometer', 1);   // \"kilometer\"\n * getLengthName('kilometer', 2);   // \"kilometers\"\n */\nexport function getLengthName(variant: LengthUnit, count: number = 1): string {\n  const unit = LENGTH_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown length variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Mass Role - Format Pillar\n *\n * Formata valores de massa para apresentação.\n *\n * @example\n * import { formatMass } from '@attrx/role-morphic/mass/format';\n *\n * formatMass('kilogram', 75.5);                      // \"75.5 kg\"\n * formatMass('kilogram', 75.5, { verbose: true });   // \"75.5 kilograms\"\n * formatMass('pound', 1000, { locale: 'en-US' });    // \"1,000 lb\"\n */\n\nimport { MASS_UNITS, type MassUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MassFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de massa para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatMass('kilogram', 75.5);                        // \"75.5 kg\"\n * formatMass('kilogram', 75.5, { verbose: true });     // \"75.5 kilograms\"\n * formatMass('kilogram', 1, { verbose: true });        // \"1 kilogram\"\n * formatMass('pound', 1000, { locale: 'en-US' });      // \"1,000 lb\"\n * formatMass('gram', 1500, { decimals: 0 });           // \"1500 g\"\n */\nexport function formatMass(\n  variant: MassUnit,\n  value: number,\n  options: MassFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = MASS_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getMassSymbol('kilogram');  // \"kg\"\n * getMassSymbol('pound');     // \"lb\"\n */\nexport function getMassSymbol(variant: MassUnit): string {\n  const unit = MASS_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getMassName('kilogram', 1);   // \"kilogram\"\n * getMassName('kilogram', 2);   // \"kilograms\"\n */\nexport function getMassName(variant: MassUnit, count: number = 1): string {\n  const unit = MASS_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown mass variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Temperature Role - Format Pillar\n *\n * Formata valores de temperatura para apresentação.\n *\n * @example\n * import { formatTemperature } from '@attrx/role-morphic/temperature/format';\n *\n * formatTemperature('celsius', 37);                        // \"37°C\"\n * formatTemperature('fahrenheit', 98.6, { verbose: true }); // \"98.6 degrees Fahrenheit\"\n * formatTemperature('kelvin', 273.15);                     // \"273.15 K\"\n */\n\nimport { TEMPERATURE_UNITS, type TemperatureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TemperatureFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de temperatura para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatTemperature('celsius', 37);                          // \"37°C\"\n * formatTemperature('fahrenheit', 98.6);                     // \"98.6°F\"\n * formatTemperature('kelvin', 273.15);                       // \"273.15 K\"\n * formatTemperature('celsius', 37, { verbose: true });       // \"37 degrees Celsius\"\n * formatTemperature('celsius', 1000, { locale: 'pt-BR' });   // \"1.000°C\"\n */\nexport function formatTemperature(\n  variant: TemperatureUnit,\n  value: number,\n  options: TemperatureFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = TEMPERATURE_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  // Nota: °C, °F, °R não têm espaço (noSpace: true), mas K tem espaço\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getTemperatureSymbol('celsius');     // \"°C\"\n * getTemperatureSymbol('fahrenheit');  // \"°F\"\n * getTemperatureSymbol('kelvin');      // \"K\"\n */\nexport function getTemperatureSymbol(variant: TemperatureUnit): string {\n  const unit = TEMPERATURE_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getTemperatureName('celsius', 1);   // \"degree Celsius\"\n * getTemperatureName('celsius', 2);   // \"degrees Celsius\"\n * getTemperatureName('kelvin', 1);    // \"kelvin\"\n * getTemperatureName('kelvin', 2);    // \"kelvins\"\n */\nexport function getTemperatureName(variant: TemperatureUnit, count: number = 1): string {\n  const unit = TEMPERATURE_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown temperature variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Volume Role - Format Pillar\n *\n * Formata valores de volume para apresentação.\n *\n * @example\n * import { formatVolume } from '@attrx/role-morphic/volume/format';\n *\n * formatVolume('liter', 2.5);                      // \"2.5 L\"\n * formatVolume('liter', 2.5, { verbose: true });   // \"2.5 liters\"\n * formatVolume('milliliter', 1000, { locale: 'pt-BR' }); // \"1.000 mL\"\n */\n\nimport { VOLUME_UNITS, type VolumeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface VolumeFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de volume para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatVolume('liter', 2.5);                        // \"2.5 L\"\n * formatVolume('liter', 2.5, { verbose: true });     // \"2.5 liters\"\n * formatVolume('liter', 1, { verbose: true });       // \"1 liter\"\n * formatVolume('milliliter', 1000, { locale: 'pt-BR' }); // \"1.000 mL\"\n * formatVolume('gallon_us', 5, { decimals: 0 });     // \"5 gal\"\n */\nexport function formatVolume(\n  variant: VolumeUnit,\n  value: number,\n  options: VolumeFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = VOLUME_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getVolumeSymbol('liter');       // \"L\"\n * getVolumeSymbol('gallon_us');   // \"gal\"\n * getVolumeSymbol('milliliter');  // \"mL\"\n */\nexport function getVolumeSymbol(variant: VolumeUnit): string {\n  const unit = VOLUME_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getVolumeName('liter', 1);       // \"liter\"\n * getVolumeName('liter', 2);       // \"liters\"\n * getVolumeName('gallon_us', 1);   // \"gallon\"\n */\nexport function getVolumeName(variant: VolumeUnit, count: number = 1): string {\n  const unit = VOLUME_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown volume variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Speed Role - Format Pillar\n *\n * Formata valores de velocidade para apresentação.\n *\n * @example\n * import { formatSpeed } from '@attrx/role-morphic/speed/format';\n *\n * formatSpeed('kilometer_per_hour', 120);                        // \"120 km/h\"\n * formatSpeed('kilometer_per_hour', 120, { verbose: true });     // \"120 kilometers per hour\"\n * formatSpeed('mile_per_hour', 60);                              // \"60 mph\"\n */\n\nimport { SPEED_UNITS, type SpeedUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface SpeedFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de velocidade para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatSpeed('kilometer_per_hour', 120);                        // \"120 km/h\"\n * formatSpeed('kilometer_per_hour', 120, { verbose: true });     // \"120 kilometers per hour\"\n * formatSpeed('kilometer_per_hour', 1, { verbose: true });       // \"1 kilometer per hour\"\n * formatSpeed('mile_per_hour', 1000, { locale: 'en-US' });       // \"1,000 mph\"\n */\nexport function formatSpeed(\n  variant: SpeedUnit,\n  value: number,\n  options: SpeedFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = SPEED_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getSpeedSymbol('kilometer_per_hour');  // \"km/h\"\n * getSpeedSymbol('mile_per_hour');       // \"mph\"\n * getSpeedSymbol('knot');                // \"kn\"\n */\nexport function getSpeedSymbol(variant: SpeedUnit): string {\n  const unit = SPEED_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getSpeedName('kilometer_per_hour', 1);   // \"kilometer per hour\"\n * getSpeedName('kilometer_per_hour', 2);   // \"kilometers per hour\"\n * getSpeedName('knot', 1);                 // \"knot\"\n */\nexport function getSpeedName(variant: SpeedUnit, count: number = 1): string {\n  const unit = SPEED_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown speed variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Energy Role - Format Pillar\n *\n * Formata valores de energia para apresentação.\n *\n * @example\n * import { formatEnergy } from '@attrx/role-morphic/energy/format';\n *\n * formatEnergy('kilowatt_hour', 2.5);                      // \"2.5 kWh\"\n * formatEnergy('kilowatt_hour', 2.5, { verbose: true });   // \"2.5 kilowatt-hours\"\n * formatEnergy('joule', 1000, { locale: 'pt-BR' });        // \"1.000 J\"\n */\n\nimport { ENERGY_UNITS, type EnergyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EnergyFormatOptions {\n  /** Casas decimais (default: 2) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação de número */\n  locale?: string;\n  /** Notação numérica */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de energia para apresentação\n *\n * @param variant - Unidade do valor\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatEnergy('kilowatt_hour', 2.5);                        // \"2.5 kWh\"\n * formatEnergy('kilowatt_hour', 2.5, { verbose: true });     // \"2.5 kilowatt-hours\"\n * formatEnergy('kilowatt_hour', 1, { verbose: true });       // \"1 kilowatt-hour\"\n * formatEnergy('joule', 1000, { locale: 'pt-BR' });          // \"1.000 J\"\n * formatEnergy('kilocalorie', 1500, { decimals: 0 });        // \"1500 kcal\"\n */\nexport function formatEnergy(\n  variant: EnergyUnit,\n  value: number,\n  options: EnergyFormatOptions = {}\n): string {\n  const { decimals = 2, verbose = false, locale, notation } = options;\n  const unit = ENERGY_UNITS[variant];\n\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n\n  // Formata número\n  let formattedValue: string;\n\n  if (locale) {\n    const formatOptions: Intl.NumberFormatOptions = {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: decimals,\n    };\n\n    if (notation) {\n      formatOptions.notation = notation;\n    }\n\n    formattedValue = value.toLocaleString(locale, formatOptions);\n  } else {\n    formattedValue = Number(value.toFixed(decimals)).toString();\n  }\n\n  // Escolhe símbolo ou nome\n  const separator = unit.noSpace ? \"\" : \" \";\n\n  if (verbose) {\n    const name = value === 1 ? unit.singular : unit.plural;\n    return `${formattedValue} ${name || unit.symbol}`;\n  }\n\n  return `${formattedValue}${separator}${unit.symbol}`;\n}\n\n/**\n * Retorna apenas o símbolo da unidade\n *\n * @example\n * getEnergySymbol('kilowatt_hour');  // \"kWh\"\n * getEnergySymbol('kilocalorie');    // \"kcal\"\n */\nexport function getEnergySymbol(variant: EnergyUnit): string {\n  const unit = ENERGY_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n  return unit.symbol;\n}\n\n/**\n * Retorna o nome da unidade (singular ou plural)\n *\n * @example\n * getEnergyName('kilowatt_hour', 1);   // \"kilowatt-hour\"\n * getEnergyName('kilowatt_hour', 2);   // \"kilowatt-hours\"\n */\nexport function getEnergyName(variant: EnergyUnit, count: number = 1): string {\n  const unit = ENERGY_UNITS[variant];\n  if (!unit) {\n    throw new Error(`Unknown energy variant: ${variant}`);\n  }\n  return count === 1\n    ? (unit.singular || unit.symbol)\n    : (unit.plural || unit.symbol);\n}\n","/**\n * Power Role - Format Pillar\n *\n * Formatação de valores de potência para exibição.\n *\n * @example\n * import { formatPower, getPowerSymbol, getPowerName } from '@attrx/role-morphic/power/format';\n *\n * formatPower('kilowatt', 2.5);                     // \"2.5 kW\"\n * formatPower('kilowatt', 2.5, { verbose: true });  // \"2.5 kilowatts\"\n * getPowerSymbol('kilowatt');                       // \"kW\"\n * getPowerName('kilowatt', 2);                      // \"kilowatts\"\n */\n\nimport { POWER_UNITS, type PowerUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PowerFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de potência para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatPower('kilowatt', 2.5);                     // \"2.5 kW\"\n * formatPower('kilowatt', 2.5, { verbose: true });  // \"2.5 kilowatts\"\n * formatPower('kilowatt', 1, { verbose: true });    // \"1 kilowatt\"\n * formatPower('watt', 1000, { decimals: 0 });       // \"1000 W\"\n */\nexport function formatPower(\n  variant: PowerUnit,\n  value: number,\n  options: PowerFormatOptions = {},\n): string {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getPowerSymbol('kilowatt');              // \"kW\"\n * getPowerSymbol('horsepower_mechanical'); // \"hp\"\n */\nexport function getPowerSymbol(variant: PowerUnit): string {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getPowerName('kilowatt', 1);  // \"kilowatt\"\n * getPowerName('kilowatt', 2);  // \"kilowatts\"\n */\nexport function getPowerName(variant: PowerUnit, count: number = 1): string {\n  const config = POWER_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown power unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Pressure Role - Format Pillar\n *\n * Formatação de valores de pressão para exibição.\n *\n * @example\n * import { formatPressure, getPressureSymbol, getPressureName } from '@attrx/role-morphic/pressure/format';\n *\n * formatPressure('bar', 2.5);                     // \"2.5 bar\"\n * formatPressure('bar', 2.5, { verbose: true });  // \"2.5 bar\"\n * getPressureSymbol('pascal');                    // \"Pa\"\n * getPressureName('atmosphere', 2);               // \"atmospheres\"\n */\n\nimport { PRESSURE_UNITS, type PressureUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface PressureFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de pressão para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatPressure('bar', 2.5);                     // \"2.5 bar\"\n * formatPressure('bar', 2.5, { verbose: true });  // \"2.5 bar\"\n * formatPressure('atmosphere', 1, { verbose: true }); // \"1 atmosphere\"\n * formatPressure('pascal', 1000, { decimals: 0 }); // \"1000 Pa\"\n */\nexport function formatPressure(\n  variant: PressureUnit,\n  value: number,\n  options: PressureFormatOptions = {},\n): string {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getPressureSymbol('bar');        // \"bar\"\n * getPressureSymbol('atmosphere'); // \"atm\"\n */\nexport function getPressureSymbol(variant: PressureUnit): string {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getPressureName('atmosphere', 1);  // \"atmosphere\"\n * getPressureName('atmosphere', 2);  // \"atmospheres\"\n */\nexport function getPressureName(variant: PressureUnit, count: number = 1): string {\n  const config = PRESSURE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown pressure unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Frequency Role - Format Pillar\n *\n * Formatação de valores de frequência para exibição.\n *\n * @example\n * import { formatFrequency, getFrequencySymbol, getFrequencyName } from '@attrx/role-morphic/frequency/format';\n *\n * formatFrequency('gigahertz', 2.4);                     // \"2.4 GHz\"\n * formatFrequency('gigahertz', 2.4, { verbose: true });  // \"2.4 gigahertz\"\n * getFrequencySymbol('megahertz');                       // \"MHz\"\n * getFrequencyName('hertz', 2);                          // \"hertz\"\n */\n\nimport { FREQUENCY_UNITS, type FrequencyUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FrequencyFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de frequência para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatFrequency('gigahertz', 2.4);                     // \"2.4 GHz\"\n * formatFrequency('gigahertz', 2.4, { verbose: true });  // \"2.4 gigahertz\"\n * formatFrequency('hertz', 1, { verbose: true });        // \"1 hertz\"\n * formatFrequency('megahertz', 100, { decimals: 0 });    // \"100 MHz\"\n */\nexport function formatFrequency(\n  variant: FrequencyUnit,\n  value: number,\n  options: FrequencyFormatOptions = {},\n): string {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getFrequencySymbol('megahertz');  // \"MHz\"\n * getFrequencySymbol('rpm');        // \"rpm\"\n */\nexport function getFrequencySymbol(variant: FrequencyUnit): string {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getFrequencyName('hertz', 1);  // \"hertz\"\n * getFrequencyName('hertz', 2);  // \"hertz\"\n * getFrequencyName('rpm', 2);    // \"revolutions per minute\"\n */\nexport function getFrequencyName(variant: FrequencyUnit, count: number = 1): string {\n  const config = FREQUENCY_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown frequency unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Angle Role - Format Pillar\n *\n * Formatação de valores de ângulo para exibição.\n *\n * @example\n * import { formatAngle, getAngleSymbol, getAngleName } from '@attrx/role-morphic/angle/format';\n *\n * formatAngle('degree', 45);                     // \"45°\"\n * formatAngle('degree', 45, { verbose: true });  // \"45 degrees\"\n * getAngleSymbol('degree');                      // \"°\"\n * getAngleName('degree', 2);                     // \"degrees\"\n */\n\nimport { ANGLE_UNITS, type AngleUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AngleFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de ângulo para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatAngle('degree', 45);                     // \"45°\"\n * formatAngle('degree', 45, { verbose: true });  // \"45 degrees\"\n * formatAngle('radian', 3.14159);                // \"3.14159 rad\"\n * formatAngle('degree', 90, { decimals: 0 });    // \"90°\"\n */\nexport function formatAngle(\n  variant: AngleUnit,\n  value: number,\n  options: AngleFormatOptions = {},\n): string {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  // Some angle units don't use space (e.g., 45° not 45 °)\n  const separator = config.noSpace && !verbose ? \"\" : \" \";\n\n  return `${formattedNumber}${separator}${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getAngleSymbol('degree');  // \"°\"\n * getAngleSymbol('radian');  // \"rad\"\n */\nexport function getAngleSymbol(variant: AngleUnit): string {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getAngleName('degree', 1);  // \"degree\"\n * getAngleName('degree', 2);  // \"degrees\"\n */\nexport function getAngleName(variant: AngleUnit, count: number = 1): string {\n  const config = ANGLE_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown angle unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Time Role - Format Pillar\n *\n * Formatação de valores de tempo para exibição.\n *\n * @example\n * import { formatTime, getTimeSymbol, getTimeName } from '@attrx/role-morphic/time/format';\n *\n * formatTime('hour', 2.5);                     // \"2.5 h\"\n * formatTime('hour', 2.5, { verbose: true });  // \"2.5 hours\"\n * getTimeSymbol('minute');                     // \"min\"\n * getTimeName('hour', 2);                      // \"hours\"\n */\n\nimport { TIME_UNITS, type TimeUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TimeFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de tempo para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatTime('hour', 2.5);                     // \"2.5 h\"\n * formatTime('hour', 2.5, { verbose: true });  // \"2.5 hours\"\n * formatTime('second', 1, { verbose: true });  // \"1 second\"\n * formatTime('millisecond', 100, { decimals: 0 }); // \"100 ms\"\n */\nexport function formatTime(\n  variant: TimeUnit,\n  value: number,\n  options: TimeFormatOptions = {},\n): string {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getTimeSymbol('minute');  // \"min\"\n * getTimeSymbol('hour');    // \"h\"\n */\nexport function getTimeSymbol(variant: TimeUnit): string {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getTimeName('hour', 1);  // \"hour\"\n * getTimeName('hour', 2);  // \"hours\"\n */\nexport function getTimeName(variant: TimeUnit, count: number = 1): string {\n  const config = TIME_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown time unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Digital Role - Format Pillar\n *\n * Formatação de valores de armazenamento digital para exibição.\n *\n * @example\n * import { formatDigital, getDigitalSymbol, getDigitalName } from '@attrx/role-morphic/digital/format';\n *\n * formatDigital('gigabyte', 2.5);                     // \"2.5 GB\"\n * formatDigital('gigabyte', 2.5, { verbose: true });  // \"2.5 gigabytes\"\n * getDigitalSymbol('mebibyte');                       // \"MiB\"\n * getDigitalName('byte', 2);                          // \"bytes\"\n */\n\nimport { DIGITAL_UNITS, type DigitalUnit } from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DigitalFormatOptions {\n  /** Número de casas decimais */\n  decimals?: number;\n  /** Usar nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Locale para formatação numérica */\n  locale?: string;\n  /** Notação: standard, scientific, compact */\n  notation?: \"standard\" | \"scientific\" | \"compact\";\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor de armazenamento digital para exibição\n *\n * @param variant - Unidade\n * @param value - Valor numérico\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatDigital('gigabyte', 2.5);                     // \"2.5 GB\"\n * formatDigital('gigabyte', 2.5, { verbose: true });  // \"2.5 gigabytes\"\n * formatDigital('byte', 1, { verbose: true });        // \"1 byte\"\n * formatDigital('mebibyte', 100, { decimals: 0 });    // \"100 MiB\"\n */\nexport function formatDigital(\n  variant: DigitalUnit,\n  value: number,\n  options: DigitalFormatOptions = {},\n): string {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n\n  const { decimals, verbose = false, locale, notation = \"standard\" } = options;\n\n  // Format number\n  let formattedNumber: string;\n\n  if (locale || notation !== \"standard\") {\n    const intlOptions: Intl.NumberFormatOptions = { notation };\n    if (decimals !== undefined) {\n      intlOptions.minimumFractionDigits = decimals;\n      intlOptions.maximumFractionDigits = decimals;\n    }\n    formattedNumber = new Intl.NumberFormat(locale, intlOptions).format(value);\n  } else if (decimals !== undefined) {\n    formattedNumber = value.toFixed(decimals);\n  } else {\n    // Smart formatting: remove trailing zeros\n    formattedNumber = Number(value.toPrecision(12)).toString();\n  }\n\n  // Get unit label\n  const unitLabel = verbose\n    ? value === 1\n      ? config.singular\n      : config.plural\n    : config.symbol;\n\n  return `${formattedNumber} ${unitLabel}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna o símbolo de uma unidade\n *\n * @example\n * getDigitalSymbol('megabyte');  // \"MB\"\n * getDigitalSymbol('mebibyte');  // \"MiB\"\n */\nexport function getDigitalSymbol(variant: DigitalUnit): string {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome de uma unidade (singular ou plural)\n *\n * @param variant - Unidade\n * @param count - Quantidade para determinar singular/plural (default: 1)\n *\n * @example\n * getDigitalName('byte', 1);  // \"byte\"\n * getDigitalName('byte', 2);  // \"bytes\"\n */\nexport function getDigitalName(variant: DigitalUnit, count: number = 1): string {\n  const config = DIGITAL_UNITS[variant];\n  if (!config) {\n    throw new Error(`Unknown digital unit: ${variant}`);\n  }\n  return count === 1 ? (config.singular || config.symbol) : (config.plural || config.symbol);\n}\n","/**\n * Color Role - Format Pillar\n *\n * Formatação de cores para apresentação.\n *\n * @example\n * import { formatColor } from '@attrx/role-morphic/color/format';\n *\n * formatColor('hex', '#ff0000', { uppercase: true }); // '#FF0000'\n * formatColor('rgb_string', { r: 255, g: 0, b: 0 });  // 'rgb(255, 0, 0)'\n */\n\nimport type { ColorVariant, RGBA, ColorRgbObject, ColorHslObject, ColorFormatOptions } from \"./types\";\nimport { rgbToHsl } from \"./types\";\nimport { toBaseColor } from \"./convert\";\n\n// =============================================================================\n// FORMAT OPTIONS DEFAULTS\n// =============================================================================\n\nconst DEFAULT_OPTIONS: ColorFormatOptions = {\n  uppercase: false,\n  includeAlpha: false,\n  compact: false,\n};\n\n// =============================================================================\n// FORMAT BY VARIANT\n// =============================================================================\n\n/**\n * Formata RGBA como hex\n */\nfunction formatAsHex(rgba: RGBA, options: ColorFormatOptions): string {\n  const r = rgba.r.toString(16).padStart(2, \"0\");\n  const g = rgba.g.toString(16).padStart(2, \"0\");\n  const b = rgba.b.toString(16).padStart(2, \"0\");\n\n  let hex: string;\n\n  if (options.includeAlpha || rgba.a < 1) {\n    const a = Math.round(rgba.a * 255)\n      .toString(16)\n      .padStart(2, \"0\");\n    hex = `#${r}${g}${b}${a}`;\n  } else {\n    hex = `#${r}${g}${b}`;\n  }\n\n  // Compact: try to use shorthand if possible\n  if (options.compact && !options.includeAlpha && rgba.a === 1) {\n    if (r[0] === r[1] && g[0] === g[1] && b[0] === b[1]) {\n      hex = `#${r[0]}${g[0]}${b[0]}`;\n    }\n  }\n\n  return options.uppercase ? hex.toUpperCase() : hex.toLowerCase();\n}\n\n/**\n * Formata RGBA como RGB string\n */\nfunction formatAsRgbString(rgba: RGBA, options: ColorFormatOptions): string {\n  if (options.includeAlpha || rgba.a < 1) {\n    if (options.compact) {\n      return `rgba(${rgba.r},${rgba.g},${rgba.b},${rgba.a})`;\n    }\n    return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n  }\n\n  if (options.compact) {\n    return `rgb(${rgba.r},${rgba.g},${rgba.b})`;\n  }\n  return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n}\n\n/**\n * Formata RGBA como HSL string\n */\nfunction formatAsHslString(rgba: RGBA, options: ColorFormatOptions): string {\n  const { h, s, l } = rgbToHsl(rgba.r, rgba.g, rgba.b);\n\n  if (options.includeAlpha || rgba.a < 1) {\n    if (options.compact) {\n      return `hsla(${h},${s}%,${l}%,${rgba.a})`;\n    }\n    return `hsla(${h}, ${s}%, ${l}%, ${rgba.a})`;\n  }\n\n  if (options.compact) {\n    return `hsl(${h},${s}%,${l}%)`;\n  }\n  return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\n/**\n * Formata RGBA como RGB object (formato CSS rgb())\n * Nota: rgb_object format usa a mesma representação de rgb_string\n */\nfunction formatAsRgbObject(rgba: RGBA, options: ColorFormatOptions): string {\n  // rgb_object format outputs RGB string representation (same as rgb_string)\n  return formatAsRgbString(rgba, options);\n}\n\n/**\n * Formata RGBA como HSL object (formato CSS hsl())\n * Nota: hsl_object format usa a mesma representação de hsl_string\n */\nfunction formatAsHslObject(rgba: RGBA, options: ColorFormatOptions): string {\n  // hsl_object format outputs HSL string representation (same as hsl_string)\n  return formatAsHslString(rgba, options);\n}\n\n// =============================================================================\n// MAIN FORMAT\n// =============================================================================\n\n/**\n * Formata cor para apresentação\n *\n * @param variant - Variante de saída\n * @param value - Valor da cor (qualquer variante)\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatColor('hex', '#ff0000', { uppercase: true });\n * // '#FF0000'\n *\n * formatColor('rgb_string', { r: 255, g: 0, b: 0 });\n * // 'rgb(255, 0, 0)'\n *\n * formatColor('hex', '#ff0000', { compact: true });\n * // '#f00'\n */\nexport function formatColor(\n  variant: ColorVariant,\n  value: unknown,\n  options?: ColorFormatOptions,\n): string {\n  const opts = { ...DEFAULT_OPTIONS, ...options };\n\n  // Primeiro converte para RGBA (base)\n  let rgba: RGBA;\n\n  // Se o value já é um objeto com r,g,b,a, usa direto\n  if (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"r\" in value &&\n    \"g\" in value &&\n    \"b\" in value\n  ) {\n    const obj = value as ColorRgbObject;\n    rgba = {\n      r: obj.r,\n      g: obj.g,\n      b: obj.b,\n      a: obj.a ?? 1,\n    };\n  } else if (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"h\" in value &&\n    \"s\" in value &&\n    \"l\" in value\n  ) {\n    // HSL object - converte para RGBA\n    rgba = toBaseColor(\"hsl_object\", value);\n  } else if (typeof value === \"string\") {\n    // String - detecta formato e converte\n    rgba = toBaseColor(detectStringVariant(value), value);\n  } else {\n    throw new Error(`Cannot format color: ${String(value)}`);\n  }\n\n  // Formata na variante de saída\n  switch (variant) {\n    case \"hex\":\n      return formatAsHex(rgba, opts);\n    case \"rgb_string\":\n      return formatAsRgbString(rgba, opts);\n    case \"hsl_string\":\n      return formatAsHslString(rgba, opts);\n    case \"rgb_object\":\n      return formatAsRgbObject(rgba, opts);\n    case \"hsl_object\":\n      return formatAsHslObject(rgba, opts);\n    default:\n      throw new Error(`Unknown color variant: ${variant}`);\n  }\n}\n\n/**\n * Detecta variante de uma string\n */\nfunction detectStringVariant(value: string): ColorVariant {\n  const trimmed = value.trim().toLowerCase();\n\n  if (/^#?[0-9a-f]{3,8}$/i.test(trimmed)) {\n    return \"hex\";\n  }\n  if (/^rgba?\\s*\\(/i.test(trimmed)) {\n    return \"rgb_string\";\n  }\n  if (/^hsla?\\s*\\(/i.test(trimmed)) {\n    return \"hsl_string\";\n  }\n\n  // Default to hex\n  return \"hex\";\n}\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\n/**\n * Formata como hex\n */\nexport function formatHex(value: unknown, options?: ColorFormatOptions): string {\n  return formatColor(\"hex\", value, options);\n}\n\n/**\n * Formata como RGB string\n */\nexport function formatRgbString(value: unknown, options?: ColorFormatOptions): string {\n  return formatColor(\"rgb_string\", value, options);\n}\n\n/**\n * Formata como HSL string\n */\nexport function formatHslString(value: unknown, options?: ColorFormatOptions): string {\n  return formatColor(\"hsl_string\", value, options);\n}\n","/**\n * Date Role - Format Pillar\n *\n * Formatação de datas para apresentação.\n *\n * @example\n * import { formatDate, formatIso, formatTimestamp } from '@attrx/role-morphic/date/format';\n *\n * formatDate('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // \"quinta-feira, 5 de dezembro de 2024\"\n */\n\nimport type { DateVariant, DateIso, DateTimestamp, DateEpoch, DateFormatOptions } from \"./types\";\n\n// =============================================================================\n// FORMAT ISO\n// =============================================================================\n\n/**\n * Formata ISO string para apresentação\n *\n * @example\n * formatIso('2024-12-05T19:30:00.000Z');\n * // '2024-12-05T19:30:00.000Z'\n *\n * formatIso('2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // 'quinta-feira, 5 de dezembro de 2024'\n */\nexport function formatIso(value: DateIso, options?: DateFormatOptions): string {\n  const date = new Date(value);\n\n  if (isNaN(date.getTime())) {\n    return \"Invalid Date\";\n  }\n\n  // Se não especificar opções de formatação, retorna o ISO string original\n  if (\n    !options ||\n    (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n  ) {\n    return value;\n  }\n\n  return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// FORMAT TIMESTAMP\n// =============================================================================\n\n/**\n * Formata timestamp (ms) para apresentação\n *\n * @example\n * formatTimestamp(1733425800000);\n * // '1733425800000'\n *\n * formatTimestamp(1733425800000, { dateStyle: 'medium', locale: 'en-US' });\n * // 'Dec 5, 2024'\n */\nexport function formatTimestamp(value: DateTimestamp, options?: DateFormatOptions): string {\n  const date = new Date(value);\n\n  if (isNaN(date.getTime())) {\n    return \"Invalid Date\";\n  }\n\n  // Se não especificar opções, retorna o timestamp como string\n  if (\n    !options ||\n    (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n  ) {\n    return String(value);\n  }\n\n  return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// FORMAT EPOCH\n// =============================================================================\n\n/**\n * Formata epoch (segundos) para apresentação\n *\n * @example\n * formatEpoch(1733425800);\n * // '1733425800'\n *\n * formatEpoch(1733425800, { dateStyle: 'short', timeStyle: 'short' });\n * // '12/5/24, 7:30 PM'\n */\nexport function formatEpoch(value: DateEpoch, options?: DateFormatOptions): string {\n  const date = new Date(value * 1000);\n\n  if (isNaN(date.getTime())) {\n    return \"Invalid Date\";\n  }\n\n  // Se não especificar opções, retorna o epoch como string\n  if (\n    !options ||\n    (!options.dateStyle && !options.timeStyle && !options.dateOnly && !options.timeOnly)\n  ) {\n    return String(value);\n  }\n\n  return formatWithIntl(date, options);\n}\n\n// =============================================================================\n// MAIN FORMAT\n// =============================================================================\n\n/**\n * Formata data para apresentação\n *\n * @param variant - Variante da data (\"iso\", \"timestamp\", \"epoch\")\n * @param value - Valor da data\n * @param options - Opções de formatação\n * @returns String formatada\n *\n * @example\n * formatDate('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' });\n * // 'quinta-feira, 5 de dezembro de 2024'\n *\n * formatDate('timestamp', 1733425800000, { dateOnly: true, dateStyle: 'medium' });\n * // 'Dec 5, 2024'\n */\nexport function formatDate(\n  variant: DateVariant,\n  value: unknown,\n  options?: DateFormatOptions\n): string {\n  switch (variant) {\n    case \"iso\":\n      return formatIso(value as DateIso, options);\n    case \"timestamp\":\n      return formatTimestamp(value as DateTimestamp, options);\n    case \"epoch\":\n      return formatEpoch(value as DateEpoch, options);\n    default:\n      return \"Invalid Date\";\n  }\n}\n\n// =============================================================================\n// INTERNAL HELPERS\n// =============================================================================\n\n/**\n * Formata Date usando Intl.DateTimeFormat\n */\nfunction formatWithIntl(date: Date, options: DateFormatOptions): string {\n  const locale = options.locale || \"en-US\";\n  const formatOptions: Intl.DateTimeFormatOptions = {};\n\n  if (options.timeZone) {\n    formatOptions.timeZone = options.timeZone;\n  }\n\n  if (options.dateOnly) {\n    formatOptions.dateStyle = options.dateStyle || \"medium\";\n  } else if (options.timeOnly) {\n    formatOptions.timeStyle = options.timeStyle || \"medium\";\n  } else {\n    if (options.dateStyle) formatOptions.dateStyle = options.dateStyle;\n    if (options.timeStyle) formatOptions.timeStyle = options.timeStyle;\n  }\n\n  return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n}\n\n// =============================================================================\n// RELATIVE TIME HELPERS\n// =============================================================================\n\n/**\n * Formata diferença de tempo relativa (ex: \"2 hours ago\", \"in 3 days\")\n *\n * @param timestamp - Timestamp em milissegundos\n * @param options - Opções de formatação\n *\n * @example\n * formatRelative(Date.now() - 3600000, { locale: 'en-US' });\n * // '1 hour ago'\n */\nexport function formatRelative(\n  timestamp: DateTimestamp,\n  options?: { locale?: string; now?: DateTimestamp }\n): string {\n  const locale = options?.locale || \"en-US\";\n  const now = options?.now || Date.now();\n  const diff = timestamp - now;\n  const absDiff = Math.abs(diff);\n\n  // Escolhe a unidade apropriada\n  let value: number;\n  let unit: Intl.RelativeTimeFormatUnit;\n\n  if (absDiff < 60000) {\n    // < 1 minuto\n    value = Math.round(diff / 1000);\n    unit = \"second\";\n  } else if (absDiff < 3600000) {\n    // < 1 hora\n    value = Math.round(diff / 60000);\n    unit = \"minute\";\n  } else if (absDiff < 86400000) {\n    // < 1 dia\n    value = Math.round(diff / 3600000);\n    unit = \"hour\";\n  } else if (absDiff < 2592000000) {\n    // < 30 dias\n    value = Math.round(diff / 86400000);\n    unit = \"day\";\n  } else if (absDiff < 31536000000) {\n    // < 1 ano\n    value = Math.round(diff / 2592000000);\n    unit = \"month\";\n  } else {\n    value = Math.round(diff / 31536000000);\n    unit = \"year\";\n  }\n\n  const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n  return rtf.format(value, unit);\n}\n","/**\n * Currency Role - Constants\n *\n * Códigos de moeda, símbolos e configurações de formatação.\n *\n * Currency é sobre VALOR MONETÁRIO, não sobre tipos de moeda.\n * O código da moeda (BRL, USD, etc) é METADATA usado apenas para formatação.\n *\n * NÃO há conversão entre moedas - isso é operação de negócio com taxas externas.\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Códigos de moeda ISO 4217\n */\nexport type CurrencyCode =\n  // Major currencies\n  | \"USD\"\n  | \"EUR\"\n  | \"GBP\"\n  | \"JPY\"\n  | \"CHF\"\n  | \"CNY\"\n  | \"CAD\"\n  | \"AUD\"\n  // Latin America\n  | \"BRL\"\n  | \"MXN\"\n  | \"ARS\"\n  | \"CLP\"\n  | \"COP\"\n  // Other important\n  | \"INR\"\n  | \"KRW\"\n  | \"RUB\"\n  | \"TRY\"\n  | \"ZAR\";\n\n/**\n * Configuração de uma moeda para formatação\n */\nexport interface CurrencyConfig {\n  /** Código ISO 4217 */\n  code: CurrencyCode;\n  /** Símbolo da moeda */\n  symbol: string;\n  /** Nome singular */\n  singular: string;\n  /** Nome plural */\n  plural: string;\n  /** Casas decimais padrão */\n  decimals: number;\n  /** Símbolo vem antes do valor? */\n  symbolFirst: boolean;\n  /** Separador de milhares */\n  thousandsSeparator: string;\n  /** Separador decimal */\n  decimalSeparator: string;\n}\n\n// =============================================================================\n// CURRENCY CONFIGS\n// =============================================================================\n\n/**\n * Configuração de cada moeda para formatação\n */\nexport const CURRENCY_CONFIGS: Record<CurrencyCode, CurrencyConfig> = {\n  // ===========================================================================\n  // Major Currencies\n  // ===========================================================================\n  USD: {\n    code: \"USD\",\n    symbol: \"$\",\n    singular: \"US dollar\",\n    plural: \"US dollars\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  EUR: {\n    code: \"EUR\",\n    symbol: \"€\",\n    singular: \"euro\",\n    plural: \"euros\",\n    decimals: 2,\n    symbolFirst: false, // 100 € (europeu) ou €100 (varia)\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  GBP: {\n    code: \"GBP\",\n    symbol: \"£\",\n    singular: \"British pound\",\n    plural: \"British pounds\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  JPY: {\n    code: \"JPY\",\n    symbol: \"¥\",\n    singular: \"Japanese yen\",\n    plural: \"Japanese yen\",\n    decimals: 0, // Yen não tem centavos\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  CHF: {\n    code: \"CHF\",\n    symbol: \"CHF\",\n    singular: \"Swiss franc\",\n    plural: \"Swiss francs\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \"'\",\n    decimalSeparator: \".\",\n  },\n  CNY: {\n    code: \"CNY\",\n    symbol: \"¥\",\n    singular: \"Chinese yuan\",\n    plural: \"Chinese yuan\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  CAD: {\n    code: \"CAD\",\n    symbol: \"C$\",\n    singular: \"Canadian dollar\",\n    plural: \"Canadian dollars\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  AUD: {\n    code: \"AUD\",\n    symbol: \"A$\",\n    singular: \"Australian dollar\",\n    plural: \"Australian dollars\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n\n  // ===========================================================================\n  // Latin America\n  // ===========================================================================\n  BRL: {\n    code: \"BRL\",\n    symbol: \"R$\",\n    singular: \"Brazilian real\",\n    plural: \"Brazilian reais\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  MXN: {\n    code: \"MXN\",\n    symbol: \"$\",\n    singular: \"Mexican peso\",\n    plural: \"Mexican pesos\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  ARS: {\n    code: \"ARS\",\n    symbol: \"$\",\n    singular: \"Argentine peso\",\n    plural: \"Argentine pesos\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  CLP: {\n    code: \"CLP\",\n    symbol: \"$\",\n    singular: \"Chilean peso\",\n    plural: \"Chilean pesos\",\n    decimals: 0, // Peso chileno não tem centavos\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  COP: {\n    code: \"COP\",\n    symbol: \"$\",\n    singular: \"Colombian peso\",\n    plural: \"Colombian pesos\",\n    decimals: 0, // Peso colombiano praticamente não usa centavos\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n\n  // ===========================================================================\n  // Other Important\n  // ===========================================================================\n  INR: {\n    code: \"INR\",\n    symbol: \"₹\",\n    singular: \"Indian rupee\",\n    plural: \"Indian rupees\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  KRW: {\n    code: \"KRW\",\n    symbol: \"₩\",\n    singular: \"South Korean won\",\n    plural: \"South Korean won\",\n    decimals: 0, // Won não tem centavos\n    symbolFirst: true,\n    thousandsSeparator: \",\",\n    decimalSeparator: \".\",\n  },\n  RUB: {\n    code: \"RUB\",\n    symbol: \"₽\",\n    singular: \"Russian ruble\",\n    plural: \"Russian rubles\",\n    decimals: 2,\n    symbolFirst: false,\n    thousandsSeparator: \" \",\n    decimalSeparator: \",\",\n  },\n  TRY: {\n    code: \"TRY\",\n    symbol: \"₺\",\n    singular: \"Turkish lira\",\n    plural: \"Turkish lira\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \".\",\n    decimalSeparator: \",\",\n  },\n  ZAR: {\n    code: \"ZAR\",\n    symbol: \"R\",\n    singular: \"South African rand\",\n    plural: \"South African rand\",\n    decimals: 2,\n    symbolFirst: true,\n    thousandsSeparator: \" \",\n    decimalSeparator: \",\",\n  },\n};\n\n// =============================================================================\n// SYMBOL TO CODE MAPPING\n// =============================================================================\n\n/**\n * Mapeamento de símbolos para códigos de moeda\n * Usado no cast para detectar moeda a partir de string\n *\n * NOTA: Alguns símbolos são ambíguos ($ é usado por várias moedas)\n * O cast retorna apenas o valor numérico, não infere a moeda\n */\nexport const CURRENCY_SYMBOLS: Record<string, CurrencyCode[]> = {\n  $: [\"USD\", \"CAD\", \"AUD\", \"MXN\", \"ARS\", \"CLP\", \"COP\"],\n  \"€\": [\"EUR\"],\n  \"£\": [\"GBP\"],\n  \"¥\": [\"JPY\", \"CNY\"],\n  \"R$\": [\"BRL\"],\n  \"C$\": [\"CAD\"],\n  \"A$\": [\"AUD\"],\n  CHF: [\"CHF\"],\n  \"₹\": [\"INR\"],\n  \"₩\": [\"KRW\"],\n  \"₽\": [\"RUB\"],\n  \"₺\": [\"TRY\"],\n  R: [\"ZAR\"],\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/** Lista de todos os códigos de moeda */\nexport const CURRENCY_CODE_LIST = Object.keys(CURRENCY_CONFIGS) as CurrencyCode[];\n\n/**\n * Retorna configuração de uma moeda\n */\nexport function getCurrencyConfig(code: CurrencyCode): CurrencyConfig {\n  return CURRENCY_CONFIGS[code];\n}\n\n/**\n * Verifica se é um código de moeda válido\n */\nexport function isCurrencyCode(code: string): code is CurrencyCode {\n  return code.toUpperCase() in CURRENCY_CONFIGS;\n}\n","/**\n * Currency Role - Format Pillar\n *\n * Formata valores monetários para apresentação.\n * Usa metadata (código da moeda) para determinar formatação.\n *\n * @example\n * import { formatCurrency } from '@attrx/role-morphic/currency/format';\n *\n * formatCurrency(1500.50, { currency: 'BRL' });  // \"R$ 1.500,50\"\n * formatCurrency(1000, { currency: 'USD' });     // \"$1,000.00\"\n * formatCurrency(99.99, { currency: 'EUR' });    // \"99,99 €\"\n */\n\nimport {\n  CURRENCY_CONFIGS,\n  type CurrencyCode,\n  type CurrencyConfig,\n} from \"./constants\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface CurrencyFormatOptions {\n  /** Código da moeda (obrigatório) */\n  currency: CurrencyCode;\n  /** Casas decimais (default: decimais padrão da moeda) */\n  decimals?: number;\n  /** Usa nome completo ao invés de símbolo */\n  verbose?: boolean;\n  /** Esconde símbolo, retorna só o número formatado */\n  hideSymbol?: boolean;\n  /** Força símbolo antes do valor */\n  symbolFirst?: boolean;\n  /** Usa Intl.NumberFormat com locale */\n  locale?: string;\n  /** Mostra sinal de positivo para valores positivos */\n  showPositiveSign?: boolean;\n}\n\n// =============================================================================\n// FORMAT\n// =============================================================================\n\n/**\n * Formata valor monetário para apresentação\n *\n * @param value - Valor numérico\n * @param options - Opções de formatação (currency obrigatório)\n * @returns String formatada\n *\n * @example\n * formatCurrency(1500.50, { currency: 'BRL' });                    // \"R$ 1.500,50\"\n * formatCurrency(1000, { currency: 'USD' });                       // \"$1,000.00\"\n * formatCurrency(99.99, { currency: 'EUR' });                      // \"99,99 €\"\n * formatCurrency(1500, { currency: 'JPY' });                       // \"¥1,500\"\n * formatCurrency(1500.50, { currency: 'BRL', verbose: true });     // \"1.500,50 Brazilian reais\"\n * formatCurrency(1500.50, { currency: 'BRL', hideSymbol: true });  // \"1.500,50\"\n * formatCurrency(1500.50, { currency: 'BRL', locale: 'pt-BR' });   // \"R$ 1.500,50\" (via Intl)\n */\nexport function formatCurrency(\n  value: number,\n  options: CurrencyFormatOptions\n): string {\n  const config = CURRENCY_CONFIGS[options.currency];\n\n  if (!config) {\n    throw new Error(`Unknown currency code: ${options.currency}`);\n  }\n\n  // Se locale especificado, usa Intl.NumberFormat\n  if (options.locale) {\n    return formatWithIntl(value, options, config);\n  }\n\n  // Formatação manual\n  return formatManual(value, options, config);\n}\n\n/**\n * Formata usando Intl.NumberFormat (mais preciso para i18n)\n */\nfunction formatWithIntl(\n  value: number,\n  options: CurrencyFormatOptions,\n  config: CurrencyConfig\n): string {\n  const decimals = options.decimals ?? config.decimals;\n\n  const intlOptions: Intl.NumberFormatOptions = {\n    style: options.hideSymbol ? \"decimal\" : \"currency\",\n    currency: config.code,\n    minimumFractionDigits: decimals,\n    maximumFractionDigits: decimals,\n  };\n\n  if (options.verbose) {\n    intlOptions.currencyDisplay = \"name\";\n  }\n\n  let formatted = new Intl.NumberFormat(options.locale, intlOptions).format(\n    value\n  );\n\n  if (options.showPositiveSign && value > 0) {\n    formatted = \"+\" + formatted;\n  }\n\n  return formatted;\n}\n\n/**\n * Formatação manual (mais controle, sem dependência de locale)\n */\nfunction formatManual(\n  value: number,\n  options: CurrencyFormatOptions,\n  config: CurrencyConfig\n): string {\n  const decimals = options.decimals ?? config.decimals;\n  const isNegative = value < 0;\n  const absValue = Math.abs(value);\n\n  // Formata o número\n  const formattedNumber = formatNumber(\n    absValue,\n    decimals,\n    config.thousandsSeparator,\n    config.decimalSeparator\n  );\n\n  // Monta o resultado\n  let result = \"\";\n\n  // Sinal\n  if (isNegative) {\n    result += \"-\";\n  } else if (options.showPositiveSign) {\n    result += \"+\";\n  }\n\n  // Símbolo e valor\n  if (options.hideSymbol) {\n    result += formattedNumber;\n  } else if (options.verbose) {\n    // Modo verbose: \"1.500,50 Brazilian reais\"\n    const name = absValue === 1 ? config.singular : config.plural;\n    result += `${formattedNumber} ${name}`;\n  } else {\n    // Modo normal com símbolo\n    const symbolFirst =\n      options.symbolFirst !== undefined\n        ? options.symbolFirst\n        : config.symbolFirst;\n\n    if (symbolFirst) {\n      result += `${config.symbol}${formattedNumber}`;\n    } else {\n      result += `${formattedNumber} ${config.symbol}`;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Formata número com separadores\n */\nfunction formatNumber(\n  value: number,\n  decimals: number,\n  thousandsSeparator: string,\n  decimalSeparator: string\n): string {\n  // Fixa decimais\n  const fixed = value.toFixed(decimals);\n\n  // Separa inteiro e decimal\n  const [intPart, decPart] = fixed.split(\".\");\n\n  // Adiciona separador de milhares\n  const intFormatted = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSeparator);\n\n  // Junta com separador decimal\n  if (decimals > 0 && decPart) {\n    return `${intFormatted}${decimalSeparator}${decPart}`;\n  }\n\n  return intFormatted;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Retorna apenas o símbolo da moeda\n *\n * @example\n * getCurrencySymbol('BRL');  // \"R$\"\n * getCurrencySymbol('USD');  // \"$\"\n */\nexport function getCurrencySymbol(code: CurrencyCode): string {\n  const config = CURRENCY_CONFIGS[code];\n  if (!config) {\n    throw new Error(`Unknown currency code: ${code}`);\n  }\n  return config.symbol;\n}\n\n/**\n * Retorna o nome da moeda (singular ou plural)\n *\n * @example\n * getCurrencyName('BRL', 1);   // \"Brazilian real\"\n * getCurrencyName('BRL', 2);   // \"Brazilian reais\"\n */\nexport function getCurrencyName(code: CurrencyCode, count: number = 1): string {\n  const config = CURRENCY_CONFIGS[code];\n  if (!config) {\n    throw new Error(`Unknown currency code: ${code}`);\n  }\n  return count === 1 ? config.singular : config.plural;\n}\n\n/**\n * Retorna casas decimais padrão da moeda\n *\n * @example\n * getCurrencyDecimals('BRL');  // 2\n * getCurrencyDecimals('JPY');  // 0\n */\nexport function getCurrencyDecimals(code: CurrencyCode): number {\n  const config = CURRENCY_CONFIGS[code];\n  if (!config) {\n    throw new Error(`Unknown currency code: ${code}`);\n  }\n  return config.decimals;\n}\n","/**\n * IVariant - Interface para variantes de ComplexRole\n *\n * Cada variante complexa (hex, rgb:object, hsl:string) implementa esta interface.\n * Usada quando variantes têm tipos/estruturas diferentes.\n *\n * @example\n * class HexVariant implements IVariant<string, RGBA> { ... }\n * class RgbObjectVariant implements IVariant<RGBA, RGBA> { ... }\n */\n\nimport type { ValidationResult, BaseFormatOptions } from \"../types\";\nimport type { Result } from \"./IRole\";\n\n// =============================================================================\n// IVARIANT INTERFACE\n// =============================================================================\n\n/**\n * Interface para uma variante de ComplexRole.\n *\n * @typeParam TValue - Tipo do valor nesta variante (ex: string para hex, RGBA para rgb:object)\n * @typeParam TBase - Tipo da base da role (ex: RGBA para color)\n *\n * @example\n * // Variante hex de Color\n * class HexVariant implements IVariant<string, RGBA> {\n *   name = 'hex';\n *   type = 'string';\n *\n *   toBase(hex: string): RGBA { ... }\n *   fromBase(rgba: RGBA): string { ... }\n *   cast(input: unknown): string | null { ... }\n *   validate(hex: string): ValidationResult { ... }\n *   format(hex: string, opts?): string { ... }\n * }\n */\nexport interface IVariant<TValue = unknown, TBase = unknown> {\n  // ===========================================================================\n  // METADATA\n  // ===========================================================================\n\n  /** Nome da variante (ex: \"hex\", \"rgb:object\", \"hsl:string\") */\n  readonly name: string;\n\n  /** Tipo primitivo do valor (ex: \"string\", \"object\") */\n  readonly type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  /**\n   * Converte valor desta variante para o formato base da role.\n   *\n   * @example\n   * hexVariant.toBase('#ff0000') // { r: 255, g: 0, b: 0, a: 1 }\n   */\n  toBase(value: TValue): TBase;\n\n  /**\n   * Converte do formato base para esta variante.\n   *\n   * @example\n   * hexVariant.fromBase({ r: 255, g: 0, b: 0, a: 1 }) // '#ff0000ff'\n   */\n  fromBase(base: TBase): TValue;\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  /**\n   * Tenta normalizar um input desconhecido para o tipo desta variante.\n   * Retorna null se não conseguir.\n   *\n   * @example\n   * hexVariant.cast('ff0000')        // '#ff0000'\n   * hexVariant.cast('red')           // '#ff0000'\n   * hexVariant.cast('rgb(255,0,0)')  // '#ff0000'\n   * hexVariant.cast(123)             // null\n   */\n  cast(input: unknown): TValue | null;\n\n  /**\n   * Versão safe que retorna Result\n   */\n  tryCast(input: unknown): Result<TValue>;\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  /**\n   * Valida se um valor atende às regras desta variante.\n   *\n   * @example\n   * hexVariant.validate('#ff0000')   // { valid: true, errors: [] }\n   * hexVariant.validate('#gg0000')   // { valid: false, errors: ['Invalid hex character'] }\n   */\n  validate(value: TValue): ValidationResult;\n\n  /**\n   * Versão simplificada que retorna boolean\n   */\n  isValid(value: TValue): boolean;\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  /**\n   * Formata valor para apresentação humana.\n   *\n   * @example\n   * hexVariant.format('#ff0000')                      // '#ff0000'\n   * hexVariant.format('#ff0000', { uppercase: true }) // '#FF0000'\n   */\n  format(value: TValue, options?: BaseFormatOptions): string;\n}\n\n// =============================================================================\n// ABSTRACT BASE CLASS\n// =============================================================================\n\n/**\n * Classe base abstrata que implementa métodos auxiliares comuns.\n * Variantes concretas podem estender esta classe.\n */\nexport abstract class BaseVariant<TValue = unknown, TBase = unknown>\n  implements IVariant<TValue, TBase>\n{\n  abstract readonly name: string;\n  abstract readonly type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n\n  abstract toBase(value: TValue): TBase;\n  abstract fromBase(base: TBase): TValue;\n  abstract cast(input: unknown): TValue | null;\n  abstract validate(value: TValue): ValidationResult;\n  abstract format(value: TValue, options?: BaseFormatOptions): string;\n\n  /**\n   * Implementação padrão de tryCast usando cast\n   */\n  tryCast(input: unknown): Result<TValue> {\n    const result = this.cast(input);\n    if (result === null) {\n      return {\n        ok: false,\n        error: `Cannot cast \"${String(input)}\" to ${this.name}`,\n      };\n    }\n    return { ok: true, value: result };\n  }\n\n  /**\n   * Implementação padrão de isValid usando validate\n   */\n  isValid(value: TValue): boolean {\n    return this.validate(value).valid;\n  }\n}\n\n// =============================================================================\n// TYPE HELPERS\n// =============================================================================\n\n/**\n * Extrai o tipo de valor de uma variante\n */\nexport type VariantValueType<V extends IVariant> =\n  V extends IVariant<infer TValue, unknown> ? TValue : never;\n\n/**\n * Extrai o tipo base de uma variante\n */\nexport type VariantBaseType<V extends IVariant> =\n  V extends IVariant<unknown, infer TBase> ? TBase : never;\n","/**\n * SimpleRole - Classe base abstrata para roles numéricas\n *\n * Para roles onde TODAS as variantes são do mesmo tipo (geralmente number).\n * Implementa os 4 pilares com lógica compartilhada via fatores de conversão.\n *\n * Roles que estendem: Area, Length, Mass, Volume, Speed, Pressure, Energy, etc.\n *\n * @example\n * class AreaRole extends SimpleRole<number> {\n *   readonly name = 'area';\n *   readonly base = 'square_meter';\n *   readonly factors = { square_meter: 1, hectare: 10000, acre: 4046.86 };\n *   readonly symbols = { square_meter: 'm²', hectare: 'ha', acre: 'ac' };\n * }\n */\n\nimport type {\n  RoleSpec,\n  VariantSpec,\n  ValidationResult,\n  ValidationRule,\n  BaseFormatOptions,\n  FormatSpec,\n} from \"../types\";\nimport type { IRole, Result } from \"./IRole\";\n\n// =============================================================================\n// CONFIG TYPES\n// =============================================================================\n\n/**\n * Configuração de uma unidade em SimpleRole\n */\nexport interface SimpleUnitConfig {\n  /** Fator de conversão para a base (ou função para temperatura) */\n  factor?: number;\n  /** Fórmula de conversão para base (para temperatura) */\n  toBase?: (value: number) => number;\n  /** Fórmula de conversão da base (para temperatura) */\n  fromBase?: (value: number) => number;\n  /** Símbolo da unidade (ex: \"m²\", \"ha\") */\n  symbol: string;\n  /** Nome singular (ex: \"hectare\") */\n  singular?: string;\n  /** Nome plural (ex: \"hectares\") */\n  plural?: string;\n  /** Se true, não adiciona espaço antes do símbolo (ex: 45° ao invés de 45 °) */\n  noSpace?: boolean;\n}\n\n/**\n * Configuração de validação para SimpleRole\n */\nexport interface SimpleValidationConfig {\n  /** Valor mínimo permitido */\n  min?: number;\n  /** Valor máximo permitido */\n  max?: number;\n  /** Deve ser inteiro */\n  integer?: boolean;\n  /** Mensagem de erro customizada para min */\n  minError?: string;\n  /** Mensagem de erro customizada para max */\n  maxError?: string;\n}\n\n/**\n * Alias para reconhecimento no cast\n */\nexport type UnitAliases = Record<string, string>;\n\n// =============================================================================\n// SIMPLE ROLE CLASS\n// =============================================================================\n\n/**\n * Classe base abstrata para roles numéricas simples.\n *\n * Subclasses devem definir:\n * - name: Nome da role\n * - base: Variante base\n * - units: Configuração de cada unidade\n * - aliases: (opcional) Aliases para cast\n * - validation: (opcional) Regras de validação\n */\nexport abstract class SimpleRole implements IRole<number> {\n  // ===========================================================================\n  // ABSTRACT PROPERTIES (subclasses devem implementar)\n  // ===========================================================================\n\n  /** Nome único da role */\n  abstract readonly name: string;\n\n  /** Nome da variante base */\n  abstract readonly base: string;\n\n  /** Configuração de cada unidade */\n  abstract readonly units: Record<string, SimpleUnitConfig>;\n\n  // ===========================================================================\n  // OPTIONAL PROPERTIES (subclasses podem sobrescrever)\n  // ===========================================================================\n\n  /** Aliases para reconhecimento no cast (ex: \"ha\" → \"hectare\") */\n  readonly aliases: UnitAliases = {};\n\n  /** Regras de validação */\n  readonly validation: SimpleValidationConfig = {};\n\n  // ===========================================================================\n  // INTROSPECTION\n  // ===========================================================================\n\n  getVariants(): string[] {\n    return Object.keys(this.units);\n  }\n\n  hasVariant(variant: string): boolean {\n    return variant in this.units;\n  }\n\n  // ===========================================================================\n  // CONVERT (Pilar 1)\n  // ===========================================================================\n\n  convert<TFrom = number, TTo = number>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): TTo {\n    const numValue = value as unknown as number;\n\n    // Otimização: mesma variante\n    if (from === to) {\n      return value as unknown as TTo;\n    }\n\n    // Converte para base e depois para destino\n    const baseValue = this.toBase(from, numValue);\n    return this.fromBase(to, baseValue) as unknown as TTo;\n  }\n\n  tryConvert<TFrom = number, TTo = number>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): Result<TTo> {\n    try {\n      if (!this.hasVariant(from)) {\n        return { ok: false, error: `Unknown variant: ${from}` };\n      }\n      if (!this.hasVariant(to)) {\n        return { ok: false, error: `Unknown variant: ${to}` };\n      }\n      const result = this.convert<TFrom, TTo>(from, to, value);\n      return { ok: true, value: result };\n    } catch (err) {\n      return { ok: false, error: String(err) };\n    }\n  }\n\n  toBase<T = number>(variant: string, value: T): number {\n    const numValue = value as unknown as number;\n    const unit = this.units[variant];\n\n    if (!unit) {\n      throw new Error(`Unknown variant: ${variant}`);\n    }\n\n    // Usa fórmula se definida (temperatura), senão usa fator\n    if (unit.toBase) {\n      return unit.toBase(numValue);\n    }\n\n    return numValue * (unit.factor ?? 1);\n  }\n\n  fromBase<T = number>(variant: string, baseValue: number): T {\n    const unit = this.units[variant];\n\n    if (!unit) {\n      throw new Error(`Unknown variant: ${variant}`);\n    }\n\n    // Usa fórmula se definida (temperatura), senão usa fator\n    if (unit.fromBase) {\n      return unit.fromBase(baseValue) as unknown as T;\n    }\n\n    return (baseValue / (unit.factor ?? 1)) as unknown as T;\n  }\n\n  // ===========================================================================\n  // CAST (Pilar 2)\n  // ===========================================================================\n\n  cast<T = number>(variant: string, input: unknown): T | null {\n    // Já é número\n    if (typeof input === \"number\") {\n      return Number.isFinite(input) ? (input as unknown as T) : null;\n    }\n\n    // String\n    if (typeof input === \"string\") {\n      const parsed = this.parseString(input, variant);\n      return parsed !== null ? (parsed as unknown as T) : null;\n    }\n\n    return null;\n  }\n\n  tryCast<T = number>(variant: string, input: unknown): Result<T> {\n    const result = this.cast<T>(variant, input);\n    if (result === null) {\n      return {\n        ok: false,\n        error: `Cannot cast \"${String(input)}\" to ${this.name}:${variant}`,\n      };\n    }\n    return { ok: true, value: result };\n  }\n\n  /**\n   * Parseia string para número, detectando unidade se presente.\n   * Subclasses podem sobrescrever para lógica customizada.\n   */\n  protected parseString(input: string, targetVariant: string): number | null {\n    const trimmed = input.trim().toLowerCase();\n\n    // Extrai número e possível unidade\n    const match = trimmed.match(/^([+-]?[\\d.,\\s]+)\\s*(.*)$/);\n    if (!match) {\n      return null;\n    }\n\n    let [, numStr, unitStr] = match;\n\n    // Normaliza número\n    const numValue = this.parseNumber(numStr);\n    if (numValue === null) {\n      return null;\n    }\n\n    // Se tem unidade no input, converte se necessário\n    unitStr = unitStr.trim();\n    if (unitStr) {\n      const detectedUnit = this.detectUnit(unitStr);\n      if (detectedUnit && detectedUnit !== targetVariant) {\n        // Converte da unidade detectada para a target\n        return this.convert(detectedUnit, targetVariant, numValue);\n      }\n    }\n\n    return numValue;\n  }\n\n  /**\n   * Parseia string numérica considerando formatos brasileiro e americano\n   */\n  protected parseNumber(numStr: string): number | null {\n    // Remove espaços\n    numStr = numStr.replace(/\\s/g, \"\");\n\n    const lastComma = numStr.lastIndexOf(\",\");\n    const lastDot = numStr.lastIndexOf(\".\");\n    const hasComma = lastComma !== -1;\n    const hasDot = lastDot !== -1;\n\n    if (hasComma && hasDot) {\n      if (lastComma > lastDot) {\n        // Brasileiro: 1.000,50\n        numStr = numStr.replace(/\\./g, \"\").replace(\",\", \".\");\n      } else {\n        // Americano: 1,000.50\n        numStr = numStr.replace(/,/g, \"\");\n      }\n    } else if (hasComma && !hasDot) {\n      // Só vírgulas: detecta se é milhar ou decimal\n      const afterComma = numStr.split(\",\").slice(1);\n      const isThousandSep = afterComma.every((part) => part.length === 3);\n      if (isThousandSep) {\n        numStr = numStr.replace(/,/g, \"\");\n      } else {\n        numStr = numStr.replace(\",\", \".\");\n      }\n    } else if (!hasComma && hasDot) {\n      // Só pontos: múltiplos pontos = milhar brasileiro\n      const afterDot = numStr.split(\".\").slice(1);\n      if (afterDot.length > 1) {\n        numStr = numStr.replace(/\\./g, \"\");\n      }\n    }\n\n    const value = parseFloat(numStr);\n    return isNaN(value) ? null : value;\n  }\n\n  /**\n   * Detecta unidade a partir de string (símbolo ou alias)\n   */\n  protected detectUnit(unitStr: string): string | null {\n    const normalized = unitStr.toLowerCase().trim();\n\n    // Checa aliases primeiro\n    if (normalized in this.aliases) {\n      return this.aliases[normalized];\n    }\n\n    // Checa símbolos e nomes\n    for (const [variant, config] of Object.entries(this.units)) {\n      if (\n        config.symbol.toLowerCase() === normalized ||\n        config.singular?.toLowerCase() === normalized ||\n        config.plural?.toLowerCase() === normalized ||\n        variant.toLowerCase() === normalized\n      ) {\n        return variant;\n      }\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE (Pilar 3)\n  // ===========================================================================\n\n  validate(variant: string, value: unknown): ValidationResult {\n    const errors: string[] = [];\n\n    // Tipo\n    if (typeof value !== \"number\") {\n      return { valid: false, errors: [\"Value must be a number\"] };\n    }\n\n    // Finito\n    if (!Number.isFinite(value)) {\n      return { valid: false, errors: [\"Value must be finite\"] };\n    }\n\n    // Min\n    if (this.validation.min !== undefined && value < this.validation.min) {\n      const msg =\n        this.validation.minError ??\n        `Value must be at least ${this.validation.min}`;\n      errors.push(msg);\n    }\n\n    // Max\n    if (this.validation.max !== undefined && value > this.validation.max) {\n      const msg =\n        this.validation.maxError ??\n        `Value must be at most ${this.validation.max}`;\n      errors.push(msg);\n    }\n\n    // Integer\n    if (this.validation.integer && !Number.isInteger(value)) {\n      errors.push(\"Value must be an integer\");\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  isValid(variant: string, value: unknown): boolean {\n    return this.validate(variant, value).valid;\n  }\n\n  // ===========================================================================\n  // FORMAT (Pilar 4)\n  // ===========================================================================\n\n  format(variant: string, value: unknown, options: BaseFormatOptions = {}): string {\n    const { decimals = 2, verbose = false, locale } = options;\n    const unit = this.units[variant];\n\n    if (!unit) {\n      throw new Error(`Unknown variant: ${variant}`);\n    }\n\n    const numValue = value as number;\n\n    // Formata número\n    let formattedValue: string;\n    if (locale) {\n      formattedValue = numValue.toLocaleString(locale, {\n        minimumFractionDigits: 0,\n        maximumFractionDigits: decimals,\n      });\n    } else {\n      formattedValue = Number(numValue.toFixed(decimals)).toString();\n    }\n\n    // Escolhe símbolo ou nome\n    const separator = unit.noSpace ? \"\" : \" \";\n\n    if (verbose) {\n      const name = numValue === 1 ? unit.singular : unit.plural;\n      return `${formattedValue} ${name || unit.symbol}`;\n    }\n\n    return `${formattedValue}${separator}${unit.symbol}`;\n  }\n\n  // ===========================================================================\n  // COMPATIBILITY\n  // ===========================================================================\n\n  toSpec(): RoleSpec<number> {\n    const variants: Record<string, VariantSpec<unknown, number>> = {};\n\n    for (const [name, config] of Object.entries(this.units)) {\n      const factor = config.factor ?? 1;\n\n      const toBaseFn = config.toBase\n        ? (v: unknown) => config.toBase!(v as number)\n        : (v: unknown) => (v as number) * factor;\n      const fromBaseFn = config.fromBase\n        ? (v: number) => config.fromBase!(v)\n        : (v: number) => v / factor;\n\n      variants[name] = {\n        type: \"number\",\n        toBase: toBaseFn,\n        fromBase: fromBaseFn,\n        cast: (input: unknown) => this.cast(name, input),\n        validate: {\n          min: this.validation.min,\n          max: this.validation.max,\n          integer: this.validation.integer,\n          custom: (v: unknown) => {\n            const result = this.validate(name, v);\n            return result.valid ? null : result.errors[0];\n          },\n        } as ValidationRule,\n        format: {\n          symbol: config.symbol,\n          singular: config.singular,\n          plural: config.plural,\n        } as FormatSpec<unknown>,\n      };\n    }\n\n    return {\n      base: this.base,\n      variants,\n    };\n  }\n}\n","/**\n * ComplexRole - Classe base abstrata para roles com variantes heterogêneas\n *\n * Para roles onde cada variante tem tipo/estrutura diferente.\n * Cada variante é implementada como sua própria classe (IVariant).\n *\n * Roles que estendem: Color, Date, etc.\n *\n * @example\n * class ColorRole extends ComplexRole<RGBA> {\n *   readonly name = 'color';\n *   readonly base = 'rgb_object';\n *\n *   protected createVariants() {\n *     return {\n *       'hex': new HexVariant(),\n *       'rgb_object': new RgbObjectVariant(),\n *       'rgb_string': new RgbStringVariant(),\n *       'hsl_object': new HslObjectVariant(),\n *     };\n *   }\n * }\n */\n\nimport type {\n  RoleSpec,\n  VariantSpec,\n  ValidationResult,\n  BaseFormatOptions,\n} from \"../types\";\nimport type { IRole, Result } from \"./IRole\";\nimport type { IVariant } from \"./IVariant\";\n\n// =============================================================================\n// COMPLEX ROLE CLASS\n// =============================================================================\n\n/**\n * Classe base abstrata para roles com variantes heterogêneas.\n *\n * Subclasses devem definir:\n * - name: Nome da role\n * - base: Variante base\n * - createVariants(): Factory que retorna mapa de variantes\n *\n * @typeParam TBase - Tipo do valor na variante base\n */\nexport abstract class ComplexRole<TBase = unknown> implements IRole<TBase> {\n  // ===========================================================================\n  // ABSTRACT PROPERTIES (subclasses devem implementar)\n  // ===========================================================================\n\n  /** Nome único da role */\n  abstract readonly name: string;\n\n  /** Nome da variante base */\n  abstract readonly base: string;\n\n  // ===========================================================================\n  // VARIANTS\n  // ===========================================================================\n\n  /** Cache das variantes */\n  private _variants: Map<string, IVariant<unknown, TBase>> | null = null;\n\n  /**\n   * Factory method para criar variantes.\n   * Subclasses devem implementar.\n   */\n  protected abstract createVariants(): Record<string, IVariant<unknown, TBase>>;\n\n  /**\n   * Retorna mapa de variantes (lazy initialization)\n   */\n  protected get variants(): Map<string, IVariant<unknown, TBase>> {\n    if (!this._variants) {\n      this._variants = new Map(Object.entries(this.createVariants()));\n    }\n    return this._variants;\n  }\n\n  /**\n   * Retorna uma variante específica\n   */\n  protected getVariant(name: string): IVariant<unknown, TBase> {\n    const variant = this.variants.get(name);\n    if (!variant) {\n      throw new Error(`Unknown variant: ${name}`);\n    }\n    return variant;\n  }\n\n  // ===========================================================================\n  // INTROSPECTION\n  // ===========================================================================\n\n  getVariants(): string[] {\n    return Array.from(this.variants.keys());\n  }\n\n  hasVariant(variant: string): boolean {\n    return this.variants.has(variant);\n  }\n\n  // ===========================================================================\n  // CONVERT (Pilar 1)\n  // ===========================================================================\n\n  convert<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): TTo {\n    // Otimização: mesma variante\n    if (from === to) {\n      return value as unknown as TTo;\n    }\n\n    const fromVariant = this.getVariant(from);\n    const toVariant = this.getVariant(to);\n\n    // from → base → to\n    const baseValue = fromVariant.toBase(value);\n    return toVariant.fromBase(baseValue) as unknown as TTo;\n  }\n\n  tryConvert<TFrom = unknown, TTo = unknown>(\n    from: string,\n    to: string,\n    value: TFrom,\n  ): Result<TTo> {\n    try {\n      if (!this.hasVariant(from)) {\n        return { ok: false, error: `Unknown variant: ${from}` };\n      }\n      if (!this.hasVariant(to)) {\n        return { ok: false, error: `Unknown variant: ${to}` };\n      }\n      const result = this.convert<TFrom, TTo>(from, to, value);\n      return { ok: true, value: result };\n    } catch (err) {\n      return { ok: false, error: String(err) };\n    }\n  }\n\n  toBase<T = unknown>(variant: string, value: T): TBase {\n    return this.getVariant(variant).toBase(value);\n  }\n\n  fromBase<T = unknown>(variant: string, baseValue: TBase): T {\n    return this.getVariant(variant).fromBase(baseValue) as T;\n  }\n\n  // ===========================================================================\n  // CAST (Pilar 2)\n  // ===========================================================================\n\n  cast<T = unknown>(variant: string, input: unknown): T | null {\n    return this.getVariant(variant).cast(input) as T | null;\n  }\n\n  tryCast<T = unknown>(variant: string, input: unknown): Result<T> {\n    const result = this.cast<T>(variant, input);\n    if (result === null) {\n      return {\n        ok: false,\n        error: `Cannot cast \"${String(input)}\" to ${this.name}:${variant}`,\n      };\n    }\n    return { ok: true, value: result };\n  }\n\n  // ===========================================================================\n  // VALIDATE (Pilar 3)\n  // ===========================================================================\n\n  validate(variant: string, value: unknown): ValidationResult {\n    return this.getVariant(variant).validate(value);\n  }\n\n  isValid(variant: string, value: unknown): boolean {\n    return this.validate(variant, value).valid;\n  }\n\n  // ===========================================================================\n  // FORMAT (Pilar 4)\n  // ===========================================================================\n\n  format(variant: string, value: unknown, options?: BaseFormatOptions): string {\n    return this.getVariant(variant).format(value, options);\n  }\n\n  // ===========================================================================\n  // COMPATIBILITY\n  // ===========================================================================\n\n  toSpec(): RoleSpec<TBase> {\n    const variants: Record<string, VariantSpec<unknown, TBase>> = {};\n\n    for (const [name, variant] of this.variants.entries()) {\n      variants[name] = {\n        type: variant.type,\n        toBase: (v: unknown) => variant.toBase(v),\n        fromBase: (v: TBase) => variant.fromBase(v),\n        cast: (input: unknown) => variant.cast(input),\n        validate: {\n          custom: (v: unknown) => {\n            const result = variant.validate(v);\n            return result.valid ? null : result.errors[0];\n          },\n        },\n        format: {\n          symbol: name,\n          formatter: (v: unknown, opts?: BaseFormatOptions) =>\n            variant.format(v, opts),\n        },\n      };\n    }\n\n    return {\n      base: this.base,\n      variants,\n    };\n  }\n}\n","/**\n * AreaRole - Classe OOP para manipulação de unidades de área\n *\n * Implementa os 4 pilares via composição dos módulos separados.\n * Para uso funcional, importe diretamente dos pilares:\n *\n * @example\n * // OOP\n * import { areaRole } from '@attrx/role-morphic/area';\n * areaRole.convert('hectare', 'acre', 1);\n *\n * // Funcional\n * import { convertArea } from '@attrx/role-morphic/area/convert';\n * convertArea('hectare', 'acre', 1);\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { AREA_UNITS, AREA_ALIASES } from \"./constants\";\n\n// =============================================================================\n// AREA ROLE CLASS\n// =============================================================================\n\nexport class AreaRole extends SimpleRole {\n  readonly name = \"area\";\n  readonly base = \"square_meter\";\n  readonly units = AREA_UNITS;\n  readonly aliases = AREA_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Area cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da AreaRole */\nexport const areaRole = new AreaRole();\n","/**\n * LengthRole - Classe OOP para manipulação de unidades de comprimento\n *\n * Implementa os 4 pilares via composição dos módulos separados.\n * Para uso funcional, importe diretamente dos pilares:\n *\n * @example\n * // OOP\n * import { lengthRole } from '@attrx/role-morphic/length';\n * lengthRole.convert('kilometer', 'mile', 1);\n *\n * // Funcional\n * import { convertLength } from '@attrx/role-morphic/length/convert';\n * convertLength('kilometer', 'mile', 1);\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { LENGTH_UNITS, LENGTH_ALIASES } from \"./constants\";\n\n// =============================================================================\n// LENGTH ROLE CLASS\n// =============================================================================\n\nexport class LengthRole extends SimpleRole {\n  readonly name = \"length\";\n  readonly base = \"meter\";\n  readonly units = LENGTH_UNITS;\n  readonly aliases = LENGTH_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Length cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da LengthRole */\nexport const lengthRole = new LengthRole();\n","/**\n * MassRole - Role para conversão de unidades de massa\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { massRole } from '@attrx/role-morphic/mass';\n * massRole.convert('kilogram', 'pound', 1);  // 2.20462\n *\n * // Functional style (preferido)\n * import { convertMass } from '@attrx/role-morphic/mass/convert';\n * convertMass('kilogram', 'pound', 1);  // 2.20462\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { MASS_UNITS, MASS_ALIASES } from \"./constants\";\n\n// =============================================================================\n// MASS ROLE CLASS\n// =============================================================================\n\nexport class MassRole extends SimpleRole {\n  readonly name = \"mass\";\n  readonly base = \"kilogram\";\n  readonly units = MASS_UNITS;\n  readonly aliases = MASS_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Mass cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da MassRole */\nexport const massRole = new MassRole();\n","/**\n * TemperatureRole - Role para conversão de unidades de temperatura\n *\n * DIFERENTE das outras SimpleRoles: usa FÓRMULAS em vez de fatores.\n * Isso porque escalas de temperatura têm offsets diferentes.\n *\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { temperatureRole } from '@attrx/role-morphic/temperature';\n * temperatureRole.convert('celsius', 'fahrenheit', 0);  // 32\n *\n * // Functional style (preferido)\n * import { convertTemperature } from '@attrx/role-morphic/temperature/convert';\n * convertTemperature('celsius', 'fahrenheit', 0);  // 32\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport {\n  TEMPERATURE_UNITS,\n  TEMPERATURE_ALIASES,\n  TEMPERATURE_CONSTANTS,\n} from \"./constants\";\n\n// =============================================================================\n// TEMPERATURE ROLE CLASS\n// =============================================================================\n\nexport class TemperatureRole extends SimpleRole {\n  readonly name = \"temperature\";\n  readonly base = \"celsius\";\n  readonly units = TEMPERATURE_UNITS;\n  readonly aliases = TEMPERATURE_ALIASES;\n\n  // Temperatura tem validação especial: não pode ser abaixo do zero absoluto\n  readonly validation: SimpleValidationConfig = {\n    min: TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS,\n    minError: \"Temperature cannot be below absolute zero (-273.15°C)\",\n  };\n\n  /**\n   * Override validate para considerar o zero absoluto na escala correta\n   */\n  validate(\n    variant: string,\n    value: unknown\n  ): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    // Tipo\n    if (typeof value !== \"number\") {\n      return { valid: false, errors: [\"Value must be a number\"] };\n    }\n\n    // Finito\n    if (!Number.isFinite(value)) {\n      return { valid: false, errors: [\"Value must be finite\"] };\n    }\n\n    // Zero absoluto (converte para a escala atual)\n    const absoluteZero = this.getAbsoluteZero(variant);\n    if (value < absoluteZero) {\n      errors.push(\n        `Temperature cannot be below absolute zero (${absoluteZero}${this.units[variant]?.symbol || \"\"})`\n      );\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  /**\n   * Retorna o zero absoluto na escala especificada\n   */\n  private getAbsoluteZero(variant: string): number {\n    switch (variant) {\n      case \"celsius\":\n        return TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS;\n      case \"fahrenheit\":\n        return TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_FAHRENHEIT;\n      case \"kelvin\":\n        return 0;\n      case \"rankine\":\n        return 0;\n      default:\n        return TEMPERATURE_CONSTANTS.ABSOLUTE_ZERO_CELSIUS;\n    }\n  }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da TemperatureRole */\nexport const temperatureRole = new TemperatureRole();\n","/**\n * AngleRole - Role para conversão de unidades de ângulo\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const angle = new AngleRole();\n * angle.convert('degree', 'radian', 180)   // π ≈ 3.14159\n * angle.cast('degree', '90°')              // 90\n * angle.validate('degree', 90)             // { valid: true, errors: [] }\n * angle.format('degree', 45)               // \"45°\"\n */\n\nimport { SimpleRole } from \"../../contracts\";\nimport { ANGLE_UNITS, ANGLE_ALIASES } from \"./constants\";\n\n// =============================================================================\n// ANGLE ROLE CLASS\n// =============================================================================\n\nexport class AngleRole extends SimpleRole {\n  readonly name = \"angle\";\n  readonly base = \"degree\";\n  readonly units = ANGLE_UNITS;\n  readonly aliases = ANGLE_ALIASES;\n\n  // Ângulo pode ser negativo (rotação anti-horária) e maior que 360° (múltiplas voltas)\n  // Não definimos min/max na validação\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da AngleRole */\nexport const angleRole = new AngleRole();\n","/**\n * EnergyRole - Role para conversão de unidades de energia\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { energyRole } from '@attrx/role-morphic/energy';\n * energyRole.convert('kilocalorie', 'kilojoule', 1);  // 4.1868\n *\n * // Functional style (preferido)\n * import { convertEnergy } from '@attrx/role-morphic/energy/convert';\n * convertEnergy('kilocalorie', 'kilojoule', 1);  // 4.1868\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { ENERGY_UNITS, ENERGY_ALIASES } from \"./constants\";\n\n// =============================================================================\n// ENERGY ROLE CLASS\n// =============================================================================\n\nexport class EnergyRole extends SimpleRole {\n  readonly name = \"energy\";\n  readonly base = \"joule\";\n  readonly units = ENERGY_UNITS;\n  readonly aliases = ENERGY_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Energy cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da EnergyRole */\nexport const energyRole = new EnergyRole();\n","/**\n * PowerRole - Role para conversão de unidades de potência\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const power = new PowerRole();\n * power.convert('horsepower_mechanical', 'kilowatt', 1)  // 0.7457\n * power.cast('watt', '100 W')                            // 100\n * power.validate('watt', 100)                            // { valid: true, errors: [] }\n * power.format('kilowatt', 2.5)                          // \"2.5 kW\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { POWER_UNITS, POWER_ALIASES } from \"./constants\";\n\n// =============================================================================\n// POWER ROLE CLASS\n// =============================================================================\n\nexport class PowerRole extends SimpleRole {\n  readonly name = \"power\";\n  readonly base = \"watt\";\n  readonly units = POWER_UNITS;\n  readonly aliases = POWER_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Power cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da PowerRole */\nexport const powerRole = new PowerRole();\n","/**\n * SpeedRole - Role para conversão de unidades de velocidade\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * Nota: Velocidade pode ser negativa (movimento em direção oposta).\n *\n * @example\n * // OOP style\n * import { speedRole } from '@attrx/role-morphic/speed';\n * speedRole.convert('kilometer_per_hour', 'mile_per_hour', 100);  // 62.1371\n *\n * // Functional style (preferido)\n * import { convertSpeed } from '@attrx/role-morphic/speed/convert';\n * convertSpeed('kilometer_per_hour', 'mile_per_hour', 100);  // 62.1371\n */\n\nimport { SimpleRole } from \"../../contracts\";\nimport { SPEED_UNITS, SPEED_ALIASES } from \"./constants\";\n\n// =============================================================================\n// SPEED ROLE CLASS\n// =============================================================================\n\nexport class SpeedRole extends SimpleRole {\n  readonly name = \"speed\";\n  readonly base = \"meter_per_second\";\n  readonly units = SPEED_UNITS;\n  readonly aliases = SPEED_ALIASES;\n\n  // Speed pode ser negativo (movimento em direção oposta)\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da SpeedRole */\nexport const speedRole = new SpeedRole();\n","/**\n * IsoVariant - Variante ISO 8601 para Date\n *\n * Representa data como string ISO 8601.\n *\n * @example\n * \"2024-12-05T19:30:00.000Z\"\n * \"2024-12-05T19:30:00.000-03:00\"\n * \"2024-12-05\"\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { DateIso, DateTimestamp, DateFormatOptions } from \"../types\";\n\n// Regex para validar ISO 8601 (formatos comuns)\nconst ISO_FULL_REGEX =\n  /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?(Z|[+-]\\d{2}:\\d{2})?$/;\nconst ISO_DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst ISO_DATE_TIME_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\n\nexport class IsoVariant extends BaseVariant<DateIso, DateTimestamp> {\n  readonly name = \"iso\";\n  readonly type = \"string\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: DateIso): DateTimestamp {\n    const date = new Date(value);\n    if (isNaN(date.getTime())) {\n      throw new Error(`Invalid ISO date: ${value}`);\n    }\n    return date.getTime();\n  }\n\n  fromBase(base: DateTimestamp): DateIso {\n    const date = new Date(base);\n    if (isNaN(date.getTime())) {\n      throw new Error(`Invalid timestamp: ${base}`);\n    }\n    return date.toISOString();\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): DateIso | null {\n    // Já é string\n    if (typeof input === \"string\") {\n      const trimmed = input.trim();\n\n      // Tenta parsear\n      const date = new Date(trimmed);\n      if (!isNaN(date.getTime())) {\n        return date.toISOString();\n      }\n\n      return null;\n    }\n\n    // Número (timestamp)\n    if (typeof input === \"number\") {\n      if (!Number.isFinite(input)) return null;\n      const date = new Date(input);\n      if (!isNaN(date.getTime())) {\n        return date.toISOString();\n      }\n      return null;\n    }\n\n    // Date object\n    if (input instanceof Date) {\n      if (isNaN(input.getTime())) return null;\n      return input.toISOString();\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: DateIso): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"string\") {\n      errors.push(\"ISO date must be a string\");\n      return { valid: false, errors };\n    }\n\n    const trimmed = value.trim();\n\n    // Verifica se é um formato ISO válido\n    if (\n      !ISO_DATE_TIME_REGEX.test(trimmed) &&\n      !ISO_DATE_ONLY_REGEX.test(trimmed)\n    ) {\n      errors.push(\"Invalid ISO 8601 format\");\n      return { valid: false, errors };\n    }\n\n    // Verifica se a data é parseável\n    const date = new Date(trimmed);\n    if (isNaN(date.getTime())) {\n      errors.push(\"Invalid date value\");\n      return { valid: false, errors };\n    }\n\n    return { valid: true, errors: [] };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: DateIso, options?: FormatOptions): string {\n    const opts = options as DateFormatOptions | undefined;\n    const date = new Date(value);\n\n    if (isNaN(date.getTime())) {\n      return \"Invalid Date\";\n    }\n\n    // Se não especificar opções, retorna o ISO string\n    if (\n      !opts ||\n      (!opts.dateStyle && !opts.timeStyle && !opts.dateOnly && !opts.timeOnly)\n    ) {\n      return value;\n    }\n\n    const locale = opts.locale || \"en-US\";\n    const formatOptions: Intl.DateTimeFormatOptions = {};\n\n    if (opts.timeZone) {\n      formatOptions.timeZone = opts.timeZone;\n    }\n\n    if (opts.dateOnly) {\n      formatOptions.dateStyle = opts.dateStyle || \"medium\";\n    } else if (opts.timeOnly) {\n      formatOptions.timeStyle = opts.timeStyle || \"medium\";\n    } else {\n      if (opts.dateStyle) formatOptions.dateStyle = opts.dateStyle;\n      if (opts.timeStyle) formatOptions.timeStyle = opts.timeStyle;\n    }\n\n    return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n  }\n}\n","/**\n * TimestampVariant - Variante base para Date\n *\n * Representa data como milissegundos desde epoch (como JavaScript Date.getTime())\n *\n * @example\n * 1733425800000 // 2024-12-05T19:30:00.000Z\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { DateTimestamp, DateFormatOptions } from \"../types\";\n\nexport class TimestampVariant extends BaseVariant<\n  DateTimestamp,\n  DateTimestamp\n> {\n  readonly name = \"timestamp\";\n  readonly type = \"number\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: DateTimestamp): DateTimestamp {\n    return value;\n  }\n\n  fromBase(base: DateTimestamp): DateTimestamp {\n    return base;\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): DateTimestamp | null {\n    // Já é número\n    if (typeof input === \"number\") {\n      if (!Number.isFinite(input)) return null;\n      return input;\n    }\n\n    // String numérica\n    if (typeof input === \"string\") {\n      const trimmed = input.trim();\n\n      // String numérica pura\n      if (/^-?\\d+$/.test(trimmed)) {\n        const num = parseInt(trimmed, 10);\n        if (Number.isFinite(num)) return num;\n      }\n\n      // Tenta parsear como ISO date\n      const date = new Date(trimmed);\n      if (!isNaN(date.getTime())) {\n        return date.getTime();\n      }\n\n      return null;\n    }\n\n    // Date object\n    if (input instanceof Date) {\n      const ts = input.getTime();\n      return isNaN(ts) ? null : ts;\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: DateTimestamp): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"number\") {\n      errors.push(\"Timestamp must be a number\");\n      return { valid: false, errors };\n    }\n\n    if (!Number.isFinite(value)) {\n      errors.push(\"Timestamp must be a finite number\");\n      return { valid: false, errors };\n    }\n\n    if (!Number.isInteger(value)) {\n      errors.push(\"Timestamp must be an integer\");\n      return { valid: false, errors };\n    }\n\n    return { valid: true, errors: [] };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: DateTimestamp, options?: FormatOptions): string {\n    const opts = options as DateFormatOptions | undefined;\n    const date = new Date(value);\n\n    if (isNaN(date.getTime())) {\n      return \"Invalid Date\";\n    }\n\n    // Se não especificar opções, retorna o timestamp como string\n    if (\n      !opts ||\n      (!opts.dateStyle && !opts.timeStyle && !opts.dateOnly && !opts.timeOnly)\n    ) {\n      return String(value);\n    }\n\n    const locale = opts.locale || \"en-US\";\n    const formatOptions: Intl.DateTimeFormatOptions = {};\n\n    if (opts.timeZone) {\n      formatOptions.timeZone = opts.timeZone;\n    }\n\n    if (opts.dateOnly) {\n      formatOptions.dateStyle = opts.dateStyle || \"medium\";\n    } else if (opts.timeOnly) {\n      formatOptions.timeStyle = opts.timeStyle || \"medium\";\n    } else {\n      if (opts.dateStyle) formatOptions.dateStyle = opts.dateStyle;\n      if (opts.timeStyle) formatOptions.timeStyle = opts.timeStyle;\n    }\n\n    return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n  }\n}\n","/**\n * EpochVariant - Variante Unix Epoch para Date\n *\n * Representa data como segundos desde epoch (Unix timestamp).\n *\n * @example\n * 1733425800 // 2024-12-05T19:30:00Z\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { DateEpoch, DateTimestamp, DateFormatOptions } from \"../types\";\n\nexport class EpochVariant extends BaseVariant<DateEpoch, DateTimestamp> {\n  readonly name = \"epoch\";\n  readonly type = \"number\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: DateEpoch): DateTimestamp {\n    // Epoch (segundos) → timestamp (milissegundos)\n    return value * 1000;\n  }\n\n  fromBase(base: DateTimestamp): DateEpoch {\n    // timestamp (milissegundos) → epoch (segundos)\n    return Math.floor(base / 1000);\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): DateEpoch | null {\n    // Já é número\n    if (typeof input === \"number\") {\n      if (!Number.isFinite(input)) return null;\n      // Se parece ser milissegundos (> 1e10), converte para segundos\n      if (Math.abs(input) > 1e11) {\n        return Math.floor(input / 1000);\n      }\n      return Math.floor(input);\n    }\n\n    // String numérica\n    if (typeof input === \"string\") {\n      const trimmed = input.trim();\n\n      // String numérica pura\n      if (/^-?\\d+$/.test(trimmed)) {\n        const num = parseInt(trimmed, 10);\n        if (Number.isFinite(num)) {\n          // Se parece ser milissegundos (> 1e10), converte para segundos\n          if (Math.abs(num) > 1e11) {\n            return Math.floor(num / 1000);\n          }\n          return num;\n        }\n      }\n\n      // Tenta parsear como ISO date e converter\n      const date = new Date(trimmed);\n      if (!isNaN(date.getTime())) {\n        return Math.floor(date.getTime() / 1000);\n      }\n\n      return null;\n    }\n\n    // Date object\n    if (input instanceof Date) {\n      const ts = input.getTime();\n      return isNaN(ts) ? null : Math.floor(ts / 1000);\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: DateEpoch): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"number\") {\n      errors.push(\"Epoch must be a number\");\n      return { valid: false, errors };\n    }\n\n    if (!Number.isFinite(value)) {\n      errors.push(\"Epoch must be a finite number\");\n      return { valid: false, errors };\n    }\n\n    if (!Number.isInteger(value)) {\n      errors.push(\"Epoch must be an integer\");\n      return { valid: false, errors };\n    }\n\n    return { valid: true, errors: [] };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: DateEpoch, options?: FormatOptions): string {\n    const opts = options as DateFormatOptions | undefined;\n    const date = new Date(value * 1000);\n\n    if (isNaN(date.getTime())) {\n      return \"Invalid Date\";\n    }\n\n    // Se não especificar opções, retorna o epoch como string\n    if (\n      !opts ||\n      (!opts.dateStyle && !opts.timeStyle && !opts.dateOnly && !opts.timeOnly)\n    ) {\n      return String(value);\n    }\n\n    const locale = opts.locale || \"en-US\";\n    const formatOptions: Intl.DateTimeFormatOptions = {};\n\n    if (opts.timeZone) {\n      formatOptions.timeZone = opts.timeZone;\n    }\n\n    if (opts.dateOnly) {\n      formatOptions.dateStyle = opts.dateStyle || \"medium\";\n    } else if (opts.timeOnly) {\n      formatOptions.timeStyle = opts.timeStyle || \"medium\";\n    } else {\n      if (opts.dateStyle) formatOptions.dateStyle = opts.dateStyle;\n      if (opts.timeStyle) formatOptions.timeStyle = opts.timeStyle;\n    }\n\n    return new Intl.DateTimeFormat(locale, formatOptions).format(date);\n  }\n}\n","/**\n * DateRole - Role para conversão e manipulação de datas\n *\n * ComplexRole com 3 variantes:\n * - iso: string ISO 8601 (\"2024-12-05T19:30:00.000Z\")\n * - timestamp: number em milissegundos (1733425800000)\n * - epoch: number em segundos (1733425800)\n *\n * @example\n * const date = new DateRole();\n * date.convert('iso', 'epoch', '2024-12-05T19:30:00.000Z')  // 1733425800\n * date.convert('epoch', 'iso', 1733425800)                  // '2024-12-05T19:30:00.000Z'\n * date.cast('iso', '2024-12-05')                            // '2024-12-05T00:00:00.000Z'\n * date.format('iso', '2024-12-05T19:30:00.000Z', { dateStyle: 'full', locale: 'pt-BR' })\n */\n\nimport { ComplexRole } from \"../../contracts\";\nimport type { IVariant } from \"../../contracts\";\nimport type { DateTimestamp, DateFormatOptions } from \"./types\";\nimport { IsoVariant, TimestampVariant, EpochVariant } from \"./variants\";\n\n// =============================================================================\n// DATE ROLE CLASS\n// =============================================================================\n\nexport class DateRole extends ComplexRole<DateTimestamp> {\n  readonly name = \"date\";\n  readonly base = \"timestamp\";\n\n  protected createVariants(): Record<string, IVariant<unknown, DateTimestamp>> {\n    return {\n      iso: new IsoVariant(),\n      timestamp: new TimestampVariant(),\n      epoch: new EpochVariant(),\n    };\n  }\n\n  /**\n   * Override format to accept DateFormatOptions\n   */\n  format(variant: string, value: unknown, options?: DateFormatOptions): string {\n    return super.format(variant, value, options);\n  }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da DateRole */\nexport const dateRole = new DateRole();\n","/**\n * VolumeRole - Role para conversão de unidades de volume\n *\n * Implementa os 4 pilares via SimpleRole base class.\n * Para uso funcional, prefira importar dos pilares diretamente.\n *\n * @example\n * // OOP style\n * import { volumeRole } from '@attrx/role-morphic/volume';\n * volumeRole.convert('gallon_us', 'liter', 1);  // 3.785411784\n *\n * // Functional style (preferido)\n * import { convertVolume } from '@attrx/role-morphic/volume/convert';\n * convertVolume('gallon_us', 'liter', 1);  // 3.785411784\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { VOLUME_UNITS, VOLUME_ALIASES } from \"./constants\";\n\n// =============================================================================\n// VOLUME ROLE CLASS\n// =============================================================================\n\nexport class VolumeRole extends SimpleRole {\n  readonly name = \"volume\";\n  readonly base = \"liter\";\n  readonly units = VOLUME_UNITS;\n  readonly aliases = VOLUME_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Volume cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da VolumeRole */\nexport const volumeRole = new VolumeRole();\n","/**\n * TimeRole - Role para conversão de unidades de tempo/duração\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const time = new TimeRole();\n * time.convert('hour', 'minute', 1)    // 60\n * time.cast('second', '5 min')         // 300\n * time.validate('second', 100)         // { valid: true, errors: [] }\n * time.format('hour', 2.5)             // \"2.5 h\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { TIME_UNITS, TIME_ALIASES } from \"./constants\";\n\n// =============================================================================\n// TIME ROLE CLASS\n// =============================================================================\n\nexport class TimeRole extends SimpleRole {\n  readonly name = \"time\";\n  readonly base = \"second\";\n  readonly units = TIME_UNITS;\n  readonly aliases = TIME_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Duration cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da TimeRole */\nexport const timeRole = new TimeRole();\n","/**\n * DigitalRole - Role para conversão de unidades de armazenamento digital\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * Suporta AMBOS os sistemas:\n * - IEC (binário): KiB, MiB, GiB, TiB (base 1024)\n * - SI (decimal): kB, MB, GB, TB (base 1000)\n *\n * @example\n * const digital = new DigitalRole();\n * digital.convert('gibibyte', 'megabyte', 1)  // 1073.741824\n * digital.cast('megabyte', '500 MB')          // 500\n * digital.validate('megabyte', 100)           // { valid: true, errors: [] }\n * digital.format('gibibyte', 1.5)             // \"1.5 GiB\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { DIGITAL_UNITS, DIGITAL_ALIASES } from \"./constants\";\n\n// =============================================================================\n// DIGITAL ROLE CLASS\n// =============================================================================\n\nexport class DigitalRole extends SimpleRole {\n  readonly name = \"digital\";\n  readonly base = \"byte\";\n  readonly units = DIGITAL_UNITS;\n  readonly aliases = DIGITAL_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Digital storage cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da DigitalRole */\nexport const digitalRole = new DigitalRole();\n","/**\n * FrequencyRole - Role para conversão de unidades de frequência\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const freq = new FrequencyRole();\n * freq.convert('megahertz', 'hertz', 1)     // 1000000\n * freq.convert('rpm', 'hertz', 60)          // 1\n * freq.cast('hertz', '100 Hz')              // 100\n * freq.validate('hertz', 100)               // { valid: true, errors: [] }\n * freq.format('megahertz', 2.4)             // \"2.4 MHz\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { FREQUENCY_UNITS, FREQUENCY_ALIASES } from \"./constants\";\n\n// =============================================================================\n// FREQUENCY ROLE CLASS\n// =============================================================================\n\nexport class FrequencyRole extends SimpleRole {\n  readonly name = \"frequency\";\n  readonly base = \"hertz\";\n  readonly units = FREQUENCY_UNITS;\n  readonly aliases = FREQUENCY_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Frequency cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da FrequencyRole */\nexport const frequencyRole = new FrequencyRole();\n","/**\n * PressureRole - Role para conversão de unidades de pressão\n *\n * Implementa os 4 pilares: Convert, Cast, Validate, Format\n *\n * @example\n * const pressure = new PressureRole();\n * pressure.convert('bar', 'pascal', 1)        // 100000\n * pressure.convert('atmosphere', 'psi', 1)    // 14.696\n * pressure.cast('pascal', '100 Pa')           // 100\n * pressure.validate('pascal', 100)            // { valid: true, errors: [] }\n * pressure.format('bar', 1.5)                 // \"1.5 bar\"\n */\n\nimport { SimpleRole, type SimpleValidationConfig } from \"../../contracts\";\nimport { PRESSURE_UNITS, PRESSURE_ALIASES } from \"./constants\";\n\n// =============================================================================\n// PRESSURE ROLE CLASS\n// =============================================================================\n\nexport class PressureRole extends SimpleRole {\n  readonly name = \"pressure\";\n  readonly base = \"pascal\";\n  readonly units = PRESSURE_UNITS;\n  readonly aliases = PRESSURE_ALIASES;\n\n  readonly validation: SimpleValidationConfig = {\n    min: 0,\n    minError: \"Pressure cannot be negative\",\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da PressureRole */\nexport const pressureRole = new PressureRole();\n","/**\n * HexVariant - Variante Hexadecimal para Color\n *\n * Representa cor como string hexadecimal.\n *\n * @example\n * \"#ff0000\"     // RGB (6 chars)\n * \"#ff0000ff\"   // RGBA (8 chars)\n * \"#f00\"        // RGB shorthand (3 chars)\n * \"#f00f\"       // RGBA shorthand (4 chars)\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorHex, ColorFormatOptions } from \"../types\";\nimport {\n  NAMED_COLORS,\n  normalizeRgbChannel,\n  normalizeAlpha,\n  hslToRgb,\n} from \"../types\";\n\n// Regex patterns\nconst HEX_REGEX_3 = /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i;\nconst HEX_REGEX_4 = /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])$/i;\nconst HEX_REGEX_6 = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\nconst HEX_REGEX_8 = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\n\nexport class HexVariant extends BaseVariant<ColorHex, RGBA> {\n  readonly name = \"hex\";\n  readonly type = \"string\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: ColorHex): RGBA {\n    const hex = value.trim();\n\n    // Try 8-char hex (#rrggbbaa)\n    let match = hex.match(HEX_REGEX_8);\n    if (match) {\n      return {\n        r: parseInt(match[1], 16),\n        g: parseInt(match[2], 16),\n        b: parseInt(match[3], 16),\n        a: parseInt(match[4], 16) / 255,\n      };\n    }\n\n    // Try 6-char hex (#rrggbb)\n    match = hex.match(HEX_REGEX_6);\n    if (match) {\n      return {\n        r: parseInt(match[1], 16),\n        g: parseInt(match[2], 16),\n        b: parseInt(match[3], 16),\n        a: 1,\n      };\n    }\n\n    // Try 4-char hex (#rgba)\n    match = hex.match(HEX_REGEX_4);\n    if (match) {\n      return {\n        r: parseInt(match[1] + match[1], 16),\n        g: parseInt(match[2] + match[2], 16),\n        b: parseInt(match[3] + match[3], 16),\n        a: parseInt(match[4] + match[4], 16) / 255,\n      };\n    }\n\n    // Try 3-char hex (#rgb)\n    match = hex.match(HEX_REGEX_3);\n    if (match) {\n      return {\n        r: parseInt(match[1] + match[1], 16),\n        g: parseInt(match[2] + match[2], 16),\n        b: parseInt(match[3] + match[3], 16),\n        a: 1,\n      };\n    }\n\n    throw new Error(`Invalid hex color: ${value}`);\n  }\n\n  fromBase(base: RGBA): ColorHex {\n    const r = normalizeRgbChannel(base.r).toString(16).padStart(2, \"0\");\n    const g = normalizeRgbChannel(base.g).toString(16).padStart(2, \"0\");\n    const b = normalizeRgbChannel(base.b).toString(16).padStart(2, \"0\");\n\n    const alpha = normalizeAlpha(base.a);\n\n    // Include alpha only if not fully opaque\n    if (alpha < 1) {\n      const a = Math.round(alpha * 255)\n        .toString(16)\n        .padStart(2, \"0\");\n      return `#${r}${g}${b}${a}`;\n    }\n\n    return `#${r}${g}${b}`;\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): ColorHex | null {\n    // Already a string\n    if (typeof input === \"string\") {\n      const trimmed = input.trim().toLowerCase();\n\n      // Named color\n      if (NAMED_COLORS[trimmed]) {\n        return this.fromBase(NAMED_COLORS[trimmed]);\n      }\n\n      // Hex format (with or without #)\n      if (\n        HEX_REGEX_8.test(trimmed) ||\n        HEX_REGEX_6.test(trimmed) ||\n        HEX_REGEX_4.test(trimmed) ||\n        HEX_REGEX_3.test(trimmed)\n      ) {\n        // Normalize to #rrggbb or #rrggbbaa\n        try {\n          const rgba = this.toBase(trimmed);\n          return this.fromBase(rgba);\n        } catch {\n          return null;\n        }\n      }\n\n      // Try rgb()/rgba() string\n      const rgbMatch = trimmed.match(\n        /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (rgbMatch) {\n        const rgba: RGBA = {\n          r: parseInt(rgbMatch[1], 10),\n          g: parseInt(rgbMatch[2], 10),\n          b: parseInt(rgbMatch[3], 10),\n          a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n        };\n        return this.fromBase(rgba);\n      }\n\n      // Try hsl()/hsla() string\n      const hslMatch = trimmed.match(\n        /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (hslMatch) {\n        const rgb = hslToRgb(\n          parseInt(hslMatch[1], 10),\n          parseInt(hslMatch[2], 10),\n          parseInt(hslMatch[3], 10),\n        );\n        const rgba: RGBA = {\n          ...rgb,\n          a: hslMatch[4] ? parseFloat(hslMatch[4]) : 1,\n        };\n        return this.fromBase(rgba);\n      }\n\n      return null;\n    }\n\n    // Object with r, g, b properties\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"r\" in input &&\n      \"g\" in input &&\n      \"b\" in input\n    ) {\n      const obj = input as { r: number; g: number; b: number; a?: number };\n      const rgba: RGBA = {\n        r: obj.r,\n        g: obj.g,\n        b: obj.b,\n        a: obj.a ?? 1,\n      };\n      return this.fromBase(rgba);\n    }\n\n    // Object with h, s, l properties\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"h\" in input &&\n      \"s\" in input &&\n      \"l\" in input\n    ) {\n      const obj = input as { h: number; s: number; l: number; a?: number };\n      const rgb = hslToRgb(obj.h, obj.s, obj.l);\n      const rgba: RGBA = {\n        ...rgb,\n        a: obj.a ?? 1,\n      };\n      return this.fromBase(rgba);\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: ColorHex): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"string\") {\n      errors.push(\"Hex color must be a string\");\n      return { valid: false, errors };\n    }\n\n    const hex = value.trim();\n\n    if (\n      !HEX_REGEX_8.test(hex) &&\n      !HEX_REGEX_6.test(hex) &&\n      !HEX_REGEX_4.test(hex) &&\n      !HEX_REGEX_3.test(hex)\n    ) {\n      errors.push(\"Invalid hex format. Use #rgb, #rgba, #rrggbb, or #rrggbbaa\");\n      return { valid: false, errors };\n    }\n\n    return { valid: true, errors: [] };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: ColorHex, options?: FormatOptions): string {\n    const opts = options as ColorFormatOptions | undefined;\n\n    try {\n      const rgba = this.toBase(value);\n      let hex = this.fromBase(rgba);\n\n      // Uppercase\n      if (opts?.uppercase) {\n        hex = hex.toUpperCase();\n      }\n\n      // Include alpha even if 1\n      if (opts?.includeAlpha && rgba.a === 1) {\n        const a = \"ff\";\n        hex = hex.length === 7 ? `${hex}${opts.uppercase ? \"FF\" : \"ff\"}` : hex;\n      }\n\n      // Compact (shorthand if possible)\n      if (opts?.compact && hex.length === 7) {\n        const canShorten =\n          hex[1] === hex[2] && hex[3] === hex[4] && hex[5] === hex[6];\n        if (canShorten) {\n          hex = `#${hex[1]}${hex[3]}${hex[5]}`;\n          if (opts.uppercase) hex = hex.toUpperCase();\n        }\n      }\n\n      return hex;\n    } catch {\n      return value;\n    }\n  }\n}\n","/**\n * RgbObjectVariant - Variante RGB Object para Color\n *\n * Representa cor como objeto { r, g, b, a? }\n *\n * @example\n * { r: 255, g: 0, b: 0 }\n * { r: 255, g: 0, b: 0, a: 0.5 }\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorRgbObject, ColorFormatOptions } from \"../types\";\nimport {\n  NAMED_COLORS,\n  normalizeRgbChannel,\n  normalizeAlpha,\n  hslToRgb,\n} from \"../types\";\n\nexport class RgbObjectVariant extends BaseVariant<ColorRgbObject, RGBA> {\n  readonly name = \"rgb_object\";\n  readonly type = \"object\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: ColorRgbObject): RGBA {\n    return {\n      r: normalizeRgbChannel(value.r),\n      g: normalizeRgbChannel(value.g),\n      b: normalizeRgbChannel(value.b),\n      a: normalizeAlpha(value.a),\n    };\n  }\n\n  fromBase(base: RGBA): ColorRgbObject {\n    const result: ColorRgbObject = {\n      r: normalizeRgbChannel(base.r),\n      g: normalizeRgbChannel(base.g),\n      b: normalizeRgbChannel(base.b),\n    };\n\n    // Only include alpha if not 1\n    if (base.a !== undefined && base.a < 1) {\n      result.a = normalizeAlpha(base.a);\n    }\n\n    return result;\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): ColorRgbObject | null {\n    // Already an RGB object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"r\" in input &&\n      \"g\" in input &&\n      \"b\" in input\n    ) {\n      const obj = input as { r: unknown; g: unknown; b: unknown; a?: unknown };\n\n      if (\n        typeof obj.r !== \"number\" ||\n        typeof obj.g !== \"number\" ||\n        typeof obj.b !== \"number\"\n      ) {\n        return null;\n      }\n\n      return this.fromBase({\n        r: obj.r,\n        g: obj.g,\n        b: obj.b,\n        a: typeof obj.a === \"number\" ? obj.a : 1,\n      });\n    }\n\n    // HSL object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"h\" in input &&\n      \"s\" in input &&\n      \"l\" in input\n    ) {\n      const obj = input as { h: number; s: number; l: number; a?: number };\n      const rgb = hslToRgb(obj.h, obj.s, obj.l);\n      return this.fromBase({\n        ...rgb,\n        a: obj.a ?? 1,\n      });\n    }\n\n    // String formats\n    if (typeof input === \"string\") {\n      const trimmed = input.trim().toLowerCase();\n\n      // Named color\n      if (NAMED_COLORS[trimmed]) {\n        return this.fromBase(NAMED_COLORS[trimmed]);\n      }\n\n      // Hex format\n      const hexMatch = trimmed.match(\n        /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n      );\n      if (hexMatch) {\n        return this.fromBase({\n          r: parseInt(hexMatch[1], 16),\n          g: parseInt(hexMatch[2], 16),\n          b: parseInt(hexMatch[3], 16),\n          a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n        });\n      }\n\n      // Shorthand hex\n      const hexShortMatch = trimmed.match(\n        /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n      );\n      if (hexShortMatch) {\n        return this.fromBase({\n          r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n          g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n          b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n          a: hexShortMatch[4]\n            ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n            : 1,\n        });\n      }\n\n      // rgb()/rgba() string\n      const rgbMatch = trimmed.match(\n        /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (rgbMatch) {\n        return this.fromBase({\n          r: parseInt(rgbMatch[1], 10),\n          g: parseInt(rgbMatch[2], 10),\n          b: parseInt(rgbMatch[3], 10),\n          a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n        });\n      }\n\n      // hsl()/hsla() string\n      const hslMatch = trimmed.match(\n        /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (hslMatch) {\n        const rgb = hslToRgb(\n          parseInt(hslMatch[1], 10),\n          parseInt(hslMatch[2], 10),\n          parseInt(hslMatch[3], 10),\n        );\n        return this.fromBase({\n          ...rgb,\n          a: hslMatch[4] ? parseFloat(hslMatch[4]) : 1,\n        });\n      }\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: ColorRgbObject): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"object\" || value === null) {\n      errors.push(\"RGB color must be an object\");\n      return { valid: false, errors };\n    }\n\n    if (!(\"r\" in value) || !(\"g\" in value) || !(\"b\" in value)) {\n      errors.push(\"RGB color must have r, g, b properties\");\n      return { valid: false, errors };\n    }\n\n    if (\n      typeof value.r !== \"number\" ||\n      typeof value.g !== \"number\" ||\n      typeof value.b !== \"number\"\n    ) {\n      errors.push(\"r, g, b must be numbers\");\n      return { valid: false, errors };\n    }\n\n    if (value.r < 0 || value.r > 255) {\n      errors.push(\"r must be between 0 and 255\");\n    }\n    if (value.g < 0 || value.g > 255) {\n      errors.push(\"g must be between 0 and 255\");\n    }\n    if (value.b < 0 || value.b > 255) {\n      errors.push(\"b must be between 0 and 255\");\n    }\n\n    if (value.a !== undefined) {\n      if (typeof value.a !== \"number\") {\n        errors.push(\"a must be a number\");\n      } else if (value.a < 0 || value.a > 1) {\n        errors.push(\"a must be between 0 and 1\");\n      }\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: ColorRgbObject, options?: FormatOptions): string {\n    const opts = options as ColorFormatOptions | undefined;\n    const rgba = this.toBase(value);\n\n    const r = rgba.r;\n    const g = rgba.g;\n    const b = rgba.b;\n    const a = rgba.a;\n\n    if (opts?.includeAlpha || a < 1) {\n      if (opts?.compact) {\n        return `rgba(${r},${g},${b},${a})`;\n      }\n      return `rgba(${r}, ${g}, ${b}, ${a})`;\n    }\n\n    if (opts?.compact) {\n      return `rgb(${r},${g},${b})`;\n    }\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n}\n","/**\n * RgbStringVariant - Variante RGB String para Color\n *\n * Representa cor como string rgb()/rgba()\n *\n * @example\n * \"rgb(255, 0, 0)\"\n * \"rgba(255, 0, 0, 0.5)\"\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorRgbString, ColorFormatOptions } from \"../types\";\nimport {\n  NAMED_COLORS,\n  normalizeRgbChannel,\n  normalizeAlpha,\n  hslToRgb,\n} from \"../types\";\n\n// Regex patterns\nconst RGB_REGEX = /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i;\nconst RGBA_REGEX =\n  /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d.]+)\\s*\\)$/i;\n\nexport class RgbStringVariant extends BaseVariant<ColorRgbString, RGBA> {\n  readonly name = \"rgb_string\";\n  readonly type = \"string\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: ColorRgbString): RGBA {\n    const str = value.trim();\n\n    // Try rgba() first\n    let match = str.match(RGBA_REGEX);\n    if (match) {\n      return {\n        r: normalizeRgbChannel(parseInt(match[1], 10)),\n        g: normalizeRgbChannel(parseInt(match[2], 10)),\n        b: normalizeRgbChannel(parseInt(match[3], 10)),\n        a: normalizeAlpha(parseFloat(match[4])),\n      };\n    }\n\n    // Try rgb()\n    match = str.match(RGB_REGEX);\n    if (match) {\n      return {\n        r: normalizeRgbChannel(parseInt(match[1], 10)),\n        g: normalizeRgbChannel(parseInt(match[2], 10)),\n        b: normalizeRgbChannel(parseInt(match[3], 10)),\n        a: 1,\n      };\n    }\n\n    throw new Error(`Invalid rgb string: ${value}`);\n  }\n\n  fromBase(base: RGBA): ColorRgbString {\n    const r = normalizeRgbChannel(base.r);\n    const g = normalizeRgbChannel(base.g);\n    const b = normalizeRgbChannel(base.b);\n    const a = normalizeAlpha(base.a);\n\n    if (a < 1) {\n      return `rgba(${r}, ${g}, ${b}, ${a})`;\n    }\n\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): ColorRgbString | null {\n    // Already a string\n    if (typeof input === \"string\") {\n      const trimmed = input.trim().toLowerCase();\n\n      // Named color\n      if (NAMED_COLORS[trimmed]) {\n        return this.fromBase(NAMED_COLORS[trimmed]);\n      }\n\n      // Already rgb/rgba format\n      if (RGB_REGEX.test(trimmed) || RGBA_REGEX.test(trimmed)) {\n        try {\n          const rgba = this.toBase(trimmed);\n          return this.fromBase(rgba);\n        } catch {\n          return null;\n        }\n      }\n\n      // Hex format\n      const hexMatch = trimmed.match(\n        /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n      );\n      if (hexMatch) {\n        return this.fromBase({\n          r: parseInt(hexMatch[1], 16),\n          g: parseInt(hexMatch[2], 16),\n          b: parseInt(hexMatch[3], 16),\n          a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n        });\n      }\n\n      // Shorthand hex\n      const hexShortMatch = trimmed.match(\n        /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n      );\n      if (hexShortMatch) {\n        return this.fromBase({\n          r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n          g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n          b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n          a: hexShortMatch[4]\n            ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n            : 1,\n        });\n      }\n\n      // hsl()/hsla() string\n      const hslMatch = trimmed.match(\n        /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (hslMatch) {\n        const rgb = hslToRgb(\n          parseInt(hslMatch[1], 10),\n          parseInt(hslMatch[2], 10),\n          parseInt(hslMatch[3], 10),\n        );\n        return this.fromBase({\n          ...rgb,\n          a: hslMatch[4] ? parseFloat(hslMatch[4]) : 1,\n        });\n      }\n\n      return null;\n    }\n\n    // RGB object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"r\" in input &&\n      \"g\" in input &&\n      \"b\" in input\n    ) {\n      const obj = input as { r: number; g: number; b: number; a?: number };\n      return this.fromBase({\n        r: obj.r,\n        g: obj.g,\n        b: obj.b,\n        a: obj.a ?? 1,\n      });\n    }\n\n    // HSL object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"h\" in input &&\n      \"s\" in input &&\n      \"l\" in input\n    ) {\n      const obj = input as { h: number; s: number; l: number; a?: number };\n      const rgb = hslToRgb(obj.h, obj.s, obj.l);\n      return this.fromBase({\n        ...rgb,\n        a: obj.a ?? 1,\n      });\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: ColorRgbString): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"string\") {\n      errors.push(\"RGB string must be a string\");\n      return { valid: false, errors };\n    }\n\n    const str = value.trim();\n\n    if (!RGB_REGEX.test(str) && !RGBA_REGEX.test(str)) {\n      errors.push('Invalid format. Use \"rgb(r, g, b)\" or \"rgba(r, g, b, a)\"');\n      return { valid: false, errors };\n    }\n\n    // Parse and validate values\n    try {\n      const rgba = this.toBase(value);\n\n      if (rgba.r < 0 || rgba.r > 255) {\n        errors.push(\"Red value must be between 0 and 255\");\n      }\n      if (rgba.g < 0 || rgba.g > 255) {\n        errors.push(\"Green value must be between 0 and 255\");\n      }\n      if (rgba.b < 0 || rgba.b > 255) {\n        errors.push(\"Blue value must be between 0 and 255\");\n      }\n      if (rgba.a < 0 || rgba.a > 1) {\n        errors.push(\"Alpha value must be between 0 and 1\");\n      }\n    } catch {\n      errors.push(\"Invalid RGB string format\");\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: ColorRgbString, options?: FormatOptions): string {\n    const opts = options as ColorFormatOptions | undefined;\n\n    try {\n      const rgba = this.toBase(value);\n      const r = rgba.r;\n      const g = rgba.g;\n      const b = rgba.b;\n      const a = rgba.a;\n\n      if (opts?.includeAlpha || a < 1) {\n        if (opts?.compact) {\n          return `rgba(${r},${g},${b},${a})`;\n        }\n        return `rgba(${r}, ${g}, ${b}, ${a})`;\n      }\n\n      if (opts?.compact) {\n        return `rgb(${r},${g},${b})`;\n      }\n      return `rgb(${r}, ${g}, ${b})`;\n    } catch {\n      return value;\n    }\n  }\n}\n","/**\n * HslObjectVariant - Variante HSL Object para Color\n *\n * Representa cor como objeto { h, s, l, a? }\n *\n * @example\n * { h: 0, s: 100, l: 50 }        // Red\n * { h: 0, s: 100, l: 50, a: 0.5 } // Semi-transparent red\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorHslObject, ColorFormatOptions } from \"../types\";\nimport {\n  NAMED_COLORS,\n  normalizeAlpha,\n  rgbToHsl,\n  hslToRgb,\n  clamp,\n} from \"../types\";\n\nexport class HslObjectVariant extends BaseVariant<ColorHslObject, RGBA> {\n  readonly name = \"hsl_object\";\n  readonly type = \"object\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: ColorHslObject): RGBA {\n    const h = clamp(value.h, 0, 360);\n    const s = clamp(value.s, 0, 100);\n    const l = clamp(value.l, 0, 100);\n    const a = normalizeAlpha(value.a);\n\n    const rgb = hslToRgb(h, s, l);\n\n    return {\n      r: rgb.r,\n      g: rgb.g,\n      b: rgb.b,\n      a,\n    };\n  }\n\n  fromBase(base: RGBA): ColorHslObject {\n    const hsl = rgbToHsl(base.r, base.g, base.b);\n\n    const result: ColorHslObject = {\n      h: hsl.h,\n      s: hsl.s,\n      l: hsl.l,\n    };\n\n    // Only include alpha if not 1\n    if (base.a !== undefined && base.a < 1) {\n      result.a = normalizeAlpha(base.a);\n    }\n\n    return result;\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): ColorHslObject | null {\n    // Already an HSL object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"h\" in input &&\n      \"s\" in input &&\n      \"l\" in input\n    ) {\n      const obj = input as { h: unknown; s: unknown; l: unknown; a?: unknown };\n\n      if (\n        typeof obj.h !== \"number\" ||\n        typeof obj.s !== \"number\" ||\n        typeof obj.l !== \"number\"\n      ) {\n        return null;\n      }\n\n      const result: ColorHslObject = {\n        h: clamp(Math.round(obj.h), 0, 360),\n        s: clamp(Math.round(obj.s), 0, 100),\n        l: clamp(Math.round(obj.l), 0, 100),\n      };\n\n      if (typeof obj.a === \"number\") {\n        result.a = normalizeAlpha(obj.a);\n      }\n\n      return result;\n    }\n\n    // RGB object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"r\" in input &&\n      \"g\" in input &&\n      \"b\" in input\n    ) {\n      const obj = input as { r: number; g: number; b: number; a?: number };\n      return this.fromBase({\n        r: obj.r,\n        g: obj.g,\n        b: obj.b,\n        a: obj.a ?? 1,\n      });\n    }\n\n    // String formats\n    if (typeof input === \"string\") {\n      const trimmed = input.trim().toLowerCase();\n\n      // Named color\n      if (NAMED_COLORS[trimmed]) {\n        return this.fromBase(NAMED_COLORS[trimmed]);\n      }\n\n      // Hex format\n      const hexMatch = trimmed.match(\n        /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n      );\n      if (hexMatch) {\n        return this.fromBase({\n          r: parseInt(hexMatch[1], 16),\n          g: parseInt(hexMatch[2], 16),\n          b: parseInt(hexMatch[3], 16),\n          a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n        });\n      }\n\n      // Shorthand hex\n      const hexShortMatch = trimmed.match(\n        /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n      );\n      if (hexShortMatch) {\n        return this.fromBase({\n          r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n          g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n          b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n          a: hexShortMatch[4]\n            ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n            : 1,\n        });\n      }\n\n      // rgb()/rgba() string\n      const rgbMatch = trimmed.match(\n        /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (rgbMatch) {\n        return this.fromBase({\n          r: parseInt(rgbMatch[1], 10),\n          g: parseInt(rgbMatch[2], 10),\n          b: parseInt(rgbMatch[3], 10),\n          a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n        });\n      }\n\n      // hsl()/hsla() string\n      const hslMatch = trimmed.match(\n        /^hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (hslMatch) {\n        const result: ColorHslObject = {\n          h: clamp(parseInt(hslMatch[1], 10), 0, 360),\n          s: clamp(parseInt(hslMatch[2], 10), 0, 100),\n          l: clamp(parseInt(hslMatch[3], 10), 0, 100),\n        };\n        if (hslMatch[4]) {\n          result.a = normalizeAlpha(parseFloat(hslMatch[4]));\n        }\n        return result;\n      }\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: ColorHslObject): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"object\" || value === null) {\n      errors.push(\"HSL color must be an object\");\n      return { valid: false, errors };\n    }\n\n    if (!(\"h\" in value) || !(\"s\" in value) || !(\"l\" in value)) {\n      errors.push(\"HSL color must have h, s, l properties\");\n      return { valid: false, errors };\n    }\n\n    if (\n      typeof value.h !== \"number\" ||\n      typeof value.s !== \"number\" ||\n      typeof value.l !== \"number\"\n    ) {\n      errors.push(\"h, s, l must be numbers\");\n      return { valid: false, errors };\n    }\n\n    if (value.h < 0 || value.h > 360) {\n      errors.push(\"h (hue) must be between 0 and 360\");\n    }\n    if (value.s < 0 || value.s > 100) {\n      errors.push(\"s (saturation) must be between 0 and 100\");\n    }\n    if (value.l < 0 || value.l > 100) {\n      errors.push(\"l (lightness) must be between 0 and 100\");\n    }\n\n    if (value.a !== undefined) {\n      if (typeof value.a !== \"number\") {\n        errors.push(\"a must be a number\");\n      } else if (value.a < 0 || value.a > 1) {\n        errors.push(\"a must be between 0 and 1\");\n      }\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: ColorHslObject, options?: FormatOptions): string {\n    const opts = options as ColorFormatOptions | undefined;\n\n    const h = clamp(Math.round(value.h), 0, 360);\n    const s = clamp(Math.round(value.s), 0, 100);\n    const l = clamp(Math.round(value.l), 0, 100);\n    const a = value.a !== undefined ? normalizeAlpha(value.a) : 1;\n\n    if (opts?.includeAlpha || a < 1) {\n      if (opts?.compact) {\n        return `hsla(${h},${s}%,${l}%,${a})`;\n      }\n      return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n    }\n\n    if (opts?.compact) {\n      return `hsl(${h},${s}%,${l}%)`;\n    }\n    return `hsl(${h}, ${s}%, ${l}%)`;\n  }\n}\n","/**\n * HslStringVariant - Variante HSL String para Color\n *\n * Representa cor como string hsl()/hsla()\n *\n * @example\n * \"hsl(0, 100%, 50%)\"\n * \"hsla(0, 100%, 50%, 0.5)\"\n */\n\nimport { BaseVariant } from \"../../../contracts\";\nimport type { ValidationResult, FormatOptions } from \"../../../types\";\nimport type { RGBA, ColorHslString, ColorFormatOptions } from \"../types\";\nimport {\n  NAMED_COLORS,\n  normalizeAlpha,\n  rgbToHsl,\n  hslToRgb,\n  clamp,\n} from \"../types\";\n\n// Regex patterns\nconst HSL_REGEX = /^hsl\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)$/i;\nconst HSLA_REGEX =\n  /^hsla\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*,\\s*([\\d.]+)\\s*\\)$/i;\n\nexport class HslStringVariant extends BaseVariant<ColorHslString, RGBA> {\n  readonly name = \"hsl_string\";\n  readonly type = \"string\" as const;\n\n  // ===========================================================================\n  // CONVERT\n  // ===========================================================================\n\n  toBase(value: ColorHslString): RGBA {\n    const str = value.trim();\n\n    // Try hsla() first\n    let match = str.match(HSLA_REGEX);\n    if (match) {\n      const h = clamp(parseInt(match[1], 10), 0, 360);\n      const s = clamp(parseInt(match[2], 10), 0, 100);\n      const l = clamp(parseInt(match[3], 10), 0, 100);\n      const a = normalizeAlpha(parseFloat(match[4]));\n\n      const rgb = hslToRgb(h, s, l);\n      return { ...rgb, a };\n    }\n\n    // Try hsl()\n    match = str.match(HSL_REGEX);\n    if (match) {\n      const h = clamp(parseInt(match[1], 10), 0, 360);\n      const s = clamp(parseInt(match[2], 10), 0, 100);\n      const l = clamp(parseInt(match[3], 10), 0, 100);\n\n      const rgb = hslToRgb(h, s, l);\n      return { ...rgb, a: 1 };\n    }\n\n    throw new Error(`Invalid hsl string: ${value}`);\n  }\n\n  fromBase(base: RGBA): ColorHslString {\n    const hsl = rgbToHsl(base.r, base.g, base.b);\n    const a = normalizeAlpha(base.a);\n\n    if (a < 1) {\n      return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${a})`;\n    }\n\n    return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n  }\n\n  // ===========================================================================\n  // CAST\n  // ===========================================================================\n\n  cast(input: unknown): ColorHslString | null {\n    // Already a string\n    if (typeof input === \"string\") {\n      const trimmed = input.trim().toLowerCase();\n\n      // Named color\n      if (NAMED_COLORS[trimmed]) {\n        return this.fromBase(NAMED_COLORS[trimmed]);\n      }\n\n      // Already hsl/hsla format\n      if (HSL_REGEX.test(trimmed) || HSLA_REGEX.test(trimmed)) {\n        try {\n          const rgba = this.toBase(trimmed);\n          return this.fromBase(rgba);\n        } catch {\n          return null;\n        }\n      }\n\n      // Hex format\n      const hexMatch = trimmed.match(\n        /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,\n      );\n      if (hexMatch) {\n        return this.fromBase({\n          r: parseInt(hexMatch[1], 16),\n          g: parseInt(hexMatch[2], 16),\n          b: parseInt(hexMatch[3], 16),\n          a: hexMatch[4] ? parseInt(hexMatch[4], 16) / 255 : 1,\n        });\n      }\n\n      // Shorthand hex\n      const hexShortMatch = trimmed.match(\n        /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,\n      );\n      if (hexShortMatch) {\n        return this.fromBase({\n          r: parseInt(hexShortMatch[1] + hexShortMatch[1], 16),\n          g: parseInt(hexShortMatch[2] + hexShortMatch[2], 16),\n          b: parseInt(hexShortMatch[3] + hexShortMatch[3], 16),\n          a: hexShortMatch[4]\n            ? parseInt(hexShortMatch[4] + hexShortMatch[4], 16) / 255\n            : 1,\n        });\n      }\n\n      // rgb()/rgba() string\n      const rgbMatch = trimmed.match(\n        /^rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)$/,\n      );\n      if (rgbMatch) {\n        return this.fromBase({\n          r: parseInt(rgbMatch[1], 10),\n          g: parseInt(rgbMatch[2], 10),\n          b: parseInt(rgbMatch[3], 10),\n          a: rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1,\n        });\n      }\n\n      return null;\n    }\n\n    // RGB object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"r\" in input &&\n      \"g\" in input &&\n      \"b\" in input\n    ) {\n      const obj = input as { r: number; g: number; b: number; a?: number };\n      return this.fromBase({\n        r: obj.r,\n        g: obj.g,\n        b: obj.b,\n        a: obj.a ?? 1,\n      });\n    }\n\n    // HSL object\n    if (\n      typeof input === \"object\" &&\n      input !== null &&\n      \"h\" in input &&\n      \"s\" in input &&\n      \"l\" in input\n    ) {\n      const obj = input as { h: number; s: number; l: number; a?: number };\n      const rgb = hslToRgb(obj.h, obj.s, obj.l);\n      return this.fromBase({\n        ...rgb,\n        a: obj.a ?? 1,\n      });\n    }\n\n    return null;\n  }\n\n  // ===========================================================================\n  // VALIDATE\n  // ===========================================================================\n\n  validate(value: ColorHslString): ValidationResult {\n    const errors: string[] = [];\n\n    if (typeof value !== \"string\") {\n      errors.push(\"HSL string must be a string\");\n      return { valid: false, errors };\n    }\n\n    const str = value.trim();\n\n    if (!HSL_REGEX.test(str) && !HSLA_REGEX.test(str)) {\n      errors.push(\n        'Invalid format. Use \"hsl(h, s%, l%)\" or \"hsla(h, s%, l%, a)\"',\n      );\n      return { valid: false, errors };\n    }\n\n    // Parse and validate values\n    try {\n      const rgba = this.toBase(value);\n\n      // Values are already clamped in toBase, but we can add warnings\n      const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n      if (hsl.h < 0 || hsl.h > 360) {\n        errors.push(\"Hue must be between 0 and 360\");\n      }\n      if (hsl.s < 0 || hsl.s > 100) {\n        errors.push(\"Saturation must be between 0 and 100\");\n      }\n      if (hsl.l < 0 || hsl.l > 100) {\n        errors.push(\"Lightness must be between 0 and 100\");\n      }\n      if (rgba.a < 0 || rgba.a > 1) {\n        errors.push(\"Alpha must be between 0 and 1\");\n      }\n    } catch {\n      errors.push(\"Invalid HSL string format\");\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  // ===========================================================================\n  // FORMAT\n  // ===========================================================================\n\n  format(value: ColorHslString, options?: FormatOptions): string {\n    const opts = options as ColorFormatOptions | undefined;\n\n    try {\n      const rgba = this.toBase(value);\n      const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n      const a = rgba.a;\n\n      if (opts?.includeAlpha || a < 1) {\n        if (opts?.compact) {\n          return `hsla(${hsl.h},${hsl.s}%,${hsl.l}%,${a})`;\n        }\n        return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${a})`;\n      }\n\n      if (opts?.compact) {\n        return `hsl(${hsl.h},${hsl.s}%,${hsl.l}%)`;\n      }\n      return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n    } catch {\n      return value;\n    }\n  }\n}\n","/**\n * ColorRole - Role para conversão e manipulação de cores\n *\n * ComplexRole com 5 variantes:\n * - hex: string hexadecimal (\"#ff0000\", \"#ff0000ff\")\n * - rgb_object: objeto { r, g, b, a? }\n * - rgb_string: string \"rgb(255, 0, 0)\" ou \"rgba(255, 0, 0, 0.5)\"\n * - hsl_object: objeto { h, s, l, a? }\n * - hsl_string: string \"hsl(0, 100%, 50%)\" ou \"hsla(0, 100%, 50%, 0.5)\"\n *\n * @example\n * const color = new ColorRole();\n * color.convert('hex', 'rgb_object', '#ff0000')  // { r: 255, g: 0, b: 0 }\n * color.convert('rgb_object', 'hsl_string', { r: 255, g: 0, b: 0 })  // \"hsl(0, 100%, 50%)\"\n * color.cast('hex', 'red')                        // '#ff0000'\n * color.format('hex', '#ff0000', { uppercase: true })  // '#FF0000'\n */\n\nimport { ComplexRole } from \"../../contracts\";\nimport type { IVariant } from \"../../contracts\";\nimport type { RGBA, ColorFormatOptions } from \"./types\";\nimport {\n  HexVariant,\n  RgbObjectVariant,\n  RgbStringVariant,\n  HslObjectVariant,\n  HslStringVariant,\n} from \"./variants\";\n\n// =============================================================================\n// COLOR ROLE CLASS\n// =============================================================================\n\nexport class ColorRole extends ComplexRole<RGBA> {\n  readonly name = \"color\";\n  readonly base = \"rgb_object\";\n\n  protected createVariants(): Record<string, IVariant<unknown, RGBA>> {\n    return {\n      hex: new HexVariant(),\n      rgb_object: new RgbObjectVariant(),\n      rgb_string: new RgbStringVariant(),\n      hsl_object: new HslObjectVariant(),\n      hsl_string: new HslStringVariant(),\n    };\n  }\n\n  /**\n   * Override format to accept ColorFormatOptions\n   */\n  format(variant: string, value: unknown, options?: ColorFormatOptions): string {\n    return super.format(variant, value, options);\n  }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da ColorRole */\nexport const colorRole = new ColorRole();\n","/**\n * CurrencyRole - Role para valores monetários\n *\n * IMPORTANTE: Currency é diferente das outras roles!\n * - NÃO tem convert (conversão entre moedas é operação de negócio)\n * - O tipo de moeda (BRL, USD) é METADATA, não variante\n * - Apenas 3 pilares: validate, cast, format\n *\n * @example\n * // Functional style (preferido)\n * import { validateCurrency, castCurrency, formatCurrency } from '@attrx/role-morphic/currency';\n *\n * validateCurrency(100.50);                      // { valid: true, errors: [] }\n * castCurrency('R$ 1.500,50');                   // 1500.50\n * formatCurrency(1500.50, { currency: 'BRL' }); // \"R$ 1.500,50\"\n */\n\nimport { validateCurrency, type CurrencyValidationConfig } from \"./validate\";\nimport { castCurrency, tryCastCurrency } from \"./cast\";\nimport { formatCurrency, type CurrencyFormatOptions } from \"./format\";\nimport { CURRENCY_CONFIGS, type CurrencyCode } from \"./constants\";\n\n// =============================================================================\n// CURRENCY ROLE CLASS\n// =============================================================================\n\n/**\n * CurrencyRole - classe wrapper para os 3 pilares\n *\n * Nota: Currency não estende SimpleRole porque não tem convert.\n * É uma role especial com apenas validate, cast e format.\n */\nexport class CurrencyRole {\n  readonly name = \"currency\";\n\n  /**\n   * Valida um valor monetário\n   */\n  validate(\n    value: unknown,\n    config?: CurrencyValidationConfig\n  ): { valid: boolean; errors: string[] } {\n    return validateCurrency(value, config);\n  }\n\n  /**\n   * Verifica se um valor monetário é válido\n   */\n  isValid(value: unknown, config?: CurrencyValidationConfig): boolean {\n    return validateCurrency(value, config).valid;\n  }\n\n  /**\n   * Faz cast de input para número\n   */\n  cast(input: unknown): number | null {\n    return castCurrency(input);\n  }\n\n  /**\n   * Versão safe de cast que retorna Result\n   */\n  tryCast(\n    input: unknown\n  ): { ok: true; value: number } | { ok: false; error: string } {\n    return tryCastCurrency(input);\n  }\n\n  /**\n   * Formata valor monetário\n   */\n  format(value: number, options: CurrencyFormatOptions): string {\n    return formatCurrency(value, options);\n  }\n\n  /**\n   * Lista códigos de moeda disponíveis\n   */\n  getCurrencyCodes(): CurrencyCode[] {\n    return Object.keys(CURRENCY_CONFIGS) as CurrencyCode[];\n  }\n\n  /**\n   * Verifica se um código de moeda é válido\n   */\n  hasCurrency(code: string): code is CurrencyCode {\n    return code.toUpperCase() in CURRENCY_CONFIGS;\n  }\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/** Instância singleton da CurrencyRole */\nexport const currencyRole = new CurrencyRole();\n"]}