廓形仪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.
 
 

169 lines
3.7 KiB

'use client';
import React from 'react';
import { createProgress } from '@gluestack-ui/progress';
import { View } from 'react-native';
import { tva } from '@gluestack-ui/nativewind-utils/tva';
import {
withStyleContext,
useStyleContext,
} from '@gluestack-ui/nativewind-utils/withStyleContext';
import { cssInterop } from 'nativewind';
import type { VariantProps } from '@gluestack-ui/nativewind-utils';
const SCOPE = 'PROGRESS';
export const UIProgress = createProgress({
Root: withStyleContext(View, SCOPE),
FilledTrack: View,
});
cssInterop(UIProgress, { className: 'style' });
cssInterop(UIProgress.FilledTrack, { className: 'style' });
const progressStyle = tva({
base: 'bg-background-300 rounded-full w-full',
variants: {
orientation: {
horizontal: 'w-full',
vertical: 'h-full',
},
size: {
'xs': 'h-1',
'sm': 'h-2',
'md': 'h-3',
'lg': 'h-4',
'xl': 'h-5',
'2xl': 'h-6',
},
},
compoundVariants: [
{
orientation: 'vertical',
size: 'xs',
class: 'h-full w-1 justify-end',
},
{
orientation: 'vertical',
size: 'sm',
class: 'h-full w-2 justify-end',
},
{
orientation: 'vertical',
size: 'md',
class: 'h-full w-3 justify-end',
},
{
orientation: 'vertical',
size: 'lg',
class: 'h-full w-4 justify-end',
},
{
orientation: 'vertical',
size: 'xl',
class: 'h-full w-5 justify-end',
},
{
orientation: 'vertical',
size: '2xl',
class: 'h-full w-6 justify-end',
},
],
});
const progressFilledTrackStyle = tva({
base: 'bg-primary-500 rounded-full',
parentVariants: {
orientation: {
horizontal: 'w-full',
vertical: 'h-full',
},
size: {
'xs': 'h-1',
'sm': 'h-2',
'md': 'h-3',
'lg': 'h-4',
'xl': 'h-5',
'2xl': 'h-6',
},
},
parentCompoundVariants: [
{
orientation: 'vertical',
size: 'xs',
class: 'h-full w-1',
},
{
orientation: 'vertical',
size: 'sm',
class: 'h-full w-2',
},
{
orientation: 'vertical',
size: 'md',
class: 'h-full w-3',
},
{
orientation: 'vertical',
size: 'lg',
class: 'h-full w-4',
},
{
orientation: 'vertical',
size: 'xl',
class: 'h-full w-5',
},
{
orientation: 'vertical',
size: '2xl',
class: 'h-full w-6',
},
],
});
type IProgressProps = VariantProps<typeof progressStyle> &
React.ComponentProps<typeof UIProgress>;
type IProgressFilledTrackProps = VariantProps<typeof progressFilledTrackStyle> &
React.ComponentProps<typeof UIProgress.FilledTrack>;
const Progress = React.forwardRef<
React.ComponentRef<typeof UIProgress>,
IProgressProps
>(function Progress(
{ className, size = 'md', orientation = 'horizontal', ...props },
ref
) {
return (
<UIProgress
ref={ref}
{...props}
className={progressStyle({ size, orientation, class: className })}
context={{ size, orientation }}
orientation={orientation}
/>
);
});
const ProgressFilledTrack = React.forwardRef<
React.ComponentRef<typeof UIProgress.FilledTrack>,
IProgressFilledTrackProps
>(function ProgressFilledTrack({ className, ...props }, ref) {
const { size: parentSize, orientation: parentOrientation } =
useStyleContext(SCOPE);
return (
<UIProgress.FilledTrack
ref={ref}
className={progressFilledTrackStyle({
parentVariants: {
size: parentSize,
orientation: parentOrientation,
},
class: className,
})}
{...props}
/>
);
});
export { Progress, ProgressFilledTrack };