@fluencypassdevs/cycle 1.21.1 → 1.27.2

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 (48) hide show
  1. package/bin/components.generated.mjs +2937 -0
  2. package/bin/mcp.mjs +3 -1332
  3. package/dist/chunk-GI7MEYSN.js +163 -0
  4. package/dist/chunk-GI7MEYSN.js.map +1 -0
  5. package/dist/{chunk-LM5ZJFLA.js → chunk-GKJ45JXA.js} +10 -4
  6. package/dist/chunk-GKJ45JXA.js.map +1 -0
  7. package/dist/{chunk-YHCDOHJL.js → chunk-OLYW5LVG.js} +3 -3
  8. package/dist/{chunk-YHCDOHJL.js.map → chunk-OLYW5LVG.js.map} +1 -1
  9. package/dist/chunk-ONEVPGJY.js +152 -0
  10. package/dist/chunk-ONEVPGJY.js.map +1 -0
  11. package/dist/chunk-P7Y2OBHX.js +97 -0
  12. package/dist/chunk-P7Y2OBHX.js.map +1 -0
  13. package/dist/{chunk-UHFMTX23.js → chunk-QXZRH3HU.js} +10 -4
  14. package/dist/chunk-QXZRH3HU.js.map +1 -0
  15. package/dist/chunk-T73O7F3B.js +131 -0
  16. package/dist/chunk-T73O7F3B.js.map +1 -0
  17. package/dist/chunk-WVCNTN4F.js +232 -0
  18. package/dist/chunk-WVCNTN4F.js.map +1 -0
  19. package/dist/composites/chat-thread.js +1 -1
  20. package/dist/index.d.ts +8 -2
  21. package/dist/index.js +32 -27
  22. package/dist/marketing/effects/index.js +2 -2
  23. package/dist/marketing/motion/index.js +2 -2
  24. package/dist/marketing/typography/index.js +1 -1
  25. package/dist/styles/tokens.css +17 -0
  26. package/dist/ui/audio-player.d.ts +17 -3
  27. package/dist/ui/audio-player.js +1 -1
  28. package/dist/ui/chat-panel.js +2 -2
  29. package/dist/ui/command.d.ts +24 -0
  30. package/dist/ui/command.js +12 -0
  31. package/dist/ui/command.js.map +1 -0
  32. package/dist/ui/file-dropzone.d.ts +53 -0
  33. package/dist/ui/file-dropzone.js +12 -0
  34. package/dist/ui/file-dropzone.js.map +1 -0
  35. package/dist/ui/pagination.d.ts +26 -0
  36. package/dist/ui/pagination.js +11 -0
  37. package/dist/ui/pagination.js.map +1 -0
  38. package/dist/ui/stepper.d.ts +33 -0
  39. package/dist/ui/stepper.js +10 -0
  40. package/dist/ui/stepper.js.map +1 -0
  41. package/dist/ui/table.d.ts +13 -0
  42. package/dist/ui/table.js +7 -0
  43. package/dist/ui/table.js.map +1 -0
  44. package/dist/ui/video-player.d.ts +12 -3
  45. package/dist/ui/video-player.js +1 -1
  46. package/package.json +2 -1
  47. package/dist/chunk-LM5ZJFLA.js.map +0 -1
  48. package/dist/chunk-UHFMTX23.js.map +0 -1
@@ -0,0 +1,163 @@
1
+ import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent } from './chunk-AHHT4FZS.js';
2
+ import { CycleIcon } from './chunk-US5LXJTO.js';
3
+ import { cn } from './chunk-W4KJCBMW.js';
4
+ import { __objRest, __spreadValues, __spreadProps } from './chunk-2NMEKWO5.js';
5
+ import { Command as Command$1 } from 'cmdk';
6
+ import { Search } from 'lucide-react';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ function Command(_a) {
10
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
11
+ return /* @__PURE__ */ jsx(
12
+ Command$1,
13
+ __spreadValues({
14
+ "data-slot": "command",
15
+ className: cn(
16
+ "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
17
+ className
18
+ )
19
+ }, props)
20
+ );
21
+ }
22
+ function CommandDialog(_a) {
23
+ var _b = _a, {
24
+ title = "Paleta de comandos",
25
+ description = "Busque um comando...",
26
+ children,
27
+ className,
28
+ showCloseButton = true
29
+ } = _b, props = __objRest(_b, [
30
+ "title",
31
+ "description",
32
+ "children",
33
+ "className",
34
+ "showCloseButton"
35
+ ]);
36
+ return /* @__PURE__ */ jsxs(Dialog, __spreadProps(__spreadValues({}, props), { children: [
37
+ /* @__PURE__ */ jsxs(DialogHeader, { className: "sr-only", children: [
38
+ /* @__PURE__ */ jsx(DialogTitle, { children: title }),
39
+ /* @__PURE__ */ jsx(DialogDescription, { children: description })
40
+ ] }),
41
+ /* @__PURE__ */ jsx(
42
+ DialogContent,
43
+ {
44
+ className: cn("overflow-hidden p-0", className),
45
+ showCloseButton,
46
+ children: /* @__PURE__ */ jsx(Command, { className: "[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children })
47
+ }
48
+ )
49
+ ] }));
50
+ }
51
+ function CommandInput(_a) {
52
+ var _b = _a, {
53
+ className
54
+ } = _b, props = __objRest(_b, [
55
+ "className"
56
+ ]);
57
+ return /* @__PURE__ */ jsxs(
58
+ "div",
59
+ {
60
+ "data-slot": "command-input-wrapper",
61
+ className: "flex h-9 items-center gap-2 border-b border-border px-3",
62
+ children: [
63
+ /* @__PURE__ */ jsx(CycleIcon, { icon: Search, size: "sm", decorative: true, className: "shrink-0 opacity-50" }),
64
+ /* @__PURE__ */ jsx(
65
+ Command$1.Input,
66
+ __spreadValues({
67
+ "data-slot": "command-input",
68
+ className: cn(
69
+ "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
70
+ className
71
+ )
72
+ }, props)
73
+ )
74
+ ]
75
+ }
76
+ );
77
+ }
78
+ function CommandList(_a) {
79
+ var _b = _a, {
80
+ className
81
+ } = _b, props = __objRest(_b, [
82
+ "className"
83
+ ]);
84
+ return /* @__PURE__ */ jsx(
85
+ Command$1.List,
86
+ __spreadValues({
87
+ "data-slot": "command-list",
88
+ className: cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto", className)
89
+ }, props)
90
+ );
91
+ }
92
+ function CommandEmpty(_a) {
93
+ var props = __objRest(_a, []);
94
+ return /* @__PURE__ */ jsx(
95
+ Command$1.Empty,
96
+ __spreadValues({
97
+ "data-slot": "command-empty",
98
+ className: "py-6 text-center text-sm text-muted-foreground"
99
+ }, props)
100
+ );
101
+ }
102
+ function CommandGroup(_a) {
103
+ var _b = _a, {
104
+ className
105
+ } = _b, props = __objRest(_b, [
106
+ "className"
107
+ ]);
108
+ return /* @__PURE__ */ jsx(
109
+ Command$1.Group,
110
+ __spreadValues({
111
+ "data-slot": "command-group",
112
+ className: cn(
113
+ "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
114
+ className
115
+ )
116
+ }, props)
117
+ );
118
+ }
119
+ function CommandSeparator(_a) {
120
+ var _b = _a, {
121
+ className
122
+ } = _b, props = __objRest(_b, [
123
+ "className"
124
+ ]);
125
+ return /* @__PURE__ */ jsx(
126
+ Command$1.Separator,
127
+ __spreadValues({
128
+ "data-slot": "command-separator",
129
+ className: cn("-mx-1 h-px bg-border", className)
130
+ }, props)
131
+ );
132
+ }
133
+ function CommandItem(_a) {
134
+ var _b = _a, {
135
+ className
136
+ } = _b, props = __objRest(_b, [
137
+ "className"
138
+ ]);
139
+ return /* @__PURE__ */ jsx(
140
+ Command$1.Item,
141
+ __spreadValues({
142
+ "data-slot": "command-item",
143
+ className: cn(
144
+ "relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
145
+ className
146
+ )
147
+ }, props)
148
+ );
149
+ }
150
+ function CommandShortcut(_a) {
151
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
152
+ return /* @__PURE__ */ jsx(
153
+ "span",
154
+ __spreadValues({
155
+ "data-slot": "command-shortcut",
156
+ className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className)
157
+ }, props)
158
+ );
159
+ }
160
+
161
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
162
+ //# sourceMappingURL=chunk-GI7MEYSN.js.map
163
+ //# sourceMappingURL=chunk-GI7MEYSN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/command.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-GI7MEYSN.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { CycleIcon } from \"@/components/icons\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\"\n\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\n/** Paleta de comandos em modal (Cmd+K). Composta com o Dialog do Cycle. */\nfunction CommandDialog({\n title = \"Paleta de comandos\",\n description = \"Busque um comando...\",\n children,\n className,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\"overflow-hidden p-0\", className)}\n showCloseButton={showCloseButton}\n >\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b border-border px-3\"\n >\n <CycleIcon icon={Search} size=\"sm\" decorative className=\"shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm text-muted-foreground\"\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\n/** Atalho de teclado alinhado a direita do item (ex: ⌘K) */\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n"]}
@@ -8,6 +8,11 @@ import '@vidstack/react/player/styles/base.css';
8
8
  import { RotateCcw, Play, Pause, RotateCw, Gauge, Check, VolumeX, Volume1, Volume2 } from 'lucide-react';
9
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
10
 
11
+ function resolveAudioSrc(src) {
12
+ if (typeof src === "string") return src;
13
+ if (src.src.startsWith("blob:")) return { src: src.src, type: "audio/object" };
14
+ return src;
15
+ }
11
16
  var AudioLabelsContext = React.createContext({ speedNormal: "Normal" });
12
17
  function useAudioLabels() {
13
18
  return React.useContext(AudioLabelsContext);
@@ -122,6 +127,7 @@ var AudioPlayer = React.forwardRef(
122
127
  [locale, labels]
123
128
  );
124
129
  const player = React.useRef(null);
130
+ const resolvedSrc = React.useMemo(() => resolveAudioSrc(src), [src]);
125
131
  React.useImperativeHandle(ref, () => ({
126
132
  play() {
127
133
  var _a;
@@ -166,7 +172,7 @@ var AudioPlayer = React.forwardRef(
166
172
  MediaPlayer,
167
173
  __spreadProps(__spreadValues({
168
174
  ref: player,
169
- src,
175
+ src: resolvedSrc,
170
176
  autoPlay,
171
177
  muted,
172
178
  loop,
@@ -228,7 +234,7 @@ var AudioPlayer = React.forwardRef(
228
234
  MediaPlayer,
229
235
  __spreadProps(__spreadValues({
230
236
  ref: player,
231
- src,
237
+ src: resolvedSrc,
232
238
  autoPlay,
233
239
  muted,
234
240
  loop,
@@ -257,5 +263,5 @@ var AudioPlayer = React.forwardRef(
257
263
  );
258
264
 
259
265
  export { AudioPlayer };
260
- //# sourceMappingURL=chunk-LM5ZJFLA.js.map
261
- //# sourceMappingURL=chunk-LM5ZJFLA.js.map
266
+ //# sourceMappingURL=chunk-GKJ45JXA.js.map
267
+ //# sourceMappingURL=chunk-GKJ45JXA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/audio-player.tsx"],"names":["AudioPlayer"],"mappings":"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","file":"chunk-GKJ45JXA.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n MediaPlayer,\n MediaProvider,\n TimeSlider,\n VolumeSlider,\n Time,\n PlayButton,\n MuteButton,\n SeekButton,\n useMediaState,\n useMediaRemote,\n type MediaPlayerInstance,\n type PlayerSrc,\n} from \"@vidstack/react\"\nimport \"@vidstack/react/player/styles/base.css\"\nimport {\n Play,\n Pause,\n Volume2,\n VolumeX,\n Volume1,\n RotateCcw,\n RotateCw,\n Gauge,\n Check,\n} from \"lucide-react\"\nimport { CycleIcon } from \"@/components/icons\"\nimport { cn } from \"@/lib/utils\"\nimport { type PlayerLocale, resolveAudioSpeedNormal } from \"@/components/ui/player-i18n\"\n\n/* ─── Types ─── */\n\nexport interface AudioPlayerRef {\n play(): void\n pause(): void\n readonly currentTime: number\n readonly duration: number\n}\n\nexport interface AudioPlayerLabels {\n /** Label da velocidade normal no menu (default depende do locale) */\n speedNormal?: string\n}\n\n/** Fonte de audio: URL string ou objeto com MIME type explicito.\n O Vidstack infere o tipo pela EXTENSAO no path da URL — quando ela nao\n existe (blob: de arquivo local, endpoints sem extensao) ou engana\n (.ogg casa com o regex de VIDEO da lib), o provider de audio nunca\n carrega. Nesses casos, passar { src, type } (ex: type do File.type\n local ou o ContentType salvo no upload). Para `blob:`, qualquer\n `type` serve — o componente normaliza internamente para\n \"audio/object\" (rota garantida do Vidstack: a decodificacao fica com\n o <audio> nativo, que aceita formatos fora da allowlist da lib,\n como audio/wav de gravacoes). */\nexport type AudioPlayerSrc = string | { src: string; type: string }\n\n/** blob: → \"audio/object\" (unica rota que o isAudioSrc do Vidstack aceita\n para blob; a allowlist AUDIO_TYPES nao cobre p.ex. audio/wav). Demais\n objetos passam direto — cast porque o runtime aceita mais MIME types\n que a uniao AudioMimeType dos tipos. */\nfunction resolveAudioSrc(src: AudioPlayerSrc): PlayerSrc {\n if (typeof src === \"string\") return src\n if (src.src.startsWith(\"blob:\")) return { src: src.src, type: \"audio/object\" }\n return src as PlayerSrc\n}\n\nexport interface AudioPlayerProps {\n /** Fonte do audio: URL (mp3, wav, m4a, m3u8...) ou { src, type } para blob:/URL sem extensao/.ogg */\n src: AudioPlayerSrc\n /** Nome da track/aula */\n title: string\n /** Subtitulo / nome do curso */\n subtitle?: string\n /** URL da imagem de capa (variante card) */\n coverArt?: string\n /** Alt text da imagem de capa */\n coverArtAlt?: string\n /** Variante de layout */\n variant?: \"default\" | \"card\"\n /** Icones, textos e sliders em primary-foreground — usar com .theme-* */\n filled?: boolean\n /** Iniciar automaticamente */\n autoPlay?: boolean\n /** Iniciar mutado */\n muted?: boolean\n /** Repetir ao terminar */\n loop?: boolean\n /** Exibir controle de velocidade (default: true — EdTech) */\n showSpeed?: boolean\n /** Tempo inicial em segundos — usado para retomar de onde o usuario parou (resume position) */\n startTime?: number\n /** Idioma dos controles (default: \"pt-BR\"). 13 locales pre-configurados. */\n locale?: PlayerLocale\n /** Overrides pontuais de labels — aplicados em cima do locale selecionado */\n labels?: AudioPlayerLabels\n /** Callback com progresso do audio (currentTime em segundos, duration em segundos) */\n onTimeUpdate?: (currentTime: number, duration: number) => void\n /** Callback disparado quando o audio termina */\n onEnded?: () => void\n className?: string\n}\n\n/* ─── Labels context ─── */\n\nconst AudioLabelsContext = React.createContext<{ speedNormal: string }>({ speedNormal: \"Normal\" })\nfunction useAudioLabels() {\n return React.useContext(AudioLabelsContext)\n}\n\n/* ─── Shared styles ─── */\n\nconst controlBtnClass =\n \"group/btn inline-flex size-9 cursor-pointer items-center justify-center rounded-md text-foreground outline-none transition-colors hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring group-data-[filled]:text-primary-foreground group-data-[filled]:hover:bg-primary-foreground/10\"\n\n/** Play, Pause e Volume usam icones filled (solid) — igual YouTube */\nconst filledIconClass =\n \"fill-current !stroke-transparent text-foreground group-data-[filled]:text-primary-foreground\"\n\nconst outlineIconClass =\n \"text-foreground group-data-[filled]:text-primary-foreground\"\n\n/* ─── Sub-components ─── */\n\nfunction AudioPlayControl() {\n const isPaused = useMediaState(\"paused\")\n return (\n <PlayButton className={controlBtnClass}>\n {isPaused ? (\n <CycleIcon icon={Play} size=\"sm\" decorative className={filledIconClass} />\n ) : (\n <CycleIcon icon={Pause} size=\"sm\" decorative className={filledIconClass} />\n )}\n </PlayButton>\n )\n}\n\nfunction AudioSeekBackwardControl() {\n return (\n <SeekButton className={controlBtnClass} seconds={-10}>\n <CycleIcon icon={RotateCcw} size=\"sm\" decorative className={outlineIconClass} />\n </SeekButton>\n )\n}\n\nfunction AudioSeekForwardControl() {\n return (\n <SeekButton className={controlBtnClass} seconds={10}>\n <CycleIcon icon={RotateCw} size=\"sm\" decorative className={outlineIconClass} />\n </SeekButton>\n )\n}\n\nfunction AudioMuteControl() {\n const volume = useMediaState(\"volume\")\n const isMuted = useMediaState(\"muted\")\n\n const Icon = isMuted || volume === 0 ? VolumeX : volume < 0.5 ? Volume1 : Volume2\n\n return (\n <MuteButton className={controlBtnClass}>\n <CycleIcon icon={Icon} size=\"sm\" decorative className={filledIconClass} />\n </MuteButton>\n )\n}\n\nfunction AudioVolumeControl() {\n return (\n <VolumeSlider.Root className=\"group relative hidden h-9 w-20 cursor-pointer touch-none select-none items-center outline-none sm:inline-flex\">\n <VolumeSlider.Track className=\"relative h-[4px] w-full rounded-full bg-accent group-data-[filled]/root:bg-primary-foreground/30\">\n <VolumeSlider.TrackFill className=\"absolute h-full w-[var(--slider-fill)] rounded-full bg-primary group-data-[filled]/root:bg-primary-foreground\" />\n </VolumeSlider.Track>\n <VolumeSlider.Thumb className=\"absolute left-[var(--slider-fill)] top-1/2 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary opacity-0 transition-opacity group-data-[active]:opacity-100 group-data-[dragging]:opacity-100 group-data-[filled]/root:bg-primary-foreground\" />\n </VolumeSlider.Root>\n )\n}\n\nfunction AudioSeekBar() {\n return (\n <TimeSlider.Root className=\"group relative inline-flex h-9 w-full cursor-pointer touch-none select-none items-center outline-none\">\n <TimeSlider.Track className=\"relative h-[4px] w-full rounded-full bg-accent group-data-[filled]/root:bg-primary-foreground/30\">\n <TimeSlider.Progress className=\"absolute h-full w-[var(--slider-progress)] rounded-full bg-accent-foreground/20 group-data-[filled]/root:bg-primary-foreground/20\" />\n <TimeSlider.TrackFill className=\"absolute h-full w-[var(--slider-fill)] rounded-full bg-primary group-data-[filled]/root:bg-primary-foreground\" />\n </TimeSlider.Track>\n <TimeSlider.Thumb className=\"absolute left-[var(--slider-fill)] top-1/2 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary opacity-0 transition-opacity group-data-[active]:opacity-100 group-data-[dragging]:opacity-100 group-data-[filled]/root:bg-primary-foreground\" />\n\n {/* Time preview on hover */}\n <TimeSlider.Preview className=\"pointer-events-none flex flex-col items-center opacity-0 transition-opacity duration-200 data-[visible]:opacity-100\">\n <TimeSlider.Value className=\"rounded bg-popover px-1.5 py-0.5 text-[11px] font-mono text-popover-foreground border border-border shadow-sm\" />\n </TimeSlider.Preview>\n </TimeSlider.Root>\n )\n}\n\nfunction AudioTimeDisplay() {\n return (\n <div className=\"flex items-center gap-1 text-xs font-mono text-muted-foreground tabular-nums group-data-[filled]:text-primary-foreground/80\">\n <Time type=\"current\" />\n <span>/</span>\n <Time type=\"duration\" />\n </div>\n )\n}\n\nfunction AudioSpeedControl() {\n const playbackRate = useMediaState(\"playbackRate\")\n const remote = useMediaRemote()\n const [open, setOpen] = React.useState(false)\n const l = useAudioLabels()\n\n const rates = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]\n\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className={controlBtnClass}\n >\n {playbackRate === 1 ? (\n <CycleIcon icon={Gauge} size=\"sm\" decorative className={outlineIconClass} />\n ) : (\n <span className=\"text-xs font-mono font-semibold text-foreground group-data-[filled]:text-primary-foreground\">{playbackRate}x</span>\n )}\n </button>\n\n {open && (\n <>\n {/* Backdrop to close */}\n <div className=\"fixed inset-0 z-40\" onClick={() => setOpen(false)} />\n\n <div className=\"absolute bottom-full right-0 z-50 mb-2 min-w-[120px] rounded-lg border border-border bg-popover p-1 shadow-lg\">\n {rates.map((rate) => (\n <button\n key={rate}\n type=\"button\"\n onClick={() => {\n remote.changePlaybackRate(rate)\n setOpen(false)\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-3 py-1.5 text-sm text-popover-foreground/80 transition-colors hover:bg-accent hover:text-popover-foreground\",\n playbackRate === rate && \"text-popover-foreground font-medium\"\n )}\n >\n <span className=\"size-4 flex items-center justify-center\">\n {playbackRate === rate && <CycleIcon icon={Check} size=\"2xs\" decorative className=\"text-popover-foreground\" />}\n </span>\n <span className=\"font-mono\">{rate === 1 ? l.speedNormal : `${rate}x`}</span>\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n )\n}\n\n/* ─── Main component ─── */\n\nexport const AudioPlayer = React.forwardRef<AudioPlayerRef, AudioPlayerProps>(\n function AudioPlayer(\n {\n src,\n title,\n subtitle,\n coverArt,\n coverArtAlt = \"\",\n variant = \"default\",\n filled = false,\n autoPlay = false,\n muted = false,\n loop = false,\n showSpeed = true,\n startTime,\n locale = \"pt-BR\",\n labels,\n onTimeUpdate,\n onEnded,\n className,\n },\n ref\n ) {\n const resolvedLabels = React.useMemo(\n () => ({ speedNormal: resolveAudioSpeedNormal(locale, labels?.speedNormal) }),\n [locale, labels]\n )\n const player = React.useRef<MediaPlayerInstance>(null)\n const resolvedSrc = React.useMemo(() => resolveAudioSrc(src), [src])\n\n React.useImperativeHandle(ref, () => ({\n play() {\n player.current?.play()\n },\n pause() {\n player.current?.pause()\n },\n get currentTime() {\n return player.current?.currentTime ?? 0\n },\n get duration() {\n return player.current?.duration ?? 0\n },\n }))\n\n const handleTimeUpdate = React.useCallback(\n (detail: { currentTime: number }) => {\n if (onTimeUpdate && player.current) {\n onTimeUpdate(detail.currentTime, player.current.duration)\n }\n },\n [onTimeUpdate]\n )\n\n const handleEnded = React.useCallback(() => {\n onEnded?.()\n }, [onEnded])\n\n // Resume position: seek to startTime once the player is ready\n const hasAppliedStartTime = React.useRef(false)\n const handleCanPlay = React.useCallback(() => {\n if (startTime && startTime > 0 && !hasAppliedStartTime.current && player.current) {\n player.current.currentTime = startTime\n hasAppliedStartTime.current = true\n }\n }, [startTime])\n\n const playerEvents = {\n onCanPlay: handleCanPlay,\n ...(onTimeUpdate ? { onTimeUpdate: handleTimeUpdate } : {}),\n ...(onEnded ? { onEnded: handleEnded } : {}),\n }\n\n if (variant === \"card\") {\n return (\n <AudioLabelsContext.Provider value={resolvedLabels}>\n <MediaPlayer\n ref={player}\n src={resolvedSrc}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n viewType=\"audio\"\n data-filled={filled ? \"\" : undefined}\n style={filled ? { '--primary-foreground': 'var(--secondary-foreground)' } as Record<string, string> : undefined}\n className={cn(\n \"group/root group !block w-full rounded-xl border border-border bg-card p-4 shadow-sm md:p-6\",\n className\n )}\n {...playerEvents}\n >\n <MediaProvider className=\"!hidden\" />\n\n {/* Top: cover art + text */}\n <div className=\"flex gap-4 mb-4 md:gap-5 md:mb-6\">\n {coverArt && (\n <img\n src={coverArt}\n alt={coverArtAlt}\n className=\"size-16 shrink-0 rounded-lg object-cover bg-muted md:size-24 md:rounded-xl\"\n />\n )}\n <div className=\"flex min-w-0 flex-col justify-center\">\n <p className={cn(\n \"truncate heading-md md:heading-xl\",\n filled ? \"text-primary-foreground\" : \"text-card-foreground\"\n )}>{title}</p>\n {subtitle && (\n <p className={cn(\n \"truncate body-md md:body-lg\",\n filled ? \"text-primary-foreground/70\" : \"text-muted-foreground\"\n )}>{subtitle}</p>\n )}\n </div>\n </div>\n\n {/* Seek bar */}\n <div className=\"flex w-full items-center\">\n <AudioSeekBar />\n </div>\n\n {/* Time */}\n <div className=\"flex items-center justify-between px-0.5 -mt-1 mb-1 md:mb-2\">\n <div className={cn(\n \"text-[11px] font-mono tabular-nums md:text-xs\",\n filled ? \"text-primary-foreground/80\" : \"text-muted-foreground\"\n )}>\n <Time type=\"current\" />\n </div>\n <div className={cn(\n \"text-[11px] font-mono tabular-nums md:text-xs\",\n filled ? \"text-primary-foreground/80\" : \"text-muted-foreground\"\n )}>\n <Time type=\"duration\" />\n </div>\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center gap-1 md:gap-2\">\n <AudioSeekBackwardControl />\n <AudioPlayControl />\n <AudioSeekForwardControl />\n\n <div className=\"flex-1\" />\n\n {showSpeed && <AudioSpeedControl />}\n <AudioMuteControl />\n <AudioVolumeControl />\n </div>\n </MediaPlayer>\n </AudioLabelsContext.Provider>\n )\n }\n\n // Default variant (compact bar)\n return (\n <AudioLabelsContext.Provider value={resolvedLabels}>\n <MediaPlayer\n ref={player}\n src={resolvedSrc}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n viewType=\"audio\"\n data-filled={filled ? \"\" : undefined}\n style={filled ? { '--primary-foreground': 'var(--secondary-foreground)' } as Record<string, string> : undefined}\n className={cn(\n \"group/root group !flex w-full items-center gap-1.5 rounded-xl border border-border bg-card px-2 py-1.5 shadow-sm\",\n className\n )}\n {...playerEvents}\n >\n <MediaProvider className=\"!hidden\" />\n\n {/* Left controls */}\n <AudioSeekBackwardControl />\n <AudioPlayControl />\n <AudioSeekForwardControl />\n\n {/* Seek bar */}\n <div className=\"flex-1 px-1\">\n <AudioSeekBar />\n </div>\n\n {/* Time */}\n <AudioTimeDisplay />\n\n {/* Right controls */}\n {showSpeed && <AudioSpeedControl />}\n <AudioMuteControl />\n <AudioVolumeControl />\n </MediaPlayer>\n </AudioLabelsContext.Provider>\n )\n }\n)\n"]}
@@ -1,6 +1,6 @@
1
1
  import { ChatBubble } from './chunk-VHNPIT56.js';
2
- import { CycleIcon } from './chunk-US5LXJTO.js';
3
2
  import { ScrollArea } from './chunk-6ZID2UNI.js';
3
+ import { CycleIcon } from './chunk-US5LXJTO.js';
4
4
  import { Button } from './chunk-LALM2LHM.js';
5
5
  import { cn } from './chunk-W4KJCBMW.js';
6
6
  import { __objRest, __spreadProps, __spreadValues } from './chunk-2NMEKWO5.js';
@@ -100,5 +100,5 @@ function ChatPanel(_a) {
100
100
  }
101
101
 
102
102
  export { ChatPanel };
103
- //# sourceMappingURL=chunk-YHCDOHJL.js.map
104
- //# sourceMappingURL=chunk-YHCDOHJL.js.map
103
+ //# sourceMappingURL=chunk-OLYW5LVG.js.map
104
+ //# sourceMappingURL=chunk-OLYW5LVG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/chat-panel.tsx"],"names":[],"mappings":";;;;;;;;;;AA0CA,SAAS,UAAU,EAAA,EAQA;AARA,EAAA,IAAA,EAAA,GAAA,EAAA,EACjB;AAAA,IAAA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,uBAAA;AAAA,IACd,KAAA,GAAQ,MAAA;AAAA,IACR;AAAA,GAhDF,GA0CmB,EAAA,EAOd,KAAA,GAAA,SAAA,CAPc,EAAA,EAOd;AAAA,IANH,UAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAkB,aAAuB,IAAI,CAAA;AAGnD,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,EAAA,CAAG,YAAY,EAAA,CAAG,YAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,CAAS,MAAM,CAAC,CAAA;AAEpB,EAAA,SAAS,aAAa,CAAA,EAAoB;AACxC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,WAAW,QAAA,EAAU;AAC1B,IAAA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAgB,OAAA,CAAA;AAChB,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oDAAA;AAAA,QACA;AAAA;AACF,KAAA,EACI,KAAA,CAAA,EANL;AAAA,MASC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACb,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,uCAAA,EAAyC,iBAAM,CAAA,EAC/D,CAAA;AAAA,wBAGA,GAAA,CAAC,cAAW,SAAA,EAAU,gBAAA,EACpB,+BAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,SAAA,EAAU,yBAAA,EAC5B,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,WAAW,CAAA,oBACnB,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAiD,QAAA,EAAA,yBAAA,EAE9D,CAAA;AAAA,UAED,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACb,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAEC,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,WAAW,GAAA,CAAI,SAAA;AAAA,cACf,SAAS,GAAA,CAAI;AAAA,aAAA;AAAA,YALR,GAAA,CAAI;AAAA,WAOZ;AAAA,SAAA,EACH,CAAA,EACF,CAAA;AAAA,QAGC,aAAA,oBACC,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAU,6DAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,MAAA;AAAA,kBACL,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACxC,WAAA;AAAA,kBACA,QAAA;AAAA,kBACA,SAAA,EAAU;AAAA;AAAA,eACZ;AAAA,8BACA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,IAAA,EAAK,SAAA;AAAA,kBACL,QAAA,EAAU,QAAA,IAAY,CAAC,KAAA,CAAM,IAAA,EAAK;AAAA,kBAClC,SAAA,EAAU,UAAA;AAAA,kBAEV,8BAAC,SAAA,EAAA,EAAU,IAAA,EAAM,UAAU,IAAA,EAAK,IAAA,EAAK,YAAU,IAAA,EAAC;AAAA;AAAA;AAClD;AAAA;AAAA;AACF;AAAA,KAAA;AAAA,GAEJ;AAEJ","file":"chunk-YHCDOHJL.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { SendIcon } from \"lucide-react\"\nimport { CycleIcon } from \"@/components/icons/CycleIcon\"\nimport { Button } from \"@/components/ui/button\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { ChatBubble, type ChatBubbleProps } from \"@/components/ui/chat-bubble\"\nimport { cn } from \"@/lib/utils\"\n\n/* ─── Types ─── */\n\nexport interface ChatMessage {\n /** Unique message ID */\n id: string\n /** Author display name */\n author: string\n /** Avatar URL */\n avatar?: string\n /** Message text */\n message: string\n /** Timestamp label (e.g. \"14:32\") */\n timestamp?: string\n /** Message variant */\n variant?: ChatBubbleProps[\"variant\"]\n}\n\nexport interface ChatPanelProps extends React.ComponentProps<\"div\"> {\n /** Chat messages array */\n messages: ChatMessage[]\n /** Callback when the user sends a message */\n onSendMessage?: (message: string) => void\n /** Disable the input (e.g. when chat is read-only or ended) */\n disabled?: boolean\n /** Input placeholder text */\n placeholder?: string\n /** Title shown at the top of the panel */\n title?: string\n}\n\n/* ─── Component ─── */\n\nfunction ChatPanel({\n messages,\n onSendMessage,\n disabled = false,\n placeholder = \"Envie uma mensagem...\",\n title = \"Chat\",\n className,\n ...props\n}: ChatPanelProps) {\n const [input, setInput] = React.useState(\"\")\n const scrollRef = React.useRef<HTMLDivElement>(null)\n\n /* Auto-scroll to bottom on new messages */\n React.useEffect(() => {\n const el = scrollRef.current\n if (el) {\n el.scrollTop = el.scrollHeight\n }\n }, [messages.length])\n\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n const trimmed = input.trim()\n if (!trimmed || disabled) return\n onSendMessage?.(trimmed)\n setInput(\"\")\n }\n\n return (\n <div\n data-slot=\"chat-panel\"\n className={cn(\n \"flex flex-col bg-background border-l border-border\",\n className\n )}\n {...props}\n >\n {/* Header */}\n <div className=\"shrink-0 flex items-center h-12 px-4 border-b border-border\">\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n </div>\n\n {/* Messages */}\n <ScrollArea className=\"flex-1 min-h-0\">\n <div ref={scrollRef} className=\"flex flex-col gap-3 p-4\">\n {messages.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-8\">\n Nenhuma mensagem ainda.\n </p>\n )}\n {messages.map((msg) => (\n <ChatBubble\n key={msg.id}\n author={msg.author}\n avatar={msg.avatar}\n message={msg.message}\n timestamp={msg.timestamp}\n variant={msg.variant}\n />\n ))}\n </div>\n </ScrollArea>\n\n {/* Input */}\n {onSendMessage && (\n <form\n onSubmit={handleSubmit}\n className=\"shrink-0 flex items-center gap-2 p-3 border-t border-border\"\n >\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className=\"flex-1 min-w-0 h-9 rounded-lg border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 ring-offset-background disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n <Button\n type=\"submit\"\n size=\"icon-sm\"\n disabled={disabled || !input.trim()}\n className=\"shrink-0\"\n >\n <CycleIcon icon={SendIcon} size=\"xs\" decorative />\n </Button>\n </form>\n )}\n </div>\n )\n}\n\nexport { ChatPanel }\n"]}
1
+ {"version":3,"sources":["../src/components/ui/chat-panel.tsx"],"names":[],"mappings":";;;;;;;;;;AA0CA,SAAS,UAAU,EAAA,EAQA;AARA,EAAA,IAAA,EAAA,GAAA,EAAA,EACjB;AAAA,IAAA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,uBAAA;AAAA,IACd,KAAA,GAAQ,MAAA;AAAA,IACR;AAAA,GAhDF,GA0CmB,EAAA,EAOd,KAAA,GAAA,SAAA,CAPc,EAAA,EAOd;AAAA,IANH,UAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAkB,aAAuB,IAAI,CAAA;AAGnD,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,EAAA,CAAG,YAAY,EAAA,CAAG,YAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,CAAS,MAAM,CAAC,CAAA;AAEpB,EAAA,SAAS,aAAa,CAAA,EAAoB;AACxC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,WAAW,QAAA,EAAU;AAC1B,IAAA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAgB,OAAA,CAAA;AAChB,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oDAAA;AAAA,QACA;AAAA;AACF,KAAA,EACI,KAAA,CAAA,EANL;AAAA,MASC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACb,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,uCAAA,EAAyC,iBAAM,CAAA,EAC/D,CAAA;AAAA,wBAGA,GAAA,CAAC,cAAW,SAAA,EAAU,gBAAA,EACpB,+BAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,SAAA,EAAU,yBAAA,EAC5B,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,WAAW,CAAA,oBACnB,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAiD,QAAA,EAAA,yBAAA,EAE9D,CAAA;AAAA,UAED,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACb,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAEC,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,WAAW,GAAA,CAAI,SAAA;AAAA,cACf,SAAS,GAAA,CAAI;AAAA,aAAA;AAAA,YALR,GAAA,CAAI;AAAA,WAOZ;AAAA,SAAA,EACH,CAAA,EACF,CAAA;AAAA,QAGC,aAAA,oBACC,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAU,6DAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,MAAA;AAAA,kBACL,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACxC,WAAA;AAAA,kBACA,QAAA;AAAA,kBACA,SAAA,EAAU;AAAA;AAAA,eACZ;AAAA,8BACA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,IAAA,EAAK,SAAA;AAAA,kBACL,QAAA,EAAU,QAAA,IAAY,CAAC,KAAA,CAAM,IAAA,EAAK;AAAA,kBAClC,SAAA,EAAU,UAAA;AAAA,kBAEV,8BAAC,SAAA,EAAA,EAAU,IAAA,EAAM,UAAU,IAAA,EAAK,IAAA,EAAK,YAAU,IAAA,EAAC;AAAA;AAAA;AAClD;AAAA;AAAA;AACF;AAAA,KAAA;AAAA,GAEJ;AAEJ","file":"chunk-OLYW5LVG.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { SendIcon } from \"lucide-react\"\nimport { CycleIcon } from \"@/components/icons/CycleIcon\"\nimport { Button } from \"@/components/ui/button\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { ChatBubble, type ChatBubbleProps } from \"@/components/ui/chat-bubble\"\nimport { cn } from \"@/lib/utils\"\n\n/* ─── Types ─── */\n\nexport interface ChatMessage {\n /** Unique message ID */\n id: string\n /** Author display name */\n author: string\n /** Avatar URL */\n avatar?: string\n /** Message text */\n message: string\n /** Timestamp label (e.g. \"14:32\") */\n timestamp?: string\n /** Message variant */\n variant?: ChatBubbleProps[\"variant\"]\n}\n\nexport interface ChatPanelProps extends React.ComponentProps<\"div\"> {\n /** Chat messages array */\n messages: ChatMessage[]\n /** Callback when the user sends a message */\n onSendMessage?: (message: string) => void\n /** Disable the input (e.g. when chat is read-only or ended) */\n disabled?: boolean\n /** Input placeholder text */\n placeholder?: string\n /** Title shown at the top of the panel */\n title?: string\n}\n\n/* ─── Component ─── */\n\nfunction ChatPanel({\n messages,\n onSendMessage,\n disabled = false,\n placeholder = \"Envie uma mensagem...\",\n title = \"Chat\",\n className,\n ...props\n}: ChatPanelProps) {\n const [input, setInput] = React.useState(\"\")\n const scrollRef = React.useRef<HTMLDivElement>(null)\n\n /* Auto-scroll to bottom on new messages */\n React.useEffect(() => {\n const el = scrollRef.current\n if (el) {\n el.scrollTop = el.scrollHeight\n }\n }, [messages.length])\n\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n const trimmed = input.trim()\n if (!trimmed || disabled) return\n onSendMessage?.(trimmed)\n setInput(\"\")\n }\n\n return (\n <div\n data-slot=\"chat-panel\"\n className={cn(\n \"flex flex-col bg-background border-l border-border\",\n className\n )}\n {...props}\n >\n {/* Header */}\n <div className=\"shrink-0 flex items-center h-12 px-4 border-b border-border\">\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n </div>\n\n {/* Messages */}\n <ScrollArea className=\"flex-1 min-h-0\">\n <div ref={scrollRef} className=\"flex flex-col gap-3 p-4\">\n {messages.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-8\">\n Nenhuma mensagem ainda.\n </p>\n )}\n {messages.map((msg) => (\n <ChatBubble\n key={msg.id}\n author={msg.author}\n avatar={msg.avatar}\n message={msg.message}\n timestamp={msg.timestamp}\n variant={msg.variant}\n />\n ))}\n </div>\n </ScrollArea>\n\n {/* Input */}\n {onSendMessage && (\n <form\n onSubmit={handleSubmit}\n className=\"shrink-0 flex items-center gap-2 p-3 border-t border-border\"\n >\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className=\"flex-1 min-w-0 h-9 rounded-lg border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 ring-offset-background disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n <Button\n type=\"submit\"\n size=\"icon-sm\"\n disabled={disabled || !input.trim()}\n className=\"shrink-0\"\n >\n <CycleIcon icon={SendIcon} size=\"xs\" decorative />\n </Button>\n </form>\n )}\n </div>\n )\n}\n\nexport { ChatPanel }\n"]}
@@ -0,0 +1,152 @@
1
+ import { CycleIcon } from './chunk-US5LXJTO.js';
2
+ import { cn } from './chunk-W4KJCBMW.js';
3
+ import { __objRest, __spreadProps, __spreadValues } from './chunk-2NMEKWO5.js';
4
+ import * as React from 'react';
5
+ import { cva } from 'class-variance-authority';
6
+ import { Check, X } from 'lucide-react';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+
9
+ var stepIndicatorVariants = cva(
10
+ "flex shrink-0 items-center justify-center rounded-full border-2 text-sm font-medium transition-colors",
11
+ {
12
+ variants: {
13
+ size: {
14
+ sm: "size-6 text-xs",
15
+ default: "size-8 text-sm"
16
+ },
17
+ status: {
18
+ completed: "border-primary bg-primary text-primary-foreground",
19
+ current: "border-primary bg-background text-primary",
20
+ upcoming: "border-neutral-input bg-background text-muted-foreground",
21
+ error: "border-destructive bg-destructive text-destructive-foreground"
22
+ }
23
+ },
24
+ defaultVariants: {
25
+ size: "default",
26
+ status: "upcoming"
27
+ }
28
+ }
29
+ );
30
+ function stepStatus(index, currentStep, errorSteps) {
31
+ if (errorSteps == null ? void 0 : errorSteps.includes(index)) return "error";
32
+ if (index < currentStep) return "completed";
33
+ if (index === currentStep) return "current";
34
+ return "upcoming";
35
+ }
36
+ function Stepper(_a) {
37
+ var _b = _a, {
38
+ steps,
39
+ currentStep,
40
+ errorSteps,
41
+ orientation = "horizontal",
42
+ size = "default",
43
+ theme,
44
+ onStepClick,
45
+ className
46
+ } = _b, props = __objRest(_b, [
47
+ "steps",
48
+ "currentStep",
49
+ "errorSteps",
50
+ "orientation",
51
+ "size",
52
+ "theme",
53
+ "onStepClick",
54
+ "className"
55
+ ]);
56
+ const isVertical = orientation === "vertical";
57
+ return /* @__PURE__ */ jsx(
58
+ "ol",
59
+ __spreadProps(__spreadValues({
60
+ "data-slot": "stepper",
61
+ "data-orientation": orientation,
62
+ className: cn(
63
+ "flex",
64
+ isVertical ? "flex-col gap-0" : "w-full flex-row items-start",
65
+ className
66
+ )
67
+ }, props), {
68
+ children: steps.map((step, i) => {
69
+ const status = stepStatus(i, currentStep, errorSteps);
70
+ const isLast = i === steps.length - 1;
71
+ const isActive = status === "completed" || status === "current";
72
+ const clickable = !!onStepClick && status === "completed";
73
+ const indicator = /* @__PURE__ */ jsx(
74
+ "span",
75
+ {
76
+ className: cn(
77
+ stepIndicatorVariants({ size, status }),
78
+ isActive && theme,
79
+ status === "error" && "border-destructive"
80
+ ),
81
+ "aria-hidden": true,
82
+ children: status === "completed" ? /* @__PURE__ */ jsx(CycleIcon, { icon: Check, size: "xs", decorative: true }) : status === "error" ? /* @__PURE__ */ jsx(CycleIcon, { icon: X, size: "xs", decorative: true }) : i + 1
83
+ }
84
+ );
85
+ const labels = /* @__PURE__ */ jsxs("span", { className: cn("flex flex-col", isVertical ? "pb-6" : "mt-2 items-center text-center"), children: [
86
+ /* @__PURE__ */ jsx(
87
+ "span",
88
+ {
89
+ className: cn(
90
+ "text-sm font-medium",
91
+ status === "current" && "text-foreground",
92
+ status === "completed" && "text-foreground",
93
+ status === "upcoming" && "text-muted-foreground",
94
+ status === "error" && "text-destructive"
95
+ ),
96
+ children: step.label
97
+ }
98
+ ),
99
+ step.description && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: step.description })
100
+ ] });
101
+ const connector = !isLast && /* @__PURE__ */ jsx(
102
+ "span",
103
+ {
104
+ "aria-hidden": true,
105
+ className: cn(
106
+ "transition-colors",
107
+ isVertical ? cn("ml-[15px] min-h-6 w-0.5 flex-1", size === "sm" && "ml-[11px]") : "mt-4 h-0.5 flex-1",
108
+ size === "sm" && !isVertical && "mt-3",
109
+ status === "completed" ? cn(theme, "bg-primary") : "bg-neutral-input"
110
+ )
111
+ }
112
+ );
113
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
114
+ indicator,
115
+ labels
116
+ ] });
117
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
118
+ /* @__PURE__ */ jsx(
119
+ "li",
120
+ {
121
+ "data-slot": "stepper-step",
122
+ "data-status": status,
123
+ "aria-current": status === "current" ? "step" : void 0,
124
+ className: cn(
125
+ "flex",
126
+ isVertical ? "flex-row items-start gap-3" : "flex-1 flex-col items-center first:flex-1 last:flex-1"
127
+ ),
128
+ children: clickable ? /* @__PURE__ */ jsx(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ onClick: () => onStepClick(i),
133
+ className: cn(
134
+ "flex cursor-pointer rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring",
135
+ isVertical ? "flex-row items-start gap-3" : "flex-col items-center"
136
+ ),
137
+ children: content
138
+ }
139
+ ) : /* @__PURE__ */ jsx("span", { className: cn("flex", isVertical ? "flex-row items-start gap-3" : "flex-col items-center"), children: content })
140
+ }
141
+ ),
142
+ !isVertical && connector,
143
+ isVertical && !isLast && /* @__PURE__ */ jsx("li", { "aria-hidden": true, className: "flex", children: connector })
144
+ ] }, i);
145
+ })
146
+ })
147
+ );
148
+ }
149
+
150
+ export { Stepper };
151
+ //# sourceMappingURL=chunk-ONEVPGJY.js.map
152
+ //# sourceMappingURL=chunk-ONEVPGJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/stepper.tsx"],"names":["Fragment"],"mappings":";;;;;;;;AAkBA,IAAM,qBAAA,GAAwB,GAAA;AAAA,EAC5B,uGAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,gBAAA;AAAA,QACJ,OAAA,EAAS;AAAA,OACX;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,SAAA,EAAW,mDAAA;AAAA,QACX,OAAA,EAAS,2CAAA;AAAA,QACT,QAAA,EAAU,0DAAA;AAAA,QACV,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA;AACV;AAEJ,CAAA;AAmBA,SAAS,UAAA,CAAW,KAAA,EAAe,WAAA,EAAqB,UAAA,EAAmC;AACzF,EAAA,IAAI,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAY,QAAA,CAAS,KAAA,CAAA,EAAQ,OAAO,OAAA;AACxC,EAAA,IAAI,KAAA,GAAQ,aAAa,OAAO,WAAA;AAChC,EAAA,IAAI,KAAA,KAAU,aAAa,OAAO,SAAA;AAClC,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,QAAQ,EAAA,EAUA;AAVA,EAAA,IAAA,EAAA,GAAA,EAAA,EACf;AAAA,IAAA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA,GAAc,YAAA;AAAA,IACd,IAAA,GAAO,SAAA;AAAA,IACP,KAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GAxEF,GAgEiB,EAAA,EASZ,KAAA,GAAA,SAAA,CATY,EAAA,EASZ;AAAA,IARH,OAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,aAAa,WAAA,KAAgB,UAAA;AAEnC,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACV,kBAAA,EAAkB,WAAA;AAAA,MAClB,SAAA,EAAW,EAAA;AAAA,QACT,MAAA;AAAA,QACA,aAAa,gBAAA,GAAmB,6BAAA;AAAA,QAChC;AAAA;AACF,KAAA,EACI,KAAA,CAAA,EARL;AAAA,MAUE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACtB,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAA,EAAG,WAAA,EAAa,UAAU,CAAA;AACpD,QAAA,MAAM,MAAA,GAAS,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AACpC,QAAA,MAAM,QAAA,GAAW,MAAA,KAAW,WAAA,IAAe,MAAA,KAAW,SAAA;AACtD,QAAA,MAAM,SAAA,GAAY,CAAC,CAAC,WAAA,IAAe,MAAA,KAAW,WAAA;AAE9C,QAAA,MAAM,SAAA,mBACJ,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qBAAA,CAAsB,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,cACtC,QAAA,IAAY,KAAA;AAAA,cACZ,WAAW,OAAA,IAAW;AAAA,aACxB;AAAA,YACA,aAAA,EAAW,IAAA;AAAA,YAEV,QAAA,EAAA,MAAA,KAAW,8BACV,GAAA,CAAC,SAAA,EAAA,EAAU,MAAM,KAAA,EAAO,IAAA,EAAK,IAAA,EAAK,UAAA,EAAU,IAAA,EAAC,CAAA,GAC3C,WAAW,OAAA,mBACb,GAAA,CAAC,aAAU,IAAA,EAAM,CAAA,EAAG,MAAK,IAAA,EAAK,UAAA,EAAU,IAAA,EAAC,CAAA,GAEzC,CAAA,GAAI;AAAA;AAAA,SAER;AAGF,QAAA,MAAM,MAAA,wBACH,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,eAAA,EAAiB,UAAA,GAAa,MAAA,GAAS,+BAA+B,CAAA,EACxF,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,qBAAA;AAAA,gBACA,WAAW,SAAA,IAAa,iBAAA;AAAA,gBACxB,WAAW,WAAA,IAAe,iBAAA;AAAA,gBAC1B,WAAW,UAAA,IAAc,uBAAA;AAAA,gBACzB,WAAW,OAAA,IAAW;AAAA,eACxB;AAAA,cAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,WACR;AAAA,UACC,KAAK,WAAA,oBACJ,GAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,eAAK,WAAA,EAAY;AAAA,SAAA,EAEtE,CAAA;AAIF,QAAA,MAAM,SAAA,GAAY,CAAC,MAAA,oBACjB,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAW,EAAA;AAAA,cACT,mBAAA;AAAA,cACA,aACI,EAAA,CAAG,gCAAA,EAAkC,IAAA,KAAS,IAAA,IAAQ,WAAW,CAAA,GACjE,mBAAA;AAAA,cACJ,IAAA,KAAS,IAAA,IAAQ,CAAC,UAAA,IAAc,MAAA;AAAA,cAChC,MAAA,KAAW,WAAA,GAAc,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA,GAAI;AAAA;AACrD;AAAA,SACF;AAGF,QAAA,MAAM,OAAA,mBACJ,IAAA,CAAAA,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACA;AAAA,SAAA,EACH,CAAA;AAGF,QAAA,uBACE,IAAA,CAAO,gBAAN,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,cAAA;AAAA,cACV,aAAA,EAAa,MAAA;AAAA,cACb,cAAA,EAAc,MAAA,KAAW,SAAA,GAAY,MAAA,GAAS,MAAA;AAAA,cAC9C,SAAA,EAAW,EAAA;AAAA,gBACT,MAAA;AAAA,gBACA,aAAa,4BAAA,GAA+B;AAAA,eAC9C;AAAA,cAEC,QAAA,EAAA,SAAA,mBACC,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,CAAA;AAAA,kBAC5B,SAAA,EAAW,EAAA;AAAA,oBACT,0FAAA;AAAA,oBACA,aAAa,4BAAA,GAA+B;AAAA,mBAC9C;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,QAAQ,UAAA,GAAa,4BAAA,GAA+B,uBAAuB,CAAA,EAC5F,QAAA,EAAA,OAAA,EACH;AAAA;AAAA,WAEJ;AAAA,UACC,CAAC,UAAA,IAAc,SAAA;AAAA,UACf,UAAA,IAAc,CAAC,MAAA,oBACd,GAAA,CAAC,QAAG,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,MAAA,EACvB,QAAA,EAAA,SAAA,EACH;AAAA,SAAA,EAAA,EA/BiB,CAiCrB,CAAA;AAAA,MAEJ,CAAC;AAAA,KAAA;AAAA,GACH;AAEJ","file":"chunk-ONEVPGJY.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Check, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { CycleIcon } from \"@/components/icons\"\n\nexport type StepStatus = \"completed\" | \"current\" | \"upcoming\" | \"error\"\n\nexport interface StepperStep {\n /** Rótulo da etapa (ex: \"Dados do curso\") */\n label: string\n /** Texto de apoio opcional abaixo do rótulo */\n description?: string\n}\n\nconst stepIndicatorVariants = cva(\n \"flex shrink-0 items-center justify-center rounded-full border-2 text-sm font-medium transition-colors\",\n {\n variants: {\n size: {\n sm: \"size-6 text-xs\",\n default: \"size-8 text-sm\",\n },\n status: {\n completed: \"border-primary bg-primary text-primary-foreground\",\n current: \"border-primary bg-background text-primary\",\n upcoming: \"border-neutral-input bg-background text-muted-foreground\",\n error: \"border-destructive bg-destructive text-destructive-foreground\",\n },\n },\n defaultVariants: {\n size: \"default\",\n status: \"upcoming\",\n },\n }\n)\n\nexport interface StepperProps\n extends Omit<React.ComponentProps<\"ol\">, \"onClick\">,\n VariantProps<typeof stepIndicatorVariants> {\n /** Etapas na ordem do fluxo (2–8) */\n steps: StepperStep[]\n /** Índice (0-based) da etapa atual */\n currentStep: number\n /** Índices de etapas com erro de validação */\n errorSteps?: number[]\n /** Orientação — horizontal (desktop) ou vertical (mobile/sidebars) */\n orientation?: \"horizontal\" | \"vertical\"\n /** Classe de tema aplicada apenas nos estados ativos (ex: \"theme-class\") */\n theme?: string\n /** Torna etapas CONCLUÍDAS clicáveis para voltar — validação de pulo fica no consumidor */\n onStepClick?: (index: number) => void\n}\n\nfunction stepStatus(index: number, currentStep: number, errorSteps?: number[]): StepStatus {\n if (errorSteps?.includes(index)) return \"error\"\n if (index < currentStep) return \"completed\"\n if (index === currentStep) return \"current\"\n return \"upcoming\"\n}\n\nfunction Stepper({\n steps,\n currentStep,\n errorSteps,\n orientation = \"horizontal\",\n size = \"default\",\n theme,\n onStepClick,\n className,\n ...props\n}: StepperProps) {\n const isVertical = orientation === \"vertical\"\n\n return (\n <ol\n data-slot=\"stepper\"\n data-orientation={orientation}\n className={cn(\n \"flex\",\n isVertical ? \"flex-col gap-0\" : \"w-full flex-row items-start\",\n className\n )}\n {...props}\n >\n {steps.map((step, i) => {\n const status = stepStatus(i, currentStep, errorSteps)\n const isLast = i === steps.length - 1\n const isActive = status === \"completed\" || status === \"current\"\n const clickable = !!onStepClick && status === \"completed\"\n\n const indicator = (\n <span\n className={cn(\n stepIndicatorVariants({ size, status }),\n isActive && theme,\n status === \"error\" && \"border-destructive\"\n )}\n aria-hidden\n >\n {status === \"completed\" ? (\n <CycleIcon icon={Check} size=\"xs\" decorative />\n ) : status === \"error\" ? (\n <CycleIcon icon={X} size=\"xs\" decorative />\n ) : (\n i + 1\n )}\n </span>\n )\n\n const labels = (\n <span className={cn(\"flex flex-col\", isVertical ? \"pb-6\" : \"mt-2 items-center text-center\")}>\n <span\n className={cn(\n \"text-sm font-medium\",\n status === \"current\" && \"text-foreground\",\n status === \"completed\" && \"text-foreground\",\n status === \"upcoming\" && \"text-muted-foreground\",\n status === \"error\" && \"text-destructive\"\n )}\n >\n {step.label}\n </span>\n {step.description && (\n <span className=\"text-xs text-muted-foreground\">{step.description}</span>\n )}\n </span>\n )\n\n /* Conector até o próximo step: preenchido quando a etapa está concluída */\n const connector = !isLast && (\n <span\n aria-hidden\n className={cn(\n \"transition-colors\",\n isVertical\n ? cn(\"ml-[15px] min-h-6 w-0.5 flex-1\", size === \"sm\" && \"ml-[11px]\")\n : \"mt-4 h-0.5 flex-1\",\n size === \"sm\" && !isVertical && \"mt-3\",\n status === \"completed\" ? cn(theme, \"bg-primary\") : \"bg-neutral-input\"\n )}\n />\n )\n\n const content = (\n <>\n {indicator}\n {labels}\n </>\n )\n\n return (\n <React.Fragment key={i}>\n <li\n data-slot=\"stepper-step\"\n data-status={status}\n aria-current={status === \"current\" ? \"step\" : undefined}\n className={cn(\n \"flex\",\n isVertical ? \"flex-row items-start gap-3\" : \"flex-1 flex-col items-center first:flex-1 last:flex-1\"\n )}\n >\n {clickable ? (\n <button\n type=\"button\"\n onClick={() => onStepClick(i)}\n className={cn(\n \"flex cursor-pointer rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isVertical ? \"flex-row items-start gap-3\" : \"flex-col items-center\"\n )}\n >\n {content}\n </button>\n ) : (\n <span className={cn(\"flex\", isVertical ? \"flex-row items-start gap-3\" : \"flex-col items-center\")}>\n {content}\n </span>\n )}\n </li>\n {!isVertical && connector}\n {isVertical && !isLast && (\n <li aria-hidden className=\"flex\">\n {connector}\n </li>\n )}\n </React.Fragment>\n )\n })}\n </ol>\n )\n}\n\nexport { Stepper }\n"]}
@@ -0,0 +1,97 @@
1
+ import { cn } from './chunk-W4KJCBMW.js';
2
+ import { __objRest, __spreadValues } from './chunk-2NMEKWO5.js';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function Table(_a) {
6
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
7
+ return /* @__PURE__ */ jsx("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx(
8
+ "table",
9
+ __spreadValues({
10
+ "data-slot": "table",
11
+ className: cn("w-full caption-bottom text-sm", className)
12
+ }, props)
13
+ ) });
14
+ }
15
+ function TableHeader(_a) {
16
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
17
+ return /* @__PURE__ */ jsx(
18
+ "thead",
19
+ __spreadValues({
20
+ "data-slot": "table-header",
21
+ className: cn("[&_tr]:border-b", className)
22
+ }, props)
23
+ );
24
+ }
25
+ function TableBody(_a) {
26
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
27
+ return /* @__PURE__ */ jsx(
28
+ "tbody",
29
+ __spreadValues({
30
+ "data-slot": "table-body",
31
+ className: cn("[&_tr:last-child]:border-0", className)
32
+ }, props)
33
+ );
34
+ }
35
+ function TableFooter(_a) {
36
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
37
+ return /* @__PURE__ */ jsx(
38
+ "tfoot",
39
+ __spreadValues({
40
+ "data-slot": "table-footer",
41
+ className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className)
42
+ }, props)
43
+ );
44
+ }
45
+ function TableRow(_a) {
46
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
47
+ return /* @__PURE__ */ jsx(
48
+ "tr",
49
+ __spreadValues({
50
+ "data-slot": "table-row",
51
+ className: cn(
52
+ "border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",
53
+ className
54
+ )
55
+ }, props)
56
+ );
57
+ }
58
+ function TableHead(_a) {
59
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
60
+ return /* @__PURE__ */ jsx(
61
+ "th",
62
+ __spreadValues({
63
+ "data-slot": "table-head",
64
+ className: cn(
65
+ "h-10 whitespace-nowrap px-3 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
66
+ className
67
+ )
68
+ }, props)
69
+ );
70
+ }
71
+ function TableCell(_a) {
72
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
73
+ return /* @__PURE__ */ jsx(
74
+ "td",
75
+ __spreadValues({
76
+ "data-slot": "table-cell",
77
+ className: cn(
78
+ "p-3 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
79
+ className
80
+ )
81
+ }, props)
82
+ );
83
+ }
84
+ function TableCaption(_a) {
85
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
86
+ return /* @__PURE__ */ jsx(
87
+ "caption",
88
+ __spreadValues({
89
+ "data-slot": "table-caption",
90
+ className: cn("mt-4 text-sm text-muted-foreground", className)
91
+ }, props)
92
+ );
93
+ }
94
+
95
+ export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
96
+ //# sourceMappingURL=chunk-P7Y2OBHX.js.map
97
+ //# sourceMappingURL=chunk-P7Y2OBHX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/table.tsx"],"names":[],"mappings":"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","file":"chunk-P7Y2OBHX.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/* Wrapper com overflow-x próprio: tabela larga rola dentro do container,\n nunca a página (mesma regra dos code blocks das docs). */\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 whitespace-nowrap px-3 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-3 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n"]}