# All files / form MenuItemTextField.tsx

0% Statements 0/68
0% Branches 0/1
0% Functions 0/1
0% Lines 0/68

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69

     "use client";
    import { cnb } from "cnbuilder";
    import { forwardRef, type HTMLAttributes } from "react";
    import { type PropsWithRef } from "../types.js";
    import { TextField, type TextFieldProps } from "./TextField.js";

    /**
     * @remarks \@since 5.0.0
     */
    export interface MenuItemTextFieldProps extends TextFieldProps {
      /**
       * Any additional props or a `ref` to apply to the surrounding `<li>` element.
       */
      liProps?: PropsWithRef<HTMLAttributes<HTMLLIElement>, HTMLLIElement>;

      /** @defaultValue `true` */
      stretch?: boolean;
    }

    /**
     * **Client Component**
     *
     * This is a wrapper for the `TextField` component that can be used within
     * `Menu`s by updating the `onKeyDown` and `onClick` behavior.
     *
     * Note: This is **not** the `TextFieldWithMessage` since the message part is
     * hard to style nicely within menus. You'd most likely want to use another menu
     * for displaying errors.
     *
     * @remarks \@since 5.0.0
     */
    export const MenuItemTextField = forwardRef<
      HTMLInputElement,
      MenuItemTextFieldProps
    >(function MenuItemTextField(props, ref) {
      const { liProps, onKeyDown, stretch = true, ...remaining } = props;
      return (
        <li
          role="none"
          {...liProps}
          onClick={(event) => {
            liProps?.onClick?.(event);
            event.stopPropagation();
          }}
          className={cnb("rmd-list-item rmd-menu-item", liProps?.className)}
        >
          <TextField
            {...remaining}
            ref={ref}
            stretch={stretch}
            onKeyDown={(event) => {
              onKeyDown?.(event);
              switch (event.key) {
                case "Tab":
                case "Escape":
                case " ":
                  // do default behavior
                  break;
                default:
                  if (event.key.length === 1 || event.currentTarget.value) {
                    event.stopPropagation();
                  }
              }
            }}
          />
        </li>
      );
    });