{"version":3,"sources":["../src/utils/accessibility.ts"],"names":["resolveDisabledState","disabled","isDisabled"],"mappings":"AAsGO,SAASA,EACdC,EACAC,EACS,CAET,OAAOD,GAAYC,GAAc,EACnC","sourcesContent":["/**\n * Accessibility utility functions for fpkit components.\n *\n * These utilities support WCAG 2.1 Level AA compliance for disabled states\n * and other accessibility features.\n */\n\n/**\n * CSS properties for disabled state styling.\n *\n * Returns a CSS-in-JS compatible style object for programmatic styling\n * of disabled elements. Meets WCAG 1.4.3 contrast minimum (3:1 for UI components).\n *\n * @param {boolean} isDisabled - Whether the element is disabled\n * @returns {React.CSSProperties} Style object with disabled state properties\n *\n * @example\n * const MyComponent = ({ disabled }) => {\n *   const disabledStyles = getDisabledStyles(disabled);\n *   return <div style={disabledStyles}>Content</div>;\n * };\n *\n * @see {@link https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum WCAG 1.4.3 - Contrast (Minimum)}\n */\nexport function getDisabledStyles(isDisabled: boolean): React.CSSProperties {\n  if (!isDisabled) {\n    return {};\n  }\n\n  return {\n    // hsl(0 0% 40%) = #666666, provides 3:1 contrast on white (#ffffff)\n    color: 'var(--disabled-color, hsl(0 0% 40%))',\n    // CSS custom properties require string casting for TypeScript compatibility\n    opacity: 'var(--disabled-opacity, 0.6)' as unknown as number,\n    cursor: 'var(--disabled-cursor, not-allowed)' as unknown as React.CSSProperties['cursor'],\n  };\n}\n\n/**\n * Wraps a single event handler to prevent execution when disabled.\n *\n * This is a generic utility for advanced use cases where the `useDisabledState`\n * hook cannot be used (e.g., class components, custom event types).\n *\n * @template E - The React synthetic event type\n * @param {Function | undefined} handler - The event handler to wrap\n * @param {boolean} isDisabled - Whether to prevent handler execution\n * @returns {Function | undefined} Wrapped handler or undefined if no handler provided\n *\n * @example\n * // Custom event handler in class component\n * class MyComponent extends React.Component {\n *   handleCustomEvent = wrapEventHandler(this.onCustomEvent, this.props.disabled);\n * }\n *\n * @example\n * // Custom event type not supported by useDisabledState\n * const handleCustom = wrapEventHandler(\n *   (e: CustomEvent) => console.log('custom'),\n *   disabled\n * );\n */\nexport function wrapEventHandler<E extends React.SyntheticEvent>(\n  handler: ((event: E) => void) | undefined,\n  isDisabled: boolean\n): ((event: E) => void) | undefined {\n  if (!handler) {\n    return undefined;\n  }\n\n  return (event: E) => {\n    if (isDisabled) {\n      event.preventDefault();\n      event.stopPropagation();\n      return;\n    }\n    handler(event);\n  };\n}\n\n/**\n * Resolves the effective disabled state from multiple props.\n *\n * Handles backward compatibility with legacy `isDisabled` prop.\n * The `disabled` prop takes precedence when both are provided.\n *\n * @param {boolean | undefined} disabled - Modern disabled prop\n * @param {boolean | undefined} isDisabled - Legacy disabled prop (deprecated)\n * @returns {boolean} The resolved disabled state (defaults to false)\n *\n * @example\n * const MyComponent = ({ disabled, isDisabled }) => {\n *   const isActuallyDisabled = resolveDisabledState(disabled, isDisabled);\n *   // Use isActuallyDisabled for logic\n * };\n *\n * @example\n * // disabled takes precedence\n * resolveDisabledState(true, false);   // true\n * resolveDisabledState(false, true);   // false\n * resolveDisabledState(undefined, true); // true\n */\nexport function resolveDisabledState(\n  disabled: boolean | undefined,\n  isDisabled: boolean | undefined\n): boolean {\n  // disabled prop takes precedence, fall back to isDisabled, default to false\n  return disabled ?? isDisabled ?? false;\n}\n"]}