廓形仪rn版本-技术调研
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
3.4 KiB

  1. 'use client';
  2. import React from 'react';
  3. import { createTextarea } from '@gluestack-ui/textarea';
  4. import { View, TextInput } from 'react-native';
  5. import { tva } from '@gluestack-ui/nativewind-utils/tva';
  6. import {
  7. withStyleContext,
  8. useStyleContext,
  9. } from '@gluestack-ui/nativewind-utils/withStyleContext';
  10. import type { VariantProps } from '@gluestack-ui/nativewind-utils';
  11. const SCOPE = 'TEXTAREA';
  12. const UITextarea = createTextarea({
  13. Root: withStyleContext(View, SCOPE),
  14. Input: TextInput,
  15. });
  16. const textareaStyle = tva({
  17. base: 'w-full h-[100px] border border-background-300 rounded data-[hover=true]:border-outline-400 data-[focus=true]:border-primary-700 data-[focus=true]:data-[hover=true]:border-primary-700 data-[disabled=true]:opacity-40 data-[disabled=true]:bg-background-50 data-[disabled=true]:data-[hover=true]:border-background-300',
  18. variants: {
  19. variant: {
  20. default:
  21. 'data-[focus=true]:border-primary-700 data-[focus=true]:web:ring-1 data-[focus=true]:web:ring-inset data-[focus=true]:web:ring-indicator-primary data-[invalid=true]:border-error-700 data-[invalid=true]:web:ring-1 data-[invalid=true]:web:ring-inset data-[invalid=true]:web:ring-indicator-error data-[invalid=true]:data-[hover=true]:border-error-700 data-[invalid=true]:data-[focus=true]:data-[hover=true]:border-primary-700 data-[invalid=true]:data-[focus=true]:data-[hover=true]:web:ring-1 data-[invalid=true]:data-[focus=true]:data-[hover=true]:web:ring-inset data-[invalid=true]:data-[focus=true]:data-[hover=true]:web:ring-indicator-primary data-[invalid=true]:data-[disabled=true]:data-[hover=true]:border-error-700 data-[invalid=true]:data-[disabled=true]:data-[hover=true]:web:ring-1 data-[invalid=true]:data-[disabled=true]:data-[hover=true]:web:ring-inset data-[invalid=true]:data-[disabled=true]:data-[hover=true]:web:ring-indicator-error ',
  22. },
  23. size: {
  24. sm: '',
  25. md: '',
  26. lg: '',
  27. xl: '',
  28. },
  29. },
  30. });
  31. const textareaInputStyle = tva({
  32. base: 'p-2 web:outline-0 web:outline-none flex-1 color-typography-900 align-text-top placeholder:text-typography-500 web:cursor-text web:data-[disabled=true]:cursor-not-allowed',
  33. parentVariants: {
  34. size: {
  35. sm: 'text-sm',
  36. md: 'text-base',
  37. lg: 'text-lg',
  38. xl: 'text-xl',
  39. },
  40. },
  41. });
  42. type ITextareaProps = React.ComponentProps<typeof UITextarea> &
  43. VariantProps<typeof textareaStyle>;
  44. const Textarea = React.forwardRef<
  45. React.ComponentRef<typeof UITextarea>,
  46. ITextareaProps
  47. >(function Textarea(
  48. { className, variant = 'default', size = 'md', ...props },
  49. ref
  50. ) {
  51. return (
  52. <UITextarea
  53. ref={ref}
  54. {...props}
  55. className={textareaStyle({ variant, class: className })}
  56. context={{ size }}
  57. />
  58. );
  59. });
  60. type ITextareaInputProps = React.ComponentProps<typeof UITextarea.Input> &
  61. VariantProps<typeof textareaInputStyle>;
  62. const TextareaInput = React.forwardRef<
  63. React.ComponentRef<typeof UITextarea.Input>,
  64. ITextareaInputProps
  65. >(function TextareaInput({ className, ...props }, ref) {
  66. const { size: parentSize } = useStyleContext(SCOPE);
  67. return (
  68. <UITextarea.Input
  69. ref={ref}
  70. {...props}
  71. className={textareaInputStyle({
  72. parentVariants: {
  73. size: parentSize,
  74. },
  75. class: className,
  76. })}
  77. />
  78. );
  79. });
  80. Textarea.displayName = 'Textarea';
  81. TextareaInput.displayName = 'TextareaInput';
  82. export { Textarea, TextareaInput };