@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.
Files changed (141) hide show
  1. package/README.md +36 -0
  2. package/dist/chunk-2MXR6RRJ.js +106 -0
  3. package/dist/chunk-2MXR6RRJ.js.map +1 -0
  4. package/dist/chunk-2WPH3IQP.js +48 -0
  5. package/dist/chunk-2WPH3IQP.js.map +1 -0
  6. package/dist/chunk-3LXU5C35.js +68 -0
  7. package/dist/chunk-3LXU5C35.js.map +1 -0
  8. package/dist/chunk-6LML23MS.js +347 -0
  9. package/dist/chunk-6LML23MS.js.map +1 -0
  10. package/dist/chunk-726XFHED.js +22 -0
  11. package/dist/chunk-726XFHED.js.map +1 -0
  12. package/dist/chunk-7UMEJDC3.js +62 -0
  13. package/dist/chunk-7UMEJDC3.js.map +1 -0
  14. package/dist/chunk-7XT6ISPQ.js +97 -0
  15. package/dist/chunk-7XT6ISPQ.js.map +1 -0
  16. package/dist/chunk-AL2ALTBH.js +115 -0
  17. package/dist/chunk-AL2ALTBH.js.map +1 -0
  18. package/dist/chunk-CIM6KJH5.js +59 -0
  19. package/dist/chunk-CIM6KJH5.js.map +1 -0
  20. package/dist/chunk-CSL4DRPW.js +39 -0
  21. package/dist/chunk-CSL4DRPW.js.map +1 -0
  22. package/dist/chunk-HZJRM5EK.js +97 -0
  23. package/dist/chunk-HZJRM5EK.js.map +1 -0
  24. package/dist/chunk-IJTNFN6N.js +61 -0
  25. package/dist/chunk-IJTNFN6N.js.map +1 -0
  26. package/dist/chunk-K567KZD5.js +63 -0
  27. package/dist/chunk-K567KZD5.js.map +1 -0
  28. package/dist/chunk-MSLQRGSP.js +113 -0
  29. package/dist/chunk-MSLQRGSP.js.map +1 -0
  30. package/dist/chunk-NGOZFA33.js +60 -0
  31. package/dist/chunk-NGOZFA33.js.map +1 -0
  32. package/dist/chunk-NVA4ZJOS.js +66 -0
  33. package/dist/chunk-NVA4ZJOS.js.map +1 -0
  34. package/dist/chunk-OT2HCBR2.js +37 -0
  35. package/dist/chunk-OT2HCBR2.js.map +1 -0
  36. package/dist/chunk-PM6ZUCMQ.js +73 -0
  37. package/dist/chunk-PM6ZUCMQ.js.map +1 -0
  38. package/dist/chunk-PXWCEJ2C.js +223 -0
  39. package/dist/chunk-PXWCEJ2C.js.map +1 -0
  40. package/dist/chunk-QTL6W4I2.js +57 -0
  41. package/dist/chunk-QTL6W4I2.js.map +1 -0
  42. package/dist/chunk-QZVQPUVT.js +129 -0
  43. package/dist/chunk-QZVQPUVT.js.map +1 -0
  44. package/dist/chunk-R4LITCVX.js +111 -0
  45. package/dist/chunk-R4LITCVX.js.map +1 -0
  46. package/dist/chunk-TYCPXAXF.js +10 -0
  47. package/dist/chunk-TYCPXAXF.js.map +1 -0
  48. package/dist/chunk-UEJLA7Q6.js +70 -0
  49. package/dist/chunk-UEJLA7Q6.js.map +1 -0
  50. package/dist/chunk-UVCEQOQR.js +104 -0
  51. package/dist/chunk-UVCEQOQR.js.map +1 -0
  52. package/dist/chunk-VECLN5AT.js +202 -0
  53. package/dist/chunk-VECLN5AT.js.map +1 -0
  54. package/dist/chunk-XX3I65LQ.js +435 -0
  55. package/dist/chunk-XX3I65LQ.js.map +1 -0
  56. package/dist/chunk-YINJ5YZ5.js +35 -0
  57. package/dist/chunk-YINJ5YZ5.js.map +1 -0
  58. package/dist/icons/index.d.ts +617 -0
  59. package/dist/icons/index.js +5 -0
  60. package/dist/icons/index.js.map +1 -0
  61. package/dist/index.d.ts +33 -0
  62. package/dist/index.js +30 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/utils.d.ts +5 -0
  65. package/dist/lib/utils.js +4 -0
  66. package/dist/lib/utils.js.map +1 -0
  67. package/dist/styles/tailwind-theme.css +87 -0
  68. package/dist/styles/tokens.css +496 -0
  69. package/dist/ui/accordion.d.ts +10 -0
  70. package/dist/ui/accordion.js +5 -0
  71. package/dist/ui/accordion.js.map +1 -0
  72. package/dist/ui/audio-player.d.ts +30 -0
  73. package/dist/ui/audio-player.js +7 -0
  74. package/dist/ui/audio-player.js.map +1 -0
  75. package/dist/ui/avatar.d.ts +16 -0
  76. package/dist/ui/avatar.js +5 -0
  77. package/dist/ui/avatar.js.map +1 -0
  78. package/dist/ui/badge.d.ts +15 -0
  79. package/dist/ui/badge.js +5 -0
  80. package/dist/ui/badge.js.map +1 -0
  81. package/dist/ui/button.d.ts +15 -0
  82. package/dist/ui/button.js +5 -0
  83. package/dist/ui/button.js.map +1 -0
  84. package/dist/ui/chat-bubble.d.ts +21 -0
  85. package/dist/ui/chat-bubble.js +6 -0
  86. package/dist/ui/chat-bubble.js.map +1 -0
  87. package/dist/ui/chat-panel.d.ts +35 -0
  88. package/dist/ui/chat-panel.js +10 -0
  89. package/dist/ui/chat-panel.js.map +1 -0
  90. package/dist/ui/checkbox.d.ts +17 -0
  91. package/dist/ui/checkbox.js +5 -0
  92. package/dist/ui/checkbox.js.map +1 -0
  93. package/dist/ui/file-card.d.ts +27 -0
  94. package/dist/ui/file-card.js +5 -0
  95. package/dist/ui/file-card.js.map +1 -0
  96. package/dist/ui/input.d.ts +11 -0
  97. package/dist/ui/input.js +5 -0
  98. package/dist/ui/input.js.map +1 -0
  99. package/dist/ui/label.d.ts +9 -0
  100. package/dist/ui/label.js +5 -0
  101. package/dist/ui/label.js.map +1 -0
  102. package/dist/ui/like-dislike.d.ts +32 -0
  103. package/dist/ui/like-dislike.js +9 -0
  104. package/dist/ui/like-dislike.js.map +1 -0
  105. package/dist/ui/live-waiting.d.ts +16 -0
  106. package/dist/ui/live-waiting.js +8 -0
  107. package/dist/ui/live-waiting.js.map +1 -0
  108. package/dist/ui/progress-stage.d.ts +19 -0
  109. package/dist/ui/progress-stage.js +5 -0
  110. package/dist/ui/progress-stage.js.map +1 -0
  111. package/dist/ui/progress.d.ts +19 -0
  112. package/dist/ui/progress.js +5 -0
  113. package/dist/ui/progress.js.map +1 -0
  114. package/dist/ui/radio-group.d.ts +19 -0
  115. package/dist/ui/radio-group.js +5 -0
  116. package/dist/ui/radio-group.js.map +1 -0
  117. package/dist/ui/scroll-area.d.ts +8 -0
  118. package/dist/ui/scroll-area.js +5 -0
  119. package/dist/ui/scroll-area.js.map +1 -0
  120. package/dist/ui/sheet.d.ts +17 -0
  121. package/dist/ui/sheet.js +5 -0
  122. package/dist/ui/sheet.js.map +1 -0
  123. package/dist/ui/slider.d.ts +16 -0
  124. package/dist/ui/slider.js +5 -0
  125. package/dist/ui/slider.js.map +1 -0
  126. package/dist/ui/switch.d.ts +16 -0
  127. package/dist/ui/switch.js +5 -0
  128. package/dist/ui/switch.js.map +1 -0
  129. package/dist/ui/tabs.d.ts +15 -0
  130. package/dist/ui/tabs.js +5 -0
  131. package/dist/ui/tabs.js.map +1 -0
  132. package/dist/ui/textarea.d.ts +12 -0
  133. package/dist/ui/textarea.js +5 -0
  134. package/dist/ui/textarea.js.map +1 -0
  135. package/dist/ui/toggle.d.ts +17 -0
  136. package/dist/ui/toggle.js +5 -0
  137. package/dist/ui/toggle.js.map +1 -0
  138. package/dist/ui/video-player.d.ts +28 -0
  139. package/dist/ui/video-player.js +7 -0
  140. package/dist/ui/video-player.js.map +1 -0
  141. 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":";;;;;;AAQA,SAAS,MAAM,EAAA,EAAgE;AAAhE,EAAA,IAAK,kBAAL,EAAA,EAAK,EAAA,CAAA;AAClB,EAAA,2BAAQA,MAAA,CAAe,IAAA,EAAf,cAAA,CAAA,EAAoB,WAAA,EAAU,WAAY,KAAA,CAAO,CAAA;AAC3D;AAEA,SAAS,aAAa,EAAA,EAEkC;AAFlC,EAAA,IACjB,kBADiB,EAAA,EACjB,EAAA,CAAA;AAEH,EAAA,2BAAQA,MAAA,CAAe,OAAA,EAAf,cAAA,CAAA,EAAuB,WAAA,EAAU,mBAAoB,KAAA,CAAO,CAAA;AACtE;AAEA,SAAS,WAAW,EAAA,EAEkC;AAFlC,EAAA,IACf,kBADe,EAAA,EACf,EAAA,CAAA;AAEH,EAAA,2BAAQA,MAAA,CAAe,KAAA,EAAf,cAAA,CAAA,EAAqB,WAAA,EAAU,iBAAkB,KAAA,CAAO,CAAA;AAClE;AAEA,SAAS,YAAY,EAAA,EAEkC;AAFlC,EAAA,IAChB,kBADgB,EAAA,EAChB,EAAA,CAAA;AAEH,EAAA,2BAAQA,MAAA,CAAe,MAAA,EAAf,cAAA,CAAA,EAAsB,WAAA,EAAU,kBAAmB,KAAA,CAAO,CAAA;AACpE;AAEA,SAAS,aAAa,EAAA,EAGkC;AAHlC,EAAA,IAAA,EAAA,GAAA,EAAA,EACpB;AAAA,IAAA;AAAA,GA/BF,GA8BsB,EAAA,EAEjB,KAAA,GAAA,SAAA,CAFiB,EAAA,EAEjB;AAAA,IADH;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,GAAA;AAAA,IAACA,MAAA,CAAe,OAAA;AAAA,IAAf,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wJAAA;AAAA,QACA;AAAA;AACF,KAAA,EACI,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,aAAa,EAAA,EASnB;AATmB,EAAA,IAAA,EAAA,GAAA,EAAA,EACpB;AAAA,IAAA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA,GAAO,OAAA;AAAA,IACP,eAAA,GAAkB;AAAA,GAlDpB,GA8CsB,EAAA,EAKjB,KAAA,GAAA,SAAA,CALiB,EAAA,EAKjB;AAAA,IAJH,WAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAMA,EAAA,4BACG,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,oBACd,IAAA;AAAA,MAACA,MAAA,CAAe,OAAA;AAAA,MAAf,aAAA,CAAA,cAAA,CAAA;AAAA,QACC,WAAA,EAAU,eAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,4MAAA;AAAA,UACA,SAAS,OAAA,IACP,kIAAA;AAAA,UACF,SAAS,MAAA,IACP,+HAAA;AAAA,UACF,SAAS,KAAA,IACP,0GAAA;AAAA,UACF,SAAS,QAAA,IACP,mHAAA;AAAA,UACF;AAAA;AACF,OAAA,EACI,KAAA,CAAA,EAdL;AAAA,QAgBE,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,mCACC,IAAA,CAACA,MAAA,CAAe,KAAA,EAAf,EAAqB,WAAU,4OAAA,EAC9B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAM,WAAU,QAAA,EAAS,CAAA;AAAA,4BAC1B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK;AAAA,WAAA,EACjC;AAAA;AAAA,OAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,YAAY,EAAA,EAAsD;AAAtD,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,EAAA,SAAA,EAvFvB,GAuFqB,EAAA,EAAgB,KAAA,GAAA,SAAA,CAAhB,IAAgB,CAAd,WAAA,CAAA,CAAA;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS;AAAA,KAAA,EAChD,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,YAAY,EAAA,EAAsD;AAAtD,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,EAAA,SAAA,EAjGvB,GAiGqB,EAAA,EAAgB,KAAA,GAAA,SAAA,CAAhB,IAAgB,CAAd,WAAA,CAAA,CAAA;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,SAAS;AAAA,KAAA,EACtD,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAW,EAAA,EAGkC;AAHlC,EAAA,IAAA,EAAA,GAAA,EAAA,EAClB;AAAA,IAAA;AAAA,GA5GF,GA2GoB,EAAA,EAEf,KAAA,GAAA,SAAA,CAFe,EAAA,EAEf;AAAA,IADH;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,GAAA;AAAA,IAACA,MAAA,CAAe,KAAA;AAAA,IAAf,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS;AAAA,KAAA,EACpD,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,iBAAiB,EAAA,EAGkC;AAHlC,EAAA,IAAA,EAAA,GAAA,EAAA,EACxB;AAAA,IAAA;AAAA,GAzHF,GAwH0B,EAAA,EAErB,KAAA,GAAA,SAAA,CAFqB,EAAA,EAErB;AAAA,IADH;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,GAAA;AAAA,IAACA,MAAA,CAAe,WAAA;AAAA,IAAf,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS;AAAA,KAAA,EACpD,KAAA;AAAA,GACN;AAEJ","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