{"mappings":"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","sources":["packages/react-aria-components/src/TokenField.tsx"],"sourcesContent":["/*\n * Copyright 2026 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {AriaTokenFieldProps} from 'react-aria/useTokenField';\nimport {\n  ClassNameOrFunction,\n  ContextValue,\n  dom,\n  Provider,\n  RenderProps,\n  SlotProps,\n  StyleRenderProps,\n  useContextProps,\n  useRenderProps,\n  useSlot,\n  useSlottedContext\n} from './utils';\nimport {createHideableComponent} from 'react-aria/private/collections/Hidden';\nimport {FieldInputContext} from './Autocomplete';\nimport {filterDOMProps} from 'react-aria/filterDOMProps';\nimport {forwardRefType, GlobalDOMAttributes} from '@react-types/shared';\nimport {HoverProps, useHover} from 'react-aria/useHover';\nimport {isDocument, isShadowRoot} from 'react-aria/private/utils/domHelpers';\nimport {LabelContext} from './Label';\nimport {mergeProps} from 'react-aria/mergeProps';\nimport {mergeRefs} from 'react-aria/mergeRefs';\nimport React, {\n  createContext,\n  ForwardedRef,\n  forwardRef,\n  HTMLAttributes,\n  memo,\n  RefObject,\n  useContext,\n  useMemo\n} from 'react';\nimport {TextContext} from './Text';\nimport {\n  TokenFieldState,\n  TokenFieldValue,\n  TokenSegment,\n  useTokenFieldState\n} from 'react-stately/useTokenFieldState';\nimport {useFocusRing} from 'react-aria/useFocusRing';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useObjectRef} from 'react-aria/useObjectRef';\nimport {useToken, useTokenField} from 'react-aria/useTokenField';\n\nexport interface TokenFieldRenderProps {\n  /**\n   * Whether the token field is disabled.\n   *\n   * @selector [data-disabled]\n   */\n  isDisabled: boolean;\n  /**\n   * Whether the token field is read only.\n   *\n   * @selector [data-readonly]\n   */\n  isReadOnly: boolean;\n}\n\nexport interface TokenFieldProps<T extends TokenFieldValue = TokenFieldValue>\n  extends\n    AriaTokenFieldProps<T>,\n    RenderProps<TokenFieldRenderProps>,\n    SlotProps,\n    GlobalDOMAttributes<HTMLDivElement> {\n  /**\n   * The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the\n   * element. A function may be provided to compute the class based on component state.\n   *\n   * @default 'react-aria-TokenField'\n   */\n  className?: ClassNameOrFunction<TokenFieldRenderProps>;\n}\n\nexport interface TokenInputRenderProps {\n  /**\n   * Whether the token input is currently hovered with a mouse.\n   *\n   * @selector [data-hovered]\n   */\n  isHovered: boolean;\n  /**\n   * Whether the token input is focused, either via a mouse or keyboard.\n   *\n   * @selector [data-focused]\n   */\n  isFocused: boolean;\n  /**\n   * Whether the token input is keyboard focused.\n   *\n   * @selector [data-focus-visible]\n   */\n  isFocusVisible: boolean;\n  /**\n   * Whether the token input is disabled.\n   *\n   * @selector [data-disabled]\n   */\n  isDisabled: boolean;\n  /**\n   * Whether the token input is read only.\n   *\n   * @selector [data-readonly]\n   */\n  isReadOnly: boolean;\n}\n\nexport interface TokenInputProps<T extends TokenFieldValue = TokenFieldValue>\n  extends\n    HoverProps,\n    StyleRenderProps<TokenInputRenderProps>,\n    SlotProps,\n    GlobalDOMAttributes<HTMLDivElement> {\n  /**\n   * A function that renders a token for each segment in the token field.\n   */\n  children: (\n    segment: TokenSegment<T extends TokenFieldValue<infer V> ? V : never>\n  ) => React.ReactElement;\n  /**\n   * The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the\n   * element. A function may be provided to compute the class based on component state.\n   *\n   * @default 'react-aria-TokenInput'\n   */\n  className?: ClassNameOrFunction<TokenInputRenderProps>;\n}\n\ninterface TokenInputContextValue<T extends TokenFieldValue = TokenFieldValue> {\n  tokenFieldProps: HTMLAttributes<HTMLDivElement>;\n  state: TokenFieldState<T>;\n  isDisabled: boolean;\n  isReadOnly: boolean;\n  autocompleteProps?: HTMLAttributes<HTMLDivElement>;\n  ref: RefObject<HTMLDivElement | null>;\n}\n\nexport const TokenFieldContext = createContext<ContextValue<TokenFieldProps, HTMLDivElement>>(null);\nconst TokenInputContext = createContext<TokenInputContextValue | null>(null);\n\n/**\n * A token field allows users to enter text with inline tokens. Use it to build AI prompt fields,\n * tag inputs, structured search fields, mention inputs, and multi-select comboboxes.\n */\nexport const TokenField = /*#__PURE__*/ createHideableComponent(function TokenField<\n  T extends TokenFieldValue = TokenFieldValue\n>(props: TokenFieldProps<T>, ref: ForwardedRef<HTMLDivElement>) {\n  [props, ref] = useContextProps(props, ref, TokenFieldContext);\n  let [labelRef, label] = useSlot(!props['aria-label'] && !props['aria-labelledby']);\n\n  let fieldCtx = useSlottedContext(FieldInputContext, props.slot);\n  let {\n    value: _autocompleteValue,\n    onChange: onAutocompleteChange,\n    ref: autocompleteRef,\n    ...autocompleteProps\n  } = fieldCtx ?? {};\n  let inputRef = useObjectRef(autocompleteRef);\n\n  let isDisabled = props.isDisabled || false;\n  let isReadOnly = props.isReadOnly || false;\n\n  let state = useTokenFieldState<T>({\n    ...props,\n    onChange: (value: T) => {\n      props.onChange?.(value);\n      onAutocompleteChange?.(value.toString());\n    }\n  });\n\n  let {tokenFieldProps, labelProps, descriptionProps} = useTokenField(\n    {\n      ...props,\n      // @ts-ignore - not a public prop, used to determine if slot is present\n      label,\n      role: props.role || autocompleteProps['role'] || 'textbox'\n    },\n    state,\n    inputRef\n  );\n\n  let renderProps = useRenderProps({\n    ...props,\n    values: {\n      isDisabled,\n      isReadOnly\n    },\n    defaultClassName: 'react-aria-TokenField'\n  });\n\n  let DOMProps = filterDOMProps(props, {global: true});\n\n  return (\n    <dom.div\n      {...DOMProps}\n      {...renderProps}\n      ref={ref}\n      slot={props.slot || undefined}\n      data-disabled={isDisabled || undefined}\n      data-readonly={isReadOnly || undefined}>\n      <Provider\n        values={[\n          [LabelContext, {...labelProps, elementType: 'span', ref: labelRef}],\n          [\n            TextContext,\n            {\n              slots: {\n                description: descriptionProps\n              }\n            }\n          ],\n          [\n            TokenInputContext,\n            {\n              tokenFieldProps,\n              state: state as any,\n              isDisabled,\n              isReadOnly,\n              autocompleteProps: autocompleteProps as HTMLAttributes<HTMLDivElement>,\n              ref: inputRef as RefObject<HTMLDivElement | null>\n            }\n          ]\n        ]}>\n        {renderProps.children}\n      </Provider>\n    </dom.div>\n  );\n});\n\n/**\n * A token input represents the editable area within a token field.\n */\nexport const TokenInput = /*#__PURE__*/ (forwardRef as forwardRefType)(function TokenInput<\n  T extends TokenFieldValue = TokenFieldValue\n>(props: TokenInputProps<T>, forwardedRef: ForwardedRef<HTMLDivElement | null>) {\n  let {\n    tokenFieldProps,\n    state,\n    isDisabled = false,\n    isReadOnly = false,\n    autocompleteProps,\n    ref: contextRef\n  } = useContext(TokenInputContext)!;\n  let ref = useMemo(() => mergeRefs(contextRef, forwardedRef), [contextRef, forwardedRef]);\n  let {children, ...domProps} = props;\n\n  let {isHovered, hoverProps} = useHover(domProps);\n  let {isFocused, isFocusVisible, focusProps} = useFocusRing();\n\n  let renderProps = useRenderProps({\n    ...domProps,\n    defaultClassName: 'react-aria-TokenInput',\n    values: {\n      isHovered,\n      isFocused,\n      isFocusVisible,\n      isDisabled,\n      isReadOnly\n    }\n  });\n\n  let DOMProps = filterDOMProps(domProps, {global: true});\n  let objectRef = useObjectRef(ref);\n  useLayoutEffect(() => insertSelectionStyle(objectRef), [objectRef]);\n\n  return (\n    <dom.div\n      {...mergeProps(\n        DOMProps,\n        renderProps,\n        focusProps,\n        hoverProps,\n        tokenFieldProps,\n        autocompleteProps\n      )}\n      ref={objectRef}\n      data-focused={isFocused || undefined}\n      data-focus-visible={isFocusVisible || undefined}\n      data-disabled={isDisabled || undefined}\n      data-readonly={isReadOnly || undefined}\n      style={{...renderProps.style, ...tokenFieldProps?.style}}>\n      <CompositionRenderBlocker isComposing={state.isComposing}>\n        {state.value.segments.map((v, i) => {\n          switch (v.type) {\n            case 'token': {\n              let token = children(v);\n              return (\n                // Wrap tokens in zero-width spaces so the cursor is placed correctly.\n                <span key={i} data-react-aria-token>\n                  {'\\u200b'}\n                  {token}\n                  {'\\u200b'}\n                </span>\n              );\n            }\n            case 'text':\n              return v.text;\n          }\n        })}\n        {/* Force cursor to the next line if the last segment ends with a newline. */}\n        {state.value.segments.at(-1)?.text.endsWith('\\n') && <br />}\n      </CompositionRenderBlocker>\n    </dom.div>\n  );\n});\n\nexport interface TokenRenderProps {\n  /**\n   * Whether the token is selected.\n   *\n   * @selector [data-selected]\n   */\n  isSelected: boolean;\n  /**\n   * Whether the token is disabled.\n   *\n   * @selector [data-disabled]\n   */\n  isDisabled: boolean;\n}\n\nexport interface TokenProps\n  extends RenderProps<TokenRenderProps, 'span'>, GlobalDOMAttributes<HTMLSpanElement> {\n  /**\n   * The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the\n   * element. A function may be provided to compute the class based on component state.\n   *\n   * @default 'react-aria-Token'\n   */\n  className?: ClassNameOrFunction<TokenRenderProps>;\n}\n\n/**\n * A token represents an inline segment within a token field.\n */\nexport const Token = forwardRef(function Token(\n  props: TokenProps,\n  ref: ForwardedRef<HTMLSpanElement>\n) {\n  let {isDisabled} = useContext(TokenInputContext)!;\n  let objectRef = useObjectRef(ref);\n  let {tokenProps, isSelected} = useToken(props, {}, objectRef);\n\n  let renderProps = useRenderProps({\n    ...props,\n    defaultClassName: 'react-aria-Token',\n    values: {\n      isSelected,\n      isDisabled\n    }\n  });\n\n  let DOMProps = filterDOMProps(props, {global: true});\n\n  return (\n    <dom.span\n      ref={objectRef}\n      {...mergeProps(DOMProps, renderProps, tokenProps)}\n      data-selected={isSelected || undefined}\n      data-disabled={isDisabled || undefined}\n      style={{\n        ...renderProps.style,\n        ...tokenProps.style\n      }}>\n      {renderProps.children}\n    </dom.span>\n  );\n});\n\n// Prevents React from re-rendering during composition events.\nconst CompositionRenderBlocker = memo(\n  ({children}: {children: React.ReactNode; isComposing: boolean}) => children,\n  (prevProps, nextProps) =>\n    nextProps.isComposing ? true : prevProps.children === nextProps.children\n);\n\n// Inserts a stylesheet into the document / shadow root that hides the native text selection on tokens.\nfunction insertSelectionStyle(ref: RefObject<HTMLDivElement | null> | null) {\n  if (typeof CSSStyleSheet !== 'function' || !ref || !ref.current) {\n    return;\n  }\n\n  let root = ref.current.getRootNode();\n  if (!isDocument(root) && !isShadowRoot(root)) {\n    return;\n  }\n\n  if (!root.adoptedStyleSheets) {\n    return;\n  }\n\n  // Skip if we already inserted it.\n  let sym = Symbol.for('react-aria-token-style');\n  if (root.adoptedStyleSheets.some(s => s[sym])) {\n    return;\n  }\n\n  let style = new CSSStyleSheet();\n  style[sym] = true;\n  // Firefox ignores completely transparent selection colors, so use a nearly transparent color instead.\n  style.replaceSync(\n    '[data-react-aria-token]::selection,[data-react-aria-token]>*::selection{background:#ffffff01}'\n  );\n  root.adoptedStyleSheets.push(style);\n\n  return () => {\n    let index = root.adoptedStyleSheets.indexOf(style);\n    if (index >= 0) {\n      root.adoptedStyleSheets.splice(index, 1);\n    }\n  };\n}\n"],"names":[],"version":3,"file":"TokenField.cjs.map"}