@codefast/ui 0.3.16-canary.2 → 0.4.0-canary.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/README.md +28 -17
- package/dist/components/accordion.d.mts +7 -22
- package/dist/components/accordion.mjs +26 -29
- package/dist/components/alert-dialog.d.mts +27 -26
- package/dist/components/alert-dialog.mjs +53 -45
- package/dist/components/alert.d.mts +14 -14
- package/dist/components/alert.mjs +17 -28
- package/dist/components/aspect-ratio.d.mts +2 -2
- package/dist/components/aspect-ratio.mjs +2 -3
- package/dist/components/avatar.d.mts +41 -5
- package/dist/components/avatar.mjs +40 -10
- package/dist/components/badge.d.mts +3 -15
- package/dist/components/badge.mjs +6 -48
- package/dist/components/breadcrumb.d.mts +1 -0
- package/dist/components/breadcrumb.mjs +11 -10
- package/dist/components/button-group.d.mts +3 -13
- package/dist/components/button-group.mjs +9 -31
- package/dist/components/button.d.mts +3 -26
- package/dist/components/button.mjs +9 -79
- package/dist/components/calendar.d.mts +6 -2
- package/dist/components/calendar.mjs +41 -44
- package/dist/components/card.d.mts +4 -2
- package/dist/components/card.mjs +9 -9
- package/dist/components/carousel.d.mts +16 -5
- package/dist/components/carousel.mjs +24 -11
- package/dist/components/chart.d.mts +9 -6
- package/dist/components/chart.mjs +21 -15
- package/dist/components/checkbox-cards.mjs +4 -4
- package/dist/components/checkbox-group.mjs +3 -4
- package/dist/components/checkbox.d.mts +2 -2
- package/dist/components/checkbox.mjs +6 -7
- package/dist/components/collapsible.d.mts +4 -4
- package/dist/components/collapsible.mjs +4 -5
- package/dist/components/command.d.mts +11 -1
- package/dist/components/command.mjs +35 -32
- package/dist/components/context-menu.d.mts +22 -15
- package/dist/components/context-menu.mjs +44 -39
- package/dist/components/dialog.d.mts +19 -23
- package/dist/components/dialog.mjs +48 -47
- package/dist/components/direction.d.mts +24 -0
- package/dist/components/direction.mjs +18 -0
- package/dist/components/drawer.d.mts +3 -21
- package/dist/components/drawer.mjs +19 -27
- package/dist/components/dropdown-menu.d.mts +22 -15
- package/dist/components/dropdown-menu.mjs +41 -37
- package/dist/components/empty.d.mts +3 -13
- package/dist/components/empty.mjs +8 -23
- package/dist/components/field.d.mts +3 -14
- package/dist/components/field.mjs +14 -44
- package/dist/components/form.d.mts +7 -10
- package/dist/components/form.mjs +6 -7
- package/dist/components/hover-card.d.mts +5 -5
- package/dist/components/hover-card.mjs +14 -12
- package/dist/components/input-group.d.mts +4 -31
- package/dist/components/input-group.mjs +14 -96
- package/dist/components/input-number.d.mts +3 -1
- package/dist/components/input-number.mjs +50 -28
- package/dist/components/input-otp.mjs +9 -7
- package/dist/components/input-password.mjs +1 -4
- package/dist/components/input-search.mjs +3 -5
- package/dist/components/input.mjs +1 -2
- package/dist/components/item.d.mts +4 -29
- package/dist/components/item.mjs +12 -65
- package/dist/components/kbd.mjs +1 -1
- package/dist/components/label.d.mts +2 -2
- package/dist/components/label.mjs +3 -4
- package/dist/components/menubar.d.mts +22 -16
- package/dist/components/menubar.mjs +54 -47
- package/dist/components/native-select.d.mts +5 -1
- package/dist/components/native-select.mjs +9 -6
- package/dist/components/navigation-menu.d.mts +30 -13
- package/dist/components/navigation-menu.mjs +35 -32
- package/dist/components/pagination.d.mts +7 -1
- package/dist/components/pagination.mjs +27 -12
- package/dist/components/popover.d.mts +40 -7
- package/dist/components/popover.mjs +46 -14
- package/dist/components/progress-circle.d.mts +3 -47
- package/dist/components/progress-circle.mjs +2 -48
- package/dist/components/progress.d.mts +2 -2
- package/dist/components/progress.mjs +5 -6
- package/dist/components/radio-cards.d.mts +3 -3
- package/dist/components/radio-cards.mjs +11 -11
- package/dist/components/radio-group.d.mts +3 -3
- package/dist/components/radio-group.mjs +9 -9
- package/dist/components/radio.mjs +2 -3
- package/dist/components/resizable.mjs +3 -8
- package/dist/components/scroll-area.d.mts +8 -24
- package/dist/components/scroll-area.mjs +16 -70
- package/dist/components/select.d.mts +14 -14
- package/dist/components/select.mjs +47 -47
- package/dist/components/separator.d.mts +4 -19
- package/dist/components/separator.mjs +6 -27
- package/dist/components/sheet.d.mts +18 -31
- package/dist/components/sheet.mjs +46 -87
- package/dist/components/sidebar.d.mts +3 -19
- package/dist/components/sidebar.mjs +48 -84
- package/dist/components/skeleton.mjs +1 -1
- package/dist/components/slider.d.mts +2 -2
- package/dist/components/slider.mjs +9 -11
- package/dist/components/sonner.mjs +11 -3
- package/dist/components/spinner.mjs +6 -7
- package/dist/components/switch.d.mts +5 -2
- package/dist/components/switch.mjs +7 -7
- package/dist/components/table.mjs +10 -10
- package/dist/components/tabs.d.mts +8 -5
- package/dist/components/tabs.mjs +18 -12
- package/dist/components/textarea.mjs +1 -1
- package/dist/components/toggle-group.d.mts +11 -7
- package/dist/components/toggle-group.mjs +20 -21
- package/dist/components/toggle.d.mts +4 -24
- package/dist/components/toggle.mjs +6 -45
- package/dist/components/tooltip.d.mts +7 -6
- package/dist/components/tooltip.mjs +19 -17
- package/dist/hooks/use-animated-value.mjs +0 -1
- package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
- package/dist/hooks/use-is-mobile.mjs +0 -1
- package/dist/hooks/use-media-query.mjs +0 -1
- package/dist/hooks/use-mutation-observer.mjs +0 -1
- package/dist/hooks/use-pagination.mjs +0 -1
- package/dist/index.d.mts +38 -21
- package/dist/index.mjs +40 -23
- package/dist/lib/utils.d.mts +1 -12
- package/dist/lib/utils.mjs +1 -9
- package/dist/primitives/checkbox-group.d.mts +9 -11
- package/dist/primitives/checkbox-group.mjs +14 -19
- package/dist/primitives/input-number.d.mts +3 -4
- package/dist/primitives/input-number.mjs +3 -5
- package/dist/primitives/input.d.mts +4 -5
- package/dist/primitives/input.mjs +2 -3
- package/dist/primitives/progress-circle.d.mts +3 -4
- package/dist/primitives/progress-circle.mjs +2 -3
- package/dist/variants/alert.d.mts +18 -0
- package/dist/variants/alert.mjs +15 -0
- package/dist/variants/badge.d.mts +22 -0
- package/dist/variants/badge.mjs +19 -0
- package/dist/variants/button-group.d.mts +18 -0
- package/dist/variants/button-group.mjs +15 -0
- package/dist/variants/button.d.mts +32 -0
- package/dist/variants/button.mjs +34 -0
- package/dist/variants/empty.d.mts +18 -0
- package/dist/variants/empty.mjs +15 -0
- package/dist/variants/field.d.mts +19 -0
- package/dist/variants/field.mjs +16 -0
- package/dist/variants/input-group.d.mts +43 -0
- package/dist/variants/input-group.mjs +34 -0
- package/dist/variants/input-number.d.mts +45 -0
- package/dist/variants/input-number.mjs +40 -0
- package/dist/variants/item.d.mts +38 -0
- package/dist/variants/item.mjs +38 -0
- package/dist/variants/navigation-menu.d.mts +13 -0
- package/dist/variants/navigation-menu.mjs +8 -0
- package/dist/variants/progress-circle.d.mts +52 -0
- package/dist/variants/progress-circle.mjs +45 -0
- package/dist/variants/scroll-area.d.mts +24 -0
- package/dist/variants/scroll-area.mjs +58 -0
- package/dist/variants/separator.d.mts +23 -0
- package/dist/variants/separator.mjs +25 -0
- package/dist/variants/sheet.d.mts +20 -0
- package/dist/variants/sheet.mjs +17 -0
- package/dist/variants/sidebar.d.mts +23 -0
- package/dist/variants/sidebar.mjs +25 -0
- package/dist/variants/tabs.d.mts +18 -0
- package/dist/variants/tabs.mjs +15 -0
- package/dist/variants/toggle.d.mts +23 -0
- package/dist/variants/toggle.mjs +25 -0
- package/package.json +186 -55
- package/src/components/accordion.tsx +114 -0
- package/src/components/alert-dialog.tsx +298 -0
- package/src/components/alert.tsx +94 -0
- package/src/components/aspect-ratio.tsx +25 -0
- package/src/components/avatar.tsx +171 -0
- package/src/components/badge.tsx +35 -0
- package/src/components/breadcrumb.tsx +191 -0
- package/src/components/button-group.tsx +97 -0
- package/src/components/button.tsx +55 -0
- package/src/components/calendar.tsx +222 -0
- package/src/components/card.tsx +169 -0
- package/src/components/carousel.tsx +349 -0
- package/src/components/chart.tsx +536 -0
- package/src/components/checkbox-cards.tsx +72 -0
- package/src/components/checkbox-group.tsx +60 -0
- package/src/components/checkbox.tsx +44 -0
- package/src/components/collapsible.tsx +57 -0
- package/src/components/command.tsx +298 -0
- package/src/components/context-menu.tsx +410 -0
- package/src/components/dialog.tsx +243 -0
- package/src/components/direction.tsx +32 -0
- package/src/components/drawer.tsx +209 -0
- package/src/components/dropdown-menu.tsx +419 -0
- package/src/components/empty.tsx +155 -0
- package/src/components/field.tsx +329 -0
- package/src/components/form.tsx +258 -0
- package/src/components/hover-card.tsx +93 -0
- package/src/components/input-group.tsx +185 -0
- package/src/components/input-number.tsx +141 -0
- package/src/components/input-otp.tsx +132 -0
- package/src/components/input-password.tsx +50 -0
- package/src/components/input-search.tsx +81 -0
- package/src/components/input.tsx +36 -0
- package/src/components/item.tsx +266 -0
- package/src/components/kbd.tsx +47 -0
- package/src/components/label.tsx +36 -0
- package/src/components/menubar.tsx +440 -0
- package/src/components/native-select.tsx +87 -0
- package/src/components/navigation-menu.tsx +235 -0
- package/src/components/pagination.tsx +198 -0
- package/src/components/popover.tsx +170 -0
- package/src/components/progress-circle.tsx +185 -0
- package/src/components/progress.tsx +41 -0
- package/src/components/radio-cards.tsx +66 -0
- package/src/components/radio-group.tsx +59 -0
- package/src/components/radio.tsx +40 -0
- package/src/components/resizable.tsx +78 -0
- package/src/components/scroll-area.tsx +95 -0
- package/src/components/select.tsx +296 -0
- package/src/components/separator.tsx +60 -0
- package/src/components/sheet.tsx +241 -0
- package/src/components/sidebar.tsx +926 -0
- package/src/components/skeleton.tsx +35 -0
- package/src/components/slider.tsx +66 -0
- package/src/components/sonner.tsx +57 -0
- package/src/components/spinner.tsx +66 -0
- package/src/components/switch.tsx +44 -0
- package/src/components/table.tsx +183 -0
- package/src/components/tabs.tsx +110 -0
- package/src/components/textarea.tsx +35 -0
- package/src/components/toggle-group.tsx +137 -0
- package/src/components/toggle.tsx +30 -0
- package/src/components/tooltip.tsx +115 -0
- package/src/css/foundation/base.css +50 -0
- package/src/css/foundation/motion.css +36 -0
- package/src/css/foundation/source.css +3 -0
- package/src/css/foundation/tokens.css +71 -0
- package/src/css/foundation/variants.css +113 -0
- package/src/css/preset.css +5 -195
- package/src/css/style.css +1 -1
- package/src/css/{amber.css → themes/amber.css} +59 -22
- package/src/css/{blue.css → themes/blue.css} +59 -22
- package/src/css/{cyan.css → themes/cyan.css} +59 -22
- package/src/css/{emerald.css → themes/emerald.css} +59 -22
- package/src/css/{fuchsia.css → themes/fuchsia.css} +59 -22
- package/src/css/{gray.css → themes/gray.css} +59 -22
- package/src/css/{green.css → themes/green.css} +59 -22
- package/src/css/{indigo.css → themes/indigo.css} +59 -22
- package/src/css/{lime.css → themes/lime.css} +59 -22
- package/src/css/{neutral.css → themes/neutral.css} +59 -22
- package/src/css/{orange.css → themes/orange.css} +59 -22
- package/src/css/{pink.css → themes/pink.css} +59 -22
- package/src/css/{purple.css → themes/purple.css} +59 -22
- package/src/css/{red.css → themes/red.css} +59 -22
- package/src/css/{rose.css → themes/rose.css} +59 -22
- package/src/css/{sky.css → themes/sky.css} +59 -22
- package/src/css/{slate.css → themes/slate.css} +59 -22
- package/src/css/{stone.css → themes/stone.css} +59 -22
- package/src/css/{teal.css → themes/teal.css} +59 -22
- package/src/css/{violet.css → themes/violet.css} +59 -22
- package/src/css/{yellow.css → themes/yellow.css} +59 -22
- package/src/css/{zinc.css → themes/zinc.css} +59 -22
- package/src/hooks/use-animated-value.ts +91 -0
- package/src/hooks/use-copy-to-clipboard.ts +58 -0
- package/src/hooks/use-is-mobile.ts +25 -0
- package/src/hooks/use-media-query.ts +69 -0
- package/src/hooks/use-mutation-observer.ts +51 -0
- package/src/hooks/use-pagination.ts +164 -0
- package/src/index.ts +679 -0
- package/src/lib/utils.ts +5 -0
- package/src/primitives/checkbox-group.tsx +346 -0
- package/src/primitives/input-number.tsx +967 -0
- package/src/primitives/input.tsx +227 -0
- package/src/primitives/progress-circle.tsx +507 -0
- package/src/variants/alert.ts +34 -0
- package/src/variants/badge.ts +39 -0
- package/src/variants/button-group.ts +36 -0
- package/src/variants/button.ts +56 -0
- package/src/variants/empty.ts +34 -0
- package/src/variants/field.ts +37 -0
- package/src/variants/input-group.ts +80 -0
- package/src/variants/input-number.ts +65 -0
- package/src/variants/item.ts +68 -0
- package/src/variants/navigation-menu.ts +25 -0
- package/src/variants/progress-circle.ts +46 -0
- package/src/variants/scroll-area.ts +73 -0
- package/src/variants/separator.ts +40 -0
- package/src/variants/sheet.ts +37 -0
- package/src/variants/sidebar.ts +41 -0
- package/src/variants/tabs.ts +34 -0
- package/src/variants/toggle.ts +40 -0
- package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { ComponentProps, CSSProperties, JSX } from "react";
|
|
2
|
+
import { useCallback, useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
import { useAnimatedValue } from "#/hooks/use-animated-value";
|
|
5
|
+
import * as ProgressCirclePrimitive from "#/primitives/progress-circle";
|
|
6
|
+
import type { ProgressCircleVariants } from "#/variants/progress-circle";
|
|
7
|
+
import { progressCircleVariants } from "#/variants/progress-circle";
|
|
8
|
+
|
|
9
|
+
/* -------------------------------------------------------------------------------------------------
|
|
10
|
+
* Component: ProgressCircle
|
|
11
|
+
* ----------------------------------------------------------------------------------------------- */
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 0.3.16-canary.0
|
|
15
|
+
*/
|
|
16
|
+
interface ProgressCircleProps
|
|
17
|
+
extends Omit<ComponentProps<typeof ProgressCirclePrimitive.Provider>, "children" | "size">, ProgressCircleVariants {
|
|
18
|
+
/**
|
|
19
|
+
* Enables animation effect when value changes
|
|
20
|
+
*/
|
|
21
|
+
animate?: boolean;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Duration of the animation in milliseconds
|
|
25
|
+
*/
|
|
26
|
+
animationDuration?: number;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* CSS class to customize the entire component
|
|
30
|
+
*/
|
|
31
|
+
className?: string;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* CSS classes to customize specific parts of the component
|
|
35
|
+
*/
|
|
36
|
+
classNames?: {
|
|
37
|
+
/**
|
|
38
|
+
* Class for the progress indicator
|
|
39
|
+
*/
|
|
40
|
+
indicator?: string;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Class for the label in the center of the circle
|
|
44
|
+
*/
|
|
45
|
+
label?: string;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Class for the root element of the component
|
|
49
|
+
*/
|
|
50
|
+
root?: string;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Class for the SVG element
|
|
54
|
+
*/
|
|
55
|
+
svg?: string;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Class for the circle track
|
|
59
|
+
*/
|
|
60
|
+
track?: string;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Custom function to render content in the center of the circle
|
|
65
|
+
* @param value - Current value of the component
|
|
66
|
+
* @returns React element to display in the center of the circle
|
|
67
|
+
*/
|
|
68
|
+
customLabel?: ({ value }: { value: number }) => JSX.Element;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Display the numeric value in the center of the circle
|
|
72
|
+
*/
|
|
73
|
+
showValue?: boolean;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Custom size in pixels
|
|
77
|
+
* When provided, this value overrides the size variant option
|
|
78
|
+
*/
|
|
79
|
+
sizeInPixels?: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @since 0.3.16-canary.0
|
|
84
|
+
*/
|
|
85
|
+
function ProgressCircle({
|
|
86
|
+
animate = true,
|
|
87
|
+
animationDuration = 1000,
|
|
88
|
+
className,
|
|
89
|
+
classNames,
|
|
90
|
+
customLabel,
|
|
91
|
+
showValue = false,
|
|
92
|
+
size,
|
|
93
|
+
sizeInPixels,
|
|
94
|
+
strokeWidth,
|
|
95
|
+
thickness = "regular",
|
|
96
|
+
value = 0,
|
|
97
|
+
variant = "default",
|
|
98
|
+
...props
|
|
99
|
+
}: ProgressCircleProps): JSX.Element {
|
|
100
|
+
const displayValue = useAnimatedValue(value, animationDuration, animate);
|
|
101
|
+
|
|
102
|
+
const actualSize = useMemo(() => sizeInPixels ?? getActualSize(size), [sizeInPixels, size]);
|
|
103
|
+
|
|
104
|
+
const actualThickness = useMemo(
|
|
105
|
+
() => strokeWidth ?? getStrokeWidth(thickness, actualSize),
|
|
106
|
+
[strokeWidth, thickness, actualSize],
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const slots = useMemo(() => progressCircleVariants({ size, thickness, variant }), [variant, size, thickness]);
|
|
110
|
+
|
|
111
|
+
const shouldShowLabel = showValue || Boolean(customLabel);
|
|
112
|
+
|
|
113
|
+
const renderLabel = useCallback(() => {
|
|
114
|
+
if (customLabel) {
|
|
115
|
+
return customLabel({ value: displayValue });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return `${displayValue.toString()}%`;
|
|
119
|
+
}, [customLabel, displayValue]);
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<ProgressCirclePrimitive.Provider size={actualSize} strokeWidth={actualThickness} value={value} {...props}>
|
|
123
|
+
<ProgressCirclePrimitive.Root className={slots.root({ className: [className, classNames?.root] })}>
|
|
124
|
+
<ProgressCirclePrimitive.SVG className={slots.svg({ className: classNames?.svg })}>
|
|
125
|
+
<ProgressCirclePrimitive.Track className={slots.track({ className: classNames?.track })} />
|
|
126
|
+
<ProgressCirclePrimitive.Indicator
|
|
127
|
+
className={slots.indicator({ className: classNames?.indicator })}
|
|
128
|
+
style={
|
|
129
|
+
{
|
|
130
|
+
transitionDuration: `${animationDuration.toString()}ms`,
|
|
131
|
+
transitionProperty: "stroke-dashoffset",
|
|
132
|
+
} as CSSProperties
|
|
133
|
+
}
|
|
134
|
+
/>
|
|
135
|
+
</ProgressCirclePrimitive.SVG>
|
|
136
|
+
{shouldShowLabel ? (
|
|
137
|
+
<ProgressCirclePrimitive.Value className={slots.label({ className: classNames?.label })}>
|
|
138
|
+
{renderLabel()}
|
|
139
|
+
</ProgressCirclePrimitive.Value>
|
|
140
|
+
) : null}
|
|
141
|
+
</ProgressCirclePrimitive.Root>
|
|
142
|
+
</ProgressCirclePrimitive.Provider>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
ProgressCircle.displayName = "ProgressCircle";
|
|
147
|
+
|
|
148
|
+
/* -----------------------------------------------------------------------------
|
|
149
|
+
* Helpers
|
|
150
|
+
* -------------------------------------------------------------------------- */
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Maps size variants to actual pixel sizes
|
|
154
|
+
*/
|
|
155
|
+
const getActualSize = (size?: ProgressCircleVariants["size"]): number => {
|
|
156
|
+
const sizeMap: Record<NonNullable<typeof size>, number> = {
|
|
157
|
+
"2xl": 128,
|
|
158
|
+
lg: 64,
|
|
159
|
+
md: 48,
|
|
160
|
+
sm: 32,
|
|
161
|
+
xl: 96,
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
return size ? sizeMap[size] : 48;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Calculates stroke width based on thickness variant and circle size
|
|
169
|
+
*/
|
|
170
|
+
const getStrokeWidth = (thickness: ProgressCircleVariants["thickness"], size: number): number => {
|
|
171
|
+
const thicknessMap: Record<NonNullable<typeof thickness>, number> = {
|
|
172
|
+
regular: Math.max(3, size * 0.05),
|
|
173
|
+
thick: Math.max(4, size * 0.075),
|
|
174
|
+
thin: Math.max(2, size * 0.025),
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
return thickness ? thicknessMap[thickness] : Math.max(3, size * 0.05);
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
/* -----------------------------------------------------------------------------
|
|
181
|
+
* Exports
|
|
182
|
+
* -------------------------------------------------------------------------- */
|
|
183
|
+
|
|
184
|
+
export { ProgressCircle };
|
|
185
|
+
export type { ProgressCircleProps };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Progress as ProgressPrimitive } from "radix-ui";
|
|
2
|
+
import type { ComponentProps, JSX } from "react";
|
|
3
|
+
|
|
4
|
+
import { cn } from "#/lib/utils";
|
|
5
|
+
|
|
6
|
+
/* -----------------------------------------------------------------------------
|
|
7
|
+
* Component: Progress
|
|
8
|
+
* -------------------------------------------------------------------------- */
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 0.3.16-canary.0
|
|
12
|
+
*/
|
|
13
|
+
type ProgressProps = ComponentProps<typeof ProgressPrimitive.Root>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 0.3.16-canary.0
|
|
17
|
+
*/
|
|
18
|
+
function Progress({ className, value, ...props }: ProgressProps): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<ProgressPrimitive.Root
|
|
21
|
+
className={cn("relative flex h-1.5 w-full items-center overflow-x-hidden rounded-full bg-muted", className)}
|
|
22
|
+
data-slot="progress"
|
|
23
|
+
{...props}
|
|
24
|
+
>
|
|
25
|
+
<ProgressPrimitive.Indicator
|
|
26
|
+
className="size-full flex-1 bg-primary transition-all"
|
|
27
|
+
data-slot="progress-indicator"
|
|
28
|
+
style={{
|
|
29
|
+
transform: `translateX(-${(100 - (value ?? 0)).toString()}%)`,
|
|
30
|
+
}}
|
|
31
|
+
/>
|
|
32
|
+
</ProgressPrimitive.Root>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* -----------------------------------------------------------------------------
|
|
37
|
+
* Exports
|
|
38
|
+
* -------------------------------------------------------------------------- */
|
|
39
|
+
|
|
40
|
+
export { Progress };
|
|
41
|
+
export type { ProgressProps };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
2
|
+
import type { ComponentProps, JSX } from "react";
|
|
3
|
+
|
|
4
|
+
import { Label } from "#/components/label";
|
|
5
|
+
import { cn } from "#/lib/utils";
|
|
6
|
+
|
|
7
|
+
/* -----------------------------------------------------------------------------
|
|
8
|
+
* Component: RadioCards
|
|
9
|
+
* -------------------------------------------------------------------------- */
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @since 0.3.16-canary.0
|
|
13
|
+
*/
|
|
14
|
+
type RadioCardsProps = ComponentProps<typeof RadioGroupPrimitive.Root>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @since 0.3.16-canary.0
|
|
18
|
+
*/
|
|
19
|
+
function RadioCards(props: RadioCardsProps): JSX.Element {
|
|
20
|
+
return <RadioGroupPrimitive.Root data-slot="radio-cards" {...props} />;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* -----------------------------------------------------------------------------
|
|
24
|
+
* Component: RadioCardsItem
|
|
25
|
+
* -------------------------------------------------------------------------- */
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 0.3.16-canary.0
|
|
29
|
+
*/
|
|
30
|
+
type RadioCardsItemProps = ComponentProps<typeof RadioGroupPrimitive.Item>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @since 0.3.16-canary.0
|
|
34
|
+
*/
|
|
35
|
+
function RadioCardsItem({ children, className, ...props }: RadioCardsItemProps): JSX.Element {
|
|
36
|
+
return (
|
|
37
|
+
<Label
|
|
38
|
+
className="flex items-start gap-3 rounded-md border border-input p-3 transition has-focus-visible:border-ring has-disabled:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5"
|
|
39
|
+
data-slot="radio-card"
|
|
40
|
+
>
|
|
41
|
+
<RadioGroupPrimitive.Item
|
|
42
|
+
className={cn(
|
|
43
|
+
"peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
|
|
44
|
+
className,
|
|
45
|
+
)}
|
|
46
|
+
data-slot="radio-card-item"
|
|
47
|
+
{...props}
|
|
48
|
+
>
|
|
49
|
+
<RadioGroupPrimitive.Indicator
|
|
50
|
+
className="flex size-4 items-center justify-center"
|
|
51
|
+
data-slot="radio-card-indicator"
|
|
52
|
+
>
|
|
53
|
+
<span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
|
|
54
|
+
</RadioGroupPrimitive.Indicator>
|
|
55
|
+
</RadioGroupPrimitive.Item>
|
|
56
|
+
{children}
|
|
57
|
+
</Label>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* -----------------------------------------------------------------------------
|
|
62
|
+
* Exports
|
|
63
|
+
* -------------------------------------------------------------------------- */
|
|
64
|
+
|
|
65
|
+
export { RadioCards, RadioCardsItem };
|
|
66
|
+
export type { RadioCardsItemProps, RadioCardsProps };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
2
|
+
import type { ComponentProps, JSX } from "react";
|
|
3
|
+
|
|
4
|
+
import { cn } from "#/lib/utils";
|
|
5
|
+
|
|
6
|
+
/* -----------------------------------------------------------------------------
|
|
7
|
+
* Component: RadioGroup
|
|
8
|
+
* -------------------------------------------------------------------------- */
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 0.3.16-canary.0
|
|
12
|
+
*/
|
|
13
|
+
type RadioGroupProps = ComponentProps<typeof RadioGroupPrimitive.Root>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 0.3.16-canary.0
|
|
17
|
+
*/
|
|
18
|
+
function RadioGroup({ className, ...props }: RadioGroupProps): JSX.Element {
|
|
19
|
+
return <RadioGroupPrimitive.Root className={cn("grid w-full gap-3", className)} data-slot="radio-group" {...props} />;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* -----------------------------------------------------------------------------
|
|
23
|
+
* Component: RadioGroupItem
|
|
24
|
+
* -------------------------------------------------------------------------- */
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @since 0.3.16-canary.0
|
|
28
|
+
*/
|
|
29
|
+
type RadioGroupItemProps = ComponentProps<typeof RadioGroupPrimitive.Item>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @since 0.3.16-canary.0
|
|
33
|
+
*/
|
|
34
|
+
function RadioGroupItem({ className, ...props }: RadioGroupItemProps): JSX.Element {
|
|
35
|
+
return (
|
|
36
|
+
<RadioGroupPrimitive.Item
|
|
37
|
+
className={cn(
|
|
38
|
+
"group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
|
|
39
|
+
className,
|
|
40
|
+
)}
|
|
41
|
+
data-slot="radio-group-item"
|
|
42
|
+
{...props}
|
|
43
|
+
>
|
|
44
|
+
<RadioGroupPrimitive.Indicator
|
|
45
|
+
className="flex size-4 items-center justify-center"
|
|
46
|
+
data-slot="radio-group-indicator"
|
|
47
|
+
>
|
|
48
|
+
<span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
|
|
49
|
+
</RadioGroupPrimitive.Indicator>
|
|
50
|
+
</RadioGroupPrimitive.Item>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* -----------------------------------------------------------------------------
|
|
55
|
+
* Exports
|
|
56
|
+
* -------------------------------------------------------------------------- */
|
|
57
|
+
|
|
58
|
+
export { RadioGroup, RadioGroupItem };
|
|
59
|
+
export type { RadioGroupItemProps, RadioGroupProps };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { composeEventHandlers } from "radix-ui/internal";
|
|
2
|
+
import type { ComponentProps, JSX } from "react";
|
|
3
|
+
|
|
4
|
+
import { cn } from "#/lib/utils";
|
|
5
|
+
|
|
6
|
+
/* -----------------------------------------------------------------------------
|
|
7
|
+
* Component: Radio
|
|
8
|
+
* -------------------------------------------------------------------------- */
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 0.3.16-canary.0
|
|
12
|
+
*/
|
|
13
|
+
interface RadioProps extends Omit<ComponentProps<"input">, "type"> {
|
|
14
|
+
onValueChange?: (value: string) => void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @since 0.3.16-canary.0
|
|
19
|
+
*/
|
|
20
|
+
function Radio({ className, onChange, onValueChange, ...props }: RadioProps): JSX.Element {
|
|
21
|
+
return (
|
|
22
|
+
<input
|
|
23
|
+
className={cn(
|
|
24
|
+
"peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-full border border-input shadow-xs outline-none before:size-full before:rounded-full before:bg-background after:absolute after:-inset-x-3 after:-inset-y-2 checked:border-primary checked:bg-primary checked:before:size-2 checked:before:bg-primary-foreground focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:not-checked:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 checked:aria-invalid:bg-destructive dark:not-checked:before:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
25
|
+
className,
|
|
26
|
+
)}
|
|
27
|
+
data-slot="radio"
|
|
28
|
+
type="radio"
|
|
29
|
+
onChange={composeEventHandlers(onChange, (event) => onValueChange?.(event.currentTarget.value))}
|
|
30
|
+
{...props}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* -----------------------------------------------------------------------------
|
|
36
|
+
* Exports
|
|
37
|
+
* -------------------------------------------------------------------------- */
|
|
38
|
+
|
|
39
|
+
export { Radio };
|
|
40
|
+
export type { RadioProps };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { ComponentProps, JSX } from "react";
|
|
2
|
+
import * as ResizablePrimitive from "react-resizable-panels";
|
|
3
|
+
|
|
4
|
+
import { cn } from "#/lib/utils";
|
|
5
|
+
|
|
6
|
+
/* -----------------------------------------------------------------------------
|
|
7
|
+
* Component: ResizableGroup
|
|
8
|
+
* -------------------------------------------------------------------------- */
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 0.3.16-canary.0
|
|
12
|
+
*/
|
|
13
|
+
type ResizableGroupProps = ComponentProps<typeof ResizablePrimitive.Group>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 0.3.16-canary.0
|
|
17
|
+
*/
|
|
18
|
+
function ResizableGroup({ className, ...props }: ResizableGroupProps): JSX.Element {
|
|
19
|
+
return (
|
|
20
|
+
<ResizablePrimitive.Group
|
|
21
|
+
className={cn("flex h-full w-full aria-[orientation=vertical]:flex-col", className)}
|
|
22
|
+
data-slot="resizable-group"
|
|
23
|
+
{...props}
|
|
24
|
+
/>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* -----------------------------------------------------------------------------
|
|
29
|
+
* Component: ResizablePanel
|
|
30
|
+
* -------------------------------------------------------------------------- */
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @since 0.3.16-canary.0
|
|
34
|
+
*/
|
|
35
|
+
type ResizablePanelProps = ComponentProps<typeof ResizablePrimitive.Panel>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @since 0.3.16-canary.0
|
|
39
|
+
*/
|
|
40
|
+
function ResizablePanel({ ...props }: ResizablePanelProps): JSX.Element {
|
|
41
|
+
return <ResizablePrimitive.Panel data-slot="resizable-panel" {...props} />;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* -----------------------------------------------------------------------------
|
|
45
|
+
* Component: ResizableSeparator
|
|
46
|
+
* -------------------------------------------------------------------------- */
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @since 0.3.16-canary.0
|
|
50
|
+
*/
|
|
51
|
+
interface ResizableSeparatorProps extends ComponentProps<typeof ResizablePrimitive.Separator> {
|
|
52
|
+
withHandle?: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @since 0.3.16-canary.0
|
|
57
|
+
*/
|
|
58
|
+
function ResizableSeparator({ className, withHandle, ...props }: ResizableSeparatorProps): JSX.Element {
|
|
59
|
+
return (
|
|
60
|
+
<ResizablePrimitive.Separator
|
|
61
|
+
className={cn(
|
|
62
|
+
"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90",
|
|
63
|
+
className,
|
|
64
|
+
)}
|
|
65
|
+
data-slot="resizable-separator"
|
|
66
|
+
{...props}
|
|
67
|
+
>
|
|
68
|
+
{withHandle ? <div className="z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border" /> : null}
|
|
69
|
+
</ResizablePrimitive.Separator>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* -----------------------------------------------------------------------------
|
|
74
|
+
* Exports
|
|
75
|
+
* -------------------------------------------------------------------------- */
|
|
76
|
+
|
|
77
|
+
export { ResizableGroup, ResizablePanel, ResizableSeparator };
|
|
78
|
+
export type { ResizableGroupProps, ResizablePanelProps, ResizableSeparatorProps };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
|
|
2
|
+
import { Context } from "radix-ui/internal";
|
|
3
|
+
import type { ComponentProps, JSX } from "react";
|
|
4
|
+
|
|
5
|
+
import { cn } from "#/lib/utils";
|
|
6
|
+
import type { ScrollAreaScrollbarVariants } from "#/variants/scroll-area";
|
|
7
|
+
import { scrollAreaScrollbarVariants } from "#/variants/scroll-area";
|
|
8
|
+
|
|
9
|
+
/* -----------------------------------------------------------------------------
|
|
10
|
+
* Context: ScrollArea
|
|
11
|
+
* -------------------------------------------------------------------------- */
|
|
12
|
+
|
|
13
|
+
const SCROLL_AREA_NAME = "ScrollArea";
|
|
14
|
+
|
|
15
|
+
type ScopedProps<P> = P & { __scopeScrollArea?: Context.Scope };
|
|
16
|
+
|
|
17
|
+
const [createScrollAreaContext] = Context.createContextScope(SCROLL_AREA_NAME);
|
|
18
|
+
|
|
19
|
+
type ScrollAreaContextValue = Pick<ScrollAreaScrollbarVariants, "size">;
|
|
20
|
+
|
|
21
|
+
const [ScrollAreaContextProvider, useScrollAreaContext] =
|
|
22
|
+
createScrollAreaContext<ScrollAreaContextValue>(SCROLL_AREA_NAME);
|
|
23
|
+
|
|
24
|
+
/* -----------------------------------------------------------------------------
|
|
25
|
+
* Component: ScrollArea
|
|
26
|
+
* -------------------------------------------------------------------------- */
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @since 0.3.16-canary.0
|
|
30
|
+
*/
|
|
31
|
+
type ScrollAreaProps = ScopedProps<ComponentProps<typeof ScrollAreaPrimitive.Root> & ScrollAreaContextValue>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @since 0.3.16-canary.0
|
|
35
|
+
*/
|
|
36
|
+
function ScrollArea({ __scopeScrollArea, children, className, size, ...props }: ScrollAreaProps): JSX.Element {
|
|
37
|
+
return (
|
|
38
|
+
<ScrollAreaContextProvider scope={__scopeScrollArea} size={size}>
|
|
39
|
+
<ScrollAreaPrimitive.Root className={cn("relative", className)} data-slot="scroll-area" {...props}>
|
|
40
|
+
<ScrollAreaPrimitive.Viewport
|
|
41
|
+
className="size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1"
|
|
42
|
+
data-slot="scroll-area-viewport"
|
|
43
|
+
>
|
|
44
|
+
{children}
|
|
45
|
+
</ScrollAreaPrimitive.Viewport>
|
|
46
|
+
<ScrollAreaScrollbar orientation="vertical" />
|
|
47
|
+
<ScrollAreaScrollbar orientation="horizontal" />
|
|
48
|
+
<ScrollAreaPrimitive.Corner />
|
|
49
|
+
</ScrollAreaPrimitive.Root>
|
|
50
|
+
</ScrollAreaContextProvider>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* -----------------------------------------------------------------------------
|
|
55
|
+
* Component: ScrollAreaScrollbar
|
|
56
|
+
* -------------------------------------------------------------------------- */
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @since 0.3.16-canary.0
|
|
60
|
+
*/
|
|
61
|
+
type ScrollAreaScrollbarProps = ScopedProps<ComponentProps<typeof ScrollAreaPrimitive.Scrollbar>>;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @since 0.3.16-canary.0
|
|
65
|
+
*/
|
|
66
|
+
function ScrollAreaScrollbar({
|
|
67
|
+
__scopeScrollArea,
|
|
68
|
+
className,
|
|
69
|
+
orientation,
|
|
70
|
+
...props
|
|
71
|
+
}: ScrollAreaScrollbarProps): JSX.Element {
|
|
72
|
+
const { size } = useScrollAreaContext(SCROLL_AREA_NAME, __scopeScrollArea);
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<ScrollAreaPrimitive.Scrollbar
|
|
76
|
+
className={scrollAreaScrollbarVariants({ className, orientation, size })}
|
|
77
|
+
data-orientation={orientation}
|
|
78
|
+
data-slot="scroll-area-scrollbar"
|
|
79
|
+
orientation={orientation}
|
|
80
|
+
{...props}
|
|
81
|
+
>
|
|
82
|
+
<ScrollAreaPrimitive.ScrollAreaThumb
|
|
83
|
+
className="relative flex-1 rounded-full bg-border"
|
|
84
|
+
data-slot="scroll-area-thumb"
|
|
85
|
+
/>
|
|
86
|
+
</ScrollAreaPrimitive.Scrollbar>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* -----------------------------------------------------------------------------
|
|
91
|
+
* Exports
|
|
92
|
+
* -------------------------------------------------------------------------- */
|
|
93
|
+
|
|
94
|
+
export { ScrollArea, ScrollAreaScrollbar };
|
|
95
|
+
export type { ScrollAreaProps, ScrollAreaScrollbarProps };
|