{"version":3,"sources":["../src/input/index.tsx"],"names":["spacing","forwardRef","Input","useTheme","useState","radius","transition","motion","jsxs","jsx"],"mappings":"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","file":"input.cjs","sourcesContent":["/**\n * Input (web). Single-line text input with built-in theme styling and a\n * size scale that matches the Button + Text primitives.\n *\n * Controlled and uncontrolled both work. We deliberately don't bundle a\n * Field wrapper here -- that lives in layouts because the label + helper\n * positioning is design-system-specific.\n *\n * Focus draws a two-part ring (page-fill gap + primaryOrange) so the\n * focused field pops on any surface. Inline styles can't express\n * :focus-visible, so the ring shows on every focus, not just keyboard\n * focus -- revisit if/when the library grows a stylesheet layer.\n */\nimport { forwardRef, useState, type ChangeEvent, type CSSProperties } from \"react\";\nimport { useTheme } from \"@plyxui/styles\";\nimport { motion, radius, spacing, transition } from \"@plyxui/core\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nconst sizeMap: Record<InputSize, { h: number; fontSize: number; padX: number }> = {\n  sm: { h: 28, fontSize: 13, padX: spacing[2] },\n  md: { h: 36, fontSize: 14, padX: spacing[3] },\n  lg: { h: 44, fontSize: 16, padX: spacing[4] },\n};\n\nexport interface InputProps {\n  value?: string;\n  defaultValue?: string;\n  onChange?: (value: string, event: ChangeEvent<HTMLInputElement>) => void;\n  placeholder?: string;\n  size?: InputSize;\n  invalid?: boolean;\n  disabled?: boolean;\n  type?: \"text\" | \"email\" | \"password\" | \"search\" | \"tel\" | \"url\" | \"number\";\n  className?: string;\n  style?: CSSProperties;\n  /** Optional left ornament -- typically an Icon. */\n  leading?: React.ReactNode;\n  /** Optional right ornament. */\n  trailing?: React.ReactNode;\n  autoFocus?: boolean;\n  id?: string;\n  name?: string;\n  inputMode?: React.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n  \"aria-label\"?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n  {\n    value,\n    defaultValue,\n    onChange,\n    placeholder,\n    size = \"md\",\n    invalid,\n    disabled,\n    type = \"text\",\n    className,\n    style,\n    leading,\n    trailing,\n    autoFocus,\n    id,\n    name,\n    inputMode,\n    ...aria\n  },\n  ref,\n) {\n  const { colors } = useTheme();\n  const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n  const [focused, setFocused] = useState(false);\n  const isControlled = value !== undefined;\n  const current = isControlled ? value : internal;\n  const dims = sizeMap[size];\n\n  const wrapStyle: CSSProperties = {\n    display: \"flex\",\n    alignItems: \"center\",\n    gap: spacing[2],\n    height: dims.h,\n    paddingLeft: leading ? spacing[2] : dims.padX,\n    paddingRight: trailing ? spacing[2] : dims.padX,\n    background: colors.surfaceFill,\n    border: `1px solid ${invalid ? colors.statusError : focused ? colors.primaryOrange : colors.stroke}`,\n    borderRadius: radius.md,\n    color: colors.text,\n    opacity: disabled ? 0.55 : 1,\n    boxShadow: focused\n      ? `0 0 0 2px ${colors.primaryFill}, 0 0 0 4px ${invalid ? colors.statusError : colors.primaryOrange}`\n      : \"none\",\n    transition: [\n      transition(\"border-color\", motion.controlHover),\n      transition(\"box-shadow\", motion.controlHover),\n    ].join(\", \"),\n    ...style,\n  };\n\n  const inputStyle: CSSProperties = {\n    flex: 1,\n    minWidth: 0,\n    height: \"100%\",\n    border: \"none\",\n    outline: \"none\",\n    background: \"transparent\",\n    color: colors.text,\n    fontSize: dims.fontSize,\n    fontFamily: \"inherit\",\n    padding: 0,\n  };\n\n  return (\n    <div className={className} style={wrapStyle}>\n      {leading}\n      <input\n        ref={ref}\n        type={type}\n        id={id}\n        name={name}\n        value={current}\n        onChange={(e) => {\n          if (!isControlled) setInternal(e.target.value);\n          onChange?.(e.target.value, e);\n        }}\n        placeholder={placeholder}\n        disabled={disabled}\n        autoFocus={autoFocus}\n        onFocus={() => setFocused(true)}\n        onBlur={() => setFocused(false)}\n        inputMode={inputMode}\n        aria-invalid={invalid || undefined}\n        aria-label={aria[\"aria-label\"]}\n        style={inputStyle}\n      />\n      {trailing}\n    </div>\n  );\n});\n"]}