@fluencypassdevs/cycle 0.1.0
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/README.md +36 -0
- package/dist/chunk-2MXR6RRJ.js +106 -0
- package/dist/chunk-2MXR6RRJ.js.map +1 -0
- package/dist/chunk-2WPH3IQP.js +48 -0
- package/dist/chunk-2WPH3IQP.js.map +1 -0
- package/dist/chunk-3LXU5C35.js +68 -0
- package/dist/chunk-3LXU5C35.js.map +1 -0
- package/dist/chunk-6LML23MS.js +347 -0
- package/dist/chunk-6LML23MS.js.map +1 -0
- package/dist/chunk-726XFHED.js +22 -0
- package/dist/chunk-726XFHED.js.map +1 -0
- package/dist/chunk-7UMEJDC3.js +62 -0
- package/dist/chunk-7UMEJDC3.js.map +1 -0
- package/dist/chunk-7XT6ISPQ.js +97 -0
- package/dist/chunk-7XT6ISPQ.js.map +1 -0
- package/dist/chunk-AL2ALTBH.js +115 -0
- package/dist/chunk-AL2ALTBH.js.map +1 -0
- package/dist/chunk-CIM6KJH5.js +59 -0
- package/dist/chunk-CIM6KJH5.js.map +1 -0
- package/dist/chunk-CSL4DRPW.js +39 -0
- package/dist/chunk-CSL4DRPW.js.map +1 -0
- package/dist/chunk-HZJRM5EK.js +97 -0
- package/dist/chunk-HZJRM5EK.js.map +1 -0
- package/dist/chunk-IJTNFN6N.js +61 -0
- package/dist/chunk-IJTNFN6N.js.map +1 -0
- package/dist/chunk-K567KZD5.js +63 -0
- package/dist/chunk-K567KZD5.js.map +1 -0
- package/dist/chunk-MSLQRGSP.js +113 -0
- package/dist/chunk-MSLQRGSP.js.map +1 -0
- package/dist/chunk-NGOZFA33.js +60 -0
- package/dist/chunk-NGOZFA33.js.map +1 -0
- package/dist/chunk-NVA4ZJOS.js +66 -0
- package/dist/chunk-NVA4ZJOS.js.map +1 -0
- package/dist/chunk-OT2HCBR2.js +37 -0
- package/dist/chunk-OT2HCBR2.js.map +1 -0
- package/dist/chunk-PM6ZUCMQ.js +73 -0
- package/dist/chunk-PM6ZUCMQ.js.map +1 -0
- package/dist/chunk-PXWCEJ2C.js +223 -0
- package/dist/chunk-PXWCEJ2C.js.map +1 -0
- package/dist/chunk-QTL6W4I2.js +57 -0
- package/dist/chunk-QTL6W4I2.js.map +1 -0
- package/dist/chunk-QZVQPUVT.js +129 -0
- package/dist/chunk-QZVQPUVT.js.map +1 -0
- package/dist/chunk-R4LITCVX.js +111 -0
- package/dist/chunk-R4LITCVX.js.map +1 -0
- package/dist/chunk-TYCPXAXF.js +10 -0
- package/dist/chunk-TYCPXAXF.js.map +1 -0
- package/dist/chunk-UEJLA7Q6.js +70 -0
- package/dist/chunk-UEJLA7Q6.js.map +1 -0
- package/dist/chunk-UVCEQOQR.js +104 -0
- package/dist/chunk-UVCEQOQR.js.map +1 -0
- package/dist/chunk-VECLN5AT.js +202 -0
- package/dist/chunk-VECLN5AT.js.map +1 -0
- package/dist/chunk-XX3I65LQ.js +435 -0
- package/dist/chunk-XX3I65LQ.js.map +1 -0
- package/dist/chunk-YINJ5YZ5.js +35 -0
- package/dist/chunk-YINJ5YZ5.js.map +1 -0
- package/dist/icons/index.d.ts +617 -0
- package/dist/icons/index.js +5 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +4 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/styles/tailwind-theme.css +87 -0
- package/dist/styles/tokens.css +496 -0
- package/dist/ui/accordion.d.ts +10 -0
- package/dist/ui/accordion.js +5 -0
- package/dist/ui/accordion.js.map +1 -0
- package/dist/ui/audio-player.d.ts +30 -0
- package/dist/ui/audio-player.js +7 -0
- package/dist/ui/audio-player.js.map +1 -0
- package/dist/ui/avatar.d.ts +16 -0
- package/dist/ui/avatar.js +5 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.d.ts +15 -0
- package/dist/ui/badge.js +5 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/button.d.ts +15 -0
- package/dist/ui/button.js +5 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/chat-bubble.d.ts +21 -0
- package/dist/ui/chat-bubble.js +6 -0
- package/dist/ui/chat-bubble.js.map +1 -0
- package/dist/ui/chat-panel.d.ts +35 -0
- package/dist/ui/chat-panel.js +10 -0
- package/dist/ui/chat-panel.js.map +1 -0
- package/dist/ui/checkbox.d.ts +17 -0
- package/dist/ui/checkbox.js +5 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/file-card.d.ts +27 -0
- package/dist/ui/file-card.js +5 -0
- package/dist/ui/file-card.js.map +1 -0
- package/dist/ui/input.d.ts +11 -0
- package/dist/ui/input.js +5 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/label.d.ts +9 -0
- package/dist/ui/label.js +5 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/like-dislike.d.ts +32 -0
- package/dist/ui/like-dislike.js +9 -0
- package/dist/ui/like-dislike.js.map +1 -0
- package/dist/ui/live-waiting.d.ts +16 -0
- package/dist/ui/live-waiting.js +8 -0
- package/dist/ui/live-waiting.js.map +1 -0
- package/dist/ui/progress-stage.d.ts +19 -0
- package/dist/ui/progress-stage.js +5 -0
- package/dist/ui/progress-stage.js.map +1 -0
- package/dist/ui/progress.d.ts +19 -0
- package/dist/ui/progress.js +5 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/radio-group.d.ts +19 -0
- package/dist/ui/radio-group.js +5 -0
- package/dist/ui/radio-group.js.map +1 -0
- package/dist/ui/scroll-area.d.ts +8 -0
- package/dist/ui/scroll-area.js +5 -0
- package/dist/ui/scroll-area.js.map +1 -0
- package/dist/ui/sheet.d.ts +17 -0
- package/dist/ui/sheet.js +5 -0
- package/dist/ui/sheet.js.map +1 -0
- package/dist/ui/slider.d.ts +16 -0
- package/dist/ui/slider.js +5 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/switch.d.ts +16 -0
- package/dist/ui/switch.js +5 -0
- package/dist/ui/switch.js.map +1 -0
- package/dist/ui/tabs.d.ts +15 -0
- package/dist/ui/tabs.js +5 -0
- package/dist/ui/tabs.js.map +1 -0
- package/dist/ui/textarea.d.ts +12 -0
- package/dist/ui/textarea.js +5 -0
- package/dist/ui/textarea.js.map +1 -0
- package/dist/ui/toggle.d.ts +17 -0
- package/dist/ui/toggle.js +5 -0
- package/dist/ui/toggle.js.map +1 -0
- package/dist/ui/video-player.d.ts +28 -0
- package/dist/ui/video-player.js +7 -0
- package/dist/ui/video-player.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { cn } from './chunk-TYCPXAXF.js';
|
|
2
|
+
import { __objRest, __spreadProps, __spreadValues } from './chunk-YINJ5YZ5.js';
|
|
3
|
+
import { Progress as Progress$1 } from 'radix-ui';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var progressVariants = cva(
|
|
8
|
+
"relative w-full overflow-hidden rounded-full bg-neutral-accent",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
size: {
|
|
12
|
+
xs: "h-1",
|
|
13
|
+
sm: "h-1.5",
|
|
14
|
+
default: "h-2",
|
|
15
|
+
lg: "h-3"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
defaultVariants: {
|
|
19
|
+
size: "default"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
var indicatorVariants = cva(
|
|
24
|
+
"h-full w-full flex-1 rounded-full transition-all",
|
|
25
|
+
{
|
|
26
|
+
variants: {
|
|
27
|
+
variant: {
|
|
28
|
+
default: "bg-primary",
|
|
29
|
+
secondary: "bg-secondary",
|
|
30
|
+
destructive: "bg-destructive",
|
|
31
|
+
muted: "bg-muted-foreground"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: {
|
|
35
|
+
variant: "default"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
function Progress(_a) {
|
|
40
|
+
var _b = _a, {
|
|
41
|
+
className,
|
|
42
|
+
value,
|
|
43
|
+
size,
|
|
44
|
+
variant,
|
|
45
|
+
theme
|
|
46
|
+
} = _b, props = __objRest(_b, [
|
|
47
|
+
"className",
|
|
48
|
+
"value",
|
|
49
|
+
"size",
|
|
50
|
+
"variant",
|
|
51
|
+
"theme"
|
|
52
|
+
]);
|
|
53
|
+
return /* @__PURE__ */ jsx(
|
|
54
|
+
Progress$1.Root,
|
|
55
|
+
__spreadProps(__spreadValues({
|
|
56
|
+
"data-slot": "progress",
|
|
57
|
+
className: cn(progressVariants({ size }), className)
|
|
58
|
+
}, props), {
|
|
59
|
+
children: /* @__PURE__ */ jsx(
|
|
60
|
+
Progress$1.Indicator,
|
|
61
|
+
{
|
|
62
|
+
"data-slot": "progress-indicator",
|
|
63
|
+
className: cn(theme, indicatorVariants({ variant })),
|
|
64
|
+
style: { transform: `translateX(-${100 - (value || 0)}%)` }
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { Progress, indicatorVariants, progressVariants };
|
|
72
|
+
//# sourceMappingURL=chunk-PM6ZUCMQ.js.map
|
|
73
|
+
//# sourceMappingURL=chunk-PM6ZUCMQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/progress.tsx"],"names":["ProgressPrimitive"],"mappings":";;;;;;AAUA,IAAM,gBAAA,GAAmB,GAAA;AAAA,EACvB,gEAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,KAAA;AAAA,QACJ,EAAA,EAAI,OAAA;AAAA,QACJ,OAAA,EAAS,KAAA;AAAA,QACT,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM;AAAA;AACR;AAEJ;AAIA,IAAM,iBAAA,GAAoB,GAAA;AAAA,EACxB,kDAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAW,cAAA;AAAA,QACX,WAAA,EAAa,gBAAA;AAAA,QACb,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAUA,SAAS,SAAS,EAAA,EAOA;AAPA,EAAA,IAAA,EAAA,GAAA,EAAA,EAChB;AAAA,IAAA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GA3DF,GAsDkB,EAAA,EAMb,KAAA,GAAA,SAAA,CANa,EAAA,EAMb;AAAA,IALH,WAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,GAAA;AAAA,IAACA,UAAA,CAAkB,IAAA;AAAA,IAAlB,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,UAAA;AAAA,MACV,WAAW,EAAA,CAAG,gBAAA,CAAiB,EAAE,IAAA,EAAM,GAAG,SAAS;AAAA,KAAA,EAC/C,KAAA,CAAA,EAHL;AAAA,MAKC,QAAA,kBAAA,GAAA;AAAA,QAACA,UAAA,CAAkB,SAAA;AAAA,QAAlB;AAAA,UACC,WAAA,EAAU,oBAAA;AAAA,UACV,WAAW,EAAA,CAAG,KAAA,EAAO,kBAAkB,EAAE,OAAA,EAAS,CAAC,CAAA;AAAA,UACnD,OAAO,EAAE,SAAA,EAAW,eAAe,GAAA,IAAO,KAAA,IAAS,EAAE,CAAA,EAAA,CAAA;AAAK;AAAA;AAC5D,KAAA;AAAA,GACF;AAEJ","file":"chunk-PM6ZUCMQ.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\n/* ─── Track variants ─── */\n\nconst progressVariants = cva(\n \"relative w-full overflow-hidden rounded-full bg-neutral-accent\",\n {\n variants: {\n size: {\n xs: \"h-1\",\n sm: \"h-1.5\",\n default: \"h-2\",\n lg: \"h-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/* ─── Indicator variants ─── */\n\nconst indicatorVariants = cva(\n \"h-full w-full flex-1 rounded-full transition-all\",\n {\n variants: {\n variant: {\n default: \"bg-primary\",\n secondary: \"bg-secondary\",\n destructive: \"bg-destructive\",\n muted: \"bg-muted-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface ProgressProps\n extends Omit<React.ComponentProps<typeof ProgressPrimitive.Root>, \"children\">,\n VariantProps<typeof progressVariants>,\n VariantProps<typeof indicatorVariants> {\n /** Classe de tema aplicada apenas no indicator (ex: \"theme-class\") */\n theme?: string\n}\n\nfunction Progress({\n className,\n value,\n size,\n variant,\n theme,\n ...props\n}: ProgressProps) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(progressVariants({ size }), className)}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(theme, indicatorVariants({ variant }))}\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress, progressVariants, indicatorVariants }\n"]}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { CycleIcon } from './chunk-OT2HCBR2.js';
|
|
2
|
+
import { Button } from './chunk-7UMEJDC3.js';
|
|
3
|
+
import { Textarea } from './chunk-2WPH3IQP.js';
|
|
4
|
+
import { cn } from './chunk-TYCPXAXF.js';
|
|
5
|
+
import { __objRest, __spreadProps, __spreadValues } from './chunk-YINJ5YZ5.js';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { cva } from 'class-variance-authority';
|
|
8
|
+
import { ThumbsUp, ThumbsDown, X } from 'lucide-react';
|
|
9
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var likeDislikeVariants = cva("inline-flex flex-col", {
|
|
12
|
+
variants: {
|
|
13
|
+
size: {
|
|
14
|
+
default: "gap-2",
|
|
15
|
+
xs: "gap-1.5",
|
|
16
|
+
sm: "gap-1.5",
|
|
17
|
+
lg: "gap-3"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
size: "default"
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
var sizeConfig = {
|
|
25
|
+
xs: { iconBtn: "size-6", icon: "xs", text: "text-xs", rayH: "h-1", rayW: "w-[2px]" },
|
|
26
|
+
sm: { iconBtn: "size-8", icon: "xs", text: "text-xs", rayH: "h-1.5", rayW: "w-[2px]" },
|
|
27
|
+
default: { iconBtn: "size-10", icon: "sm", text: "text-sm", rayH: "h-2", rayW: "w-[2px]" },
|
|
28
|
+
lg: { iconBtn: "size-12", icon: "sm", text: "text-base", rayH: "h-2.5", rayW: "w-[3px]" }
|
|
29
|
+
};
|
|
30
|
+
var BURST_RAYS = [
|
|
31
|
+
{ angle: 0, delay: "0ms" },
|
|
32
|
+
{ angle: 45, delay: "30ms" },
|
|
33
|
+
{ angle: 90, delay: "60ms" },
|
|
34
|
+
{ angle: 135, delay: "20ms" },
|
|
35
|
+
{ angle: 180, delay: "50ms" },
|
|
36
|
+
{ angle: 225, delay: "10ms" },
|
|
37
|
+
{ angle: 270, delay: "40ms" },
|
|
38
|
+
{ angle: 315, delay: "25ms" }
|
|
39
|
+
];
|
|
40
|
+
function LikeDislike(_a) {
|
|
41
|
+
var _b = _a, {
|
|
42
|
+
className,
|
|
43
|
+
size = "default",
|
|
44
|
+
value: valueProp,
|
|
45
|
+
defaultValue = null,
|
|
46
|
+
onValueChange,
|
|
47
|
+
showFeedback = false,
|
|
48
|
+
feedbackPlaceholder = "O que voce nao gostou?",
|
|
49
|
+
feedbackSubmitLabel = "Enviar",
|
|
50
|
+
onFeedbackSubmit,
|
|
51
|
+
burstTheme = "theme-brand",
|
|
52
|
+
disabled = false
|
|
53
|
+
} = _b, props = __objRest(_b, [
|
|
54
|
+
"className",
|
|
55
|
+
"size",
|
|
56
|
+
"value",
|
|
57
|
+
"defaultValue",
|
|
58
|
+
"onValueChange",
|
|
59
|
+
"showFeedback",
|
|
60
|
+
"feedbackPlaceholder",
|
|
61
|
+
"feedbackSubmitLabel",
|
|
62
|
+
"onFeedbackSubmit",
|
|
63
|
+
"burstTheme",
|
|
64
|
+
"disabled"
|
|
65
|
+
]);
|
|
66
|
+
const isControlled = valueProp !== void 0;
|
|
67
|
+
const [internalValue, setInternalValue] = React.useState(defaultValue);
|
|
68
|
+
const currentValue = isControlled ? valueProp : internalValue;
|
|
69
|
+
const [feedbackText, setFeedbackText] = React.useState("");
|
|
70
|
+
const [isBursting, setIsBursting] = React.useState(false);
|
|
71
|
+
const [feedbackDismissed, setFeedbackDismissed] = React.useState(false);
|
|
72
|
+
const s = sizeConfig[size != null ? size : "default"];
|
|
73
|
+
function handleClick(target) {
|
|
74
|
+
if (disabled) return;
|
|
75
|
+
const next = currentValue === target ? null : target;
|
|
76
|
+
if (!isControlled) setInternalValue(next);
|
|
77
|
+
onValueChange == null ? void 0 : onValueChange(next);
|
|
78
|
+
setFeedbackDismissed(false);
|
|
79
|
+
if (target === "like" && next === "like") {
|
|
80
|
+
setIsBursting(true);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function handleBurstEnd() {
|
|
84
|
+
setIsBursting(false);
|
|
85
|
+
}
|
|
86
|
+
function handleFeedbackSubmit(e) {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
if (feedbackText.trim()) {
|
|
89
|
+
onFeedbackSubmit == null ? void 0 : onFeedbackSubmit(feedbackText.trim());
|
|
90
|
+
setFeedbackText("");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const isLiked = currentValue === "like";
|
|
94
|
+
const isDisliked = currentValue === "dislike";
|
|
95
|
+
const showFeedbackPanel = isDisliked && showFeedback && !feedbackDismissed;
|
|
96
|
+
const btnBase = cn(
|
|
97
|
+
"relative inline-flex shrink-0 items-center justify-center rounded-lg transition-[color,box-shadow,background-color] outline-none cursor-pointer",
|
|
98
|
+
"hover:bg-muted hover:text-muted-foreground",
|
|
99
|
+
"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
|
|
100
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
101
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
102
|
+
s.iconBtn
|
|
103
|
+
);
|
|
104
|
+
return /* @__PURE__ */ jsxs(
|
|
105
|
+
"div",
|
|
106
|
+
__spreadProps(__spreadValues({
|
|
107
|
+
"data-slot": "like-dislike",
|
|
108
|
+
className: cn("relative inline-flex", className)
|
|
109
|
+
}, props), {
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-1", role: "group", "aria-label": "Avaliar conteudo", children: [
|
|
112
|
+
/* @__PURE__ */ jsxs(
|
|
113
|
+
"button",
|
|
114
|
+
{
|
|
115
|
+
type: "button",
|
|
116
|
+
"aria-pressed": isLiked,
|
|
117
|
+
"aria-label": "Gostei",
|
|
118
|
+
disabled,
|
|
119
|
+
onClick: () => handleClick("like"),
|
|
120
|
+
className: cn(
|
|
121
|
+
btnBase,
|
|
122
|
+
isLiked && "bg-accent text-accent-foreground [&_svg]:fill-current"
|
|
123
|
+
),
|
|
124
|
+
children: [
|
|
125
|
+
isBursting && /* @__PURE__ */ jsx(
|
|
126
|
+
"span",
|
|
127
|
+
{
|
|
128
|
+
className: cn("absolute inset-0 z-0 pointer-events-none", burstTheme),
|
|
129
|
+
"aria-hidden": "true",
|
|
130
|
+
children: BURST_RAYS.map(({ angle, delay }) => /* @__PURE__ */ jsx(
|
|
131
|
+
"span",
|
|
132
|
+
{
|
|
133
|
+
className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
134
|
+
style: { rotate: `${angle}deg` },
|
|
135
|
+
children: /* @__PURE__ */ jsx(
|
|
136
|
+
"span",
|
|
137
|
+
{
|
|
138
|
+
className: cn(
|
|
139
|
+
"block rounded-full bg-primary opacity-0 animate-like-burst",
|
|
140
|
+
s.rayW,
|
|
141
|
+
s.rayH
|
|
142
|
+
),
|
|
143
|
+
style: { animationDelay: delay }
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
},
|
|
147
|
+
angle
|
|
148
|
+
))
|
|
149
|
+
}
|
|
150
|
+
),
|
|
151
|
+
/* @__PURE__ */ jsx(
|
|
152
|
+
"span",
|
|
153
|
+
{
|
|
154
|
+
className: cn("relative z-10", isBursting && "animate-like-pop"),
|
|
155
|
+
onAnimationEnd: handleBurstEnd,
|
|
156
|
+
children: /* @__PURE__ */ jsx(CycleIcon, { icon: ThumbsUp, size: s.icon, decorative: true })
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
/* @__PURE__ */ jsx(
|
|
163
|
+
"button",
|
|
164
|
+
{
|
|
165
|
+
type: "button",
|
|
166
|
+
"aria-pressed": isDisliked,
|
|
167
|
+
"aria-label": "Nao gostei",
|
|
168
|
+
disabled,
|
|
169
|
+
onClick: () => handleClick("dislike"),
|
|
170
|
+
className: cn(
|
|
171
|
+
btnBase,
|
|
172
|
+
isDisliked && "bg-accent text-accent-foreground [&_svg]:fill-current"
|
|
173
|
+
),
|
|
174
|
+
children: /* @__PURE__ */ jsx(CycleIcon, { icon: ThumbsDown, size: s.icon, decorative: true })
|
|
175
|
+
}
|
|
176
|
+
)
|
|
177
|
+
] }),
|
|
178
|
+
showFeedbackPanel && /* @__PURE__ */ jsxs("div", { className: "absolute left-0 top-full z-50 mt-2 w-72 rounded-lg border border-border bg-background p-3 shadow-md animate-in fade-in-0 zoom-in-95 slide-in-from-top-2", children: [
|
|
179
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
|
|
180
|
+
/* @__PURE__ */ jsx("p", { className: cn("font-medium text-foreground", s.text), children: feedbackPlaceholder }),
|
|
181
|
+
/* @__PURE__ */ jsx(
|
|
182
|
+
"button",
|
|
183
|
+
{
|
|
184
|
+
type: "button",
|
|
185
|
+
onClick: () => setFeedbackDismissed(true),
|
|
186
|
+
className: "inline-flex size-6 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground transition-colors cursor-pointer",
|
|
187
|
+
"aria-label": "Fechar",
|
|
188
|
+
children: /* @__PURE__ */ jsx(CycleIcon, { icon: X, size: "xs", decorative: true })
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
] }),
|
|
192
|
+
/* @__PURE__ */ jsxs("form", { onSubmit: handleFeedbackSubmit, className: "flex flex-col gap-2", children: [
|
|
193
|
+
/* @__PURE__ */ jsx(
|
|
194
|
+
Textarea,
|
|
195
|
+
{
|
|
196
|
+
textareaSize: "sm",
|
|
197
|
+
value: feedbackText,
|
|
198
|
+
onChange: (e) => setFeedbackText(e.target.value),
|
|
199
|
+
placeholder: "Conte-nos mais...",
|
|
200
|
+
disabled,
|
|
201
|
+
className: "resize-none min-h-[60px]",
|
|
202
|
+
"aria-label": "Feedback"
|
|
203
|
+
}
|
|
204
|
+
),
|
|
205
|
+
/* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx(
|
|
206
|
+
Button,
|
|
207
|
+
{
|
|
208
|
+
type: "submit",
|
|
209
|
+
size: "sm",
|
|
210
|
+
disabled: disabled || !feedbackText.trim(),
|
|
211
|
+
children: feedbackSubmitLabel
|
|
212
|
+
}
|
|
213
|
+
) })
|
|
214
|
+
] })
|
|
215
|
+
] })
|
|
216
|
+
]
|
|
217
|
+
})
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export { LikeDislike, likeDislikeVariants };
|
|
222
|
+
//# sourceMappingURL=chunk-PXWCEJ2C.js.map
|
|
223
|
+
//# sourceMappingURL=chunk-PXWCEJ2C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/like-dislike.tsx"],"names":[],"mappings":"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","file":"chunk-PXWCEJ2C.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { ThumbsUp, ThumbsDown, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { CycleIcon } from \"@/components/icons\"\nimport { Button } from \"@/components/ui/button\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\n/* ---------------------------------- CVA ---------------------------------- */\n\nconst likeDislikeVariants = cva(\"inline-flex flex-col\", {\n variants: {\n size: {\n default: \"gap-2\",\n xs: \"gap-1.5\",\n sm: \"gap-1.5\",\n lg: \"gap-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n})\n\n/** Maps component size → toggle button dimensions + icon size + burst ray size */\nconst sizeConfig = {\n xs: { iconBtn: \"size-6\", icon: \"xs\" as const, text: \"text-xs\", rayH: \"h-1\", rayW: \"w-[2px]\" },\n sm: { iconBtn: \"size-8\", icon: \"xs\" as const, text: \"text-xs\", rayH: \"h-1.5\", rayW: \"w-[2px]\" },\n default: { iconBtn: \"size-10\", icon: \"sm\" as const, text: \"text-sm\", rayH: \"h-2\", rayW: \"w-[2px]\" },\n lg: { iconBtn: \"size-12\", icon: \"sm\" as const, text: \"text-base\", rayH: \"h-2.5\", rayW: \"w-[3px]\" },\n} as const\n\n/** Angles and colors for the burst rays */\nconst BURST_RAYS = [\n { angle: 0, delay: \"0ms\" },\n { angle: 45, delay: \"30ms\" },\n { angle: 90, delay: \"60ms\" },\n { angle: 135, delay: \"20ms\" },\n { angle: 180, delay: \"50ms\" },\n { angle: 225, delay: \"10ms\" },\n { angle: 270, delay: \"40ms\" },\n { angle: 315, delay: \"25ms\" },\n]\n\n/* -------------------------------- Types --------------------------------- */\n\nexport type LikeDislikeValue = \"like\" | \"dislike\" | null\n\nexport interface LikeDislikeProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\" | \"defaultValue\">,\n VariantProps<typeof likeDislikeVariants> {\n /** Current value — controlled */\n value?: LikeDislikeValue\n /** Default value — uncontrolled */\n defaultValue?: LikeDislikeValue\n /** Called when the value changes */\n onValueChange?: (value: LikeDislikeValue) => void\n /** Show feedback textarea when dislike is selected */\n showFeedback?: boolean\n /** Placeholder for the feedback textarea */\n feedbackPlaceholder?: string\n /** Label for the feedback submit button */\n feedbackSubmitLabel?: string\n /** Called when feedback is submitted */\n onFeedbackSubmit?: (feedback: string) => void\n /** Theme class for the burst animation rays (e.g. \"theme-brand\"). Default: \"theme-brand\" */\n burstTheme?: string\n /** Disabled state */\n disabled?: boolean\n}\n\n/* ------------------------------ Component ------------------------------- */\n\nfunction LikeDislike({\n className,\n size = \"default\",\n value: valueProp,\n defaultValue = null,\n onValueChange,\n showFeedback = false,\n feedbackPlaceholder = \"O que voce nao gostou?\",\n feedbackSubmitLabel = \"Enviar\",\n onFeedbackSubmit,\n burstTheme = \"theme-brand\",\n disabled = false,\n ...props\n}: LikeDislikeProps) {\n /* --- State --- */\n const isControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState<LikeDislikeValue>(defaultValue)\n const currentValue = isControlled ? valueProp : internalValue\n\n const [feedbackText, setFeedbackText] = React.useState(\"\")\n const [isBursting, setIsBursting] = React.useState(false)\n const [feedbackDismissed, setFeedbackDismissed] = React.useState(false)\n\n const s = sizeConfig[size ?? \"default\"]\n\n /* --- Handlers --- */\n function handleClick(target: \"like\" | \"dislike\") {\n if (disabled) return\n const next: LikeDislikeValue = currentValue === target ? null : target\n\n if (!isControlled) setInternalValue(next)\n onValueChange?.(next)\n setFeedbackDismissed(false)\n\n // Trigger burst animation when transitioning TO like\n if (target === \"like\" && next === \"like\") {\n setIsBursting(true)\n }\n }\n\n function handleBurstEnd() {\n setIsBursting(false)\n }\n\n function handleFeedbackSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (feedbackText.trim()) {\n onFeedbackSubmit?.(feedbackText.trim())\n setFeedbackText(\"\")\n }\n }\n\n const isLiked = currentValue === \"like\"\n const isDisliked = currentValue === \"dislike\"\n const showFeedbackPanel = isDisliked && showFeedback && !feedbackDismissed\n\n /* --- Shared button classes --- */\n const btnBase = cn(\n \"relative inline-flex shrink-0 items-center justify-center rounded-lg transition-[color,box-shadow,background-color] outline-none cursor-pointer\",\n \"hover:bg-muted hover:text-muted-foreground\",\n \"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0\",\n s.iconBtn\n )\n\n return (\n <div\n data-slot=\"like-dislike\"\n className={cn(\"relative inline-flex\", className)}\n {...props}\n >\n {/* Button row */}\n <div className=\"inline-flex items-center gap-1\" role=\"group\" aria-label=\"Avaliar conteudo\">\n {/* Like */}\n <button\n type=\"button\"\n aria-pressed={isLiked}\n aria-label=\"Gostei\"\n disabled={disabled}\n onClick={() => handleClick(\"like\")}\n className={cn(\n btnBase,\n isLiked && \"bg-accent text-accent-foreground [&_svg]:fill-current\"\n )}\n >\n {/* Burst rays (behind the icon) */}\n {isBursting && (\n <span\n className={cn(\"absolute inset-0 z-0 pointer-events-none\", burstTheme)}\n aria-hidden=\"true\"\n >\n {BURST_RAYS.map(({ angle, delay }) => (\n <span\n key={angle}\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\"\n style={{ rotate: `${angle}deg` }}\n >\n <span\n className={cn(\n \"block rounded-full bg-primary opacity-0 animate-like-burst\",\n s.rayW, s.rayH\n )}\n style={{ animationDelay: delay }}\n />\n </span>\n ))}\n </span>\n )}\n\n {/* Icon with pop animation (above rays) */}\n <span\n className={cn(\"relative z-10\", isBursting && \"animate-like-pop\")}\n onAnimationEnd={handleBurstEnd}\n >\n <CycleIcon icon={ThumbsUp} size={s.icon} decorative />\n </span>\n </button>\n\n {/* Dislike */}\n <button\n type=\"button\"\n aria-pressed={isDisliked}\n aria-label=\"Nao gostei\"\n disabled={disabled}\n onClick={() => handleClick(\"dislike\")}\n className={cn(\n btnBase,\n isDisliked && \"bg-accent text-accent-foreground [&_svg]:fill-current\"\n )}\n >\n <CycleIcon icon={ThumbsDown} size={s.icon} decorative />\n </button>\n </div>\n\n {/* Floating feedback panel */}\n {showFeedbackPanel && (\n <div className=\"absolute left-0 top-full z-50 mt-2 w-72 rounded-lg border border-border bg-background p-3 shadow-md animate-in fade-in-0 zoom-in-95 slide-in-from-top-2\">\n <div className=\"flex items-center justify-between mb-2\">\n <p className={cn(\"font-medium text-foreground\", s.text)}>\n {feedbackPlaceholder}\n </p>\n <button\n type=\"button\"\n onClick={() => setFeedbackDismissed(true)}\n className=\"inline-flex size-6 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground transition-colors cursor-pointer\"\n aria-label=\"Fechar\"\n >\n <CycleIcon icon={X} size=\"xs\" decorative />\n </button>\n </div>\n <form onSubmit={handleFeedbackSubmit} className=\"flex flex-col gap-2\">\n <Textarea\n textareaSize=\"sm\"\n value={feedbackText}\n onChange={(e) => setFeedbackText(e.target.value)}\n placeholder=\"Conte-nos mais...\"\n disabled={disabled}\n className=\"resize-none min-h-[60px]\"\n aria-label=\"Feedback\"\n />\n <div className=\"flex justify-end\">\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={disabled || !feedbackText.trim()}\n >\n {feedbackSubmitLabel}\n </Button>\n </div>\n </form>\n </div>\n )}\n </div>\n )\n}\n\nexport { LikeDislike, likeDislikeVariants }\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { cn } from './chunk-TYCPXAXF.js';
|
|
2
|
+
import { __objRest, __spreadProps, __spreadValues } from './chunk-YINJ5YZ5.js';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var progressStagePillVariants = cva("flex-1 rounded-full", {
|
|
7
|
+
variants: {
|
|
8
|
+
size: {
|
|
9
|
+
xs: "h-1",
|
|
10
|
+
sm: "h-1.5",
|
|
11
|
+
default: "h-2",
|
|
12
|
+
lg: "h-3"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: {
|
|
16
|
+
size: "default"
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
function ProgressStage(_a) {
|
|
20
|
+
var _b = _a, {
|
|
21
|
+
stages,
|
|
22
|
+
value,
|
|
23
|
+
size = "default",
|
|
24
|
+
theme,
|
|
25
|
+
className
|
|
26
|
+
} = _b, props = __objRest(_b, [
|
|
27
|
+
"stages",
|
|
28
|
+
"value",
|
|
29
|
+
"size",
|
|
30
|
+
"theme",
|
|
31
|
+
"className"
|
|
32
|
+
]);
|
|
33
|
+
const total = Math.min(10, Math.max(2, stages));
|
|
34
|
+
const filled = Math.min(total, Math.max(0, value));
|
|
35
|
+
return /* @__PURE__ */ jsx(
|
|
36
|
+
"div",
|
|
37
|
+
__spreadProps(__spreadValues({
|
|
38
|
+
"data-slot": "progress-stage",
|
|
39
|
+
className: cn("flex w-full gap-2", className)
|
|
40
|
+
}, props), {
|
|
41
|
+
children: Array.from({ length: total }, (_, i) => /* @__PURE__ */ jsx(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
className: cn(
|
|
45
|
+
progressStagePillVariants({ size }),
|
|
46
|
+
i < filled ? cn(theme, "bg-primary") : "bg-neutral-accent"
|
|
47
|
+
)
|
|
48
|
+
},
|
|
49
|
+
i
|
|
50
|
+
))
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { ProgressStage };
|
|
56
|
+
//# sourceMappingURL=chunk-QTL6W4I2.js.map
|
|
57
|
+
//# sourceMappingURL=chunk-QTL6W4I2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/progress-stage.tsx"],"names":[],"mappings":";;;;;AAKA,IAAM,yBAAA,GAA4B,IAAI,qBAAA,EAAuB;AAAA,EAC3D,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;AAaD,SAAS,cAAc,EAAA,EAOA;AAPA,EAAA,IAAA,EAAA,GAAA,EAAA,EACrB;AAAA,IAAA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,GAAO,SAAA;AAAA,IACP,KAAA;AAAA,IACA;AAAA,GAnCF,GA8BuB,EAAA,EAMlB,KAAA,GAAA,SAAA,CANkB,EAAA,EAMlB;AAAA,IALH,QAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAEjD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,SAAS;AAAA,KAAA,EACxC,KAAA,CAAA,EAHL;AAAA,MAKE,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,qBACjC,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,EAAA;AAAA,YACT,yBAAA,CAA0B,EAAE,IAAA,EAAM,CAAA;AAAA,YAClC,CAAA,GAAI,MAAA,GACA,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA,GACtB;AAAA;AACN,SAAA;AAAA,QANK;AAAA,OAQR;AAAA,KAAA;AAAA,GACH;AAEJ","file":"chunk-QTL6W4I2.js","sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst progressStagePillVariants = cva(\"flex-1 rounded-full\", {\n variants: {\n size: {\n xs: \"h-1\",\n sm: \"h-1.5\",\n default: \"h-2\",\n lg: \"h-3\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n})\n\nexport interface ProgressStageProps\n extends React.ComponentProps<\"div\">,\n VariantProps<typeof progressStagePillVariants> {\n /** Numero total de stages (2–10) */\n stages: number\n /** Quantos stages estao preenchidos (0–stages) */\n value: number\n /** Classe de tema aplicada apenas nas pills preenchidas (ex: \"theme-class\") */\n theme?: string\n}\n\nfunction ProgressStage({\n stages,\n value,\n size = \"default\",\n theme,\n className,\n ...props\n}: ProgressStageProps) {\n const total = Math.min(10, Math.max(2, stages))\n const filled = Math.min(total, Math.max(0, value))\n\n return (\n <div\n data-slot=\"progress-stage\"\n className={cn(\"flex w-full gap-2\", className)}\n {...props}\n >\n {Array.from({ length: total }, (_, i) => (\n <div\n key={i}\n className={cn(\n progressStagePillVariants({ size }),\n i < filled\n ? cn(theme, \"bg-primary\")\n : \"bg-neutral-accent\"\n )}\n />\n ))}\n </div>\n )\n}\n\nexport { ProgressStage }\n"]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { cn } from './chunk-TYCPXAXF.js';
|
|
2
|
+
import { __objRest, __spreadValues, __spreadProps } from './chunk-YINJ5YZ5.js';
|
|
3
|
+
import { XIcon } from 'lucide-react';
|
|
4
|
+
import { Dialog } from 'radix-ui';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function Sheet(_a) {
|
|
8
|
+
var props = __objRest(_a, []);
|
|
9
|
+
return /* @__PURE__ */ jsx(Dialog.Root, __spreadValues({ "data-slot": "sheet" }, props));
|
|
10
|
+
}
|
|
11
|
+
function SheetTrigger(_a) {
|
|
12
|
+
var props = __objRest(_a, []);
|
|
13
|
+
return /* @__PURE__ */ jsx(Dialog.Trigger, __spreadValues({ "data-slot": "sheet-trigger" }, props));
|
|
14
|
+
}
|
|
15
|
+
function SheetClose(_a) {
|
|
16
|
+
var props = __objRest(_a, []);
|
|
17
|
+
return /* @__PURE__ */ jsx(Dialog.Close, __spreadValues({ "data-slot": "sheet-close" }, props));
|
|
18
|
+
}
|
|
19
|
+
function SheetPortal(_a) {
|
|
20
|
+
var props = __objRest(_a, []);
|
|
21
|
+
return /* @__PURE__ */ jsx(Dialog.Portal, __spreadValues({ "data-slot": "sheet-portal" }, props));
|
|
22
|
+
}
|
|
23
|
+
function SheetOverlay(_a) {
|
|
24
|
+
var _b = _a, {
|
|
25
|
+
className
|
|
26
|
+
} = _b, props = __objRest(_b, [
|
|
27
|
+
"className"
|
|
28
|
+
]);
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
Dialog.Overlay,
|
|
31
|
+
__spreadValues({
|
|
32
|
+
"data-slot": "sheet-overlay",
|
|
33
|
+
className: cn(
|
|
34
|
+
"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
|
|
35
|
+
className
|
|
36
|
+
)
|
|
37
|
+
}, props)
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function SheetContent(_a) {
|
|
41
|
+
var _b = _a, {
|
|
42
|
+
className,
|
|
43
|
+
children,
|
|
44
|
+
side = "right",
|
|
45
|
+
showCloseButton = true
|
|
46
|
+
} = _b, props = __objRest(_b, [
|
|
47
|
+
"className",
|
|
48
|
+
"children",
|
|
49
|
+
"side",
|
|
50
|
+
"showCloseButton"
|
|
51
|
+
]);
|
|
52
|
+
return /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
53
|
+
/* @__PURE__ */ jsx(SheetOverlay, {}),
|
|
54
|
+
/* @__PURE__ */ jsxs(
|
|
55
|
+
Dialog.Content,
|
|
56
|
+
__spreadProps(__spreadValues({
|
|
57
|
+
"data-slot": "sheet-content",
|
|
58
|
+
className: cn(
|
|
59
|
+
"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500",
|
|
60
|
+
side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
|
|
61
|
+
side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
62
|
+
side === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
63
|
+
side === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
64
|
+
className
|
|
65
|
+
)
|
|
66
|
+
}, props), {
|
|
67
|
+
children: [
|
|
68
|
+
children,
|
|
69
|
+
showCloseButton && /* @__PURE__ */ jsxs(Dialog.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
|
|
70
|
+
/* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
|
|
71
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
72
|
+
] })
|
|
73
|
+
]
|
|
74
|
+
})
|
|
75
|
+
)
|
|
76
|
+
] });
|
|
77
|
+
}
|
|
78
|
+
function SheetHeader(_a) {
|
|
79
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
80
|
+
return /* @__PURE__ */ jsx(
|
|
81
|
+
"div",
|
|
82
|
+
__spreadValues({
|
|
83
|
+
"data-slot": "sheet-header",
|
|
84
|
+
className: cn("flex flex-col gap-1.5 p-4", className)
|
|
85
|
+
}, props)
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
function SheetFooter(_a) {
|
|
89
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
90
|
+
return /* @__PURE__ */ jsx(
|
|
91
|
+
"div",
|
|
92
|
+
__spreadValues({
|
|
93
|
+
"data-slot": "sheet-footer",
|
|
94
|
+
className: cn("mt-auto flex flex-col gap-2 p-4", className)
|
|
95
|
+
}, props)
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
function SheetTitle(_a) {
|
|
99
|
+
var _b = _a, {
|
|
100
|
+
className
|
|
101
|
+
} = _b, props = __objRest(_b, [
|
|
102
|
+
"className"
|
|
103
|
+
]);
|
|
104
|
+
return /* @__PURE__ */ jsx(
|
|
105
|
+
Dialog.Title,
|
|
106
|
+
__spreadValues({
|
|
107
|
+
"data-slot": "sheet-title",
|
|
108
|
+
className: cn("font-semibold text-foreground", className)
|
|
109
|
+
}, props)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
function SheetDescription(_a) {
|
|
113
|
+
var _b = _a, {
|
|
114
|
+
className
|
|
115
|
+
} = _b, props = __objRest(_b, [
|
|
116
|
+
"className"
|
|
117
|
+
]);
|
|
118
|
+
return /* @__PURE__ */ jsx(
|
|
119
|
+
Dialog.Description,
|
|
120
|
+
__spreadValues({
|
|
121
|
+
"data-slot": "sheet-description",
|
|
122
|
+
className: cn("text-sm text-muted-foreground", className)
|
|
123
|
+
}, props)
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };
|
|
128
|
+
//# sourceMappingURL=chunk-QZVQPUVT.js.map
|
|
129
|
+
//# sourceMappingURL=chunk-QZVQPUVT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/sheet.tsx"],"names":["SheetPrimitive"],"mappings":"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","file":"chunk-QZVQPUVT.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"top\" &&\n \"inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { cn } from './chunk-TYCPXAXF.js';
|
|
2
|
+
import { __objRest, __spreadProps, __spreadValues } from './chunk-YINJ5YZ5.js';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { FileText } from 'lucide-react';
|
|
5
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var fileCardVariants = cva(
|
|
8
|
+
"inline-flex w-full items-start gap-3 border border-border bg-secondary text-left transition-all select-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:opacity-50 disabled:pointer-events-none hover:bg-accent active:scale-[0.98]",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
size: {
|
|
12
|
+
sm: "rounded-lg px-3 py-4",
|
|
13
|
+
md: "rounded-xl px-4 py-6",
|
|
14
|
+
lg: "rounded-2xl px-6 py-8"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
defaultVariants: {
|
|
18
|
+
size: "lg"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
var titleVariants = cva("font-medium text-foreground truncate", {
|
|
23
|
+
variants: {
|
|
24
|
+
size: {
|
|
25
|
+
sm: "text-xs leading-3",
|
|
26
|
+
md: "text-sm leading-3.5",
|
|
27
|
+
lg: "text-sm leading-3.5"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
defaultVariants: {
|
|
31
|
+
size: "lg"
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
var iconVariants = cva("shrink-0 text-muted-foreground", {
|
|
35
|
+
variants: {
|
|
36
|
+
size: {
|
|
37
|
+
sm: "size-4",
|
|
38
|
+
md: "size-6",
|
|
39
|
+
lg: "size-6"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
size: "lg"
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
function FileCard(_a) {
|
|
47
|
+
var _b = _a, {
|
|
48
|
+
title,
|
|
49
|
+
fileType,
|
|
50
|
+
fileSize,
|
|
51
|
+
href,
|
|
52
|
+
icon = true,
|
|
53
|
+
showDescription = true,
|
|
54
|
+
showFileSize = true,
|
|
55
|
+
size = "lg",
|
|
56
|
+
disabled = false,
|
|
57
|
+
className
|
|
58
|
+
} = _b, props = __objRest(_b, [
|
|
59
|
+
"title",
|
|
60
|
+
"fileType",
|
|
61
|
+
"fileSize",
|
|
62
|
+
"href",
|
|
63
|
+
"icon",
|
|
64
|
+
"showDescription",
|
|
65
|
+
"showFileSize",
|
|
66
|
+
"size",
|
|
67
|
+
"disabled",
|
|
68
|
+
"className"
|
|
69
|
+
]);
|
|
70
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
71
|
+
icon && /* @__PURE__ */ jsx(FileText, { className: cn(iconVariants({ size })) }),
|
|
72
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("span", { className: cn(titleVariants({ size })), children: title }),
|
|
74
|
+
showDescription && fileType && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 text-xs text-[#a1a1a1] whitespace-nowrap", children: [
|
|
75
|
+
/* @__PURE__ */ jsx("span", { children: fileType }),
|
|
76
|
+
showFileSize && fileSize && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
77
|
+
/* @__PURE__ */ jsx("span", { children: "\u2022" }),
|
|
78
|
+
/* @__PURE__ */ jsx("span", { children: fileSize })
|
|
79
|
+
] })
|
|
80
|
+
] })
|
|
81
|
+
] })
|
|
82
|
+
] });
|
|
83
|
+
const classes = cn(fileCardVariants({ size }), className);
|
|
84
|
+
if (href && !disabled) {
|
|
85
|
+
return /* @__PURE__ */ jsx(
|
|
86
|
+
"a",
|
|
87
|
+
{
|
|
88
|
+
href,
|
|
89
|
+
download: true,
|
|
90
|
+
className: classes,
|
|
91
|
+
"aria-label": `Download ${title}`,
|
|
92
|
+
children: content
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return /* @__PURE__ */ jsx(
|
|
97
|
+
"button",
|
|
98
|
+
__spreadProps(__spreadValues({
|
|
99
|
+
"data-slot": "file-card",
|
|
100
|
+
type: "button",
|
|
101
|
+
disabled,
|
|
102
|
+
className: classes
|
|
103
|
+
}, props), {
|
|
104
|
+
children: content
|
|
105
|
+
})
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export { FileCard, fileCardVariants };
|
|
110
|
+
//# sourceMappingURL=chunk-R4LITCVX.js.map
|
|
111
|
+
//# sourceMappingURL=chunk-R4LITCVX.js.map
|