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
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 };
|